Dans le cadre de mon travail, j'ai récemment découvert un outil formidable pour la consultation et la récupération de données à partir de certaines banques : BioMart.
Après avoir passé la frustration de devoir utiliser l'interface du service fourni pour télécharger les différentes données dont j'avais besoin, je me suis renseignée davantage sur ce logiciel. De façon simpliste, on peut définir BioMart comme un programme que l'on peut trouver sur certaines banques sous la forme d'un service web. En cherchant davantage, surprise : cette application peut être utilisée aussi bien pour créer sa propre base de données (étant données les spécifications de l'interface) que pour interroger à distance d'autres banques au travers d'une API fournie.
Bien qu'il existe deux API, l'une faite en Java, l'autre faite en Perl, je me suis basée sur l'API BioMart-Perl, pour des raisons d'architecture de mon lieu de travail, mais également en raison de mon manque d'expérience actuel en Java. Je vous présenterai donc plus spécifiquement BioMart-Perl au travers de quelques exemples pour la suite de ce billet.
Présentation de BioMart : qui gère cet outil et qui l'utilise ?
BioMart est développé dans le but de permettre d'interroger, avec un seul outil, un grand nombre de bases de données internationales. La volonté première du fondateur, Arek Kasprzyk, est de pouvoir fournir à la communauté scientifique un outil qui n'exige pas d'avoir de grandes connaissances en informatique pour pouvoir l'utiliser, ce qui peut être intéressant pour de nombreux biologistes et laborantins à court d'ingénieurs en informatique/bio-informatique.
À l'origine, BioMart fut développé pour le genome browser (navigateur de génome) Ensembl, en tant que base de données sous le nom de EnsMart. Au fil du développement, BioMart est devenu une solution générique pour l'intégration de données au travers d'une application simple et rapide à mettre en place ainsi que d'algorithmes permettant aux laboratoires de créer et de consulter leurs bases de données avec cet outil.
Parmi les bases de données qui peuvent être interrogées à travers BioMart on peut citer, pour les plus connues :
Vous pouvez trouver une liste plus exhaustive sur la page de la communauté de Biomart.
Exemples d'utilisation de l'API BioMart-Perl
Installer BioMart-Perl et configurer un registre
Avant d'utiliser l'API BioMart-Perl, sachez qu'elle n'existe pas encore pour la version 0.8 de l'outil : vous ne pourrez ainsi l'obtenir que pour la version 0.7. L'installation se fait plutôt facilement en suivant la documentation fournie. Les seuls prérequis à avoir sont : CVS installé sur votre machine, le langage Perl, les droits d'installation sur la machine. N'oubliez pas non plus de créer le fichier de configuration comme indiqué dans la documentation.
Afin de pouvoir récupérer les informations sur les banques accessibles via BioMart, vous devez créer des fichiers de configuration pour les registres. La liste des différents registres accessibles peut être consultée ici.
Voici à quoi ressemble un fichier de configuration pour interroger la banque HGNC :
1 2 3 4 5 |
<MartRegistry> <MartURLLocation database="g4public" default="" displayName="HGNC (EBI UK)" host="www.genenames.org" includeDatasets="" name="g4public" path="/biomart/martservice" port="80" redirect="1" serverVirtualSchema="default" visible="1" /> </MartRegistry> |
Une fois votre fichier de configuration créé, vous êtes paré pour créer votre script.
Consulter la banque HGNC avec BioMart-Perl
Problèmatique : pour un gène donné, dont je connais le nom approuvé par HGNC — ou nom officiel, — je souhaite connaître ses noms synonymes, les noms qui lui ont été attribués par le passé, mais également des références pour ce lien vers les banques Ensembl (pour les données d'annotation) et Entrez Gene.
Dans un premier temps, rendez-vous sur le BioMart de HGNC. Pour ce faire, vous avez deux possibilités : soit vous passez par le site HGNC, soit vous passez directement par le portail central de BioMart en sélectionnant la base de données HGNC. Pour cet exemple, je passe par le BioMart fournit par HGNC (depuis le menu Downloads > Biomart et en cliquant sur Start Martview session), s'ensuit une procédure en trois étapes :
- Dans la rubrique DATASET, je choisis la DATABASE HGNC Database et le DATASET HGNC Data (par défaut).
- Dans la rubrique FILTERS, j'ouvre l'onglet "Filter by symbol" et je saisis, dans le champ "Approved Symbol", MAPK1. Par défaut le filtre "Record Grouping : primary" est toujours activé. Pour le désactiver, ouvrez l'onglet "Filter by Curated ID".
- Dans la rubrique ATTRIBUTES, je coche les attributs que je souhaite obtenir. Dans cet exemple, je coche les attributs "Approved Symbol", "Approved Name", "Previous Symbols", "Name Aliases", "Entrez Gene ID", "Ensembl ID (mapped data supplied by Ensembl)".
Une fois mes paramètres choisis, je clique sur le bouton Results afin de voir si le tableau obtenu me convient :
Approved Symbol | Approved Name | Name Aliases | Previous Symbols | Ensembl ID (mapped data supplied by Ensembl) | Entrez Gene ID |
---|---|---|---|---|---|
MAPK1 | mitogen-activated protein kinase 1 | PRKM2, PRKM1 | ENSG00000100030 | 5594 |
Une fois satisfaite des résultats obtenus, je clique sur le bouton Perl, qui me fournit le script Perl à utiliser avec l'API installée sur ma machine :
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 |
# An example script demonstrating the use of BioMart API. # This perl API representation is only available for configuration versions >= 0.5 use strict ; use BioMart::Initializer ; use BioMart::Query ; use BioMart::QueryRunner ; my $confFile = "PATH TO YOUR REGISTRY FILE UNDER biomart-perl/conf/. For Biomart Central Registry navigate to http://www.biomart.org/biomart/martservice?type=registry"; # # NB : change action to 'clean' if you wish to start a fresh configuration # and to 'cached' if you want to skip configuration step on subsequent runs from the same registry # my $action='cached'; my $initializer = BioMart::Initializer->new('registryFile'=>$confFile, 'action'=>$action); my $registry = $initializer->getRegistry ; my $query = BioMart::Query->new('registry'=>$registry,'virtualSchemaName'=>'default'); $query->setDataset("hgnc"); $query->addFilter("gd_record", ["primary"]); $query->addFilter("gd_app_sym", ["MAPK1"]); $query->addAttribute("gd_app_sym"); $query->addAttribute("gd_app_name"); $query->addAttribute("gd_name_aliases"); $query->addAttribute("gd_prev_sym"); $query->addAttribute("md_ensembl_id"); $query->addAttribute("gd_pub_eg_id"); $query>>formatter("TSV"); my $query_runner = BioMart::QueryRunner->new(); ############################## GET COUNT ############################ # $query->count(1); # $query_runner->execute($query); # print $query_runner->getCount(); ##################################################################### ############################## GET RESULTS ########################## # to obtain unique rows only # $query_runner->uniqueRowsOnly(1); $query_runner->execute($query); $query_runner->printHeader(); $query_runner->printResults(); $query_runner->printFooter(); ##################################################################### |
Avant d'exécuter le script, il faut modifier la variable $confFile en lui indiquant le chemin vers le fichier de configuration que vous avez précédemment créé. Lorsque j'exécute ce script en local, je récupère bien un tableau au format TSV sur mon terminal. Je pourrais aussi rediriger la sortie dans un fichier texte pour effectuer d'autres traitements par la suite. Il se peut que vous ayez des messages vous indiquant les différentes étapes d'interrogation et de récupération des données sur la banque HGNC, ces messages sont affichés sur la sortie d'erreur standard, pour ne plus les voir, il suffit donc de rediriger ces derniers dans un fichier d'erreur ou, dans mon cas, dans le trou noir (/dev/null) ; voir plus bas pour la commande.
Comme vous pouvez le constater, il peut être facile de modifier le code source afin de permettre à l'utilisateur d'exécuter ce script en envoyant directement le nom du gène d'intérêt en argument. Voici à quoi ressemble le programme une fois récrit :
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 |
#!/usr/bin/perl ‑w use strict ; use warnings ; use BioMart::Initializer ; use BioMart::Query ; use BioMart::QueryRunner ; my $confFile = "/home/user/hgnc_registry.xml"; # si l'utilisateur a saisi un argument, on le récupère, sinon on retourne une erreur et on quitte le script if ( scalar(@ARGV) == 1 ){ my $hgnc = $ARGV[0]; } else { warn "Vous devez spécifier le nom du gène approuvé par HGNC pour récupérer les données !"; exit 0 ; } my $action='cached'; my $initializer = BioMart::Initializer->new('registryFile'=>$confFile, 'action'=>$action); my $registry = $initializer->getRegistry ; my $query = BioMart::Query->new('registry'=>$registry,'virtualSchemaName'=>'default'); $query->setDataset("hgnc"); $query->addFilter("gd_record", ["primary"]); $query->addFilter("gd_app_sym", [$hgnc]); $query->addAttribute("gd_app_sym"); $query->addAttribute("gd_app_name"); $query->addAttribute("gd_name_aliases"); $query->addAttribute("gd_prev_sym"); $query->addAttribute("md_ensembl_id"); $query->addAttribute("gd_pub_eg_id"); $query>>formatter("TSV"); my $query_runner = BioMart::QueryRunner->new(); $query_runner->execute($query); $query_runner->printHeader(); $query_runner->printResults(); |
Comme vous pouvez le constater, le script ne demande pas forcément des connaissances très poussées en Perl pour réaliser un premier jet, ce qui peut être utile si on souhaite avoir des résultats rapidement. Voici la commande que vous pouvez utiliser depuis un terminal afin de récupérer vos données tout en redirigeant la sortie d'erreur dans la poubelle :
1 |
perl ./hgnc_geneinfos.pl MAPK1 > MAPK1.tsv 2> /dev/null |
Récupérer les coordonnées de plusieurs gènes avec Ensembl
Problèmatique : pour une liste de gènes donnée, dont je connais les nom approuvés par HGNC — ou nom officiel — et éventuellement les identifiants vers les données annotées par Ensembl, je souhaite connaître leur chromosome, leurs positions de début et de fin, le brin sur lequel ils se situent (un gène pouvant être dans le sens inverse), ainsi que leur nom associé et une référence vers leur fiche d'identité chez EntrezGene.
Ce second exemple, un peu plus complexe, va vous permettre de voir à quel point BioMart peut se montrer puissant et utile. Dans un premier temps, nous allons créer le script Perl de base en passant par le BioMart d'Ensembl, la procédure est la même que pour HGNC aussi je ne la redétaillerai pas. Voici le script que j'obtiens avec mes paramètres :
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 |
# An example script demonstrating the use of BioMart API. # This perl API representation is only available for configuration versions >= 0.5 use strict ; use BioMart::Initializer ; use BioMart::Query ; use BioMart::QueryRunner ; my $confFile = "PATH TO YOUR REGISTRY FILE UNDER biomart-perl/conf/. For Biomart Central Registry navigate to http://www.biomart.org/biomart/martservice?type=registry"; # # NB : change action to 'clean' if you wish to start a fresh configuration # and to 'cached' if you want to skip configuration step on subsequent runs from the same registry # my $action='cached'; my $initializer = BioMart::Initializer->new('registryFile'=>$confFile, 'action'=>$action); my $registry = $initializer->getRegistry ; my $query = BioMart::Query->new('registry'=>$registry,'virtualSchemaName'=>'default'); $query->setDataset("hsapiens_gene_ensembl"); $query->addFilter("hgnc_symbol", ["MAPK1","ZFY"]); $query->addAttribute("ensembl_gene_id"); $query->addAttribute("chromosome_name"); $query->addAttribute("start_position"); $query->addAttribute("end_position"); $query->addAttribute("strand"); $query->addAttribute("external_gene_id"); $query->addAttribute("entrezgene"); $query->formatter("TSV"); my $query_runner = BioMart::QueryRunner->new(); ############################## GET COUNT ############################ # $query->count(1); # $query_runner->execute($query); # print $query_runner->getCount(); ##################################################################### ############################## GET RESULTS ########################## # to obtain unique rows only # $query_runner->uniqueRowsOnly(1); $query_runner->execute($query); $query_runner->printHeader(); $query_runner->printResults(); $query_runner->printFooter(); ##################################################################### |
La première chose notable est la possibilité de passer plusieurs noms de gènes approuvés par HGNC chez Ensembl afin de pouvoir en récupérer plusieurs lignes. Je ne vous ai pas montré ce cas de figure pour la banque HGNC pour la simple et bonne raison que, ne sachant pas à l'avance si le gène à passer en paramètre sera un gène approuvé et non pas un alias ou un ancien nom, il me fallait pouvoir traiter les différentes possibilités une par une.
Le script fourni par Ensembl peut donc être adapté en fonction des arguments passés en paramètre. Dans notre exemple, l'argument passé en paramètre sera un fichier au format TSV où chaque ligne contient un gène qui indique son symbole approuvé par HGNC et son identifiant EnsemblID. En effet, il est possible que HGNC ne connaisse pas encore l'identifiant EnsemblID pour le gène mais qu'Ensembl en connaisse le symbole approuvé par HGNC, d'où l'intérêt du script que je vous présente :
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#!/usr/bin/perl ‑w use strict ; use warnings ; use BioMart::Initializer ; use BioMart::Query ; use BioMart::QueryRunner ; # ne pas oublier de créer un nouveau fichier de configuration pour accéder aux registres de chez Ensembl my $confFile = "/home/user/ensembl_registry.xml"; # si l'utilisateur a saisi un argument, on le récupère, sinon on retourne une erreur et on quitte le script if ( scalar(@ARGV) == 1 ){ my $file = $ARGV[0]; } else { warn "Vous devez spécifier le nom du gène approuvé par HGNC pour récupérer les données !"; exit 0 ; } open (my $READ, "<", $file) or die ("Le fichier $file ne peut pas être ouvert\n\$!"); my (@ensidlist, @hgnclist) = ([], []); my $line = 0 ; while(<$READ>){ chomp ; # on passe l'entête, elle ne nous intéresse pas if ( $line == 0 ){ $line++; next ; } my @cols = split(/\t/, $_); # la cinquième colonne renseigne sur les EnsemblID if ( $cols[4] ne "" ){ push @ensidlist, $cols[4]; } # la première colonne renseigne sur le symbole approuvé par HGNC else { push @hgnclist, $cols[0]; } } close $READ ; my $action='cached'; my $initializer = BioMart::Initializer->new('registryFile'=>$confFile, 'action'=>$action); my $registry = $initializer->getRegistry ; # récupération avec les EnsemblID my $query = BioMart::Query->new('registry'=>$registry,'virtualSchemaName'=>'default'); $query->setDataset("hsapiens_gene_ensembl"); $query->addFilter("ensembl_gene_id", [@ensidlist]); $query->addAttribute("ensembl_gene_id"); $query->addAttribute("chromosome_name"); $query->addAttribute("start_position"); $query->addAttribute("end_position"); $query->addAttribute("strand"); $query->addAttribute("external_gene_id"); $query->addAttribute("entrezgene"); $query->formatter("TSV"); my $query_runner = BioMart::QueryRunner->new(); $query_runner->execute($query); $query_runner->printHeader(); $query_runner->printResults(); # récupération avec les symboles approuvés par HGNC my $query = BioMart::Query->new('registry'=>$registry,'virtualSchemaName'=>'default'); $query->setDataset("hsapiens_gene_ensembl"); $query->addFilter("hgnc_symbol", [@hgnclist]); $query->addAttribute("ensembl_gene_id"); $query->addAttribute("chromosome_name"); $query->addAttribute("start_position"); $query->addAttribute("end_position"); $query->addAttribute("strand"); $query->addAttribute("external_gene_id"); $query->addAttribute("entrezgene"); $query->formatter("TSV"); my $query_runner = BioMart::QueryRunner->new(); # on a déjà récupéré l'entête avec la liste des EnsemblID, on veut juste les lignes $query_runner->execute($query); $query_runner->printResults(); |
Bien sûr, ce ne sont que de simples exemples, je n'ai pas la prétention d'être une experte de BioMart, loin de là, mais cette première approche de l'outil m'a beaucoup plu et j'espère avoir prochainement l'occasion de pouvoir me replonger dedans. Dans ce billet nous n'avons vu l'utilisation de BioMart-Perl que pour deux banques, mais nous avons déjà un bon aperçu des possibilités qui s'offrent à nous pour faire communiquer entre elles d'autres banques en ne passant que par un outil, réduisant ainsi de nombreuses heures de travail à chercher à comprendre les API de plusieurs banques pour un même résultat.
Je ne dis pas que BioMart est parfait pour tout : dans le cas de la banque HGNC par exemple, je n'ai pas encore trouvé comment utiliser un système de wildcards (joker) pour les gènes de type HLA qui comprennent de nombreux complexes. Après avoir cherché un long moment — dans la documentation et sur le moteur de recherche Google –, il s'avérerait que cette option ne soit pas encore gérée par le logiciel, mais pour une première approche afin de trouver rapidement des données, cet outil me parait amplement suffisant.
Pour aller plus loin :
BioMart Central Portal — unified access to biological data, Syed Haider et al., Nucleic Acids Research, 2009, Vol. 37, Web Server issue, W23-W27
BioMart — biological queries made easy, Damian Smedley et al., BMC Genomics 2009, 10:22
Ensembl BioMarts : a hub for data retrieval across taxonomic space, Rhoda J. Kinsella et al., Database, Vol. 2011, Article ID bar030
Site officiel de BioMart
Laisser un commentaire