En bioinformatique il n'est pas rare que l'on ait besoin d’accéder à des informations disponibles sur des bases de données internationales, nous verrons ici le cas de la banque Gene du NCBI. Avant de s'intéresser à la récupération d'une fiche d'un gène en passant par les Eutils, un peu de théorie et d'explications sur une fiche type s'impose.
Pourquoi choisir d'utiliser les Eutils ?
Bien qu'il soit possible de jouer avec la construction d'une URL afin de récupérer la fiche d'un gène au format texte ou XML directement sur le serveur officiel, le NCBI préconise plutôt l'utilisation du serveur Eutils, qui est un outil dédié à l'exécution massive externe de ce genre de requête. Cet outil paraît d'autant plus intéressant qu'il vous permet d'effectuer de nombreuses requêtes sans avoir à trop vous inquiéter de savoir si l'IP de votre laboratoire risque d'être bloquée ou non. La seule limitation étant de ne pas effectuer plus de trois requêtes par seconde en passant par les Eutils, il est nécessaire de prévoir une temporisation des requêtes si besoin.
Récupérer une fiche par les Eutils : les étapes
Pour récupérer la fiche du gène que vous souhaitez consulter, vous devez passer par deux étapes distinctes. Dans notre exemple, la première étape consiste à effectuer une recherche sur la banque Gene afin de trouver le gène dont l'identifiant est le numéro 5371. Pour cela nous devons construire l'URL suivante :
1 |
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=gene&term=5371[uid]&usehistory=y |
Voici ce que les Eutils vont comprendre :
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi
indique que le moteur de recherche des Eutils est sollicité pour récupérer des informations dans la banque de données ;db=gene
précise que la base de données "db" à consulter est Gene "gene" ;term=5371[uid]
précise que le terme "term" recherché est un numéro d'identifiant unique "[uid]" auquel on a spécifié le numéro en question ;usehistory=y
est à utiliser pour spécifier que vous souhaitez utiliser l'historique mais pas seulement (voir plus loin).
Pour la prochaine étape vous aurez besoin de récupérer, dans le fichier XML qui vient de s'afficher, les informations suivantes :
- le WebEnv, qui n'apparait pas si vous avez choisi de ne pas utiliser l'historique ;
- le numéro QueryKey, qui lui est exigé pour la seconde étape
La seconde étape va vous permettre de récupérer la fiche de votre gène d'intérêt avec cette nouvelle requête :
1 |
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=gene&WebEnv=NCID_1_239264264_130.14.22.101_9001_1330635030_79372563&query_key=1&rettype=xml&retmode=text |
Et voici l'explication sur ce que le moteur des Eutils effectuera :
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi
indique que les Eutils doivent afficher des informations à l'utilisateur ;db=gene
précise que la base de données "db" à consulter est Gene "gene" ;WebEnv=NCID_1_239264264_130.14.22.101_9001_1330635030_79372563
indique l'identifiant de WebEnv qui correspond à la requête de recherche précédemment effectuée ;query_key=1
indique le numéro QueryKey "query_key" pour la requête ;rettype=xml
informe que l'affichage devra être de type XML ;retmode=text
précise que l'affichage doit être retourné en mode texte.
Une fois votre requête envoyée au serveur, vous aurez sous vos yeux la fiche au format XML du gène PML dont l'identifiant est 5371.
Explications sur la fiche du gène récupéré
Tout d'abord, merci de tenir compte du fait qu'il est parfaitement possible de trouver la fiche d'un gène en utilisant son seul nom, cependant il peut y avoir une forte redondance et un retour de plusieurs entrées pour un même nom. Dans mon exemple je me focalise sur un identifiant unique afin de n'avoir qu'une seule fiche à récupérer.
La fiche d'un gène du NCBI renferme de nombreuses informations sur le gène, en voici une liste non-exhaustive :
- de nombreuses références croisées avec d'autres banques telles que Ensembl, HPRD, Vega, OMIM, PubMed
- des informations sur la position du gène sur son chromosome
- les protéines qui interagissent avec le gène ainsi que les produits du gène
- la section Gene Ontology permet d'obtenir des renseignements sur la fonction, le processus et le composant cellulaire pour le gène
- un accès direct aux différents profils d'expression du gène en fonction du tissu et/ou de la maladie...
Récupérer la même fiche à l'aide d'un script Perl
Parce qu'il est toujours plus simple d'automatiser ce genre de processus, ce script Perl peut vous être très utile :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#!/usr/bin/perl -w use strict; use warnings; # LWP est une bibliothèque permettant de lire les données en HTTP use LWP::Simple; use LWP::UserAgent; # vérifie si l'utilisateur a précisé le GeneID if ( !$ARGV[0] ){ print "Argument GeneID not found!\n$!" and die; } my $geneid = $ARGV[0]; # vérifie si le répertoire tmp/ existe déjà if ( ! -d "tmp/" ){ exec(mkdir "tmp/"); } # nom du fichier XML qui sera créé avec le GeneID comme nom my $xml_handle = "tmp/".$geneid.".xml"; my $gene = $geneid."[uid]"; # on veut l'identifiant unique du gène my $db = "gene"; # on cherche dans la banque de données Gene # construction de la requête de recherche my $base = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/'; my $url = $base . "esearch.fcgi?db=".$db."&term=".$gene."&usehistory=y"; # récupération du résultat comme si vous l'aviez ouvert dans votre navigateur my $output = get($url); my $web = $1 if ($output =~ /<WebEnv>(\S+)<\/WebEnv>/); # récupération du WebEnv my $key = $1 if ($output =~ /<QueryKey>(\d+)<\/QueryKey>/); # récupération de la query key my $count = $1 if ($output =~ /<Count>(\d+)<\/Count>/); # récupération du nombre de résultats pour la recherche if ( !$web or !$key or !$count ){ print "Can't read informations from url: ".$url."\n"; exit; } open (XML, ">", $xml_handle) or ( warn "Can't create file $xml_handle\n$!\n" and die ); # on précise le nombre de résultat à retourner par tour de boucle : # 1 pour un résultat, 50 pour 50 résultats, etc my $retmax = 1; for (my $retstart = 0; $retstart < $count; $retstart += $retmax) { my $efetch_url = $base ."efetch.fcgi?db=".$db."&WebEnv=".$web; $efetch_url .= "&query_key=".$key."&retstart=".$retstart; $efetch_url .= "&retmax=".$retmax."&rettype=xml&retmode=text"; my $efetch_out = get($efetch_url); if ( !$efetch_out ){ print "Can't get file xml from: ".$efetch_url."\n"; exit; } print XML $efetch_out; } close XML; |
Pour appeler ce script depuis un terminal, il vous suffit d'utiliser la ligne de commande suivante :
1 |
perl eutils_gene.pl 5371 |
Ce script étant très largement inspiré du guide officiel, et adapté en fonction de mes besoins, celui-ci est donc libre d'accès. Vous êtes donc parfaitement libre de le récupérer, le disséquer et le modifier à votre convenance.
Sources
Pour une prise en main rapide des Eutils : http://www.ncbi.nlm.nih.gov/books/NBK25500/
Pour aller plus loin avec les Eutils : http://www.ncbi.nlm.nih.gov/books/NBK25501/
Lindenbaum Pierre
mars 8, 2012 à 9:53
Comme vous vous limitez à l'uid toute la partie esearch est inutile. Vous pouvez directement taper dans efetch
Norore
mars 8, 2012 à 10:02
Merci pour la remarque, je l'ignorais à ce moment là mais je pense que cela me sera utile un jour ou l'autre.
Néanmoins, le script étant générique, il peut parfaitement adapté à d'autres cas de figures, tel que la recherche d'un gène par son nom, où là il peut y avoir plus d'une fiche.
HEBRARD Maxime
mars 16, 2012 à 11:21
merci pour ce script très instructif.
-Serait il possible de récupérer de manière similaires les séquences nucléotidique d'un gène ?
-Y'a t'il une possibilité similaire d'interrogation de la base Ensembl ?
merci
Norore
mars 16, 2012 à 11:50
Bonjour, oui c'est possible.
Pour récupérer les séquences nucléotidiques d'un gène de façon similaire, il vous faudra passer par la banque Nucleotide du NCBI, donc a priori il vous suffit de remplacer gene par nuccore, toutefois le comportement de la banque est très différent, aussi il vous faudra ajuster la requête envoyée par term afin de trouver la liste des séquences nucléotidiques connues pour votre gène d'intérêt.
Il existe également un autre moyen, pour cela vous pouvez passer par la récupération de la fiche XML de votre gène d'intérêt et chercher le tag XML définissant la banque de donnée Nucleotide, vous devriez ainsi trouver l'identifiant unique pour la séquence nucléotidique que vous cherchez, ce qui vous permettra d'envoyer la requête directement à cette banque. Après il ne vous restera plus qu'à choisir de récupérer la fiche au format XML ou au format Fasta.
Voici un exemple du tag auquel je fais allusion :
Je vous conseille, par expérience, de passer par un parser XML (Perl en possède quelques uns, disponibles sur le CPAN) afin de vous faciliter la tâche, les fichiers XML fournis par le NCBI ne sont pas toujours faciles à appréhender pour certaines informations.
Pour la possibilité similaire d'interrogation de la base Ensembl, oui, il en existe au moins 2, dont une que je connais bien, il s'agit de l'API BioMart-Perl, que vous pouvez trouver chez BioMart, fourni par le Sanger Institute. L'API Perl n'est disponible que pour la version 0.7, mais si vous préférez une API en Java la version 0.8, plus récente, est disponible pour ce langage. La seconde API en Perl, dont un article pour le blog est prévu, utilise BioPerl et est fournie, et documentée, par Ensembl.
J'espère avoir répondu à vos attentes.
nahoy
mars 16, 2012 à 11:57
Pour interroger Ensembl, un système équivalent existe. Vous trouverez la documentation ici.
HEBRARD Maxime
mars 19, 2012 à 9:21
Merci a vous,
Je regarde tout ça avec intérêt.