1. 背景
SAM 格式出现前,每个比对器各有独特输出格式——MAQ 有 MAP、ELAND 有 ELAND、Bowtie 有自己的格式。跨工具比较或切换需要大量格式转换脚本。SAM(Sequence Alignment/Map)由 Heng Li 等人提出,统一了比对数据的存储标准。
SAM 很快被 1000 Genomes Project 采纳,随后成为全行业标准。其二进制版本 BAM 和压缩版本 CRAM 至今是生物信息学的核心格式。
2. 格式结构
2.1 头部(Header)
以 @ 开头的行:
@HD VN:1.0 SO:coordinate // 版本与排序
@SQ SN:chr1 LN:248956422 // 参考序列
@RG ID:sample1 SM:NA12750 // 读段组
@PG ID:bwa PN:bwa VN:0.7.15 // 程序信息
2.2 11 个必填字段
| # | 字段 | 类型 | 说明 |
| 1 | QNAME | str | 读段名称 |
| 2 | FLAG | int | 位标记(配对、链方向等) |
| 3 | RNAME | str | 参考序列名 |
| 4 | POS | int | 最左端 1-based 坐标 |
| 5 | MAPQ | int | 比对质量(Phred) |
| 6 | CIGAR | str | CIGAR(如 35M1D65M) |
| 7 | RNEXT | str | 配对读段参考名 |
| 8 | PNEXT | int | 配对读段位置 |
| 9 | TLEN | int | 插入片段长度 |
| 10 | SEQ | str | 读段序列 |
| 11 | QUAL | str | 碱基质量(Phred+33) |
2.3 FLAG 位标记
| 值 | 含义 |
| 1 | 读段已配对 |
| 2 | 所有片段正确比对 |
| 4 | 该片段未比对 |
| 8 | mate 未比对 |
| 16 | 比对到反向互补链 |
| 32 | mate 比对了反向互补链 |
| 64 | 该读段是 read 1 |
| 128 | 该读段是 read 2 |
| 256 | 次优比对 |
| 2048 | 补充比对(supplementary) |
2.4 CIGAR 操作
| 操作 | 说明 | 消耗参考 | 消耗读段 |
| M | 匹配/错配 | ✓ | ✓ |
| I | 插入 | | ✓ |
| D | 删除 | ✓ | |
| N | 跳过(intron) | ✓ | |
| S | soft clip | | ✓ |
| H | hard clip | | |
示例:CIGAR="35M1D65M" → 35 匹配 + 1 删除 + 65 匹配。读段长 100bp,参考消耗 101bp。
2.5 TAG 字段
NM:i:3 // 编辑距离(错配 + indel 总数)
AS:i:150 // 比对分数
XS:i:120 // 次优比对分数
RG:Z:sample1 // 读段组
MD:Z:35A0^C65 // 错配和删除的精确位置
3. BAM —— 二进制版本
- 大小: BAM 约为 SAM 的 1/5–1/10(BGZF 块级压缩)
- 索引: 建立 .bai 索引后可 O(log n) 时间区域查询
- 随机访问: 通过 .bai 指数,人类基因组可在毫秒级提取指定基因座的所有比对
4. SAMtools 核心命令
| 命令 | 功能 |
| samtools view | 查看/转换 SAM/BAM/CRAM |
| samtools sort | 按坐标排序 |
| samtools index | 建 .bai 索引 |
| samtools merge | 合并 BAM |
| samtools mpileup | pileup → SNP/indel 检测 |
| samtools flagstat | 比对统计 |
| samtools depth | 深度计算 |
| samtools tview | 文本比对可视化 |
生态系统核心: GATK、freebayes、STAR、HISAT2 等都支持 SAM/BAM。SAMtools 为这一生态系统提供了基础管道功能。
5. 与 BWA 的关系
BWA 是最早默认输出 SAM 格式的比对器之一。 BWA 论文中的数据分析都基于 SAM 格式。BWA + SAMtools 提供了从比对到变异检测的完整流程。两者由同一作者开发(Heng Li),设计上深度整合。