1. FASTQ文件格式详解
做高通量测序的人,天天都在跟FASTQ打交道。但说实话,真正把这个格式吃透的人并不多。我第一次接触它的时候,就有个困惑——为什么短短几行文本,能承载那么多信息?今天咱们就把它彻底拆开看看。
1.1 四行结构,缺一不可
一个标准的FASTQ记录,固定占四行。少一行都不行,多一行算你错。我给你看个真实的例子:
@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTTGAAGGGCGCTTCGTGCCTGGGTGCTCGAGATGTTCCGTACTGACACA
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
来,一行一行说清楚:
- 第一行(@开头):序列标识符。@后面跟的是测序仪生成的唯一ID,包含仪器编号、flowcell位置、坐标这些信息。我习惯把它叫做“序列的身份证”。
- 第二行:碱基序列。就是A、T、C、G组成的DNA序列。偶尔还会看到N,表示这个位置测不出来。
- 第三行(+开头):分隔符。后面可以跟跟第一行相同的信息,也可以什么都不写。但我见过不少新手以为这行可有可无——可千万不能删。
- 第四行:质量序列。每个字符对应第二行每个碱基的质量值。字符越多、越“花哨”,说明质量越高。
我的习惯:拿到一个不认识的FASTQ文件,我第一件事就是看看第三行。如果它跟第一行一样长,说明是某些旧版软件生成的。不影响使用,但心里要有数。
1.2 Phred分数——质量的“温度计”
质量值怎么来的?其实是一个叫Phred的算法算出来的。原理不复杂,但很重要:
Q = -10 × log₁₀(P)
这里P是碱基出错的概率。举个例子:
- 如果Q=30,说明出错概率是千分之一。这个质量线,行业里叫“Q30门槛”。
- 如果Q=20,出错概率是百分之一。说实话,这个质量做下游分析就有点悬了。
- 如果Q=10,出错概率是10%。这种数据,我一般建议直接扔掉。
记住这个换算关系:
| Phred分数 | 错误概率 | 碱基准确率 |
|---|---|---|
| 10 | 1/10 | 90% |
| 20 | 1/100 | 99% |
| 30 | 1/1000 | 99.9% |
| 40 | 1/10000 | 99.99% |
1.3 ASCII编码——字符是怎么变成数字的
好,现在问题来了:FASTQ里存的是字符,不是数字。那怎么把Q值转成可见字符?
原理很简单:ASCII码 = Phred分数 + 偏移量
偏移量有两个主流值,这就是很多人踩坑的地方:
- Sanger/Illumina 1.8+:偏移量33,Q值范围0-41。这是现在的标准,大部分新数据都用这个。
- 旧版Illumina(1.3-1.7):偏移量64,Q值范围0-62。现在基本淘汰了,但老旧数据集里还能碰到。
举个具体的例子——Q=30:
- 用Sanger编码:30 + 33 = 63,对应ASCII字符
? - 用旧版编码:30 + 64 = 94,对应ASCII字符
^
我曾经接手过一个项目,合作方发来的FASTQ质量看起来“特别好”——满屏都是高分字符。结果发现他们还在用老版本的编码,而我用的软件默认解析Sanger格式。那一次我花了整整一天定位这个问题。后来我学乖了:拿到新数据,先用FastQC扫一眼,看看质量分数分布曲线的纵坐标范围,立刻就能判断编码类型。
1.4 实战小技巧
平时怎么判断编码类型?我这里有个快速判断法:
# 看看质量序列里有没有小写字母或数字
# Sanger编码:字符从 ! 开始,到 ~ 结束(33-126)
# 旧版编码:字符从 @ 开始,到 k 结束(64-107)
# 快速检测方法
if quality_string contains any digit or '@':
print("可能是旧版Illumina编码")
else if quality_string starts with '!':
print("可能是Sanger编码")
嗯,这里要注意:不要完全依赖自动检测工具。我见过一些工具把64偏移的数据误判成33偏移,导致后续所有质量过滤都白做了。
1.5 完整结构总结
最后,我把FASTQ的整个知识体系画成一张图,方便你理解:
这张图把FASTQ的核心链条串起来了:从四行结构出发,到Phred分数怎么计算,再到ASCII编码怎么映射。你想想看,只要搞明白这三层,FASTQ文件在你面前就没有秘密了。
一句话总结:FASTQ = 序列身份证 + 碱基序列 + 质量分数(用ASCII编码保存)。三个要素缺一不可,任何一个环节出问题,下游分析都是白搭。