Source code for cafepy.core.calc_com

#!/usr/bin/env python3
# coding:utf-8
"""
This class caluclates the center of mass of proteins from [dcd,pdb]-files.

:Editer:   Mogu
:environment:   Pyton >= 3.5.1
:requirement:   Numpy >= 1.11

* example
.. code-block: bash

    cafepy com -i test.pdb[.dcd]
"""

## 3rd Parties
import numpy as np
import scipy as sc

## My module
from ..utils.cafepy_base import CafePyBase

[docs]class CalcCOM(CafePyBase): """ Calculating the center of mass from [dcd,pdb]-files * Examples: .. code-block:: python tmp = CalcCom("filename") # both dcd-format and pdb-format are ok tmp.run() tmp.writeFile("outfile") or tmp.writeShow() *In Terminal.* .. code-block:: bash pycafe.py com -f [dcd,pdb]-infile [optional: -o outfile, -nf index.file or -n int-value] """ def __init__(self, inputfile, *args, **kargs): self.dcdfile = "" self.pdbfile = "" self.data = [] self.com = [] self._read(inputfile) def _read(self, inputfile): self.data = self.read(inputfile) # from CafePyBase def readIndex(self): pass
[docs] def run(self, atom_idx=[], unit_idx=[], traj_idx=[]): """ Calculates the Center of mass from DCD-file or PDB-file. :Args: atom_idx (list), traj_idx (list) :atom_idx: You can select Atoms for calculating COM with idx[.ndx,.ninfo]-file [ from 0 to ~] :unit_idx: You can select Units in pdb format. [from 1 to ~] :traj_idx: You can extract trajectories for calculating COM. """ self.com = [] if self.sfx == 'dcd': return self._dcdrun(atom_idx, unit_idx, traj_idx) elif self.sfx == 'pdb': return self._pdbrun(atom_idx, unit_idx)
def _dcdrun(self, atom_idx=[], unit_idx=[], traj_idx=[]): if not atom_idx: self.com = np.average(self.data[:], axis=1) else: ndata = np.array(self.data) self.com = np.average(ndata[:, atom_idx], axis=1) return self.com def _pdbrun(self, atom_idx=[], unit_idx=[]): if unit_idx: _data = [] for i in unit_idx: i = i-1 if i == 0: s = 0 else: s = sum(self.data.info['aasize'][:i]) e = sum(self.data.info['aasize'][:i+1]) _data += self.data[:][s: e] ndata = np.array(_data) self.com = np.average(ndata, axis=0) elif atom_idx: self.com = np.average(np.array(self.data[:])[atom_idx], axis=0) else: self.com = np.average(np.array(self.data[:]), axis=0) return self.com def writeFile(self, outputfile, header= ""): np.savetxt(outputfile, self.com, header=header, fmt="%.8e") def writeShow(self): pass def close(self): self.data.close()