1
2
3
4
5
6
7
8
9
10
11 from rdkit import Chem
12 from rdkit.Chem import rdDepictor
13 from rdkit import Geometry
14
15
16 -def AlignMolToTemplate2D(mol,
17 template,
18 match=None,
19 clearConfs=False,
20 templateConfId=-1, ):
21 """
22 Arguments:
23
24 - mol: the molecule to be aligned
25 - template: the template to align to
26 - match: If provided, this should be a sequence of integers
27 containing the indices of the atoms in mol that match
28 those in template. This is the result of calling:
29 mol.GetSubstructMatch(template)
30 - clearConfs: toggles removing any existing conformers on mol
31
32 Returns the confId of the conformer containing the depiction
33
34 >>> patt = Chem.MolFromSmiles('C1CC1')
35 >>> rdDepictor.Compute2DCoords(patt)
36 0
37 >>> mol = Chem.MolFromSmiles('OC1CC1CC1CCC1')
38 >>> rdDepictor.Compute2DCoords(mol)
39 0
40 >>> pc = patt.GetConformer(0)
41 >>> mc = mol.GetConformer(0)
42
43 We start out with the molecules not aligned:
44 >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+1).x) for i in range(pc.GetNumAtoms())]
45 >>> [x<1e-4 for x in vs]
46 [False, False, False]
47
48 But then we can replace the conformer of mol:
49 >>> AlignMolToTemplate2D(mol,patt,clearConfs=True)
50 0
51 >>> mol.GetNumConformers()
52 1
53 >>> pc = patt.GetConformer(0)
54 >>> mc = mol.GetConformer(0)
55 >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+1).x) for i in range(pc.GetNumAtoms())]
56 >>> [x<1e-4 for x in vs]
57 [True, True, True]
58
59 If we like, we can specify the atom map explicitly in order to align to the second
60 matching ring in the probe molecule:
61 >>> match = (5,6,7)
62 >>> AlignMolToTemplate2D(mol,patt,clearConfs=True,match=match)
63 0
64 >>> mol.GetNumConformers()
65 1
66 >>> pc = patt.GetConformer(0)
67 >>> mc = mol.GetConformer(0)
68 >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+1).x) for i in range(pc.GetNumAtoms())]
69 >>> [x<1e-4 for x in vs]
70 [False, False, False]
71 >>> vs = [abs(pc.GetAtomPosition(i).x-mc.GetAtomPosition(i+5).x) for i in range(pc.GetNumAtoms())]
72 >>> [x<1e-4 for x in vs]
73 [True, True, True]
74
75
76
77 """
78 if not match:
79 match = mol.GetSubstructMatch(template)
80 if not match:
81 raise ValueError('no match between mol and template')
82
83 atomMap = {}
84 templateConf = template.GetConformer(templateConfId)
85 for i, idx in enumerate(match):
86 p = templateConf.GetAtomPosition(i)
87 atomMap[idx] = Geometry.Point2D(p.x, p.y)
88 molConfId = rdDepictor.Compute2DCoords(mol, clearConfs=clearConfs, coordMap=atomMap)
89 return molConfId
90
91
92
93
94
95
97 import doctest, sys
98 return doctest.testmod(sys.modules["__main__"])
99
100
101 if __name__ == '__main__':
102 import sys
103 failed, tried = _test()
104 sys.exit(failed)
105