Récupérer la fiche d'un gène avec les Eutils du NCBI

En bio­in­for­ma­tique il n'est pas rare que l'on ait besoin d’accéder à des infor­ma­tions dis­po­nibles sur des bases de don­nées inter­na­tio­nales, nous ver­rons ici le cas de la banque Gene du NCBI. Avant de s'intéresser à la récu­pé­ra­tion d'une fiche d'un gène en pas­sant par les Eutils, un peu de théo­rie et d'explications sur une fiche type s'impose.

Pourquoi choisir d'utiliser les Eutils ?

Bien qu'il soit pos­sible de jouer avec la construc­tion d'une URL afin de récu­pé­rer la fiche d'un gène au for­mat texte ou XML direc­te­ment sur le ser­veur offi­ciel, le NCBI pré­co­nise plu­tôt l'utilisation du ser­veur Eutils, qui est un outil dédié à l'exécution mas­sive externe de ce genre de requête. Cet outil paraît d'autant plus inté­res­sant qu'il vous per­met d'effectuer de nom­breuses requêtes sans avoir à trop vous inquié­ter de savoir si l'IP de votre labo­ra­toire risque d'être blo­quée ou non. La seule limi­ta­tion étant de ne pas effec­tuer plus de trois requêtes par seconde en pas­sant par les Eutils, il est néces­saire de pré­voir une tem­po­ri­sa­tion des requêtes si besoin.

Récupérer une fiche par les Eutils : les étapes

Pour récu­pé­rer la fiche du gène que vous sou­hai­tez consul­ter, vous devez pas­ser par deux étapes dis­tinctes. Dans notre exemple, la pre­mière étape consiste à effec­tuer une recherche sur la banque Gene afin de trou­ver le gène dont l'identifiant est le numé­ro 5371. Pour cela nous devons construire l'URL sui­vante :

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 :

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 :

#!/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 :

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/



Pour continuer la lecture :


Commentaires

6 réponses à “Récupérer la fiche d'un gène avec les Eutils du NCBI”

  1. Comme vous vous limi­tez à l'uid toute la par­tie esearch est inutile. Vous pou­vez direc­te­ment taper dans efetch

    $ curl -s  "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=gene&rettype=xml&id=5371" | head -n 20           
    
    1. Avatar de Norore

      Mer­ci pour la remarque, je l'ignorais à ce moment là mais je pense que cela me sera utile un jour ou l'autre.
      Néan­moins, le script étant géné­rique, il peut par­fai­te­ment adap­té à 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.

  2. Avatar de HEBRARD Maxime
    HEBRARD Maxime

    mer­ci pour ce script très ins­truc­tif.
    ‑Serait il pos­sible de récu­pé­rer de manière simi­laires les séquences nucléo­ti­dique d'un gène ?
    ‑Y'a t'il une pos­si­bi­li­té simi­laire d'interrogation de la base Ensem­bl ?

    mer­ci

    1. Avatar de Norore

      Bon­jour, oui c'est pos­sible.

      Pour récu­pé­rer les séquences nucléo­ti­diques d'un gène de façon simi­laire, il vous fau­dra pas­ser par la banque Nucleo­tide du NCBI, donc a prio­ri il vous suf­fit de rem­pla­cer gene par nuc­core, tou­te­fois le com­por­te­ment de la banque est très dif­fé­rent, aus­si il vous fau­dra ajus­ter la requête envoyée par term afin de trou­ver la liste des séquences nucléo­ti­diques connues pour votre gène d'intérêt.
      Il existe éga­le­ment un autre moyen, pour cela vous pou­vez pas­ser par la récu­pé­ra­tion de la fiche XML de votre gène d'intérêt et cher­cher le tag XML défi­nis­sant la banque de don­née Nucleo­tide, vous devriez ain­si trou­ver l'identifiant unique pour la séquence nucléo­ti­dique que vous cher­chez, ce qui vous per­met­tra d'envoyer la requête direc­te­ment à cette banque. Après il ne vous res­te­ra plus qu'à choi­sir de récu­pé­rer la fiche au for­mat XML ou au for­mat Fas­ta.
      Voi­ci un exemple du tag auquel je fais allu­sion :

      
      	
      		Nucleotide
      		
      			
      				67089152
      			
      		
      	
      
      

      Je vous conseille, par expé­rience, de pas­ser par un par­ser XML (Perl en pos­sède quelques uns, dis­po­nibles sur le CPAN) afin de vous faci­li­ter la tâche, les fichiers XML four­nis par le NCBI ne sont pas tou­jours faciles à appré­hen­der pour cer­taines infor­ma­tions.

      Pour la pos­si­bi­li­té simi­laire d'interrogation de la base Ensem­bl, oui, il en existe au moins 2, dont une que je connais bien, il s'agit de l'API Bio­Mart-Perl, que vous pou­vez trou­ver chez Bio­Mart, four­ni par le San­ger Ins­ti­tute. L'API Perl n'est dis­po­nible que pour la ver­sion 0.7, mais si vous pré­fé­rez une API en Java la ver­sion 0.8, plus récente, est dis­po­nible pour ce lan­gage. La seconde API en Perl, dont un article pour le blog est pré­vu, uti­lise Bio­Perl et est four­nie, et docu­men­tée, par Ensem­bl.

      J'espère avoir répon­du à vos attentes.

    2. Pour inter­ro­ger Ensem­bl, un sys­tème équi­valent existe. Vous trou­ve­rez la docu­men­ta­tion ici.

    3. Avatar de HEBRARD Maxime
      HEBRARD Maxime

      Mer­ci a vous,
      Je regarde tout ça avec inté­rêt.

Laisser un commentaire