• 0238494791
  • spgoo.ecpy@gmail.com

CDA Aizynthfinder : resp. P. Krezel ICOA

Mise en oeuvre d’un service autour de la solution de rétro-synthèse AizynthFinder.

Plusieurs étapes dans cette mise en place.

  • La première étape permettra de vérifier l’exhaustivité des éléments fournis sous le github, de consolider l’ensemble, de l’installer sur une machine, de l’exécuter et de construire des benchs avec des molécules issues d’Emolgine et des molécules issues des collègues de l’ICOA.
  • La deuxième étape consistera à encapsuler l’ensemble dans une image Docker, afin de pouvoir le mettre à disposition et le transporter d’une machine à une autre sans perte de temps.
  • La troisième étape consistera à travailler sur l’ajout à cet ensemble d’un service Web, qui devra permettre d’invoquer la résolution d’une rétro-synthèse via un appel de type API-REST. Objectif est de pouvoir connecter ce dispositif à un frontal web ou à une application tierce.
  • La quatrième étape consistera au développement d’un frontal Web à destination des collègues chimistes qui devrait leur permettre d’interroger via un environnement Graphique ce web service pour un ou plusieurs smiles et de visualiser les résultats de ces rétro-synthèse pour leur molécules.
  • La cinquième étape consistera à ajouter la possibilité de compléter la base de connaissance de ce dispositif pour rajouter des réactions/réactifs supplémentaires.

Fichiers de données et modèles :

A partir des sources déposées sur le github suivant, on installe anaconda et le paramétrage de l’environnement conda comme indiqué dans le fichier README. Ce que ne fournit par le github c’est les fichiers hdf5 contenant les données nécessaires pour exécuter le code fourni et le fichier de configuration nécessaire pour la résolution: config.yml.

A partir de la documentation du site de https://molecularai.github.io/aizynthfinder/ on reconstitue le premier exemple fourni de fichier de configuration:

expansion:
  full:
    - uspto_expansion.onnx
    - uspto_templates.csv.gz
stock:
  zinc: zinc_stock.hdf5

Il faut retrouver les fichiers qui ne sont pas présents sur le github des sources. On arrive à retrouver les fichiers sur des sites différents :

  • A trained Keras expansion model that is called uspto_expansion.onnx : voir
  • A library of unique templates called uspto_templates.csv.gz –> Pascal Krezel
  • A stock file in HDF5 format, called zinc_stock.hdf5

Description du contenu de ces trois fichiers :

Contenu de l’archive : “zinc_stock_17_04_20.hdf5

show_hdf5_tree(“zinc_stock_17_04_20.hdf5”)
└── table
├── axis0 (1)
├── axis1 (17422831)
├── block0_items (1)
└── block0_values (1)

Structure et contenu du fichier uspto_templates.csv.gz

template_code retro_template template_hash classification library_occurence
0 [#7;a:4]:[c:3]:c;H0;D3;+0:1:[c:2]>>Br-c;H0;D3;+0:1:[c:3]:[#7;a:4].[IH;D0;+0:5] 0001ead678cb363e3389b34d33a6bd38acc9f88da5403e820b7bc8c2800eb53a 0.0 Unrecognized 19
1 [N;D1;H0:4]#[C:3]-[CH2;D2;+0:1]-[c:2]>>C-C(-C)(-C)-O-C(=O)-CH;D3;+0:1-[C:3]#[N;D1;H0:4] 0002f97a4d38f973095fc7d64488966c9d7b321beb0ea6c38dd61aefac810c0f 0.0 Unrecognized 7
2 [C:3]=[C:2]-[CH2;D2;+0:1]-[S;H0;D2;+0:4]-[c;H0;D3;+0:5]1:[#16;a:6]:[c:7]:[#7;a:8]:[n;H0;D2;+0:9]:1>>C-C(=O)-O-[CH2;D2;+0:1]-[C:2]=[C:3].[S;H0;D1;+0:4]=[c;H0;D3;+0:5]1:[#16;a:6]:[c:7]:[#7;a:8]:[nH;D2;+0:9]:1 0005f9ceb67426e8a8b4a22b0254d8a1bdefd2b2a0a233c966f8b0f67c86738a 0.0 Unrecognized 4
....
....
42552 [#7:4]-C:5-[c:7]1:[c:8]:[c:9]:[c:10]:c:11:[c:13]:1>>F-c;H0;D3;+0:1:[c:3].[#7:4]-C:5-[c:7]1:[c:8]:[c:9]:[c:10]:c:11:[c:13]:1 ffff06aeed0e85fda8980c3e4e178ef6afbda0820acfe7a9558fbaffedeb64d6 0.0 Unrecognized 43
42553 [#7;a:2]:[nH;D2;+0:1]:[c:3]>>C-O-C(=O)-n;H0;D3;+0:1:[c:3] fffff6d4a752349dce0db6afa525867fde3c248d45809392d62549ec926d30d0 0.0 Unrecognized 84

Constitution du fichier smiles.txt

Cc1cccc(c1N(CC(=O)Nc2ccc(cc2)c3ncon3)C(=O)C4CCS(=O)(=O)CC4)C

Pour exécuter le script il suffit de lancer la commande suivante :

(aizynth-envv2) ystroppa@dragon:~/ICOA/aizynthfinder_v2/aizynthfinder$ aizynthcli --config config.yml --smiles smiles.txt
Loading template-based expansion policy model from uspto_model.onnx to full
Loading templates from uspto_templates.csv.gz to full
Loading stock from InMemoryInchiKeyQuery to zinc
Selected as stock: zinc
Compounds in stock: 17422831
Selected as expansion policy: full
Done with Cc1cccc(c1N(CC(=O)Nc2ccc(cc2)c3ncon3)C(=O)C4CCS(=O)(=O)CC4)C in 24.1 s and is solved
Output saved to output.json.gz

Analyse et visualisation des résultats à partit du fichier output.json.gz

BenechMarks pour valider les résultats obtenus à partir de la solution :

L’idée est de réunir l’ensemble des éléments de aizf et d’ajouter tous les fichiers nécessaires à son fonctionnement. Plusieurs tentatives ont été exécutées avec entre autre anaconda3 mais dans ce cas on a eu un problème de chargement de contexte conda pour exécuter le pip nécessaire “RUN conda activate aizynth-env && python -m pip install aizynthfinder[all]” , erreur de la création d’image lors du chargement du contexte conda. Le système nous indique qu’il faut exécuter au préalable conda init. Du coup on s’est reporté sur miniconda en version 22.11.1 avec en natif un python 3.10 ce qui évite le chargeent de l’environnement conda car on l’a en natif.

Fichier Dockerfile

FROM  continuumio/miniconda3:22.11.1
RUN addgroup --gid 1000 icoa
RUN adduser --uid 1000 --gid 1000 --disabled-password --gecos "" icoa
WORKDIR /home/icoa
USER icoa
RUN git clone https://github.com/MolecularAI/aizynthfinder.git
COPY --chown=icoa:icoa config.yml  ./
COPY --chown=icoa:icoa smiles.txt ./
COPY --chown=icoa:icoa uspto_model.onnx ./
COPY --chown=icoa:icoa uspto_templates.csv.gz ./
COPY --chown=icoa:icoa zinc_stock_17_04_20.hdf5 ./
ENV bashrc /home/icoa/.bashrc
RUN echo 'export PATH=/home/icoa/.local/bin:$PATH'>> ~/.bashrc
RUN python -m pip install aizynthfinder[all]

Utilisation de l’image :

#docker run -it icoa bash
Syntaxe de la commande aizynthcli :

usage: aizynthcli [-h] --smiles SMILES --config CONFIG [--policy POLICY [POLICY …]] [--filter FILTER [FILTER …]]
[--stocks STOCKS [STOCKS …]] [--output OUTPUT] [--log_to_file] [--nproc NPROC] [--cluster]
[--route_distance_model ROUTE_DISTANCE_MODEL] [--post_processing POST_PROCESSING [POST_PROCESSING …]]
[--pre_processing PRE_PROCESSING] [--checkpoint CHECKPOINT]

Exemple d’exécution dans le conteneur :

icoa@599068b1cb84:~$ aizynthcli --config config.yml --smiles smiles.txt 
Loading template-based expansion policy model from uspto_model.onnx to full
Loading templates from uspto_templates.csv.gz to full
Loading stock from InMemoryInchiKeyQuery to zinc
Selected as stock: zinc
Compounds in stock: 17422831
Selected as expansion policy: full
Done with c1(F)cccc(F)c1S(=O)(=O)N(c2c(F)c(c3nc(CC(=O)NC)sc(c4ccnc(Nc5ccccc5)n4)3)ccc2) in 20.1 s and is not solved
Output saved to output.json.gz

Possibilité de démarrer un Jupyter Notebook à partir d’un conteneur via la commande suivante :

docker run -it -p 8888:8888  icoa  .local/bin/jupyter notebook --ip='*' --port=8888 --allow-root

Il suffit de relever dans les logs du démarrage du conteneur le token inscrit dans l’url suivante : http://127.0.0.1:8888/?token=865bc85149cfc0274c6ff4f72fb9c2006f41bf547ddeef58 et de lancer un navigateur sur la machine exécutant le conteneur. Ce qui permet d’accéder à jupyter notebook.

Reprendre la doc fournie par aizynthfinder https://molecularai.github.io/aizynthfinder/gui.html pour utiliser en mode graphique les fonctionnalités disponibles. Attention, lors de l’utilisation de l’interface le mode GUI ne fonctionne pas correctement.

Production des images à partir des résultats

Script fournie par AiZF pour l’exploitation des résultats et la production des images

import pandas as pd
from aizynthfinder.reactiontree import ReactionTree
data = pd.read_json("output.json.gz", orient="table")
all_trees = data.trees.values # This contains a list of all the trees for all the compounds
trees_for_first_target = all_trees[0]
for itree, tree in enumerate(trees_for_first_target):
     imagefile = f"route{itree:03d}.png"
     ReactionTree.from_dict(tree).to_image().save(imagefile)

Pour un usage en contexte sécurisé, nous conseillons de télécharger l’image docker fournie sur le site …. et d’exécuter un conteneur sur cette image pour un usage strictement local.

Monter un service web sous Python pour permettre des appels en passant le smiles et les paramètres pour obtenir les différents résultats sous forme json.

Habiller l’ensemble d’un frontal web pour permettre des manipulations simples des utilisateurs.