Source code for prody.dynamics.modeset

# -*- coding: utf-8 -*-
"""This module defines a pointer class for handling subsets of normal modes."""

from numpy import ndarray, array, arange, diag, dot

__all__ = ['ModeSet']

[docs]class ModeSet(object): """A class for providing access to subset of mode data. Instances are obtained by slicing an NMA model (:class:`.ANM`, :class:`.GNM`, or :class:`.PCA`). ModeSet's contain a reference to the model and a list of mode indices. Methods common to NMA models are also defined for mode sets.""" __slots__ = ['_model', '_indices'] def __init__(self, model, indices): self._model = model self._indices = array(indices, int) def __len__(self): return len(self._indices) def __iter__(self): for i in self._indices: yield self._model[i] def __repr__(self): return '<ModeSet: {0} modes from {1}>'.format(len(self), str(self._model)) def __str__(self): return '{0} modes from {1}'.format(len(self._indices), str(self._model)) def __getitem__(self, index): """A list or tuple of integers can be used for indexing.""" if isinstance(index, slice): indices = arange(*index.indices(len(self))) if len(indices) > 1: return ModeSet(self._model, self._indices[indices]) elif len(indices) > 0: return self._model._getMode(self._indices[indices[0]]) elif isinstance(index, (list, tuple, ndarray)): if len(index) == 1: return self._model._getMode(self._indices[index[0]]) return ModeSet(self._model, self._indices[index]) try: index = int(index) except Exception: raise IndexError('indices must be int, slice, list, or tuple') else: return self._model._getMode(self._indices[index])
[docs] def is3d(self): """Returns **True** is model is 3-dimensional.""" return self._model._is3d
[docs] def numAtoms(self): """Returns number of atoms.""" return self._model.numAtoms()
[docs] def numModes(self): """Returns number of modes in the instance (not necessarily maximum number of possible modes).""" return len(self._indices)
[docs] def numDOF(self): """Returns number of degrees of freedom.""" return self._model.numDOF()
[docs] def numEntries(self): """Returns number of entries in one eigenvector.""" return self._getArray().shape[0]
[docs] def getTitle(self): """Returns title of the mode set.""" return str(self)
[docs] def getModel(self): """Returns the model that the modes belongs to.""" return self._model
[docs] def getIndices(self): """Returns indices of modes in the mode set.""" return self._indices
[docs] def getEigvals(self): """Returns eigenvalues. For :class:`.PCA` and :class:`.EDA` models built using coordinate data in Å, unit of eigenvalues is |A2|. For :class:`.ANM` and :class:`.GNM`, on the other hand, eigenvalues are in arbitrary or relative units but they correlate with stiffness of the motion along associated eigenvector.""" return self._model._eigvals[self._indices]
[docs] def getVariances(self): """Returns variances. For :class:`.PCA` and :class:`.EDA` models built using coordinate data in Å, unit of variance is |A2|. For :class:`.ANM` and :class:`.GNM`, on the other hand, variance is the inverse of the eigenvalue, so it has arbitrary or relative units.""" return self._model._vars[self._indices]
[docs] def getCovariance(self): """Returns covariance matrix. It will be calculated using available modes.""" V = self.getEigvecs() D = diag(self.getVariances()) return dot(V, dot(D, V.T))
[docs] def getArray(self): """Returns a copy of eigenvectors array.""" return self._model.getArray()[:, self._indices].copy()
getEigvecs = getArray def _getArray(self): """Returns eigenvectors array.""" return self._model._getArray()[:, self._indices]