1
2
3
4
5
6
7
8
9
10
11 from __future__ import print_function
12
13 from rdkit import Chem
14 import sys
15 from rdkit.Chem import Randomize
16
17
19 try:
20 Chem.SanitizeMol(mol)
21 mol = Chem.RemoveHs(mol)
22 except ValueError as msg:
23 return -1
24 except Exception:
25 import traceback
26 traceback.print_exc()
27 return -2
28 if mol.GetNumAtoms():
29 try:
30 Randomize.CheckCanonicalization(mol, 10)
31 except Exception:
32 import traceback
33 traceback.print_exc()
34 return -3
35 return 0
36
37
38 -def TestSupplier(suppl, stopAfter=-1, reportInterval=100, reportTo=sys.stderr, nameProp='_Name'):
39 nDone = 0
40 nFailed = 0
41 while 1:
42 try:
43 mol = suppl.next()
44 except StopIteration:
45 break
46 except Exception:
47 import traceback
48 traceback.print_exc()
49 nFailed += 1
50 reportTo.flush()
51 print('Failure at mol %d' % nDone, file=reportTo)
52 else:
53 if mol:
54 ok = TestMolecule(mol)
55 else:
56 ok = -3
57 if ok < 0:
58 nFailed += 1
59 reportTo.flush()
60 if ok == -3:
61 print('Canonicalization', end='', file=reportTo)
62 print('Failure at mol %d' % nDone, end='', file=reportTo)
63 if mol:
64 print(mol.GetProp(nameProp), end='', file=reportTo)
65 print('', file=reportTo)
66
67 nDone += 1
68 if nDone == stopAfter:
69 break
70 if not nDone % reportInterval:
71 print('Done %d molecules, %d failures' % (nDone, nFailed))
72 return nDone, nFailed
73
74
75 if __name__ == '__main__':
76 suppl = Chem.SDMolSupplier(sys.argv[1], False)
77 if len(sys.argv) > 2:
78 nameProp = sys.argv[2]
79 else:
80 nameProp = '_Name'
81
82 nDone, nFailed = TestSupplier(suppl, nameProp=nameProp)
83 print('%d failures in %d mols' % (nFailed, nDone))
84