我们在运行 bwa mem 比对的时候,由于某些不明的原因会造成程序中断,例如内存超了,IO 错误,计算节点崩溃等,然而 BAM 是否完整很难察觉,最终导致后续流程无法运行。这里,我们通过一段简短的代码来检查 BAM 文件的完整性,代码如下:
1 | function check_eofs(fs::String) |
原理很简单,根据官方对 SAM 文件的描述,其使用了一种兼容 gzip 的压缩格式,但是这个格式可以通过建立索引最终达到随机访问的目的,而每个文件的末尾都存在 EOF-marker, 其为1f 8b 08 04 00 00 00 00 00 ff 06 00 42 43 02 00 1b 00 03 00 00 00 00 00 00 00 00 00
的 28 位比特字符,我们直接读取文件末尾的 28 比特和该标志符对比即可检查其完整性了。
使用方法
1 | julia check_BGZF.jl BAM_1 BAM_2 BAM_3 ... |
同理,所有使用 BGZF 压缩格式的文件都可以采用这一方法检查完整,例如压缩的 vcf 文件vcf.gz。