Il n'est pas rare que nous ayons un jour besoin de récupérer des informations de la base de données KEGG (Kyoto Encyclopedia of Genes and Genomes). Cette base de données fournit un nombre conséquent d'informations sur les génomes et les réseaux de gènes mais également sur les voies métaboliques ou les maladies. Dans ces cas là, bien souvent, nous passons directement par le site internet à l'adresse http://www.kegg.jp/, puis nous effectuons une recherche via le moteur prévu à cet effet, et enfin nous pouvons télécharger les informations souhaitées. Mais cette façon de procéder n'est pas des plus pratiques si l'on souhaite mettre un système de pipeline dans nos laboratoires, aussi KEGG met à notre disposition une API reposant sur REST. Ça veut dire qu'il sera possible, à partir de la construction d'URL spécifiques, prévues à cet effet, d'interroger et de récupérer des informations sur différentes données d'intérêts, sans passer par les formulaires existants sur le site de KEGG. Chaque type de requête est définie comme étant une opération. Voyons comment on peut s'en sortir pour nos projets !
Attention : l'accès au site internet et à ses données est entièrement gratuit mais l'accès au serveur FTP est payant, pour permettre de financer les serveurs.
Principe de fonctionnement
Dans l'API REST de KEGG, il existe 7 opérations interfacées sur les 15 tables (plus une en développement au moment où j'écris ces lignes) et donc requérables depuis l'extérieur grâce à une suite d'arguments.
Pour chaque opération il va être possible de récupérer différents types d'informations sur les banques de données :
- info : affiche les informations sur la version de la base de données et également les bases de données auxquelles celle-ci est en interaction le cas échéant. Exemple : http://rest.kegg.jp/info/pathway
- list : fournit la liste des identifiants de la base de données ainsi que la définition associée. Exemple : http://rest.kegg.jp/list/genome
- find : trouve les entrées qui correspondent au mot clé recherché ou à d'autres types de données. Exemple : http://rest.kegg.jp/find/disease/melanoma
- get : récupère les informations dans la base de données à partir de l'identifiant fournit. Exemple : http://rest.kegg.jp/get/ds:H00038
- conv : convertit les identifiants KEGG en leurs identifiants provenant d'autres banques de données, comme NCBI Gene. Exemple : http://rest.kegg.jp/conv/hsa/ncbi-geneid (vous pouvez aussi les inverser !)
- link : récupère les entrées liées entre elles en utilisant les références croisées des banques de données. Exemple : http://rest.kegg.jp/link/hsa/ds:H00038
- ddi : récupèrer la liste des contre-indications et précautions à prendre dans le cadre d'interaction médicamenteuse. Exemple : http://rest.kegg.jp/ddi/D00124
Pour en savoir plus et aller plus loin, n'hésitez pas à aller faire un tour sur la documentation officielle. Vous y trouverez également plusieurs exemples d'utilisation.
Navigateur ou programme : au choix
Comme vous venez de le voir dans les exemples ci-dessus, il est possible de récupérer beaucoup d'informations en utilisant uniquement son navigateur internet préféré, c'est souvent un bon moyen pour trouver rapidement les données utiles. Cependant, comme vous pouvez le constater vous-même, il va très rapidement exister une limite à ne passer que par le navigateur.
Si vous souhaitez affiner au fur et à mesure votre recherche ou même l'approfondir en allant plus loin dans les données à récupérer, vous risquez de passer des heures à faire de nombreux copier-coller et retours arrière, sans compter le fait que vous voudrez certainement pouvoir récupérer les résultats sur votre ordinateur. Pour le coup, vous aurez donc le choix :
- soit de garder votre navigateur ouvert avec un éditeur de texte dans lequel vous recopierez les informations qui vous intéressent
- soit de faire un script pour effectuer une recherche plus efficace une fois que vous aurez schématisé votre stratégie d'acquisition de données !
Comme nous sommes sur un blog de bioinformaticiens, vous vous doutez bien que je ne peux pas m'empêcher de vous montrer un ou deux exemples de scripts ! Prêts ? C'est parti !
Récupérer la liste des gènes impliqués dans le mélanome chez l'Homme
Pour cet exemple, j'utiliserai Python (version 3++) avec la bibliothèque requests (dans les bibliothèques de base, appuyée par la documentation officielle), prévue pour les requêtes REST, afin de récupérer les données et les manipuler à ma guise. Notez que si vous ne précisez pas quel est le format de sortie que vous souhaitez récupérer, celui-ci sera par défaut en texte plat !
Étape 1 : récupérer l'identifiant du mélanome dans la base de données Disease
Pour récupérer l'identifiant du mélanome, dans la base de données Disease, j'utilise l'opération find (souvenez-vous, l'API REST de KEGG repose sur 7 opérations) :
1 2 3 4 5 |
import requests # appel de l'opération find sur la table disease avec le mot clé melanoma r = requests.get('http ://rest.kegg.jp/find/disease/melanoma') r.text 'ds :H00038\tMalignant melanoma\n' |
Le résultat de sortie final est au format texte tabulé. Nous allons donc pouvoir récupérer facilement la liste des clés (ici une seule clé), en utilisant seulement les built in de Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
''' récupérer les lignes sous forme de liste normalement pour une seule ligne ce n'est pas nécessaire mais j'aime bien être généraliste ''' lines = r.text.splitlines() disease_id = [] for id in lines : # découper en liste sur la tabulation # ne récupérer que le premier élément disease_id.append(id.split('\t')[0]) print(disease_id) ['ds:H00038'] |
Étape 2 : récupérer les identifiants des gènes humains impliqués dans le mélanome
À partir de la liste des identifiants récupérés précédemment, nous allons pouvoir récupérer la liste des identifiants des gènes humains impliqués dans le mélanome, grâce à l'opération link.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
''' ici nous n'avons qu'un seul identifiant, mais il est possible d'en utiliser plusieurs d'un coup en séparant chaque identifiant avec le signe + ''' diseases = '+'.join(disease_id) r = requests.get('http://rest.kegg.jp/link/hsa/' + diseases) genes = r.text.splitlines() genes_id = [] for g in genes : # ne récupérer que le second élément genes_id.append(g.split('\t')[1]) print(genes_id) ['hsa:673', 'hsa:4893', 'hsa:1019', 'hsa:4286', 'hsa:5728', 'hsa:1029', 'hsa:7157', 'hsa:3939', 'hsa:3945', 'hsa:3948'] |
Étape 3 : récupérer les informations sur les gènes humains récupérés
Maintenant que nous avons récupéré les identifiants des gènes, nous allons pouvoir retrouver la liste de nos gènes à proprement parler ! Pour cela nous utiliserons cette fois-ci la méthode list.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
hsa_genes = '+'.join(genes_id) r = requests.get('http://rest.kegg.jp/list/' + hsa_genes) print(r.text) hsa :673 BRAF, B-RAF1, B-raf, BRAF1, NS7, RAFB1 ; B-Raf proto-oncogene, serine/threonine kinase hsa :4893 NRAS, ALPS4, CMNS, N-ras, NCMS, NRAS1, NS6 ; NRAS proto-oncogene, GTPase hsa :1019 CDK4, CMM3, PSK-J3 ; cyclin dependent kinase 4 hsa :4286 MITF, CMM8, COMMAD, MI, WS2, WS2A, bHLHe32 ; melanogenesis associated transcription factor hsa :5728 PTEN, 10q23del, BZS, CWS1, DEC, GLM2, MHAM, MMAC1, PTEN1, PTENbeta, TEP1 ; phosphatase and tensin homolog hsa :1029 CDKN2A, ARF, CDK4I, CDKN2, CMM2, INK4, INK4A, MLM, MTS-1, MTS1, P14, P14ARF, P16, P16-INK4A, P16INK4, P16INK4A, P19, P19ARF, TP16 ; cyclin dependent kinase inhibitor 2A hsa :7157 TP53, BCC7, LFS1, P53, TRP53 ; tumor protein p53 hsa :3939 LDHA, GSD11, HEL-S-133P, LDHM, PIG19 ; lactate dehydrogenase A hsa :3945 LDHB, HEL-S-281, LDH-B, LDH-H, LDHBD, TRG-5 ; lactate dehydrogenase B hsa :3948 LDHC, CT32, LDH3, LDHX ; lactate dehydrogenase C |
Nous avons ici un résultat sur 2 colonnes :
- l'identifiant du gène KEGG
- les différents symboles connus du gène avec son nom complet juste après le point-virgule.
Récupérer la liste des pathways à partir des gènes
L'une des choses qui est sans doute celle qui nous intéresse le plus est la possibilité de récupérer la liste des pathways dans lesquels nos gènes précédents sont impliqués. Eh bien c'est tout à fait possible ! Voici comment nous pouvons procéder.
Dans un premier temps, nous utilisons l'opération link :
1 2 3 4 5 6 7 8 9 |
gene_paths = requests.get('http://rest.kegg.jp/link/pathway/' + hsa_genes) lines = gene_paths.text.splitlines() paths_id = [] for l in lines : # récupérer chaque réseau une seule et unique fois if l not in paths_id : paths_id.append(l.split('\t')[1]) print(len(paths_id)) 98 |
Ici nous n'avons récupéré que la liste des identifiants. Pour pouvoir récupérer les réseaux en eux-mêmes, nous allons utiliser l'opération get sur chaque identifiant, tout en précisant que nous voulons obtenir les images. Pour pouvoir enregistrer les images j'ai utilisé le module shutil, qui fait également partie des bibliothèques de base :
1 2 3 4 5 6 7 8 |
import shutil for p in paths : # récupérer un flux d'entrée path_img = requests.get('http ://rest.kegg.jp/get/' + p + '/image', stream = True) # remplacer le caractère : par un _ dans le nom de l'image enregistrée path_name = p.replace(':', '_') with open(path_name + '.png', 'wb') as f : shutil.copyfileobj(path_img.raw, f) |
Une fois ceci fait, rendez-vous dans le répertoire où vos images ont été sauvegardées, il ne vous reste plus qu'à analyser et interpréter les résultats !
Voici l'un des réseaux que j'ai récupéré :
Conclusion
KEGG nous permet, grâce à son API REST, d'effectuer des requêtes simples aussi bien manuellement que programmatiquement. Dans ces petits exemples courts et somme toute classique, vous avez pu entrevoir les possibilités d'imbrications de recherches que nous pourrions faire pour faciliter notre quotidien.
Dans un précédent article, je vous avais présenté la bibliothèque Python BioServices qui permet également de faire ce genre de requête auprès de KEGG. Le but de ce billet était de vous présenter le fonctionnement de l'API sans passer par un module plus ou moins lourd. Rien ne vous empêche pour autant de combiner les deux afin de faciliter vos programmes !
Un grand merci à mes relecteurs d'amours pour leurs remarques et suggestions : Mathurin, Yoann M., Guillaume Devailly et Kumquatum.
Laisser un commentaire