題:
從BWA mem對齊獲取唯一映射的讀取
gringer
2017-06-07 03:23:31 UTC
view on stackexchange narkive permalink

這是基於BioStars上 betsy.s.collins的問題。您可以在此處

找到原始帖子。有人對BWA生成的BAM文件中的其他標籤或過濾步驟有任何建議嗎?映射到一個位置?一個示例應用程序是為 TULIP彙編器/腳手架找到種子,該種子最適合映射到獨特基因組位置的讀段。

“唯一映射讀段”的概念是負載術語,大多數資料來源都建議通過MAPQ進行過濾。但是,將BWA用作讀取映射器時,這種方法似乎不起作用。

我對這篇文章有些不滿意,主要是為了評估社區是否認為這樣做是個好主意。這是一個新用戶剛剛在BioStars上提出的問題。這個問題非常具體,背後有很多很好的故事,因此我認為它非常適合Stack Exchange模型。
當進行依賴於讀數定量而不是僅僅覆蓋範圍(例如RNASeq)的分析時,有時首選唯一映射的讀數(即映射到基因組中單個位置的讀數)。重複的讀取需要在分析方面進行額外的過濾或規範化,並且大多數下游程序不會考慮諸如“染色體5某處*此處*的五分之一的讀取映射,以及染色體5某處*此處*的五分之四的讀取映射的概念。第14號染色體。”
發問者指的是基因組唯一的比對,它不同於單個位置上的多個可能的比對。如果唯一的多個比對在相同的基因組位置,則這些比對在基因組意義上仍然是唯一的。無法找到準確,正確的比對是一個眾所周知的問題,並且有一些下游方法(例如左歸一化)來確保多個局部比對和/或測序錯誤的影響減小。
謝謝。如果確實想從其他地方逐字複製文本,則應始終將其放在引號塊中(使用編輯器或在行的開頭添加“>”)以清楚地表明該文本已被引用。如果不是這樣,即使您(確實如此)引用了來源,您也極有可能因抄襲而刪除您的帖子。
原始海報現在已經回復了生物明星,並提到她將使用MAPQ過濾(以​​及刪除補充序列)。
她還提到她的“實際”問題是關於Geneious和BWA映射不一樣的(如果有人讀到發布的“文本牆”,這是可以理解的)。即使排除乘法映射讀取也無法解決此問題。
二 答案:
gringer
2017-06-07 09:21:29 UTC
view on stackexchange narkive permalink

要從BWA映射的BAM文件中排除所有可能的多映射讀取,看來您需要在未壓縮的SAM字段上使用 grep

  samtools視圖-h mapping.bam | grep -v -e'XA:Z:'-e'SA:Z:'| samtools視圖-b > unique_mapped.bam  

解釋如下……

我將假設一種情況,其中有一個生物信息學家被提供了一個映射的BAM文件。由BWA製作,無法獲得原始讀物。一種高效的解決方案是從BAM文件中提取映射的讀段,並使用使用MAPQ得分指示多個映射的其他映射器重新映射。

...

我對BWA輸出的理解是,如果讀段完美地映射到多個基因組位置,則兩個位置的映射質量(MAPQ)得分都很高。許多人期望映射到至少兩個位置的讀段最多(最多)有50%的概率映射到這些位置之一(即MAPQ = 3)。由於BWA不會這樣做,因此很難使用適用於其他對齊程序的MAPQ過濾器從BWA結果中過濾出多映射讀取。這很可能就是為什麼Biostars []上當前答案不起作用的原因。

下面是我從BWA mem對齊中獲得的示例行剛剛做了。這些是Illumina的讀取映射到具有很多重複序列的寄生蟲基因組:

  ERR063640.7 16 tig00019544 79974 21 21M2I56M1I20M * 0 0 TATCACATATCATCCGACTCAGCTCGACGAGTACAATGCTAATTTAACACTTAGAATGCCCGGCAATGAAATTCGTTTTCCGTCAATTCTTGAAAATTTC <AABBEGABFJKKKIM7GHKKJK>JLKLDGMHLIMIHHCGIJKKLJKLNJGLLLKLILKLMFNDLKGHJEKMKKMIJHGLOJLLLKIJLKKJEJLIGG>D NM:ⅰ :4 MD:Z:83A13 AS:i:77 XS:i:67 XA:Z:tig00019544,-78808,21M2I56M1I20M,6; tig00019544,-84624,79M1I20M,6; tig00019544,-79312,33M4I42M1I20M,8;  代碼> 

BWA mem已發現該特定讀物ERR063460.7映射到至少三個不同的位置:tig00019544,tig00019544和tig00019544。請注意,此讀取的MAPQ為21,因此即使讀取映射到多個位置,也不能使用MAPQ來確定。

但是,通過 XA 標記。也許只對包含 XA 標記的行進行過濾就可以排除乘法映射讀取。 samtools視圖手冊頁建議 -x 將過濾出特定標記:

  $ samtools視圖-x XA output.bam |的grep'^ ERR063640 \ 0.7 [[:空間:]]'ERR063640.7 16 tig00019544 79974 21 21M2I56M1I20M * 0 0 TATCACATATCATCCGACTCAGCTCGACGAGTACAATGCTAATTTAACACTTAGAATGCCCGGCAATGAAATTCGTTTTCCGTCAATTCTTGAAAATTTC <AABBEGABFJKKKIM7GHKKJK>JLKLDGMHLIMIHHCGIJKKLJKLNJGLLLKLILKLMFNDLKGHJEKMKKMIJHGLOJLLLKIJLKKJEJLIGG>D NM:I:4 MD:Z:83A13為:I:77 XS:I:67 代碼> 

...,因此它過濾出了標籤(即,該標籤不再存在於SAM輸出中),但沒有過濾出 read 。在FLAG字段中沒有有用的位來指示多個基因組映射(我知道也可以過濾以排除讀取的序列),因此我不得不求助於其他措施。

在這種特殊情況下,我可以在未壓縮的SAM輸出上使用 grep -v 來排除具有 XA 標記的對齊行(並在以後重新壓縮為BAM,以便保持整潔):

  $ samtools視圖-h output.bam | grep -v'XA:Z:'| samtools視圖-b > output_filtered.bam $ samtools視圖output_filtered.bam | grep'^ ERR063640 \ .7 [[:space:]]'<no output>  

萬歲!讀取已過濾。稍微說一下,此 grep 搜索具有相當大的計算量:它正在一行中某處尋找帶有文本 XA:Z:的字符串。實際捕獲所有情況。某些受虐狂可能會在以後出現,並決定將其所有讀物稱為 HAXXA:Z:AWESOME!:<readNumber> ,在這種情況下,需要對該grep搜索進行調整確保在 XA:Z:之前有一個空格(或更具體地說,是製表符)。

現在,我要檢查 any 重複的讀取名稱,只是為了確保:

  $ samtools視圖output_filtered.bam | awk'{print $ 1}'|排序Uniq -dERR063640.1194ERR063640.1429ERR063640.1761ERR063640.2336ERR063640.2825ERR063640.3458ERR063640.4421ERR063640.4474ERR063640.4888ERRERR640640.49ERR063640.4974ERR063640.5070ERR063640.5130ERR063640.5300ERR063640.5868ERRERR640.6116ERR063640.6063ERR063640.606306306306306306306306306306306306306306363 7900ERR063640.8115ERR063640.8405ERR063640.911ERR063640.9206ERR063640.9765ERR063640.9986  

哦...該死。我想知道它們是什麼:

  $ samtools視圖output_filtered.bam |的grep'^ ERR063640.3458 [[:空間:]]'ERR063640.3458 16 tig00002961 5402 60 58S38M * 0 0 AGGTACCATTCGATAGAGGGAGAAAGGCACTACTAAAGATTTTGCCACATTTGCTATATCCGTATCGCGAAGATCAGGACTTACTCCGCAGAAGAA DD6HFFJBKFH = KDILKLGLJEKLKGFJIH8IKHLLMJEK:L:HBGJIHJKFLLKIHJDHLNKCK; KMKGMFKJILIIIMKI9JLKKHEJFII CC NM:I:0 MD:Z:38 AS:ⅰ :38 XS:I:0 SA:Z:tig00002377,202353, - ,14M3I5M1I35M38S,19,5; ERR063640.3458 2064 tig00002377 202353 19 14M3I5M1I35M38H * 0 0 AGGTACCATTCGATAGAGGGAGAAAGGCACTACTAAAGATTTTGCCACATTTGCTATA DD6HFFJBKFH = KDILKLGLJEKLKGFJIH8IKHLLMJEK:L:HBGJIHJKFLLKIHJ NM:I:5 MD位:Z :5G48 AS:i:35 XS:i:27 SA:Z:tig00002961,5402,-,58S38M,60,0; ​​ 

啊哈!補充比對,它使用 official SA 標籤[嵌合比對中的其他規範比對]。這些情況似乎是單個讀取被拆分並映射到多個位置的情況。請注意,在這種情況下, 這兩個比對的MAPQ得分仍然超過3 。聽起來,發問者也希望擺脫這些情況。這次,也有標準標誌字段來處理這些情況(0x800:輔助對齊)。僅僅過濾補充對齊是不夠的,因為應該刪除兩者讀取映射,而不是僅僅刪除那些偶然被標記為輔助映射的映射。

幸運的是,BWA似乎將 SA 標記放入包含補充比對的所有讀取中(如果不是這種情況,我相信有人會對此進行糾正)。因此,我在 SA 搜索中添加了一個附加的 grep 過濾器:

  $ samtools視圖-h output.bam | grep -v -e'XA:Z:'-e'SA:Z:'| samtools視圖-b > output_filtered.bam $ samtools視圖output_filtered.bam | awk'{print $ 1}'|排序uniq -d<no output>  

完成。十分簡單! < / sarcasm>

......使用不同的定位器的原始“高效”解決方案現在看起來還不錯。

這是一個很好的解決方案,並且得到了充分的論證。如果您將整個內容壓縮到幾行shell腳本中,我也不認為需要付出很大的努力。 :)
SA表示補充對齊方式,而不是輔助對齊方式。
使用MAPQ過濾出多重映射器的事情是,它使用了多重映射器的假設,即“相等的映射良好”,即使對於此處介紹的示例也是如此。我已將您的回復設置為生物之星上的可接受答案,但要求操作人員澄清確切的要求。
是的,如果您知道會發生什麼,這並不難,這就是為什麼我嘗試解決所有可能發生的問題的原因。
關於可能包含“ XA:Z:”的讀取名稱,一種實現魯棒性的方法是使用適當的SAM格式解析器(例如pysam)(如果一個程序使用python而不是grep)。我不知道這會慢多少。
或者像我嘗試過的“ samtools view”一樣,但是沒有達到我的預期。我可以想像samtools將來可能會實現類似標籤過濾器的功能。也許已經有了,而我只是使用了錯誤的子工具。
好的,因此samtools中尚不可用,但是至少在[一期]中已經提出了進行標籤過濾的想法(https://github.com/samtools/samtools/issues/665#issuecomment-293926546)
最壞的情況是,您可以編寫幾行python,或者可能使用Pierre的jvarkit過濾掉內容。
Samir
2018-06-22 07:09:02 UTC
view on stackexchange narkive permalink

對於更快,更穩定的 $ sup>實現,sambamba可以使用以下一種方法來處理此問題:

  sambamba視圖-t 12 -h -f bam -F “ mapping_quality > = 1,而不是(未映射或secondary_alignment),並且不是([XA]!= null或[SA]!= null)”。test.bwa-mem.bam -o test-uniq.bam  有關進一步使用的詳細信息,請參見手冊 sambamba synatx

$:除了 grep 緩慢的搜索,可能會返回錯誤的正 del>否定命中(上面@gringer的回复)。我也不認為基於 awk 的方法可靠,因為XA,SA等字段是 SAM格式的可選字段,而不是按位置固定的字段。

命中率以什麼方式誤報?
嗯..我猜應該是假陰性,因為您用`grep -v`排除了這些搜索模式,對嗎?
grep產生錯誤結果的唯一可能方法是,如果有人修改了讀取名稱或讀取組以包含這些字符串之一,這似乎不太可能。
同意,這是不太可能的,但是基於grep的方法本質上是緩慢的。
最慢的部分是通過samtools view從BAM到SAM的轉換。 grep程序執行起來非常快。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...