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