diff --git a/modules/mol/alg/pymod/trajectory_analysis.py b/modules/mol/alg/pymod/trajectory_analysis.py index f71e42740657d4c7a7d750403342ea86f8e317b8..b445b02351775b92ba66cf80655f63610999569f 100644 --- a/modules/mol/alg/pymod/trajectory_analysis.py +++ b/modules/mol/alg/pymod/trajectory_analysis.py @@ -5,6 +5,7 @@ Author: Niklaus Johner """ import ost.mol.alg +import ost.geom from ost import LogError import os @@ -147,3 +148,52 @@ def DistanceMatrixFromPairwiseDistances(distances,p=2): LogError("Function needs numpy, but I could not import it.") raise +def DistRMSDFromTraj(t,sele,ref_sele,radius=7.0,average=False,seq_sep=4,first=0,last=-1): + """ + This function calculates the distance RMSD from a trajectory. + The distances selected for the calculation are all the distances + between pair of atoms that from residues that are at least seq_sep apart + in the sequence and that are smaller than radius in ref_sel. + The number and order of atoms in ref_sele and sele should be the same. + Its inputs are: + t : the trajectory (CoordGroupHandle) + sele : the EntityView used to determine the distances from t + radius=7 : the upper limit of distances in ref_sele considered for the calculation + seq_sep=4 : The minimal sequence separation between atom pairs considered for the calculation + average=false : use the average distance in the trajectory as reference instead of the distance obtained from ref_sele + first=0 : the first frame of t to be used + last=-1 : the last frame of t to be used + Returns a numpy vecor dist_rmsd(Nframes). + """ + if not sele.GetAtomCount()==ref_sele.GetAtomCount(): + print 'Not same number of atoms in the two views' + return + try: + import numpy as npy + if last==-1:last=t.GetFrameCount() + n_frames=last-first + dist_rmsd=npy.zeros(n_frames) + pair_count=0.0 + for i,a1 in enumerate(ref_sele.atoms): + for j,a2 in enumerate(ref_sele.atoms): + if j<=i:continue + r1=a1.GetResidue() + c1=r1.GetChain() + r2=a2.GetResidue() + c2=r2.GetChain() + if c1==c2 and abs(r2.GetNumber().num-r1.GetNumber().num)<seq_sep:continue + d=ost.geom.Distance(a1.pos,a2.pos) + if d<radius: + a3=sele.atoms[i] + a4=sele.atoms[j] + d_traj=ost.mol.alg.AnalyzeDistanceBetwAtoms(t,a3.GetHandle(),a4.GetHandle())[first:last] + if average:d=npy.mean(d_traj) + for k,el in enumerate(d_traj): + dist_rmsd[k]+=(el-d)**2.0 + pair_count+=1.0 + return (dist_rmsd/float(pair_count))**0.5 + except ImportError: + LogError("Function needs numpy, but I could not import it.") + raise + + \ No newline at end of file