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误连),无法得到正确结果。
需求与优化方向
- 向量化解决方案:需要处理30000+谱图,每个谱图含100-500个信号及多电荷态,循环方法效率极低,必须用向量化实现。
- 后续处理:识别出连续序列后,需要用于检查峰强度、求和,并将去同位素后的峰强度分配给序列中的初始峰(强度最大的那个)。
- 现有代码优化:刚接触向量化计算,希望得到当前筛选峰对代码的优化建议。
内容的提问来源于stack exchange,提问作者Ravnclaw
相关产品推荐
相关产品推荐

