pyOpenMS质量谱分析库Skill pyopenms

pyOpenMS 是一个开源的 Python 库,专为蛋白质组学和代谢组学中的质量谱数据分析设计。它支持处理 mzML/mzXML 文件、峰值检测、特征量化、肽识别等工作流,并能与 Comet、Mascot 等工具集成,适用于 LC-MS/MS 分析。关键词:质量谱分析、Python、数据处理、蛋白质组学、代谢组学、OpenMS、生物信息学。

数据分析 0 次安装 0 次浏览 更新于 3/16/2026

name: pyopenms description: “质量谱分析工具包(OpenMS Python 版本)。处理 mzML/mzXML 文件、峰值检测、特征检测、肽识别、蛋白质组学/代谢组学工作流,用于 LC-MS/MS 分析。”

pyOpenMS

概述

pyOpenMS 是一个开源的 Python 库,用于蛋白质组学和代谢组学中的质量谱数据分析。使用 Python 绑定到 OpenMS C++ 库,处理 LC-MS/MS 数据,执行肽识别,检测和量化特征,并与常见的蛋白质组学工具(如 Comet、Mascot、MSGF+、Percolator、MSstats)集成。

何时使用此技能

此技能应在以下情况下使用:

  • 处理质量谱数据(mzML、mzXML 文件)
  • 在 LC-MS 数据中执行峰值检测和特征检测
  • 进行肽和蛋白质识别工作流
  • 量化代谢物或蛋白质
  • 将蛋白质组学或代谢组学工具集成到 Python 管道中
  • 使用 OpenMS 工具和文件格式

核心能力

1. 文件 I/O 和数据导入/导出

高效处理多种质量谱文件格式:

支持的格式:

  • mzML/mzXML:主要的原始 MS 数据格式(轮廓或质心)
  • FASTA:蛋白质/肽序列数据库
  • mzTab:用于识别和量化的标准化报告格式 n- mzIdentML:肽和蛋白质识别数据
  • TraML:靶向实验的转换列表
  • pepXML/protXML:搜索引擎结果

读取 mzML 文件:

import pyopenms as oms

# 加载 MS 数据
exp = oms.MSExperiment()
oms.MzMLFile().load("input_data.mzML", exp)

# 访问基本信息
print(f"光谱数量: {exp.getNrSpectra()}")
print(f"色谱图数量: {exp.getNrChromatograms()}")

写入 mzML 文件:

# 保存处理后的数据
oms.MzMLFile().store("output_data.mzML", exp)

文件编码: pyOpenMS 内部自动处理 Base64 编码、zlib 压缩和 Numpress 压缩。

2. MS 数据结构和操作

处理核心质量谱数据结构。请参阅 references/data_structures.md 获取详细信息。

MSSpectrum - 单个质量谱:

# 创建带有元数据的光谱
spectrum = oms.MSSpectrum()
spectrum.setRT(205.2)  # 保留时间,单位为秒
spectrum.setMSLevel(2)  # MS2 光谱

# 设置峰值数据(m/z、强度数组)
mz_array = [100.5, 200.3, 300.7, 400.2]
intensity_array = [1000, 5000, 3000, 2000]
spectrum.set_peaks((mz_array, intensity_array))

# 为 MS2 添加前体信息
precursor = oms.Precursor()
precursor.setMZ(450.5)
precursor.setCharge(2)
spectrum.setPrecursors([precursor])

MSExperiment - 完整的 LC-MS/MS 运行:

# 创建实验并添加光谱
exp = oms.MSExperiment()
exp.addSpectrum(spectrum)

# 访问光谱
first_spectrum = exp.getSpectrum(0)
for spec in exp:
    print(f"RT: {spec.getRT()}, MS 级别: {spec.getMSLevel()}")

MSChromatogram - 提取的离子色谱图:

# 创建色谱图
chrom = oms.MSChromatogram()
chrom.set_peaks(([10.5, 11.2, 11.8], [1000, 5000, 3000]))  # RT, 强度
exp.addChromatogram(chrom)

高效峰值访问:

# 以 numpy 数组获取峰值以进行快速处理
mz_array, intensity_array = spectrum.get_peaks()

# 修改并设置回来
intensity_array *= 2  # 将所有强度加倍
spectrum.set_peaks((mz_array, intensity_array))

3. 化学和肽处理

为蛋白质组学和代谢组学执行化学计算。请参阅 references/chemistry.md 获取详细示例。

分子式和质量计算:

# 创建经验式
formula = oms.EmpiricalFormula("C6H12O6")  # 葡萄糖
print(f"单同位素质量: {formula.getMonoWeight()}")
print(f"平均质量: {formula.getAverageWeight()}")

# 公式算术
water = oms.EmpiricalFormula("H2O")
dehydrated = formula - water

# 同位素特定公式
heavy_carbon = oms.EmpiricalFormula("(13)C6H12O6")

同位素分布:

# 生成粗略同位素模式(单位质量分辨率)
coarse_gen = oms.CoarseIsotopePatternGenerator()
pattern = coarse_gen.run(formula)

# 生成精细结构(高分辨率)
fine_gen = oms.FineIsotopePatternGenerator(0.01)  # 0.01 Da 分辨率
fine_pattern = fine_gen.run(formula)

氨基酸和残基:

# 访问残基信息
res_db = oms.ResidueDB()
leucine = res_db.getResidue("Leucine")
print(f"L 单同位素质量: {leucine.getMonoWeight()}")
print(f"L 公式: {leucine.getFormula()}")
print(f"L pKa: {leucine.getPka()}")

肽序列:

# 创建肽序列
peptide = oms.AASequence.fromString("PEPTIDE")
print(f"肽质量: {peptide.getMonoWeight()}")
print(f"公式: {peptide.getFormula()}")

# 添加修饰
modified = oms.AASequence.fromString("PEPTIDEM(Oxidation)")
print(f"修饰后质量: {modified.getMonoWeight()}")

# 理论片段化
ions = []
for i in range(1, peptide.size()):
    b_ion = peptide.getPrefix(i)
    y_ion = peptide.getSuffix(i)
    ions.append(('b', i, b_ion.getMonoWeight()))
    ions.append(('y', i, y_ion.getMonoWeight()))

蛋白质消化:

# 酶消化
dig = oms.ProteaseDigestion()
dig.setEnzyme("Trypsin")
dig.setMissedCleavages(2)

protein_seq = oms.AASequence.fromString("MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEK")
peptides = []
dig.digest(protein_seq, peptides)

for pep in peptides:
    print(f"{pep.toString()}: {pep.getMonoWeight():.2f} Da")

修饰:

# 访问修饰数据库
mod_db = oms.ModificationsDB()
oxidation = mod_db.getModification("Oxidation")
print(f"氧化质量差: {oxidation.getDiffMonoMass()}")
print(f"残基: {oxidation.getResidues()}")

4. 信号处理和过滤

应用算法处理和过滤 MS 数据。请参阅 references/algorithms.md 获取全面覆盖。

光谱平滑:

# 高斯平滑
gauss_filter = oms.GaussFilter()
params = gauss_filter.getParameters()
params.setValue("gaussian_width", 0.2)
gauss_filter.setParameters(params)
gauss_filter.filterExperiment(exp)

# Savitzky-Golay 滤波器
sg_filter = oms.SavitzkyGolayFilter()
sg_filter.filterExperiment(exp)

峰值过滤:

# 每光谱只保留 N 个最大峰值
n_largest = oms.NLargest()
params = n_largest.getParameters()
params.setValue("n", 100)  # 保留前 100 个峰值
n_largest.setParameters(params)
n_largest.filterExperiment(exp)

# 阈值过滤
threshold_filter = oms.ThresholdMower()
params = threshold_filter.getParameters()
params.setValue("threshold", 1000.0)  # 移除强度低于 1000 的峰值
threshold_filter.setParameters(params)
threshold_filter.filterExperiment(exp)

# 基于窗口的过滤
window_filter = oms.WindowMower()
params = window_filter.getParameters()
params.setValue("windowsize", 50.0)  # 50 m/z 窗口
params.setValue("peakcount", 10)     # 每窗口保留 10 个最高峰值
window_filter.setParameters(params)
window_filter.filterExperiment(exp)

光谱归一化:

normalizer = oms.Normalizer()
normalizer.filterExperiment(exp)

MS 级别过滤:

# 只保留 MS2 光谱
exp.filterMSLevel(2)

# 按保留时间范围过滤
exp.filterRT(100.0, 500.0)  # 保留 RT 在 100-500 秒之间

# 按 m/z 范围过滤
exp.filterMZ(400.0, 1500.0)  # 保留 m/z 在 400-1500 之间

5. 特征检测和量化

在 LC-MS 数据中检测和量化特征:

峰值检测(质心化):

# 将轮廓数据转换为质心
picker = oms.PeakPickerHiRes()
params = picker.getParameters()
params.setValue("signal_to_noise", 1.0)
picker.setParameters(params)

exp_centroided = oms.MSExperiment()
picker.pickExperiment(exp, exp_centroided)

特征检测:

# 跨 LC-MS 运行检测特征
feature_finder = oms.FeatureFinderMultiplex()

features = oms.FeatureMap()
feature_finder.run(exp, features, params)

print(f"找到 {features.size()} 个特征")
for feature in features:
    print(f"m/z: {feature.getMZ():.4f}, RT: {feature.getRT():.2f}, "
          f"强度: {feature.getIntensity():.0f}")

特征链接(图谱对齐):

# 链接多个样本中的特征
feature_grouper = oms.FeatureGroupingAlgorithmQT()
consensus_map = oms.ConsensusMap()

# 提供来自不同样本的多个特征图谱
feature_maps = [features1, features2, features3]
feature_grouper.group(feature_maps, consensus_map)

6. 肽识别工作流

与搜索引擎集成并处理识别结果:

数据库搜索:

# 准备搜索引擎参数
params = oms.Param()
params.setValue("database", "uniprot_human.fasta")
params.setValue("precursor_mass_tolerance", 10.0)  # ppm
params.setValue("fragment_mass_tolerance", 0.5)     # Da
params.setValue("enzyme", "Trypsin")
params.setValue("missed_cleavages", 2)

# 可变修饰
params.setValue("variable_modifications", ["Oxidation (M)", "Phospho (STY)"])

# 固定修饰
params.setValue("fixed_modifications", ["Carbamidomethyl (C)"])

FDR 控制:

# 假发现率估计
fdr = oms.FalseDiscoveryRate()
fdr_threshold = 0.01  # 1% FDR

# 应用于肽识别
protein_ids = []
peptide_ids = []
oms.IdXMLFile().load("search_results.idXML", protein_ids, peptide_ids)

fdr.apply(protein_ids, peptide_ids)

7. 代谢组学工作流

分析小分子数据:

加合物检测:

# 常见代谢物加合物
adducts = ["[M+H]+", "[M+Na]+", "[M+K]+", "[M-H]-", "[M+Cl]-"]

# 使用加合物进行特征注释
for feature in features:
    mz = feature.getMZ()
    # 为每个加合物假设计算中性质量
    for adduct in adducts:
        # 注释逻辑
        pass

同位素模式匹配:

# 比较实验性和理论同位素模式
experimental_pattern = []  # 从特征中提取
theoretical = coarse_gen.run(formula)

# 计算相似度分数
similarity = compare_isotope_patterns(experimental_pattern, theoretical)

8. 质量控制和可视化

监控数据质量并可视化结果:

基本统计:

# 计算 TIC(总离子流)
tic_values = []
rt_values = []
for spectrum in exp:
    if spectrum.getMSLevel() == 1:
        tic = sum(spectrum.get_peaks()[1])  # 强度总和
        tic_values.append(tic)
        rt_values.append(spectrum.getRT())

# 基线峰色谱图
bpc_values = []
for spectrum in exp:
    if spectrum.getMSLevel() == 1:
        max_intensity = max(spectrum.get_peaks()[1]) if spectrum.size() > 0 else 0
        bpc_values.append(max_intensity)

绘图(使用 pyopenms.plotting 或 matplotlib):

import matplotlib.pyplot as plt

# 绘制 TIC
plt.figure(figsize=(10, 4))
plt.plot(rt_values, tic_values)
plt.xlabel('保留时间 (s)')
plt.ylabel('总离子流')
plt.title('TIC')
plt.show()

# 绘制单个光谱
spectrum = exp.getSpectrum(0)
mz, intensity = spectrum.get_peaks()
plt.stem(mz, intensity, basefmt=' ')
plt.xlabel('m/z')
plt.ylabel('强度')
plt.title(f'RT {spectrum.getRT():.2f}s 处的光谱')
plt.show()

常见工作流

完整的 LC-MS/MS 处理管道

import pyopenms as oms

# 1. 加载数据
exp = oms.MSExperiment()
oms.MzMLFile().load("raw_data.mzML", exp)

# 2. 过滤和平滑
exp.filterMSLevel(1)  # 只保留 MS1 进行特征检测
gauss = oms.GaussFilter()
gauss.filterExperiment(exp)

# 3. 峰值检测
picker = oms.PeakPickerHiRes()
exp_centroid = oms.MSExperiment()
picker.pickExperiment(exp, exp_centroid)

# 4. 特征检测
ff = oms.FeatureFinderMultiplex()
features = oms.FeatureMap()
ff.run(exp_centroid, features, oms.Param())

# 5. 导出结果
oms.FeatureXMLFile().store("features.featureXML", features)
print(f"检测到 {features.size()} 个特征")

理论肽质量计算

# 计算带有修饰的肽质量
peptide = oms.AASequence.fromString("PEPTIDEK")
print(f"未修饰 [M+H]+: {peptide.getMonoWeight() + 1.007276:.4f}")

# 带修饰
modified = oms.AASequence.fromString("PEPTIDEM(Oxidation)K")
print(f"氧化 [M+H]+: {modified.getMonoWeight() + 1.007276:.4f}")

# 为不同电荷态计算
for z in [1, 2, 3]:
    mz = (peptide.getMonoWeight() + z * 1.007276) / z
    print(f"[M+{z}H]^{z}+: {mz:.4f}")

安装

在使用此技能前,请确保安装 pyOpenMS:

# 通过 conda(推荐)
conda install -c bioconda pyopenms

# 通过 pip
pip install pyopenms

与其他工具集成

pyOpenMS 可与以下工具无缝集成:

  • 搜索引擎:Comet、Mascot、MSGF+、MSFragger、Sage、SpectraST
  • 后处理:Percolator、MSstats、Epiphany
  • 代谢组学:SIRIUS、CSI:FingerID
  • 数据分析:Pandas、NumPy、SciPy 用于下游分析
  • 可视化:Matplotlib、Seaborn 用于绘图

资源

references/

核心概念的详细文档:

  • data_structures.md - MSExperiment、MSSpectrum、MSChromatogram 和峰值数据处理的全面指南
  • algorithms.md - 信号处理、过滤、特征检测和量化算法的完整参考
  • chemistry.md - 化学计算、肽处理、修饰和同位素分布的深入覆盖

需要特定 pyOpenMS 能力的详细信息时,请加载这些参考。

最佳实践

  1. 文件格式:始终使用 mzML 用于原始 MS 数据(标准化、支持良好)
  2. 峰值访问:使用带有 numpy 数组的 get_peaks()set_peaks() 进行高效处理
  3. 参数:始终通过 getParameters()setParameters() 检查和配置算法参数
  4. 内存:对于大型数据集,迭代处理光谱而非加载整个实验
  5. 验证:加载后检查数据完整性(MS 级别、RT 顺序、前体信息)
  6. 修饰:使用 UniMod 数据库中的标准修饰名称
  7. 单位:RT 单位为秒,m/z 单位为 Thomson (Da/电荷),强度单位为任意单位

常见模式

算法应用模式:

# 1. 实例化算法
algorithm = oms.SomeAlgorithm()

# 2. 获取并配置参数
params = algorithm.getParameters()
params.setValue("parameter_name", value)
algorithm.setParameters(params)

# 3. 应用于数据
algorithm.filterExperiment(exp)  # 或 .process(), .run(), 取决于算法

文件 I/O 模式:

# 读取
data_container = oms.DataContainer()  # MSExperiment、FeatureMap 等
oms.FileHandler().load("input.format", data_container)

# 处理
# ... 操作 data_container ...

# 写入
oms.FileHandler().store("output.format", data_container)

获取帮助