给 STAR-Fusion 加一层热点 Rescue

#default

RNA 融合检测有个容易忽略的点:最终结果里没有,不代表软件没看到。更多时候是软件看到了,但在过滤阶段因为"不够标准"把它扔了。这两种情况处理方式完全不同。

一个 ALK 的案例

一个 FFPE 样本,RNA 靶向测序,STAR-Fusion 和 Arriba 都是阴性。翻 STAR-Fusion 的中间结果,却看到一组 chimeric reads:一端在 ALK exon20,另一端在 chr2 的基因间区,breakpoint 高度一致,方向符合 ALK 3' 端异常激活。

问题就在另一端:partner 落在基因间区,拼不成标准的 GeneA--GeneB,于是进不了 fusion_predictions.tsv。Arriba 同样没报。

也就是说,RNA 数据里其实有明确的 ALK chimeric signal,只是被过滤掉了。

为什么不动主流程

第一反应是调松阈值(降 J / S / FFPM),或者再加几个 caller。两个都不好:

做法 问题
调松阈值 救回一条,可能放回几十上百条噪声,所有样本一起受影响
再加 caller caller 是独立证据源,不是互补全集,它没报的下一个未必补得上

于是我们加了一条旁路:主流程的 PASS 标准不动,只回头检查它已经丢掉的候选,看里面有没有热点基因。主流程管特异性,Rescue 管灵敏度,两套规则互不干扰。

Rescue 的三个过滤步骤

Rescue 不是把 fail 结果直接倒回来,只针对热点基因(ALK、ROS1、RET、NTRK、FGFR、BRAF、RAF1、MET、EGFR 等),非热点直接丢。热点命中之后,真正值得做的过滤是这三步:

1. 只留标准染色体

fail 文件里,热点基因的 intergenic 伙伴有 7619 条落在 GL* / chrUn 这类 contig 上,还有 15 条在线粒体,而真事件在 chr6,完全不受影响。这一步大概去掉 7600 条,但必须先做——否则后面比"谁的 reads 最多"时,这些假 contig 会压过真伙伴。

2. 一条 read 只投一票

fail 文件本来就是"这条 read 没有稳定的双侧基因锚点"才被丢进来的,现在每个比对位点都计了 +1。改成:同一条 read、同一个热点基因,只保留 anchor 最长的那一个 intergenic 位点,两侧断点 5 bp 内的并成一条。这一步才是真正减量的地方。

3. 重新计数,要求 ≥ 20

去重之后重新统计总数,junction reads 要求 ≥ 20。那种几十个伙伴、每个读数都接近的假信号会塌掉;只有一个稳定伙伴的真事件会留下来。

顺序就是:标准染色体 → 一条 read 一票 → 总数 ≥ 20。

进阶:加伙伴基因,把断点锁进 100kb 窗口

上面的三步只挑"一侧是不是热点基因",对 intergenic 的另一侧完全不加约束。如果还想进一步收窄,可以做两件事:

加一张伙伴基因清单。 除了热点基因,再维护已知能与之融合的伙伴基因(比如 ALK 对应 EML4、KIF5B 等)。fail 候选里一侧是热点、另一侧正好命中已知伙伴的,其实已经不算 intergenic 事件,可以直接按正常基因融合处理,信号更强。

断点落在热点或伙伴上下游 100kb 内才保留。 对 partner 仍留在基因间区的事件,再看断点坐标:落在某个已知伙伴基因(或热点基因)上下游 100kb 内,才认为"可能相关"——启动子 / 增强子劫持、转录通读这类机制都在这类距离里发生;离所有已知基因都远的那批,直接丢。

好处是候选范围再收窄一轮,能把"纯随机 intergenic"的噪声砍掉。代价是流程变重:伙伴清单要维护(而且不同癌种、不同 panel 清单还不一样),还得额外做坐标距离判断,规则复杂度上来了,可解释性也会差一点。

所以这一步是可选项。先看前三步过滤完还剩多少候选:如果去重加 ≥20 之后已经没几条,就不必上;如果还是杂,再加这层 100kb 窗口。

输出上做两件事

  • 结果打上 TAG,并保留 STAR-Fusion 原始失败原因:RESCUE_HOTSPOT_INTERGENIC|SF_FILTER=LOW_SUPPORT。看到 LOW_SUPPORT 会愿意继续看,看到 RT_ARTIFACT 会谨慎很多——Rescue 不是推翻 STAR-Fusion 的判断,而是把它的判断一起带回来。
  • 复用 STAR-Fusion 的 TSV 格式,单独存 rescue_predictions.tsv,再和正式 PASS 合并出 merged_predictions.tsv,下游不用改。

最后一点:intergenic 就是 intergenic,不要为了好看强行命名成最近的基因。Rescue 产出的是候选,不是直接报告阳性。

附:易发生IGR伴侣的基因清单

Gene Level Direction KeyRegion Domain Mode
ALK A 3P exon19-20 kinase RESCUE
RET A 3P intron10-11 kinase RESCUE
ROS1 A 3P variable kinase RESCUE
FGFR2 A 5P exon17 kinase RESCUE
BRAF A 3P intron8-10 kinase RESCUE
MET A 3P variable kinase RESCUE
NRG1 A 3P exon2+ EGF_like RESCUE
MYB A 5P truncation MYB_DNA_binding RESCUE
MYBL1 A 5P exon8-10 MYB_DNA_binding RESCUE
EGFR B ANY variable kinase RESCUE
ERBB2 B ANY variable kinase RESCUE
ERBB3 B ANY variable NA RESCUE
FGFR1 B ANY variable kinase RESCUE
FGFR3 B ANY variable kinase RESCUE
NTRK1 B 3P variable kinase RESCUE
RAF1 B 3P intron5-9 kinase RESCUE
ERG B ANY variable ETS RESCUE
ETV4 B ANY variable ETS RESCUE
RSPO3 B ANY variable NA RESCUE
PIK3CA B ANY variable kinase RESCUE
NTRK2 C 3P variable kinase REVIEW
NTRK3 C 3P variable kinase REVIEW
PDGFRA C 3P variable kinase REVIEW
PDGFRB C 3P variable kinase REVIEW