1. 测序数据基础:FASTQ 格式与质量编码
做生信分析这么多年,我处理过的 FASTQ 文件少说也有几十 TB。但很多人一上来就写过滤脚本,结果数据越滤越少,才发现连格式都没搞对。这一章,我们就先把地基打牢。
1.1 四行结构:你不能只靠感觉
每个 FASTQ 文件记录一条测序序列,固定用四行表示。我刚开始干活时总记错换行符,后来被一个脏数据坑了一整晚,才老老实实背下来。
| 行号 | 标识符 | 内容 |
|---|---|---|
| 第1行 | @ | 序列标识符(含测序仪、坐标等信息) |
| 第2行 | (无) | 碱基序列(A/T/C/G/N) |
| 第3行 | + | 可选重复标识符(通常只写 +) |
| 第4行 | (无) | 质量字符串,长度与第2行一致 |
一个真实示例,你可以在任何测序数据目录里找到类似内容:
@EAS139:136:FC706VJ:2:2104:15343:197393
GTGCTGTGGTCTTATTTCCATTCTCAGTGTCAGTGACTGTGACTGTCAGTGACTGTCAG
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
需要注意,第4行的质量字符不能断行,长度必须严格等于第2行。我曾经遇到过一条 read 质量字符串少了一个字符,结果整个下游比对都报错——嗯,那个版本正好是 GATK 4.0,报错信息特别隐晦。
1.2 质量编码的进化史
Phred 质量分数用一个整数 Q 表示碱基的准确性。公式很简单:Q = -10 × log10(P),P 是错误概率。比如 Q=30 意味着错误率 0.1%,也就是每 1000 个碱基错 1 个。
但怎么把这个值存到文本里呢?不同测序平台用了不同的 ASCII 偏移量。我整理了一张表,建议你收藏:
| 编码名称 | ASCII 偏移 | 质量值范围 | 常见平台 |
|---|---|---|---|
| Sanger / Illumina 1.8+ | 33 | 0–40(常用 0–40) | Illumina HiSeq, NovaSeq, 公共数据库 |
| Solexa / Illumina 1.0 | 64 | −5–40(极少见) | 早期 GA |
| Illumina 1.3+ | 64 | 0–40 | GAII, MiSeq 早期 |
| Illumina 1.5+ | 64 | 3–40 | 部分遗留数据 |
| PacBio / ONT | 33 | 0–93(低频高值) | 三代测序平台 |
常见的坑:很多人以为质量字符 '!' 对应 Q=0,其实在 Sanger 编码里 '!' 是 ASCII 33,刚好对应 Q=0。而 'I'(ASCII 73)对应 Q=40。你写过滤脚本时,千万别把字符直接当数值用,一定要减去偏移量。
我个人习惯用 ord(char) - 33 来转 Sanger 编码。如果是历史数据,先跑个 fastq_quality_check 或者直接看字符分布——质量字符如果大量出现 '@' 和 'A'(ASCII 64 和 65),基本就是 Illumina 1.3+ 的旧编码。
1.3 为什么质量编码影响过滤效果?
你想想看,如果我们用错偏移量,读出来的质量分全部错位。比如原本 Q=30 的碱基,用 64 偏移解析,会被当成 Q=-31,直接过滤掉——这叫冤假错案。反之,低质量碱基被当作高质量保留,导致后续组装出大量假阳性突变。
我曾经接手过一个客户数据,他们用 old Illumina 1.5+ 格式存了两年,硬是拿 Sanger 编码往下跑。结果变异检测结果全是杂音,debug 花了整整三天。
下面这张图帮你理清 FASTQ 的结构与质量编码流程:
1.4 如何快速判断编码版本?
别纠结查文档。我教你一个土办法——看质量字符最小值。如果是 Sanger 编码,质量字符一般从 '!'(Q=0)到 'I'(Q=40)之间;如果是旧 Illumina 1.3+,最低字符会出现在 '@'(Q=0)附近。可以用下面这条命令快速扫描:
head -n 1000 sample.fastq | awk 'NR%4==0' | cut -c1-100 | perl -ne 'chomp; for $c (split //) { print ord($c)."\n" }' | sort -n | head -5
这个命令取前 1000 条 read 的质量字符串,提取每个字符的 ASCII 码,排序后看最小值。如果最小值在 33 附近,就是 Sanger 编码;如果在 64 附近,就是旧 Illumina 编码。
个人小技巧:处理公共数据库(NCBI SRA、ENA)下载的 FASTQ 时,直接按 Sanger 偏移 33 解析,因为现在所有公共库已统一为标准格式。但如果是从实验室本地拿到的数据,千万别信文件名里的所谓版本号——实际分析前先跑一遍上面的检测命令。
1.5 你还需要知道的几个硬规矩
- 字符串不能包含换行符——序列行和质量行都必须是单行。
- 如果标识符行以
@开头,但序列行里也出现@?别担心,只有行首的@才是标识符起点。 - 质量字符串的允许字符:从
!(ASCII 33)到~(ASCII 126),但实际常用范围更窄。 - GZIP 压缩的 FASTQ 不要直接解压后查看,用
zcat或less -S预览,否则大文件会炸内存。