数据格式基础:FASTQ、BAM、VCF、CRAM 详解
做 NA12878 基准数据集对比,说白了就是跟这几种文件格式打交道。你打开任何一份公开基准数据,看到的也就是这些后缀。我个人把它们当成基因组学里的“四件套”——原始数据、比对结果、变异位点、压缩存档。
这节我们就把每种格式掰开揉碎讲清楚。我会带上一些实际项目里的踩坑经历,帮你少走弯路。
1. FASTQ:一切从这里开始
原始测序数据,长得像文本,其实里面藏着四个部分。我刚开始接触时总以为这玩意跟 FASTA 差不多,直到一次比对任务怎么都跑不对,才发现是质量评分系统搞错了。
一条 FASTQ 记录长这样:
@SEQ_ID
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65
- 第一行:以 @ 开头,后面是序列标识符,通常包含测序仪器、flowcell、lane 和坐标信息。
- 第二行:碱基序列,A/T/C/G,N 表示不确定。
- 第三行:以 + 开头,可以重复标识符,有时留空。
- 第四行:质量评分,每个字符对应一个 Phred 分值。
seqkit 或 fastp 直接检测编码类型,别自己猜。
质量值怎么还原呢?很简单,每个 ASCII 字符减去偏移量(通常是 33),得到的就是该碱基的测序错误概率。比如字符 '!'(ASCII 33)对应 Phred 分值 0,意味着 50% 的概率是错的;'I'(ASCII 40)对应 Phred 分值 7,错误概率约 20%。
2. BAM:比对的核心,二进制但高效
BAM 是 SAM 的二进制压缩版。为什么不用 SAM?你想想看,一个全基因组测序的 SAM 文件动辄上百 GB,磁盘写入就够受的。BAM 不光省空间,还能被索引,随机读取飞快。
我记得第一次做 NA12878 的比对,用了 BWA-MEM,输出直接是 BAM,省掉了转换步骤。但如果你手里有 SAM,可以用 samtools view 转成 BAM:
samtools view -bS input.sam > output.bam
samtools sort output.bam -o output.sorted.bam
samtools index output.sorted.bam
排序和建立索引是关键。没有索引的 BAM 就是个大二进制文件,你没法快速定位到某个区域。
BAM 内部结构分两部分:头部(@HD、@SQ 等)和记录体(每条比对一行)。你可以用 samtools view -H 看头部信息,用 samtools view 看记录。记录包含 11 个必填字段,包括 RNAME(参考序列名)、POS(比对起始位置)、MAPQ(比对质量)、CIGAR(比对描述)等。
3. VCF:变异档案
VCF 是存储变异信息的标准格式。你做任何基准对比,最后都要落到 VCF 上。
一个标准的 VCF 文件结构如下:
#CHROM POS ID REF ALT QUAL FILTER INFO
chr1 10001 . G A 30 PASS DP=100;AF=0.5
chr1 10002 rs12345 C T 45 PASS DP=80;AF=0.3
- 以 # 开头的行是元数据,包含格式信息和样本说明。
- 主体是制表符分隔的 8 列固定字段,后面跟样本基因型列。
- INFO 字段很灵活,可以扩展。比如 DP 代表读取深度,AF 代表等位基因频率。
做对比时,我建议你先检查 VCF 的 FILTER 列。很多公开基准集的 VCF 包含未通过质控的位点,如果用全部数据去算,精度会莫名其妙低一大截。通常我们只看 PASS 过滤后的变异。
4. CRAM:终极压缩
CRAM 是 BAM 的进化版,2013 年由 EBI 提出。它利用参考基因组做差分编码,只存储测序 reads 与参考基因组的差异部分,压缩率比 BAM 高出 30%~50%。
转换成 CRAM 的典型做法:
samtools view -C -T reference.fa input.bam -o output.cram
samtools index output.cram
注意那个 -T reference.fa,这是关键。没有参考序列,CRAM 文件就是一堆无意义的数字。至于 CRAM 和 BAM 的差异,我整理了一张表:
| 特性 | BAM | CRAM |
|---|---|---|
| 压缩率 | 3~5x | 5~10x |
| 依赖参考基因组 | 否 | 是 |
| 解码速度 | 快 | 略慢(但可接受) |
| 工具兼容性 | 最好(所有工具都支持) | 较好(主流工具已支持) |
我个人倾向在存储归档阶段用 CRAM,在频繁读取和分析阶段用 BAM。毕竟你每次跑都用 CRAM 解压,时间成本积攒起来也不少。
5. 本章知识结构:四种格式的关系
上图清晰展示了 NA12878 数据从原始 FASTQ 到最终对比的完整转换路径。你可以看到,BAM 和 CRAM 是并列的存档选择,而变异检测后的 VCF 才是最终对比的战场。
6. 实际操作中的避坑清单
光讲理论不够,我把自己这些年栽过的坑列出来,你遇到类似情况可以快速跳过。
- FASTQ 质量编码搞错:用
seqtk test或fastp -Q自动检测,别手动猜。 - BAM 未排序:现代的变异检测工具基本都要求比对数据是排序后的。跑之前先确认 PYSAM 或 igv 能正常浏览。
- VCF 的 FILTER 列不清空:我遇到过直接把 .PASS 以外的位点当真的案例。最好用
bcftools view -f PASS过滤后再对比。 - CRAM 参考基因组版本不匹配:这是最常见的错误。CRAM 文件记录了解码必须的参考基因组,但如果你用的是不同版本,解码照样报错。保持 GRCh38 系列的统一。
- 忽略索引文件:无论是 BAM、CRAM 还是 VCF,生成索引是常规操作。没有索引,很多工具会拒绝工作。
嗯,以上就是我对这四种数据格式的全部理解。每种格式都有它的历史背景和适用场景,做 NA12878 对比时你总会用到它们中的一个或多个。记住这些小技巧,你的分析流程会顺畅很多。