Source code for prody.atomic.segment

# -*- coding: utf-8 -*-
"""This module defines a class to handle segments of atoms in an atom group."""

from numpy import unique

from .subset import AtomSubset

__all__ = ['Segment']

[docs]class Segment(AtomSubset): """Instances of this class point to atoms with same segment names and are generated by :class:`.HierView` class. Following built-in functions are customized for this class: * :func:`len` returns the number of chains in the segment. * :func:`iter` yields :class:`.Chain` instances. Indexing :class:`Segment` instances by a *chain identifier* (:func:`str`), e.g. ``A``, returns a :class:`.Chain`.""" __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() if n_csets == 1: return ('<Segment: {0} from {1} ({2} chains, {3} atoms)>' ).format(self.getSegname(), self._ag.getTitle(), self.numChains(), self.numAtoms()) elif n_csets > 1: return ('<Segment: {0} from {1} ({2} chains, {3} atoms; ' 'active #{4} of {5} coordsets)>').format( self.getSegname(), self._ag.getTitle(), self.numChains(), self.numAtoms(), self.getACSIndex(), n_csets) else: return ('<Segment: {0} from {1} ({2} chains, {3} atoms; ' 'no coordinates)>').format(self.getSegname(), self._ag.getTitle(), self.numAtoms(), self.numChains()) def __str__(self): return 'Segment {0}'.format(self.getSegname()) def __getitem__(self, chid): return self.getChain(chid)
[docs] def getSegname(self): """Returns segment name.""" return self._ag._getSegnames()[self._indices[0]]
[docs] def setSegname(self, segname): """Set segment name.""" self.setSegnames(segname)
[docs] def numChains(self): """Returns number of chains.""" return len(set(self._getChindices()))
__len__ = numChains
[docs] def getChain(self, chid): """Returns chain with identifier *chid*.""" self._hv.getChain(chid, self.getSegname())
[docs] def iterChains(self): """Yield chains.""" get = self._hv._getChain for index in unique(self._getChindices()): yield get(index)
__iter__ = iterChains
[docs] def getSelstr(self): """Returns selection string that selects atoms in this segment.""" if self._selstr: return 'segname {0} and ({1})'.format(self.getSegname(), self._selstr) else: return 'segname {0}'.format(self.getSegname())
[docs] def getHierView(self, **kwargs): """Returns a hierarchical view of the this segment.""" return HierView(self, **kwargs)