УЛЫБКИ от графа - PullRequest
       46

УЛЫБКИ от графа

0 голосов
/ 05 июля 2018

Есть ли метод или пакет, который преобразует граф (или матрицу смежности) в строку SMILES?

Например, я знаю, что атомы [6 6 7 6 6 6 6 8] ([C C N C C C C O]), а матрица смежности

[[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],

 [ 1.,  0.,  2.,  0.,  0.,  0.,  0.,  1.],

 [ 0.,  2.,  0.,  1.,  0.,  0.,  0.,  0.],

 [ 0.,  0.,  1.,  0.,  1.,  0.,  0.,  0.],

 [ 0.,  0.,  0.,  1.,  0.,  1.,  0.,  0.],

 [ 0.,  0.,  0.,  0.,  1.,  0.,  1.,  1.],

 [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],

 [ 0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.]]

Мне нужна какая-то функция для вывода 'CC1=NCCC(C)O1'.

Это также работает, если какая-то функция может вывести соответствующий "mol" объект. Программное обеспечение RDkit имеет функцию 'MolFromSmiles'. Интересно, есть ли что-то вроде 'MolFromGraphs'.

Заранее спасибо.

1 Ответ

0 голосов
/ 09 июля 2018

Вот простое решение, насколько мне известно, в RDKit нет встроенной функции для этого.

def MolFromGraphs(node_list, adjacency_matrix):

    # create empty editable mol object
    mol = Chem.RWMol()

    # add atoms to mol and keep track of index
    node_to_idx = {}
    for i in range(len(node_list)):
        a = Chem.Atom(node_list[i])
        molIdx = mol.AddAtom(a)
        node_to_idx[i] = molIdx

    # add bonds between adjacent atoms
    for ix, row in enumerate(adjacency_matrix):
        for iy, bond in enumerate(row):

            # only traverse half the matrix
            if iy <= ix:
                continue

            # add relevant bond type (there are many more of these)
            if bond == 0:
                continue
            elif bond == 1:
                bond_type = Chem.rdchem.BondType.SINGLE
                mol.AddBond(node_to_idx[ix], node_to_idx[iy], bond_type)
            elif bond == 2:
                bond_type = Chem.rdchem.BondType.DOUBLE
                mol.AddBond(node_to_idx[ix], node_to_idx[iy], bond_type)

    # Convert RWMol to Mol object
    mol = mol.GetMol()            

    return mol
Chem.MolToSmiles(MolFromGraphs(nodes, a))

Из:
'CC1=NCCC(C)O1'

Это решение является упрощенной версией https://github.com/dakoner/keras-molecules/blob/dbbb790e74e406faa70b13e8be8104d9e938eba2/convert_rdkit_to_networkx.py

Существует множество других свойств атома (таких как состояние хиральности или протонирования) и типы связей (тройной, дательный ...), которые, возможно, необходимо установить. По возможности лучше отслеживать их в своем графике (как в ссылке выше), но эту функцию также можно расширить, чтобы включить их при необходимости.

...