題:
子集較小的BAM,以包含來自多個染色體的數千行
EB2127
2018-02-17 18:00:18 UTC
view on stackexchange narkive permalink

在很多情況下,我想將BAM子集化以創建一個小文件以便進行處理(例如算法測試,調試等)。

通常,我會執行以下操作子集BAM file.bam ,並保留標題

  samtools視圖-H file.bam >​​ header.samsamtools視圖file.bam |頭-n 5000 | cat header.sam-| samtools視圖-Sb->​​ file.unique.bam  

在這種情況下,我希望1號染色體上有5000行,2號染色體上有5000行。

我可以先嘗試按單個染色體進行grepping,然後結合兩個SAM

例如這是帶有grepped的chr1和(錯誤但完整的)標題的完整BAM

  samtools視圖-H file.bam >​​ header.samsamtools視圖file.bam | grep“ chr1” | cat header.sam-| samtools視圖-Sb->​​ file.unique.bam  

,但是然後我遇到兩個問題:

(1)我可能沒有將對2號染色體的比對重新定位-可能存在包含'chr2'但不對齊的BAM行。

(2)我認為必須手動編輯標題。可能無法解決此問題。

生物信息學有一種簡單的方法嗎?

五 答案:
Devon Ryan
2018-02-17 18:29:12 UTC
view on stackexchange narkive permalink

如果您不太希望精確讀取5000個數字,則可以使用一個samtools命令執行此操作:

  samtools視圖-bosubset.bam -s 123.4對齊方式。 bam chr1 chr2  

這將選擇40%的讀物( .4 部分)( 123 是種子,即便於重現)。方便的部分是,如果您具有配對末端讀段,它將使伴侶保持配對。對於每條染色體5000個讀數,只需將 .4 部分更改為足夠小的數字即可。

通常,您實際上不需要對標頭進行子集化。如果這樣做,某些工具的性能會更好一些,但是無論如何,您通常都會得到相同的結果。

Karel Brinda
2018-02-27 04:30:15 UTC
view on stackexchange narkive permalink

您可以使用 SAMsift

  samsift \ -i文件。bam\ -0'c = {“ chr1”:5000,“ chr2”:5000 }'\ -f'c [RNAME] >0'\ -c'c [RNAME]-= 1'\ -m不間斷刪除 

說明:

  • -i file.bam –輸入文件
  • -0'c = {“ chr1”:5000,“ chr2”:5000}' –初始化(為感興趣的染色體創建一個遞減計數字典)
  • -f'c [RNAME] >0' –過濾條件(是當前染色體的計數器還是> 0?)
  • -c'c [RNAME]-= 1' –代碼遞減當前染色體的計數(5000-> 4999-> ...- > 1-> 0-> -1-> ...)
  • -m nonstop-remove –刪除導致Python錯誤且不停止的行(在這種情況下,訪問另一個染色體的不存在計數器(例如chr3)可能會導致錯誤。

有關更多信息,請參見 SAMsift自述文件

如果您可以添加一些解釋,說明這些選項是什麼以及為什麼需要這些選項。例如我不明白為什麼f的參數是c [RNAME]而不是其他東西
我剛剛添加了解釋。
Ian Sudbery
2018-02-17 21:20:09 UTC
view on stackexchange narkive permalink

我通常會推薦Devon Ryan的答案。但是,如果您確實希望每個Chr具有相同的數字,則可以使用以下python / pysam代碼(將從每個Chr輸出大約5000):

  from pysam import AlignmentFilefrom隨機導入randomnreads = 5000infile = AlignmentFile(” mybam.bam“)outfile = AlignmentFile(” outbam.bam“,” wb“,template = infile)for inhr中的chr。reference_names:reads_in_chr = infile.count(chr)frac = float(nreads)/ reads_in_chr count = 0#-將該循環替換為恰好5000次的第一次讀取-#讀取infile.fetch(chr,multiple_iterators = True):如果random() < frac:count + = 1 outfile.write(read)print(“輸出的%i從%s讀取”%(count,chr))outfile.close() 

染色體。如果只想使用,請說chr1和chr2用 [“ chr1”,“ chr2”] 替換 infile.reference_names

如果需要從每個chr精確地讀取5000次,但是不管它們是否是第一個,那麼您可以將內部for循環替換為:

 對於infile.fetch(chr,multiple_iterators = True)讀入:如果count > = nreads,則計數+ = 1:如果需要這些文件的伙伴,則打破outfile.write(read) 

同時讀取,您可以在 outfile.write(read)之後添加以下內容:

  mate_read = infile.mate( read)outfile.write(mate_read) 

請注意,這很慢。

為了加快速度,可以用解析idxstats()代替infile.count(chr)(除非使用CRAM文件)。
謝謝,我以為會有一種簡單的方法可以從索引中獲取數據。
“為了加快速度,可以用解析idxstats()代替infile.count(chr)”我不太關注。上面是什麼樣子?
Pierre
2018-02-19 19:49:23 UTC
view on stackexchange narkive permalink

使用 samjdk http://lindenb.github.io/jvarkit/SamJdk.html

  $ java -jar dist /samjdk.jar --body -e \'Map<String,Integer> c = new HashMap<>();公共對象apply(SAMRecord r){int n = c.getOrDefault(r.getContig(),0); if(n> = 5000)返回false; c.put(r.getContig(),n + 1); return r;}'\ input.bam  
如果人們不滿意的答案能解釋他們這樣做的原因,那將是很好的……
@Devon(到目前為止,我已經看到了評論)我之所以投票,是因為我發現一長行代碼通常不易解釋其內部功能通常很難理解,按原樣編寫該代碼將大大改善幾行並帶有註釋的(IMHO) 。對我來說我不懂Java很難理解發生了什麼
Konrad Rudolph
2018-02-20 21:08:42 UTC
view on stackexchange narkive permalink

如果您只想創建帶有標頭的截斷的BAM文件,則可以顯著簡化原始代碼:

 (samtools視圖-H input.bam; samtools視圖input.bam |頭-5000)| samtools -bo output.bam  

此命令避免了中間文件的調用,並減少了一些無用的中間命令的調用,而以子外殼為代價(由(…)調用)

如上所述,但格式如下:

 (samtools視圖-H input.bam samtools視圖input.bam | head -5000#(*))\ | samtools -bo output.bam  

…當然,可以通過將上面標有(*)的行替換為一個或多個,將其擴展為通過多條染色體進行過濾按染色體名稱子集劃分的行( x ,如果已為原始BAM文件建立索引,則不需要 grep !)

是同時-bo`嗎?


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