УЛЫБКИ от графа
Есть ли метод или пакет, который преобразует граф (или матрицу смежности) в строку 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 ответ
Вот простое решение, насколько мне известно, в 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
Существует множество других свойств атома (таких как состояние хиральности или протонирования) и типы связей (тройной, дативный...), которые, возможно, необходимо установить. По возможности лучше отслеживать их в своем графике (как в ссылке выше), но эту функцию также можно расширить, чтобы включить их при необходимости.