delphiBindingCustom.py
Example for a customized Delphi Binding Energy workflow.
delphiBinding.py — Python Source, 3 KB (3461 bytes)
File contents
#!/usr/bin/env python from Biskit import * import Biskit.Dock as D import numpy as N import Biskit.gnuplot as G import Biskit.tools as T import sys import Biskit.tools as T import copy ## take input file from first command line argument f_in = sys.argv[1] base = T.stripFilename( f_in ) ## take complex separation as second argument separation = 18. if len(sys.argv) > 2: separation = float(sys.argv[2]) f_ocom = base + '_delphi.complex' f_out= base + '_delphi_energies.out' def report( com ): t = '%4s : %4s %7s %7s %7s %7s %7s' %\ ('Rec','Lig','dG(kT)','solv','coul','ions','dG(kcal/mol)\n') s = '%(rec)4s : %(lig)4s %(dG_kt)7.2f %(solv)7.2f %(coul)7.2f %(ions)7.2f %(dG_kcal)7.2f\n' d = copy.copy(com['dG_delphi']) d.update( {'rec':com.rec_model.pdbCode, 'lig':com.lig_model.pdbCode} ) r = t r += s % d return r def separateComplex( com, separation ): """Create a gap of <distance> A between receptor and ligand""" cr = com.rec().centerOfMass() cl = com.lig().centerOfMass() v0 = cr - cl # distance vector d0 = N.sqrt( N.sum( v0**2 ) ) # distance delta = (v0 / d0) * separation # multiply unity vector matrix = com.ligandMatrix matrix[:,3] = N.concatenate( (-delta, [1.]) ) # substract separation vector com.setLigMatrix( matrix ) ## load structure into PDBModel object m = PDBModel( f_in ) ## remove double-occupancies and non-standard residues, identify Cys-Cys bridges ## cap the first 4 chains with ACE (identify chain breaks by residue-distance) clean = PDBCleaner( m, verbose=True ) m = clean.process( amber=True ) m = clean.capTerminals( capN=[0,1,2,3], breaks=True ) ## manually cap free N ## call reduce to optimize H-bond network and add hydrogens red = Reduce( m, debug=False, autocap=False, verbose=True ) m = red.run() m.xplor2amber() ## now remove ACE caps as they are not charged anyway and can have clashes m = m.compress( N.array(m['residue_name']) != 'ACE' ) ## map partial atomic charges from AMBER prep files into structure ac = AtomCharger( verbose=True ) ac.charge( m ) ## report missing partial charges (any residues with partial total charge) residues = m.resModels() qres = [ N.sum( x['partial_charge'] ) for x in residues ] print 'Overall charge of system: ', N.sum( m['partial_charge'] ) for i, q in enumerate( qres ): if q < -0.05 or q > 0.05: if round( q, 1 ) != 1.0 and round( q, 1 ) != -1.0: print '%2i %3s %2i %+3.1f' % (i, residues[i]['residue_name'][0], \ residues[i]['residue_number'][0], q) print "Entering Delphi calculation" ## create Dock.Complex objects from first and second chain of PDBModel m com = D.Complex( m.takeChains( [0] ), m.takeChains( [1] ) ) com.rec_model.pdbCode = 'Che' com.lig_model.pdbCode = 'Cit' ## create a gap by shifting the ligand away from the receptor if separation != 0.: separateComplex( com, separation ) ## the actual calculation dg = D.DelphiBindingEnergy( com, protonate=False, addcharge=False, scale=2.3, verbose=True, debug=False ) r = dg.run() print "Saving result complex to ", f_ocom T.dump( dg.delphicom, f_ocom ) print "Saving result complex to ", f_ocom T.dump( dg.delphicom, f_ocom ) print "Final Result" print "============" print report( dg.delphicom ) f = open( f_out, 'w' ) f.write( report( dg.delphicom ) ) f.close() print "energy values written to ", f_out