import glob
import py3Dmol
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import Draw
from rdkit import rdBase
print(rdBase.rdkitVersion)
import os,time
print( time.asctime())
2016.09.4 Fri Mar 24 13:50:39 2017
First let's see if we reproduce an example from here:
m = Chem.AddHs(Chem.MolFromSmiles('COc1ccc2[C@H](O)[C@@H](COc2c1)N3CCC(O)(CC3)c4ccc(F)cc4'))
print(m)
AllChem.EmbedMultipleConfs(m,useExpTorsionAnglePrefs=True,useBasicKnowledge=True)
mb = Chem.MolToMolBlock(m)
core = m.GetSubstructMatch(Chem.MolFromSmiles('C1C(O)c2ccccc2OC1'))
print(core)
AllChem.AlignMolConformers(m,atomIds=core)
p = py3Dmol.view(width=400,height=400)
for conf in m.GetConformers():
mb = Chem.MolToMolBlock(m,confId=conf.GetId())
p.addModel(mb,'sdf')
p.setStyle({'stick':{}})
p.setBackgroundColor('0xeeeeee')
p.zoomTo()
p.show()
<rdkit.Chem.rdchem.Mol object at 0x7fc71941f6c0> (8, 6, 7, 5, 4, 3, 2, 12, 11, 10, 9)
So that works great. Now - let's use sdf files:
mol_inp = Chem.SDMolSupplier("mol_inp.sdf")
mol_out = Chem.SDMolSupplier("mol_out.sdf")
mol_inp, mol_out
(<rdkit.Chem.rdmolfiles.SDMolSupplier at 0x7fc719730998>, <rdkit.Chem.rdmolfiles.SDMolSupplier at 0x7fc7197309d0>)
let's see how they look:
p1 = py3Dmol.view(width=200,height=200)
m1 = Chem.MolToMolBlock(mol_inp[0])
p1.addModel(m1,'sdf')
p1.setStyle({'stick':{}})
p1.setBackgroundColor('0xeeeeee')
p1.zoomTo()
p1.show()
plist = []
for mo in mol_out:
p = py3Dmol.view(width=200,height=200)
m = Chem.MolToMolBlock(mo)
p.addModel(m,'sdf')
p.setStyle({'stick':{}})
p.setBackgroundColor('0xeeeeee')
p.zoomTo()
plist.append(p)
plist[1].show
<bound method view.show of <py3Dmol.view object at 0x7fc7193cf908>>
mol1 = open("mol_inp.sdf").read()
p1 = py3Dmol.view(width=200,height=200)
p1.addModel(mol1, 'sdf')
p1.setStyle({'stick':{}})
p1.setBackgroundColor('0xeeeeee')
p1.zoomTo()
p1.show()
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-26-a5cc79fa0163> in <module>() 1 p1 = py3Dmol.view(width=200,height=200) ----> 2 p1.addModel(mol1[0],'sdf') 3 p1.setStyle({'stick':{}}) 4 p1.setBackgroundColor('0xeeeeee') 5 p1.zoomTo() /home/gosia/anaconda3/envs/my-rdkit-env/lib/python3.5/site-packages/py3Dmol/__init__.py in makejs(*args) 95 cmd = '\tviewer_UNIQUEID.%s(' % name; 96 for arg in args: ---> 97 cmd += '%s,' % json.dumps(arg) 98 cmd = cmd.rstrip(',') 99 cmd += ');\n'; /home/gosia/anaconda3/envs/my-rdkit-env/lib/python3.5/json/__init__.py in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw) 228 cls is None and indent is None and separators is None and 229 default is None and not sort_keys and not kw): --> 230 return _default_encoder.encode(obj) 231 if cls is None: 232 cls = JSONEncoder /home/gosia/anaconda3/envs/my-rdkit-env/lib/python3.5/json/encoder.py in encode(self, o) 196 # exceptions aren't as detailed. The list call should be roughly 197 # equivalent to the PySequence_Fast that ''.join() would do. --> 198 chunks = self.iterencode(o, _one_shot=True) 199 if not isinstance(chunks, (list, tuple)): 200 chunks = list(chunks) /home/gosia/anaconda3/envs/my-rdkit-env/lib/python3.5/json/encoder.py in iterencode(self, o, _one_shot) 254 self.key_separator, self.item_separator, self.sort_keys, 255 self.skipkeys, _one_shot) --> 256 return _iterencode(o, 0) 257 258 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, /home/gosia/anaconda3/envs/my-rdkit-env/lib/python3.5/json/encoder.py in default(self, o) 177 178 """ --> 179 raise TypeError(repr(o) + " is not JSON serializable") 180 181 def encode(self, o): TypeError: <rdkit.Chem.rdchem.Mol object at 0x7fc7193c6170> is not JSON serializable
mo = open("mol_out.sdf", "r").readlines()
mo
['\n', ' OpenBabel03241713363D\n', '\n', ' 13 12 0 0 0 0 0 0 0 0999 V2000\n', ' -4.4820 -0.1929 -0.0392 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.9632 -0.1318 -0.0278 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.8449 -0.8813 0.7380 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.8481 -0.5628 -1.0055 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.9979 1.2043 0.2047 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.5951 0.3397 1.3010 N 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.6140 0.5812 -0.7874 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.5225 -1.1027 -0.2413 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.6823 1.5824 1.1918 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -6.0784 1.2389 0.2350 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.5971 1.8901 -0.5449 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.9636 1.2456 1.4860 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -1.5894 0.5188 1.3125 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' 1 2 1 0 0 0 0\n', ' 1 3 1 0 0 0 0\n', ' 1 4 1 0 0 0 0\n', ' 1 5 1 0 0 0 0\n', ' 2 6 1 0 0 0 0\n', ' 2 7 1 0 0 0 0\n', ' 2 8 1 0 0 0 0\n', ' 5 9 1 0 0 0 0\n', ' 5 10 1 0 0 0 0\n', ' 5 11 1 0 0 0 0\n', ' 6 12 1 0 0 0 0\n', ' 6 13 1 0 0 0 0\n', 'M END\n', '> <MOL Chiral Flag>\n', '0\n', '\n', '$$$$\n', '\n', ' OpenBabel03241713363D\n', '\n', ' 13 12 0 0 0 0 0 0 0 0999 V2000\n', ' -4.4777 -0.1873 -0.0187 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.9518 -0.1355 -0.0361 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.8280 -0.8801 0.7547 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.8618 -0.5570 -0.9786 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -5.0062 1.2148 0.2575 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.5638 0.7758 -1.0955 N 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.5358 -1.1327 -0.2368 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.5740 0.2084 0.9233 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.6213 1.5724 1.2146 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -6.0965 1.2320 0.2692 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.6697 1.9181 -0.5185 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.9542 0.5062 -1.9941 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -1.5502 0.7715 -1.1997 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' 1 2 1 0 0 0 0\n', ' 1 3 1 0 0 0 0\n', ' 1 4 1 0 0 0 0\n', ' 1 5 1 0 0 0 0\n', ' 2 6 1 0 0 0 0\n', ' 2 7 1 0 0 0 0\n', ' 2 8 1 0 0 0 0\n', ' 5 9 1 0 0 0 0\n', ' 5 10 1 0 0 0 0\n', ' 5 11 1 0 0 0 0\n', ' 6 12 1 0 0 0 0\n', ' 6 13 1 0 0 0 0\n', 'M END\n', '> <MOL Chiral Flag>\n', '0\n', '\n', '$$$$\n', '\n', ' OpenBabel03241713363D\n', '\n', ' 13 12 0 0 0 0 0 0 0 0999 V2000\n', ' -4.4704 -0.1924 -0.0370 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.9478 -0.1448 -0.0334 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.8484 -0.8683 0.7432 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.8588 -0.5453 -0.9989 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.9765 1.2160 0.2350 C 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.4651 -1.4789 -0.2948 N 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.5945 0.2067 0.9438 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.5917 0.5628 -0.7928 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.6003 1.5660 1.2037 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -6.0679 1.2477 0.2458 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -4.6064 1.8988 -0.5383 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -2.8524 -2.1060 0.4118 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' -1.4502 -1.5065 -0.1798 H 0 0 0 0 0 0 0 0 0 0 0 0\n', ' 1 2 1 0 0 0 0\n', ' 1 3 1 0 0 0 0\n', ' 1 4 1 0 0 0 0\n', ' 1 5 1 0 0 0 0\n', ' 2 6 1 0 0 0 0\n', ' 2 7 1 0 0 0 0\n', ' 2 8 1 0 0 0 0\n', ' 5 9 1 0 0 0 0\n', ' 5 10 1 0 0 0 0\n', ' 5 11 1 0 0 0 0\n', ' 6 12 1 0 0 0 0\n', ' 6 13 1 0 0 0 0\n', 'M END\n', '> <MOL Chiral Flag>\n', '0\n', '\n', '$$$$\n']
mol1 = [x for x in mol_inp if x is not None]
mol2 = [x for x in mol_out if x is not None]
mol1, mol2
([<rdkit.Chem.rdchem.Mol at 0x7fc71941f580>], [<rdkit.Chem.rdchem.Mol at 0x7fc71941fd50>, <rdkit.Chem.rdchem.Mol at 0x7fc71941fda0>, <rdkit.Chem.rdchem.Mol at 0x7fc71941fdf0>])
AllChem.AlignMolConformers(mol1, confIds=mol2)
--------------------------------------------------------------------------- ArgumentError Traceback (most recent call last) <ipython-input-18-de7944da3c4a> in <module>() ----> 1 AllChem.AlignMolConformers(mol1, confIds=mol2) ArgumentError: Python argument types in rdkit.Chem.rdMolAlign.AlignMolConformers(list) did not match C++ signature: AlignMolConformers(RDKit::ROMol {lvalue} mol, boost::python::api::object atomIds=[], boost::python::api::object confIds=[], boost::python::api::object weights=[], bool reflect=False, unsigned int maxIters=50, boost::python::api::object RMSlist=None)