跳转至

759. 全基因组duplications检测

一句话概述:检测基因组中拷贝数变异(CNV),找出哪些基因片段多了(duplication)或少了(deletion)——就像检查一本书有没有被多印了几页或撕掉了几页。


核心知识点速查表

概念白话解释关键工具
CNV拷贝数变异(>50bp的缺失/重复)多种工具联用
Duplication基因片段多了一份或多份读深↑
Deletion基因片段丢失读深↓
读深法(RD)根据测序深度推断CNVCNVnator, GATK gCNV
分裂读法(SR)根据软截断reads推断断点DELLY, Manta
读对法(RP)根据异常配对信息推断DELLY, Lumpy
duphold用深度信息验证SV/CNV真假过滤假阳性

一、原理(白话版)

1.1 什么是CNV/Duplication?

正常基因组:
  A-B-C-D-E-F(每个区域一份拷贝)

Duplication(重复):
  A-B-C-C-D-E-F(C区域多了一份)
  → 这段区域的测序深度会是正常的2倍
  → 基因剂量增加,可能导致过表达

Deletion(缺失):
  A-B-D-E-F(C区域丢了)
  → 这段区域的测序深度降为0
  → 基因缺失,功能丧失

CNV大小:
  小CNV: 50bp ~ 1kb → 最难检测
  中CNV: 1kb ~ 50kb → 主要检测目标
  大CNV: 50kb ~ 数Mb → 较容易检测

1.2 检测方法对比

方法原理优势劣势代表工具
读深(RD)区域测序深度异常大CNV敏感断点不精确CNVnator, GATK gCNV
分裂读(SR)读段部分比对断点精确小事件可能漏DELLY, Manta
读对(RP)配对插入片段异常中等CNV好需配对测序DELLY, Lumpy
组合方法多种信号结合最全面计算量大DELLY, Manta
深度学习AI模型预测新趋势需训练数据Cue

二、CNVnator分析流程

# ===== CNVnator:基于读深的CNV检测 =====
# 安装:conda install -c bioconda cnvnator

# Step 1: 提取mapping信息
cnvnator \
  -root sample.root \                   # 输出ROOT文件
  -tree sample_sorted.bam \            # 输入排序BAM文件
  -chrom chr1 chr2 chr3 chr4 chr5 chr6 chr7 chr8 chr9 chr10 \
         chr11 chr12 chr13 chr14 chr15 chr16 chr17 chr18 \
         chr19 chr20 chr21 chr22 chrX chrY  # 染色体列表

# Step 2: 生成直方图(计算读深分布)
cnvnator \
  -root sample.root \
  -his 100 \                            # bin大小=100bp(30x WGS推荐)
  -d /path/to/reference_dir/            # 参考基因组每条染色体的fasta目录

# Step 3: 统计学分析
cnvnator \
  -root sample.root \
  -stat 100                             # 统计bin大小=100的直方图

# Step 4: 分区分割(RD信号分段)
cnvnator \
  -root sample.root \
  -partition 100                        # 分区分析

# Step 5: 检测CNV
cnvnator \
  -root sample.root \
  -call 100 \                           # 调用CNV
  > sample_cnvnator.txt                 # 输出结果

# 输出格式解释:
# 列1: CNV类型(duplication/deletion)
# 列2: 坐标(chr:start-end)
# 列3: 大小(bp)
# 列4: 归一化读深(RD)  → duplication>1.5, deletion<0.5
# 列5-7: e-val等统计值

# ===== 过滤结果 =====
# 筛选高置信度的duplication
awk '$1=="duplication" && $4>1.5 && $5<0.01' sample_cnvnator.txt \
  > sample_duplications_filtered.txt    # 只保留读深>1.5且p<0.01的重复

三、GATK gCNV分析流程

# ===== GATK gCNV:基于模型的CNV检测(推荐) =====

# Step 1: 收集读深计数
gatk CollectReadCounts \
  -R reference.fa \                     # 参考基因组
  -I sample_recal.bam \                # 输入BAM
  -L intervals.interval_list \          # 区间列表
  --interval-merging-rule OVERLAPPING_ONLY \  # 区间合并规则
  -O sample.counts.hdf5                 # 输出计数文件(HDF5格式)

# Step 2: 准备区间列表(WGS用等宽bin)
gatk PreprocessIntervals \
  -R reference.fa \
  --bin-length 1000 \                   # bin大小(WGS推荐1000bp)
  --padding 0 \                         # 不加padding
  -O intervals.interval_list            # 输出区间文件

# 批量收集所有样本的计数
for sample in sample1 sample2 sample3; do
    gatk CollectReadCounts \
      -R reference.fa \
      -I ${sample}_recal.bam \
      -L intervals.interval_list \
      -O ${sample}.counts.hdf5 &
done
wait

# Step 3: 去噪建模(Cohort模式,需要多个样本)
gatk DetermineGermlineContigPloidy \
  -L intervals.interval_list \          # 区间
  --input sample1.counts.hdf5 \         # 样本1计数
  --input sample2.counts.hdf5 \         # 样本2计数
  --input sample3.counts.hdf5 \         # 样本3计数
  --contig-ploidy-priors ploidy_priors.tsv \  # 倍性先验
  --output ploidy_model \               # 输出倍性模型
  --output-prefix ploidy                # 输出前缀

# Step 4: 运行gCNV
gatk GermlineCNVCaller \
  --run-mode COHORT \                   # Cohort模式(多样本联合)
  -L intervals.interval_list \
  --input sample1.counts.hdf5 \
  --input sample2.counts.hdf5 \
  --input sample3.counts.hdf5 \
  --contig-ploidy-calls ploidy_model/ploidy-calls \  # 倍性结果
  --output cnv_model \                  # 输出CNV模型
  --output-prefix cnv                   # 输出前缀

# Step 5: 后处理(提取每个样本的CNV调用)
gatk PostprocessGermlineCNVCalls \
  --model-shard-path cnv_model/cnv-model \  # CNV模型
  --calls-shard-path cnv_model/cnv-calls \  # CNV调用
  --allosomal-contig chrX \             # 性染色体
  --allosomal-contig chrY \
  --contig-ploidy-calls ploidy_model/ploidy-calls \
  --sample-index 0 \                    # 样本索引(0=第一个样本)
  --output-genotyped-intervals sample1_intervals.vcf.gz \  # 区间级VCF
  --output-genotyped-segments sample1_segments.vcf.gz       # 片段级VCF

四、多工具联合策略(2025最佳实践)

# ===== 多工具联用提高准确性 =====
# 2025年benchmark显示:单一工具的F1值通常<70%
# 多工具取交集可将精确度提升至90%+

# 工具一:DELLY(SR+RP信号)
delly call \
  -g reference.fa \                     # 参考基因组
  -o sample_delly.bcf \                # 输出BCF文件
  sample_sorted.bam                     # 输入BAM

# 提取duplications
bcftools view \
  -i 'FILTER="PASS" && INFO/SVTYPE="DUP"' \  # 只要PASS且类型为DUP
  sample_delly.bcf \
  > sample_delly_dup.vcf

# 工具二:Manta
configManta.py \
  --bam sample_sorted.bam \            # 输入BAM
  --referenceFasta reference.fa \       # 参考基因组
  --runDir manta_output                 # 输出目录

python manta_output/runWorkflow.py \
  -j 8                                  # 8线程

# 工具三:CNVnator(读深信号)
# (见上方CNVnator流程)

# ===== duphold验证(关键过滤步骤) =====
# duphold给每个SV/CNV添加深度注释,帮助区分真假
duphold \
  -t 4 \                               # 线程数
  -v sample_delly.vcf \                # 输入SV/CNV的VCF
  -b sample_sorted.bam \              # BAM文件
  -f reference.fa \                     # 参考基因组
  -o sample_delly_duphold.vcf           # 输出带深度注释的VCF

# duphold添加的关键注释:
# DHFFC: flanking fold-change(侧翼区深度变化)
# DHBFC: breakpoint fold-change(断点区域深度变化)
# 对于真实的duplication: DHBFC > 1.3(区域内深度增加)
# 对于真实的deletion: DHBFC < 0.7(区域内深度降低)

# 用duphold过滤
bcftools view \
  -i 'INFO/SVTYPE="DUP" && FMT/DHBFC > 1.3' \  # Duplication: 区域深度>1.3x
  sample_delly_duphold.vcf \
  > sample_dup_high_conf.vcf            # 高置信度duplication

bcftools view \
  -i 'INFO/SVTYPE="DEL" && FMT/DHBFC < 0.7' \  # Deletion: 区域深度<0.7x
  sample_delly_duphold.vcf \
  > sample_del_high_conf.vcf            # 高置信度deletion

五、Python可视化CNV

# ===== Python可视化CNV结果 =====
import pandas as pd  # 导入pandas
import matplotlib.pyplot as plt  # 导入matplotlib
import numpy as np  # 导入numpy

# 读取CNVnator结果
cnv_data = []  # 存储CNV数据
with open("sample_cnvnator.txt") as f:
    for line in f:
        parts = line.strip().split()  # 按空格分割
        cnv_type = parts[0]           # duplication或deletion
        coords = parts[1]            # chr:start-end
        size = float(parts[2])       # 大小
        rd = float(parts[3])         # 归一化读深
        cnv_data.append({
            "type": cnv_type,
            "coords": coords,
            "size": size,
            "rd": rd
        })

df = pd.DataFrame(cnv_data)  # 转为DataFrame

# 可视化:CNV大小分布
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左图:大小分布
for cnv_type, color in [("duplication", "red"), ("deletion", "blue")]:
    subset = df[df["type"] == cnv_type]  # 按类型筛选
    axes[0].hist(np.log10(subset["size"]), bins=50, alpha=0.6,
                 color=color, label=cnv_type)  # 对数尺度直方图
axes[0].set_xlabel("log10(CNV size / bp)")  # x轴标签
axes[0].set_ylabel("Count")  # y轴标签
axes[0].set_title("CNV Size Distribution")  # 标题
axes[0].legend()  # 图例

# 右图:读深分布
axes[1].scatter(
    np.log10(df["size"]),  # x=大小
    df["rd"],              # y=归一化读深
    c=df["type"].map({"duplication": "red", "deletion": "blue"}),  # 颜色
    alpha=0.5, s=10
)
axes[1].axhline(y=1.0, color="gray", linestyle="--", label="Normal RD=1")  # 正常线
axes[1].axhline(y=1.5, color="red", linestyle="--", alpha=0.5, label="DUP threshold")  # DUP阈值
axes[1].axhline(y=0.5, color="blue", linestyle="--", alpha=0.5, label="DEL threshold")  # DEL阈值
axes[1].set_xlabel("log10(CNV size / bp)")
axes[1].set_ylabel("Normalized Read Depth")
axes[1].set_title("Read Depth vs CNV Size")
axes[1].legend()

plt.tight_layout()
plt.savefig("cnv_overview.png", dpi=300)  # 保存图片
plt.show()

六、常见报错与解决

报错信息原因解决方案
CNVnator: ROOT errorROOT未安装conda安装cnvnator自带ROOT
GATK gCNV: too few samplesCohort模式需多样本至少3个样本,推荐>10个
duphold: no readsBAM路径错误检查BAM文件和索引
Duplication false positives重复区域/低复杂度用duphold过滤DHBFC<1.3的
bin size选择bin太大漏小CNV30x WGS: bin=100-1000
小CNV检测率低<1kb CNV难以检测多工具联用,增加测序深度

七、面试高频问题

Q1: 如何提高CNV检测的准确性?

A: 多工具联用是关键。2025年benchmark显示,组合GATK gCNV + DELLY + CNVnator,取≥2个工具一致的结果,可以显著提高精确度。另外duphold工具利用深度信息过滤假阳性非常有效:真duplication区域内读深应增加(DHBFC>1.3)。

Q2: 检测duplication和deletion哪个更难?

A: Duplication更难检测。2025年临床基准测试显示,所有工具对duplication的敏感性都明显低于deletion。原因:①deletion导致读深为0,信号清晰;②duplication只是读深从1x变成2x,变化较小且容易受GC含量影响;③串联重复的比对困难。

Q3: WGS和WES检测CNV有什么区别?

A: WGS覆盖全基因组,能检测基因间区的CNV,分辨率更高。WES只覆盖外显子(~2%基因组),CNV检测受限于目标区域,断点精度差,但成本低。对于临床外显子CNV检测,WES配合专门工具(如XHMM、ExomeDepth)可以满足需求。


八、速查表

# ===== CNV/Duplication检测速查 =====

# CNVnator(读深法)
cnvnator -root s.root -tree s.bam
cnvnator -root s.root -his 100 -d ref_dir/
cnvnator -root s.root -stat 100
cnvnator -root s.root -partition 100
cnvnator -root s.root -call 100 > cnv.txt

# GATK gCNV
gatk CollectReadCounts -I s.bam -L intervals -O s.hdf5
gatk DetermineGermlineContigPloidy ...
gatk GermlineCNVCaller --run-mode COHORT ...
gatk PostprocessGermlineCNVCalls ...

# duphold验证(关键!)
duphold -v sv.vcf -b s.bam -f ref.fa -o sv_dh.vcf
# DUP: DHBFC > 1.3 → 真
# DEL: DHBFC < 0.7 → 真

# 多工具联用推荐组合:
# DELLY(SR+RP) + CNVnator(RD) + GATK gCNV(模型)
# 取≥2工具一致 → 高置信度CNV