tNGS Panel 引物池设计:从单对引物到可审计的多重体系
以本机 PanelBee 项目为例,梳理联合覆盖、候选筛选、二聚体冲突优化、多管分池与最终引物审计,讲清计算设计和临床验证之间的边界。
一批引物都通过了单对设计,为什么混在一起之后仍然可能出现问题?
对临床诊断生信工程师而言,tNGS panel 的交付对象是一个有明确检测范围、相互作用约束和验证边界的整体。单对引物的长度、GC 和熔解温度只是其中一部分;种内变异、近缘物种、人源背景、引物之间的相互作用,以及最终下单序列的身份,都需要进入同一条证据链。
本文以本机 PanelBee/tngs_cli 项目在 2026 年 9 月 28 日的工作区源码为主要依据,讨论多重 PCR 扩增型 tNGS panel 的引物池设计。内容不涵盖杂交捕获型 panel。文中将项目实现、数学示例和工程建议分别说明,计算审计结果也不作为临床性能结论。
1. 先确定检测声明,再确定候选引物
开始设计前,建议先完成一张“检测声明表”:目标是单一物种还是物种复合群,使用什么样本,需要覆盖哪些种内差异,又必须区分哪些近缘非目标。这些决定会直接影响什么叫自身命中、什么叫交叉命中,以及哪些失败不能通过放宽阈值解决。
PanelBee 对旧 TaxID、菌株/亚种与物种之间的关系进行归一化,并允许显式定义复合群检测范围。一个序列同时命中复合群内多个成员,在“复合群检测”和“单一物种鉴别”两个任务中,可能具有不同的解释。改变目标范围,应当形成新的检测声明和版本,不能仅作为提高成功率的参数调整。[P1]
临床项目还应在这一阶段约定:单靶标还是多靶标支持报告、无结果目标如何呈现、RNA 目标涉及的前处理及逆转录环节如何验证。设计名单中的一个物种,不等于已经建立了该物种的临床检测能力。这些是项目验收问题,不能留到拿到引物清单后再决定。
2. 覆盖率必须落到同一条序列的两端
参考序列多,并不自动意味着代表性好。相同或高度重复的记录可能主导列频率;某些来源在数据库中缺失,也无法靠增加已有记录数补齐。项目的模板筛选先合并精确比对单倍型,再采用基于位置的 Henikoff 权重,减弱重复记录对保守性判断的支配。位置权重方法的原始依据见文献 [1],这里的具体使用方式来自项目实现。[P2]
更关键的是,逐列保守、左端保守和右端保守,不能替代两端共同匹配。项目在启用联合锚点筛选时计算:
C_pair = Σ w_h × I(单倍型 h 同时完整匹配左右锚点)
Σ w_h = 1
例如,一个人为构造的参考集合中,左锚点匹配 H1、H2,右锚点匹配 H1、H3;H1、H2、H3 的权重分别为 0.60、0.20、0.20。左右各自覆盖都是 80%,联合覆盖却只有 60%。这只是集合交集示例,不是观测数据,也不是检测阈值。
项目用同时支持两端的真实观测单倍型生成模板,避免逐列拼接出没有实际序列支持的组合。与此同时,必须保留一个限制:锚点覆盖率属于被评估的锚点,不能自动转移给后续改变位置或长度的最终引物。连续保守模板允许 Primer3 在较大区域内搜索,救援阶段也可能扩展位置窗口;最终交付时仍应针对实际引物重新确认所声明的覆盖。[P2]
这里的“完整匹配比例”是明确的计算口径,既不是 PCR 扩增效率,也不是临床灵敏度。
3. 四类候选池,不是四个 PCR 反应管
项目将模板分为四类:完全保守/严格特异、非完全保守/严格特异、完全保守/非严格特异、非完全保守/非严格特异。它们描述的是候选证据等级。主流程按阶段调用 Primer3,并记录救援和选择来源;首个产生可用完整引物对的阶段被选中,后续阶段不再继续竞争。[P3]
Primer3 能在指定位置和理化约束下生成并排序候选,引入热力学模型评估相关结构风险;其 penalty 是设计排序依据。[2] 当前项目还限制每模板及每物种保留的候选数量。这有助于控制下游规模,却也限定了后续优化能够看到的候选空间。[P3]
比较 Tm、发卡或二聚体结果时,还应保存盐离子、寡核苷酸浓度、温度及实际调用参数等计算条件,并核对不同工具是否采用可比较的模型设置。相同的数字阈值,在不同条件下未必表示相同的约束。本文不把软件默认值作为已验证的湿实验配方,也不据一份配置文件就认定所有下游工具都已使用这些值。[2,3]
因此,“筛选器找不到无冲突组合”至少需要分成两个问题:当前候选集中有没有解,以及更换位点、重新生成候选后有没有解。前者失败,不能证明目标在生物学上不可设计;前者成功,也不能证明已经找到整个候选空间的最佳 panel。
另一个常见误读是把特异性分数当成概率。项目的分类学感知评分利用自身与跨物种比对证据做排序,并对同一非目标物种聚合最强命中。这个指数依赖参考库、分类关系和模型设置;分数 90 不代表“90% 的实验特异性”。[P1]
4. 引物池优化的单位,应是完整引物对
MFEprimer 提供二聚体、发卡及非特异性扩增等质量检查能力。[3] 在当前项目主流程中,二聚体步骤调用的是其 dimer 功能,随后把单条引物间的事件映射到完整引物对之间的冲突。工具具备的全部功能,不能直接当成某次流程已经运行的检查项目。[P4]
以引物对作为图中的节点,有一个直接好处:删除候选时同时删除 F 和 R,不会留下无法完成预期扩增的孤立引物。不同引物对之间的相互作用构成边;同一引物对内部出现的冲突,则形成自环。
当前工作区的二聚体删除模块,以最少删除引物对为目标,建立如下约束模型:
x_i = 1 表示删除引物对 i,0 表示保留
目标:最小化 Σ x_i
冲突边 (i,j):x_i + x_j ≥ 1
每个有候选的物种 s:Σ[i 属于 s] (1 − x_i) ≥ 1
实现优先使用 CP-SAT,缺少相应依赖时回退到 PuLP/CBC;冲突关系与同物种约束共同决定可拆分的连通分量。[P4]
这个目标的含义非常有限而具体:在输入候选和已建模冲突内减少删除数。它没有同时优化所有临床终点,也不模拟实际扩增效率。CP-SAT 分支接受 OPTIMAL 或 FEASIBLE 状态;因此,仅凭程序成功结束,不能无条件宣称每次都已经证明最少删除,更不能宣称整体 panel 获得全局最优性能。
自环不能通过把 F、R 分到不同反应管来解决。它提示该引物对自身需要处理;拆开预期配对关系会改变原设计。若它又是某物种唯一候选,当前二聚体模块会在无法兼顾冲突约束与物种保留要求时停止,并给出诊断信息。诊断所列物种是该模型下的一组修复线索,不宜解读为唯一的生物学责任归因。[P4]
三种冲突,不应合并成同一个“通过”
| 检查层面 | 当前主流程的处理方式 | 结果如何解释 |
|---|---|---|
| 已报告二聚体冲突 | 约束优化;引物对成对删除;有候选物种至少留一对 | 无法满足约束时停止;无已报告冲突不等于实验中绝无二聚体 |
| 潜在非特异性扩增 | 按剩余风险逐轮贪心删除,并保留物种下限 | 无法继续删除的风险被保留和记录,需复核 |
| 靶标同源冲突 | 将命中聚合成无向冲突图,贪心筛选后同步更新引物 | 同源信号是区分与判读风险线索,不等于已发生交叉扩增 |
后二者来自 spec_selector.py 和 target_remover.py。[P5] 它们与二聚体删除模块并非同一种算法;“为了保留物种而保留风险”也不能写成“风险已被消除”。
5. 从候选筛选到多管分池,还需要一次决策
真正的多管分池,是把完整引物对分配到具体反应管。候选删除回答“保留谁”,分池回答“谁与谁共同反应”。在本次核查的主流程中,未发现自动输出多管分配方案的完整路径;四类候选池和最后保留的一个集合,不足以证明这项能力已经实现。[P3–P5]
PrimerPooler 是另一类问题的例子:其官方说明包括在候选池之间移动引物集合、减少相互作用、处理扩增子重叠和限制每池规模等功能。[4] 引用它是为了说明任务边界,并不表示 PanelBee 已经集成该工具,也不是对其临床效果的背书。
下面用一个不含真实序列的例子解释选择差异。目标 A 有 A1、A2 两对备选,目标 B 只有 B1;已知冲突只有 A1—B1:
| 方案 | 数学上如何处理冲突 | 仍需回答的问题 |
|---|---|---|
| 保留一个集合 | 删除 A1,保留 A2、B1 | A2 能否满足原来的覆盖与冗余要求? |
| 分到两个反应管 | A1 放一管,A2 与 B1 放另一管 | 增加的反应管、样本分配和各管表现是否可接受? |
| 重新生成候选 | 寻找能够替代 A1 或 B1 的设计 | 新位点是否仍满足检测声明和验证要求? |
示例没有预测哪一种在实验中更好。它说明,保留数量、池数和每目标冗余是不同目标;“每物种至少一对”只是软件保留底线,不是临床上足够稳健的统一标准。
6. 人源风险与接头风险,要审计实际参与反应的序列
单条引物命中人源参考,只说明搜索发现了潜在结合证据。项目进一步检查两端所在参考、相向关系、引物 3′ 端与产物跨度。F/R 是预期靶标上的命名,不限制其他位点的物理方向,所以同标签和跨引物对组合也在审计范围内。[P6]
这里还要检查“没有命中”是如何产生的:程序成功且搜索结果为空,可以是一项有效的阴性计算结果;输出文件缺失则是执行问题。即使输出完整,BWA/BLAST 等搜索的参考范围和启发式设置仍限定了证据边界,不能解释为已经穷尽所有可能的扩增事件。[P6]
接头或通用尾序列是另一个容易漏掉的交付边界。本次查看的主流程二聚体检查读取的是前序候选引物文件;名称为 PrimerAdapter 的步骤实际执行物种结果汇总。仓库另有添加接头的脚本,但脚本存在不等于主流程已经审计带尾的完整合成序列。[P7]
实际项目中,建议分别冻结靶向结合部分与完整合成序列,明确各检查使用哪一个版本。增加通用尾、标签或其他组成后,应基于最终序列重新评估相关相互作用,不能沿用修改前的“无已报告冲突”结论。具体检查范围还应匹配实际建库结构,而不是套用一个统一拼接模板。
7. 最终名单必须与最终证据一一对应
PanelBee 的联合审计回到最终保留的 F、R 和靶标 T,核对 ID、物种归属、序列、方向以及预期产物的一致性。它还将历史二聚体及人源成对事件按最终名单过滤,避免把已经删除的候选风险继续计入交付结果。[P8]
| 审计状态 | 当前含义 | 交付时应如何对待 |
|---|---|---|
pass |
关联完整,满足当前实现中的计算风险条件 | 可以进入后续评审;不等于湿实验或临床验证通过 |
review |
关联完整,但有需要复核的计算风险 | 保留原因,逐项处理,不能仅凭有序列就下结论 |
invalid |
身份、关联、序列或产物信息不完整/不一致 | 先解决证据完整性,不能继续解释性能 |
no_result |
请求目标没有最终引物对和靶标 | 继续保留在目标分母中,明确尚未覆盖 |
这里尤其要避免混淆三个比例:“至少有一对结果的目标数/全部请求目标数”“至少有一对计算 pass 结果的目标数/全部请求目标数”,以及“最终引物对中的 pass 比例”。三者都可以用于工程管理,但含义不同,而且都不是临床灵敏度。一个目标有一对 pass、另一对 review 时,项目物种汇总仍可能标为 review;因此不能从第一个通过的引物对推断整个目标已无风险。[P8]
最终汇总通过输入身份与数量核对连接上游审计。对外导出的表格也应与这份名单一致:临时人工替换了一个引物,就需要更新相应风险检查和版本,不能继续引用原来的审计清单。
8. 实验验证应围绕具体声明展开
以下是从临床诊断工程角度提出的验证规划,不是本项目已经取得的实验结果,也不是通用实验配方。
| 待验证问题 | 规划重点 | 报告时需要保留的口径 |
|---|---|---|
| 种内覆盖是否能泛化 | 将设计与独立验证参考分开,检查未覆盖的变异与来源 | 独立菌株/序列数、分层信息、失败目标 |
| 是否能区分近缘非目标 | 按检测声明设置目标及近缘非目标挑战 | 非目标种类、材料范围和异常结果 |
| 多重体系是否产生竞争 | 比较单重与多重表现,纳入丰度不平衡和宿主背景情形 | 各目标表现与重复结构,不只报平均深度 |
| 检出限与重复性是否成立 | 在预先定义的样本和流程条件下开展独立验证 | 输入单位、阳性判定规则、重复数与不确定性 |
| 改版后原结论是否仍适用 | 冻结参考库、实际引物名单及分析规则,评估受影响范围 | 版本差异、重新审计与验证的范围 |
我的交付检查表会保留五类材料:检测声明、参考与参数快照、候选及救援记录、最终引物—靶标名单、计算审计与实验验证的分别结论。这样,下一位接手的人才能回答“这对引物为什么留下”“这个目标还有什么风险”和“哪个结论对应哪一版序列”。
引物池设计的成熟度,最终体现在能否让覆盖、冲突、失败和版本都有可复核的解释。对临床诊断而言,明确知道尚未证明什么,与知道已经设计出什么同样有价值。
项目取材与证据边界
本文依据本机工作区源码和项目文档原创整理,没有搬运患者数据、实际引物订单或私有目标清单。工作区存在未提交变更,因此仅用 Git 提交号不能完整重建本文所述状态;本次取材已在本地记录相关文件的 SHA-256。
以下为项目内相对路径,便于项目维护者复核,并非公开仓库链接:
- [P1]
doc/specificity_scoring.md、commands/filter_specificity.py:分类学归一化、检测范围与排序指数。 - [P2]
doc/template_selector.md、commands/template_selector.py:单倍型权重、联合锚点和真实模板。 - [P3]
commands/pipeline.py、primer_tools/run_primer3_fallback.py:候选分级、阶段选择和数量限制。 - [P4]
primer_tools/delete_dimer.py:引物对冲突、优化约束、求解状态与失败处理。 - [P5]
primer_tools/spec_selector.py、primer_tools/target_remover.py:贪心筛选及残余风险。 - [P6]
doc/cache_and_specificity_boundaries.md、deploy/README.md、primer_tools/spec_selector.py:人源命中、扩增几何和搜索边界。 - [P7]
commands/pipeline.py、primer_tools/primer_adapter.py:二聚体输入、汇总步骤和独立加尾工具的调用边界。 - [P8]
doc/final_primer_target_assessment.md、primer_tools/final_assessment.py、primer_tools/final_evaluation.py、primer_tools/export_results.py:最终身份核对、状态与交付文件。
上述 commands/ 位于 src/tngs_cli/,primer_tools/ 位于 src/tngs_cli/commands/。与旧方法稿不一致的地方,本文采用本次源码实际行为,不将旧稿中的算法描述外推到所有版本。
本次定向运行了二聚体、扩增筛选、最终审计和汇总评估相关的四个测试文件:36 项通过,1 项失败。失败发生在汇总流程测试触发结果导出时,其测试夹具缺少最终靶标文件。因此本文不声称全流程测试通过;这些检查只为理解当前实现提供局部证据,不能替代独立基准或湿实验验证。
参考资料
- Henikoff S, Henikoff JG. Position-based sequence weights. Journal of Molecular Biology. 1994;243(4):574–578. 原始摘要与书目信息。
- Untergasser A, et al. Primer3—new capabilities and interfaces. Nucleic Acids Research. 2012;40(15):e115. 原文,DOI: 10.1093/nar/gks596。
- Wang K, et al. MFEprimer-3.0: quality control for PCR primers. Nucleic Acids Research. 2019;47(W1):W610–W613. 原文,DOI: 10.1093/nar/gkz351。
- PrimerPooler. Official documentation and source repository. 官方仓库与使用说明,访问日期:2026-09-28。
说明:文中的工程建议和数学示例不是患者研究结果;未开展新的湿实验,也未宣称产品获得临床验证或监管认可。