第二章 测序数据基础:FASTQ 格式、质量评估与预处理

说实话,做变异解读 pipeline,最怕的就是「垃圾进,垃圾出」。我见过太多新手拿到测序数据直接跑比对,结果后续分析一团糟,最后发现源头是 FASTQ 本身就有问题。所以这一章,咱们把地基打牢——从读懂 FASTQ 格式开始,再聊怎么用 FastQC 看质量,最后用 Trimmomatic 和 cutadapt 把数据洗干净。

FASTQ 格式深度解析

你想想看,一个 FASTQ 文件长什么样?每条记录固定 4 行:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTACGTGACTGACTGACTGACTGACTGACTGACTGACTGAC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

第一行以 @ 开头,是序列标识符,包含仪器、flowcell、坐标等信息。第二行是碱基序列。第三行是 +,后面可以跟重复的 ID(通常为空)。第四行是质量值,每个字符对应一个 Phred 质量分数。

质量值怎么算?Phred 分数 = −10 × log₁₀(P),P 是碱基出错的概率。比如 Q30 表示错误率 0.1%,Q20 是 1%。实际存储时用 ASCII 字符编码:! 对应 0,~ 对应 93。主流 Illumina 平台用 Phred+33 编码,也就是 ASCII 码减去 33 得到真实质量值。有些老数据可能用 Phred+64,踩过坑的都知道……

大坑预警: 我当年接过一个公共数据集,FastQC 报告里碱基质量分布图显示前半段正常、后半段突然掉到 0。查了半天才发现是质量编码不一致——文件前半用 Phred+33,后半用 Phred+64。这种文件必须先用 seqtk 或转换脚本统一编码再往下走。

质量评估——FastQC 实战

FastQC 是质控标配,没有之一。我习惯直接对整个文件夹跑一遍:

fastqc *.fastq.gz -o fastqc_output -t 8

-t 指定线程数,多文件并行加速。跑完后每个样本生成一个 .html 和 .zip。打开 HTML,重点关注几个模块:

  • Per base sequence quality:每个位置的碱基质量箱线图。理想状态是全部落在绿区(Q28 以上)。如果尾部明显变红,说明需要裁剪。
  • Per sequence GC content:GC 含量分布。正常应该是接近理论值的高斯峰。双峰可能提示污染或批次效应。
  • Adapter Content:接头残留百分比。如果虚线在尾部翘起,说明 adapter 没切干净,必须处理。
  • Overrepresented sequences:高频重复序列。过度代表往往就是 adapter 二聚体或 rRNA 污染。

拿到 FastQC 报告后,我通常会先扫一眼「Per base sequence quality」和「Adapter Content」,决定要不要预处理。

一个小技巧:把多个样本的 FastQC 结果汇总成一张图,用 multiqc . 就能生成聚合报告,一眼看出哪些样本是“坏孩子”。

数据预处理——Trimmomatic 与 cutadapt

预处理主要解决两个问题:低质量碱基和 adapter 残留。工具有很多,我最常用的就是 Trimmomatic 和 cutadapt,各有侧重。

Trimmomatic:全能型选手

Trimmomatic 支持双端(PE)和单端(SE),内置滑动窗口裁剪、adapter 切除、最小长度过滤等。举个例子,处理 150bp PE 数据:

java -jar trimmomatic-0.39.jar PE \
  sample_R1.fastq.gz sample_R2.fastq.gz \
  sample_R1_paired.fq.gz sample_R1_unpaired.fq.gz \
  sample_R2_paired.fq.gz sample_R2_unpaired.fq.gz \
  ILLUMINACLIP:TruSeq3-PE.fa:2:30:10 \
  SLIDINGWINDOW:4:20 \
  MINLEN:50
  • ILLUMINACLIP:指定 adapter 序列文件,后面三个参数 2:30:10 分别是最小匹配长、匹配精确度、palindrome 模式得分。
  • SLIDINGWINDOW:4:20:4bp 窗口,平均质量低于 20 就切除。嗯,这里要注意窗口大小和质量阈值要根据实际情况调,有些 RNA-seq 数据质量差,我降到 15 才够用。
  • MINLEN:50:保留至少 50bp 的 reads。
Trimmomatic 输出会区分 paired 和 unpaired。unpaired 文件是因为一条 read 被裁到很短、另一端合格,导致配对断裂。做变异检测时,建议把 paired 和 unpaired 都保留,但后面比对要分开处理。

cutadapt:轻量灵活

cutadapt 专攻 adapter 去除,也能做质量裁剪。语法更直观,适合整合到流程里:

cutadapt -a AGATCGGAAGAGCACACGTCTGAACTCCAGTCA \
  -A AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT \
  -o trimmed_R1.fastq.gz -p trimmed_R2.fastq.gz \
  sample_R1.fastq.gz sample_R2.fastq.gz \
  -q 20 -m 50 --trim-n

-a 和 -A 分别指定 R1 和 R2 的 adapter 序列;-q 20 相当于质量裁剪;--trim-n 去除 N 碱基。

我个人在做 small RNA、cfDNA 等短片段文库时偏爱 cutadapt,因为它对 adapter 正反义链处理更精细,Trimmomatic 有时会漏掉部分 adapter 变体。

怎么选?一张表说清楚

维度 Trimmomatic cutadapt
adapter 去除 强,支持已知文库格式和 palindrome 模式 强,支持 adapter 变体和 linked adapter
质量裁剪 滑动窗口策略,更稳健 从 3' 端直接裁剪,简单高效
双端配对保真度 自动处理 paired/unpaired 分离 需要额外参数 --pair-filter=both
运行速度 较慢(Java 启动开销) 快(纯 C 实现)
主要适用场景 常规 WGS/WES、RNA-seq 短片段、甲基化、接头复杂的项目

我的一般原则:WGS 或 RNA-seq 用 Trimmomatic,一步到位;接你手里如果有多个文库类型需要精细控制,可以考虑 cutadapt。其实没必要纠结,两个都装上,哪个顺手用哪个。

另一个重要提醒:预处理后一定要再跑一次 FastQC 确认效果。我曾经遇到一个案例,Trimmomatic 没识别到某批次试剂的特有 adapter,导致 5% 的 reads 残留接头,后续变异检测假阳性飙升。所以「质控 → 预处理 → 二次质控」这个闭环不能省。
NGS数据预处理流程(FastQC → Trimmomatic/cutadapt → 后质控) 原始 FASTQ 文件 FastQC 质量评估 质量合格? 保留原始 FASTQ Trimmomatic / cutadapt 处理后 FASTQ 第二次 FastQC TIP:预处理后务必重新跑 FastQC,确认 adapter 清除率和质量改善情况,避免隐藏错误