Skip to content

Commit bef1ab4

Browse files
jiajunagentclaude
andcommitted
docs: MFSL v2 spec 重构——合并§1、删除索引层、元数据富集完整方案
主要改动: - §1.1+1.2 合并为双库结构 + 元数据富集机制 - 删除 spectral_metadata.csv(不参与数据处理流程) - 元数据富集详细说明:InChIKey 27位→14位→HMDB ID→CAS 四级关联 - §1.3 MSP 原有字段与八维标签共存规则 - 更新物理文件结构和设计决策 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c393306 commit bef1ab4

1 file changed

Lines changed: 56 additions & 60 deletions

File tree

docs/superpowers/specs/2026-03-24-mfsl-architecture-v2-design.md

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,61 @@
99

1010
## 1. 总体架构
1111

12-
MFSL(MetaboFlow Spectral Library)是一个独立的数据资产,由两个核心库组成。两个库各自拥有完整的 8 维标签体系,通过 InChIKey 关联但不互相依赖
12+
MFSL(MetaboFlow Spectral Library)是一个独立的数据资产,由两个核心库组成,服务于分层注释流程中的不同环节
1313

14-
### 1.1 三层结构
14+
### 1.1 双库结构
1515

1616
```
17-
Layer 1: 数据层
18-
├── deduplicated/*.msp 质谱库:60 万条 MS2 谱图峰数据(标签内嵌)
19-
└── compound_metadata.csv 化合物库:127 万条化合物属性(= Level 3 数据)
20-
21-
Layer 2: 索引层
22-
└── spectral_metadata.csv 质谱库的只读快速索引(从 MSP 自动生成)
17+
质谱库 (Level 2 数据) 化合物库 (Level 3 数据)
18+
deduplicated/*.msp compound_metadata.csv
19+
60 万条 MS2 谱图 127 万条化合物
20+
每条内嵌 8 维标签 每条有 8 维标签
21+
数据内容:碎裂峰(mz + intensity) 数据内容:精确质量 + SMILES + 交叉引用
22+
用途:Level 2 MS2 谱图匹配 用途:Level 3 MS1 匹配 + 元数据富集
2323
24-
Layer 3: 文档层
25-
└── DATABASE_MANUAL.md 来源清单 + 构建方法 + 架构说明
24+
另附:DATABASE_MANUAL.md (来源清单 + 构建方法 + 架构说明)
2625
```
2726

28-
### 1.2 双库关系
27+
**两个库各自独立,各自拥有完整的 8 维标签。** 搜索时各自按标签过滤,不依赖对方。
2928

30-
```
31-
质谱库 (Level 2) 化合物库 (Level 3)
32-
deduplicated/*.msp compound_metadata.csv
33-
60 万条谱图 127 万条化合物(覆盖所有谱图化合物)
34-
每条内嵌 8 维标签 每条有 8 维标签
35-
数据:peaks(碎裂谱图) 数据:exact_mass(精确质量)
36-
用途:MS2 谱图匹配 用途:MS1 精确质量匹配
37-
│ │
38-
└──── InChIKey(前 14 位)────────────────┘
39-
增值关联,非必须依赖
40-
```
29+
### 1.2 元数据富集:两个库如何协同
30+
31+
质谱库和化合物库在注释流程中各司其职,但在**结果输出阶段**需要协同——Level 2 谱图匹配命中后,仅凭 MSP 文件里的信息(compound_name + InChIKey + score)不足以支撑下游通路分析(缺 KEGG ID)和结果报告(缺化学分类细节)。这是行业共同痛点:MetaboAnalystR 4.0 用本地 SQLite 解决,XCMS Online 依托 METLIN,多数工具需要用户手动做 ID 转换。
32+
33+
**MetaboFlow 的方案:compound_metadata.csv 承担元数据富集角色。** 具体关联机制:
34+
35+
1. **主关联键:InChIKey**(完整 27 位优先,前 14 位退化匹配)
36+
- 覆盖率:MSP 谱图中 95.8% 有 InChIKey
37+
- compound_metadata 已包含所有谱图化合物(100% 前 14 位匹配)
38+
39+
2. **补充关联键**(用于 InChIKey 缺失的 25,274 条谱图)
40+
- HMDB ID:50% 的无 InChIKey 谱图有 HMDB ID(12,651 条),compound_metadata 有 hmdb_id 字段
41+
- CAS 号:29% 有 CAS(7,206 条),compound_metadata 有 cas_number 字段
42+
- 关联优先级:InChIKey 27 位 → InChIKey 14 位 → HMDB ID → CAS 号
43+
44+
3. **富集内容**:从 compound_metadata 获取的信息
45+
- KEGG ID → 支撑通路富集分析(ORA/GSEA)
46+
- HMDB ID → 支撑 MetaboAnalyst 兼容
47+
- 详细化学分类(chemical_class、application、sample)→ 结果报告和图表
48+
- SMILES → 结构展示
49+
- reg_lists → 环境筛查报告
50+
51+
4. **富集不是搜索的前置条件**——搜索阶段(Level 2/3)各自独立完成,富集在搜索完成后执行。搜索性能不受富集步骤影响。
52+
53+
### 1.3 标签与 MSP 原有字段的共存
54+
55+
MSP 文件中原有的字段(Ion_mode、Instrument_type、Spectrum_type 等)与八维标签存在部分重复:
4156

42-
**核心原则:**
43-
- 两个库各自独立——质谱库的标签不依赖化合物库查询,化合物库的标签不依赖质谱库
44-
- InChIKey 关联是增值查询——有就补充更多信息,没有也不影响基础标签和搜索
45-
- 标签内嵌 MSP 文件——行业标准做法(MassBank/GNPS/MoNA/FragHub 均如此)
46-
- spectral_metadata.csv 是 MSP 的衍生物——从 MSP 文件自动生成,不是数据源
57+
| MSP 原有字段 | 八维标签 | 处理方式 |
58+
|------------|---------|---------|
59+
| `Ion_mode: POSITIVE` | `Polarity: positive` | 原有字段保留(向后兼容),标签字段为规范化值,搜索用标签字段 |
60+
| `Instrument_type: LC-ESI-ITFT` | `Instrument: orbitrap` | 原有字段保留原始值,标签字段为归一化类别 |
61+
| `Spectrum_type: Predicted` | `Confidence: predicted` | 同上 |
62+
| `Sources: massbank.msp; hmdb.msp` | (source 维度从 Sources 字段提取) | 不新增字段,直接读 Sources |
63+
| `Collision_energy: 20` | 无对应标签 | 不是过滤维度,不纳入标签 |
64+
| `Quality_score: 95` | 无对应标签 | 同上 |
65+
66+
**原则:原有字段保留不删,八维标签新增写入。matchms 解析后两组字段各自独立存在于 metadata 字典中,不冲突。annot-worker 过滤时统一使用八维标签字段名。**
4767

4868
### 1.3 注释匹配流程(matchms 真实工作逻辑)
4969

@@ -93,8 +113,8 @@ Step 7: Level 4 — 分子式推算
93113
```
94114

95115
**关键说明:**
96-
- spectral_metadata.csv 不参与此流程——matchms 直接读 MSP 文件
97-
- InChIKey 关联发生在 Step 4(元数据富集),不在搜索阶段
116+
- matchms 直接加载 MSP 文件,不需要中间索引文件
117+
- 元数据富集(Step 4)使用完整 27 位 InChIKey 优先匹配,匹配不到退化为前 14 位,再匹配不到用 HMDB ID / CAS 号补充关联
98118
- Level 2 和 Level 3 是完全独立的代码路径,只共享标签过滤逻辑
99119
- compound_metadata.csv 承担两个角色:Level 3 数据源 + 元数据富集来源
100120

@@ -201,30 +221,7 @@ matchms 原生兼容——每行自动解析为 `spectrum.metadata['chemical_cla
201221
| lipidmaps_id | LipidMaps ID |
202222
| cas_number | CAS 号 |
203223

204-
### 3.3 spectral_metadata.csv(只读索引,从 MSP 生成)
205-
206-
| 字段 | 说明 |
207-
|------|------|
208-
| spectrum_id | 唯一标识 |
209-
| inchikey | InChIKey(关联化合物库) |
210-
| name | 化合物名称 |
211-
| precursor_mz | 前体离子质量 |
212-
| precursor_type | 加合离子类型 |
213-
| formula | 分子式 |
214-
| collision_energy | 碰撞能量 |
215-
| file_source | MSP 文件名 |
216-
| num_peaks | 峰数量 |
217-
| quality_score | 质量评分 |
218-
| chemical_class | 化学类别 |
219-
| application | 应用场景 |
220-
| sample | 样本基质 |
221-
| confidence | 可信度 |
222-
| instrument | 仪器类型 |
223-
| polarity | 离子模式 |
224-
| reg_lists | 监管清单 |
225-
| sources | 数据库来源 |
226-
227-
**生成方式**`scripts/build_spectral_metadata.py` 解析所有 MSP 文件,提取 header 字段 + Tags 行,写入 CSV。任何时候可以从 MSP 文件重新生成。
224+
*(spectral_metadata.csv 已废弃——其内容被 MSP 内嵌标签 + compound_metadata 完全覆盖,不参与数据处理流程)*
228225

229226
---
230227

@@ -333,10 +330,9 @@ MFSL 的架构与搜索引擎无关——它只负责存储、索引、标签,
333330

334331
```
335332
~/spectral_libraries/
336-
├── DATABASE_MANUAL.md # 文档(含来源清单,原 registry.csv 内容并入)
337-
├── spectral_metadata.csv # 谱图索引(只读,从 MSP 生成)
338-
├── compound_metadata.csv # 化合物元数据(= Level 3 数据)
339-
├── deduplicated/ # MSP 峰数据(标签内嵌)
333+
├── DATABASE_MANUAL.md # 文档(含来源清单、构建方法、架构说明)
334+
├── compound_metadata.csv # 化合物元数据(= Level 3 数据 + 元数据富集来源)
335+
├── deduplicated/ # MSP 峰数据(8 维标签内嵌)
340336
│ ├── massbank_orbitrap_positive.msp
341337
│ ├── norman_positive.msp
342338
│ └── ... (50 个文件)
@@ -358,11 +354,11 @@ MFSL 的架构与搜索引擎无关——它只负责存储、索引、标签,
358354
| 决策 | 理由 |
359355
|------|------|
360356
| 标签内嵌 MSP 而非仅存 CSV | 行业标准(MassBank/GNPS/MoNA/FragHub),自包含,不会 MSP/CSV 不同步 |
361-
| spectral_metadata.csv 是衍生物 | MSP 自动生成,用于快速统计和前端展示,不是搜索必经环节 |
357+
| 删除 spectral_metadata.csv | 内容已被 MSP 内嵌标签 + compound_metadata 完全覆盖,不参与数据处理流程 |
362358
| 8 维标签全部适用所有化合物 | reg_lists 对非环境化合物为空值,但保留维度的统一性 |
363359
| InChIKey 前 14 位跨库匹配 | 前 14 位是分子骨架,立体异构体共享,跨库匹配率从 35% 提升到 65% |
364360
| 标签只用可信来源填充 | 不猜、不推测——原始库字段、库级别确定性标注、ClassyFire API |
365-
| 两个库各自独立标签 | 质谱库原有 65% 谱图的化合物不在化合物库里(已通过合并解决) |
361+
| 两个库各自独立标签 | 质谱库搜索不依赖 compound_metadata,各自按内嵌标签过滤 |
366362
| compound_metadata 覆盖所有谱图化合物 | 从 MSP 提取 13.6 万"谱图独有"化合物合并到 compound_metadata,实现 100% InChIKey 覆盖 |
367363
| registry.csv 并入 DATABASE_MANUAL | spectral_metadata.csv 已覆盖其索引功能,registry 降为文档 |
368364
| 去重保留来源追溯 | Sources 字段记录所有数据库来源,去重不丢信息 |
@@ -418,7 +414,7 @@ MFSL 的架构与搜索引擎无关——它只负责存储、索引、标签,
418414
| compound_metadata.csv | `xcms-worker/R/annotation_ms1.R` | Level 3 精确质量匹配 |
419415
| compound_metadata.csv | `annotation_orchestrator.py` Step 4 | 元数据富集(InChIKey → KEGG/HMDB/通路) |
420416
| MSP 标签字段 | `AnnotationParams.tag_filter` | 前端标签过滤传给后端 |
421-
| spectral_metadata.csv | 前端统计展示 | 不参与 E2E 搜索流程 |
417+
| MSP 内嵌标签字段 | `annot-worker` 加载后按 `metadata` 字典过滤 | 搜索前的标签筛选 |
422418

423419
### 10.2 标签字段名对齐
424420

0 commit comments

Comments
 (0)