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

Qui dit bioinformatique, dit récupération et manipulation des données. Ces données peuvent être générées à partir d'algorithmes ou bien récupérées depuis des bases de données biologiques. Aujourd'hui, le nombre de ces bases de données est en constante augmentation. Chaque mécanisme biologique, famille moléculaire ou organisme est associé à un ou plusieurs de ces dépôts de données. Si un biologiste peut en général se "contenter" d'une exploitation visuelle des données au moyen d'un site web, le bioinformaticien sera plus sensible à deux aspects importants : les interfaces permettant de récupérer automatiquement ces données (lien de téléchargement, site FTP,...) et leur(s) format(s).

Cet article va s'intéresser à un moyen "quasi-universel" de récupération des données hébergées sur un site Web : les adresses Web. En fait, tout site Web est associé à une ou plusieurs adresses Web, qu'il vende des livres ou fournisse des données génomiques. Une adresse Web permet de récupérer des données depuis un site Web (c'est ce que l'on appelle une requête GET) ou, à l'inverse, de fournir des données à ce site (requête POST telle que celle permettant de soumettre un formulaire). Nous allons ici nous intéresser uniquement aux requêtes GET, et notamment celles de la forme :

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 :

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 :

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 :

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 :

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 :

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 :

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 :

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 :

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 :

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" (|) :

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) :

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 :

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 :

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 :

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 :

va produire ce résultat :

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 :

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 😉

  • À propos de
  • J'ai débuté mon parcours de chercheur par un doctorat en biologie moléculaire et cellulaire à l'Université de Strasbourg. Mon sujet portait sur l'étude structurale de l'ARN génomique du VIH au moyen d'approches "mouillées". Au cours de ce doctorat, je me suis passionné pour l'approche bioinformatique. A la suite d'un DESS de double-compétence en informatique, j'ai été recruté en tant que Maître de Conférences en 2002 dans cette même Université. Spécialisé dans l'étude des relations structure-fonction des ARN non-codants, j'ai développé l'outil Assemble2 (http://www.bioinformatics.org/assemble/index.html). Cet outil a permis la construction et l'étude de plusieurs architectures d'ARN dont les premiers ribosomes eucaryotiques (levure, germe de blé, Trypanosome,...). Mon activité se divise aujourd'hui entre le support bioinformatique pour des projets collaboratifs et la responsabilité d'une équipe. Au sein de cette équipe, nous développons des outils expérimentaux et bioinformatiques pour comprendre le processus d'infection de la levure pathogène Candida glabrata. Nos approches comprennent notamment l'ingénierie de génome par CRISPR-Cas9, le dual RNA-Seq hôte-pathogène, l'annotation de génomes et la reconstruction de réseaux biologiques.

3 commentaires sur “Automatiser la récupération de données biologiques

  1. Merci pour l\'article 🙂

    Ce genre d\'API est très présente sur le web, dans beaucoup de domaines, incluant le [tourisme](http://api-doc.tourinsoft.com), l\'[autocomplétion de code source en local](https://github.com/vheon/JediHTTP), le [pr0n](http://json-porn.com/), l\'[interrogation de base de triple stores](http://rdflib.github.io/sparqlwrapper/)…

    Avec python, il est possible d\'interroger facilement ce genre d\'interface avec [requests](http://docs.python-requests.org/en/latest/index.html), [tortilla](https://github.com/redodo/tortilla), ou encore [l\'encapsulation de wget](https://bitbucket.org/techtonik/python-wget).

    De même, la mise en place d\'une API est facilité à plusieurs niveau avec des modules tels que [eve](http://python-eve.org/). Il existe de nombreux [tutos](http://www.restapitutorial.com/) et [conseils](http://stackoverflow.com/a/920181/3077939) sur le net pour la mise en place d\'API REST.

  2. Merci Lucas pour tes liens.
    Fallait oser le troisième 😉 Voulais-tu utiliser un exemple frappant prouvant que cela touche tous les domaines? 😉
    En un peu plus sage (et plus geek), je rajouterais :
    - An API Of Ice And Fire : https://anapioficeandfire.com
    - SWAPI, The Star Wars API : https://swapi.co

  3. cool ...merci

Laisser un commentaire