Bioconvert — simplifier les conversions de formats

Bioconvert

Qui n'a jamais eu à conver­tir un fichier de don­nées bio­lo­giques dans un autre for­mat ? Il y a bien sur le clas­sique fastq vers fas­ta, pour lequel nombre d'entre nous ont codé un conver­tis­seur "mai­son", pas for­cé­ment opti­mal. D'autres for­mats sont par­fois plus pro­blé­ma­tiques, par exemple la conver­sion vers et depuis GFF2/​GFF3. De ces dif­fé­rents constats − conver­tis­seurs "mai­son" (donc pas tou­jours par­faits), grande diver­si­té de for­mats (par­fois très com­plexes et peu docu­men­tés) nou­veaux for­mats ou for­mats obso­lètes, etc − est née l'idée de créer un outil de conver­sion dédié aux for­mats uti­li­sés en bio­in­for­ma­tique : Bio­con­vert.
Dis­po­nible via pip (pip3 ins­tall bio­con­vert avec Python 3.5 ou 3.6), cet outil offre une inter­face com­mune pour conver­tir des don­nées bio­lo­giques depuis une mul­ti­tude de for­mats vers d'autres.
Bio­con­vert est un pro­jet col­la­bo­ra­tif qui a démar­ré fin 2017. À ce jour, nous sommes quinze contri­bu­teurs à par­ti­ci­per au pro­jet, dont le code est libre­ment dis­po­nible sur Github sous licence GPL v3. Plu­sieurs for­mats de fichiers sont actuel­le­ment mani­pu­lés à par­tir d'outils externes (sam­tools, bed­tools, etc) ou de biblio­thèques Python (Bio­py­thon par exemple). Nous sou­hai­tons pro­gres­si­ve­ment nous pas­ser d'un grand nombre de ces outils externes afin de limi­ter les dépen­dances et les aléas qu'ils peuvent poser, et gagner en rapi­di­té d’exécution.

Facilité d'utilisation

De nom­breux outils de conver­sion existent déjà mais ne prennent géné­ra­le­ment en charge que quelques for­mats spé­ci­fiques. Ils peuvent en outre se révé­ler dif­fi­ciles à ins­tal­ler ("il me manque la librai­rie bidule en ver­sion 4.12.8, mais appa­rem­ment elle ne marche que sur les pro­ces­seurs 32 bits") et ne sont pas tou­jours opti­mi­sés et main­te­nus. Avec Bio­con­vert, nous sou­hai­tons cou­vrir un large spectre de conver­sions entre for­mats. Ain­si, nous réuti­li­sons les outils exis­tants quand cela est pos­sible et offrons un bench­mar­king auto­ma­tique des dif­fé­rentes méthodes pour une même conver­sion. Lorsque les per­for­mances d'un conver­tis­seur sont médiocres, nous implé­men­tons une ver­sion amé­lio­rée et l’intégrons à Bio­con­vert. Je revien­drai sur le bench­mar­king un peu plus tard, car pour une fois c'est syno­nyme de truc fun !
Aujourd'hui (octobre 2018), Bio­con­vert recon­naît plus de 40 for­mats dif­fé­rents et peut faire 80 conver­sions directes. En appe­lant plu­sieurs fois Bio­con­vert, il est pos­sible de faire beau­coup plus de conver­sions. Par exemple, on peut conver­tir un for­mat A vers B, puis B vers C puis C vers D quand la conver­sion A vers D n'existe pas direc­te­ment. Une option (expé­ri­men­tale) est notam­ment en cours de mise au point pour auto­ma­ti­ser cela. Pour l'instant, voi­ci un résu­mé des conver­sions direc­te­ment réa­li­sables :
Conversions de Bioconvert
Conver­sions pos­sibles dans Bio­con­vert
Mais bon, concrè­te­ment, com­ment fait-on pour conver­tir un fichier ? Et bien, pour conver­tir un fichier fas­ta vers un gen­bank par exemple, il suf­fit à l'utilisateur de lan­cer cette com­mande :
bioconvert fasta2genbank test.fasta test.gbk
Simple, non ?
Nous allons voir que la sim­pli­ci­té est aus­si de mise pour les déve­lop­peurs.

Aide pour les développeurs

Bio­con­vert n'est pas un ensemble de scripts mis bout-à-bout avec un gros exé­cu­table de lan­ce­ment, qui doit être com­plé­té et modi­fié à chaque ajout de conver­tis­seur. C'est une infra­struc­ture com­plète per­met­tant à cha­cun de faci­le­ment ajou­ter son propre conver­tis­seur. Et quand je dis "sim­ple­ment", vous allez voir que c'est vrai­ment simple. Allez, un petit exemple pour vous convaincre !
Nous allons créer un conver­tis­seur du for­mat fas­ta vers un nou­veau for­mat de fichier (magni­fique) se nom­mant pwet. La par­ti­cu­la­ri­té de ce for­mat sera d'être écrit sur une seule colonne. Pour cela, un retour à la ligne va être ajou­té der­rière chaque carac­tère (vous l'aurez com­pris, c'est juste pour l'exemple).
Pour ajou­ter un nou­veau conver­tis­seur, il faut com­men­cer par créer le tem­plate. Tout est auto­ma­ti­sé et il suf­fit de ren­trer dans l'invite de com­mandes :
bioconvert_init -i fasta -o pwet > fasta2pwet.py
Vous obte­nez un nou­veau fichier de conver­tis­seur, à pla­cer dans le dos­sier bio­con­vert avec tous les autres.
C'est en édi­tant ce fichier que nous crée­rons notre propre conver­tis­seur. Ici, comme dit pré­cé­dem­ment, il s'agit sim­ple­ment de rajou­ter un \n à la fin de chaque carac­tère et il suf­fit donc de modi­fier la méthode par défaut de
fasta2pwet.py . Elle ne 
require rien du tout, retirez donc le 
ls, et codez ensuite l'outil comme ci-dessous. Notez que vous accédez aux fichiers d'entrée/sortie en utilisant infile et 
outfile.
def _method_default(self, *args, **kwargs):
"""Convert old fashioned fasta file to new and bright pwet format"""
with open(self.infile) as infasta:
with open(self.outfile, "w") as outpwet:
for line in infasta:
for char in line:
outpwet.write(char + "\n")
Voilà, il ne vous reste plus qu'à tester le convertisseur en faisant :
bioconvert fasta2pwet test.fasta test.pwet

Fonctionnement interne

Je pense que vous voyez l’intérêt de l'infrastructure : vous pouvez vraiment vous concentrer sur le code métier et oublier tous les détails d'intégration de votre code. Mais attention, cela ne vous prive pas de coder proprement et d'écrire vos classes de tests ! Tous les tests sont dans le dossier tests  et je ne rentrerai pas dans les détails ici, mais c'est aussi très simple de tester correctement son convertisseur (tout est expliqué sur le ReadTheDocs, voir les liens en fin d'article).
Si tout le framework est codé en python, rien ne vous oblige à utiliser ce langage pour ajouter un convertisseur. Comme on vient de le voir, un convertisseur, du point du vue du développeur, peut se résumer à une fonction. Dès lors, rien ne vous interdit dans cette fonction de lancer une commande système : c'est même prévu et simplifié par le framework, et il suffit d'utiliser la fonction self.execute(commande)  ! Ainsi, tous les langages sont les bienvenus pour convertir efficacement. En poussant plus loin, vous comprenez aussi que tous les logiciels / bibliothèques faisant de la conversion peuvent être utilisés directement dans Bioconvert, et c'est d'ailleurs ce mécanisme que l'on utilise déjà pour certains formats de fichiers.

Benchmark intégré

Comme expliqué précédemment, Bioconvert reconnaît pour le moment une quarantaine de formats et propose 80 conversions directes. Mais, pour une conversion donnée, il peut y avoir plusieurs méthodes différentes ; dans les faits, c'est plus de 120 méthodes de conversions différentes qui sont disponibles dans le logiciel aujourd'hui.
Afin de facilement comparer les différentes méthodes disponible pour une même conversion, nous avons mis au point une structure de benchmarking très simple à utiliser. Basiquement, il suffit de lui indiquer quelles méthodes on souhaite benchmarker, la quantité de séquences à traiter et le logiciel se charge de générer les séquences, lancer les différentes méthodes et afficher les résultats sous forme graphique.
Comme vous le voyez, on a fait un petit concours de bits sur qui ferait le convertisseur fastq vers fasta le plus rapide. Quand je vous dis que le benchmarking peut devenir fun 🙂 .

Et la suite ?

Nous continuons de mettre au point des mécanismes pour simplifier la vie des développeurs et des utilisateurs, par exemple le mécanisme de conversion multiple pour combler un convertisseur manquant (l'histoire du A vers D comme expliqué précédemment). De plus, une version en ligne sur une machine virtuelle dédiée est en cours de développement, avec une interface qui devrait simplifier grandement l'utilisation de Bioconvert.
Tout le code est bien évidement ouvert (GPL v3) et nous recherchons maintenant des gens voulant nous aider. Nombre d'entre vous ont forcément codé des convertisseurs, peut-être pour des formats un peu spéciaux. C'est le bon moment pour vous de dépoussiérer ces morceaux de code et de les inclure dans Bioconvert, non ? Donc si l'aventure vous tente, n'hésitez pas à venir jouer avec nous. Au passage, pensez-vous arriver à coder un fastq vers fasta plus rapide que les nôtres ? 😀

Liens utiles :

Un grand merci à Jnsll, Lins` et M. Blum pour les relectures et à Yoann M pour la motivation !


Pour continuer la lecture :


Commentaires

4 réponses à “Bioconvert — simplifier les conversions de formats”

  1. Avatar de Pierre Poulain
    Pierre Poulain

    Super outil ! Bra­vo !
    Par contre, il serait à mon avis utile de pré­ci­ser que l'outil conver­ti une séquence (et non pas un fichier) du for­mat fas­ta vers le for­mat gen­bank, car un fichier gen­bank peu conte­nir beau­coup d'informations (autre que la séquence).
    Par ailleurs, je ne com­prends pas l'utilité du bench­mark. Si toutes ces méthodes sont implé­men­tées dans bio­con­vert, laquelle est réel­le­ment uti­li­sée pour effec­tuer la conver­sion ? Est-ce que l'utilisateur peut déci­der laquelle uti­li­ser ?

    1. Avatar de Nico M.

      Mer­ci 🙂
      Concer­nant Gen­bank, si le fichier en entrée est un mul­ti-fas­ta, la sor­tie sera un mul­ti-Gen­bank. Et en effet, il contien­dra les mêmes infos que celle du fas­ta, pas plus (enfin si, la taille de la séquence en plus). Mais ça reste bien un fichier fas­ta conver­ti vers un fichier Gen­bank.

      Pour le bench­mark, il est utile pour nous per­mettre de tes­ter faci­le­ment les per­for­mances, par exemple, d'une fonc­tion de conver­sion mai­son contre une fonc­tion d'un outil déjà exis­tant. Ou deux fonc­tions écrites dans des lan­gages dif­fé­rents, etc.
      La fonc­tion "la meilleure", géné­ra­le­ment la plus rapide, est celle uti­li­sée par défaut, mais l'utilisateur peut choi­sir la fonc­tion à uti­li­ser avec l'option ‑c.

  2. Avatar de Alice C.

    Mer­ci pour cet outil très très utile !!
    Pour moi il manque un conver­tis­seur impor­tant c'est VCF2TSV (ou CSV ou XLS).
    Les codes existent déjà. Je vais voir pour les ajou­ter.

    1. Avatar de Nico M.

      De rien, on est très content de voir que l'outil est uti­li­sé 🙂

      N'hésite pas à rajou­ter la fonc­tion sur le GitHub si tout roule !

Laisser un commentaire