Domanda:
Converti allineamenti locali in allineamenti uniti nel file SAM
aechchiki
2017-08-30 18:24:42 UTC
view on stackexchange narkive permalink

Ho mappato le letture dell'RNA sul genoma di riferimento, utilizzando LAST in modalità split e ho convertito l'allineamento MAF in SAM con maf-convert.

Il mio problema è che le trascrizioni non vengono riportate in modo spliced, il che significa che un transcript_ID viene segnalato più volte nel file SAM di allineamento con un identico flag bit per bit in $ 2 . Da quello che ho capito, ciò è dovuto al fatto che solo gli esoni sono mappati (un esone per riga) e riportati come allineamenti locali, poiché il software non può gestire la combinazione di schemi di giunzione esone-introne (ancora), il cui comportamento è chiaro da il filo SIGARO.

Per un esempio più concreto e visivo, si consideri la mappatura della trascrizione FBtr0344900 al genoma di riferimento come fornita da LAST:

  $ cat last_aln .sam | grep FBtr0344900FBtr0344900 0 4 42774 100 384 = 144H * 0 0 TGCGACATTGTTCTACGATGACTACAAAAAATGACCAATAACTTCTATAAACCAATACGATATGTCAGGAGTTTCGGTCCCATACGAAGTCGCCGACTTAAGTATTTTATttttattttgatATGTGTTTGCTATTTTACCTTGTCGAATGCTTCCACACGCTATGAGAATACCATCGTGAGCGTAGCTTACTACTAGAATTTTGTTGAAGTTATTGACAAGCGATGTCTCAATATCTTCCGGACAGCCTCCAGCGTGACATTGCGGGGAATCATGTAACGGCCCAGTAACAGCCTCGGCCAGCACTCGAAGGTTTTCGTTAAGTTTAAGTATTTTATTTGTAGCACCCGCAAACAAAACATTGTGCATAAAGTCGAAGCTCAT * NM: i: 0 AS: i: 2304FBtr0344900 0 4 43231 100 384H144 = * 0 0 CTGGAAGCTGTTGATTGAACTGGTATTGATGGCAAGTTAAACTGGGCGACTATGTCATTTAAGGGAGATAACGCCTGAGCCGGCAGTTCTTCAATGCAGTTAACGCAATAATGCTGAGAACCGAGTATGATAATAATACACAGT * NM: i: 0 AS: i: 864  

Ed ecco la mappatura della stessa trascrizione FBtr0344900 fornita da STAR - software che riporta l'allineamento proprio nel modo in cui ne ho bisogno:

  cat star_aln.sam | grep FBtr0344900
FBtr0344900 0 4 42774 255 384M73N144M * 0 * NH: i: 1 HI: i: 1 NM: i: 0 MD: Z: 528  

Dalla discussione con l'autore, sembra che non riesco a ottenere ciò di cui ho bisogno direttamente dall'attuale versione LAST, e non è un problema tecnico. Quindi, devo modificare l'output da solo. L'obiettivo sarebbe quello di ottenere almeno una linea SIGAR che rappresenti una trascrizione completa.

La mia domanda è: conosci qualche software per farlo? Ciò di cui avrei bisogno è un file contenente una riga per trascrizioni mappate in modo univoco, con tre campi: transcript_ID , start position e CIGAR string .

Da parte mia, ho proceduto in questo modo:

1) estrai i campi di cui ho bisogno per l'interessato dal file SAM:

  $ cut -f1,4,6FBtr0344900 42774 384 = 144HFBtr0344900 43231 384H144 =  

2) dividi la riga CIGAR per rimuovere gli elementi che non mi interessano - Semplifico il comando qui, supponendo solo di averlo solo corrispondenze perfette (a cui sono interessato) e hard-clipping (a cui non sono interessato):

  $ cut -f3 | sed 's / H / _ / g' | sed 's / = / = / g' | sed 's / \ w * _ \ s * //' | sed 's / = // g'384144  

3) incolla il CIGAR modificato nel file originale, con paste , ottenendo:

  $ incolla (1) (2) | cut -f1,2,4FBtr0344900 42774 384FBtr0344900 43231 144  

4) unisci righe che iniziano con lo stesso transcript_id :

  $ awk -F '\ t' -v OFS = '\ t' '{x = $ 1; $ 1 = ""; a [x] = a [x] $ 0} END {for (x in a) print x, a [x]} '| FBtr0344900 42774384 43231 144 

5) calcola il nuovo sigaro, calcolando la lunghezza dell'introne come la formula aritmetica intron_length = (next_exon_start_coordinate - exon_length - previous_exon_start_coordinate) , in questo caso semplice sopra: intron_length = 43231-384-42774

  $ awk '{printf ("% s", $ 1)}; {for (i = 4; i< = NF; i + = 2) {printf ("% s% d% s% d", OFS, $ (i-1), OFS, $ i - $ (i-1) - $ (i-2))}}; {printf ("% s% d% s% s", OFS, $ NF, OFS, RS)} 'FBtr0344900 384 73 144  

6) idealmente, con un metodo che io capisci, modifico la stringa CIGAR (aggiungendo M, N alternati alla fine di ogni campo eccetto il primo), questo è l'aspetto del file finale:

  FBtr0344900 42774 384M73N144M  

Il problema del mio approccio di base è che:

  1. Non sono sicuro di come tenere conto del SAM basato su 1: devo aggiungere + 1 ad ogni exon_start_coordinate ? Non sembra, poiché l'uscita STAR ha la stessa identica stringa di sigari che ho calcolato sull'uscita STAR.
  2. GRANDE problema: questo funzionerà solo per le letture mappate nel filamento diretto: come renderlo fattibile con le letture mappate nel filamento inverso? Se mantengo il mio approccio attuale, avrò dimensioni di introni negative ...

Qualsiasi suggerimento è benvenuto!

Ti incoraggio vivamente a non farlo con i normali strumenti unix e invece di codificare qualcosa in Python (o qualunque lingua tu preferisca).
Userei un allineatore che emette un SAM corretto, come star, gmap, spaln o minimap2.
sì, ho già eseguito lo stesso allineamento con GMAP, STAR. abbiamo il sospetto che LAST possa funzionare abbastanza bene, ma per ora l'output non è direttamente utile. Proverò minimap2 (bello sapere che puoi usarlo anche per l'RNA)
@user172818 minimap2 funziona incredibilmente bene ... molte grazie per avermi reindirizzato ad esso
Una risposta:
winni2k
2018-11-18 14:35:09 UTC
view on stackexchange narkive permalink

Usa minimap2 in modalità di allineamento diviso per riallineare le letture.

Se questa non è un'opzione, potresti provare a utilizzare pysam per modificare le stringhe CIGAR. Non lo consiglio, poiché ci sono molte opportunità per bug sottili perché le specifiche SAM sono complesse. Dovresti:

  1. Ordinare il BAM sull'ID di lettura in modo da poter recuperare in modo efficiente le letture che desideri unire
  2. Iterare attraverso il BAM con pysam durante il caricamento di tutte le letture dello stesso ID di lettura
  3. Per ogni set di letture con lo stesso ID di lettura:
    1. Ordina le letture dello stesso ID di lettura per il numero di basi hard-clippate all'inizio della stringa CIGAR.
    2. Costruisci una nuova stringa CIGAR dalle stringhe CIGAR ordinate
    3. Unisci i meta tag dalle letture ordinate
    4. Scrivi un lettura unica, unita
L'ho fatto alla fine. A quel tempo, volevo solo riformattare gli allineamenti non giuntati da LAST (ad esempio) in allineamenti giuntati. Perché? Confronta il maggior numero di strumenti possibili. Ma va bene, alla fine ho rinunciato e ho semplicemente usato gli strumenti che già davano quell'allineamento unito direttamente.
È fantastico. Tuttavia, lo scopo di SE è aiutare anche altri che potrebbero avere problemi simili in futuro, fornendo risposte alle domande in modo che gli utenti possano votare a favore delle risposte. Se ritieni che la mia risposta sia buona alla domanda che hai posto, valuta la possibilità di votarla e accettarla.
Se ritieni che questa risposta non risponda alla domanda che avevi veramente, ti preghiamo di riscrivere la tua domanda per chiarezza.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...