Kysymys:
Jaa FASTQ ja vastaava BAM vastaaviksi paloiksi
Scott Gigante
2017-08-17 07:33:01 UTC
view on stackexchange narkive permalink

Suoritan hidasta alavirran analyysia suurella joukolla nanohuokoslukuja (noin 3 miljoonaa) ja haluaisin jakaa ne pienempiin paloihin, suorittaa analyysin massiivisesti rinnakkain ja yhdistää sitten uudelleen. Alun perin jaoin vain FASTQ: n paloiksi, kohdensin jokaisen palan uudelleen ja sitten yhdistin tuotoksen, mutta tässä haluan käyttää olemassa olevaa tasausta, jotta voin verrata tuloksia nykyisiin analyyseihin (ts. Kohdistusten on oltava samat). / p>

Kuinka voin tehokkaasti jakaa FASTQ-tiedoston ja BAM-tiedoston, joka kohdistaa FASTA-tiedoston paloiksi, varmistaen, että kaikki FASTQ-palan 1 lukut ovat BAM-kappaleessa 1, päinvastoin?

FASTQ-tiedostoni on noin 45 Gt ja BAM-muistini 33 Gt, joten haluan välttää toisen tiedostojen tallentamista muistiin, jos mahdollista.

MUOKKAA: Tässä on joitain pseudokoodeja siitä, mitä Yritän tehdä:

  # input: in.bam, in.fastq, chunk_sizei <- 0for fastq_read in in.fastq: bam_read <- pura fastq_read.read_name in.bam n <- i modulo chunk_size write fastq_read to out.n.fastq kirjoittaa bam_read to out.n.bam i <- i + 1  

Voisin vaihtaa yllä mainitun iteroimaan bam-tiedosto ja hae fastq: sta, jos se on helpompaa.

Sattuuko BAM-tiedostosi jo samassa järjestyksessä kuin fastq-tiedostot (jotkut kohdistimet tuottavat sen oletuksena)? Jos näin ei ole, sinulla on melko paljon jäljellä (1) tiedostojen lajittelu tai (2) hajautettujen nimien hajauttaminen.
Valitettavasti ne eivät ole samassa järjestyksessä, ja lisäksi joitain lukuja on useita kertoja BAM: ssä (täydentävät kohdistukset), ja kourallista lukuja ei ole lainkaan BAM: ssä.
Yikes, ainoa vaihtoehto on jotain, mitä Michael Hall sitten julkaisi.
üks vastaus:
Michael Hall
2017-08-17 12:33:11 UTC
view on stackexchange narkive permalink

Hmm, on vaikea ajatella supertehokasta tapaa tehdä tämä (olettaen, että tiedostoja ei ole järjestetty samoin - jos ne ovat, tämä koko vastaus on periaatteessa tarpeeton). Ja myös olettaen, että molempien tiedostojen luetut tunnukset eivät ole täydellinen leikkauspiste.

Pääni yläosasta haluat todennäköisesti rakentaa joukon lukutunnuksia fastq-tiedostolle ja toisen bamille. Joitakin python-koodeja aloittaaksesi sen:

  tuo pysamimport itertoolsdef get_read_id_fastq (ref_path): "" "Poimi luetut tunnukset fastq-tiedostosta." "" Read_ids = set () open ( ref_path, 'r') viitteenä: viitteen viitteelle: if line.startswith ('@'): # ts. jos rivi on otsikko # jaa rivi välilyönneille, ota ensimmäinen elementti, poista @ read_id = line.split ( '') [0] .replace ('@', '') read_ids.add (read_id) return read_idsdef get_read_id_bam (ref_path): "" "Pura luetut tunnukset BAM-tiedostosta." "" Read_ids = set () pysam.AlignmentFile (ref_path, 'r', ignore_truncation = True) viitteenä: luettavaksi viitteessä: # kyselyn_nimi on kyselymallin nimi read_ids.add (read.query_name) return read_idsfastq_ids = get_read_id_fastq (fastq_path) bam_ids = get_read_id_bam (bam_ids 

Ota sitten näiden kahden joukon leikkauspiste ja se on yhteinen lukutunnuksesi.

  common_ids = fastq_ids & bam_ids  

Seuraava osa tulee olemaan hieman enemmän mukana. Sinun täytyy toistaa jokaisen tiedoston läpi yksi kerrallaan. Ehdotan, että luo ensimmäiseksi läpi toistamasi sanakirja, jonka lukutunnus kirjoitettiin avaimena ja 'istukan numero', johon se kirjoitettiin arvona. Voit luoda palan koon syklin tämän hallitsemiseksi tehokkaasti.

  chunk_cycle = itertools.chain (* zip (range (chunk_size) * len (common_ids))) write_idx = {}  

Seuraava osa edellyttää todennäköisesti, että vietät kovaa taistelua aikoja saadaksesi sen toimimaan. Laitan karkean pseudokoodin saadaksesi idean.

  tiedostoriville: read_id = # get line read_id jos read_id common_ids: chunk_num = chunk_cycle.next () write_idx [read_id] = chunk_num file_to_write_to = 'out. {}. bam'.format (chunk_num) # avaa tämä tiedosto tai kirjoita siihen, jos se on jo auki  

Kun siirryt tekemään seuraavan tiedoston kun löydät lukutunnuksen yhteisestä joukosta, etsit sen arvoa write_idx -kohdasta ja tämä antaa sinulle osanumeron, johon kirjoittaa.

Lukemat eivät ole täsmälleen samassa järjestyksessä näiden kahden tiedoston välillä, mutta voit lajitella myöhemmin, jos tarvitset sitä (etkö ole varma, onko sillä merkitystä?).

Toivottavasti tämä auttaa. Valitettavasti en voinut antaa sinulle enempää, mutta tämän pitäisi antaa toivottavasti etumatka.

Kiitos! Itse asiassa en tarvitsisi ensimmäistä osaa, koska jokainen BAM: n lukema tuli FASTQ: sta. Jos on FASTQ-tietueita, joita ei ole BAM: ssä, en välitä.
Päivitys: jokainen kiinnostunut voi tarttua tämän ratkaisun käyttöönottoon osoitteessa https://github.com/scottgigante/nanopore-scripts/blob/master/split_bam_and_fasta.py


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...