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 number | 136 | 当前测序运行序号 |
| FlowCell ID | FC706VJ | 每个 FlowCell 唯一标识 |
| Lane | 2 | FlowCell 上的泳道编号 |
| Tile | 2104 | Tile 编号(测序时的一个小区域) |
| X 坐标 | 15343 | 簇在 Tile 内的 X 坐标 |
| Y 坐标 | 197393 | 簇在 Tile 内的 Y 坐标 |
| Pair 标志 | 1 | 1 表示 Read1,2 表示 Read2 |
| 过滤标志 | N | Y 表示通过过滤,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值 |
|---|---|---|---|
| ! | 33 | 0 | — |
| 0 | 48 | 15 | — |
| ? | 63 | 30 | — |
| I | 73 | 40 | 9 |
| `(反引号) | 96 | — | 32 |
| h | 104 | — | 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%,这种碱基基本不可信。嗯,这就是为什么要做质控——低质量区域的模型经常会出问题。
一个小技巧:有些工具会自动检测编码,比如 FastQC 会根据字符分布判断。但如果你自己写脚本,我建议始终用 Phred+33 作为输出标准,避免兼容性问题。
OK,这一章内容不算多,但都是后面每步操作的基础。记住:Read ID 藏着测序元数据,质量分数编码要分清楚 +33 和 +64,遇到异常字符要警惕。下节课我们开始动手检查这些质量分数。