Bioconvert
Qui n'a jamais eu à convertir un fichier de données biologiques dans un autre format ? De ces différents constats − convertisseurs "maison" (donc pas toujours parfaits), grande diversité de formats (parfois très complexes et peu documentés) nouveaux formats ou formats obsolètes, etc − est née l'idée de créer un outil de conversion dédié aux formats utilisés en bioinformatique : Bioconvert.
Disponible via pip (pip3 install bioconvert avec Python 3.5 ou 3.6), cet outil offre une interface commune pour convertir des données biologiques depuis une multitude de formats vers d'autres.
Bioconvert est un projet collaboratif qui a démarré fin 2017. À ce jour, nous sommes quinze contributeurs à participer au projet, dont le code est librement disponible sur Github sous licence GPL v3. Plusieurs formats de fichiers sont actuellement manipulés à partir d'outils externes (samtools, bedtools, etc) ou (Biopython par exemple). Nous souhaitons progressivement nous passer d'un grand nombre de ces outils externes afin de limiter les dépendances et les aléas qu'ils peuvent poser, et gagner en rapidité d’exécution.
Facilité d'utilisation
De nombreux outils de conversion existent déjà mais ne prennent généralement en charge que quelques formats spécifiques. Ils peuvent en outre se révéler difficiles à installer ("il me manque la librairie bidule en version 4.12.8, mais apparemment elle ne marche que sur les processeurs 32 bits") et ne sont pas toujours optimisés et maintenus. Avec Bioconvert, nous souhaitons couvrir un large spectre de conversions entre formats. Ainsi, nous réutilisons les outils existants quand cela est possible et offrons un benchmarking automatique des différentes méthodes pour une même conversion. Lorsque les performances d'un convertisseur sont médiocres, nous implémentons une version améliorée et l’intégrons à Bioconvert. Je reviendrai sur le benchmarking un peu plus tard, car pour une fois c'est synonyme de truc fun !
Aujourd'hui (octobre 2018), Bioconvert reconnaît plus de 40 formats différents et peut faire 80 conversions directes. En appelant plusieurs fois Bioconvert, il est possible de faire beaucoup plus de conversions. Par exemple, on peut convertir un format A vers B, puis B vers C puis C vers D quand la conversion A vers D n'existe pas directement. Une option (expérimentale) est notamment en cours de mise au point pour automatiser cela. Pour l'instant, voici un résumé des conversions directement réalisables :

Conversions possibles dans Bioconvert
Mais bon, concrètement, comment fait-on pour convertir un fichier ? Et bien, pour convertir un fichier fasta vers un genbank par exemple, il suffit à l'utilisateur de lancer cette commande :
1 |
bioconvert fasta2genbank test.fasta test.gbk |
Simple, non ?
Nous allons voir que la simplicité est aussi de mise pour les développeurs.
Aide pour les développeurs
Bioconvert n'est pas un ensemble de scripts mis bout-à-bout avec un gros exécutable de lancement, qui doit être complété et modifié à chaque ajout de convertisseur. C'est une infrastructure complète permettant à chacun de facilement ajouter son propre convertisseur. Et quand je dis "simplement", vous allez voir que c'est vraiment simple. Allez, un petit exemple pour vous convaincre !
Nous allons créer un convertisseur du format fasta vers un nouveau format de fichier (magnifique) se nommant pwet. La particularité de ce format sera d'être écrit sur une seule colonne. Pour cela, un retour à la ligne va être ajouté derrière chaque caractère (vous l'aurez compris, c'est juste pour l'exemple).
Pour ajouter un nouveau convertisseur, il faut commencer par créer le template. Tout est automatisé et il suffit de rentrer dans l'invite de commandes :
1 |
bioconvert_init -i fasta -o pwet > fasta2pwet.py |
Vous obtenez un nouveau fichier de convertisseur, à placer dans le dossier bioconvert avec tous les autres.
C'est en éditant ce fichier que nous créerons notre propre convertisseur. Ici, comme dit précédemment, il s'agit simplement de rajouter un \n à la fin de chaque caractère et il suffit donc de modifier 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.
1 2 3 4 5 6 7 |
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 :
1 |
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.
- Benchmark des convertisseurs fastq vers fasta sur 1.000 séquences
- Benchmark des convertisseurs fastq vers fasta sur 1.000.000 séquences
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 !
Pierre Poulain
octobre 17, 2018 à 9:55
Super outil ! Bravo !
Par contre, il serait à mon avis utile de préciser que l'outil converti une séquence (et non pas un fichier) du format fasta vers le format genbank, car un fichier genbank peu contenir beaucoup d'informations (autre que la séquence).
Par ailleurs, je ne comprends pas l'utilité du benchmark. Si toutes ces méthodes sont implémentées dans bioconvert, laquelle est réellement utilisée pour effectuer la conversion ? Est-ce que l'utilisateur peut décider laquelle utiliser ?
Nico M.
octobre 17, 2018 à 2:55
Merci 🙂
Concernant Genbank, si le fichier en entrée est un multi-fasta, la sortie sera un multi-Genbank. Et en effet, il contiendra les mêmes infos que celle du fasta, pas plus (enfin si, la taille de la séquence en plus). Mais ça reste bien un fichier fasta converti vers un fichier Genbank.
Pour le benchmark, il est utile pour nous permettre de tester facilement les performances, par exemple, d'une fonction de conversion maison contre une fonction d'un outil déjà existant. Ou deux fonctions écrites dans des langages différents, etc.
La fonction "la meilleure", généralement la plus rapide, est celle utilisée par défaut, mais l'utilisateur peut choisir la fonction à utiliser avec l'option -c.
Alice C.
octobre 24, 2018 à 10:21
Merci pour cet outil très très utile !!
Pour moi il manque un convertisseur important c'est VCF2TSV (ou CSV ou XLS).
Les codes existent déjà. Je vais voir pour les ajouter.
Nico M.
octobre 29, 2018 à 12:11
De rien, on est très content de voir que l'outil est utilisé 🙂
N'hésite pas à rajouter la fonction sur le GitHub si tout roule !