1.2 Linear chaining
Linear Chaining 的输出之所以是局部链,是因为它被设计为只在同一个图顶点内部连接种子。它不跨越顶点边界,所以形成的链天然只覆盖图上的一个局部区域。
可以这样理解:
1. 种子分布在图的多个顶点上
Seeding 阶段产生的种子,可能命中 pangenome graph 的很多不同顶点。
每个种子带有两组坐标:
- query 坐标:它在 read 上的位置;
- graph 坐标:它在图顶点内部的偏移。
不同顶点有各自的坐标系统,彼此不能直接比较。
2. 线性链只处理“同一顶点内”的种子
Linear Chaining 阶段拿到种子后,首先按它们所属的图顶点分组。
然后对同一个顶点内的种子,用稀疏动态规划判断哪些可以连成一条合理的链。
评分主要看:
- query 坐标是否单调递增;
- graph 顶点内坐标是否也大致同向变化;
- 对角线是否一致;
- 间隙罚分是否合理。
因为所有这些比较都发生在同一个顶点内部,坐标系统统一,所以可以可靠地计算。
3. 为什么不跨顶点连接?
跨顶点连接会遇到几个问题:
- 不同顶点之间的坐标没有直接可比性;
- 两个顶点之间是否可达,需要查图结构;
- 中间可能经过变异泡、分支、插入删除;
- 需要计算最短路径,判断能不能从一条链走到另一条链。
这些属于 Graph Chaining 阶段的任务。
如果在 Linear Chaining 就强行跨顶点,复杂度会急剧上升,而且缺乏图拓扑信息,容易产生错误连接。
4. 所以输出是“局部链”
每个图顶点内部,可能形成若干条局部链。
每条局部链代表:
在这个顶点内部,有一组种子可以按一致的顺序和间隙关系连起来,形成一个候选的局部匹配片段。
它只是“局部”的,因为:
- 它只覆盖一个顶点;
- 它不知道这个顶点在图中的前后邻居;
- 它不知道这条链能否通过变异泡连接到其他顶点的链;
- 它只是后续图链阶段的输入单元。
5. 局部链的作用
这些局部链把大量零散种子压缩成少量有意义的片段。
之后 Graph Chaining 只需要处理这些局部链的端点,计算它们之间的最短路径和可达性,再跨顶点连接成全局路径。
这样就把问题分解成:
- 顶点内:Linear Chaining 连接种子 → 局部链;
- 顶点间:Graph Chaining 连接局部链 → 全局候选路径;
- 路径上:Alignment 做碱基级精细比对。
一句话总结
Linear Chaining 输出局部链,是因为它只在单个图顶点内部操作,不跨顶点。
这样可以在统一坐标系统下用稀疏 DP 可靠地连接种子,同时把跨顶点的全局连接交给 Graph Chaining 处理,从而降低复杂度、提高并行性。