💻3.1 SMILES

Representación molecular usando SMILES.

La nomenclatura SMILES (del inglés; Simplified Molecular Input Line Entry Specification) representa a las estructuras químicas usando cadenas de caracteres alfanuméricos de tipo ASCII. Esta nomenclatura utiliza las siguientes reglas básicas para la codificación de moléculas:

  • Los átomos son representados a través de su símbolo atómico. Los hidrógenos de átomos saturados no se representan explícitamente.

  • Los átomos vecinos son colocados uno junto a otro. Los enlaces simple son representados a través de un guión simple (-), los enlaces dobles mediante el signo de igualdad (=); mientras que los enlaces triples con un símbolo de numeral (#).

  • Los paréntesis especifican ramificaciones dentro de la estructura. Las ramificaciones abarcan no sólo cadenas carbonadas sino también grupos funcionales. Por ejemplo, los grupos carbonilo se escriben como C(=O) ya que el átomo de oxígeno se encuentra por fuera de la cadena y se considera una ramificación.

  • Para la representación lineal de estructuras cíclicas, un enlace se "rompe" en cada anillo y los átomos de conexión entre anillos continúan con el mismo dígito en la representación. Los átomos dentro de un anillo aromático se indican con letras minúsculas.

Aunque la notación de SMILES son una forma clara de describir estructuras químicas, pueden existir múltiples representaciones SMILES válidas para el mismo gráfico molecular. Por ese motivo se generaron los SMILES canónicos para garantizar la existencia de una sola representación de un compuesto en una base de datos o identificar compuestos duplicados, pero es dependiente del programa utilizado. Por lo tanto, se recomienda generar los SMILES utilizando un solo programa.

A continuación, se muestran ejemplos para obtener representaciones SMILES usando la librería RDKit.

Ejercicios:

1. Conversión directa a partir de SMILES

En este ejercicio se codifica en formato molécula la estructura química del fármaco ponatinib, el cual es utilizado para tratar determinados tipos de leucemia mieloide crónica.

a) Como primer paso, se dibuja la estructura del ponatinib en MarvinSketch y se selecciona la opción de copiar la estructura molecular en formato Daylight SMILES.

b) A través de RDKit y de la función MolFromSmiles se convierte el SMILES generado a formato molécula utilizando el siguiente código:

from rdkit import Chem
drug = Chem.MolFromSmiles('CN1CCN(CC2=CC=C(NC(=O)C3=CC=C(C)C(=C3)C#CC3=CN=C4C=CC=NN34)C=C2C(F)(F)F)CC1 |c:18,27,29,34,t:6,8,13,15,23,25|')
drug     # 'drug' es la variable en la cual se almacena la representación molecular

El resultado que se imprime es el siguiente:

2. Conversión y uso del formato 'MOLFILE'

Se obtendrá el SMILES de mismo compuesto a partir del formato 'molblock' reportado en la base de datos DrugBank (ver la sección de Bases de datos moleculares para mayor información).

a) Ingrese a DrugBank (https://go.drugbank.com) y busque información relacionada con el fármaco ponatinib.

b) En la sección de "Structure" seleccione la opción 'MOL'.

c) Esta opción lo llevará a una nueva página que contiene una serie de números y letras que describen la estructura molecular. Copie el link de esta página.

e) En un cuaderno de código escriba las siguientes líneas y pegue el link después de la función request.get.

# La siguiente linea de código es para leer el formato MOL. En este caso se obtiene directamente del link de Drugbank.

ponatinib = requests.get('https://go.drugbank.com/structures/small_molecule_drugs/DB08901.mol').text

mol = Chem.MolFromMolBlock(ponatinib)  # el archivo de texto fue procesado y ahora es convertido a una estructura molecular en 2D.
mol.smile = Chem.MolToSmiles(mol)      # con la estructura molecular también podemos obtener el formato SMILES

print("El formato SMILES de esta molécula es: " , mol.smile)
mol

Estas líneas de código arrojan la estructura y el SMILES del fármaco ponatinib.

3. Lista de compuestos usando SMILES

Si se desea analizar un conjunto de compuestos al mismo tiempo es posible hacer uso de una lista como se muestra a continuación:


group_smiles = ['CC1=CC=C(C=C1)S(=O)(=O)NC(=O)NN1CCCCCC1', 'N[C@@H](CCC(O)=O)C(O)=O', 'CCN(CC)CC#CCOC(=O)C(O)(C1CCCCC1)C1=CC=CC=C1']
group_mol = []
for smiles in group_smiles:
  mol_i = Chem.MolFromSmiles(smiles)
  group_mol.append(mol_i)
  
fig_list = Draw.MolsToGridImage(group_mol)
fig_list

El código anterior permite visualizar estructuras moleculares presente en una lista:

4. Búsqueda de patrones en estructuras

Si el usuario desea conocer si en un conjunto determinado de moléculas existen subestructuras específicas (por ejemplo, un grupo carbonilo) entonces puede hacer uso de la función 'Substructure Match' y 'HasSubstructure Match'.

# Conjunto de compuestos 

group_smiles = ['CC1=CC=C(C=C1)S(=O)(=O)NC(=O)NN1CCCCCC1', 'N[C@@H](CCC(O)=O)C(O)=O', 'CCN(CC)CC#CCOC(=O)C(O)(C1CCCCC1)C1=CC=CC=C1']

group_mol = []
for smiles in group_smiles:
  mol_i = Chem.MolFromSmiles(smiles)
  group_mol.append(mol_i)

count = 0  # variable que sirve para contar el número de coincidencias encontrado entre las subestructuras
substructure_c = Chem.MolFromSmiles ('C(=O)') # en esta linea se especifica la estructura a buscar
for mol in group_mol:
    a = mol.HasSubstructMatch(substructure_c)
    if a is True:
      count += 1
print("Se ha encontrado coincidencias en",count,"estructuras.")

fig_substructures = Draw.MolsToGridImage(group_mol, highlightAtomLists=[mol.GetSubstructMatch(substructure_c) for mol in group_mol])
fig_substructures         

Este código arroja como resultado:

En este caso se definió el grupo carbonilo a partir de SMILES, en la sección de SMARTS notará la limitación que tiene este enfoque y la importancia de utilizar caracteres y símbolos de propiedades atómicas y de enlaces más allá de los utilizados en SMILES.

5. Visualización de estructuras en 3D

Para este ejercicio se hará uso de la libreria py3Dmol, desarrollada para crear visualizaciones de sistemas moleculares. Es de importancia recalcar que, si el usuario desea visualizar una estructura en 3D, la conversión debe suceder desde el formato 'mol', es decir, no es posible trabajar con las notaciones lineales SMILES, SMARTS e InChI.

import py3Dmol
def drawit(m,p=None,confId=-1):
        mb = Chem.MolToMolBlock(m,confId=confId)
        if p is None:
            p = py3Dmol.view(width=400,height=400)
        p.removeAllModels()
        p.addModel(mb,'sdf')
        p.setStyle({'stick':{}})
        p.setBackgroundColor('0xeeeeee')
        p.zoomTo()
        return p.show()

structure_example = Chem.MolFromMolFile("ChEBI_9123.mol",removeHs=False)
drawit(structure_example)

El resultado del código anterior se muestra a continuación:

Para saber más:

Last updated