比对结果文件 Bam 文件格式介绍
bam文件格式是生物信息最常用的文件格式,主要用于记录序列比对情况。一般测序下机数据的比对结果,均以该格式进行存储。而用于序列比对的工具,如blast也提供了bam格式的输出形式。因此可以说,对生物信息学工具的优化和开发,几乎不可避免地需要对bam处理,对于基础用户而言,可能经常用到samtools来进行。
1. SAM 格式详解
要说明bam文件的内容,需要首先介绍sam文件的内容。上一篇内容中已经介绍了,sam文件是记录比对信息的标准结构化文件,从总体上可以分为两个部分
1.1 SAM 文件头部
sam 文件头部信息以@ 作为开头,对比对结果的meta信息进行记录,主要涵盖了文件标准格式版本(VN)、比对中使用的参考序列信息(SQ)、测序数据分组信息(RG)、比对或后期处理使用的程序信息(PG)等。上述内容是sam文件标准规定的,因此一般sam文件中必须存在。
不仅如此,用户也可以根据后期分析需要自定义一系列自定义的信息,最为常用的就是UMI标签信息,在此就不展开描述了,关于sam文件头部信息的细节可以参考其格式说明手册。
1.2 SAM 文件中比对信息
sam文件的比对信息中,每一行是由固定的11列的组成的。其信息内容见下表:
| 列编号 | 列名称 | 类型 | 说明 |
|---|---|---|---|
| 1 | QNAME | String | query序列名称 |
| 2 | FLAG | Int | FLAG标签,主要记录比对的基本情况,取值为2的整数次幂 |
| 3 | RNAME | String | 比对至参考序列的名称,例如:chr1 |
| 4 | POS | Int | 比对至参考序列的位置 |
| 5 | MAPQ | Int | 比对质量,不同的比对软件对其定义不尽相同 |
| 6 | CIGAR | String | 比对的CIGAR字符串,下文有详细说明 |
| 7 | RNEXT | String | 对于illumina平台的数据而言,该部分指read2比对到的参考序列位置名称,例如:chr2 |
| 8 | PNEXT | Int | 与RNEXT类似,表示read2比对的参考序列位置 |
| 9 | TLEN | Int | 比对序列对应的模板(Template)长度 |
| 10 | SEQ | String | query序列 |
| 11 | QUAL | String | query序列的碱基质量Phred值 |

上述11列信息,是SAM文件必要的组成部分。除此之外,每行可以追加可选信息。该部分信息以TAG:TYPE:VALUE 形式存储。详细介绍可参考官方文档。值得注意的是,追加信息标签(TAG)的标准定义是一直在不断更新的,基本上每年都会有新增标签加入。
2. 压缩概览
由于本人背景知识有限,因此只能简要描述一下数据压缩相关内容。 对于测序数据这种本质上含有大量冗余的数据而言,如果单纯对每个信息进行记录则会造成非常大的存储资源的浪费。由于数据存在着重复信息,因此一个比较直接的思路就是,对数据中多次出现的部分进行编码,然后对于第一此出现该信息以外的部分,以一定的标识进行替代。当然,被替代的信息长度,应该大于标记信息长度。这样,当压缩软件和解压软件遵守同一套标准的前提下,数据在存储设备上就可以以相对较小的空间,记录完整的信息。

3. BAM 文件
bam文件作为sam文件的压缩版本,记录的信息本质上是一样的。但是对其进行了BGZF压缩。该压缩的目的,在减少存储消耗的前提下,提供在有索引的前提下,提供快速的随机访问的功能。
在存储介质上,BGZF文件是由一系列BGZF块(BGZF block)组成的,每个块大小不超过64Kb,每个块的组成见下图

以块数据为基本单位,bam文件记录如下:

上述表格中基本信息与sam文件的内容存在对应关系,但其每个记录的类型存在转化关系,以seq信息为例,在sam文件中是以字符串形式存储的,在bam文件中,该项则是将字符串集转化为了[0,15]的整数进行存储。
因此,一般的linux字符处理工具(如cat、head)是无法直接处理bam文件的读取、修改、查询的。在实际处理过程中,经常使用samtools 和htslib提供的接口对bam文件进行处理。目前生信分析常用的主流语言中基本上都涵盖了处理bam文件的扩展,例如python语言中的pysam,R中的Rsamtools等。
小结
sam和bam文件是处理测序数据接触的相对较为复杂的第一个文件结构。对于sam文件为平面文件,相对而言易于查看和处理,但是由于其占用存储空间过大,因此在实际使用中不保存。bam文件作为sam文件的压缩版本,采用的压缩方式为BGZF压缩格式,该格式在介质上的存储单位为64Kb 的block。bam文件记录的信息与sam相同,但存储空间占用却小很多。
关于bam文件的索引及后续内容,今后也会陆续分享给大家。欢迎各位读者持续关注 :D