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 :
http://base_URL/operation?argument1=valeur1&argument2=valeur2Ce 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/argument2Alors 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+MaidenOn 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=600x300Bien 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 :
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.pdbOn 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 :
- le site Web proprement dit, via ses liens de téléchargement,
- le site FTP,
- les Entrez Programming Utilities (ou E-utilities) (voir aussi cet article de Nolwenn).
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=gbwithpartsLa 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 :
- la dernière partie de notre adresse (
) n'est pas un excellent nom de fichier,
1 ?db=nucleotide&id=NC_000913&rettype=gbwithparts- 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
1 .+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_executerPour 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 ;-)
Laisser un commentaire