【问题标题】:RDKit: how to check molecules for exact match?RDKit:如何检查分子是否完全匹配?
【发布时间】:2020-05-29 09:18:24
【问题描述】:

我正在使用 RDKit 并尝试检查分子是否完全匹配。 使用Chem.MolFromSmiles() 后,表达式m == p 显然不会导致预期的结果。 当然,我可以检查p是否是m的子结构,m是否是p的子结构。但对我来说,这看起来太复杂了。我在 RDKit 文档中找不到或忽略了完全匹配的代码示例。我该如何正确地做到这一点?谢谢你的提示。

代码:

from rdkit import Chem

myPattern = 'c1ccc2c(c1)c3ccccc3[nH]2'          # Carbazole
myMolecule = 'C1=CC=C2C(=C1)C3=CC=CC=C3N2'      # Carbazole

m = Chem.MolFromSmiles(myMolecule)
p = Chem.MolFromSmiles(myPattern)

print(m == p)                    # returns False, first (unsuccessful) attempt to check for identity

print(m.HasSubstructMatch(p))    # returns True
print(p.HasSubstructMatch(m))    # returns True
print(m.HasSubstructMatch(p) and p.HasSubstructMatch(m))    # returns True, so are the molecules identical?

【问题讨论】:

  • 您是否尝试过 rdkit 中的任何指纹识别选项?
  • 惊讶地发现还没有这样的功能!
  • 我认为您的测试(m.HasSubstructMatch(p) 和 p.HasSubstructMatch(m))是一个很好的平等测试。

标签: rdkit cheminformatics


【解决方案1】:

我的 RDKit 知识不是很好,他们的文档也很糟糕,但我自己也做过这种事情。一种(可能是过度设计的)方法是使用 networkx 生成一个图,然后只比较节点和边。

这非常简单,使用 rdkit 读取文件/微笑字符串,然后即时生成拓扑。如果你像上面那样从一个微笑字符串生成一个 rdkit_mol 对象,你会这样做:

import networkx as nx


def topology_from_rdkit(rdkit_molecule):

    topology = nx.Graph()
    for atom in rdkit_molecule.GetAtoms():
        # Add the atoms as nodes
        topology.add_node(atom.GetIdx())

        # Add the bonds as edges
        for bonded in atom.GetNeighbors():
            topology.add_edge(atom.GetIdx(), bonded.GetIdx())

    return topology


def is_isomorphic(topology1, topology2):
    return nx.is_isomorphic(topology1, topology2)

【讨论】:

  • 感谢您的建议。然而,另一个额外的包对我来说似乎有点矫枉过正......
  • 这不合理。
【解决方案2】:

要检查两个不同的 SMILES 是否代表同一个分子,您可以规范化 SMILES。

from rdkit import Chem

myPattern = 'c1ccc2c(c1)c3ccccc3[nH]2'
myMolecule = 'C1=CC=C2C(=C1)C3=CC=CC=C3N2'

a = Chem.CanonSmiles(myPattern)
b = Chem.CanonSmiles(myMolecule)

print(a)
'c1ccc2c(c1)[nH]c1ccccc12'

print(b)
'c1ccc2c(c1)[nH]c1ccccc12'

print(a==b)
True

【讨论】:

  • 感谢您的建议。好的,我不确定,但我的猜测是创建两个规范的 SMILES 可能比搜索两次子结构的计算密集度更低?!
  • @theozh 我用 5k SMILES 做了一个快速测试,你的子结构解决方案快了一点。
  • 虽然这是一种方式,但从 rdkit 分子到规范的 SMILES 可能是矫枉过正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2022-07-05
  • 2020-05-02
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多