4 原始数据准备:质谱数据格式、组织与命名规范
做定量蛋白质组学,数据准备那步要是栽了,后面跑再多算法也救不回来。我今天就跟你聊聊原始数据这关怎么过——从质谱仪吐出来的 .raw 文件,到标准化的 .mzML,再到文件夹该怎么摆、文件名叫什么,一步步掰扯清楚。
4.1 为什么不能跳过原始数据整理
我记得刚入行时,接过一个合作项目,对方直接把 .raw 拷过来,文件名长这样:20210315_Sample1.raw、Sample2_20210315.raw……我看了半天没搞懂哪个是处理组哪个是对照。没办法,只能一个个打电话问。打那以后,我养成了一个习惯:
原始数据占流水线80%的坑,提前把格式、组织、命名定死,后面跑pipeline只用写一个循环。别指望靠人脑记忆,尤其是在处理几十个样品的时候。
4.2 raw 与 mzML——你该用哪个
质谱仪厂商各自有“方言”:Thermo 用 .raw,Bruker 用 .d,SCIEX 用 .wiff。这些格式包含了仪器参数、谱图数据、还有一些厂商私有的元信息。我一般建议:能用 .mzML 就用 .mzML。
| 对比项 | .raw(厂商原生) | .mzML(开放标准) |
|---|---|---|
| 可读性 | 二进制,只能专用软件打开 | XML 结构,文本可查看 |
| 跨平台 | 受限于厂商 SDK | HUPO-PSI 标准,主流工具都支持 |
| 兼容性 | MaxQuant 需要特定版本驱动 | MaxQuant 原生支持,无需额外驱动 |
| 文件大小 | 通常较小(压缩算法不同) | 同等数据略大,可用 gzip 压缩 |
| 元数据保留 | 完整保留 | 保留大部分,需检查特定参数 |
我以前做项目时,遇到过直接从 .raw 导入 MaxQuant 报“无法识别格式”的错误,折腾了半天才发现是 Thermo RawFileReader 版本不匹配。后来我统一先用 msconvert 转成 .mzML,再没出过兼容性问题。说白了,多这一步,省后面无数麻烦。
4.3 数据组织——别让文件夹变成垃圾堆
我见过最离谱的文件夹结构:把所有 .raw 堆在桌面,跑分析时手动拖进去。碰上样品多的时候,人眼找到手抖。所以,我个人习惯用下面这种树形结构:
project/
├── 01_raw_original/ # 原始raw,只读权限
│ ├── 20250301_WT_rep1.raw
│ ├── 20250301_WT_rep2.raw
│ └── ...
├── 02_mzML_converted/ # 统一转成mzML后存放
│ ├── 20250301_WT_rep1.mzML
│ ├── 20250301_WT_rep1.mzML.gz
│ └── ...
├── 03_experiment_design/ # 实验设计表、注释文件
│ └── design.tsv
├── 04_maxquant_input/ # 软链接或者拷贝给MQ用的最终文件
│ └── (指向 02 下的文件)
└── 05_results/ # 不碰,让MQ自己写结果
为什么单独把 01_raw_original 设成只读?你看,.raw 一旦被修改,里面的时间戳可能就乱了。我有一回不小心用文本编辑器打开了 .raw,虽然没保存改动,但文件的最后修改日期变了,导致下游批量处理按时间排序时全乱套。嗯,从那以后我严格区分“源文件”和“工作副本”。
不要在
01_raw_original 里面做任何编辑操作。如果你需要调整元信息(比如修改样品编号),请修改实验设计表(design.tsv),而不是改原始文件。
4.4 命名规范——让人和机器都能看懂
命名这件事,看起来小,但往往是 pipeline 崩溃的罪魁祸首。我吃过一个亏:同一个项目里有人用下划线有人用空格,还有人混用中英文括号,结果 MaxQuant 读取实验分组的时候把文件名当成了分组名,生成了一堆“_ (1).raw”这样的奇葩标签,后面手动清洗数据洗了一下午。
现在我坚持用这套规则:
- 日期:ISO 8601 格式,比如
20250301(便于按时间排序) - 样品编号:简短且唯一,比如
WT_12h、KO_24h - 技术重复:用
_rep1、_rep2表示 - 分隔符:统一用下划线
_,绝对不用空格 - 禁止特殊字符:括号、百分号、&、# 都不允许
- 扩展名全小写:
.raw、.mzML不要混大写
举个例子:
20250301_WT_rep1.mzML
20250301_WT_rep2.mzML
20250301_KO_rep1.mzML
20250301_KO_rep2.mzML
如果你的实验分组比较多,可以在一个 design.tsv 里记录每个文件名对应的完整元数据:
filename group condition replicate
20250301_WT_rep1.mzML WT untreated 1
20250301_WT_rep2.mzML WT untreated 2
20250301_KO_rep1.mzML KO treated 1
20250301_KO_rep2.mzML KO treated 2
MaxQuant 在设置实验分组时可以直接导入这个表格,省去手动敲的麻烦。
4.5 一个快速转换与重命名的 Python 脚本
下面这个脚本我常用的,配合 msconvert 把 .raw 批量转成 .mzML,同时按命名规范重命名。你只需要准备一个 CSV 映射文件。
import os
import subprocess
import pandas as pd
RAW_DIR = "01_raw_original"
MZML_DIR = "02_mzML_converted"
MAPPING_CSV = "file_mapping.csv"
# 假设 mapping.csv 有两列: old_name, new_base
# old_name: "Sample1.raw"
# new_base: "20250301_WT_rep1"
df = pd.read_csv(MAPPING_CSV)
for _, row in df.iterrows():
old_path = os.path.join(RAW_DIR, row["old_name"])
new_mzml = os.path.join(MZML_DIR, row["new_base"] + ".mzML")
# 转换 + 重命名一步完成
cmd = [
"msconvert", old_path,
"--mzML",
"-o", MZML_DIR,
"--outfile", row["new_base"] # msconvert会自动加.mzML
]
subprocess.run(cmd, check=True)
print(f"Converted {row['old_name']} -> {new_mzml}")
注意:msconvert 需要安装 ProteoWizard 套件。如果你用的是 Windows,在命令行里调用 msconvert.exe 即可。我用这个脚本处理过一次 100 个 .raw,10 分钟搞定转换,文件名齐刷刷变成标准格式——看着真舒服。
4.6 数据格式与命名规范的整体流程
下面这张图把从原始数据到进入 MaxQuant 的动作串起来,你可以把它贴在实验记录本上,照着走。
看到这张图你就明白了:原始数据到手后,先别急着扔进 MaxQuant,花 20 分钟做好格式转换、文件重命名和文件夹组织,反而不容易出错。当然,如果你用的是 .mzML 而不是 .raw,上面的 msconvert 那步可以跳过——但命名和组织那部分,绝对不能省。
4.7 避坑指南(我踩过的雷)
- 命名长度:别写太长的描述,比如
20250301_WT_treated_with_A_drug_24h_rep1,某些工具在解析文件名时有限制。建议控制在 30 个字符内。 - 时间戳一致:如果同一个样品从质谱仪上下载了两次,两个
.raw可能看上去一模一样,但哈希值不同(因为文件头包含采集时间)。我建议保留最早的那一份,不要覆盖。 - 检查 mzML 完整性:转换完后可以用
mzml_validator(ProteoWizard 自带)跑一遍,确保 xml 结构正确。我曾经遇到文件转出来但缺失了一部分谱图,MaxQuant 读起来不报错,但结果偏小。
原始数据准备,说白了就是把“脏”的厂商格式洗成干净、可复用的标准格式,再用命名和文件夹把样品之间的关系说清楚。这一步做得越规范,后面跑 pipeline 就越顺。