public
Last active

Using Open Babel to calculate the symmetry-corrected RMSD of a docked pose from a crystal structure

  • Download Gist
dockedpose.py
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
import math
import pybel
 
def squared_distance(coordsA, coordsB):
"""Find the squared distance between two 3-tuples"""
sqrdist = sum( (a-b)**2 for a, b in zip(coordsA, coordsB) )
return sqrdist
def rmsd(allcoordsA, allcoordsB):
"""Find the RMSD between two lists of 3-tuples"""
deviation = sum(squared_distance(atomA, atomB) for
(atomA, atomB) in zip(allcoordsA, allcoordsB))
return math.sqrt(deviation / float(len(allcoordsA)))
if __name__ == "__main__":
# Read crystal pose
crystal = next(pybel.readfile("mol", "crystalpose.mol"))
 
# Find automorphisms involving only non-H atoms
mappings = pybel.ob.vvpairUIntUInt()
bitvec = pybel.ob.OBBitVec()
lookup = []
for i, atom in enumerate(crystal):
if not atom.OBAtom.IsHydrogen():
bitvec.SetBitOn(i+1)
lookup.append(i)
success = pybel.ob.FindAutomorphisms(crystal.OBMol, mappings, bitvec)
 
# Find the RMSD between the crystal pose and each docked pose
xtalcoords = [atom.coords for atom in crystal if not atom.OBAtom.IsHydrogen()]
for i, dockedpose in enumerate(pybel.readfile("sdf", "dockedposes.sdf")):
posecoords = [atom.coords for atom in dockedpose if not atom.OBAtom.IsHydrogen()]
minrmsd = 999999999999
for mapping in mappings:
automorph_coords = [None] * len(xtalcoords)
for x, y in mapping:
automorph_coords[lookup.index(x)] = xtalcoords[lookup.index(y)]
mapping_rmsd = rmsd(posecoords, automorph_coords)
if mapping_rmsd < minrmsd:
minrmsd = mapping_rmsd
print("The RMSD is %.1f for pose %d" % (minrmsd, (i+1)))

Hi, I run your code on my SuSE11.1 machine with open babel 2.3.0, and I got the following error:
Traceback (most recent call last):
File "dockedpose.py", line 21, in
mappings = pybel.ob.vvpairUIntUInt()
AttributeError: 'module' object has no attribute 'vvpairUIntUInt'

Could you please let me know which ob version you are suing? Thanks a lot!
Boyu

I have compiled the latest development version of OpenBabel with the python bindings. However, I get the following error:

python dockedpose.py
Traceback (most recent call last):
File "dockedpose.py", line 2, in
import pybel
File "/usr/local/lib/python2.6/dist-packages/pybel.py", line 16, in
import openbabel as ob
File "/usr/local/lib/python2.6/dist-packages/openbabel.py", line 79, in
_openbabel = swig_import_helper()
File "/usr/local/lib/python2.6/dist-packages/openbabel.py", line 75, in swig_import_helper
_mod = imp.load_module('_openbabel', fp, pathname, description)
ImportError: dynamic module does not define init function (init_openbabel)

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.