1
2
3
4
5 """
6 Generation of Murcko scaffolds from a molecule
7 """
8
9 from rdkit import Chem
10 from rdkit.Chem import AllChem
11
12 murckoTransforms = [AllChem.ReactionFromSmarts('[*:1]-[!#1;D1]>>[*:1][H]'),
13 AllChem.ReactionFromSmarts('[*:1]-[!#1;D2]#[AD1]>>[*:1][H]'),
14 AllChem.ReactionFromSmarts('[*:1]-[!#1;D2]=[AD1]>>[*:1][H]'),
15 AllChem.ReactionFromSmarts('[*:1]-[!#1;D3](=[AD1])=[AD1]>>[*:1][H]')]
16
17
19 """ Makes a Murcko scaffold generic (i.e. all atom types->C and all bonds ->single
20
21 >>> Chem.MolToSmiles(MakeScaffoldGeneric(Chem.MolFromSmiles('c1ccccc1')))
22 'C1CCCCC1'
23 >>> Chem.MolToSmiles(MakeScaffoldGeneric(Chem.MolFromSmiles('c1ncccc1')))
24 'C1CCCCC1'
25
26 The following were associated with sf.net issue 246
27 >>> Chem.MolToSmiles(MakeScaffoldGeneric(Chem.MolFromSmiles('c1[nH]ccc1')))
28 'C1CCCC1'
29 >>> Chem.MolToSmiles(MakeScaffoldGeneric(Chem.MolFromSmiles('C1[NH2+]C1')))
30 'C1CC1'
31 >>> Chem.MolToSmiles(MakeScaffoldGeneric(Chem.MolFromSmiles('C1[C@](Cl)(F)O1')))
32 'CC1(C)CC1'
33
34 """
35 res = Chem.Mol(mol)
36 for atom in res.GetAtoms():
37 if atom.GetAtomicNum() != 1:
38 atom.SetAtomicNum(6)
39 atom.SetIsAromatic(False)
40 atom.SetFormalCharge(0)
41 atom.SetChiralTag(Chem.ChiralType.CHI_UNSPECIFIED)
42 atom.SetNoImplicit(0)
43 atom.SetNumExplicitHs(0)
44 for bond in res.GetBonds():
45 bond.SetBondType(Chem.BondType.SINGLE)
46 bond.SetIsAromatic(False)
47 return Chem.RemoveHs(res)
48
49
50 murckoPatts = ['[!#1;D3;$([D3]-[!#1])](=[AD1])=[AD1]', '[!#1;D2;$([D2]-[!#1])]=,#[AD1]',
51 '[!#1;D1;$([D1]-[!#1;!n])]']
52 murckoQ = '[' + ','.join(['$(%s)' % x for x in murckoPatts]) + ']'
53 murckoQ = Chem.MolFromSmarts(murckoQ)
54 murckoPatts = [Chem.MolFromSmarts(x) for x in murckoPatts]
55 aromaticNTransform = AllChem.ReactionFromSmarts('[n:1]-[D1]>>[nH:1]')
56
57
80
81
93
94
96 """ Returns MurckScaffold Smiles from smiles
97
98 >>> MurckoScaffoldSmiles('Cc1cc(Oc2nccc(CCC)c2)ccc1')
99 'c1ccc(Oc2ccccn2)cc1'
100
101 >>> MurckoScaffoldSmiles(mol=Chem.MolFromSmiles('Cc1cc(Oc2nccc(CCC)c2)ccc1'))
102 'c1ccc(Oc2ccccn2)cc1'
103
104 """
105 if smiles:
106 mol = Chem.MolFromSmiles(smiles)
107 if mol is None:
108 raise ValueError('No molecule provided')
109 scaffold = GetScaffoldForMol(mol)
110 if not scaffold:
111 return None
112 return Chem.MolToSmiles(scaffold, includeChirality)
113
114
116 """ Returns MurckScaffold Smiles from smiles
117
118 >>> MurckoScaffoldSmilesFromSmiles('Cc1cc(Oc2nccc(CCC)c2)ccc1')
119 'c1ccc(Oc2ccccn2)cc1'
120
121 """
122 return MurckoScaffoldSmiles(smiles=smiles, includeChirality=includeChirality)
123
124
125
126
127
128
130 import sys
131 import doctest
132 failed, _ = doctest.testmod(optionflags=doctest.ELLIPSIS, verbose=verbose)
133 sys.exit(failed)
134
135
136 if __name__ == '__main__':
137 _runDoctests()
138