第4章 输入数据格式:支持的工具与输出文件解析

咱们这一章聊的是MultiQC真正干活儿的基础——它到底能吃哪些工具的输出。说白了,MultiQC就是个“文件嗅探器”,它不认识原始的FASTQ、BAM,它只认特定工具写出来的总结文件。我最早做审计项目时,第一周就把精力花在了理解这些输出文件的结构上。你想想看,如果连MultiQC怎么找到、怎么解析都不知道,后面写SOP、做验证都是空中楼阁。

4.1 FastQC——最基础的质检输出

FastQC大概是每个生信项目碰到的第一个工具。它检查测序质量,输出一堆HTML和压缩包。MultiQC真正吃的是那个_fastqc.zip文件,或者更准确地说,是zip里面的fastqc_data.txt。我习惯在项目里保留所有zip,但审计时经常会有人只给了HTML,那MultiQC就完全读不了——血的教训。

关键文件匹配模式:

*_fastqc.zip            # MultiQC按这个glob找到文件
*/fastqc_data.txt       # 如果zip被提前解压,也能读
*/fastqc_report.html     # MultiQC不读HTML!别只存这个

FastQC会输出几十个统计值,比如总读长、GC含量、过表达序列比例。MultiQC把这些字段整理到一张表里。你在审计时需要知道:FastQC输出文件中的>Per base sequence quality部分不是数字表格,而是文本格式,MultiQC会按行解析。我曾经见过有人手动修改了zip里的文本,结果解析出来的quality warning数全是错的。

✅ 审计必查项:确认FastQC zip未被手动篡改,校验文件的MD5。

💡 如果你的项目用了多个版本的FastQC,输出的文本格式略有差异(比如旧版没有total sequences那行),MultiQC都能自动容错。但别指望它能处理完全改写的文件格式。

4.2 STAR——比对工具的日志才是宝藏

STAR输出很多文件:BAM、SJ.out.tab、Log.final.out。嗯,MultiQC只认那个Log.final.out。我理解很多人喜欢看SJ文件,但MultiQC从日志里提取的是比对率、多比对率、剪切位点统计等宏观指标。审计场景下,这些数据比剪切位点详情更敏感——可以直接反映比对异常。

STAR输出文件MultiQC是否读取关键信息
Log.final.out是总reads、唯一比对率、多比对率、总比对长度
Log.out否运行详细日志(不用于报告)
SJ.out.tab否剪切位点(支持者少,MultiQC暂不纳入)
Log.progress.out否运行进度(无汇总价值)

举一个我实际遇到的坑:有一次审计时发现某个样本的比对率异常低(40%),但STAR的Log.final.out文件显示是“0 mapped”。后来查实是用户把两个样本的Log.final.out文件名写反了。MultiQC按文件名排序,导致数据张冠李戴。嗯,所以文件名规则特别重要。

STAR的Log.final.out格式是固定的键值对,MultiQC按行解析。你可以在终端里直接用cat看一下:

cat Log.final.out | head -20
                                   Started job on |      2023-07-15 14:30:22
                                   Started mapping on |      2023-07-15 14:33:10
                                    Finished on |      2023-07-15 14:35:44
                                       Mapping speed, Million of reads per hour |       782.45

                          Number of input reads |       12345678
                      Average input read length |       151
                                    Uniquely mapped reads number |       11223344
         Uniquely mapped reads % |       90.94%

注意,这个文件没有表头,MultiQC靠键名识别。一旦有人把“Uniquely mapped reads %”改成了“Unique %”,MultiQC就认不出来了。所以版本变更或自定义修改都是审计风险点。

4.3 Salmon——定量工具的多文件命名规范

Salmon比STAR复杂一点,它输出一个目录,里面有quant.sf、aux_info、libParams等。MultiQC直接从quant.sf里提取reads数、映射率、有效长度等。关键点:Salmon输出的cmd_info.json包含了运行参数,MultiQC也读这个。

实际项目中,我见过有人把Salmon输出目录和STAR输出目录混放在一起。MultiQC怎么区分?靠glob模式——它会搜索**/quant.sf,跟STAR的**/Log.final.out完全不冲突。但如果你改动了文件名或路径结构,就会漏掉。

文件搜索优先级:

# Salmon
**/quant.sf               # 主计数文件
**/cmd_info.json          # 参数信息(可选)
**/libParams/flenDist.txt # 插入片段长度分布(可选)

# 注意:MultiQC不会读salmon的meta_info.json,只读cmd_info.json

⚠️ Salmon有两种模式:--libType为A(自动检测)时,libParams目录里会包含推断的文库类型。MultiQC只读取它,不会去校验一致性。如果你需要审计文库类型是否被正确推断,建议额外检查Salmon日志,不要完全信任MultiQC的报告。

4.4 其他工具输出格式一览

除了FastQC、STAR、Salmon,MultiQC还支持50多种工具。我挑几个审计里最高频的说。

  • HISAT2:读*.hisat2.log,包含比对率和时间。
  • Bowtie2:读*.bowtie2.log,类似HISAT2但键名不同。
  • featureCounts:读*.summary文件,每行对应一个统计类别。
  • RSEM:读*.stat或*.cnt,与Salmon格式不同。
  • Picard:读各种*metrics.txt,比如alignment_summary_metrics。

每个工具的输出格式都有细微差异。我在写SOP时,习惯建一个对照表,列出MultiQC能解析的字段原文。这样审计员可以对报告里的数字回溯源文件,确认没有失真。

4.5 MultiQC如何“找到”这些文件?

MultiQC不是漫无目的地遍历整个项目。它有一份预置的“文件搜索模式”列表(由每个工具的模块定义)。你使用multiqc .时,它会在当前目录递归匹配所有已知模式。你可以通过-m参数指定只加载某些模块,加快速度。

我习惯用--data-dir把中间文件保存下来,方便审计回溯。

# 只分析FastQC和STAR,并保留解析后的中间JSON
multiqc . -m fastqc -m star --data-dir

这个命令会生成multiqc_data/目录,里面每个样本对应的原始数值都存成了JSON。审计时直接对那个JSON做版本控制特别好用。

✅ 建议:在SOP中要求CI/CD job里必须用--data-dir,这样如果有人质疑报告的数值,可以直接找中间JSON,而不是去翻几千个原始输出文件。

好了,咱们现在有了数据源。下一章我会演示怎么把这些文件正确喂给MultiQC,以及怎么用multiqc_config.yaml控制搜索行为。但今天不说了,先消化这些文件格式的知识吧。

MultiQC 文件嗅探与解析流程 FastQC *_fastqc.zip STAR Log.final.out Salmon quant.sf 其他工具(50+) *.log, *.summary, *.txt MultiQC 模块匹配 文件解析 数据聚合 中间JSON缓存 MultiQC Report multiqc_report.html 中间数据 multiqc_data/ 审计要点:每个工具的搜索模式(glob)不能随意更改,否则MultiQC会漏检 建议在SOP中固化MultiQC命令参数,并使用 --data-dir 保留中间JSON