一、sam、bam簡介
1、sam
Sequence Alignment/Map format,直譯就是序列比對格式;
-
序列比對是測序結果分析中最基礎的一步操作,它主要基于參考序列信息回答了每條reads來自人的哪條染色體的哪個區域;
sequence mapping 目前的比對軟件很多,例如bwa,star,bowtie2,算法也各有差異,但究其比對結果都是以sam純文本格式展現;
在sam格式中,對比對情況、比對質量、PE雙端比對等各種比對可能結果都有全面的記錄,具體會在下面介紹。
2、bam
- 簡單來說,bam格式就是sam的二進制版本;
- 因為,sam最大的缺點就是文件體積太大,而bam格式可完整保留sam信息同時,可明顯降低文件大?。凰砸话銉H保留bam文件進行后續分析。
- samtools可實現sam與bam間的轉換,以及查看bam內容,具體操作示例見筆記最后
3、序列比對小例子
-
如下圖所示,準確來說是5條reads的比對結果,其中具體比對情況為--
image.png
(1)r001/1與r001/2是PE測序的pair/mate reads,現在遇到的基本都是雙端測序;
(2)r002、r003、r004都是單獨的一條read(在這個圖片結果是這樣,也許對應的pair reads比對到很遠的位置,甚至其它染色體上);
(3)r003出現兩次是因為其可比對到參考序列的不同位置,但是注意 -r003表示是其reverse reads比對上的;
(4)reads序列中的大寫字母表示與參考序列對應堿基相同,小寫字母則表示不一致;星號或點號表示考慮insert/delete情況,reads才能比對到參考序列中; -
而sam格式有系統的規則,可簡潔、全面的描述上述比對結果,如下圖所示。
image.png
在PE雙端測序中 pair reads與mate pairs概念基本相同,區別見https://www.biostars.org/p/77293/
2、sam格式剖析
2.1 header部分(optimal)
- 以
@
開頭為標志,從不同角度為比對結果補充信息; -
常見的有以下四類
sam header - (1)
@HD
如果有,必須放在第一行
VN
表示sam格式的版本號,SO
說明比對結果是否排序了 - (2)
@SQ
說明參考基因組的情況,一般會有很多行
SN
表示染色體名字,對應比對結果的RNAME列;LN
表示該染色體的長度 - (3)
@PG
則說明比對軟件情況
ID
表示程序ID號(一般與PN相同),PN
表示軟件名,VN
表示軟件版本號,CL
表示產生該sam的命令語句 - (4)
@RG
主要說明測序樣本信息
ID
,在一條lane只有一個sample情況下,可用flowcell+lane序號表示;SM
表示sample名;LB
表示原始測序文庫名;PL
表示測序平臺
2.2 alignment section(required)
- alignment section是sam的主體部分,其中那個每行代表一次比對結果,以及對應詳細的比對信息。
-
如下圖,每條alignment record可分為9大部分,11+n列(metadata不固定)
alignment record
第一列:read name
在雙端測序,一般至少有兩條相同記錄的read name(pair reads),但有時會有很多條(>2)記錄是因為
- 首先是
Chimeric alignment
情況,就是類似最一開始介紹的r003的比對情況,由于序列的特性,可能比對到不同的比較合適區域; - 然后是
Multiple mapping
情況,這主要是由于reads序列與基因組的重復序列特征導致的(在人基因組中約占20%)。
read name
第二列:flag
- 簡單來說就是設置該條reads的比對屬性;
- 表示某條reads是否有12條特征中的1至多條(多選題),結果用10進制數值加和表示
image.png
簡單理解所有選項含義---
1
表示是雙端測序;
2
表示pair reads均比對到了參考序列(good!)
4
表示這條read沒比對到參考序列
8
表示這條read的mate read沒比對到參考序列
16
表示這條read是reverse(反向)比對到參考序列的
32
表示這條read的mate read是reverse(反向)比對到參考序列的'
64
表示這條read是pair read的第一條read(左邊的)
128
表示這條read是pair read的第二條read(右邊的)
256
表示是這條read的Multiple mapping reads比對情況
其余三種情況比較少見,不作記錄了。關于secondary alignment與supplementary alignment的區別我認為就是分別對應Multiple mapping reads與Chimeric alignment比對情況。詳見https://sourceforge.net/p/samtools/mailman/message/33235303/
- 某一加和結果數值只會是一組屬性特征值的和,不會出現不同組合均能加和等于一個特定和的結果;
- 例如下圖,具體flag值含義參考上面解釋
113=1+16+32+64
369=1+16+32+64+256
117=1+16+32+128
417=1+32+128+256
image.png
這個網頁https://broadinstitute.github.io/picard/explain-flags.html提供了根據輸入的結果flag來分解原特征組合的功能,挺方便的。
第三列&第四列:read的位置
- RNAME: Reference sequence NAME of the alignment;與header部分的
@SQ SN
保持一致; - POS: read比對到參考序列(染色體)的最左邊位置(基于染色體,且為1-based);
- 如果只有pairs reads的一個成功比對到參考序列,那么未比對的reads的
RNAME與POS應與比對上的reads的描述一致; - 如果pair reads均未成功比對到參考序列上,則RNAME列均為
*
,POS列均為0
unmapped reads
簡單來說1-based就是序列第一個堿基序號為1,例如SAM, VCF, GFF and Wiggle formats等;0-based就是序列第一個堿基序號為0,例如 BAM, BCFv2, BED, and PSL formats等。
第五列:MAPQ
- MAPping Quality. It equals ?10log 10 Pr{mapping position is wrong}, rounded to the nearest
integer. - 一般來說MAPQ值越大,表示MAPping Quality越高;但255表示不可計算該read的MAPQ(我理解就是指unmapped的reads)
第六列:CIGAR
- 這一列主要來描述序列的具體比對情況,以堿基為單位,主要有如下圖幾種比對類型
image.png
M
表示read堿基比對到了參考序列的堿基上(有趣的是允許夾雜mismatch的情況,為SNP variant calling基礎)
I
相比于參考序列,read里插入insert了新堿基
D
相比于參考序列,read里刪除了部分堿基
N
比較特殊一般用于mRNA-seq結果里,表示比對到了intron內含子區域;
S
/H
表示read序列兩端基本沒能比對到參考序列,而中間部分可以比對的情況;具體區別可參考http://www.aigenetic.com/index.php/2018/03/19/soft-clip-%E4%B8%8E-hard-clip%E7%9A%84%E5%90%AB%E4%B9%89%E6%8F%8F%E8%BF%B0/
P
針對是多條reads比對到同一參考序列區域,其中有一條reads存在insert的情況,具體見https://davetang.org/wiki/tiki-index.php?page=SAM#Padded_alignment - Sum of lengths of the
M/I/S/=/X
operations shall equal the length of SEQ,其中=X
不常見。并且第四列read的起始位置也是從M/I/S/=/X
開始計算的
其實總結來看,
N
與S/H
分別表示了兩種特殊比對情況spliced alignment與clipped alignment,前者是中間沒比對上,而兩端比對上了;后者使中間比對上,而兩端沒比對上。
clipped alignment -- 3S8M1D6M4S
spliced alignment -- 9M32N8M
-
舉個例子,如下圖表示3 bases aligned followed by 1 base deleted, 2 next ones aligned, 1 base inserted and the last one aligned.
image.png
第七、八、九列:描述mate read信息
- RNEXT是該read的mate read比對到的參考染色體,有三種情況;
(1)=
:read與mate read比對到同一染色體上;
(2)若mate read比對到其它染色體上,則用相應的染色體名稱即可(SN
)
(3)若mate read未比對成功,用*
表示 - PNEXT是該read的mate read比對到的參考染色體的起始位置;
- TLEN列主要描述pair reads的"相隔距離",如下圖。
(1)僅考慮M/I/=/X
(excludes soft-clipped bases)情況;
(2)pair reads的該列絕對值相同,只是左邊的reads為正值,右邊的reads為負值;
(3)如果pair reads分別比對到不同染色體上,那么該值就是0
image.png
特殊的TLEN:Note: these two definitions agree in most alignments, but differ in the case of overlaps where the first segment aligns beyond the start of the last segment.
image.png
第十、十一列:序列信息
- 第十列:原始序列組成,等于原來fastq的第二行;
- 第十一列:序列的Phred質量值,等于原來fastq的第四行;詳見之前fastq的筆記。
第12+n列:metadata(optimal)
-
TAG:TYPE:VALUE
格式:TAG表示標簽名,一般是兩個大寫字母;TYPE表示VALUE的數據類型;VALUE表示該read的VALUE值 - Predefined standard tags可參考:https://samtools.github.io/hts-specs/SAMtags.pdf
- 以
BWA mem
比對結果產生的TAG結果為例,解釋如下圖。
image.png
至此,關于sam格式的基本介紹大致如上,主要參考了http://samtools.github.io/hts-specs/SAMv1.pdf教程手冊,其中還有很多深入的知識,值得以后深入探索~~
三、samtools轉換sam、bam
- sam轉bam
samtools view -bS SRR1663608.sam > SRR1663608.bam
- bam轉sam
samtools view -h -o SRR1663608.sam SRR1663608.bam
- bam結果統計
#查看bam
samtools view -h SRR1663608.bam | more
#the number of records (alignments)
samtools view -c SRR1663608.bam
#Displays basic alignment stats based on flag
samtools flagstat SRR1663608.bam
更多關于sam/bam格式的操作,可見之間生信技能樹Jimmy大神布置的一些練習題,我自己也做了,詳見Linux生信練習3--sam/bam
筆記圖片大多來自網上,侵刪~ 筆記中如有錯誤之處,歡迎指出!