多样本联合分型#
多个样本一起分析时,推荐 GATK 的 gVCF 流程:每个样本单独生成 gVCF,把所有样本的 gVCF 合并成一个多样本 gVCF,再对合并结果做联合分型,得到群体 VCF。新增样本时只需为新样本生成 gVCF,再重新合并和分型。
--emit-mode gvcf每个样本一次
可同时联合分型:
--genotype-out概述#
| 步骤 | 命令 | 对应的 GATK 工具 | 输出一致性 |
|---|---|---|---|
| 单样本 gVCF | haplotyper --emit-mode gvcf |
HaplotypeCaller -ERC GVCF |
逐条记录相同 |
| 合并 gVCF | combinegvcfs |
CombineGVCFs 4.6.2.0 | 逐条记录相同(表头除 ##GATKCommandLine 外也相同) |
| 联合分型 | gvcftyper,或 combinegvcfs --genotype-out |
GenotypeGVCFs 4.6.2.0 | 逐条记录相同 |
分步说明#
1. 为每个样本生成 gVCF#
baizegen-gpu haplotyper --device gpu -R REFERENCE -I SAMPLE.bam -t NUMBER_THREADS \
--emit-mode gvcf -O SAMPLE.g.vcf.gz
--emit-mode gvcf与 GATK 的-ERC GVCF等价(也接受-ERC GVCF写法)。逐碱基输出用--emit-mode bp_resolution。- 多倍体样本加
--ploidy N。不同倍性的样本可以一起合并和分型。
2. 合并 gVCF 并联合分型#
ls gvcf/*.g.vcf.gz > GVCF_LIST # 每行一个 gVCF 路径
baizegen-gpu combinegvcfs --device gpu -R REFERENCE --variant-list GVCF_LIST -t NUMBER_THREADS \
-O COHORT.g.vcf.gz --genotype-out COHORT.vcf.gz
需要的输入:
- REFERENCE:参考基因组 FASTA(需要
.fai)。 - GVCF_LIST:gVCF 路径列表文件,每行一个;也可以用多个
-V SAMPLE.g.vcf.gz逐个给出。 - COHORT.g.vcf.gz:合并后的多样本 gVCF,与 GATK CombineGVCFs 的输出逐条相同。
- COHORT.vcf.gz(可选):
--genotype-out在合并的同时做联合分型,输出与之后对合并结果单独运行gvcftyper逐字节相同。不需要 VCF 时去掉这个参数。
输入顺序会影响输出
与 GATK 一样,-V / --variant-list 中 gVCF 的顺序会影响输出中等位基因的排列顺序。要与其他结果对比时,请使用相同的输入顺序。
说明:
-t N(N ≥ 2)且输出为.gz时,按基因组区段并行处理,输出与单线程相同。--device gpu(仅 GPU 版)在 GPU 上完成合并、联合分型和压缩,结果与 CPU 相同;--gpus N|all选择显卡。- gVCF 表头中染色体的顺序与参考基因组不同、或表头多出参考基因组没有的染色体,都可以直接运行(与 GATK 相同);同名染色体长度不一致时才需要加
--disable-sequence-dictionary-validation。 - 只处理部分区域时用
-L/-XL(需要输入 gVCF 有索引)。 - 主机内存紧张时任务会等待而不是被系统终止。大队列(数百个样本)请预留充足内存。
- 不要求与 GATK 逐字节相同时,可加
--merge-ties-by-input提速,见加速选项。
3. 对已合并的 gVCF 联合分型#
已有合并好的 gVCF(或者只有一个单样本 gVCF)时,用 gvcftyper 分型:
baizegen gvcftyper -r REFERENCE -v COHORT.g.vcf.gz -t NUMBER_THREADS [-d DBSNP] -O COHORT.vcf.gz
- -r REFERENCE:参考基因组,需要同时有
.fai和.dict。注意这里是小写-r。 - -v:一个 gVCF(单样本或多样本)。与 GATK GenotypeGVCFs 一样,只接受一个输入;多个样本请先用
combinegvcfs合并。 - -d DBSNP(可选):dbSNP VCF,用于填写 ID 列。
-t N(N ≥ 2)时按区段并行,输出与单线程相同;需要输入有 tabix 索引,没有时会自动创建。- 输出中样本按名称排序,与 GenotypeGVCFs 相同。
GATK 3 / 4.0 产生的旧 gVCF
旧版本 GATK 的 gVCF 使用 RAW_MQ 注释。GenotypeGVCFs 遇到这种记录会报错退出,gvcftyper 也一样(退出码 2)。加 --allow-old-rms-mapping-quality-annotation-data 按 GATK 的旧规则计算 MQ。
加速选项:--merge-ties-by-input#
合并时经常有多个样本在同一位置都有记录,需要决定它们的合并先后。GATK 按其内部排序结构当时的状态决定先后:这个顺序没有生物学含义,却取决于从基因组开头到该位置的全部历史,只能逐条依次计算。默认情况下 combinegvcfs 完全复现这个顺序,因此这一步只能用一个 CPU 核;在单核较慢的机器上它决定整个任务的耗时,增加显卡也不会更快。
加 --merge-ties-by-input 后,同一位置的记录改按输入列表(-V / --variant-list)中的顺序合并。这个规则不依赖前面的历史,可以分给多个 CPU 核和多张显卡同时计算。代价是输出不再与 GATK 逐字节相同。
结果有何不同#
绝大多数差异只是多等位位点上 ALT 的排列顺序:合并后的 ALT 按记录合并的先后排列。等位基因是同一组,每个样本的基因型也相同,只是编号随顺序变化;AC、AF、MLEAC、PL 等按等位基因排列的数值随之重排,数值本身不变。例如某个位置上样本 1 是 A→T、样本 2 是 A→G:
样本 2:A → G
先后由之前的全部历史决定
样本 2:A → G
--merge-ties-by-input先样本 1,后样本 2按输入列表的顺序
两种写法中样本 1 都是 A/T,只是 T 的编号从 2 变成了 1。
极少数位点(约每 4 万个位点 1 个)的数值有变化:
- QUAL 的最后一位数字(似然值相加的先后不同带来的舍入差别);
- 候选等位基因超过 6 个的位点,保留哪 6 个可能不同(GenotypeGVCFs 默认每个位点最多保留 6 个);
- 少数缺失变异的写法,以及被它覆盖的位点上的
*。
100 个猪样本(20 Mb 区段)实测的比例:
| 仅 ALT 顺序不同 | 数值有变化 | |
|---|---|---|
| 合并后的 gVCF 记录 | 约 0.09% | 0 |
| 联合分型后的 VCF 位点 | 约 2.4% | 约 0.0024% |
按此比例,全基因组 VCF 的约 5,600 万个位点中,约 130 万个仅 ALT 顺序不同,约 1,300 个数值有变化;全基因组实测的变异位点总数相差 2 个。
两种结果都是正确的:区别只在于同一位置的记录谁先谁后,没有哪一种更准确。
结果可重复
输入文件和输入顺序相同时,无论在哪台机器上、用几张显卡,--merge-ties-by-input 的输出都逐字节相同。与默认方式一样,改变输入顺序会改变输出,请固定输入列表的顺序。
速度#
gVCF 共 339 GB,输入在本地 NVMe;2 × Xeon Gold 6226R(共 32 核 64 线程),-t 64;一次输出 gVCF 和 VCF。倍数相对同一显卡数的默认方式。
- 默认方式的耗时取决于 CPU 单核速度,增加显卡不会更快。
- 加
--merge-ties-by-input后主要工作量转到显卡上,第二张显卡才能发挥作用。 - 峰值内存约 44–46 GB(默认方式约 28–31 GB)。
如何选择#
- 需要与 GATK 结果逐字节比对(验收、对标测试):使用默认方式。
- 只关心分析结果、希望更快:加
--merge-ties-by-input。在 CPU 单核较慢、有多张显卡的机器上效果最明显;单核很快、只有一张显卡时可能没有提升。
参考耗时#
- 100 个猪样本全基因组(gVCF 共 339 GB,输入在本地 NVMe,1 × RTX 5090 32 GB + Threadripper 3960X):
combinegvcfs --device gpu --genotype-out一次输出 gVCF 和 VCF 共 11 分 40 秒,峰值内存 25.8 GB。 - 同一批 100 个猪样本在 2 × RTX 4090 24 GB + 2 × Xeon Gold 6226R 上:默认 14 分 40 秒,加
--merge-ties-by-input6 分 58 秒(见加速选项)。 - 857 个玉米样本(gVCF 共 4.75 TB,输入输出都在 NAS 上):全基因组 gVCF + VCF 约 4–5 小时,峰值内存约 150 GB。