Question:
Existe-t-il un moyen de récupérer plusieurs champs SAM plus rapidement que `samtools view | couper -f`?
ShanZhengYang
2017-08-23 01:51:08 UTC
view on stackexchange narkive permalink

Je suis en train de construire un logiciel qui redirige les sorties du fichier bam via samtools view dans un script pour l'analyse. Mon objectif est (d'une manière ou d'une autre) de rendre ce processus plus efficace et plus rapide que samtools view .

J'utilise seulement 3-4 champs dans le bam. Naturellement, si je ne voulais que ces champs, je pourrais faire quelque chose comme samtools view file1.bam | couper -f ## .

Cependant, j'essaye d'être plus rapide que cette approche. Plus précisément:

(1) Compte tenu du format de fichier bam, est-il théoriquement possible de générer plusieurs champs SAM demandés plus rapidement que samtools view | cut -f ?

(2) Existe-t-il un logiciel disponible pour réaliser (1), ou faudrait-il pirater samtools?

De quels champs avez-vous besoin exactement? Utiliser `htslib` est relativement facile si vous connaissez C, mais si vous pouvez vous en tirer avec quelque chose comme [sambamba] (http://lomereiter.github.io/sambamba/) alors ce serait encore beaucoup plus facile.
@DevonRyan La sortie du bam pourrait être plus rapide avec sambambda? Ce sont des champs "obligatoires", ils sont donc présents dans chaque "ligne" de bam
`samtools view`, en particulier dans la manière dont il est utilisé ici, produit une représentation textuelle d'un fichier BAM. L'utilisation d'une bibliothèque (ou d'un outil qui puise dans une bibliothèque) permet un accès plus rapide au niveau binaire en évitant la conversion de texte intégral de chaque alignement avant le filtrage.
@gringer Je ne suis pas exactement cela. Pourriez-vous fournir plus de détails / une explication?
Sambamba est généralement plus rapide que samtools, ou du moins c'était le cas auparavant. Samtools est une implémentation de référence, elle ne doit pas toujours être la plus rapide.
Trois réponses:
gringer
2017-08-23 08:14:31 UTC
view on stackexchange narkive permalink

Le format de fichier BAM n'est pas un format basé sur du texte. Il a une structure binaire spécifique, spécifiée de manière suffisamment détaillée dans la spécification du format de fichier SAM. Chaque fois que ces informations sont affichées sur un écran sous forme de texte, elles doivent être converties du format binaire en format texte, ce qui prend un peu de temps et de puissance de traitement.

Comme cette question le suggère, si seulement un un champ spécifique des alignements est nécessaire (ou des champs), alors il sera probablement préférable d'extraire uniquement ces champs et de faire toute conversion nécessaire uniquement sur ces champs. Bien que cela puisse être fait en écrivant un analyseur BAM à partir de zéro, de nombreux développeurs ont déjà écrit des bibliothèques de logiciels pour traiter les fichiers BAM de cette manière.

Devon Ryan a suggéré htslib, qui est une bibliothèque C écrite par un groupe qui inclut les personnes qui ont écrit les spécifications de format de fichier SAM / BAM / CRAM. Il y a aussi pysam, qui est un wrapper python autour de htslib.

L'outil particulier qui est utilisé dépendra de votre familiarité avec la programmation et de ce que vous voulez faire. Si vous voulez juste "sortir un fichier BAM", alors cat est le plus rapide:

  cat file1.bam  

... mais vous ne le faites probablement pas Je ne veux pas faire ça, car il semble que vous vouliez traiter une représentation textuelle avec un script. Parce que vous n'avez pas spécifié les champs qui vous intéressent, il n'est pas possible de suggérer la meilleure chose à utiliser. En fin de compte, j'espère qu'une solution «efficace» à votre problème impliquerait htslib sous une forme ou une autre. Ce n'est pas vraiment du piratage de samtools , il utilise le backend de samtools pour traiter les données BAM.

Cependant, il est utile de penser également au coût en temps du codage. Quelle application avez-vous qui signifie que la méthode de traitement textuel n'est pas suffisante? Il faut du temps pour écrire du code et beaucoup plus de temps pour déboguer ce code pour s'assurer qu'il fait la bonne chose dans toutes les situations. Si c'est pour une chose ponctuelle, alors la sortie samtools view introduite dans votre script peut être la solution la plus rapide.

Je connais un peu pysam. Il semble que ce serait très inefficace, car j'aurais besoin d'entrer le bam dans une structure de données python, par exemple `pysam.AlignmentFile ()`. En ce qui concerne le script, oui, j'analyse actuellement le format texte du fichier bam sorti. Je n'ai encore rien fait avec la compression / binaire.
Son inefficacité ou non dépend de la manière dont la bibliothèque est implémentée. Il est possible que les structures de données contiennent des pointeurs vers des fichiers (ou des emplacements dans des fichiers) et ne récupèrent les informations des fichiers que sur demande. Il n'est pas nécessaire de charger le fichier entier en mémoire pour en explorer un seul aspect.
user172818
2017-08-25 17:17:12 UTC
view on stackexchange narkive permalink

J'ai modifié votre question initiale: comme vous extrayez 4 champs, vous ne sortez pas de BAM. La réponse à la question modifiée est: oui, vous pouvez écrire un programme C avec htslib (ou avec bamtools, bioD, bioGo ou rust-bio). Le formatage d'un SAM entier est assez coûteux. Vous pouvez le voir en comparant samtools view aln.bam > / dev / null et samtools view -u aln.bam > / dev / null . Avec un programme C, vous pouvez sélectionner les champs à sortir. Cela vous donnera une amélioration notable des performances, en fonction des champs que vous extrayez.

En général, si vous vous souciez vraiment des performances, n'utilisez pas de script. Le temps que vous gagnez en optimisant samtools view | cut -f sera rapidement neutralisé par l'inefficacité de la plupart des langages de script.

> Avec un programme C, vous pouvez sélectionner les champs à afficher, pouvez-vous détailler un peu plus comment cela serait fait? Le format BAM est en binaire, il faudrait donc d'abord convertir en texte puis extraire les champs souhaités?
@ShanZhengYang La bibliothèque analyse l'enregistrement de fichier pour vous et le place en mémoire. À partir de là, vous imprimez (ou traitez) à partir des données en mémoire uniquement les champs souhaités dans le format de votre choix. Aucune analyse de texte n'est requise.
mattm
2017-08-25 19:27:48 UTC
view on stackexchange narkive permalink

Une autre bibliothèque que vous pouvez utiliser à cette fin est le htsjdk, qui est écrit en java. L'utilisation de htsjdk avec java est analogue à l'utilisation de htslib avec C; le format BAM est déjà géré par la bibliothèque et vous pouvez manipuler les champs dans votre propre code. La même analyse de base s'applique à java en tant que C; vous n'avez pas besoin de convertir le fichier BAM en texte, puis de l'analyser. Généralement, un programme implémenté en java sera plus lent que C mais toujours beaucoup plus rapide que le script. Vous bénéficiez des fonctionnalités linguistiques de java: portabilité, vérification des limites de tableau, garbage collection, etc.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...