Vraag:
Is er een manier om meerdere SAM-velden sneller op te halen dan `samtools view | gesneden -f`?
ShanZhengYang
2017-08-23 01:51:08 UTC
view on stackexchange narkive permalink

Ik ben een stukje software aan het construeren dat de output van het bam-bestand via samtools view in een script voor parseren plaatst. Mijn doel is om (op de een of andere manier) dit proces efficiënter en sneller te maken dan samtools view .

Ik gebruik slechts 3-4 velden in de bam. Als ik alleen die velden wilde, zou ik natuurlijk zoiets kunnen doen als samtools view file1.bam | cut -f ## .

Ik probeer echter sneller te zijn dan deze benadering. Meer specifiek:

(1) Is het, gezien het bam-bestandsformaat, theoretisch mogelijk om verschillende aangevraagde SAM-velden sneller uit te voeren dan samtools view | cut -f ?

(2) Is er software beschikbaar om (1) te bereiken, of zou men samtools moeten hacken?

Welke velden heeft u precies nodig? Het gebruik van `htslib` is relatief eenvoudig als je C kent, maar als je kunt rondkomen met zoiets als [sambamba] (http://lomereiter.github.io/sambamba/) dan zou dat nog veel gemakkelijker zijn.
@DevonRyan Het uitvoeren van de bam kan sneller gaan met sambambda? Dit zijn "verplichte" velden, dus ze zijn aanwezig in elke bam "rij"
`samtools view`, vooral in de manier waarop het hier wordt gebruikt, produceert een tekstweergave van een BAM-bestand. Het gebruik van een bibliotheek (of een tool die een bibliotheek aanboort) maakt snellere toegang op binair niveau mogelijk door de volledige tekstconversie van elke uitlijning voorafgaand aan het filteren te vermijden.
@gringer Ik volg dit niet precies. Kunt u meer details / uitleg geven?
Sambamba is over het algemeen sneller dan samtools, of dat was tenminste het geval. Samtools is een referentie-implementatie, het hoeft niet altijd de snelste te zijn.
Drie antwoorden:
gringer
2017-08-23 08:14:31 UTC
view on stackexchange narkive permalink

Het BAM-bestandsformaat is geen op tekst gebaseerd formaat. Het heeft een specifieke binaire structuur, redelijk gedetailleerd gespecificeerd in de SAM-bestandsindelingsspecificatie. Telkens wanneer deze informatie als tekst op een scherm wordt weergegeven, moet deze worden geconverteerd van het binaire formaat naar een tekstformaat, wat wat tijd en verwerkingskracht kost.

Zoals deze vraag suggereert, al was het maar een specifiek veld uit alignementen nodig is (of velden), dan is het waarschijnlijk beter om alleen die velden te extraheren en de nodige conversie alleen op die velden uit te voeren. Hoewel dit kan worden gedaan door een geheel nieuwe BAM-parser te schrijven, hebben veel ontwikkelaars al softwarebibliotheken geschreven om BAM-bestanden op deze manier te verwerken.

Devon Ryan heeft htslib voorgesteld., wat een C-bibliotheek is die is geschreven door een groep die de mensen omvat die de SAM / BAM / CRAM-bestandsindelingsspecificaties hebben geschreven. Er is ook pysam, een python-wrapper rond htslib.

De specifieke tool die wordt gebruikt, hangt af van je bekendheid met programmeren en van het specifieke ding dat je wilt doen. Als je gewoon "een BAM-bestand wilt uitvoeren", dan is cat het snelst:

  cat file1.bam  

... maar waarschijnlijk doe je dat niet wil dat niet doen, omdat het lijkt alsof je een op tekst gebaseerde weergave wilt verwerken met een script. Omdat u niet heeft aangegeven in welke velden u geïnteresseerd bent, is het niet mogelijk om de beste oplossing voor te stellen. Uiteindelijk verwacht ik dat een "efficiënte" oplossing voor uw probleem in een of andere vorm htslib zou omvatten. Dit is niet echt samtools hacken, het gebruikt de backend van samtools om BAM-gegevens te verwerken.

Het is echter handig om ook na te denken over de tijdskosten van coderen. Welke toepassing heeft u waardoor de tekstverwerkingsmethode niet voldoende is? Het kost tijd om code te schrijven, en veel meer tijd om die code te debuggen om er zeker van te zijn dat deze in alle situaties het juiste doet. Als dit voor een eenmalig iets is, dan is de uitvoer van samtools view die in uw script wordt ingevoerd, wellicht de snelste oplossing.

Ik ben een beetje bekend met pysam. Het lijkt erop dat dit erg inefficiënt zou zijn, omdat ik de bam zou moeten invoeren in een python-gegevensstructuur, bijv. `pysam.AlignmentFile ()`. Wat betreft het script, ja, ik analyseer momenteel het tekstformaat van het uitgevoerde bam-bestand. Ik heb nog niets gedaan met compressie / binair.
Of het inefficiënt is of niet, hangt af van de manier waarop de bibliotheek is geïmplementeerd. Het is mogelijk dat datastructuren verwijzingen naar bestanden (of plaatsen in bestanden) bevatten en alleen informatie uit de bestanden halen wanneer daarom wordt gevraagd. Het is niet nodig om het hele bestand in het geheugen te laden om slechts één aspect ervan te verkennen.
user172818
2017-08-25 17:17:12 UTC
view on stackexchange narkive permalink

Ik heb je oorspronkelijke vraag aangepast: aangezien je 4 velden aan het extraheren bent, voer je geen BAM uit. Het antwoord op de gewijzigde vraag is: ja, je kunt een C-programma schrijven met htslib (of met bamtools, bioD, bioGo of rust-bio). Het formatteren van een volledige SAM is vrij duur. U kunt dit zien door samtools view aln.bam > / dev / null en samtools view -u aln.bam > / dev / null te vergelijken. Met een C-programma kunt u velden selecteren om uit te voeren. Dit geeft je een merkbare prestatieverbetering, afhankelijk van de velden die je extraheert.

In het algemeen, als je echt om prestaties geeft, gebruik dan geen script. De tijd die u bespaart door het optimaliseren van samtools view | cut -f zal snel worden geneutraliseerd door de inefficiëntie van de meeste scripttalen.

> Met een C-programma kunt u velden selecteren om uit te voeren. Kunt u wat meer uitleggen hoe dit zou gebeuren? Het BAM-formaat is in binair, dus je moet eerst naar tekst converteren en vervolgens de gewenste velden extraheren?
@ShanZhengYang De bibliotheek analyseert het bestandsrecord voor u en plaatst het in het geheugen. Van daaruit print (of anderszins verwerkt) u van de gegevens in het geheugen alleen de gewenste velden in welk formaat dan ook. Er is geen tekstparsering vereist.
mattm
2017-08-25 19:27:48 UTC
view on stackexchange narkive permalink

Een andere bibliotheek die u voor dit doel kunt gebruiken, is de htsjdk, die in java is geschreven. Het gebruik van htsjdk met java is analoog aan het gebruik van htslib met C; het BAM-formaat wordt al door de bibliotheek afgehandeld en u kunt velden in uw eigen code manipuleren. Dezelfde basisanalyse is van toepassing op java als C; u hoeft het BAM-bestand niet naar tekst te converteren en vervolgens te ontleden. Over het algemeen zal een in Java geïmplementeerd programma langzamer zijn dan C, maar nog steeds aanzienlijk sneller dan scripts. Je krijgt de taalkenmerken van java: draagbaarheid, controle van arraygrenzen, garbage collection, etc.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...