1. FASTQ 格式介绍:结构、质量分数编码与常见变体

聊FASTQ格式,我得先说说它的结构。这玩意儿说白了就是测序仪吐出来的原始数据格式,我们做质控的每一步都得跟它打交道。

核心印象:FASTQ 不是 FASTA 加个 Q。它是四行一组的文本格式,每一组代表一条测序读段(read)。

1.1 四行结构

我刚开始做生信那会儿,一直搞混FASTA和FASTQ。后来被老同事一句话点醒:FASTA有两行,FASTQ有四行。多出来的那两行,刚好就是质量信息。

每条read在FASTQ中固定占用四行:

  1. 标识行(以 @ 开头) —— 包含测序仪器、流动槽位置、坐标等信息
  2. 碱基序列行 —— A/T/C/G/N 组成的核苷酸序列
  3. 分隔行(以 + 开头) —— 通常只写一个 +,也可能重复标识信息
  4. 质量值行 —— 与碱基序列等长的ASCII字符,每个字符对应一个碱基的质量分数

你想想看,如果没有第四行,我们就只能知道测出了什么碱基,却不知道这个碱基可不可靠。这就像拿到一份实验报告,只有数据没有误差范围,谁敢信?

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTCAAGGTTGTTGCAAGACGGGAGGTGGTGTAGCTGTATTCAGCTGCGCAC
+
>>>>>ABABBBABBAABBAABBBBBAABBBAB>ABBBAABBBBBAABBBBB

这里要注意第四行和第一行的长度必须完全一致。空一个碱基都不行,多了也不行。我曾经在项目中遇到过测序仪软件bug,第四行比第二行短了几个字符,结果下游比对工具直接崩溃。嗯,这个问题排查了整整两天才找到原因。

行序 行首字符 内容说明 长度约束
第1行 @ 仪器标识 + 坐标 + 索引 可变
第2行 无 碱基序列 固定长度(读长)
第3行 + 分隔符,可附带标识 最少1个字符
第4行 无 质量序列(ASCII字符) 与第2行等长

1.2 质量分数编码方式

质量值这行,很多人误以为它是乱码。其实它是按一定规则编码后的数字。我刚刚入行时,看到第四行的">>>>>ABABBBAB..."也是一脸懵,还以为数据坏了呢。

每个ASCII字符对应一个Phred质量分数,公式是这样的:

Q = -10 × log₁₀(P)

其中:
  Q    = Phred质量分数
  P    = 碱基识别错误的概率

举个例子:如果某个碱基的Q值是30,表示错误概率P=0.001,也就是该碱基每1000次测序中可能错1次。准确率则是99.9%。

记忆小技巧:Q30 = 99.9%准确率,这是我做质控时最常盯着看的阈值。

但注意,质量分数存进FASTQ时,不能直接存数字20、30、40。得把数字映射成ASCII字符。映射方式有两种,这也是新手最容易犯错的地方:

  • Phred+33(Sanger格式):目前主流标准。质量分数 + 33 后转成ASCII字符。Q=0对应ASCII 33(即字符'!'),Q=30对应ASCII 63(字符'?')。
  • Phred+64(Illumina 1.3/1.5格式):早期Illumina仪器用的。质量分数 + 64。Q=0对应ASCII 64(字符'@'),Q=30对应ASCII 94(字符'^')。

我看过太多人把Phred+64的FASTQ当Phred+33去解析,结果算出的质量值全部多出31分。这会导致本该过滤掉的低质量数据被放行,后续组装、比对的质量直接崩盘。

避坑指南:拿到FASTQ文件,第一件事永远是用head看一眼质量值行首字符。如果出现'!'、'"'、'#'这些字符,大概率是Phred+33;如果出现大量'@'、'A'、'B',可能是Phred+64。我习惯用fastQC或者seqtk直接检测编码方式,省心得多。

1.3 常见FASTQ变体

FASTQ变体,说白了就是不同版本和不同厂商搞出来的小差异。主要有这几种:

1.3.1 根据质量编码区分

根据Sanger/Cock会议达成的社区标准,目前主流变体有:

变体名称 质量编码范围 对应ASCII 常见来源
Sanger 0 ~ 93 33 ~ 126 Illumina 1.8+、Sanger测序、PacBio
Solexa/Illumina 1.0 -5 ~ 62 59 ~ 126 早期Solexa仪器(现已不多见)
Illumina 1.3 0 ~ 62 64 ~ 126 Illumina Genome Analyzer II
Illumina 1.5 3 ~ 62 67 ~ 126 Illumina 1.5 pipeline产物
Illumina 1.8+ 0 ~ 41 33 ~ 74 最新Illumina仪器,即Sanger格式

你在实际项目中,如果碰到2015年以前的公共数据(比如NCBI SRA里那些老数据),很大概率是Phred+64。现在的仪器基本统一到Phred+33了。但我说的是基本,不是100%。

1.3.2 根据序列格式区分

除了质量编码,FASTQ还能按读段类型分类:

  1. 单端(Single-end,SE):每个测序片段只从一个方向读一次,文件里一条read只出现一次。
  2. 双端(Paired-end,PE):同一个片段的两端都测,产生两个文件(R1和R2)。同一个read的R1和R2通过标识行中的read编号关联。我个人习惯在做质控时把R1和R2分开跑QC,因为通常R2的质量比R1差一些。
  3. 索引(Indexed):在标识行中增加样本索引序列,用于多路复用(multiplexing)。索引有时单独记录在FASTQ标识行末尾。

1.3.3 压缩变体

FASTQ文件体积巨大。一条人类全基因组测序的FASTQ大概几十GB。所以大多数情况下你会看到这样的压缩后缀:

  • .fastq 或 .fq —— 纯文本
  • .fastq.gz 或 .fq.gz —— gzip压缩,最常见
  • .fastq.bz2 —— bzip2压缩,压缩率更高但解压慢
  • .fastq.lz4 —— LZ4压缩,解压速度快,适合管道处理

我一般只用.gz,因为几乎所有质控工具(fastp、Trimmomatic、fastQC)都原生支持gzip文件。你想想看,要是下个数据还得手动先解压再跑QC,那得多浪费时间。

1.4 本章知识体系

下面这张图是我整理FASTQ质控知识体系时的思路框架,把FASTQ格式的核心结构、质量编码和常见变体串在了一起。你拿着这个图去读任何FASTQ文件,都不容易跑偏。

FASTQ格式核心知识体系 FASTQ文件 四行结构 质量编码 常见变体 压缩格式 @ 标识行 仪器+坐标+索引 碱基序列行 + 分隔行 质量值行 ASCII编码的质量分数 Phred+33 (Sanger) Q = ASCII - 33 Phred+64 (Illumina 1.3+) Q = ASCII - 64 Q30 = 99.9% 准确率 单端 (Single-end) 双端 (Paired-end) 索引 (Indexed) .gz (gzip) .bz2 (bzip2) .lz4 质量编码辨别技巧 看质量行首字符范围:出现 '!\"#$%' → Phred+33;出现 '@AB' → Phred+64

一句话总结:FASTQ格式看起来简单,就四行,但质量编码的偏移量、压缩方式、双端配对文件的命名规则——任何一处搞错,质控结果都会跟着错。所以理解FASTQ本身,才是质控的第一步。