跳转至

GATK4 CNV — 基于读段深度的拷贝数变异检测流程


一句话说明

GATK4 的体细胞 CNV 流程通过构建"正常样本面板(PoN)"来去除测序噪音,再对比肿瘤样本找出拷贝数异常区域——相当于先建"正常基准线",再找肿瘤偏离基准的地方,支持 WGS 和 WES。


安装与配置

# GATK CNV是GATK4内置工具,安装GATK4即可
conda create -n gatk_cnv -c bioconda -c conda-forge gatk4=4.6.0.0
conda activate gatk_cnv

# 验证相关工具可用
gatk CollectReadCounts --help     # 收集读段深度
gatk CreateReadCountPanelOfNormals --help  # 创建PoN
gatk DenoiseReadCounts --help     # 去噪
gatk ModelSegments --help         # 分割建模

# 下载必要资源文件(hg38)
# common germline SNP位点(计算等位基因频率用)
# 来源:GATK资源包 af-only-gnomad.hg38.vcf.gz

核心用法

第一阶段:构建Panel of Normals (PoN)

# 步骤1:对每个正常样本收集读段计数
# (WES需要区间文件,WGS可用自动生成的全基因组区间)

# 生成区间列表(WES/靶向测序)
gatk PreprocessIntervals \
    -R reference.fasta \
    -L targets.interval_list \    # 捕获区域
    --bin-length 0 \              # WES: bin长度设0(每个外显子为一个bin)
    --padding 250 \               # 两侧各延伸250bp
    -O preprocessed_intervals.interval_list

# 对每个正常样本收集读段深度
for normal_bam in normal1.bam normal2.bam normal3.bam; do
    sample="${normal_bam%.bam}"
    gatk CollectReadCounts \
        -I $normal_bam \
        -L preprocessed_intervals.interval_list \
        --interval-merging-rule OVERLAPPING_ONLY \
        -O ${sample}.counts.hdf5   # 输出HDF5格式(比VCF快)
done

# 步骤2:构建PoN(至少需要10-20个正常样本,越多越好)
gatk CreateReadCountPanelOfNormals \
    --input normal1.counts.hdf5 \
    --input normal2.counts.hdf5 \
    --input normal3.counts.hdf5 \
    --minimum-interval-median-percentile 5.0 \  # 过滤低覆盖bin
    --output cnv_pon.hdf5           # 输出PoN文件

第二阶段:肿瘤样本CNV检测

# 步骤1:收集肿瘤样本读段深度
gatk CollectReadCounts \
    -I tumor.bam \
    -L preprocessed_intervals.interval_list \
    --interval-merging-rule OVERLAPPING_ONLY \
    -O tumor.counts.hdf5

# 步骤2:收集等位基因计数(用于分析杂合性丢失LOH)
gatk CollectAllelicCounts \
    -I tumor.bam \
    -R reference.fasta \
    -L gnomad_common_sites.vcf.gz \   # 常见SNP位点
    -O tumor.allelicCounts.tsv

# 步骤3:去噪(对比PoN)
gatk DenoiseReadCounts \
    -I tumor.counts.hdf5 \
    --count-panel-of-normals cnv_pon.hdf5 \
    --standardized-copy-ratios tumor.standardizedCR.tsv \   # 标准化后的拷贝比
    --denoised-copy-ratios tumor.denoisedCR.tsv             # 去噪后的拷贝比

# 步骤4:分割建模
gatk ModelSegments \
    --denoised-copy-ratios tumor.denoisedCR.tsv \
    --allelic-counts tumor.allelicCounts.tsv \    # 等位基因计数(LOH分析)
    --output cnv_results \
    --output-prefix tumor                          # 输出前缀

# 步骤5:调用CNV片段
gatk CallCopyRatioSegments \
    --input cnv_results/tumor.cr.seg \            # ModelSegments输出
    --output tumor.called.seg                      # 最终CNV调用结果

参数详解

工具参数说明
PreprocessIntervals--bin-length 0WES模式(每个捕获区域为一个bin)
PreprocessIntervals--bin-length 1000WGS模式(1kb一个bin)
PreprocessIntervals--padding 250捕获区域两侧扩展(WES)
CollectAllelicCounts-L gnomad_sites.vcf.gz常见SNP位点(用于LOH分析)
ModelSegments--allelic-counts加入LOH分析(肿瘤CNV必须)
DenoiseReadCounts--count-panel-of-normals输入PoN文件

实战案例

# 完整GATK CNV体细胞流程(WGS,hg38)

REF="hg38.fasta"
# WGS区间:全基因组常染色体(1kb bin)
INTERVALS="hg38.autosomal.interval_list"
PON="cnv_panel_of_normals.hdf5"      # 预建的PoN
GNOMAD_SITES="small_exac_common_3.hg38.vcf.gz"

# 1. 收集肿瘤读段深度
gatk CollectReadCounts \
    -I tumor.bam -L $INTERVALS \
    --interval-merging-rule OVERLAPPING_ONLY \
    -O tumor.counts.hdf5

# 2. 收集等位基因深度(LOH分析)
gatk CollectAllelicCounts \
    -I tumor.bam -R $REF \
    -L $GNOMAD_SITES \
    -O tumor.allelicCounts.tsv

# 3. 去噪
gatk DenoiseReadCounts \
    -I tumor.counts.hdf5 \
    --count-panel-of-normals $PON \
    --standardized-copy-ratios tumor.stdCR.tsv \
    --denoised-copy-ratios tumor.denoisedCR.tsv

# 4. 建模分割
gatk ModelSegments \
    --denoised-copy-ratios tumor.denoisedCR.tsv \
    --allelic-counts tumor.allelicCounts.tsv \
    --output cnv_out --output-prefix tumor

# 5. 调用CNV
gatk CallCopyRatioSegments \
    -I cnv_out/tumor.cr.seg \
    -O tumor.called.seg

# 6. 可视化
gatk PlotDenoisedCopyRatios \
    --standardized-copy-ratios tumor.stdCR.tsv \
    --denoised-copy-ratios tumor.denoisedCR.tsv \
    --sequence-dictionary $REF.dict \
    --output-prefix tumor_cnv \
    --output cnv_plots/

gatk PlotModeledSegments \
    --denoised-copy-ratios tumor.denoisedCR.tsv \
    --allelic-counts cnv_out/tumor.hets.tsv \
    --segments cnv_out/tumor.modelFinal.seg \
    --sequence-dictionary $REF.dict \
    --output-prefix tumor_modeled \
    --output cnv_plots/

常见报错与解决

报错1:The PoN does not contain data for interval - 原因:肿瘤样本和PoN使用了不同的区间文件(WES捕获版本不同) - 解决:确保PoN构建和肿瘤样本分析使用完全相同的preprocessed_intervals.interval_list

报错2:ModelSegments内存溢出 - 原因:WGS全基因组分析数据量大 - 解决:增加JVM内存gatk --java-options "-Xmx32g" ModelSegments

报错3:可视化失败(R错误) - 原因:缺少R包(gatk_cnv_conda_env中的R包) - 解决:conda install -c conda-forge r-ggplot2 r-gplots r-reshape


速查表

工具说明
gatk PreprocessIntervals准备区间文件(WES/WGS)
gatk CollectReadCounts收集每个bin的读段深度
gatk CreateReadCountPanelOfNormals从多个正常样本构建PoN
gatk DenoiseReadCounts用PoN去噪肿瘤数据
gatk CollectAllelicCounts收集SNP位点等位基因计数
gatk ModelSegments分割建模(含LOH)
gatk CallCopyRatioSegments调用拷贝数状态
gatk PlotDenoisedCopyRatios可视化去噪结果
gatk PlotModeledSegments可视化分割结果
*.called.seg最终CNV调用结果文件