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.
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 !
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 |
Aide pour les développeurs
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 :
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
1 |
fasta2pwet.py  ;. Elle ne |
1 |
require rien du tout, retirez donc le |
1 |
ls<span class="">, et codez ensuite l'outil comme ci-dessous. Notez</span><span class=""> que vous accédez aux fichiers d'entrée/sortie en utilisant <span id="crayon-5bac964f36aef376018278" class="crayon-syntax crayon-syntax-inline crayon-theme-classic crayon-theme-classic-inline crayon-font-monospace" style="font-size : 12px !important ; line-height : 15px !important;"><span class="crayon-pre crayon-code" style="font-size : 12px !important ; line-height : 15px !important ; ‑moz-tab-size : 4 ; ‑o-tab-size : 4 ; ‑webkit-tab-size : 4 ; tab-size : 4;"><span class="crayon‑v">infile</span></span></span> et</span> |
1 |
outfile.<br> |
1 2 3 4 5 6 7 |
def _method_default(self, *args, **kwargs):<br> """Convert old fashioned fasta file to new and bright pwet format"""<br> with open(self.infile) as infasta :<br> with open(self.outfile, "w") as outpwet :<br> for line in infasta :<br> for char in line :<br> outpwet.write(char + "\n") |
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é
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 !
Laisser un commentaire