def testWriteModeAppend(self): dcd = DCDFile(writeDCD(self.dcd, ENSEMBLE), 'a') dcd.write(ENSEMBLE.getCoordsets()) dcd.close() e = parseDCD(self.dcd) n_csets = len(ENSEMBLE) coordsets = e._getCoordsets() assert_equal(coordsets, coordsets, 'failed to parse DCD file correctly') assert_allclose(coordsets[:n_csets], ENSEMBLE._getCoordsets(), rtol=RTOL, atol=ATOL, err_msg='failed to parse DCD file correctly')
def testParseDCD(self): e = parseDCD(writeDCD(self.dcd, ALLATOMS)) assert_equal(e._getCoordsets(), DCD._getCoordsets(), err_msg='failed to parse DCD file correctly')
def testWriteDCD(self): dcd = writeDCD(self.dcd, ALLATOMS) self.assertEqual(dcd, self.dcd, 'failed to write DCD file')
def iENM_deformationE( pdb_obj, ref_pdb_obj, prefix, selstr='calpha', dr=1, nsteps=1, const=1, cutoff=10, path_length=1 ): import prody as pd import pylab as pb import numpy as np import random as random pdb = pdb_obj.select( selstr ) natoms = pdb.numAtoms() dcd = np.zeros( ( natoms*3, 1 ) ) dcd = pdb.getCoords().reshape( natoms*3 ) ensemble = pd.Ensemble() ensemble.setCoords(dcd.reshape(natoms,3)) filename_pdb = '%s.pdb' % prefix filename_dcd = '%s.dcd' % prefix pd.writePDB( filename_pdb, pdb ) ref = ref_pdb_obj.select( selstr ) for i in xrange( 1, nsteps+1 ): print 'Calculating coordinates at step %d\n' % i # Load coordinates from previous step pdb.setCoords( dcd.reshape((natoms,3)) ) # ANM analysis anm = pd.ANM() anm.buildHessian( pdb, cutoff=cutoff, gamma=const ) H = anm.getHessian() # N = (np.shape(H)[1] / 3) if np.size(selmode) > 1: N = max(selmode) + 1 if np.size(selmode) == 1: N = selmode + 1 anm.calcModes( n_modes=N,zeros=False,turbo=True ) eVec = anm.getEigvecs() eVal = anm.getEigvals() # Normalize eigenvectors and generate gaussian if needed if np.size(selmode) > 1: rvec = np.zeros((np.shape(eVec)[0],np.size(selmode))) for i in xrange ( 0, np.size(eVec[1]) ): rvec[:,i] = norm_vec( eVec[:,selmode[i]], natoms ) rvec = gauss_vec(rvec) if np.size(selmode) == 1: if selmode == 0: rvec = norm_vec( eVec, natoms ) if selmode > 0: rvec = norm_vec( eVec[:,selmode], natoms ) # if np.size(selmode) > 1: # for i in xrange (0, np.size(eVec[1]) ): # rvec = norm_vec( eVec[:,selmode[i]], natoms ) # rvec = gauss_vec(rvec[:,selmode]) # if np.size(selmode) == 1: # rvec = norm_vec( eVec[:,selmode], natoms ) rmag = np.zeros((natoms,3)) fluct = pd.calcSqFlucts(anm[selmode]) fluct = fluct / max(fluct) rmag[:,0] = fluct rmag[:,1] = fluct rmag[:,2] = fluct rmag = rmag.reshape(natoms*3) # rmag = ((-1)**random.randint(0,1)) * path_length * rmag # Commented out to look at positive eigenvector! rmag = path_length * rmag rmag = rmag.reshape(natoms*3) rvec = rvec.reshape(natoms*3) rvec = np.multiply(rvec,rmag) # Predict new coords dcd = rvec + pdb.getCoords().reshape( natoms*3 ) ensemble.addCoordset(dcd.reshape(natoms,3)) pd.writeDCD( filename_dcd, ensemble )
def iENM_unconstrained( pdb_obj, prefix, selstr='calpha', dr=1, nsteps=1, const=1, cutoff=10, path_length=1 ): import prody as pd import pylab as pb import numpy as np import random as random pdb = pdb_obj.select( selstr ) natoms = pdb.numAtoms() dcd = np.zeros( ( natoms*3, 1 ) ) dcd = pdb.getCoords().reshape( natoms*3 ) ensemble = pd.Ensemble() ensemble.setCoords(dcd.reshape(natoms,3)) filename_pdb = '%s.pdb' % prefix filename_dcd = '%s.dcd' % prefix pd.writePDB( filename_pdb, pdb ) for i in xrange( 1, nsteps+1 ): print 'Calculating coordinates at step %d\n' % i # Load coordinates from previous step pdb.setCoords( dcd.reshape(natoms,3) ) # # GNM analysis # gnm = pd.GNM() # gnm.buildKirchhoff( pdb, cutoff=cutoff, gamma=const ) # K = gnm.getKirchhoff() # N = np.shape(K)[1] # gnm.calcModes( n_modes=N,zeros=False,turbo=True ) # fluct = pd.calcSqFlucts( gnm ) / max( pd.calcSqFlucts( gnm ) ) # ANM analysis anm = pd.ANM() anm.buildHessian( pdb, cutoff=cutoff, gamma=const ) H = anm.getHessian() N = (np.shape(H)[1] / 3) anm.calcModes( n_modes=N,zeros=False,turbo=True ) eVec = anm.getEigvecs() eVal = anm.getEigvals() # Normalize vectors for i in xrange (0, np.size(eVec[1]) ): eVec[:,i] = norm_vec( eVec[:,i], natoms ) # Randomly sample gaussian distribution of vectors gVec = gauss_vec(eVec) # Sample motion after given path_length rvec = gVec rmag = np.ones((natoms,3)) rmag = ((-1)**random.randint(0,1)) * path_length * rmag rmag = rmag.reshape(natoms*3) rvec = rvec.reshape(natoms*3) rvec = np.multiply(rvec,rmag) # Predict new coords dcd = rvec.reshape(natoms*3) + pdb.getCoords().reshape(natoms*3) ensemble.addCoordset(dcd.reshape(natoms,3)) pd.writeDCD( filename_dcd, ensemble ) return ( pdb, ensemble )
def prody_anm(self, variables, txtOutput): ''' PRODY DRIVER is the function to read in variables from GUI input and used to run a prody normal mode calculation using the anisotropic network model (ANM) on a structure provide in a pdb file. INPUT: variable descriptions: pdbfile: input pdb file (reference) OUTPUT: model_anm_extended_bb.nmd model_traverse.dcd model_samp.dcd model_samp.pdb model_anm_sqflucts.txt model_anm_kirchhoff.txt model_anm_hessian.txt model_anm_cross-correlations.hm model_anm_cross-correlations.txt model_anm_covariance.txt model_anm_beta.txt model_anm_evalues.txt model_anm_evectors.txt model_anm_extended_all.nmd model_anm.nmd txtOutput: TK handler for output to GUI textbox files stored in ~/runname/prody directory: outfile: output filename ''' log = self.log pgui = self.run_utils.print_gui # start gui output pgui("\n%s \n" % ('=' * 60)) pgui("DATA FROM RUN: %s \n\n" % time.asctime( time.gmtime( time.time() ) )) mvars = self.mvars #path = os.path.join(os.getcwd(),mvars.runname, 'prody') path = os.path.join(mvars.runname, 'prody') direxist = os.path.exists(path) if(direxist == 0): try: result = os.system('mkdir -p ' + path) except: message = 'can not create project directory: ' + path message += '\nstopping here\n' print_failure(message, txtOutput) if(result != 0): message = 'can not create project directory: ' + path message += '\nstopping here\n' print_failure(message, txtOutput) if mvars.advanced_usage == 1: run_cmd = prody_exe + mvars.advanced_usage_cmd os.system(run_cmd) run_cmd = 'mv *.nmd *.txt *.hm prody' os.system(run_cmd) exit() # display progress fraction_done = (0 + 1) * 1.0 / 10.0 report_string = 'STATUS\t%f' % fraction_done pgui(report_string) prody.confProDy(verbosity='none') #option to set silent verbosity model = mvars.pdbfile[0:len(mvars.pdbfile) - 4] run_cmd = prody_exe + ' anm ' + \ mvars.pdbfile + ' -t all -n ' + str(mvars.number_modes) + ' -a' log.info('staring prody_exe %s' % run_cmd) prody_run = subprocess.Popen(run_cmd,shell=True,executable='/bin/bash') prody_run.wait() #prody.confProDy(verbosity='none') #option to set silent verbosity file_anm = model + '_anm_extended_all.nmd' # display progress fraction_done = (1 + 1) * 1.0 / 10.0 report_string = 'STATUS\t%f' % fraction_done pgui(report_string) # parse nmd file with resuts extended to all atoms log.info('staring prody.parseNMD %s' % file_anm) mod, ag = prody.parseNMD(file_anm, type=None) allatoms = ag.copy() # set up to randomly sample number_conformations_samp modes log.info('staring prody.sampleModes') ensemble = prody.sampleModes(mod[:mvars.number_modes], ag, n_confs=mvars.number_conformations_samp, rmsd=mvars.rmsd_conformations_samp) ensemble log.info('staring prody ensemble and writing pdb/dcd files') allatoms.addCoordset(ensemble) prody.writePDB('model_samp.pdb', allatoms) prody.writeDCD('model_samp.dcd', allatoms) trajectory_names = [] # display progress fraction_done = (1 + 2) * 1.0 / 10.0 report_string = 'STATUS\t%f' % fraction_done pgui(report_string) log.info('starting prody traverse') for i in xrange(0, mvars.number_modes): #print i # setup to tranverse slowest mode traverse = prody.traverseMode( mod[i], allatoms, n_steps=mvars.number_steps_traverse, rmsd=mvars.rmsd_traverse) traverse prody.writeDCD('traverse.dcd', traverse) this_dcd = str(os.path.join(path, 'traverse_' + str(i) + '.dcd')) cmd = 'mv traverse.dcd ' + this_dcd os.system(cmd) trajectory_names.append(this_dcd) # display progress fraction_done = (1 + 7) * 1.0 / 10.0 report_string = 'STATUS\t%f' % fraction_done pgui(report_string) m1 = sasmol.SasMol(0) m2 = sasmol.SasMol(0) m1.read_pdb(mvars.pdbfile) m2.read_pdb(mvars.pdbfile,fastread=True) mvars.dcdfile = mvars.runname + '.dcd' log.info('opening new dcd file to store trajectory: %s' % os.path.join(self.runpath, mvars.dcdfile)) outfile_name = str(os.path.join(path, mvars.dcdfile)) dcdoutfile = m2.open_dcd_write(outfile_name) count = 0 coor = numpy.zeros((1,m2.natoms(),3),numpy.float32) for this_trajectory_name in trajectory_names: dcdfile = m1.open_dcd_read(this_trajectory_name) number_of_frames = dcdfile[2] for j in xrange(number_of_frames): m1.read_dcd_step(dcdfile,j) coor[0,:,:] = m1.coor()[0] m2.setCoor(coor) m2.write_dcd_step(dcdoutfile,0, count + 1) count += 1 m2.close_dcd_write(dcdoutfile) log.info('moving files to runname / prody') file_anm = model + '_anm.nmd' mod, ag = prody.parseNMD(file_anm, type=None) mod1 = prody.parsePDB(mvars.pdbfile) calphas = mod1.select('calpha') bb_anm, bb_atoms = prody.extendModel(mod, calphas, mod1.select( 'backbone')) # extend model to backbone atoms prody.writeNMD('model_anm_extended_bb.nmd', bb_anm, bb_atoms) cmd = 'mv model_samp.pdb ' + path + os.sep + os.path.basename(model) + '_samp.pdb' os.system(cmd) cmd = 'mv model_samp.dcd ' + path + os.sep + os.path.basename(model) + '_samp.dcd' os.system(cmd) cmd = 'mv model_anm_extended_bb.nmd ' + \ model + '_anm_extended_bb.nmd' os.system(cmd) cmd = 'mv *.hm *.nmd *.txt ' + path + os.sep os.system(cmd) # display progress fraction_done = (1 + 9) * 1.0 / 10.0 report_string = 'STATUS\t%f' % fraction_done pgui(report_string) return