def __collectFrames( self, pdbs, castAll=0 ): """ Read coordinates from list of pdb files. :param pdbs: list of file names :type pdbs: [str] :param castAll: analyze atom content of each frame for casting (default: 0) :type castAll: 0|1 :return: frames x (N x 3) Numpy array (of float) :rtype: array """ frameList = [] i = 0 atomCast = None if self.verbose: T.errWrite('reading %i pdbs...' % len(pdbs) ) refNames = self.ref.atomNames() ## cache for atom checking for f in pdbs: ## Load m = PDBModel(f) ## compare atom order & content of first frame to reference pdb if castAll or i==0: atomCast, castRef = m.compareAtoms( self.ref ) if castRef != list(range( len( self.ref ))): ## we can take away atoms from each frame but not from ref raise TrajError("Reference PDB doesn't match %s." %m.fileName) if N0.all( atomCast == list(range( len( m ))) ): atomCast = None ## no casting necessary else: if self.verbose: T.errWrite(' casting ') ## assert that frame fits reference if atomCast: m = m.take( atomCast ) ## additional check on each 100st frame if i%100 == 0 and m.atomNames() != refNames: raise TrajError("%s doesn't match reference pdb."%m.fileName ) frameList.append( m.xyz ) i += 1 if i%10 == 0 and self.verbose: T.errWrite('#') if self.verbose: T.errWrite( 'done\n' ) ## convert to 3-D Numpy Array return N0.array(frameList).astype(N0.Float32)
def parmMirror( self, f_out, f_out_crd=None, fmod=['frcmod.ionsjc_tip3p'], fprep=[], **kw ): """ Create a parm7 file whose atom content (and order) exactly mirrors the given PDBModel. This requires two leap runs. First we get a temporary topology, then we identify all atoms added by leap and build a final topology where these atoms are deleted. This parm is hence NOT suited for simulations but can be used to parse e.g. a trajectory or PDB into ptraj. :param f_out: target parm file :type f_out: str :param f_out_crd: target crd file (default: f_out but ending .crd) :type f_out_crd: str :param fmod : list of amber Mod files (loaded with loadAmberParams) :type fmod : [str] :param fmod : list of amber Prep files (loaded with loadAmberPrep) :type fmod : [str] """ f_out = t.absfile( f_out ) f_out_crd = t.absfile( f_out_crd ) or t.stripSuffix( f_out ) + '.crd' ## if there are hydrogens, recast them to standard amber names aatm = 'HA' in self.m.atomNames() ## 'HB2' in self.m.atomNames() ## First leap round ## m_ref = self.m.clone() m_ref.xplor2amber( aatm=aatm, parm10=True ) tmp_in = tempfile.mktemp( 'leap_in0.pdb' ) m_ref.writePdb( tmp_in, ter=3 ) tmp_parm = tempfile.mktemp( '_parm0' ) tmp_crd = tempfile.mktemp( '_crd0' ) leap_mod = self.__fLines( 'm = loadAmberParams %s\n', fmod ) leap_prep= self.__fLines( 'loadAmberPrep %s\n', fprep ) self.__runLeap( self.script_mirror_pdb, leaprc=self.leaprc, fmod=leap_mod, fprep=leap_prep, in_pdb=tmp_in, out_parm=tmp_parm, out_crd=tmp_crd, delete_atoms='' ) tmp_pdb = self.parm2pdb( tmp_parm, tmp_crd, tempfile.mktemp( 'leap_out.pdb' ), aatm=aatm ) if not self.debug: t.tryRemove( tmp_parm ) t.tryRemove( tmp_crd ) t.tryRemove( tmp_in ) ## load model with missing atoms added by leap m_leap = PDBModel( tmp_pdb ) ## compare atom content iLeap, iRef = m_leap.compareAtoms( m_ref ) ## check that ref model doesn't need any change if iRef != list(range( len( m_ref ))): uLeap, uRef = m_leap.unequalAtoms( m_ref, iLeap, iRef ) atms = m_ref.reportAtoms( uRef, n=6 ) raise AmberError("Cannot create exact mirror of %s.\n" % tmp_in +\ "Leap has renamed/deleted original atoms in %s:\n"% tmp_pdb+\ atms) ## indices of atoms that were added by leap delStr = self.__deleteAtoms( m_leap, self.__inverseIndices( m_leap, iLeap ) ) ## Second leap round ## self.__runLeap( self.script_mirror_pdb, leaprc=self.leaprc, in_pdb=tmp_pdb, fmod=leap_mod, fprep=leap_prep, out_parm=f_out, out_crd=f_out_crd, delete_atoms=delStr ) if not self.debug: t.tryRemove( tmp_pdb )