Source code for prody.atomic.residue

# -*- coding: utf-8 -*-
"""This module defines classes for handling residues."""

from .subset import AtomSubset
from .atom import Atom

__all__ = ['Residue']

[docs]class Residue(AtomSubset): """Instances of this class point to atoms with same residue numbers (and insertion codes) and are generated by :class:`.HierView` class. Following built-in functions are customized for this class: * :func:`len` returns the number of atoms in the instance. * :func:`iter` yields :class:`.Atom` instances. Indexing :class:`Residue` instances by *atom name* (:func:`str`), e.g. ``"CA"`` returns an :class:`.Atom` instance.""" __slots__ = ['_ag', '_indices', '_hv', '_acsi', '_selstr'] def __init__(self, ag, indices, hv, acsi=None, **kwargs): AtomSubset.__init__(self, ag, indices, acsi, **kwargs) self._hv = hv def __repr__(self): n_csets = self._ag.numCoordsets() chain = self.getChid() if chain is None: chain = '' else: chain = ' from Chain {0}'.format(self.getChid()) if n_csets == 1: return ('<Residue: {0} {1}{2}{3} from {4} ({5} atoms)>' ).format(self.getResname(), self.getResnum(), self.getIcode() or '', chain, self._ag.getTitle(), len(self)) elif n_csets > 1: return ('<Residue: {0} {1}{2}{3} from {4} ' '({5} atoms; active #{6} of {7} coordsets)>').format( self.getResname(), self.getResnum(), self.getIcode() or '', chain, self._ag.getTitle(), len(self), self.getACSIndex(), n_csets) else: return ('<Residue: {0} {1}{2}{3} from {4} ({5} atoms; ' 'no coordinates)>').format(self.getResname(), self.getResnum(), self.getIcode() or '', chain, self._ag.getTitle(), len(self)) def __str__(self): return '{0} {1}{2}'.format(self.getResname(), self.getResnum(), self.getIcode() or '')
[docs] def getAtom(self, name): """Returns atom with given *name*, **None** if not found. Assumes that atom names in the residue are unique. If more than one atoms with the given *name* exists, the one with the smaller index will be returned. """ acsi = self.getACSIndex() if isinstance(name, str): nz = (self.getNames() == name).nonzero()[0] if len(nz) > 0: return Atom(self._ag, self._indices[nz[0]], acsi)
__getitem__ = getAtom
[docs] def getChain(self): """Returns the chain that the residue belongs to.""" chid = self.getChid() segname = self.getSegname() if chid is not None: return self._hv.getChain(chid, segname)
[docs] def getResnum(self): """Returns residue number.""" return self._ag._getResnums()[self._indices[0]]
[docs] def setResnum(self, number): """Set residue number.""" self.setResnums(number)
[docs] def getResname(self): """Returns residue name.""" data = self._ag._getResnames() if data is not None: return data[self._indices[0]]
[docs] def setResname(self, name): """Set residue name.""" self.setResnames(name)
[docs] def getIcode(self): """Returns residue insertion code.""" data = self._ag._getIcodes() if data is not None: return data[self._indices[0]]
[docs] def setIcode(self, icode): """Set residue insertion code.""" self.setIcodes(icode)
[docs] def getResindex(self): """Returns residue index.""" return self._ag._getResindices()[self._indices[0]]
[docs] def getChid(self): """Returns chain identifier.""" chids = self._ag._getChids() if chids is not None: return chids[self._indices[0]]
[docs] def getSegname(self): """Returns segment name.""" segnames = self._ag._getSegnames() if segnames is not None: return segnames[self._indices[0]]
[docs] def getSegment(self): """Returns segment of the residue.""" segname = self.getSegname() if segname is not None: return self._hv.getSegment(segname)
[docs] def getSelstr(self): """Returns selection string that will select this residue.""" icode = self.getIcode() or '' chain = self.getChain() if chain is None: if self._selstr: return 'resnum {0}{1} and ({1})'.format( self.getResnum(), icode, self._selstr) else: return 'resnum {0}{1}'.format(self.getResnum(), icode) else: return 'resnum {0}{1} and ({2})'.format( self.getResnum(), icode, chain.getSelstr())
[docs] def getPrev(self): """Returns preceding residue in the atom group.""" nextIndex = self.getResindex()-1 if nextIndex < 0: return None return self._hv._getResidue(nextIndex)
[docs] def getNext(self): """Returns following residue in the atom group.""" return self._hv._getResidue(self.getResindex()+1)