12 votos

¿Convertir el SMARTS en el SMILES es una operación "sin pérdidas"?

Las siguientes tres cuerdas SMARTS diferentes representan la misma estructura, al menos cuando se representa (por ejemplo, en Uni Hamburg Smarts viewer ).

SMARTS:  
[#6]-1=[#6]-[#6](-[#6]-[#6](-[#6]-1)-[#6])=[#8]  
[#6]-1-[#6]=[#6]-[#6](-[#6]-[#6]-1-[#6])=[#8]  
[#6]-1-[#6](-[#6]=[#6]-[#6]-[#6]-1-[#6])=[#8]  

Además, la estructura química representada en SONRISAS lleva a una sola cadena, al menos una que se me ocurre.

SMILES:
CC1CC=CC(=O)C1

Ahora, conozco las diferencias entre SMARTS y SMILES, y sé lo que significan los símbolos en SMARTS. Aún así, probé varios programas para encontrar diferencias en el uso de la representación de SMARTS y SMILES para ese caso específico y no pude encontrar ninguno.

Así que me pregunto si podría usar SMILES en ese caso, o si hay algún peligro de que falte información, por ejemplo al buscar subestructuras.

9voto

js-coder Puntos 158

SMARTS está deliberadamente diseñado para ser un superconjunto de SONRISAS. Es decir, cualquier representación válida de SMILES debería ser también una consulta SMARTS válida, una que recuperará la misma estructura que la cadena de SMILES representa.

Sin embargo, como lenguaje de consulta, SMARTS puede ser más general que SMILES. Por ejemplo, CC como una cuerda de SMILES representa un solo compuesto: etano. Sin embargo, como una consulta de SMARTS, CC coincidirá con el etano, pero también con el propano, el ácido acético, el ciclohexano, la vancomicina, etc.

También hay cuerdas SMARTS que no son cuerdas SMILES válidas. En tu pregunta enumeras varias: [#6]-1=[#6]-[#6](-[#6]-[#6](-[#6]-1)-[#6])=[#8] no es una representación válida de SMILES, a menos que su analizador de SMILES sea particularmente generoso. Incluso si lo es, [#6]-1=[#6]-[#6](-[#6]-[#6](-[#6]-1)-[#6])=[#8,#7] es también una consulta SMARTS válida que debería coincidir con su molécula, pero ni siquiera un analizador de SMILES generoso es probable que la acepte.

A pesar de ser similares, SMARTS y SMILES están destinados a cosas fundamentalmente diferentes: el propósito de SMILES es representar compuestos particulares, mientras que SMARTS representa una consulta contra una gama de posibles moléculas, o una descripción abstracta de un conjunto de posibles moléculas. Como tales, no son inter-convertibles, incluso si las cadenas son literalmente idénticas.

Para su particular caso, sí, CC1CC=CC(=O)C1 es tanto un SMILES válido como un SMARTS válido, pero como consulta SMARTS, representa no sólo el 5-metil-2-ciclohexeno-1-uno, sino también el 5-propil-2-ciclohexeno-1-uno y el 3-hidroxi-5-butil-6-amino-2-ciclohexeno-1-uno, así como muchos otros, todos los cuales contienen esa subestructura. El visor SMARTS que enlaza no muestra esto explícitamente, porque está implícito en el uso de SMARTS que es un patrón de subestructura para una clase más amplia de compuestos.

4voto

yura Puntos 121

Thilo hizo una pregunta similar en el rdkit-discuss lista de correo, en la que Andrew Dalke se metió con esta respuesta, que me dio permiso para publicar aquí. La respuesta utiliza la biblioteca rdkit basada en pitón para dar ejemplos de conversión entre SMILES y SMARTS y otras tareas.

De Andrew Dalke:

El 19 de abril de 2017, a las 12:03, Thilo Bauer escribió:

¿Convertir el SMARTS en el SMILES es una operación "sin pérdidas", o se pierde información sobre cómo hacerlo?

Obviamente no es sin pérdidas si se incluyen términos que no pueden ser representados en SONRISAS.

>>> from rdkit import Chem
>>> Chem.MolToSmiles(Chem.MolFromSmarts("[C,N]"))
'C'

o que no tienen sentido como molécula:

>>> Chem.MolToSmiles(Chem.MolFromSmarts("c"))
'c'
>>> Chem.MolFromSmiles("c")
[23:02:24] non-ring atom 0 marked aromatic

También pierde algo de información que podría ser representada en el SMILES:

>>> Chem.MolToSmiles(Chem.MolFromSmarts("[NH4+]"))
'N'
>>> Chem.MolToSmiles(Chem.MolFromSmarts("C[N+]1(C)CCCCC1"))
'CN1(C)CCCCC1'
>>> Chem.MolToSmiles(Chem.MolFromSmarts("[12C]"), isomericSmiles=True)
'C'

Tengan cuidado si quieren manejar átomos aromáticos y enlaces:

>>> Chem.MolToSmiles(Chem.MolFromSmarts("[#6]:1:[#6]:[#6]:[#6]:[#6]:[#6]:1"))
'C1:C:C:C:C:C:1'
>>> Chem.MolToSmiles(Chem.MolFromSmarts("c=1-c=c-c=c-c=1"))
'c1=c-c=c-c=c-1'

Antecedentes: Tengo tres cuerdas SMARTS diferentes que representan la misma estructura - por lo menos cuando lo represente. Además, las tres cuerdas dan como resultado la exacta los mismos SONRISOS (ver código y salida más abajo).

Parece que quieres la canonización de SMARTS.

En general esto es difícil, porque el SMARTS puede incluir expresiones booleanas y SMARTS recursivas.

Si te limitas a patrones como '[#6]-1=[#6]-[#6]...' con sólo números atómicos y enlaces simples/dobles/triples, entonces creo que RDKit hará lo que quieras.

[[CF: Andrew Dalke también tenía un importante comentario a nivel de respuesta de R.M., que copio a continuación.]]

De intercambio de pilas de química, una respuesta aportada por el usuario R.M.:

SMARTS está diseñado deliberadamente para ser un superconjunto de SMILES. Es decir, cualquier representación válida de SMILES debería ser también una consulta válida de SMARTS, una que recuperará la misma estructura que la cadena de SMILES representa.

Excepto que esa última cláusula no es cierta. Intenta hacer coincidir el tritio contra sí mismo.

>>> from rdkit import Chem
>>> mol = Chem.MolFromSmiles("[3H]")
>>> pat = Chem.MolFromSmarts("[3H]")
>>> mol.HasSubstructMatch(pat)
False

Para los hidrógenos debes usar "#1", porque la H en SMARTS significa algo diferente.

>>> pat2 = Chem.MolFromSmarts("[3#1]")
>>> mol.HasSubstructMatch(pat2)
True

La entrada de sonrisas bajo la luz del día y la mayoría de las otras herramientas se normalizan al modelo químico, incluyendo la percepción de la aromaticidad:

>>> mol = Chem.MolFromSmiles("C1=CC=CC=C1")
>>> pat = Chem.MolFromSmarts("C1=CC=CC=C1")
>>> mol.HasSubstructMatch(pat)
False
>>> pat2 = Chem.MolFromSmarts("c1ccccc1")
>>> mol.HasSubstructMatch(pat2)
True

RDKit también hace una pequeña cantidad de normalización adicional, o "higienización" para usar el término RDKit. Por ejemplo, convertirá "Ns de coordenadas neutrales 5 con doble enlace a Os a la forma zwitteriónica" (véase GraphMol/MolOps.cpp):

>>> s = "CN(=O)=O"
>>> mol = Chem.MolFromSmiles(s)
>>> pat = Chem.MolFromSmarts(s)
>>> mol.HasSubstructMatch(pat)
False
>>> Chem.MolToSmiles(mol)
'C[N+](=O)[O-]'

Creo que la salida SMILES de un juego de herramientas, asumiendo que el SMILES no tiene un hidrógeno explícito, se puede utilizar un SMARTS que coincidirá con la molécula hecha de ese mismo SMILES, por ese mismo juego de herramientas.

1voto

idbrii Puntos 482

En este caso, el SMARTS y el SMILES representan la misma (sub)estructura, en particular porque el patrón SMARTS define explícitamente el tipo de átomo único y la conectividad para todos los átomos. Así que para responder a tu pregunta, sí, este caso es una conversión sin pérdidas.

Por el contrario, si el O podría ser un O o un N los inteligentes no se darían cuenta de eso. Y esto, tanto los SMILES como los SMARTS se perderían N=C1C=CCC(C)C1 . Sin embargo, puedes escribir un SMARTS para que coincida con ambos N=C1C=CCC(C)C1 y O=C1C=CCC(C)C1 pero una sonrisa no lo hará.

Además, tenga en cuenta que las sonrisas podrían escribirse de muchas maneras (equivalentes), por ejemplo, O=C1C=CCC(C)C1

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X