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 结构,文本可查看
跨平台受限于厂商 SDKHUPO-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 的动作串起来,你可以把它贴在实验记录本上,照着走。

原始数据准备流程 质谱仪 → .raw msconvert → .mzML 命名规范 + 文件夹组织 创建 design.tsv MaxQuant 定量分析 结果质量检查 💡 注意点 • .raw 保持只读,不修改 • mzML 建议保留带 gz 压缩 • 命名不要用空格和特殊字符

看到这张图你就明白了:原始数据到手后,先别急着扔进 MaxQuant,花 20 分钟做好格式转换、文件重命名和文件夹组织,反而不容易出错。当然,如果你用的是 .mzML 而不是 .raw,上面的 msconvert 那步可以跳过——但命名和组织那部分,绝对不能省。

4.7 避坑指南(我踩过的雷)

  • 命名长度:别写太长的描述,比如 20250301_WT_treated_with_A_drug_24h_rep1,某些工具在解析文件名时有限制。建议控制在 30 个字符内。
  • 时间戳一致:如果同一个样品从质谱仪上下载了两次,两个 .raw 可能看上去一模一样,但哈希值不同(因为文件头包含采集时间)。我建议保留最早的那一份,不要覆盖。
  • 检查 mzML 完整性:转换完后可以用 mzml_validator(ProteoWizard 自带)跑一遍,确保 xml 结构正确。我曾经遇到文件转出来但缺失了一部分谱图,MaxQuant 读起来不报错,但结果偏小。
一句话总结
原始数据准备,说白了就是把“脏”的厂商格式洗成干净、可复用的标准格式,再用命名和文件夹把样品之间的关系说清楚。这一步做得越规范,后面跑 pipeline 就越顺。