But : Découvrir comment on peut accéder très simplement aux informations d'Ensembl à l'aide d'un script Perl.
Niveau : débutant.
Pré-requis : Avoir des notions de Perl allant jusqu'à l'utilisation de librairies. Avoir accès à une machine où les librairies Perl d'Ensembl sont installées.
Parmi les sites agrégeant de l'information biologique, Ensembl fournit une API (Application Programming Interface) Perl qui permet de développer des programmes (en Perl donc) pour accéder à cette information.
L'API Ensembl est très complète et on ne s'intéressera ici qu'aux classes et méthodes de plus haut niveau. Il est possible d'utiliser des fonctions plus proches des bases de données, mais c'est en général une erreur. Sans entrer dans les considérations habituelles justifiant la création d'une API, on notera quand même que l'accès aux données est très facile car il y a beaucoup de points d'entrée et que l'orientation objet simplifie grandement les écritures.
Pour illustrer cette note, nous allons nous intéresser à un transcrit (ENST00000368759) du gène BCCIP qui code pour une protéine interagissant avec BRCA2 et CDKN1A. Notre but sera de retrouver la position de tous les exons du transcrit à partir de son nom dans Ensembl, le stable_id.
La documentation est très pratique et donne déjà quelques indices sur l'organisation. Vous arrivez alors à la racine de la documentation (générée automatiquement par Doxygen). Il y a quatre sections de base (marquées API) : core, variation, compara et functgenomics. Core contient tous les objets de base, à savoir les chromosomes, gènes, transcrits, exons, "slice" (littéralement, une tranche de génome), etc. Les autres sections sont plus explicites. Cliquez sur le lien "Ensembl core database API", puis sur "Class Index". Observez tout ce qui est disponible à partir de "core".
Venons-en maintenant au cœur du problème. Comme dit précédemment, toute l'information contenue dans Ensembl est accessible par des objets. Mais avant d'accéder aux objets, il y a 3 étapes à franchir.
1- Il faut créer un objet de type "Bio::EnsEMBL::Registry".
Ex :
1 |
my $reg = "Bio::EnsEMBL::Registry"; #wow |
2- Récupérer le registre depuis la base de données.
Ex :
1 2 3 |
$reg->load_registry_from_db( -host => 'ensembldb.ensembl.org', -user => 'anonymous'); |
3- Récupérer un adaptateur correspondant à l'objet qui nous intéresse, ici, un transcrit.
Ex :
1 |
my $ta = $reg->get_adaptor( "human", "core", "transcript" ); |
Il convient de souligner plusieurs points.
À l'étape 2, une connexion est établie avec la base de donnée. D'ailleurs, l'option -verbose => 1 permettrait de voir toutes les espèces disponibles. Ce n'est évidemment pas la seule manière de charger le registre. À titre d'exercice, je suggère de chercher la hiérarchie des classes de "core" (il faut cliquer jusqu'à voir un graphe, bonne chance), puis cliquer sur "registry" pour voir les différentes méthodes.
À l'étape 3, nous voyons ici la méthode la plus importante et la notion qui en découle : l'adaptateur. Pour chaque objet, il existe un adaptateur. L'adaptateur est lui-même un objet, que l'on pourrait qualifier d'intermédiaire, et qui contient, entre autres, toutes les méthodes capables de retourner un objet du type de l'adaptateur.
À titre d'exercice : une fois dans la documentation de core, utiliser la "class index" pour trouver l'objet transcript_adaptor (facile). Quelle est la différence entre fetch_all_* et fetch_* ?
À ce stade, nous sommes prêts à creuser. En Perl, c'est bien connu : "there is more than one way to do it". Nous allons commencer par le plus gros objet et descendre vers le plus petit, c'est-à-dire partir du transcrit et descendre vers les exons. En consultant la documentation de l'objet TranscriptAdaptor, on trouve une méthode nommée fetch_by_stable_id qui prend en argument une variable String et va nous retourner un objet Bio::EnsEMBL::Transcript :
1 |
my $tr = $ta->fetch_by_stable_id('ENST00000368759'); |
Ensuite l'objet Bio::EnsEMBL::Transcript contient une méthode get_all_Exons qui va nous retourner une référence sur une liste d'objets de type Bio::EnsEMBL::Exon :
1 |
my @exons = @{ $tr->get_all_Exons() }; |
On peut faire afficher par exemple le nom (stable_id), le start et le end :
1 2 3 |
foreach my $ex (@exons){ print $ex->stable_id."\t".$ex->start."\t".$ex->end."\n"; } |
Au final, le script complet (remplacer $PATH_perl par le chemin qui va bien) :
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 |
#!/usr/bin/perl use lib "$PATH_perl/ensembl64/ensembl/modules"; use lib "$PATH_perl/bioperl-live"; use lib "$PATH_perl/ensembl64/ensembl-variation/modules"; use Bio::EnsEMBL::Registry ; use Data::Printer ; my $reg = "Bio::EnsEMBL::Registry"; load_registry_from_db( -host => 'ensembldb.ensembl.org', -user => 'anonymous', # ‑verbose => 1 ); my $ta = $reg->get_adaptor( "human", "core", "transcript" ); #p($ta); my $tr = $ta->fetch_by_stable_id('ENST00000368759'); #p($tr); my @exons = @{ $tr->get_all_Exons() }; foreach my $ex (@exons){ # p($ex); print $ex->stable_id."\t".$ex->seq_region_name."\t".ex->start."\t".$ex->end."\n"; } |
On pourrait s'arrêter là mais nous allons voir comment adopter une démarche (presque) inverse. Nous allons partir d'un ExonAdaptor et récupérer les exons correspondant au transcript. Pour cela, on voit qu'il existe une méthode fetch_all_by_Transcript qui prend en argument un objet de type Bio::EnsEMBL::Transcript et retourne à nouveau une référence sur une liste de Bio::EnsEMBL::Exon.
On vient de voir comment chercher l'objet correspondant au transcrit, il ne nous reste donc plus qu'à écrire :
1 2 3 4 5 6 7 8 9 10 |
print "\n"; my $ea = $reg->get_adaptor("human", "core", "exon"); my $ta2 = $reg->get_adaptor( "human", "core", "transcript" ); my $tr2 = $ta2->fetch_by_stable_id('ENST00000368759'); my @exons2 = @{ $ea->fetch_all_by_Transcript($tr2)}; foreach my $ex (@exons2){ # p($ex); print $ex->stable_id."\t".$ex->seq_region_name."\t".$ex->start."\t".$ex->end."\n"; } |
Résultat :
Voilà qui conclue cette note sur comment débuter avec l'API Perl d'Ensembl. J'espère qu'avec ce tout petit exemple, vous aurez envie d'aller plus avant et de découvrir les monts et merveilles cachés dans la documentation.
Pour aller plus loin
À noter, des sessions de formations sont régulièrement proposées et conduites par des membres de l'équipe de développement. Pour un planning on pourra consulter ce calendrier et également le blog d'Ensembl. J'ai pu assister à une formation (gratuite) de 3 jours à Cambridge (UK) qui donnait les points clefs de Core, Variation, Compara et FunctGenomics (par ordre d'importance dans la formation). Pour des groupes plus larges, il peut être intéressant d'organiser une formation ad hoc à domicile (payant).
Sans attendre une formation ou une prochaine (et incertaine) note, pour ceux qui veulent aller plus loin, vous pouvez consulter les pages ci-dessous faites par les sus-mentionnés membres de l'équipe de formation et de développement :
Vers une formation Core
Vers les formations Compara
Une présentation de Variation
Vers les formation FunctGenomics
Merci de votre attention, ainsi qu'à mes gentils correcteurs Malicia, Norore, Max et Yoann M.
Laisser un commentaire