1
2
3
4
5
6 from __future__ import print_function
7 from rdkit import Chem
8 from rdkit.Chem import rdDepictor
9 from rdkit import Geometry
10
11 -def AlignDepict(mol,core,corePattern=None,acceptFailure=False):
12 """
13
14 Arguments:
15 - mol: the molecule to be aligned, this will come back
16 with a single conformer.
17 - core: a molecule with the core atoms to align to;
18 this should have a depiction.
19 - corePattern: (optional) an optional molecule to be used to
20 generate the atom mapping between the molecule
21 and the core.
22 """
23 if core and corePattern:
24 if not core.GetNumAtoms(onlyExplicit=True)==corePattern.GetNumAtoms(onlyExplicit=True):
25 raise ValueError('When a pattern is provided, it must have the same number of atoms as the core')
26 coreMatch = core.GetSubstructMatch(corePattern)
27 if not coreMatch:
28 raise ValueError("Core does not map to itself")
29 else:
30 coreMatch = range(core.GetNumAtoms(onlyExplicit=True))
31 if corePattern:
32 match = mol.GetSubstructMatch(corePattern)
33 else:
34 match = mol.GetSubstructMatch(core)
35
36 if not match:
37 if not acceptFailure:
38 raise ValueError('Substructure match with core not found.')
39 else:
40 coordMap={}
41 else:
42 conf = core.GetConformer()
43 coordMap={}
44 for i,idx in enumerate(match):
45 pt3 = conf.GetAtomPosition(coreMatch[i])
46 pt2 = Geometry.Point2D(pt3.x,pt3.y)
47 coordMap[idx] = pt2
48 rdDepictor.Compute2DCoords(mol,clearConfs=True,coordMap=coordMap,canonOrient=False)
49
50 if __name__=='__main__':
51 import sys,getopt
52
55
56 args,extras = getopt.getopt(sys.argv[1:],'p:ho:',['smiles','pattern='])
57 if len(extras)!=2:
58 print('ERROR: Not enough arguments', file=sys.stderr)
59 Usage()
60 sys.exit(1)
61 patt = None
62 useSmiles = False
63 outF=None
64 for arg,val in args:
65 if arg=='-h':
66 Usage()
67 sys.exit(0)
68 elif arg=='-p' or arg=='--pattern':
69 patt = Chem.MolFromSmarts(val)
70 elif arg=='--smiles':
71 useSmiles = True
72 elif arg=='-o':
73 outF = val
74
75 if not useSmiles:
76 core = Chem.MolFromMolFile(extras[0])
77 else:
78 core = Chem.MolFromSmiles(extras[0])
79 rdDepictor.Compute2DCoords(core)
80
81 if not useSmiles:
82 mol = Chem.MolFromMolFile(extras[1])
83 else:
84 mol = Chem.MolFromSmiles(extras[1])
85
86 AlignDepict(mol,core,patt)
87
88 if outF:
89 outF = open(outF,'w+')
90 else:
91 outF = sys.stdout
92
93 print(Chem.MolToMolBlock(mol), file=outF)
94