You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何从元组列表识别连续序列实现质谱数据去同位素?

质谱去同位素处理中的连续峰序列识别问题

问题概述

我正在实现质谱数据的去同位素处理,核心思路是通过判断两个信号的m/z差值是否等于质子质量/电荷态来筛选同位素峰对,这一步已经完成。但现在遇到的难点是识别由3个及以上峰组成的连续同位素序列。

我把问题简化为:从配对元组列表中找出连续序列,要求序列中前一个元组的第二个元素等于后一个元组的第一个元素。例如输入[(1,2), (2,3), (4,5), (7,9), (8,10), (9,11)],需要得到[(1,2,3), (4,5), (7,9,11), (8,10)]——简单排序无法处理跳变和中间无关信号的情况。

测试数据与当前进展

以下是测试用的质谱数据与代码:

import numpy as np

proton = 1.0078250319 

data = [
 (632.3197631835938, 2244.3374),  #0
 (632.830322265625, 2938.797),    #1
 (634.3308715820312, 1567.1385),  #2
 (639.3309326171875, 80601.41),   #3
 (640.3339233398438, 23759.367),  #4
 (641.3328247070312, 4771.9946),  #5
 (641.8309326171875, 2735.902),   #6
 (642.3365478515625, 4600.567),   #7
 (642.84033203125, 1311.657),     #8
 (650.34521484375, 11952.237),    #9
 (650.5, 1),                      #10 
 (650.84228515625, 10757.939),    #11
 (651.350341796875, 6324.9023),   #12
 (651.8455200195312, 1398.8452),  #13
 (654.296875, 1695.3457)]         #14

mz, i = zip(*data)

mz = np.array(mz)
i = np.array(i)

arr = np.triu(mz - mz[:, np.newaxis])

charge = 2

通过计算mz差值的上三角矩阵,筛选出符合质量差条件的峰对:

>>> pairs = tuple(zip(*np.where(abs(arr - (proton / charge)) < 0.01)))
((0, 1), (5, 6), (6, 7), (7, 8), (9, 11), (11, 12), (12, 13))

肉眼可识别出正确的连续峰序列:

  • 峰序列1:0→1
  • 峰序列2:5→6→7→8
  • 峰序列3:9→11→12→13(不含无关峰10)

但我尝试过扁平化列表去重后找连续计数的方法,会错误识别跨序列的峰(比如把5和9误连),无法得到正确结果。

需求与优化方向

  1. 向量化解决方案:需要处理30000+谱图,每个谱图含100-500个信号及多电荷态,循环方法效率极低,必须用向量化实现。
  2. 后续处理:识别出连续序列后,需要用于检查峰强度、求和,并将去同位素后的峰强度分配给序列中的初始峰(强度最大的那个)。
  3. 现有代码优化:刚接触向量化计算,希望得到当前筛选峰对代码的优化建议。

内容的提问来源于stack exchange,提问作者Ravnclaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:01:25