Independent-Verification-and-Localization-of-the-MRM-Toolchain-v2
T Lv1

证据链而非信任:MRM 工具链 v2 的独立验证与定位

摘要

第一阶段的工作证明了计算链条内部自洽:在 Linux 上直读安捷伦 .d,从交替采集的全扫描与 MRM 数据中提取指定离子对,完成积分、同批工作曲线拟合与浓度回算。但内部自洽还不构成外部证据。分析实验室真正要问的是:这条链上的每一步能否由另一套独立实现复核,差异能否定位到具体扫描,而不是被容差吞掉。

第二阶段因此没有扩张定量模型,而是补上三项能力:按采集语义检索已采集的 MRM 通道,用 MassQL 直接在扫描记录上表达谱图模式,以及用另一套开源 reader 逐扫描比对。

实测覆盖三个时期、36 个 .d 数据集、198,052 次扫描。两套 reader 在扫描顺序、保留时间、每帧峰数与 m/z 上没有出现未解释差异;196,831 次扫描的差异被明确归类为一种表示差异——独立 reader 对这批单位分辨率 GC-QqQ 数据返回整数强度,而本工具保留小数强度。这一差异被单独标记,而不是通过把绝对容差放宽到 1 来隐藏。

1. 先把两类分析任务分开

GC-EI 全扫描定性与小分子 MRM 定量不是同一个任务,混为一谈会导致错误的工具选型结论。

GC-EI 定性的主线是对完整全扫描做色谱峰解卷积,再用保留时间或保留指数结合 EI 谱图相似度检索比对。这条路上已有成熟方案:NIST AMDIS 专门解决自动解卷积与鉴定,MZmine 也提供 GC-EI 解卷积、谱图相似度与跨样对齐工作流。在这条路上,本工具最合理的职责是把 .d 可靠地转成开放格式或提供完整扫描,而不是重写一套 AMDIS。

MRM 定量面对的是预先设定的 Q1/Q3 通道。它关心通道是否真的被采集、碰撞能量是否一致、时间段与方法段如何解释、峰面积如何进入同批校准,以及失败结果是否仍被错误报告为浓度。这里不需要 EI 解卷积,但高度依赖厂商原始数据语义。

因此“已有 AMDIS”不能消除 Linux 下 GC-MRM 的数据入口问题;同理,“已经能读 mzML”也不等于能完整恢复方法中的时间段、扫描方法、dwell、gain 与通道声明——而这些正是判断一条通道身份与可比性的依据。

2. 成熟工具已经覆盖了什么

通用 MRM 定量并非空白地带。

  • Skyline 是成熟的开源客户端,支持小分子 SRM/MRM、内标与校准曲线。
  • MRMhub 提供小分子 LC-MRM 峰处理与定量工作流,含线性或二次校准、权重、LOD/LOQ、QC、漂移与批次校正。
  • MRMQuant 提供图形化定量流程。
  • MassQL 用统一查询语言表达母离子、子离子、保留时间与相对强度模式。

这说明,重复开发通用界面、全套校准模型与完整批次统计不会形成差异化价值。真正稀缺的是下列能力的组合:Linux 原生、直读现代安捷伦 .d、理解 GC-QqQ 的全扫描与 MRM 交替采集、离线无需登录、支持命令行批处理、保留通道语义,并输出可审计的溯源记录。

工具的定位因此收在“可信数据入口 + 严格提取核心”,把标准化结果交给现有统计与定量生态,而不是替代它们。

3. 第一项新增:按采集语义检索通道

检索命令不需要浓度表或目标物配置,先回答一个更基础的问题:这些文件究竟采集了哪些符合条件的通道。

1
2
3
4
python3 -m mrm_quant search-mrm \
--source ../batch-folder --out quant_results/search_001 \
--q1 204 --q3 93 --ce 30 --polarity 0 \
--segment 1 --method 1 --rt-range "14.2 14.7"

Q1、Q3、碰撞能量、极性、时间段与方法段都可独立作为条件,默认质量容差为 0.01 Da,碰撞能量容差为 0.01 eV。输出包含每针信息、命中通道表与每条通道的完整原生曲线;保留时间范围只限制响应摘要,不裁剪原始曲线。若条件命中多条通道,检索结果标记为 ambiguous,程序不替使用者决定哪条是定量通道;无命中的进样则列入溯源记录的未匹配清单。

在实测的一针标准上,上述条件唯一命中目标通道,输出 2454 个原生 MRM 点,与定量流程所用的通道和面积一致。这一步的价值在于把“方法声明了什么”与“数据里真的有什么”分开:前者来自方法 XML,后者来自扫描记录,只有两者对上,通道身份才成立。

4. 第二项新增:不经 mzML 直接执行 MassQL

MassQL 的 Python 接口可以接收预先构造的 MS1 与 MS2 数据表,因此这里将规范化的扫描记录直接映射为 MassQL 所需字段,不再先写入临时 mzML。省略中间格式有两个好处:既能避免转换环节引入精度与元数据损失,也能避免厂商语义被压入 mzML 的通用字段后难以完整还原。

1
2
3
python3 -m mrm_quant search-massql \
--source ../run.d --out quant_results/massql_001 \
--query 'QUERY scaninfo(MS2DATA) WHERE MS2PREC=204:TOLERANCEMZ=0.01 AND MS2PROD=93:TOLERANCEMZ=0.01:INTENSITYPERCENT=1'

每个峰保留原始强度,归一化列按 MassQL 官方载入器的约定使用 0–1 比例。全扫描帧与 MRM 帧分别进入 MS1/MS2 表;MRM 的 Q1 作为母离子,实际采集的子离子数组作为产物离子,最近的一帧前置全扫描作为关联扫描。

MassQL 本身不表达安捷伦的扫描类型、碰撞能量、时间段、方法段与循环号,因此这些字段另存为一张上下文表,可用扫描号与查询结果连接。这样既获得通用查询语言的表达力,又不牺牲厂商采集上下文——对定量而言,后者决定了一条谱图记录能不能被当作某条通道的观测值。

在实测的一针标准上,“母离子 204、子离子 93、相对强度不低于基峰 1%”的查询返回 1854 个扫描。测试还构造了包含基峰及其 10% 强度次级峰的合成谱:当阈值设为 20% 时,查询必须拒绝该次级峰。这个测试用于验证归一化尺度与 MassQL 引擎一致,而不是自行定义一套百分比。

5. 第三项新增:用独立 reader 逐扫描对照

rainbow 已支持跨平台读取安捷伦质心数据,因此本文将它作为独立实现,逐扫描比较扫描顺序与总数、保留时间、每帧峰数、每个峰的 m/z 和强度,并记录缺失扫描、额外扫描与具体超差原因。

数据组 采集模式 进样数 扫描数 严格一致 整数化差异 未解释失败
第一时期 全扫描 9 56,416 25 56,391 0
第二时期 全扫描 + MRM 8 48,384 48 48,336 0
第三时期 全扫描 + MRM 19 93,252 1,148 92,104 0
合计 36 198,052 1,221 196,831 0

“严格一致”指在默认严格容差(m/z 与保留时间 1e-6,强度相对 1e-6)下四项全部一致。其余扫描的保留时间、峰数与 m/z 仍然一致,差异只出现在强度:独立 reader 返回的无符号整数严格等于本工具小数强度的整数部分。

这个结果不能写成“两个 reader 完全一致”,也不应通过把绝对容差放宽到 1 来掩盖。验证器把它单独归类为整数化差异,总状态记为“通过并存在整数化差异”。它证明了扫描布局、保留时间、m/z、峰数与强度整数部分的一致性,同时明确了一件事:独立 reader 不能作为小数强度的证据,而小数部分恰恰关系到低浓度端的积分面积。

从分析角度看,这类交叉验证回答的是“读取层是否可信”,不能回答“积分与定量是否与厂商一致”。下一层证据只能来自厂商参考导出:在相同 Q1/Q3、碰撞能量与积分窗口下比较时间点、通道强度、峰面积与最终浓度,容差事先约定,不随结果放宽。在取得这份基准之前,工具不声明与厂商软件等价。

6. 验收与可复现性

验收环境为 Python 3.14.7、pandas 3.0.5、numpy 2.5.3、matplotlib 3.11.2,可选依赖版本固定在 requirements-optional.txt 中,实际运行版本写入溯源记录。核心 reader、通道检索与既有定量流程仍只依赖标准库,MassQL 与双 reader 验证为可选功能。

测试共 121 项,其中 28 项为强制接口契约(缺少实现时必须失败,而不是跳过)。覆盖范围包括:原有 reader、mzML、EIC、积分、校准与 QC 的回归;真实通道的原生点数与命令行输出;可组合的 Q1/Q3/碰撞能量/极性/时间段/方法段条件;全扫描与 MRM 数据表分离及厂商上下文字段保留;真实 MassQL 引擎与相对强度阈值行为;真实独立 reader 的逐扫描比较与差异分类。真实数据用例通过一份被忽略的本地清单定位,样品路径、身份与观测值都不写入受版本控制的测试。

所有命令都只读取原始数据,要求写入全新的输出目录,并记录参数、reader 摘要、依赖版本、方法指纹与可选的原始文件哈希。原始数据、结果目录与草稿目录均由 .gitignore 排除。

7. 这一阶段增加了什么

第二阶段没有引入新的定量理论,也没有替代 AMDIS、MZmine、Skyline 或 MRMhub。它补上的是一条此前不完整的链:

1
2
3
4
5
6
7
8
9
安捷伦 GC-QqQ .d
↓
保留采集语义的扫描记录
↓
严格通道检索 / MassQL 模式查询
↓
原生离子对曲线
↓
同批基础定量或标准化导出

其中最难被替代的是第一段:直接读取 .d、分离交替的全扫描与 MRM、确认方法通道身份、区分缺失与实测零值,并在 Linux 上可重复执行。后面的高级校准、LOD/LOQ、漂移与批次校正已有成熟工具,更适合通过通用长表衔接,而不是重新实现。

因此,当前定位应保持为“Linux 原生的安捷伦 GC-QqQ 数据入口、严格提取、可检索、可审计验证”。只有在取得厂商参考结果并确认峰面积与浓度一致性之后,才值得继续增强基础定量;在证据不足时扩张为完整定量平台,只会把不确定性藏得更深。

结语

“能算出一个浓度”不是最困难的部分。困难的是知道这个数字来自哪一种扫描、哪一条真实采集的通道、哪一种强度表示、哪一套积分与校准假设,以及另一套独立实现能否复现它。

第一阶段让 Linux 上的安捷伦 QqQ 数据从“读得出谱”走到“算得出浓度”;第二阶段把结论从“内部自洽”推进到“差异明确、可定位、可继续验证”。这仍不是厂商等价证明,但它是可靠定量该有的起点:先建立证据链,再谈数字。