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

Can't convert molecule to fingerprint with rdkit

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

我所做的是使用 rdkit 删除公共部分以获得不同片段的微笑(kekulized 形式的 CSC1=CC=C(O​​)C=C1)。我正在尝试将该片段转换为分子,然后转换为指纹以计算与参考分子的相似性。

Desired transformation

但我收到错误消息:“无法使用这些原子的索引对原子进行 kekulize”。这对我来说很奇怪,因为使用 MarvinSketch 或 Chemdraw(用于绘制分子的软件)可以轻松地可视化所有微笑(两个输入微笑和生成的片段微笑)。我什至让 Marvin kekulize 了片段的微笑,并尝试从中制作分子,但我仍然遇到同样的错误。这是我删除片段的代码:

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 微笑并将它们直接作为创建指纹的输入传递,但我仍然遇到相同的错误。

这对我来说太奇怪了,因为当我尝试用相同的代码对一组微笑(片段、更长的微笑、最终的微笑)执行相同的过程时,它没有问题,而且我可以毫无问题地创建指纹任何错误。但在我看来,一旦我将 smiles/molecules 作为列表输入,就会出现错误。知道为什么会这样吗?还是您在我的代码中发现了我不知道的任何错误?

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

看起来好像删除子结构后,有一些smiles_frags不正确的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