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]',
51 '[!#1;D2;$([D2]-[!#1])]=,#[AD1]',
52 '[!#1;D1;$([D1]-[!#1;!n])]']
53 murckoQ = '['+','.join(['$(%s)'%x for x in murckoPatts])+']'
54 murckoQ = Chem.MolFromSmarts(murckoQ)
55 murckoPatts = [Chem.MolFromSmarts(x) for x in murckoPatts]
56 aromaticNTransform = AllChem.ReactionFromSmarts('[n:1]-[D1]>>[nH:1]')
79
81 while mol.HasSubstructMatch(murckoQ):
82 for patt in murckoPatts:
83 mol = Chem.DeleteSubstructs(mol,patt)
84 for atom in mol.GetAtoms():
85 if atom.GetAtomicNum()==6 and atom.GetNoImplicit() and atom.GetExplicitValence()<4:
86 atom.SetNoImplicit(False)
87 h = Chem.MolFromSmiles('[H]')
88 mol = Chem.ReplaceSubstructs(mol,Chem.MolFromSmarts('[D1;$([D1]-n)]'),h,True)[0];
89 mol=Chem.RemoveHs(mol)
90
91
92
93
94
95
96 return mol
97
99 """ Returns MurckScaffold Smiles from smiles
100
101 >>> MurckoScaffoldSmilesFromSmiles('Cc1cc(Oc2nccc(CCC)c2)ccc1')
102 'c1ccc(Oc2ccccn2)cc1'
103
104 """
105 mol = Chem.MolFromSmiles(smiles)
106 scaffold = GetScaffoldForMol(mol)
107 if not scaffold: return None
108 return Chem.MolToSmiles(scaffold,includeChirality)
109
111 """ Returns MurckScaffold Smiles from smiles
112
113 >>> MurckoScaffoldSmiles('Cc1cc(Oc2nccc(CCC)c2)ccc1')
114 'c1ccc(Oc2ccccn2)cc1'
115
116 >>> MurckoScaffoldSmiles(mol=Chem.MolFromSmiles('Cc1cc(Oc2nccc(CCC)c2)ccc1'))
117 'c1ccc(Oc2ccccn2)cc1'
118
119 """
120 if smiles:
121 mol = Chem.MolFromSmiles(smiles)
122 else:
123 mol = mol
124 if mol is None:
125 raise ValueError('No molecule provided')
126 scaffold = GetScaffoldForMol(mol)
127 if not scaffold: return None
128 return Chem.MolToSmiles(scaffold,includeChirality)
129
130
131
132
133
135 import doctest,sys
136 return doctest.testmod(sys.modules["__main__"],optionflags=doctest.ELLIPSIS)
137
138 if __name__ == '__main__':
139 import sys
140 failed,tried = _test()
141 sys.exit(failed)
142