理解并操作BAM文件

經(jīng)過了第四節(jié)的長文,我想大家基本上已經(jīng)知道了一個(gè)WGS流程該如何構(gòu)建起來了吧同窘。但在那一節(jié)中限于篇幅有兩個(gè)很重要的文件我沒能展開來講喷鸽,分別是:BAM和VCF文件。這篇我們先說BAM文件稚晚。

什么是BAM

BAM是目前基因數(shù)據(jù)分析中最通用的比對(duì)數(shù)據(jù)存儲(chǔ)格式,它既適合于短read也適合于長read型诚,最長可以支持128Mbp的超大read客燕!除了后綴是.bam之外,有些同學(xué)可能還會(huì)看到.cram狰贯,甚至.sam后綴的文件也搓,其實(shí)它們一個(gè)是BAM的高壓縮格式(.cram)——IO效率比原來的BAM要略差;另一個(gè)是BAM的純文本格式(.sam)涵紊。當(dāng)然格式都是一樣的傍妒,因此為了描述上的清晰,我下面都統(tǒng)一用BAM摸柄。

BAM文件格式

其實(shí)一開始它的名字是SAM(The Sequencing Alignment/Map Format的英文簡稱)颤练,第一次出現(xiàn)的時(shí)候,它是bwa比對(duì)軟件的標(biāo)準(zhǔn)輸出文件驱负,但原生的SAM是純文本文件嗦玖,十分巨大(比如:一個(gè)人30x全基因組測序的sam大小超過600G),非常容易導(dǎo)致存儲(chǔ)空間爆滿跃脊!為了解決這個(gè)問題宇挫,bwa的開發(fā)者李恒(lh3)設(shè)計(jì)了一種比gz更加高效的壓縮算法,對(duì)其進(jìn)行壓縮匾乓,這就是我們所說的BAM捞稿,它的文件大小差不多只有原來的1/6。

在2007年拼缝,NGS技術(shù)剛剛興起之時(shí)娱局,各類短序列比對(duì)軟件層出不窮,輸出格式也是各有特點(diǎn)咧七,各家各有一套衰齐,并沒有什么真正的標(biāo)準(zhǔn)可言,可以說那是一個(gè)誰都說我最好的時(shí)期继阻。
但逐漸的耻涛,研究者們發(fā)現(xiàn)BAM格式對(duì)Mapping信息的記錄是最全面的,用起來也是最靈活的瘟檩。bwa的作者還為BAM文件開發(fā)了一個(gè)非常好用的工具包——Samtools抹缕,使得人們對(duì)BAM文件的處理變得十分便利,拓展性也變得非常強(qiáng)墨辛,后來還有類似于IGV等專門支持BAM的工具也越來越多卓研,因此它就逐漸成為了主流。

現(xiàn)在基本上所有的比對(duì)數(shù)據(jù)都是用BAM格式存儲(chǔ)的,儼然已經(jīng)成為了業(yè)內(nèi)的默認(rèn)標(biāo)準(zhǔn)奏赘。

在2013年寥闪,研究者們還專門將Samtools的處理核心剝離出來,并將其打包成為一個(gè)專門用于處理高通量數(shù)據(jù)的API——htslib磨淌,除了C語言版本之外還有Java和Python版本疲憋,這些在github上都能直接找到。后續(xù)許多與NGS數(shù)據(jù)處理有關(guān)的工具基本都會(huì)使用這個(gè)API進(jìn)行相關(guān)功能的開發(fā)梁只,可見其影響力缚柳。

ok,背景的介紹就先到此為止了敛纲,我們回歸主題喂击。下面這個(gè)圖是我從一份剛剛完成比對(duì)的bam文件中截取出來的內(nèi)容:

image

由于屏幕所限,無法把全部的內(nèi)容都包含進(jìn)來淤翔,特別是header信息翰绊,貼在這里僅是為了讓還沒見過BAM文件的同學(xué)們能夠?qū)λ幸粋€(gè)總體的感覺。

如果是SAM文件旁壮,同時(shí)你也熟悉linux操作的話监嗜,直接在linux終端用less打開即可(注意:不要試圖在本地使用文本編輯器,如vim等直接打開文件抡谐,會(huì)撐死機(jī)子的)裁奇,但如果我們要查看的是BAM,那么必須通過Samtools(可以到samtools的網(wǎng)站下載并安裝)麦撵。

$ less -SN in.sam          # 打開sam文件
$ samtools view -h in.bam  # 打開bam文件

BAM文件分為兩個(gè)部分:header和record刽肠。這里額外說一句,許多NGS組學(xué)數(shù)據(jù)的存儲(chǔ)格式都是由header和record兩部分組成的免胃。

以上例子音五,在samtools view中加上-h參數(shù)目的是為了同時(shí)把它的header輸出出來,如果沒有這個(gè)參數(shù)羔沙,那么header默認(rèn)是不顯示的躺涝。

image

header內(nèi)容不多,也不會(huì)太復(fù)雜扼雏,每一行都用‘@’ 符號(hào)開頭坚嗜,里面主要包含了版本信息,序列比對(duì)的參考序列信息诗充,如果是標(biāo)準(zhǔn)工具(bwa苍蔬,bowtie,picard)生成的BAM蝴蜓,一般還會(huì)包含生成該份文件的參數(shù)信息(如上圖)碟绑,@PG標(biāo)簽開頭的那些這里需要重點(diǎn)提一下的是header中的@RG也就是Read group信息,這是在做后續(xù)數(shù)據(jù)分析時(shí)專門用于區(qū)分不同樣本的重要信息。它的重要性還體現(xiàn)在蜈敢,如果原來樣本的測序深度比較深,一般會(huì)按照不同的lane分開比對(duì)汽抚,最后再合并在一起抓狭,那么這個(gè)時(shí)候你會(huì)在這個(gè)BAM文件中看到有多個(gè)RG,里面記錄了不同的lane造烁,甚至測序文庫的信息否过,唯一不變的一定是SM的sample信息,這樣合并后才能正確處理惭蟋。

其實(shí)苗桂,關(guān)于這一點(diǎn)我在上一篇文章中講序列比對(duì)時(shí)的也特意強(qiáng)調(diào)了這些方面,不記得的同學(xué)們也可以翻看上一篇的相關(guān)內(nèi)容告组。

接下來重點(diǎn)要說的是BAM的核心:record(有時(shí)候也叫alignment section煤伟,即,比對(duì)信息)木缝。這是我們通常所說的序列比對(duì)內(nèi)容便锨,每一行都是一條read比對(duì)信息,它的記錄看起來是這樣的:

image

我這里借用了網(wǎng)上的一張圖片來輔助說明我碟,recoed中的每一個(gè)信息都是用制表符tab分開的放案。

下面我們就來仔細(xì)瞧瞧這里的每一個(gè)信息分別都是什么。

image

以上矫俺,前11列是所有BAM文件中都必須要有的信息吱殉,而且從描述中我們也能夠比較清楚地知道其所代表的含義。但其中厘托,有幾個(gè)信息實(shí)在太重要了友雳,以至于我認(rèn)為有必要對(duì)其進(jìn)行詳細(xì)說明。

第一催烘,F(xiàn)lag信息

這是一個(gè)非常特別并且重要的數(shù)字沥阱,也是一個(gè)容易被忽視的數(shù)字,這可能和許多生信工程師也并不完全理解這個(gè)值有關(guān)伊群。許多同學(xué)在第一次看到其官方文檔中的描述之后依然會(huì)覺得十分困惑考杉,但它里面實(shí)際上記錄了許多有關(guān)read比對(duì)情況的信息。想要讀懂它的一個(gè)關(guān)鍵點(diǎn)是我們不能夠?qū)⑵湟暈橐粋€(gè)數(shù)字舰始,而是必須將其轉(zhuǎn)換為一串由0和1組成的二進(jìn)制碼崇棠,這一串二進(jìn)制數(shù)中的每一個(gè)位(注意是“位”,bit的意思)都代表了一個(gè)特定信息丸卷,它一共有12位(以前只有8位)枕稀,所以一般會(huì)用一個(gè)16位的整數(shù)來代表,這個(gè)整數(shù)的值就是12個(gè)0和1的組合計(jì)算得來的,因此它的數(shù)值范圍是0~2048(2的12次方萎坷,計(jì)算機(jī)科學(xué)的同學(xué)對(duì)這種計(jì)算應(yīng)該不陌生)凹联。

那么下面我就結(jié)合其文檔和自己的實(shí)踐經(jīng)驗(yàn)對(duì)這12個(gè)位的含義用更加通俗易懂的語言來重新描述,如下表:

image

所以哆档,通過上面這個(gè)表的信息蔽挠,我們就可以清楚地知道每一個(gè)FLAG中都包含了什么信息。比如看到FLAG = 77時(shí)瓜浸,我們第一步要做的就是將其分解為二進(jìn)制序列(也可以理解為分解成若干個(gè)2的n次方之和):

77 = 000001001101 = 1 + 4 + 8 +64澳淑,這樣就得到了這個(gè)FLAG包含的意思:PE read,read比對(duì)不上參考序列插佛,它的配對(duì)read也同樣比不上參考序列杠巡,它是read1。

當(dāng)然雇寇,如果你希望自己在程序中寫一段處理FLAG的代碼氢拥,那么顯然是不會(huì)像我們這個(gè)例子那樣去分解這個(gè)整數(shù)的,多麻煩跋呛睢兄一!那么該如何做呢?其實(shí)也很簡單识腿,比如我們要獲得其中某個(gè)位(假設(shè)第N位)的值——只需要將這個(gè)FLAG值和2的N次方做與的運(yùn)算即可出革。在與運(yùn)算時(shí),F(xiàn)LAG值首先會(huì)被轉(zhuǎn)換成一串二進(jìn)制序列(如77=000001001101)渡讼,而2的N次方除了第N位是1之外骂束,其它的都是0,“與”了之后其它信息就會(huì)被屏蔽掉成箫。比如展箱,我們想知道該read是否比對(duì)上了參考序列,那么只需要計(jì)算FLAG & 4 的值就行了蹬昌,如果結(jié)果是1那么就是比對(duì)上了混驰,如果是0則代表沒有比上。

不過皂贩,在實(shí)際工作中栖榨,除非遇到特殊的情況,否則我一般更推薦調(diào)用官方的htslib這個(gè)包來協(xié)助處理明刷,它是一個(gè)C語言庫婴栽,如果你用Python,則是pysam——htslib的python包(Java則是htsjdk)辈末,包中已經(jīng)幫我們做了這些處理愚争,可以直接得到結(jié)果映皆,下一篇文章里我會(huì)用pysam舉例說明如何用它來操作bam文件。

另外轰枝,下面這一段代碼是htslib(samtools的核心庫)中定義的12個(gè)與flag值進(jìn)行與操作獲取對(duì)應(yīng)位信息的變量捅彻,感興趣的同學(xué)可以再htslib里面的sam.h文件中找到,在做一些需要觸達(dá)基礎(chǔ)性原理的開發(fā)時(shí)或許你會(huì)用到鞍陨。

/*! @abstract the read is paired in sequencing, no matter whether it is mapped in a pair */

#define BAM_FPAIRED        1

/*! @abstract the read is mapped in a proper pair */
#define BAM_FPROPER_PAIR   2

/*! @abstract the read itself is unmapped; conflictive with BAM_FPROPER_PAIR */
#define BAM_FUNMAP         4

/*! @abstract the mate is unmapped */
#define BAM_FMUNMAP        8

/*! @abstract the read is mapped to the reverse strand */
#define BAM_FREVERSE      16

/*! @abstract the mate is mapped to the reverse strand */
#define BAM_FMREVERSE     32

/*! @abstract this is read1 */
#define BAM_FREAD1        64

/*! @abstract this is read2 */
#define BAM_FREAD2       128

/*! @abstract not primary alignment */
#define BAM_FSECONDARY   256

/*! @abstract QC failure */
#define BAM_FQCFAIL      512

/*! @abstract optical or PCR duplicate */
#define BAM_FDUP        1024

/*! @abstract supplementary alignment */
#define BAM_FSUPPLEMENTARY 2048

第二沟饥,CIGAR

CIGAR是CompactIdiosyncraticGappedAlignmentReport的首字母縮寫,稱為“雪茄”字符串湾戳。
作為一個(gè)字符串,它用數(shù)字和幾個(gè)字符的組合形象記錄了read比對(duì)到參考序列上的細(xì)節(jié)情況广料,讀起來要比FLAG直觀友好許多砾脑,只是記錄的是不同的信息。比如艾杏,一條150bp長的read比對(duì)到基因組之后韧衣,假如看到它的CIGAR字符串為:33S117M,其意思是說在比對(duì)的時(shí)候這條read開頭的33bp在被跳過了(S)购桑,緊接其后的117bp則比對(duì)上了參考序列(M)畅铭。這里的S代表軟跳過(Soft clip),M代表匹配(Match)勃蜘。CIGAR的標(biāo)記字符有“MIDNSHP=XB”這10個(gè)硕噩,分別代表read比對(duì)時(shí)的不同情況:

image

除了最后‘=XB’非常少見之外,其它的標(biāo)記符通常都會(huì)在實(shí)際的BAM文件中碰到缭贡。另外炉擅,對(duì)于M還是再強(qiáng)調(diào)一次,CIGAR中的M阳惹,不能覺得它代表的是匹配就以為是百分百?zèng)]有任何miss-match谍失,這是不對(duì)的,多態(tài)性堿基或者單堿基錯(cuò)配也是用M標(biāo)記莹汤!

第三快鱼,MAPQ,比對(duì)質(zhì)量值

這個(gè)值同樣非常重要纲岭,它告訴我們的是這個(gè)read比對(duì)到參考序列上這個(gè)位置的可靠程度抹竹,用錯(cuò)誤比對(duì)到該位置的概率值(轉(zhuǎn)化為Phred scale)來描述:-10logP{錯(cuò)比概率}。因此MAPQ(mapping quality)值大于30就意味著錯(cuò)比概率低于0.001(千分之一)止潮,這個(gè)值也是我們衡量read比對(duì)質(zhì)量的一個(gè)重要因子柒莉。

剩下的幾列在上面的格式表中描述的也比較清楚,基本沒有過于隱藏的信息沽翔,因此我就不打算再一一細(xì)說了兢孝,如果大家依然有困惑可以到后臺(tái)留言窿凤。

此外,細(xì)心的同學(xué)可能也已經(jīng)發(fā)現(xiàn)了:fastq的所有信息都被涵蓋到了BAM文件中了跨蟹,包括比對(duì)不上的read也在雳殊,因此獲得了BAM其實(shí)也等于獲得了所有的read。而且窗轩,fastq有時(shí)也會(huì)被轉(zhuǎn)換成一種uBam文件夯秃,指的就是un-mapping BAM——沒有做過比對(duì)的BAM文件。它相比于Fastq可以用metadata存儲(chǔ)更多有用的信息痢艺,不過這不是我們這篇文章想說的內(nèi)容仓洼。

最后,還是再說明一次:BAM文件中除了必須的前11列信息之外堤舒,不同的BAM文件中后面記錄metadata的列是不固定的色建,在不同的處理軟件中輸出時(shí)也會(huì)有所不同,我們也可以依據(jù)實(shí)際的情況增刪不同的metadata信息舌缤。

使用samtools view查看BAM文件

BAM文件由于是特殊的二進(jìn)制格式箕戳,因此沒辦法通過文本的形式直接打開,要用samtools的view功能在終端上進(jìn)行查看(上文也已經(jīng)說到這里在進(jìn)行系統(tǒng)補(bǔ)充)国撵,如:

$ samtools view in.bam

如果不想從頭開始看陵吸,希望快速地跳轉(zhuǎn)到基因組的其它位置上,比如chr22染色體介牙,那么可以先用samtools index生成BAM文件的索引(如果已經(jīng)有索引文件則不需該步驟)壮虫,然后這樣操作:

$ samtools index in.bam  # 生成in.bam的索引文件in.bam.bai
$ samtools view in.bam chr22            # 跳轉(zhuǎn)到chr22染色體
$ samtools view in.bam chr22:16050103   # 跳轉(zhuǎn)到chr22:16050103位置
$ samtools view in.bam chr22:16050103-16050103  # 只查看該位置

IGV或者samtools tview查看比對(duì)情況

以上,我基本上列舉了我們會(huì)在終端上如何查看BAM文件的幾個(gè)最常用操作环础。但如果你想更直觀查看的BAM文件旨指,IGV是目前最好的一個(gè)選擇,但僅適合于文件還比較小的情況喳整,效果如下:

image

如果你的BAM文件很大谆构,都超過了你的本地電腦磁盤了,你還是想看該怎么辦框都?你有兩個(gè)選擇:

第一搬素,把你想查看的那部分區(qū)域用samtools view提取出來,生成一份小一些的BAM魏保,然后下載下來熬尺,在導(dǎo)入到IGV中。

$ samtools view -h in.bam chr22:16050103-16050203 | samtools view -Sb - > small.bam

第二谓罗,不下載粱哼,直接在終端用samtools tview進(jìn)行查看。samtools tview有類似于IGV的功能檩咱,雖然體驗(yàn)會(huì)稍差一些揭措。

$ samtools tview --reference hg38.fa in.bam

image

在該模式下胯舷,按下鍵盤‘g’后,會(huì)跳出一個(gè)Goto框绊含,在里面輸入想要調(diào)整過去的位置桑嘶,就行了,比如:

image

按下esc鍵則可以取消躬充。另外逃顶,為了節(jié)省空間,加快查詢效率充甚,read中與參考序列相同的部分被用一串串不同顏色的點(diǎn)表示以政,只留下miss-match的堿基和發(fā)生indel變異的區(qū)域。其中圓點(diǎn)表示正鏈比對(duì)伴找,逗號(hào)表示負(fù)鏈比對(duì)盈蛮。不同的顏色代表不同的比對(duì)質(zhì)量值:白色>=30,黃色20-29疆瑰,綠色10-19,藍(lán)色0-9昙啄。如果你還想知道的其他的功能穆役,可以在tview模式里按下“?”問號(hào),就會(huì)彈出類似下面這樣的幫助窗口梳凛,然后按照指引做就行了耿币。

image

雖然看起來不如IGV體驗(yàn)?zāi)菢雍茫δ芤脖容^單一(僅可以查看比對(duì)情況)韧拒,但可貴之處在于可以在終端里面直接操作淹接,當(dāng)需要快速查看某個(gè)位置的比對(duì)情況時(shí),操作效率非常高叛溢。而如果要退出該模式塑悼,也非常簡單,按下q鍵就可以了楷掉。

小結(jié)

那么厢蒜,有關(guān)BAM格式的內(nèi)容我們就暫且先到這里吧,大家如果有疑惑或者感興趣的內(nèi)容都可以到后臺(tái)留言烹植,我都會(huì)定時(shí)進(jìn)行回復(fù)斑鸦。在下一篇文章中,我們將重點(diǎn)介紹如何使用pysam來操作bam文件了草雕。

原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巷屿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子墩虹,更是在濱河造成了極大的恐慌嘱巾,老刑警劉巖憨琳,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浓冒,居然都是意外死亡栽渴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門稳懒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闲擦,“玉大人,你說我怎么就攤上這事场梆∈洌” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵或油,是天一觀的道長寞忿。 經(jīng)常有香客問我,道長顶岸,這世上最難降的妖魔是什么腔彰? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮辖佣,結(jié)果婚禮上霹抛,老公的妹妹穿的比我還像新娘。我一直安慰自己卷谈,他們只是感情好杯拐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著世蔗,像睡著了一般端逼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上污淋,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天顶滩,我揣著相機(jī)與錄音,去河邊找鬼寸爆。 笑死诲祸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的而昨。 我是一名探鬼主播救氯,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歌憨!你這毒婦竟也來了着憨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤务嫡,失蹤者是張志新(化名)和其女友劉穎甲抖,沒想到半個(gè)月后漆改,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡准谚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年挫剑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柱衔。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡樊破,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唆铐,到底是詐尸還是另有隱情哲戚,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布艾岂,位于F島的核電站顺少,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏王浴。R本人自食惡果不足惜脆炎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓辣。 院中可真熱鬧秒裕,春花似錦、人聲如沸筛婉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爽撒。三九已至,卻和暖如春响蓉,著一層夾襖步出監(jiān)牢的瞬間硕勿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工枫甲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留源武,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓想幻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牵署,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容