无法使用rdkit将分子转换为指纹



我正在尝试使用rdkit将分子微笑转换为指纹。我有两个微笑:Nc1cccc(N(n1和Nc1cc(CSc2ccc(O(cc2(cc(N。第一个扩展为第二个。换句话说,第二个分子在其结构中包含第一个分子。

我所做的是使用rdkit去除共同部分,以获得不同片段的微笑(凯库化形式的CSC1=CC=C(O(C=C1(。我正试图将这个片段转化为一个分子,然后转化为指纹,以计算与参考分子的相似性。

所需转换

但我得到了一个错误:"不能用这些原子的指数对原子进行kekulize"。这对我来说很奇怪,因为所有的微笑(两个输入的微笑和产生的碎片微笑(都可以使用MarvinSketch或Chemdraw(绘制分子的软件(轻松可视化。我甚至让马文对碎片微笑,并试图用它制造一个分子,但我仍然得到了同样的错误。这是我删除碎片的代码:

def remove_initial_fragment(mol_smiles, fragment_smiles):
mol = Chem.MolFromSmiles(mol_smiles) #creates molecule from the longer smiles
fragment = Chem.MolFromSmiles(fragment_smiles) #the molecule I want to remove
rm = AllChem.DeleteSubstructs(mol, fragment) #creates new molecule
return Chem.MolToSmiles(rm) #converts the mol I want back into smiles
smiles_frags = [remove_initial_fragment(x, fragment_smiles) for x in smiles]
mols_frags = [Chem.MolFromSmiles(x) for x in smiles_frags]

在我的例子中,"fragment_smiles"对于所有选定的微笑都是相同的。但后来我在试图将"mols_frags"列表中的分子转换为指纹时遇到了一个错误:

MFP_2 = [AllChem.GetMorganFingerprintAsBitVect(x, 2) for x in mols_frags]

我试着在网上寻找答案,但没有任何帮助。我甚至试图单独创建kekulized微笑,并将其直接作为创建指纹的输入,但我仍然会遇到同样的错误。

这对我来说非常奇怪,因为当我试图用相同的代码对一组微笑(片段、更长的微笑、产生的微笑(进行相同的处理时,它可以毫无问题地工作,而且我可以毫无错误地创建指纹。但在我看来,一旦我将微笑/分子作为列表输入,就会出现错误。知道为什么会这样吗?或者你在我的代码中看到了我不知道的错误吗?

使用fragment_smiles = 'Nc1cccc(N)n1'和类似smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1']list。我拿到指纹没问题。

删除子结构后,似乎有一些smiles_fraggs不是正确的smiles。

为了证明list中的SMILES给出了问题,可以使用

from rdkit.Chem import AllChem as Chem
fragment = Chem.MolFromSmiles('Nc1cccc(N)n1')
smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1', 'CC1=CC=Cc2c(N)nc(N)cc12']
for smi in smiles:
try:
mol = Chem.MolFromSmiles(smi)
f1 = Chem.DeleteSubstructs(mol, fragment)
f2 = Chem.MolFromSmiles(Chem.MolToSmiles(f1))
fp = Chem.GetMorganFingerprintAsBitVect(f2, 2)
except:
print('SMILES:', smi)
f = Chem.DeleteSubstructs(mol, fragment)
print('smiles_frag:', Chem.MolToSmiles(f1))

这将给出:

SMILES: CC1=CC=Cc2c(N)nc(N)cc12
smiles_frag: ccccC

相关内容

  • 没有找到相关文章

最新更新