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 能力的详细信息时,请加载这些参考。
最佳实践
- 文件格式:始终使用 mzML 用于原始 MS 数据(标准化、支持良好)
- 峰值访问:使用带有 numpy 数组的
get_peaks()和set_peaks()进行高效处理 - 参数:始终通过
getParameters()和setParameters()检查和配置算法参数 - 内存:对于大型数据集,迭代处理光谱而非加载整个实验
- 验证:加载后检查数据完整性(MS 级别、RT 顺序、前体信息)
- 修饰:使用 UniMod 数据库中的标准修饰名称
- 单位: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)
获取帮助
- 文档:https://pyopenms.readthedocs.io/
- API 参考:浏览类文档以获取详细方法签名
- OpenMS 网站:https://www.openms.org/
- GitHub 问题:https://github.com/OpenMS/OpenMS/issues