RDKit:如何检查分子是否完全匹配?
RDKit: how to check molecules for exact match?
我正在使用 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 知识不多,他们的文档也很糟糕,但我自己做过这种事情。一种(可能过度设计的)方法是用 networkx 生成一个图,然后只比较节点和边。
这非常简单,使用 rdkit 读取 file/smiles 字符串,然后即时生成拓扑。如果你像上面那样从微笑字符串生成一个 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)
要检查两个不同的 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
我正在使用 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 知识不多,他们的文档也很糟糕,但我自己做过这种事情。一种(可能过度设计的)方法是用 networkx 生成一个图,然后只比较节点和边。
这非常简单,使用 rdkit 读取 file/smiles 字符串,然后即时生成拓扑。如果你像上面那样从微笑字符串生成一个 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)
要检查两个不同的 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