3. 输入数据准备:FASTQ、BAM、参考基因组

做GATK变异检测,第一步不是跑命令,是搞清楚你手里有什么数据。我见过不少人上来就对着BAM文件一顿操作,结果跑完才发现样本名不对、参考基因组版本搞混了。嗯,这节课我们就聊聊输入数据的门道。

说白了,GATK流水线吃三类东西:原始测序数据(FASTQ)、比对后的文件(BAM/CRAM)和参考基因组。这三样缺一不可,而且每样都得收拾干净。

一句话总结:花80%时间准备数据,20%时间跑分析。数据质量决定最终结果。

3.1 FASTQ文件:原始数据的“身份证”

FASTQ里存着每条read的序列和质量分数。一个标准的FASTQ记录长这样:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTCAAGGTTGTTGCAAGACGGGAGGTAGGTGTCTGGGTAG
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

第一行是read ID,后面跟着碱基序列,然后一行“+”分隔符,最后是质量分数(Phred+33编码)。我个人习惯拿到FASTQ先做几件事:

  • 检查read数目:用zcat file.fastq.gz | wc -l再除以4,确认样本测了多少对reads。
  • 看质量分布:FastQC跑一轮,重点关注Q30比例、GC含量、过代表序列。
  • 确认命名规范:样本名不能有空格、括号,项目组统一用“样本ID_批次_ Lane”格式。我在一个肿瘤项目里遇到过样本名带“/”的情况,结果GATK直接报错退出。

为什么要做这些?因为GATK的BQSR(碱基质量校正)严重依赖原始质量分数,如果FASTQ本身就有问题,后面全白搭。

3.2 BAM/CRAM文件:比对后的“地图”

BAM是SAM的二进制版本,CRAM是更压缩的格式。GATK官方推荐用CRAM,但我自己更习惯在分析前期用BAM,调试方便。

一个合格的BAM文件需要满足:

  • 排序正确:GATK要求按坐标排序,而且必须带索引(.bai或.crai)。
  • Read Group完整:@RG标签必须有ID、SM(样本名)、LB(文库名)、PL(测序平台)。缺少任何一个,GATK的HaplotypeCaller可能直接罢工。
  • 标记过重复:用Picard MarkDuplicates或sambamba markdup处理过,不然变异检测结果会被PCR重复污染。

我曾经踩过的坑:有一次用GATK4 BaseRecalibrator,一直报“No reads found in interval”,查了两天发现BAM的@RG标签里SM字段写成了“Sample_1”,而参考基因组的字典里对应的样本名是“Sample_1_rerun”,不匹配。从那以后我建了个检查脚本,跑前先校验RG标签。

验证BAM完整性我常用这个命令:

samtools quickcheck sample.bam && echo "OK" || echo "Corrupt or incomplete"
samtools stats sample.bam | grep "reads mapped:"

3.3 参考基因组:变异的“字典”

参考基因组就是一把尺子,所有变异都是相对于它定义的。GATK需要三个东西:

  1. FASTA文件:比如hg38.fa,要求每个染色体一行,换行符统一(推荐用picard NormalizeFasta处理)。
  2. 索引文件:.fai由samtools faidx生成,.dict由picard CreateSequenceDictionary生成。
  3. 已知位点文件(可选但强烈推荐):比如dbSNP、1000G的VCF,用于BaseRecalibration和VQSR。

不同项目用的参考版本可能不同。我常用的做法是把参考基因组统一放到一个公共目录,软链接到项目目录,避免到处拷贝浪费空间:

ln -s /ref/hg38/hg38.fa /project/ref/hg38.fa
ln -s /ref/hg38/hg38.fa.fai /project/ref/hg38.fa.fai
ln -s /ref/hg38/hg38.dict /project/ref/hg38.dict

一个建议:团队成员一定要统一参考基因组版本。我在一个跨国合作项目里吃过亏——中方用GRCh38,美方用hg38(其实是同一个东西但命名不同),最后合并VCF时染色体名字对不上,折腾了三天重跑。

3.4 本章知识结构图

下面这张图总结了输入数据准备的核心流程:从FASTQ到BAM再到参考基因组,每一步都有质控要点。

GATK变异检测输入数据准备总览 FASTQ原始数据 reads + 质量分数 BAM/CRAM 比对 + 坐标排序 参考基因组 FASTA + 索引 + 已知位点 FASTQ质控 reads数目 Q30比例 GC含量 BAM质控 标记重复 RG标签完整 比对率 > 95% 参考基因组质控 FASTA无N碱基错误 .fai/.dict 一致 已知位点版本匹配 常见问题 & 避坑指南 1. FASTQ文件命名不规范,导致GATK无法识别样本 2. BAM的@RG标签缺少SM字段,HaplotypeCaller报错 3. 参考基因组版本不统一,染色体名字不一致(chr1 vs 1)

3.5 数据准备检查清单

为了不让项目卡在数据环节,我个人整理了一个自查表,每次启动新分析前过一遍:

检查项 具体内容 验证命令/工具
FASTQ完整性 reads数目匹配、无截断文件 zcat | wc -l / FastQC
BAM排序 按坐标排序,有索引 samtools flagstat / samtools idxstats
BAM RG标签 ID、SM、LB、PL齐全 samtools view -H | grep '@RG'
重复标记 标记过的BAM有duplicate flag samtools view -f 1024 | wc -l
参考基因组索引 .fai 和 .dict 文件存在且匹配 samtools faidx / picard CreateSequenceDictionary
已知位点VCF 索引存在,染色体名称与参考一致 tabix -p vcf known_sites.vcf.gz

小技巧:把这些检查写成脚本,每天启动分析前跑一遍。check_inputs.sh 我从第一个项目用到现在,改了几十次,但核心逻辑没变过——宁可慢一点,不然后面出问题排查更浪费时间。

3.6 实战经验:数据目录结构

最后,说说目录组织。我习惯这样安排:

/project/
├── data/
│   ├── fastq/           # 原始FASTQ,按样本分文件夹
│   ├── bam/             # 比对后的BAM,含.bai索引
│   └── ref/             # 参考基因组软链接
├── scripts/
│   ├── check_inputs.sh  # 数据检查脚本
│   └── run_gatk_pipeline.sh
└── results/
    ├── gvcf/
    └── vcf/

为什么要强调目录结构?因为GATK的中间产物特别多,gVCF、BQSR表、VCF、过滤后的变异……如果乱放,出了错根本不知道哪个文件是哪个环节的。