【问题标题】:Can't convert molecule to fingerprint with rdkit无法使用 rdkit 将分子转换为指纹
【发布时间】:2021-07-21 22:18:59
【问题描述】:

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

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

Desired transformation

但我得到一个错误:'Can't kekulize atom' 带有这些原子的索引。这对我来说很奇怪,因为使用 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 微笑并将它们直接作为创建指纹的输入传递,但我仍然遇到相同的错误。

这对我来说非常奇怪,因为当我尝试使用相同的代码为一组微笑(片段、更长的微笑、最终的微笑)执行相同的过程时,它可以毫无问题地工作,并且我可以毫无错误地创建指纹.但在我看来,一旦我输入微笑/分子作为列表,我就会得到错误。知道为什么会这样吗?或者您是否在我的代码中看到了我不知道的任何错误?

【问题讨论】:

  • 如果我理解正确,您有fragment_smiles = 'Nc1cccc(N)n1'list,如smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1']。这对我有用。您的list 中的所有微笑都正确吗? RDKit 对阅读 SMILES 非常严格。
  • 是的,我有你描述的fragment_smileslist。问题不在于删除fragment_smiles。这执行得很好。但是,当我试图从中提取指纹时,我以这种方式获得的微笑会出错。 fragment_smileslist 中的微笑都是正确的,因为我用它们来创建整个未改变的分子的指纹,并且没有问题。当我尝试从list 中取出一个微笑时,从中删除片段并使用生成的微笑来创建指纹,它可以工作。但是当我尝试自动化它时,它给出了错误
  • 我对来自MFP_2 = [Chem.GetMorganFingerprintAsBitVect(x, 2) for x in mols_frags] 的指纹没有任何问题。看来您的smiles_frags / mols_frags 之一已损坏。
  • 我认为你是对的。我对此进行了更多的修补,我认为我看到一个微笑确实被破坏了。而且因为我将所有内容都作为列表传递,所以脚本会遇到损坏的微笑并完全停止。我正在努力修复它。现在我如何接受您的回答作为解决方案?

标签: python rdkit fingerprinting


【解决方案1】:

使用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

【讨论】:

  • 谢谢。你是对的。出于某种原因,删除子结构后,某些 SMILES 不正确。我已经找到了它们,并让我的脚本暂时跳过它们,然后我才弄清楚它们为什么出错以及如何解决它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
相关资源
最近更新 更多