- Le blog participatif de bioinformatique francophone depuis 2012 -

Automatiser la récupération de données biologiques

Qui dit bio­in­for­ma­tique, dit récu­pé­ra­tion et mani­pu­la­tion des don­nées. Ces don­nées peuvent être géné­rées à par­tir d'algorithmes ou bien récu­pé­rées depuis des bases de don­nées bio­lo­giques. Aujourd'hui, le nombre de ces bases de don­nées est en constante aug­men­ta­tion. Chaque méca­nisme bio­lo­gique, famille molé­cu­laire ou orga­nisme est asso­cié à un ou plu­sieurs de ces dépôts de don­nées. Si un bio­lo­giste peut en géné­ral se "conten­ter" d'une exploi­ta­tion visuelle des don­nées au moyen d'un site web, le bio­in­for­ma­ti­cien sera plus sen­sible à deux aspects impor­tants : les inter­faces per­met­tant de récu­pé­rer auto­ma­ti­que­ment ces don­nées (lien de télé­char­ge­ment, site FTP,…) et leur(s) format(s).

Cet article va s'intéresser à un moyen "qua­si-uni­ver­sel" de récu­pé­ra­tion des don­nées héber­gées sur un site Web : les adresses Web. En fait, tout site Web est asso­cié à une ou plu­sieurs adresses Web, qu'il vende des livres ou four­nisse des don­nées géno­miques. Une adresse Web per­met de récu­pé­rer des don­nées depuis un site Web (c'est ce que l'on appelle une requête GET) ou, à l'inverse, de four­nir des don­nées à ce site (requête POST telle que celle per­met­tant de sou­mettre un for­mu­laire). Nous allons ici nous inté­res­ser uni­que­ment aux requêtes GET, et notam­ment celles de la forme :

http://base_URL/operation?argument1=valeur1&argument2=valeur2

Ce type d'adresse permet d'atteindre un programme (l'opération) d'un site Web et ce programme accepte un ou plusieurs paramètres dont les valeurs permettent de préciser ce que l'on souhaite obtenir.

D'autres adresses sont plutôt de cette forme :

http://base_URL/operation/argument1/argument2

Alors pourquoi dire que ces adresses Web sont un moyen "quasi-universel" de récupération des données? Et bien tout simplement parce qu'il n'y a pas toujours de réelle volonté à les mettre de l'avant et à les rendre intelligibles. Voici par exemple l'adresse du site d'Amazon.fr permettant d'obtenir la liste des albums du groupe Iron Maiden :

https://www.amazon.fr/s/ref=nb_sb_noss?__mk_fr_FR=ÅMÅŽÕÑ&url=search-alias%3Daps&field-keywords=Iron+Maiden

On reconnaît bien une des formes décrites plus haut, mais on a vu plus clair dans le choix des noms et des valeurs de paramètres!! Par comparaison, un site comme Google Maps fournit une documentation très précise permettant de construire des adresses Web générant des cartes. Voici par exemple celle permettant d'obtenir une carte centrée sur Strasbourg :

https://maps.googleapis.com/maps/api/staticmap?center=Strasbourg,FR&zoom=13&size=600x300

Bien plus clair non? Le programme staticmap reçoit trois paramètres : le centre de la carte, le niveau de zoom et la taille de l'image. Et voici ce que cette requête Web vous renvoie :

staticmap

Un certain nombre de bases de données biologiques exploitent ouvertement ce type de point d'accès. On peut ainsi citer l'EMBL-EBI ou KEGG. Pour d'autres bases de données biologiques, il faut davantage fouiller pour les trouver. Par exemple dans le cas de la Protein Data Bank, chaque lien de téléchargement est de type :

http://files.rcsb.org/download/1EHZ.pdb

On voit donc très bien comment récupérer automatiquement plusieurs structures 3D à partir d'une liste d'identifiants PDB.

De telles adresses peuvent être vues comme des "services Web" dit de type REST. L'avantage est que le pré-requis est minimaliste pour les exploiter efficacement, contrairement à des approches plus lourdes telles que SOAP (voir cette page de l'EMBL si vous voulez en savoir davantage). Cela nécessite juste un outil capable de réaliser la requête Web, tel qu'un navigateur Web comme Firefox ou Chrome. Mais là où cela devient intéressant, c'est lorsque l'on peut automatiser cette récupération avec des outils en ligne de commande tels que wget, grep, sed et xargs. C'est ce que je vais vous illustrer maintenant avec les Entrez Programming Utilities du NCBI.

Les Entrez Programming Utilities du NCBI

Le site Web du NCBI permet de récupérer les données au moyen de trois points d'accès :

Les E-utilities correspondent à plusieurs outils joignables au moyen d'adresses Web dont la base est systématiquement :

http://eutils.ncbi.nlm.nih.gov/entrez/eutils/

Vient ensuite le nom du programme (ou opération) que l'on souhaite utiliser. Nous nous intéresserons au programme Efetch permettant de récupérer des données sur la base de leur identifiant :

http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?

Plusieurs paramètres sont disponibles pour ce programme. Dans cet exemple, nous souhaitons récupérer le génome d'Escherichia coli K12 au format Genbank. Pour cela, nous utiliserons trois paramètres afin de préciser notre requête :

  • le nom de la base de données (db),
  • l'identifiant des données (id),
  • le format de ces données (rettype).

Notre requête auprès du NCBI prendra donc la forme suivante :

http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id=NC_000913&rettype=gbwithparts

La commande UNIX wget

Si l'adresse ci-dessous est collée dans la barre d'adresse d'un navigateur Web, celui-ci affichera les données en texte brut ou téléchargera le fichier texte (suivant sa configuration). Afin de manipuler directement les données téléchargées, nous allons transmettre notre requête au moyen de la commande UNIX wget (si vous utilisez MacOSX, la commande équivalente est curl. Mais vous pouvez obtenir la commande wget avec un gestionnaire comme Homebrew.).

Acronyme de "web get", wget télécharge automatiquement les données dans un fichier dont le nom correspond à la dernière partie de l'adresse web :

wget "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id=NC_000913&rettype=gbwithparts"

Ce comportement par défaut ne va pas nous intéresser, et ceci pour deux raisons :

  1. la dernière partie de notre adresse (?db=nucleotide&id=NC_000913&rettype=gbwithparts) n'est pas un excellent nom de fichier,
  2. nous ne souhaitons pas "enfermer" les données dans un fichier, mais plutôt les "transmettre" à une seconde commande UNIX qui va les traiter.

En conséquence, notre commande n°1 (notée commande_1 dans la suite de l'article) devient :

wget -qO - "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id=NC_000913&rettype=gbwithparts"

Cela a pour effet de télécharger et d'afficher à l'écran le génome d'Escherichia coli K12 au format Genbank.

La récupération automatique du protéome d'Escherichia coli K12 au format FASTA

Afin de récupérer ce protéome, nous allons tout d'abord filtrer les données téléchargées au moyen de la commande grep. Ce filtrage va nous permettre de sélectionner les lignes possédant les identifiants protéiques nous intéressant. La communication entre les deux commandes sera assurée par un caractère particulier nommé "pipe" (|) :

commande_1 | grep "/protein_id="

Cette commande (notée commande_2 dans la suite de l'article) produit le résultat suivant (pour simplifier, seules les dix premières lignes seront systématiquement affichées) :

                     /protein_id="NP_414542.1"
/protein_id="NP_414543.1"
/protein_id="NP_414544.1"
/protein_id="NP_414545.1"
/protein_id="NP_414546.1"
/protein_id="NP_414547.1"
/protein_id="NP_414548.1"
/protein_id="NP_414549.1"
/protein_id="NP_414550.1"
/protein_id="NP_414551.1"

Nous allons maintenant extraire de chacun de ces lignes l'identifiant protéique au moyen de la commande sed. Sed, tout comme grep, possède plusieurs mémoires. L'idée est d'indiquer à sed que l'on souhaite mettre dans sa mémoire n°1 les caractères entre les guillemets et de ne conserver que cette information pour chaque ligne :

commande_2 | sed -E 's/^.+"(.+)"$/\1/'

Dans cette commande (notée commande_3 dans la suite de l'article), l'option -E de sed permet d'indiquer que le caractère + de l'expression régulière doit être comprise dans son sens "magique" (appelé aussi méta-caractère). Dans ce cas, la combinaison

.+

signifie n'importe quel caractère au moins une fois. La règle de substitution de sed indique qu'elle ne concerne que les lignes structurées de la façon suivante :

  • au moins un caractère entre le début de la ligne (^) et le premier guillemet
  • au moins un caractère entre le premier guillemet et le deuxième (et qui est mis dans la première mémoire grâce aux parenthèses)
  • au moins un caractère entre le deuxième guillemet et la fin de la ligne ($)

Pour chaque ligne avec cette structure (ce qui est le cas de toutes les lignes sélectionnées par la commande grep), l'intégralité de la ligne est remplacée par ce qui a été mis dans la première mémoire de sed (grâce à l'instruction \1). Cela nous donne donc le résultat suivant :

NP_414542.1
NP_414543.1
NP_414544.1
NP_414545.1
NP_414546.1
NP_414547.1
NP_414548.1
NP_414549.1
NP_414550.1
NP_414551.1

Dans une dernière étape, il faut maintenant demander à notre ordinateur d'utiliser chaque identifiant pour télécharger la protéine correspondante au format FASTA, et ceci via l'outil efetch des E-utilities. On va réaliser cela au moyen de la commande xargs. Cette commande fonctionne de la façon suivante :

xargs -I{} commande_a_executer

Pour chaque ligne reçue à travers le pipe (|), xargs va faire exécuter la commande donnée en argument. Mais avant chaque exécution, xargs va vérifier si cette commande possède une ou plusieurs balises comme celle précisée avec l'option -I. Chacune de ces balises sera alors remplacée par le contenu de la ligne reçue à travers le pipe. Ainsi, cette commande :

commande_3 | xargs -I{} echo "A lannister always downloads the protein {}"

va produire ce résultat :

A lannister always downloads the protein NP_414542.1
A lannister always downloads the protein NP_414543.1
A lannister always downloads the protein NP_414544.1
A lannister always downloads the protein NP_414545.1
A lannister always downloads the protein NP_414546.1
A lannister always downloads the protein NP_414547.1
A lannister always downloads the protein NP_414548.1
A lannister always downloads the protein NP_414549.1
A lannister always downloads the protein NP_414550.1
A lannister always downloads the protein NP_414551.1

En conséquence, voici la commande finale qui permet de télécharger chaque protéine au format FASTA dans un fichier dont le nom est l'identifiant de la protéine suivi du suffixe .fasta :

commande_3 | xargs -I{} wget -qO {}.fasta "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id={}&rettype=fasta"

Comme j'aime le dire pendant mes cours, il n'y a plus qu'à prendre un petit café et à attendre que les 4140 protéines (dans la version NC_000913.3) se téléchargent toutes seules ;-)

Merci à Hautbit, Yoann et Chopopope pour la relecture et les remarques pertinentes sur cet article ;-)



Pour continuer la lecture :


Commentaires

3 réponses à “Automatiser la récupération de données biologiques”

  1. Mer­ci pour l'article 🙂

    Ce genre d'API est très pré­sente sur le web, dans beau­coup de domaines, incluant le [tou­risme](http://​api​-doc​.tou​rin​soft​.com), l'[autocomplétion de code source en local](https://​github​.com/​v​h​e​o​n​/​J​e​d​i​H​TTP), le [pr0n](http://​json​-porn​.com/), l'[interrogation de base de triple stores](http://​rdflib​.github​.io/​s​p​a​r​q​l​w​r​a​p​p​er/)…

    Avec python, il est pos­sible d'interroger faci­le­ment ce genre d'interface avec [requests](http://​docs​.python​-requests​.org/​e​n​/​l​a​t​e​s​t​/​i​n​d​e​x​.​h​tml), [tor­tilla](https://​github​.com/​r​e​d​o​d​o​/​t​o​r​t​i​lla), ou encore [l'encapsulation de wget](https://​bit​bu​cket​.org/​t​e​c​h​t​o​n​i​k​/​p​y​t​h​o​n​-​w​get).

    De même, la mise en place d'une API est faci­li­té à plu­sieurs niveau avec des modules tels que [eve](http://​python​-eve​.org/). Il existe de nom­breux [tutos](http://​www​.res​ta​pi​tu​to​rial​.com/) et [conseils](http://​sta​cko​ver​flow​.com/​a​/​9​2​0​1​8​1​/​3​0​7​7​939) sur le net pour la mise en place d'API REST.

  2. Mer­ci Lucas pour tes liens.
    Fal­lait oser le troi­sième 😉 Vou­lais-tu uti­li­ser un exemple frap­pant prou­vant que cela touche tous les domaines ? 😉
    En un peu plus sage (et plus geek), je rajou­te­rais :
    — An API Of Ice And Fire : https://​ana​pio​fi​ceand​fire​.com
    — SWAPI, The Star Wars API : https://​swa​pi​.co

  3. Avatar de Lansana
    Lansana

    cool …mer­ci

Laisser un commentaire