跳转至

347_罕见病基因panel设计


一句话说明

罕见病基因panel是"精准撒网"——针对特定疾病类型选择一组相关基因,比全基因组测序便宜快速,比单基因检测覆盖更全,是临床罕见病诊断的主力工具。


核心知识点

要点1:为什么用panel而不是WES/WGS?

白话类比:捕鱼时,如果你知道这片水域只有5种鱼,用合适网眼的专用渔网比用全海域拖网更高效——panel就是这个专用渔网。 专业解释:Panel优势:①成本低(约WES的1/3-1/5);②覆盖深度高(可达200-500x vs WES 50-100x),提高低频嵌合变异检测率;③数据分析简单,报告时间短;④降低偶发发现伦理问题。适用场景:表型明确、已知遗传异质性但基因数有限的疾病(如遗传性心肌病、遗传性癫痫等)。

要点2:Panel基因选择原则

白话类比:不是随便往里加基因,要选那些"证据充分、临床相关、基因检测能改变医疗决策"的基因。 专业解释:ClinGen基因-疾病关联证据分级(Definitive/Strong/Moderate/Limited/No Known Disease Relationship)。Panel设计原则:①选择Definitive/Strong级别基因为核心;②Moderate级别可选择性纳入并注明证据水平;③排除Limited/Disputed基因避免误导;④参考OMIM、Orphanet、PanelApp数据库。

要点3:Panel类型分类

白话类比:panel有小有大,从"只查心脏病基因"到"查所有神经发育病基因",根据临床情景选择。 专业解释: - 疾病特异性panel:遗传性乳腺癌(BRCA1/2+15基因)、Lynch综合征(MLH1/MSH2/MSH6等) - 症状导向panel:智力障碍panel(>100基因)、癫痫panel(>80基因) - 综合遗传病panel(comprehensive):>300基因,接近WES但有深覆盖优势 - 心脏遗传病panel:遗传性心肌病(MYH7/MYBPC3/TNNT2等50+基因)

要点4:探针/引物设计策略

白话类比:就像钓鱼用的钩,要确保每个重要区域都有探针"钓到",特别是外显子和关键剪接位点。 专业解释:捕获探针设计(杂交捕获法):覆盖目标基因的所有外显子 ± 外显子边界±20-50bp内含子(捕获剪接位点)。重复区域(如CYP21A2与假基因)需要特殊设计避免交叉反应。工具:Agilent SureDesign、IDT xGen Panel、Twist Bioscience。

要点5:Panel数据的特殊分析要点

白话类比:Panel数据比WES更"精细",深覆盖让我们能发现WES错过的事情,但也需要注意不同基因区域的覆盖均一性。 专业解释:关键分析:①均匀性检查(Uniformity:>90%位点覆盖深度>20x);②CNV检测(利用深覆盖,工具:ExomeDepth/CANOES);③重复区域的特殊变异(假基因干扰:CYP21A2、PMS2等需要长读测序或MLPA确认);④嵌合变异检测(VAF<30%,需高深度支持)。


实战命令/代码

# ========== Panel设计:提取目标区域BED文件 ==========

# 使用PanelApp数据库API获取panel基因列表(英国NHS推荐)
python3 << 'EOF'
import requests   # HTTP请求
import json       # JSON解析

# PanelApp API:获取特定panel的基因列表
# 示例:遗传性癫痫panel (panel ID: 402)
panel_id = 402
url = f"https://panelapp.genomicsengland.co.uk/api/v1/panels/{panel_id}/genes/"

response = requests.get(url, timeout=30)  # 发送请求
data = response.json()

# 提取基因名称(仅绿色=Definitive级别)
genes = []
for gene in data['results']:
    if gene['confidence_level'] == '3':  # 3=绿色=高证据
        genes.append(gene['gene_data']['gene_symbol'])  # 提取基因名

print(f"Panel基因数量: {len(genes)}")
print("基因列表:", genes[:10], "...")  # 显示前10个

# 保存基因列表
with open("panel_genes.txt", "w") as f:
    f.write("\n".join(genes))  # 每行一个基因名
EOF
# ========== 从基因列表生成目标区域BED ==========

# 使用UCSC Table Browser或BioMart获取基因外显子坐标
# 这里用biomaRt R包自动化获取

Rscript << 'EOF'
library(biomaRt)    # 基因组数据库接口
library(dplyr)      # 数据处理

# 读取Panel基因列表
genes <- readLines("panel_genes.txt")  # 读取基因名

# 连接Ensembl数据库(GRCh38)
mart <- useMart("ensembl", 
                dataset = "hsapiens_gene_ensembl",
                host = "https://grch38.ensembl.org")  # GRCh38版本

# 获取外显子坐标
exons <- getBM(
    attributes = c("chromosome_name", "exon_chrom_start", 
                   "exon_chrom_end", "hgnc_symbol"),  # 需要的字段
    filters = "hgnc_symbol",           # 按基因名过滤
    values = genes,                    # 目标基因列表
    mart = mart
)

# 添加±50bp捕获剪接位点
exons$start_padded <- exons$exon_chrom_start - 50  # 左侧延伸50bp
exons$end_padded <- exons$exon_chrom_end + 50      # 右侧延伸50bp

# 过滤标准染色体
exons <- exons[exons$chromosome_name %in% c(1:22, "X", "Y"), ]

# 格式化为BED格式(0-based坐标)
bed <- data.frame(
    chrom = paste0("chr", exons$chromosome_name),
    start = exons$start_padded - 1,   # BED格式0-based
    end = exons$end_padded,
    name = exons$hgnc_symbol
)

# 排序和去重
bed <- bed %>% 
    arrange(chrom, start) %>%   # 按染色体位置排序
    distinct()                   # 去除重复区域

# 保存BED文件
write.table(bed, "panel_targets.bed", 
            sep="\t", quote=FALSE, row.names=FALSE, col.names=FALSE)

cat("BED文件生成完成,共", nrow(bed), "个区间\n")
EOF
# ========== Panel测序数据质控 ==========

# 计算Panel覆盖统计
mosdepth \
    --by panel_targets.bed \     # Panel目标区域
    --no-abbrev \                # 不简写报告
    --quantize 0:10:20:50: \    # 按深度分层统计(0x,10x,20x,50x)
    --threads 4 \               # 并行线程
    sample_coverage \           # 输出前缀
    sample.bam                  # 输入BAM

# 查看覆盖汇总
cat sample_coverage.mosdepth.summary.txt  # 均值、中位数覆盖深度

# 计算各深度覆盖率
python3 << 'EOF'
import pandas as pd   # 数据处理

# 读取mosdepth分位数文件
df = pd.read_csv("sample_coverage.quantized.bed.gz", 
                 sep='\t', names=['chr','start','end','depth_range'])

# 计算Panel各深度覆盖比例
total_bases = df['end'].sub(df['start']).sum()  # 总碱基数

for threshold in [10, 20, 50, 100]:
    # 筛选超过阈值深度的区域
    covered = df[df['depth_range'].apply(
        lambda x: int(x.split(':')[0]) >= threshold if ':' in x else False
    )]
    covered_bases = covered['end'].sub(covered['start']).sum()
    pct = covered_bases / total_bases * 100
    print(f">={threshold}x 覆盖率: {pct:.1f}%")
EOF
# ========== Panel CNV检测(ExomeDepth)==========
# ExomeDepth利用多样本对比检测CNV

# 这里展示R语言ExomeDepth基本流程
import subprocess   # 调用R脚本

r_script = """
library(ExomeDepth)   # CNV检测包

# 读取目标区域BED
exons <- read.table("panel_targets.bed", header=FALSE,
                    col.names=c("chromosome","start","end","name"))

# 从BAM文件统计各区域读数
# 需要先用samtools对每个样本生成计数
bam_files <- c("sample1.bam", "sample2.bam", "control1.bam")
counts <- getBamCounts(bed.frame = exons,
                       bam.files = bam_files,
                       min.mapq = 20)  # 最低比对质量

# 选择参考样本(正常对照)
my_choice <- select.reference.set(
    test.counts = as.vector(counts[, "sample1"]),     # 待分析样本
    reference.counts = counts[, c("control1", "control2")],  # 对照
    bin.length = exons$end - exons$start             # 区域长度
)

# 运行ExomeDepth CNV检测
mytest <- new("ExomeDepth",
    test = as.vector(counts[, "sample1"]),           # 测试样本计数
    reference = as.vector(my_choice$reference.count), # 参考计数
    formula = "cbind(test, reference) ~ 1")

mytest <- CallCNVs(x = mytest, transition.probability = 10^-4,
                   chromosome = exons$chromosome,
                   start = exons$start,
                   end = exons$end, name = exons$name)

# 输出CNV结果
write.csv(mytest@CNV.calls, "cnv_results.csv", row.names=FALSE)
cat("CNV检测完成,发现", nrow(mytest@CNV.calls), "个CNV\n")
"""

with open("run_exomedepth.R", "w") as f:
    f.write(r_script)  # 保存R脚本

subprocess.run(["Rscript", "run_exomedepth.R"])  # 运行R脚本

面试常问点

★ Q1:Panel设计时如何决定哪些基因纳入?有什么权威依据?

优先参考:①ClinGen基因-疾病关联数据库(Definitive/Strong级别基因优先纳入);②OMIM遗传病数据库(有相应OMIM编号的已确认基因);③英国NHS PanelApp(各疾病panel基因列表可免费获取);④疾病领域专科学会推荐(如遗传性心肌病需参考ESC心律失常基因panel指南)。排除证据不足的基因(ClinGen Limited/Disputed),避免误导临床。

★ Q2:Panel测序为什么优于WES/WGS用于特定场景?

三大优势:①覆盖深度高(panel 200-500x vs WES 50-100x),可检测低VAF嵌合变异和低频CNV;②成本低(约WES的1/5),患者经济负担小;③分析报告聚焦(不产生大量偶发发现,避免伦理困境)。适用场景:表型明确(如心律失常、遗传性视网膜病变)、基因数量已知的遗传病。

★ Q3:Panel数据如何检测CNV?和WES的CNV检测有何不同?

Panel CNV检测:利用panel内多个外显子作为参照,通过读数比较(ExomeDepth、CANOES)检测相对拷贝数变化。优势:高覆盖度使单外显子缺失检测更准确(WES难以可靠检测<3个外显子的小CNV)。局限:只覆盖Panel内基因,无法检测Panel外CNV;需要多样本对比(推荐≥10个对照样本)。

★ Q4:什么情况下Panel检测结果阴性需要升级到WES/WGS?

①Panel阴性但临床表型高度提示遗传病(阴性预测值不高);②高度遗传异质性疾病(如智力障碍,有数百个致病基因),panel覆盖不全;③疑似新发现致病基因(Panel不含);④疑似大结构变异(非Panel可检测的CNV/SV);⑤WES/WGS成本在患者可承受范围内。

★ Q5:假基因干扰(如PMS2、CYP21A2)如何处理?

假基因问题:PMS2基因与PMS2CL假基因相似度>97%,CYP21A2与假基因CYP21A1P相似度>98%,标准短读测序无法区分。解决方案:①MLPA检测(金标准,针对特定区域);②长读测序(Nanopore/PacBio HiFi,可区分真假基因);③基因特异性长程PCR + Sanger测序;④报告时注明假基因干扰可能。


速查表

Panel类型基因数适用疾病优势
单病种小panel5-30遗传性乳腺癌、Lynch综合征快速、经济
症状导向panel50-200癫痫、智力障碍、心肌病覆盖广
综合遗传病panel>300未分类遗传病接近WES
心脏遗传病panel77-100心律失常、心肌病深覆盖CNV
工具/资源用途网址
PanelApp权威Panel基因列表panelapp.genomicsengland.co.uk
ClinGen基因-疾病证据级别clinicalgenome.org
ExomeDepthPanel CNV检测bioconductor.org
Agilent SureDesign探针设计agilent.com
OMIM遗传病基因数据库omim.org