给 STAR-Fusion 加一层热点 Rescue
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 |