Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
蛋白质组学入门教程(0)数据预处理流程 · 基础篇
python
中文
组学
蛋白质组学
OpenMS
pyOpenms
python中文组学蛋白质组学OpenMSpyOpenms
guolj@dp.tech
发布于 2023-07-31
推荐镜像 :openms:0.2
推荐机型 :c16_m32_cpu
赞 6
1
1
蛋白质组学入门教程(0)数据预处理流程 · 基础篇
LC-MS/MS数据基础
原始数据预处理
数据格式转换
特征提取(Feature Detection)
峰对齐(Map Alignment)
特征组合(Feature Linking)
肽段识别(Peptide Search)
搜库结果映射(IDMapping)
蛋白质定量

蛋白质组学入门教程(0)数据预处理流程 · 基础篇

代码
文本

©️ Copyright 2023 @ Authors
作者: guolj@dp.tech 📨
日期: 2023-07-31
共享协议: 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
快速开始: 点击上方的 开始连接 按钮即可开始。


本文为 OpenMS 部分内容的搬运和魔改,主要面向希望做一些 LC-MS/MS 下机数据预处理,但又不知道从何开始的零基础同学。
如果你已经具备一定的基础,且主要关注于应用侧,你应该考虑开始接触 NextFlow,例如 QuantMS


规律,开始总是少数人认识,后来才是多数人认识。就是对少数人说来,也是从不认识到认识,也要经过实践和学习的过程。任何人开始总是不懂的,从来也没有什么先知先觉。
——〈读苏联《政治经济学教科书》的谈话〉,1959年12月至1960年2月

代码
文本

LC-MS/MS数据基础

代码
文本

当做完LC-MS/MS实验后,你一般可以导出一个原始文件,文件格式与你使用的仪器厂商息息相关,一些常见的例子可以见下表(来源参考ProteoWizard):

仪器厂商 下机原始文件格式
ABI T2D
Agilent MassHunter .d
Bruker Compass .d, YEP, BAF, FID, TDF
Sciex WIFF / WIFF2
Shimadzu LCD
Thermo Scientific RAW
Waters MassLynx .raw / UNIFI

利用ProteoWizard-msConvertThermoRawFileParser等工具,你可以将这些原始格式转变为数据预处理过程中常用的.mzML格式。

当然,除了上述提到的格式,还有其他非常多如今并不那么常用的格式,更为详细的介绍你可以查看wikipedia中的描述

你可以在自己的终端中运行下面的代码安装依赖,不过在本Notebook中这并不必要

pip install pyopenms pandas openpyxl tqdm 

同时,我们保留了每个cell中必要的import和变量定义,以便你不重新开机的情况下不必从头重新运行代码

接下来,让我们看看mzML中包含的数据是什么样的

代码
文本
[ ]
from pyopenms import MSExperiment, MzMLFile
import pandas as pd
# 读取centroid模式的mzML数据
MzMLFile().load("/root/proteomics/example_data/mzml/ZY_UPS2_A1_Mouse_0_6ug.mzML", centroid_exp:=MSExperiment())
centroid_ms1_df, centroid_ms2_df = centroid_exp.get_massql_df()

# 读取profile模式的mzML数据
MzMLFile().load("/root/proteomics/example_profile_mode_data/ZY_UPS2_A1_Mouse_0_6ug.mzML", profile_exp:=MSExperiment())
profile_ms1_df, profile_ms2_df = profile_exp.get_massql_df()

# 调用get_massql_df,我们可以获得两个数据框,分别是MS1和MS2的数据
# 两个数据框都包含以下列:
# 'i':峰的强度
# 'i_norm':由谱图中最大强度归一化的强度
# 'i_tic_norm':由谱图总离子流强度归一化的强度
# 'mz':质荷比
# 'scan':谱图编号
# 'rt':保留时间
# 'polarity':离子模式,整数值(正离子:1,负离子:2)

# MS2数据框包含附加列:
# 'precmz':前体离子的质荷比
# 'ms1scan':对应的MS1谱图编号
# 'charge':前体离子电荷数


# i_norm和i_tic_norm分别为下面的i_max_norm和i_sum_norm
# 这里为你展示了它们的计算方法
def norm_it(x: pd.DataFrame):
x["i_max_norm"] = x["i"] / x["i"].max()
x["i_sum_norm"] = x["i"] / x["i"].sum()
return x

ms2_df_norm = centroid_ms2_df.groupby("scan", group_keys=False).apply(norm_it)
代码
文本

以上便是一个LC-MS/MS实验下机数据中包含的所有主要数据,我们后续的一系列数据分析将以它们为基础展开。

你可以新开notebook的cell,然后逐个查看这些数据框的样子哦~就像下面这样:

代码
文本
[ ]
ms2_df_norm
代码
文本
[ ]
# 如果你要连续运行之后的代码,因内存不足,需要改过自新
# 删除所有已定义的变量,因为之后我们不会用到它们
del ms2_df_norm
del profile_ms1_df
del profile_ms2_df
del profile_exp
del centroid_ms1_df
del centroid_ms2_df
del centroid_exp
代码
文本

原始数据预处理

代码
文本

数据格式转换

代码
文本

前述已经提过了数据格式转换的常用工具,你唯一需要注意的是,如果选择做PeakPicking,你将会获得centroided格式的数据;反之,你将获得profile模式的数据。

在这里,让我们节省一些时间,暂时跳过这个部分。当然,我会放一些示例代码在下面。

代码
文本
# 利用aspera从iprox下载数据
username=YourUserName # 你需要亲自去注册一个账号
ascp -d -QT -l1000m -P 33001 --file-manifest=text -k 2 -o Overwrite=diff ${username}@download.iprox.org:IPX0000755000 .

# 一、ThermoRaw格式转换为mzML
# 安装 thermorawfileparser
conda install -c bioconda thermorawfileparser
# 示例:转换为profile模式的mzML文件
ThermoRawFileParser -i=./IPX0000755000/IPX0000755003/ZY_UPS2_A1_Mouse_0_6ug.raw -f=2 -p=1- -o=./IPX0000755000/IPX0000755003/mzml_profile
# 示例:转换为centroid模式的mzML文件(当前一般情况下的推荐模式)
ThermoRawFileParser -i=./IPX0000755000/IPX0000755003/ZY_UPS2_A1_Mouse_0_6ug.raw -f=2 -p=1- -o=./IPX0000755000/IPX0000755003/mzml_centroid

# 二、ProteoWizard的msConvert(推荐)
# 首先我会推荐你使用Windows系统下ProteoWizard的GUI工具,因为部分仪器厂商的格式转换依赖部分dll文件,这当前只能在Windows系统下进行
# 然后,你可以利用docker+wine的方式
# https://hub.docker.com/r/chambm/pwiz-skyline-i-agree-to-the-vendor-licenses
docker pull chambm/pwiz-skyline-i-agree-to-the-vendor-licenses
docker run -it --rm -e WINEDEBUG=-all -v /your/data:/data chambm/pwiz-skyline-i-agree-to-the-vendor-licenses wine msconvert /data/file.raw
代码
文本

特征提取(Feature Detection)

代码
文本

在蛋白组学数据分析的预处理流程中,特征提取是一项重要的处理步骤。

特征提取的目标是从原始的质谱图谱数据中提取出具有生物学意义的特征,这些特征可以代表蛋白质或肽段。

具体来说,特征提取主要包括以下几个方面的处理:

  1. 在质谱全谱图中识别肽聚集特定质荷比下的特征峰。这些特征峰代表具有相近质荷比的一系列肽聚集。
  2. 拟合特征峰的同位素模式。根据含碳原子个数不同的肽聚集所形成的同位素峰进行拟合,得到特征的质荷比。
  3. 构建特征在经过色谱分离后在保留时间维度上形成的洗脱峰。合并不同扫描时刻的同一特征,获得其经整个色谱过程的洗脱规律。
  4. 计算各特征的积分强度。该强度反映特征物质的相对含量。
  5. 统计各特征的其他信息,如电荷状态、维度(质荷比和保留时间)、质量等。

特征提取将复杂的原始图谱转化为具有生物学意义且容易解析的特征矩阵,为后续的识别鉴定、定量分析等奠定基础。它是蛋白组学分析流程的关键步骤之一。

简单地说,在这个步骤中,我们将相近质荷比(一般高分辨率容许误差为5 ppm)以及相近保留时间的峰当作同一个特征(实际上指同一个分子,例如同一个肽段)。

OpenMS中有多个工具可以在LC-MS数据中识别这些特征,这些工具称为“FeatureFinder”。当前在pyOpenMS中可用的FeatureFinder有:

  • FeatureFinderMultiplexAlgorithm (例如SILAC、二甲基标记、非标记的肽特征检测)

  • FeatureFinderAlgorithmPicked (非标记的肽特征检测)

  • FeatureFinderIdentificationAlgorithm (非标记的、基于识别的肽特征检测)

  • FeatureFinderAlgorithmIsotopeWavelet (老式仪器)

  • FeatureFindingMetabo (非标记的、基于识别的代谢特征检测)

  • FeatureFinderAlgorithmMetaboIdent (非标记的、基于识别的代谢特征检测)

除了FeatureFindingMetaboFeatureFinderMetaboIdentCompound用于代谢组学数据和小分子之外,上述所有算法都是用于蛋白组学数据。

代码
文本
[ ]
import pyopenms as oms
from glob import glob
from pathlib import Path
from tqdm import tqdm

# 在这一步我们只提取一级质谱的特征,主要目的为对齐多个样品的特征,以便后续的定量分析
options = oms.PeakFileOptions()
options.setMSLevels([1])
feature_handler = oms.MzMLFile()
feature_handler.setOptions(options)

# 除了上述提过的FeatureFinder,我们还可以直接调用oms.FeatureFinder,通过提供期望的算法名称获得对应的参数
feature_finder = oms.FeatureFinder()
# 提供一个注册过的算法名称,可以通过oms.FeatureFinder().getRegisteredAlgorithmNames()查看
params = feature_finder.getParameters(algorithm_name:= "centroided")

# 本部分耗时比较长,可以保存featuremap,以便后续读取
mzml_dir = "/root/proteomics/example_data/mzml"
feature_map_dir = "/root/proteomics/example_data/featuremap"
Path(feature_map_dir).mkdir(exist_ok=True, parents=True)

def extract_feature_map(mzml_file):
feature_map_save_path = Path(feature_map_dir, f"{Path(mzml_file).stem}.featureXML").as_posix()
# 由于时间消耗比较长,我帮你把结果放到镜像里了
if Path(feature_map_save_path).exists():
oms.FeatureXMLFile().load(feature_map_save_path, feature_map:= oms.FeatureMap())
return feature_map
feature_handler.load(mzml_file, exp:=oms.MSExperiment())
exp.updateRanges()
feature_finder.run(algorithm_name, exp, feature_map:=oms.FeatureMap(), params, oms.FeatureMap())
feature_map.setUniqueIds()
feature_map.setPrimaryMSRunPath([Path(mzml_file).stem.encode()])
oms.FeatureXMLFile().store(feature_map_save_path, feature_map)
return feature_map

mzml_files = glob(Path(mzml_dir, "*.mzML").as_posix())
feature_maps = [extract_feature_map(mzml_file) for mzml_file in tqdm(mzml_files)]
代码
文本

峰对齐(Map Alignment)

代码
文本

在做完特征识别后,我们还需要做峰对齐。它的基本原理如下:

  1. 对每个特征峰,计算其在不同样品之间在保留时间维度上的错位误差。
  2. 通过动态编程算法找到一种峰匹配方案,使得总的错位误差最小化。
  3. 根据峰匹配结果,用样条插值的方法对所有样品的特征峰在保留时间上进行一一对应的拟合,实现峰的对齐。
  4. 对对齐后的特征矩阵,在质荷比维度上进行去噪和归一化。

——图片来源pyOpenMS

通过峰对齐算法,可以消除不同测量中非生物学因素导致的特征峰位置偏差,使下游的定量分析更加准确可靠。

更多信息可以查阅OpenMS官方文档

在这里,我们采用MapAlignmentAlgorithmPoseClustering

它是一种基于姿态聚类的图谱对齐算法[1]

该算法为每个图谱选择 intensities 最高的 x 个峰/特征,通过分析峰对距离来找到保留时间最可能的转换。

在OpenMS中,这通过参数“max_num_peaks_considered”来模型化,它反过来影响运行时间和结果的稳定性。

更大的值会延长计算时间,更小的值可能导致没有或不稳定的转换矩阵。设置为-1使用所有特征(对大图谱会花很长时间)。

alt image.png


[1] Lange, Eva, et al. "A geometric approach for the alignment of liquid chromatography—mass spectrometry data." Bioinformatics 23.13 (2007): i273-i281.

代码
文本
[ ]
import pyopenms as oms
from glob import glob
from pathlib import Path
from tqdm import tqdm

def load_featurexml(filepath):
oms.FeatureXMLFile().load(filepath, feature_map:= oms.FeatureMap())
return feature_map

mzml_dir = "/root/proteomics/example_data/mzml"
feature_map_dir = "/root/proteomics/example_data/featuremap"
Path(aligned_dir:= "/root/proteomics/example_data/aligned").mkdir(exist_ok=True, parents=True)
# 如果你是从上一个部分过来的,此刻你应该已经有feature_maps了,可以把下面这行注释掉
feature_maps = [load_featurexml(filepath) for filepath in tqdm(glob(Path(feature_map_dir, "*.featureXML").as_posix()))]
# 将ref_index设定为包含特征数最多的特征图的索引
fm_size_list = [int(fm.size()) for fm in feature_maps]
ref_index = fm_size_list.index(max(fm_size_list))
aligner = oms.MapAlignmentAlgorithmPoseClustering()
aligner.setReference(feature_maps[ref_index])
# 把各个特征图对齐到特征数最多的特征图上
for idx, feature_map in tqdm(enumerate(feature_maps), desc="Running Alignment", total=len(feature_maps)):
run_name = feature_map.getMetaValue("spectra_data")[0].decode()
oms.MzMLFile().load(Path(mzml_dir, f"{run_name}.mzML").as_posix(), exp:=oms.MSExperiment())
# 特征最多的特征图不需要对齐
if idx != ref_index:
trafo = oms.TransformationDescription()
aligner.align(feature_map, trafo)
transformer = oms.MapAlignmentTransformer()
# store original RT as meta value
transformer.transformRetentionTimes(
exp, trafo, True
)
transformer.transformRetentionTimes(
feature_map, trafo, True
)
oms.MzMLFile().store(Path(aligned_dir, f"{run_name}.aligned.mzML").as_posix(), exp)
oms.FeatureXMLFile().store(Path(aligned_dir, f"{run_name}.aligned.featureXML").as_posix(), feature_map)
代码
文本

特征组合(Feature Linking)

代码
文本

做完特征提取和对齐后,我们便可以基于空间邻近关系进行(例如相似的保留时间和m/z)特征组合。

(可选地)我们也可以先对各个峰做基于二级谱的鉴定,再来做组合。这取决于你对速度和精度的偏好。

——图片来源pyOpenMS

pyOpenMS中提供了实现和运行特性略有不同的各种特征组合算法:

  • FeatureGroupingAlgorithmQT

  • FeatureGroupingAlgorithmKD

  • FeatureGroupingAlgorithm

  • FeatureGroupingAlgorithmLabeled

  • FeatureGroupingAlgorithmUnlabeled

你可以在OpenMS官方文档里找到更为详细的介绍。

接下来,我们采用FeatureGroupingAlgorithmQT进行特征组合。它是一个用于非标记数据的特征分组算法。

该算法取多个特征图或聚类图,并在不同图之间搜索对应的(聚类)特征。这些图必须进行对齐(即纠正保留时间畸变,例如使用某个MapAlignmentAlgorithm),但可以容忍小的偏差。

这个特定算法会累积所有输入图的特征,然后应用QT聚类的变体来找到对应的特征组。更多细节请参阅QTClusterFinder

代码
文本
[ ]
import pyopenms as oms
from glob import glob
from pathlib import Path
from tqdm import tqdm

def load_featurexml(filepath):
oms.FeatureXMLFile().load(filepath, feature_map:= oms.FeatureMap())
return feature_map

aligned_dir = "/root/proteomics/example_data/aligned"
# 你需要重新将对齐过的feature maps读取进来;
# 有一个隐藏技巧是利用Feature pushback直接更新之前的FeatureMap,这样就不需要重新读取了。
# 但为了拆分代码,这里还是重新读取了。
aligned_feature_maps = [load_featurexml(filepath) for filepath in tqdm(glob(Path(aligned_dir, "*.featureXML").as_posix()))]

feature_grouper = oms.FeatureGroupingAlgorithmQT()
consensus_map = oms.ConsensusMap()
file_descriptions = consensus_map.getColumnHeaders()

for i, feature_map in tqdm(enumerate(aligned_feature_maps), desc="Adding Description", total=len(aligned_feature_maps)):
file_description = file_descriptions.get(i, oms.ColumnHeader())
file_description.filename = feature_map.getMetaValue("spectra_data")[0].decode()
file_description.size = feature_map.size()
file_description.unique_id = feature_map.getUniqueId()
file_descriptions[i] = file_description

consensus_map.setColumnHeaders(file_descriptions)
consensus_map.setUniqueIds()
feature_grouper.group(aligned_feature_maps, consensus_map)
consensus_map.get_df()
代码
文本

现在,你获得了一个ConsensusMap,它包含每个id对应的肽段的所有特征和丰度。

但是我们仍然不知道这些肽段的序列,更不要说获得各个蛋白在各样本中的含量,接下来,让我们来补全这个部分。

代码
文本

肽段识别(Peptide Search)

代码
文本

在基于质谱的蛋白组学中,碎片离子质谱(MS2)通常是通过将其与从FASTA数据库生成的一组理论质谱进行比较来解释的。

蛋白质组学中用于评价肽段识别结果质量的常用评分算法类型通常包括:

1、截断评分法

  • 基于匹配结果的总体评分进行筛选,设定评分阈值,高于阈值的結果被保留。

  • 评分通常依据匹配片段的强度求和计算。

  • 简单直接,但可能过滤真阳性或保留假阳性。

2、概率评分法

  • 基于匹配的概率模型打分。

  • 通过比较匹配和随机匹配的概率分布差异给出评分。

  • 更可靠,但需建立概率模型。

3、机器学习评分法

  • 使用分类模型对匹配进行评分。

  • 可以整合多维信息,训练出一个复杂的评分函数。

  • 准确度高,但需要大量训练数据。

4、多级评分结合

  • 结合上述多种评分方法,综合其优势。

  • 例如先用概率评分进行筛选,再用机器学习进行排序。

  • 可以使结果更可靠,但算法复杂度也更高。


在大多数蛋白组学应用中,会使用专用的搜索引擎来搜索数据。(如Comet、Crux、Mascot、MSGFPlus、MSFragger、Myrimatch、OMSSA、SpectraST或XTandem。它们的结果读取pyOpenMS都支持)

在这里,我们将使用OpenMS中的SimpleSearchEngineAlgorithm,仅用于教学示范。这使得将一个mzML文件与一个蛋白序列FASTA数据库进行搜索变得非常简单。

——图片来源pyOpenMS

你可以在OpenMS官方文档里找到更为详细的介绍。

如果你对各个搜索引擎的使用方式、各自的速度和精度等比较比较感兴趣,不妨留言催更。

代码
文本

由于每种方法都需要做评分,再根据评分决定一个特征应对的肽段。这时候便会涉及到假阳性的问题,它由以下几个原因造成:

  1. 存在可能的肽段数量太多,包含许多实际不存在的成分。

  2. 评分算法不够准确和可靠,导致一些低质量匹配获得较高分数。

  3. 真正存在的肽段因数据问题评分较低,被排除在结果之外。

  4. 多个结果整合时出现错误传递。

  5. 存在未知化合物的干扰。

为了提高结果的可靠性,除了需要不断优化算法和流程,我们还需要并利用对照组评估假阳性概率。

但由于我们大部分场景下并不存在可以用来评估假阳性率的对照组,于是便凭空造一个现实中极大概率并不存在的蛋白序列库——即decoy库,一般有序列反转法和序列打乱法。

根据搜索结果中decoy的命中情况,评估实际结果中假阳性的概率。这为后续判断结果的可靠性提供依据。

代码
文本
[ ]
import pyopenms as oms
from glob import glob
from pathlib import Path
from tqdm import tqdm

aligned_dir = "/root/proteomics/example_data/aligned"
aligned_mzmls = glob(Path(aligned_dir, "*.mzML").as_posix())
# fasta库文件,这里使用了swissprot中mouse的蛋白和UPS2的蛋白
searchdb = "/root/proteomics/sp_mouse_ups2.fasta"
# 用于存放搜库的结果
Path(idxml_dir:= "/root/proteomics/example_data/idxml").mkdir(exist_ok=True, parents=True)

# 生成包含蛋白质序列及其反向序列的数据库
# pyOpenMS为我们提供了十分便利的工具,当然你也可以自己写代码实现,这很简单
targets = list()
decoys = list()
oms.FASTAFile().load(
searchdb, targets
)
decoy_generator = oms.DecoyGenerator()
for entry in targets:
rev_entry = oms.FASTAEntry(entry)
rev_entry.identifier = "DECOY_" + rev_entry.identifier
aas = oms.AASequence().fromString(
rev_entry.sequence
)
rev_entry.sequence = decoy_generator.reverseProtein(
aas
).toString() # reverse
decoys.append(rev_entry)

target_decoy_database = "/root/proteomics/search_td.fasta"
oms.FASTAFile().store(
target_decoy_database, targets + decoys
)

# Run SimpleSearchAlgorithm, store protein and peptide ids
protein_ids = []
peptide_ids = []

# 设置一些自定义的搜库参数
simplesearch = oms.SimpleSearchEngineAlgorithm()
params = simplesearch.getDefaults()
score_annot = [b"fragment_mz_error_median_ppm", b"precursor_mz_error_ppm"]
params.setValue(b"annotate:PSM", score_annot)
params.setValue(b"peptide:max_size", 30)
simplesearch.setParameters(params)

for searchfile in tqdm(aligned_mzmls, desc="Searching", total=len(aligned_mzmls)):
simplesearch.search(searchfile, target_decoy_database, protein_ids, peptide_ids)

bpia = oms.BasicProteinInferenceAlgorithm()
params = bpia.getDefaults()
params.setValue("annotate_indistinguishable_groups", "false")
bpia.setParameters(params)
bpia.run(peptide_ids, protein_ids)

# 从蛋白水平上计算q-value,默认会去掉decoy蛋白
oms.FalseDiscoveryRate().apply(protein_ids)

# 按1% FDR过滤蛋白
idfilter = oms.IDFilter()
idfilter.filterHitsByScore(protein_ids, 0.01)
remove_peptides_without_reference = True
idfilter.updateProteinReferences(
peptide_ids, protein_ids, remove_peptides_without_reference
)
# 保存
oms.IdXMLFile().store(
Path(idxml_dir, f"{Path(searchfile).stem}.idXML").as_posix(), protein_ids, peptide_ids
)
代码
文本

搜库结果映射(IDMapping)

代码
文本

接下来,我们把搜库的结果映射到之前对齐过的特征图上

这种映射是基于保留时间和质荷比进行的。

简单来说,如果一个肽鉴定的位置在一个共识特征的边界内或足够接近共识特征的质心,则将该肽鉴定分配给这个共识特征。

那些没能匹配到的肽鉴定仍然会以“未分配肽”的形式记录在结果图中。蛋白鉴定则会批注到整个结果图上,即不针对任何特定的共识特征。

在所有情况下,RT和m/z维度上的误差都是根据参数rt_tolerance和mz_tolerance应用的。这里的误差理解为“正负x”,所以实际的匹配范围是误差值的两倍。

如果有多个特征或共识特征的位置与某肽鉴定重叠(考虑到允许的误差),则该鉴定会被批注到所有这些特征上。

代码
文本
[ ]
import pyopenms as oms
from glob import glob
from pathlib import Path
from tqdm import tqdm
import pandas as pd

aligned_dir = "/root/proteomics/example_data/aligned"
idxml_dir = "/root/proteomics/example_data/idxml"
aligned_feature_maps_with_id = []

feature_grouper = oms.FeatureGroupingAlgorithmQT()
consensus_map = oms.ConsensusMap()
file_descriptions = consensus_map.getColumnHeaders()
mapper = oms.IDMapper()
use_centroid_rt = False
use_centroid_mz = True

for i, filepath in enumerate(tqdm(glob(Path(aligned_dir, "*.featureXML").as_posix()))):
oms.MzMLFile().load(Path(aligned_dir, Path(f"{Path(filepath).stem}.mzML")).as_posix(), exp:= oms.MSExperiment())
oms.FeatureXMLFile().load(filepath, feature_map:= oms.FeatureMap())
id_file = Path(idxml_dir, f"{Path(filepath).stem}.idXML").as_posix()
oms.IdXMLFile().load(id_file, protein_ids:=[], peptide_ids:=[])
# 将搜库结果映射到特征图上
mapper.annotate(feature_map, peptide_ids, protein_ids, use_centroid_rt, use_centroid_mz, exp)
aligned_feature_maps_with_id.append(feature_map)
file_description = file_descriptions.get(i, oms.ColumnHeader())
file_description.filename = feature_map.getMetaValue("spectra_data")[0].decode()
file_description.size = feature_map.size()
file_description.unique_id = feature_map.getUniqueId()
file_descriptions[i] = file_description

consensus_map.setColumnHeaders(file_descriptions)
consensus_map.setUniqueIds()
feature_grouper.group(aligned_feature_maps_with_id, consensus_map)

# 你可以这样保存结果
# oms.ConsensusXMLFile().store("/root/proteomics/example_data/consensus_map.consensusXML", consensus_map)
consensus_df = consensus_map.get_df()

# 获取每条肽段的打分和蛋白质信息
pep_hit_df = pd.DataFrame([
[pep_hit.getSequence().toString(), pep_hit.getScore(), ";".join([pep_evi.getProteinAccession() for pep_evi in pep_hit.getPeptideEvidences()]), len(pep_hit.getPeptideEvidences())]
for i in tqdm(consensus_map.getUnassignedPeptideIdentifications())
for pep_hit in i.getHits()
],
columns=["sequence", "score", "protein_accession", "protein_count"]).drop_duplicates(subset=["sequence"])

# 没有配对上的特征便不要了
consensus_df = consensus_map.get_df().query("sequence != 'None'")
consensus_df_with_prot = pd.merge(pep_hit_df, consensus_df, on='sequence', how='right')
# 这样我们便获得了一个包含肽段及其对应蛋白质信息的数据框
consensus_df_with_prot
代码
文本

蛋白质定量

代码
文本

到目前为止,我们获得了各条肽段及其对应蛋白质在各个样品中的含量。那如何确定各蛋白质在样品中的含量呢?

在适合本数据的LFQ(Label-Free Quantitation)方法中,最常见地,我们会采用两种比较单纯的方法——TOP3和iBAQ。

其中TOP3如其名,每条蛋白我们取其中含量最高的三条肽段,取其平均作为蛋白质的定量结果。这个实现很简单,你不妨自己试试。

下次教程我们将展开讲解各个蛋白质定量方法,你可以通过点赞或留言的形式催更。

代码
文本
python
中文
组学
蛋白质组学
OpenMS
pyOpenms
python中文组学蛋白质组学OpenMSpyOpenms
已赞6
本文被以下合集收录
生物信息学 Notebooks Collection
liyongge
更新于 2024-09-13
33 篇75 人关注
蛋白质组学系列
guolj@dp.tech
更新于 2024-05-06
2 篇1 人关注
推荐阅读
公开
TeachOpenCADD | 008 获取PDB
化学信息学TeachOpenCADD
化学信息学TeachOpenCADD
YangHe
发布于 2023-06-15
公开
TBPLaS入门教程
紧束缚模型对角化方法时间演化方法大尺度模拟中文
紧束缚模型对角化方法时间演化方法大尺度模拟中文
李云海
发布于 2023-07-26
9 赞7 转存文件8 评论