1.2.1 Linear Chaining input
“命中”在这里是一个短串级精确匹配的概念:
read 中提取出的某个 minimizer(或 k-mer)在 pangenome graph 的索引里,找到了一个完全相同的短串出现位置。
每找到这样一个位置,就叫一次“命中”,并产生一个 seed。
拆开来看:
1. 索引里存的是什么?
建索引时,会把 pangenome graph 中所有顶点上的 DNA 序列切成固定长度的 k-mer,然后建立哈希表:
- 键:k-mer 的序列,或其哈希值;
- 值:这个 k-mer 在图中出现的位置列表。
每个位置通常记录:
- 顶点 ID,表示它在哪个图顶点;
- 顶点内偏移,表示它在该顶点序列中的起始位置;
- 方向,表示正链还是反向互补链;
- 可能还有该 k-mer 的长度。
所以索引本质是:
“某个短串 → 它在图中所有出现的地方”。
2. Seeding 时怎么查?
从 read 中提取一个 minimizer,比如 ACGTAC。
拿它去查索引。
如果索引里存在这个键,就返回一个位置列表:
ACGTAC -> [
(顶点 v1, 偏移 10, 正链),
(顶点 v2, 偏移 3, 正链),
(顶点 v5, 偏移 20, 负链)
]
列表里的每一项,就是一次“命中”。
每次命中都会生成一个 seed anchor,记录:
- 这个短串在 read 上的位置;
- 它在图上的顶点 ID;
- 它在顶点内的偏移;
- 方向;
- 长度。
所以:一个命中 = 一个 seed = 一个候选锚点。
3. 为什么一个 minimizer 会命中很多不同顶点?
因为同一个短串可能在 pangenome graph 的多个地方出现:
- 重复序列:基因组里有很多拷贝,同一个 k-mer 出现在不同顶点;
- 多单倍型:pangenome graph 包含很多人的序列,相似区域在不同顶点中可能共享相同短串;
- 变异泡两侧:分支两侧可能有一段相同的保守序列;
- 正反链:DNA 双链,索引通常同时包含正向和反向互补,所以一个短串可能命中正链和负链;
- 同一顶点内多个拷贝:即使在同一顶点,也可能出现多次。
因此,一个 read 的某个 minimizer 可能命中多个顶点;
一个 read 有很多 minimizer,每个又可能命中多个位置,所以种子数量会非常大。
4. 命中不等于正确匹配
注意,这里的“命中”只是短串完全一致,并不代表整条 read 来自那里。
很多命中是重复区域造成的假阳性。
所以后续需要:
- Linear Chaining:把同一顶点内的命中按坐标一致性连成局部链;
- Graph Chaining:跨顶点连接局部链;
- Filtering:去掉重复区域产生的虚假种子。
5. 和“命中很多不同顶点”的关系
原文说“种子可能命中 pangenome graph 的很多不同顶点”,意思就是:
read 中某个 minimizer 查索引后,返回的匹配位置分布在多个不同的图顶点上。
每个返回的位置就是一个命中,每个命中产生一个 seed。
后续 Linear Chaining 会先按顶点把这些 seed 分组,只在同一顶点内部连接,所以这些分散在不同顶点的命中会被分开处理。
一句话总结
命中 = read 中一个短特征串在 pangenome graph 索引里找到了一个完全相同的出现位置。
这个位置由“顶点 + 顶点内偏移 + 方向”确定。
一个短串可能在多个顶点出现,所以会命中多个顶点,产生多个 seed;这些 seed 就是后续 chaining 的候选锚点。