J'ai essayé d'organiser le prétraitement de composés souvent utilisés en Python.
Cette fois, j'ai utilisé la bibliothèque suivante. Voir Ressources pour les instructions d'installation. MolVS est une bibliothèque spécialisée dans le prétraitement de composés, mais il semble qu'elle soit également incorporée dans RDKit.
RDKit : SanitizeMol La formation de Kekure, la confirmation de la valence, la fixation de l'aromaticité, la conjugaison, l'hybridation, etc. sont effectuées. référence: http://rdkit.org/docs/source/rdkit.Chem.rdmolops.html
Si vous créez un objet mol à partir de Smiles depuis RDKit, il semble que cela soit fait par défaut. Envie d'utiliser après avoir édité l'objet mol par vous-même?
MolVS : Normarize référence: https://molvs.readthedocs.io/en/latest/guide/standardize.html
Une série de conversions pour corriger les erreurs de dessin courantes et normaliser les groupes d'objets. Est-ce une correction de charge?
Essayons-le pour le moment.
from rdkit import Chem
from molvs.normalize import Normalizer, Normalization
old_smiles = "[Na]OC(=O)c1ccc(C[S+2]([O-])([O-]))cc1"
print("PREV:" + old_smiles)
old_mol = Chem.MolFromSmiles(old_smiles)
normalizer = Normalizer(normalizations=[Normalization('Sulfone to S(=O)(=O)', '[S+2:1]([O-:2])([O-:3])>>[S+0:1](=[O-0:2])(=[O-0:3])')])
new_mol = normalizer.normalize(old_mol)
new_smiles = Chem.MolToSmiles(new_mol)
print("NEW:" + new_smiles)
Ci-dessus, le processus de normalisation défini dans "Sulfone to S (= O) (= O)" est exécuté de manière sélective. Le résultat est le suivant, et les charges de l'atome de soufre et de l'atome d'oxygène ont changé. Si vous générez un normalisateur sans arguments, tous les processus de normalisation définis dans MolVS à l'avance seront exécutés.
PREV:[Na]OC(=O)c1ccc(C[S+2]([O-])([O-]))cc1
NEW: O=C(O[Na])c1ccc(C[S](=O)=O)cc1
MolVS : TautomerCanonicalizer Référence: https://molvs.readthedocs.io/en/latest/guide/tautomer.html Il semble que Tautomer soit un ensemble de molécules qui s'échangent facilement les unes avec les autres grâce au mouvement des atomes d'hydrogène. Un exemple typique est le phénol. (Exemple de phénol) https://en.wikipedia.org/wiki/File:Phenol_tautomers.svg
essayons.
from rdkit import Chem
from molvs.tautomer import TAUTOMER_TRANSFORMS, TAUTOMER_SCORES, MAX_TAUTOMERS, TautomerCanonicalizer, TautomerEnumerator, TautomerTransform
tautomerCanonicalizer = TautomerCanonicalizer((
TautomerTransform('1,7 aromatic heteroatom H shift r', '[#7,S,O,Se,Te,CX4;!H0]-[#6,#7X2]=[#6]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[NX2,S,O,Se,Te]'),
))
mol = Chem.MolFromSmiles("O=C1CC=CC=C1")
print("prev:" + Chem.MolToSmiles(mol))
mol2 = tautomerCanonicalizer.canonicalize(mol)
print("after: "+ Chem.MolToSmiles(mol2))
Ci-dessus, le procédé Tautoemer défini par la règle «1,7 hétéroatome aromatique H shift r» est exécuté sélectivement par le phénol Tautomer. En conséquence, le phénol est produit comme suit. Si TautomerCanonicalizer est généré sans aucun argument, tous les processus Tautoemer définis dans MolVS à l'avance seront exécutés.
prev:O=C1C=CC=CC1
after: Oc1ccccc1
MolVS : LargestFragmentChooser Référence: https://molvs.readthedocs.io/en/latest/api.html#molvs-fragment En gros, lorsque plusieurs molécules sont incluses, la plus grosse molécule est renvoyée.
essayons
from rdkit import Chem
from molvs.fragment import LargestFragmentChooser
flagmentChooser1 = LargestFragmentChooser()
old_smiles = "O=S(=O)(Cc1[nH]c(-c2ccc(Cl)s2)c[s+]1)c1cccs1.[Br-]"
print("prev:" + old_smiles)
mol = Chem.MolFromSmiles(old_smiles)
mol2 = flagmentChooser1(mol)
print("after:" + Chem.MolToSmiles(mol2))
Dans la partie supérieure, LargestFragmentChooser est appliqué à la liaison ionique de l'ion brome et d'une autre molécule, mais celle dans laquelle l'ion brome est éliminé est générée comme indiqué dans la partie inférieure.
prev:O=S(=O)(Cc1[nH]c(-c2ccc(Cl)s2)c[s+]1)c1cccs1.[Br-]
after:O=S(=O)(Cc1[nH]c(-c2ccc(Cl)s2)c[s+]1)c1cccs1
Référence: https://molvs.readthedocs.io/en/latest/api.html#molvs-charge
Il tente de neutraliser les acides ionisés et les bases de la molécule. essayons.
from molvs.charge import Reionizer, Uncharger
uncharger = Uncharger()
mol = Chem.MolFromSmiles("c1cccc[nH+]1")
print("prev:" + Chem.MolToSmiles(mol))
mol2 = uncharger(mol)
print("after:" + Chem.MolToSmiles(mol2))
Le sommet est une molécule contenant des acides et des bases ionisés, mais lorsque Uncharger est appliqué, il est neutralisé comme indiqué ci-dessous.
prev:c1cc[nH+]cc1
after:c1ccncc1
Certaines des choses qui n'ont pas pu être introduites cette fois étaient des traitements tels que "MolVS: réionisation" et "MolVS: Déconnecter les métaux", mais l'explication est omise car le composé cible n'a pas pu être imaginé. Voir les références pour plus de détails.