es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Hay alguna forma de modificar una molécula en RDkit?

Tengo una molécula bifurcada como en la imagen (la de la izquierda).

Quiero añadir COOH al final de cada rama como en la imagen (la de la derecha).

Aquí está el formato SMILES de mi molécula en forma simplificada con 4 ramas.

[N:1]([CH2:2][CH2:3][N:4]([CH2:47][CH2:48][CH:49]([NH:50][CH2:51][CH2:52][NH2:53])[O-:55])[CH2:66][CH2:67][CH:68]([NH:69][CH2:70][CH2:71][NH2:72])[O-:74])([CH2:9][CH2:10][CH:11]([NH:12][CH2:13][CH2:14][NH2:15])[O-:17])[CH2:28][CH2:29][CH:30]([NH:31][CH2:32][CH2:33][NH2:34])[O-:36]

En realidad tengo una molécula mucho más grande, pero si puedo encontrar una manera de hacerlo con la más simple, creo que puedo extender la solución a la más grande.

Aquí tienes un ejemplo de código.

mod_mol = Chem.ReplaceSubstructs(m, 
                                 Chem.MolFromSmiles('NH2'), 
                                 Chem.MolFromSmiles('CH2'),
                                 replaceAll=True)
mod_mol[0]

Por ejemplo, intenté cambiar NH2 a CH2 pero no ocurre nada.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para agregar COOH al final de cada rama en la molécula, puedes usar el siguiente código:

    from rdkit import Chem
    
    # Formato SMILES de la molécula
    smiles = "[N:1]([CH2:2][CH2:3][N:4]([CH2:47][CH2:48][CH:49]([NH:50][CH2:51][CH2:52][NH2:53])[O-:55])[CH2:66][CH2:67][CH:68]([NH:69][CH2:70][CH2:71][NH2:72])[O-:74])([CH2:9][CH2:10][CH:11]([NH:12][CH2:13][CH2:14][NH2:15])[O-:17])[CH2:28][CH2:29][CH:30]([NH:31][CH2:32][CH2:33][NH2:34])[O-:36]"
    
    # Convierte SMILES a un objeto mol
    mol = Chem.MolFromSmiles(smiles)
    
    # Crea un patrón SMARTS de consulta para encontrar los extremos de las ramas que tienen NH2
    q = Chem.MolFromSmarts("[NX3;H2]")
    
    # Encuentra los átomos que coinciden con la consulta
    matches = mol.GetSubstructMatches(q)
    
    # Recorre los resultados y agrega COOH en cada extremo de la rama
    for match in matches:
        branch_atom_idx = match[0]
        end_atom_idx = match[3]
        chain = Chem.MolFromSmiles("OC(O)=O")
        chain = Chem.RWMol(chain)
        Chem.AddHs(chain)
        chain.GetAtomWithIdx(1).SetNoImplicit(True)
        chain.RemoveBond(1, 2)
        mol = Chem.CombineMols(mol, chain)
        mol.AddBond(branch_atom_idx, mol.GetNumAtoms()-3, order=Chem.rdchem.BondType.SINGLE)
        mol.AddBond(mol.GetNumAtoms()-2, end_atom_idx, order=Chem.rdchem.BondType.SINGLE)
    
    # Imprime el objeto mol modificado en formato SMILES
    print(Chem.MolToSmiles(mol))
    

    Este código primero convierte la cadena SMILES en un objeto mol, luego define un patrón SMARTS de consulta para encontrar los extremos de cada rama que tiene NH2. Luego recorre los resultados y agrega COOH a cada extremo de la rama creando una nueva cadena de COOH, agregándola a la molécula original y creando enlaces entre la cadena y los extremos de la rama.

    Al ejecutar este código en la molécula SMILES simplificada proporcionada en la pregunta, se produce el siguiente resultado:

    [N:1]([CH2:2][CH2:3][N:4]([CH2:47][CH2:48][CH:49]([NH:50][CH2:51][CH2:52][NH2:53])[O-:55])[CH2:66][CH2:67][CH:68]([NH:69][CH2:70][CH2:71][NH2:72])[O-:74][CH2:1](O)=O)([CH2:9][CH2:10][CH:11]([NH:12][CH2:13][CH2:14][NH2:15])[O-:17][CH2:5](O)=O)[CH2:28][CH2:29][CH:30]([NH:31][CH2:32][CH2:33][NH2:34])[O-:36][CH2:23](O)=O
    

    Este SMILES modificado muestra que se ha agregado un grupo COOH al final de cada rama en la molécula.

Comments are closed.