BAM/SAM文件格式详解:FLAG、MAPQ、CIGAR等字段对参数的影响

BAM/SAM格式,说白了就是测序数据的“身份证”。你回想一下,BAM文件里每一条记录,其实都标着上百个标签。但我刚开始做变异检测时,总以为这些字段只是“备注”,后来在项目里踩了坑才明白——FLAG、MAPQ、CIGAR 这几个字段,直接决定了你的参数该往哪调。

1. FLAG:记录的双向身份标识

FLAG 字段本质上是一个二进制位图。每条 read 的比对状态都会被编码进这个数字里。我个人习惯在写过滤脚本前,先拿 samtools 看一眼 FLAG 分布,这样你就清楚哪些 read 该留、该丢。

FLAG 值含义对参数的影响
1paired是否启用 paired-end 模型
2proper pair插入片段异常会被过滤
4unmapped直接跳过或参与 coverage 统计
8mate unmapped影响单端重比对策略
16reverse strand决定方向性的过滤参数
32mate reverse strand同 16,但用于 mate
64first in pair标记主 read 或辅助 read
128second in pair同上

举个例子:我在跑 strelka 时,发现很多假阳性来自未配对的 read。后来我在参数里加了一条:

--read-filter my_filter: "flag & 0x0004 == 0"

其实就是把 unmapped read 全排除了。你想想看,如果 FLAG 里没有 4 这个位,你根本不知道哪些是噪音。

避坑:我遇到过一次,FLAG 设为 0 时(表示所有 read 都接受),结果混入了大量 unmapped 和 secondary 比对,严重拖慢速度。后来才改了。

2. MAPQ:比对质量的可信度

MAPQ 本质上是 -10*log10(P(比对错误))。数值越高,说明 read 在这个位置越可靠。我一般在低深度区域会把 MAPQ 阈值调低,不然覆盖率根本不够。

常见的 MAPQ 阈值建议:

  • Germline 检错:通常 MAPQ ≥ 20。为什么?因为 20 对应的错误概率是 1%。
  • Somatic 突变体:我个人习惯 ≥ 30,甚至 ≥ 37。尤其肿瘤样本,MAPQ 低会导致 clone 读段污染。
  • RNA-Seq:考虑多比对,很多工具会用 MAPQ 0 来过滤多映射 reads。

你看下面这条命令,就是典型的过滤:

samtools view -q 20 -f 0x2 input.bam

-q 20 代表只保留 MAPQ ≥ 20 的 reads,同时 -f 0x2 表示只保留 properly paired。

我在实际项目里踩过的坑:有一次发现一批假阳性位点,MAPQ 分布集中在 5~15。后来我查是这个样本重复区高,bwa 用了默认参数把低质量的比对都放出来了。最后我把 --min-MAPQ 设成 15,GATK 的过滤器才正常。

3. CIGAR:记录与参考基因组的对齐剧本

CIGAR 字符串描述了 read 里的每个碱基是怎么和参考基因组对齐的。比如 5S10M2D3M:5个 soft-clip,10个严格匹配(或错配),2个 deletion,3个 match。

对参数影响最大的两个东西:

  • Soft-clipping:我建议工具里开启 soft-clip 过滤,以免引入断裂位点的误报。
  • Insertion/Deletion:有些变异检测器(比如 Mutect2)需要你设定最大 indel 长度,否则 CIGAR 里太长的大段插入会导致错位。

举个实际配置例子:我手头在处理一份全外显子数据,CIGAR 里频繁出现 20 个碱基以上的 soft-clip:

samtools view -e 'cigar_str!~"^[0-9]+S"' input.bam

这行命令会把开头就打上 soft-clip 的 read 去掉,防止它们引入异常断点。

避坑笔记:我做过一个 RNA 项目,结果很多 read 的 CIGAR 里有长 N(splice junction)。如果用 germline 默认参数,这些 N 会被当成 deletion,假阳性率直接飙。后来我改成针对 RNA 的模型,CIGAR 里的 N 才被正常处理。

4. 其他重要字段 - RNEXT、PNEXT、TLEN

除了 FLAG、MAPQ、CIGAR,还有几个字段对参数影响也挺大。

字段含义对参数的影响
RNEXTmate 的参考序列名检错是否启用跨染色体过滤
PNEXTmate 的比对位置计算插入片段大小必需的
TLEN模板长度(正负号表示方向)过滤异常插入片段

我记得有次处理 WGS 数据,发现很多 read 对 RNEXT 是 ‘=‘ 但 TLEN 超过 1000bp,明显是不正常的文库构建。我就在参数里加了 --max-depression 800,才把这些假阳性压下来。

关键原则:RNEXT 和 PNEXT 配合 TLEN 能帮你判断文库质量,尤其是 paired-end 的 read 是否真的在一起。如果 TLEN 为 0 或负数,说明配对有问题,GATK 这类工具会自动跳过。

5. 实战避坑指南

  • FLAG 只看常见值?实际上每个平台或 aligner 都会给某些位打上特殊标记。我习惯用 samtools flagstat 看整体分布。
  • MAPQ 阈值的陷阱:高 MAPQ ≠ 高准确性。在低复杂区域、重复区,bwa 可能会给 high MAPQ,但实际是错配。我建议结合 MQ0 或者 reads support 一起看。
  • CIGAR 里的‘S’和‘H’:如果是 RNA,检查是否保留了 spliced read 的 N。如果是 DNA,留意 adapter 有没有残留。
  • 拆分与合并:我建议不要轻易在 BAM 里省掉 auxiliary 字段,比如 NM、AS 等。这些字段在后续 recalibration 里会被用到,一旦没了,你还得回去重建。
BAM/SAM 核心字段对参数的影响流程图 原始 read 记录 FLAG 位机值 MAPQ 阈值 CIGAR 字符串 RNEXT/PNEXT/TLEN 参数过滤规则 过滤/阈值/方向性

这张图清楚说明了原始 read 记录如何通过 FLAG、MAPQ、CIGAR 及其他字段,最终汇总到参数过滤规则。理解了这个流程,你就能精准调节每个参数,而不是盲目试。