BAM 文件解读
Introduction
了解生信的都知道,BAM
是一种测序数据比对信息存储的一种文件格式,类似的还有 SAM
格式;可以这么理解:BAM
是 SAM
经过压缩之后的一种文件格式,其压缩率可以减少很大的同级别的存储空间。
BAM
文件中存放了大量序列比对相关的信息,读懂
BAM
才能更好的理解解析生物大数据。
Getting Started
sam 文件是纯文本文件;bam 文件是 sam 文件的压缩格式;bam 文件的大小只有原来 sam 的 1/6(大约);
bam文件共有两部分:header
+record
BAM-header
1 | # 查看 header |
- 解释:
- HD:VN-版本号;SO-排列方式
- SQ:SN-参考序列序号;LN-长度
- RG(read group):ID-样本信息;
- PG:ID-比对工具;以及比对时运行的命令
BAM-record(比对信息)
每一行表示每一条read的比对情况
1 | # 查看比对信息 |
解读:
每一行的结构如下:
QNAME
-flags
-position
-MAPQ
-CIGAR
-mate information
-read sequence
-quality scores
-metadata
- read name:
- QNAME(Query template NAME): fastq 文件中的 read id;即对应测序fastq数据中read的名称
- flags:
- flag(bitwise FLAG): 二进制的比对信息位;一共有12位,每一位都代表了一个特定信息
- position:
- RNAME(Reference sequence NAME):
参考基因组对应的染色体号;若为
*
表示没有比对到参考基因组; RNAME中的R表示Reference - POS(1-based leftmost mapping POSition): 比对位置,从对应染色体的第一位开始往后计算
- RNAME(Reference sequence NAME):
参考基因组对应的染色体号;若为
- MAPQ(MAPping Quality):
比对质量值(
Mapping Quality
);值越大,表示比对错误的概率越低;如 MAPQ>30 -- 表示错比概率低于0.001(千分之一);计算公式:-10logP{错比概率}
- CIGAR(Concise Idiosyncratic Gapped Alignment Report): 比对信息,用数字和字符的组合形象的记录read比对到参考序列上的细节
- Mate information:
- RNEXT(Reference name of the mate/next read): 配对read所比对到的染色体(仅PE测序的数据才有); ‘=’ -- 表示前后是位于同一个片段;‘*’ -- 表示没有对应的片段信息
- PNEXT(Position of the mate/next read): 下一个片段比对上的位置;配对read所比对到的位置(仅PE测序的数据才有);若没有相关信息则为0
- TLEN(observed Template LENgth): 插入片段长度(仅PE测序的数据才有);TLEN的绝对值等于模板序列的映射末端与模板序列映射起点之间的距离(end-start+1; 包括两端);【比对上的碱基不包括soft-clip碱基】,值的正负代表着比对上的正负链;单链,值为0
- read sequence:
- SEQ(segment SEQuence): read序列;若为 ‘*’ 表示该序列没有存储,否则会有对应的序列片段,长度 和CIGAR中的 M / I / S / = / X 是对应的。
- quality scores:
- QUAL(ASCII of Phred-scaled base QUALity): read 质量值
- metadata: 元信息,从第12列开始往后都是metadata,一般包括RG信息,missmatch信息,二次比对信息等;在不同的处理软件中输出会有所不同,不固定
- read name:
BAM-record-flags
FLAG(十进制) | Bitwise(二进制序列) | 十六进制 | 内容描述 |
---|---|---|---|
1 | 000000000001 | 0x1 | Pair-End(PE)测序,0表示Single-End(SE)测序 |
2 | 000000000010 | 0x2 | 正常比对(PE测序的两个read都能正确比对到参考序列上);若是PE测序,表示PE的两条read之间的比对距离没有明显偏离插入片段长度 |
4 | 000000000100 | 0x4 | 表示该read没有比对到参考基因组上 |
8 | 000000001000 | 0x8 | PE测序的另一个配对read没有比对到参考序列(不是当前read) |
16 | 000000010000 | 0x10 | 反向互补后比对到参考序列,即比对到负链 |
32 | 000000100000 | 0x20 | PE测序的另一个配对read反向互补后比对到参考序列 |
64 | 000001000000 | 0x40 | PE测序read1;说明该read是与参考序列比对的第一条 |
128 | 000010000000 | 0x80 | PE测序read2 |
256 | 000100000000 | 0x100 | 二次比对,说明该read在参考基因组上比对了多个位置,当前比对位置是次佳比对位置,通常需要过滤掉;但可能存在生物信息 |
512 | 001000000000 | 0x200 | 低于过滤阈值 |
1024 | 010000000000 | 0x400 | PCR重复序列(来自测序文库构建过程)或者光学重复(来自测序过程);即 dup |
2048 | 100000000000 | 0x800 | 说明该read可能存在嵌合,这个比对的部分只是来自其中的一部分序列 |
77 = 000001001101 = 1 + 4 + 8 +64,这样就得到了这个FLAG包含的意思:PE read,read比对不上参考序列,它的配对read也同样比不上参考序列,它是read1
当然,如果你希望自己在程序中写一段处理FLAG的代码,那么显然是不会像我们这个例子那样去分解这个整数的,多麻烦啊!那么该如何做呢?其实也很简单,比如我们要获得其中某个位(假设第N位)的值——只需要将这个FLAG值和2的N次方做与的运算即可。在与运算时,FLAG值首先会被转换成一串二进制序列(如77=000001001101),而2的N次方除了第N位是1之外,其它的都是0,“与”了之后其它信息就会被屏蔽掉。比如,我们想知道该read是否比对上了参考序列,那么只需要计算FLAG & 4 的值就行了,如果结果是1那么就是比对上了,如果是0则代表没有比上。
1 | # samtools 根据 flags 值对reads进行筛选 |
BAM-record-CIGAR
更加直观的体现出read比对到参考序列的比对情况,如插入,缺失,跳跃等
标记字符 | 内容描述 |
---|---|
M | 匹配(包含完全匹配和单碱基错配) |
I | 序列插入 |
D | 序列缺失 |
N | 跳过参考序列,常见于RNA-Seq数据的比对;N 表示可变剪切位置 |
S | 软跳过(soft-clip),跳过read中的部分序列,不会改变read的长度 |
H | 硬跳过(hard-clip),直接剪切掉read中分布序列,会改变read的长度;H 只会出现在reads的两端,不会出现在中间,且一般与 S 成对出现 |
P | Padding;和 N 类似,是read比对时中间跳过参考序列的部分区域 |
= | 完全匹配 |
X | 序列错配 |
B | BAM_CBACK,一个曾经适用于CG测序技术特点的标记(华大BGI SEQ测序系列),作用和 N 类似,跳过一定长度的参考序列 |
* | 显示该条 read 完全错配;即与参考基因组不存在匹配的位置 |
重点说明的是:M -- 并不能表示reads完全比对上参考基因组序列,不能百分百认为其中没有miss-match;多态性碱基或单碱基错配也是用M标记
Hard Clip
:存在的本意,是减少BAM文件序列的冗余度,比如有一条read,它能比对到A,B两个地方,在A地方,是60M90S,在B地方是60H90M,此时一条read其实已经在A位置有了完整的序列信息,在B位置的信息其实是冗余的,所以在B位置可以引入Hard Clip这样一个标记形式,就能把B位置的序列标记为secondary。- 软连接最终会在后面的序列中保留对应的序列,而硬连接会在后面的序列中直接删掉该片段
References
[1] https://www.jianshu.com/p/11275987b24b
[2] https://www.jianshu.com/p/705330b383c3