SAMtools: SAM格式的處理利器

SAM及其相關工具

SAM格式介紹

SAM全稱是Sequence Alignment/Map, 是目前最常用的存放比對或聯配數據的格式。無論是重測序,還是轉錄組,還是表觀組,幾乎所有流程都會產生SAM/BAM文件作為中間步驟,然后是后續專門的分析過程。

以一個簡單的例子介紹.第一幅圖表示read和參考基因組比對可能出現的情況。r001/2表示paired end數據。r003是嵌合read,r004則是原序列打斷后比對結果。

原始數據

經過專門的比對軟件,如BWA,BOWTIE2等,得到的SAM文件如下所示,需要研究的就是如下這幾行。

比對后存放形式

術語和概念

在學習SAM格式之前,請確認自己是否對如下概念有清楚的認識|

  • read: 測序儀返回的原始序列.一個read可以包括多個segment。read之間的先后順序表示被測序儀讀到的時間前后關系.
  • segment: 一段連續的序列或子序列
  • linear alignment: 線性聯配表示一個read比對到單個參考序列,可以存在插入,缺失,跳過(skip),剪切(clip), 但是不存在方向改變的情況(比如說一部分和正向鏈聯配,另一個位置則是和負向鏈聯配)。最簡單的判斷的方式就是,一個linear alignment只用一行記錄。
  • chimeric alignment: 嵌合聯配需要多行記錄。比如說r003第一個記錄是后6個匹配,第二個記錄則是反向序列的后5個匹配。第一個被稱之為"representative",其他都是"supplementary"
  • read alignment: 無論是linear alignment, 還是chimeric alignment, 只要能完整表示一個read,都成為是read alignment
  • multiple mapping: 由于存在重復區,一個read 可能比對到參考基因組的不同區域。其中一個被認為是primary,其他都是secondary.
  • 兩個系統|1-based coordinate system(SAM,VCF,GFF,wiggle)和0-based coordinate system(BAM, BCFv2, BED, PSL).自行用R和Python感受一下兩者的不同。

chimeric alignment 可能是結構變異,基因融合,參考序列誤組裝,RNA-Seq,實驗protocol等因素造成。對于chimeric alignment的里面每一個linear alignment而言,由于相互之前不存在重疊,故而聯配質量較高,適合用于SNP/INDEL calling.相反, multiple mapping則是因為重復造成(read越長出現的概率越低), 相互之間存在重疊,僅有其中一條有最優的匹配,其他聯配質量過低會被SNP/INDEL caller忽略。

第一部分| SAM Header(非強制)

這個部分能夠被/^@[A-Z][A-Z](t[A-Za-z][A-Za-z0-9]:[ -~]+)+$//^@COt.*/這兩個表達式進行匹配。比如說你隨便有一個BAM文件(包含header),就能被這個表達式進行匹配。

samtools view -h S43S1-M_H3K5FDMXX_L1_sort.bam 
| awk '$0 ~ /^@[A-Z][A-Z](t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/ { print $0}'
header

其中第一行@HD,表示參考基因組的排序情況. 然后@SQ則是參考基因組的每一條序列的具體信息,命名和長度。@PG記錄運行的命令,以便你檢查代碼。對于GATK還需要提供@RG給出每個read所在group的信息,只要保證是獨一即可。

第二部分| 聯配必要信息

第二部分具體記錄每一個read的聯配結果,一共有11+n列。我將第二張圖的信息復制保存到test.sam中,僅僅看第一行

samtools view test.sam | head -n1 | tr 't' 'n' | nl
   1  r001                   # QNAME: read信息
   2  99                     # FLAG: 信息量大
   3  ref                    # RNAME: 參考序列
   4  7                      # POS:比對到的位置
   5  30                     # MAPQ: 比對質量
   6  8M2I4M1D3M             # CIGAR: 信息量大
   7  =                      # RNEXT: 配對read所在序列,=表示同一條序列
   8  37                     # PNEXT: 配對read所在位置
   9  39                     # TLENT: 觀察到的模板長度
  10  TTAGATAAAGGATACTG      # SEQ: segment序列
  11  *                      # QUAL: segment的質量
# *表示信息不存在

簡單解釋TLENT: 通過IGV可視化展示克制,TLENT相當于read發現了參考序列那些區域。如果是PE數據還可以推斷出文庫平均大小。

一個PE數據

IGV展示

詳細介紹FLAG: FLAG的主要目的就是用較少的記錄長度表示當前記錄的序列的匹配情況。相當于開關,僅有有無兩個狀態,有某個數值就表示序列符合某個情況。

flag 代表 具體含義
1(0x1) PAIRED 代表這個序列采用的是PE雙端測序
2(0x2) PROPER_PAIR 代表這個序列和參考序列完全匹配,沒有插入缺失
4(0x4) UNMAP 代表這個序列沒有mapping到參考序列上
8(0x8) MUNMAP 代表這個序列的另一端序列沒有比對到參考序列上,比如這條序列是R1,它對應的R2端序列沒有比對到參考序列上
16(0x10) REVERSE 代表這個序列比對到參考序列的負鏈上
32(0x20) MREVERSE 代表這個序列對應的另一端序列比對到參考序列的負鏈上
64(0x40) READ1 代表這個序列是R1端序列, read1;
128(0x80) READ2 代表這個序列是R2端序列,read2;
256(0x100) SECONDARY 代表這個序列不是主要的比對,一條序列可能比對到參考序列的多個位置,只有一個是首要的比對位置,其他都是次要的
512(0x200) QCFAIL 代表這個序列在QC時失敗了,被過濾不掉了(# 這個標簽不常用)
1024(0x400) DUP 代表這個序列是PCR重復序列(#這個標簽不常用)
2048(0x800) SUPPLEMENTARY 代表這個序列是補充的比對(#這個標簽具體什么意思,沒搞清楚,但是不常用)

舉例說明,比如說實例中的99=64+32+2+1, 也就是這個記錄所代表的read是來自于雙端測序R1,且匹配的非常好,對應的另一條鏈匹配到了負鏈(自己是正鏈)。而147=128+16+2+1則是表示這個記錄來自于雙端測序的R2,完全匹配到負鏈. 如果是163和83,你會發現163=147-16+32, 83=99-32+16,也就是剛好和前面的不同,也就是說R1匹配負鏈,R2匹配正鏈。如果是81和161,由于161=163-2,81=83-2. 表明這些read不是完全匹配,存在插入缺失

那么問題來了,如下是我某一次比對的flag的統計情況,你能看出什么來

小測試

常見的FLAGs:

  • 其中一條reads沒有map上: 73, 133, 89 121, 165, 181, 101, 117, 153, 185, 59, 137
  • 兩條reads都沒有map上: 77,141
  • 比對上了,方向也對,也在插入大小(insert size)內: 99, 147, 83, 163
  • 比對上了,也在插入大小(insert size)內, 但是反向不對:67, 131, 115, 179
  • 單一配對,就是插入大小(insert size)不對: 81, 161, 97, 145, 65, 129, 113, 177

FLAG僅僅存儲比對的大致情況,每條比對上的read的實際情況則是要用CIGAR進行記錄. 依舊舉幾個例子,比如說,這是雙端測序的一條read比對情況,其中一個是117表示沒有匹配上,所以記錄就是*,另一個是185表示這條序列完美匹配,所以記錄是150M.

ST-E00600:109:H3K5FALXX:2:1103:17996:34788      117     Chr1    38      0       *       =       38      0       TTTATACACTATGATTTTCAAAGTGAGAATCCGGTTTGTGGTTTATTGTTTTAGGTATTTAGTTATTAATGTATTTTGGATTTATTGATTTAGTGTTTTAGTGATTAATTATTCATTGTTTTAGTGTTTATGGTTTAGTGTTTAGGGTTT  J-7-J------JJJ7JJJ-J-J---JJ-----JJJJJ--J-JJJJ-----JJ--JJJJJJ-J--JJJ7JJ-7-J-J-777JJJJ777JJ7JJ77J7JJJJ7777JJ77777JJJ777J77J77J7JJJJ77JJJJJJJ7JJJJJJFFFAA  MC:Z:150M       AS:i:0  XS:i:0
ST-E00600:109:H3K5FALXX:2:1103:17996:34788      185     Chr1    38      60      150M    =       38      0       CATTAATCCCTAAATCCCTAAATCTTTAAATCCTACATCCATGAATCCCTAAATAACTAATTCCCTAAACCCGAAACCTGTTTCTCTGGTTGAAAATCATTGTGTATATAATGATAATTTTATCGTTTTTATGTAATTGCTTATTGTTTT  J-JJ7JJJ-JJJ7JJ--JJJ--JJ-JJJJJJ-JJJJJJ--J-JJJJJJJJJ--JJ-JJJJJJJ-JJJJ--J----J-J--JJJJJJ777JJJ77J7JJJJJJJ7JJJJJ7JJJJJ77JJJJJJ7JJ7JJJ7JJJJJJJJJJJJJJFFF<A  NM:i:4  MD:Z:1C53C22G69G1       AS:i:136        XS:i:0

來一個復雜的例子69H10M3I31M37H,表示150bp的讀長,先刪掉69個堿基,后面是10個匹配,后面相比較參考基因組有3個插入,隨后是31個匹配,最后再剔除37個基因,通過IGV查看在參考基因組的情況如下圖所示。

IGV查看FLAGS

我還發現這段區域存在特別多的clip,加載GFF查看注釋信息后發現這是內含子區域。

IGV檢查

實際上,CIGAR一共有9個字符,分別是M(alignment match),I(insertion),D(deletion),N(skip),S(soft clip),H(hard clip),P(padding),=(sequence match), X(sequence mismatch).值得提醒就是M表示序列能夠聯配,但是存在堿基不一致,=表示堿基相同。S和H一般用于read前后出現大部分的錯配,但是中間能夠聯配的情況,其中S表示序列會出現在SEQ中,H則不會出現在SEQ列中。

第三部分,可選信息

除了之前的11列必須要有的信息外,后面的其他列都是不同的比對軟件自定義的額外信息,稱之為標簽(TAG)。標簽的格式一般為TAG:TYPE:VALUE,比如說NM:i:4 MD:Z:1C53C22G69G1 AS:i:136 XS:i:0。這部分內容見http://samtools.github.io/hts-specs/SAMtags.pdf. 介紹幾個比較常見的標簽

  • NM: 編輯距離(edit distance)
  • MD: 錯配位置/堿基(mismatching positions/bases)
  • AS: 聯配得分(Alignment score)
  • BC: 條碼序列(barcode sequence)
  • XS: 次優聯配得分(suboptimal alignment score)

能用于處理SAM格式的工具們

后續演示所用數據通過如下方法獲取

# efetch下載參考基因組
mkdir -p ~/biostar/refs/ebola
cd ~/biostar
efetch -db=nuccore -format=fasta -id=AF086833 > ~/refs/ebola/1976.fa
REF=~/biostar/refs/ebola/1976.fa
# 構建索引
bwa index $REF
bowtie2-build $REF $REF
# 獲取10000行的fastq PE數據
mkdir -p ~/biostar/fastq
cd ~/biostar/fastq
fastq-dump -X 10000 --split-files SRR1972739
R1=~/biostar/fastq/SRR1972739_1.fastq
R2=~/biostar/fastq/SRR1972739_2.fastq

處理SAM的命令行工具有samtools,bamtools,picard,sambamba,samblaster等,其中samtoolsbamtoolspicard比較全能,功能中存在重疊,更多是互補,而sambambasamblaster則是運行速度更快,功能不太全。

使用SAMtools創建SAM,BAM和CRAM

SAM格式是目前用來存放大量核酸比對結果信息的通用格式,也是人類能夠“直接”閱讀的格式類型,而BAM和CRAM是為了方便傳輸,降低存儲壓力將SAM進行壓縮得到的格式形式。 為了高效處理SAM文件,李恒寫了配套的SAMtools, 文章在2009年發表在bioinformatics上,由于samtools的版本經常更新,如果有些工具用不了,你或許要更新版本了。

如果不加任何其他參數,比對軟件就能得到“標準”的SAM格式的文件。

bwa mem $REF $R1 $R2 > bwa.sam
bowtie2 -x $REF -1 $R1 -2 $R2 > bowtie.sam

原始SAM格式體積又大,沒有排序,不利于后續的分析操作,所以需要經過幾步的格式轉換成為BAM。1.3版本之后的samtools可以一步進行格式轉換和排序.

,BAM格式必須要建立索引才能快速讀取指定位置的信息。

# 1.3版本前
samtools view -bS bwa.sam > bwa.bam
samtools sort bwa.bam > bwa_sorted.bam
samtools index bwa_sorted.bam
# 1.3版本后
samtools sort bwa.sam > bwa_sorted.bam
samtools index bwa_sorted.bam

CRAM是比BAM壓縮更加高壓的格式,原因是它是基于一個參考序列,這樣子就能去掉很多冗余的內容。

samtools sort --reference $REF -O cram bwa.sam > bwa.cram
samtools index bwa.cram

這一小節學習了兩個samtools子命令:sortindex,前者能一邊排序一邊進行格式轉換,后者則是對BAM進行索引。

使用SAMtool查看/過濾/轉換SAM/BAM/CRAM文件

上一節得到的SAM/BAM/CRAM文件都可以用samtools的view進行更加復雜的操作,只不過要注意讀取CRAM格式需要提供參考序列,不然打不開。

samtools view bwa_sorted.bam
samtools view -T $REF bwa.cram

samtools的view在增加額外參數后能實現更多的操作,比如說SAM和BAM/CRAM之間的格式轉換(-b, -c, -T),過濾或提取出目標聯配(-t,-L ,-r,-R,-q,-l,-m,-f,-F,-G), 舉幾個例子說明

# 保留mapping quality 大于 10的結果
samtools view -q 10 bwa_sorted.bam -b -o bwa_sorted_mq10.bam
# 統計結果中恰當配對的結果(0x3 3 PARIED,PROPER_PAIR)
samtools view -c -f 3 bwa_sorted.bam
# 或反向選擇
samtools view -c -F 3 bwa_sorted.bam

使用PrettySam更好的可視化SAM文件

盡管我上面說SAM是適合人類閱讀的數據,但是直接讀SAM還是挺費腦子的。GitHub上有一個PrettySam能夠更好的展示SAM/BAM文件,雖然感覺沒多大實際效果,但是有利于我們方便了解SAM格式,項目地址為http://lindenb.github.io/jvarkit/PrettySam.html.

他的安裝比較麻煩,需要JDK版本為1.8且是Oracle, 以及GNU Make >=3.81, curl/wget, git 和 xslproc.安裝如下

git clone "https://github.com/lindenb/jvarkit.git"
cd jvarkit
make prettysam
cp dist/prettysam.jar ~/usr/jars/

使用起來非常簡單,效果也比較酷炫,比較適合演示用。

java -jar usr/jars/prettysam.jar ~/biostar/ebola.sam --colors
PrettySam

為SAM/BAM添加Read Groups

使用GATK分析BAM文件時需要BAM文件的header里有RG部分,@RG至少由三個記錄(ID,LB,SM)組成,需要根據實際情況增加。RG可以在前期比對時添加RG部分,也可以在后續處理時增加

TAG='@RG\tID:xzg\tSM:Ebola\tLB:patient_100'
# Add the tags during alignment
bwa mem -R $TAG $REF $R1 $R2 | samtools sort > bwa.bam
samtools index bwa.bam
# Add tags with samtools addreplacerg
samtools addreplacerg -r $TAG bwa_sorted.bam -o bwa_sorted_with_rg.bam

參考資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379