BAM/SAM文件格式详解:FLAG、MAPQ、CIGAR等字段对参数的影响
BAM/SAM格式,说白了就是测序数据的“身份证”。你回想一下,BAM文件里每一条记录,其实都标着上百个标签。但我刚开始做变异检测时,总以为这些字段只是“备注”,后来在项目里踩了坑才明白——FLAG、MAPQ、CIGAR 这几个字段,直接决定了你的参数该往哪调。
1. FLAG:记录的双向身份标识
FLAG 字段本质上是一个二进制位图。每条 read 的比对状态都会被编码进这个数字里。我个人习惯在写过滤脚本前,先拿 samtools 看一眼 FLAG 分布,这样你就清楚哪些 read 该留、该丢。
| FLAG 值 | 含义 | 对参数的影响 |
|---|---|---|
| 1 | paired | 是否启用 paired-end 模型 |
| 2 | proper pair | 插入片段异常会被过滤 |
| 4 | unmapped | 直接跳过或参与 coverage 统计 |
| 8 | mate unmapped | 影响单端重比对策略 |
| 16 | reverse strand | 决定方向性的过滤参数 |
| 32 | mate reverse strand | 同 16,但用于 mate |
| 64 | first in pair | 标记主 read 或辅助 read |
| 128 | second in pair | 同上 |
举个例子:我在跑 strelka 时,发现很多假阳性来自未配对的 read。后来我在参数里加了一条:
--read-filter my_filter: "flag & 0x0004 == 0"
其实就是把 unmapped read 全排除了。你想想看,如果 FLAG 里没有 4 这个位,你根本不知道哪些是噪音。
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。
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 去掉,防止它们引入异常断点。
4. 其他重要字段 - RNEXT、PNEXT、TLEN
除了 FLAG、MAPQ、CIGAR,还有几个字段对参数影响也挺大。
| 字段 | 含义 | 对参数的影响 |
|---|---|---|
| RNEXT | mate 的参考序列名 | 检错是否启用跨染色体过滤 |
| PNEXT | mate 的比对位置 | 计算插入片段大小必需的 |
| TLEN | 模板长度(正负号表示方向) | 过滤异常插入片段 |
我记得有次处理 WGS 数据,发现很多 read 对 RNEXT 是 ‘=‘ 但 TLEN 超过 1000bp,明显是不正常的文库构建。我就在参数里加了 --max-depression 800,才把这些假阳性压下来。
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 里会被用到,一旦没了,你还得回去重建。
这张图清楚说明了原始 read 记录如何通过 FLAG、MAPQ、CIGAR 及其他字段,最终汇总到参数过滤规则。理解了这个流程,你就能精准调节每个参数,而不是盲目试。