理解并操作BAM⽂件
经过了第四节的长⽂,我想⼤家基本上已经知道了⼀个WGS流程该如何构建起来了吧。但在那⼀节中限于篇幅有两个很重要的⽂件我没能展开来讲,分别是:BAM和VCF⽂件。这篇我们先说BAM⽂件。
什么是BAM
BAM是⽬前基因数据分析中最通⽤的⽐对数据存储格式,它既适合于短read也适合于长read,最长可以⽀持128Mbp的超⼤read!除了后缀是.bam之外,有些同学可能还会看到.cram,甚⾄.sam后缀的⽂件,其实它们⼀个是BAM的⾼压缩格式(.cram)——IO效率⽐原来的BAM要略差;另⼀个是BAM的纯⽂本格式(.sam)。当然格式都是⼀样的,因此为了描述上的清晰,我下⾯都统⼀⽤BAM。
BAM⽂件格式
其实⼀开始它的名字是SAM(The Sequencing Alignment/Map Format的英⽂简称),第⼀次出现的时候,它是bwa⽐对软件的标准输出⽂件,但原⽣的SAM是纯⽂本⽂件,⼗分巨⼤(⽐如:⼀个⼈30x全基因组测序的sam⼤⼩超过600G),⾮常容易导致存储空间爆满!为了解决这个问题,bwa的开发者李恒(lh3)设计了⼀种⽐gz更加⾼效的压缩算法,对其进⾏压缩,这就是我们所说的BAM,它的⽂件⼤⼩差不多只有原来的1/6。
美国知音
祈福英语实验学校在2007年,NGS技术刚刚兴起之时,各类短序列⽐对软件层出不穷,输出格式也是各有特点,各家各有⼀套,并没有什么真正的标准可⾔,可以说那是⼀个谁都说我最好的时期。
但逐渐的,研究者们发现BAM格式对Mapping信息的记录是最全⾯的,⽤起来也是最灵活的。bwa的作者还为BAM⽂件开发了⼀个⾮常好⽤的⼯具包——Samtools,使得⼈们对BAM⽂件的处理变得⼗分便利,拓展性也变得⾮常强,后来还有类似于IGV等专门⽀持BAM的⼯具也越来越多,因此它就逐渐成为了主流。
现在基本上所有的⽐对数据都是⽤BAM格式存储的,俨然已经成为了业内的默认标准。
在2013年,研究者们还专门将Samtools的处理核⼼剥离出来,并将其打包成为⼀个专门⽤于处理⾼通量数据的API——htslib,除了C语⾔版本之外还有Java和Python版本,这些在github上都能直接找到。后续许多与NGS数据处理有关的⼯具基本都会使⽤这个API进⾏相关功能的开发,可见其影响⼒。
ok,背景的介绍就先到此为⽌了,我们回归主题。下⾯这个图是我从⼀份刚刚完成⽐对的bam⽂件中截取出来的内容:
image
2010考研英语二真题
bpo是什么意思由于屏幕所限,⽆法把全部的内容都包含进来,特别是header信息,贴在这⾥仅是为了让还没见过BAM⽂件的同学们能够对它有⼀个总体的感觉。
级别的英文雾都孤儿txt>koppo如果是SAM⽂件,同时你也熟悉linux操作的话,直接在linux终端⽤less打开即可(注意:不要试图在本地使⽤⽂本编辑器,如vim等直接打开⽂件,会撑死机⼦的),但如果我们要查看的是BAM,那么必须通过Samtools(可以到samtools的⽹站下载并安装)。
9929image
以上,前11列是所有BAM⽂件中都必须要有的信息,⽽且从描述中我们也能够⽐较清楚地知道其所代表的含义。但其中,有⼏个信息实在太重要了,以⾄于我认为有必要对其进⾏详细说明。
第⼀,Flag信息
这是⼀个⾮常特别并且重要的数字,也是⼀个容易被忽视的数字,这可能和许多⽣信⼯程师也并不完
全理解这个值有关。许多同学在第⼀次看到其官⽅⽂档中的描述之后依然会觉得⼗分困惑,但它⾥⾯实际上记录了许多有关read⽐对情况的信息。想要读懂它的⼀个关键点是我们不能够将其视为⼀个数字,⽽是必须将其转换为⼀串由0和1组成的⼆进制码,这⼀串⼆进制数中的每⼀个位(注意是“位”,bit的意思)都代表了⼀个特定信息,它⼀共有12位(以前只有8位),所以⼀般会⽤⼀个16位的整数来代表,这个整数的值就是12个0和1的组合计算得来的,因此它的数值范围是0~2048(2的12次⽅,计算机科学的同学对这种计算应该不陌⽣)。
mvpen那么下⾯我就结合其⽂档和⾃⼰的实践经验对这12个位的含义⽤更加通俗易懂的语⾔来重新描述,如下表:
image
所以,通过上⾯这个表的信息,我们就可以清楚地知道每⼀个FLAG中都包含了什么信息。⽐如看到FLAG = 77时,我们第⼀步要做的就是将其分解为⼆进制序列(也可以理解为分解成若⼲个2的n次⽅之和):
77 = 000001001101 = 1 + 4 + 8 +64,这样就得到了这个FLAG包含的意思:PE read,read⽐对不上参考序列,它的配对read也同样⽐不上参考序列,它是read1。
adept