FASTQ 格式详解:质量分数编码、Read ID 含义、碱基质量分数解读

大家好,我是老张。这章我们聊聊 FASTQ 这个最基础的格式。说实话,很多人跑完测序拿到文件就急着往下走,结果后面质控出问题回头一查,才发现连 Read ID 都没看明白。嗯,咱们今天就把 FASTQ 的里里外外讲清楚。

FASTQ 文件长什么样?

一条 FASTQ 记录固定四行。我见过不少新手对着文件发愣,其实结构非常简单:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:N:18:1
ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
  • 第1行:以 @ 开头,后面是 Read ID 和可选描述。
  • 第2行:碱基序列(A/C/G/T/N)。
  • 第3行:以 + 开头,通常可以重复 ID 或留空。
  • 第4行:质量分数,每个字符对应一个碱基的质量编码。

我的习惯:拿到 FASTQ 后先用 head -n 8 看一眼,确认是标准的四行结构。有些旧版本可能在第3行加了额外描述,但大部分现代工具都能兼容。

Read ID 的秘密

Read ID 可不是随便取的字符串。它包含了测序时的关键信息。以 Illumina 的典型格式为例:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:N:18:1
字段内容说明
仪器名EAS139测序仪型号或编号
Run number136当前测序运行序号
FlowCell IDFC706VJ每个 FlowCell 唯一标识
Lane2FlowCell 上的泳道编号
Tile2104Tile 编号(测序时的一个小区域)
X 坐标15343簇在 Tile 内的 X 坐标
Y 坐标197393簇在 Tile 内的 Y 坐标
Pair 标志11 表示 Read1,2 表示 Read2
过滤标志NY 表示通过过滤,N 表示未通过
控制位18通常为 0 或数字,表示控制碱基
Index 序列1样本 Multiplexing 索引号

我曾经踩过的坑:有一次批量处理公共数据,把不同 lane 的 reads 混在一起没注意,结果比对率异常低。后来发现 Read ID 中的 Lane 信息可以用来拆分——别小看这个冒号和数字。

碱基质量分数到底是什么?

说白了,质量分数用 ASCII 字符表示,每个字符对应一个 Phred 分数:

Q = -10 × log₁₀(P)

其中 P 是碱基识别错误的概率。Q 值越高,碱基越可靠。

最常见的编码方案有两种:

  • Phred+33(Sanger):当前主流,ASCII 字符从 33 开始,对应 Q=0。比如 '!' 是 Q0,'I' 是 Q40。
  • Phred+64(Illumina 1.3+):旧版,ASCII 偏移 64。比如 '@' 是 Q0,'h' 是 Q40。

你可以用下面这个小表快速对照:

ASCII 字符十进制值Phred+33 Q值Phred+64 Q值
!330—
04815—
?6330—
I73409
`(反引号)96—32
h104—40

你想想看,如果看到质量行出现 '@' 或 '`' 之类的字符,大概率是 Phred+64 编码。现在大多数新数据都用 Phred+33,但老数据集尤其是 HiSeq 早期数据,偶尔还会碰到 +64。

判断方法:取质量行的前几个字符,看最小 ASCII 值。如果最小 ≥ 64,是 Phred+64;如果最小在 33~63 之间,是 Phred+33。我一般用 awk '{if(NR%4==0) print}' fastq | head -c 100 | od -An -tuC 看一眼。

实例:手把手解析一条记录

咱们拿上面那个例子,第2行是序列,第4行是 IIIIIIII...。'I' 的 ASCII 是 73,如果采用 Phred+33,则 Q = 73 - 33 = 40。意思是这条 reads 的碱基错误概率大约为 10⁻⁴,非常可靠。

反过来,如果有字符 '#'(ASCII 35),Q = 35 - 33 = 2,错误概率约 63%,这种碱基基本不可信。嗯,这就是为什么要做质控——低质量区域的模型经常会出问题。

FASTQ 记录结构 & 质量分数编码 @EAS139:136:FC706VJ:2:2104:15343:197393 1:N:18:1 Read ID 行 ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT 序列行 + 分隔行 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 质量分数行 质量分数转换 字符 'I' → ASCII 73 → Phred+33: Q = 73 - 33 = 40 字符 '#' → ASCII 35 → Phred+33: Q = 35 - 33 = 2 注意: 当质量字符 < '@' (64) 时,一定是 Phred+33 每个字符对应一个碱基质量

一个小技巧:有些工具会自动检测编码,比如 FastQC 会根据字符分布判断。但如果你自己写脚本,我建议始终用 Phred+33 作为输出标准,避免兼容性问题。

OK,这一章内容不算多,但都是后面每步操作的基础。记住:Read ID 藏着测序元数据,质量分数编码要分清楚 +33 和 +64,遇到异常字符要警惕。下节课我们开始动手检查这些质量分数。