RDKit: как проверить молекулы на точное совпадение? - PullRequest
1 голос
/ 13 февраля 2020

Я использую 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?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Чтобы проверить, представляют ли две разные улыбки одну и ту же молекулу, вы можете канонизировать улыбки.

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
0 голосов
/ 13 февраля 2020

Мои знания 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)
...