Sonrisas de la gráfica

¿Existe algún método o paquete que convierta un gráfico (o matriz de adyacencia) en una cadena SMILES?

Por ejemplo, sé que los átomos son [6 6 7 6 6 6 6 8] ([CCNCCCCO]) , y la matriz de adyacencia es

 [[ 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.]] 

Necesito alguna función para generar 'CC1=NCCC(C)O1' .

También funciona si alguna función puede generar el objeto "mol" correspondiente. El software RDkit tiene una función 'MolFromSmiles' . Me pregunto si hay algo como 'MolFromGraphs' .

Gracias de antemano.

    Aquí hay una solución simple, que yo sepa, no hay una función integrada para esto en 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)) 

    Afuera:
    'CC1=NCCC(C)O1'

    Esta solución es una versión simplificada de https://github.com/dakoner/keras-molecules/blob/dbbb790e74e406faa70b13e8be8104d9e938eba2/convert_rdkit_to_networkx.py

    Existen muchas otras propiedades atómicas (como el estado de quiralidad o protonación) y los tipos de enlace (Triple, Dativo ...) que pueden ser necesarios. Es mejor hacer un seguimiento de estos explícitamente en su gráfico si es posible (como en el enlace anterior), pero esta función también se puede ampliar para incorporarlos si es necesario.