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.