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.