测序数据格式详解:FASTQ文件结构

说实话,拿到测序原始数据的第一眼,很多人都会被那一堆乱码似的字母吓到。我刚开始做RNA-seq时也是这样,总觉得这玩意儿跟天书似的。但说白了,FASTQ就是测序仪吐出来的"原始口供",里面既记录了每一条reads的碱基序列,也给出了每个碱基的测序质量——这两样东西,少了谁都不行。

FASTQ的"四行一首"结构

一个标准的FASTQ文件,每四条记录对应一条read。你拿任何文本编辑器打开看一眼,马上就能发现规律:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

看清楚了吗?第1行以@开头,是序列标识符(也叫read header);第2行是碱基序列;第3行是一个+号,有时后面会跟重复的标识符;第4行是质量得分字符串,每个字符对应第2行对应位置的碱基质量。

我个人习惯,一拿到FASTQ文件就先检查这四行是否完整。如果有空行或者行数不是4的倍数,大概率是文件传输损坏了。我在一个合作项目中遇到过这种情况,测序公司传过来的文件缺了最后一行,结果后续的比对直接报错,排查了好几天才发现是FASTQ结构不对。

标识符行的"暗号"

标识符行藏着很多信息。以Illumina为例,典型的header长这样:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG

冒号分隔的字段含义如下:

字段 含义
EAS139 仪器名称/编号
136 Run号
FC706VJ Flow cell ID
2 Lane编号
2104 Tile编号
15343 X坐标
197393 Y坐标
1:Y:18:ATCACG Pair成员(1或2)、是否通过过滤(Y/N)、索引号、barcode序列

这些东西看起来啰嗦,但做质控时特别有用。比如你可以根据Lane和Tile信息判断某个区域是不是存在系统性偏差。有一次我在做ChIP-seq时,发现某个tile的reads质量普遍偏低,后来发现是测序时那个区域出了气泡——这些信息都是从header里挖出来的。

碱基序列行:ATCG的世界

序列行很简单,就是A、T、C、G、N(N表示无法确定的碱基)组成的字符串。长度取决于测序读长,目前RNA-seq常见的是150bp或100bp双端。单端的话就一条序列,双端则每个片段前后各一条。

这里要提一个坑:某些早期的测序平台会使用.代替N。如果你从旧数据集里读到小数点,别以为是格式错误,那是另一套表示法。不过现在基本统一用N了。

质量得分行:读懂测序仪的"信心指数"

第4行是最容易被人忽略的,但它恰恰决定了后续分析的可信度。每个字符对应一个Phred质量得分(Q值),公式很简单:

Q = -10 × log10(P)

其中P是该碱基测序错误的概率。举个例子:Q=30表示错误概率为0.001(千分之一)。

质量字符和Q值的对应关系取决于编码方案。目前主流的是Phred+33编码,也叫Sanger编码:字符的ASCII码减去33就是Q值。比如字符!的ASCII码是33,对应Q=0;字符I的ASCII码是73,对应Q=40。你想想看,测序仪直接输出ASCII字符,就是为了节省空间——每个字符正好一个字节。

快速判断编码方案

拿到一个未知的FASTQ文件,先看质量字符的范围:

  • 如果字符主要在!到I之间(ASCII 33-73),就是Phred+33
  • 如果字符从@开始(ASCII 64),可能是Phred+64(老式Illumina格式)
  • 现在99%的情况是Phred+33,但不要完全信任,用工具检查一下最保险

质量值的"隐秘语言"

我建议你用肉眼扫一眼质量行,就能看出大致情况。好的数据质量行是一串I或F(Q值40左右),越到3'端字符会逐渐"掉下来"变成B、?甚至!——这说明测序质量随着读长增加而衰减,正常现象。如果整个质量行从第1个字符就偏低,那你得警惕了。

曾经我处理过一批肿瘤RNA-seq数据,质量行前面全是#和$(Q值10以下),当时觉得不对劲,一查记录发现是建库时接头污染导致测序仪"读偏了"。所以别光盯着序列看,质量行才是真正的诊断利器。

常见的FASTQ格式变种

编码方案 Q值范围 ASCII偏移量 典型字符
Sanger / Phred+33 0 – 40 33 ! " # $ % & ' ( ) * + , - . / 0-9 : ; < = > ? @ A-I
Solexa / Illumina 1.0 -5 – 40 64 ; < = > ? @ A-h
Illumina 1.3+ / Phred+64 0 – 40 64 @ A-B ... h
Illumina 1.5+ / Phred+64 2 – 40 64 B C D ... h
Illumina 1.8+ / Phred+33 0 – 41 33 ! " # ... J

核心要点

  • 当前绝大多数数据使用Phred+33(Sanger/Illumina 1.8+)
  • 如果质量字符范围异常(如包含大括号、竖线等),需要检查编码
  • 使用fastQValidator或seqtk fqchk可以自动判断编码

如何"一眼看穿"一个FASTQ文件

在实际项目中,我通常这样快速检查:

  1. 用head -n 20看了前几条记录
  2. 扫一眼标识符格式,确认测序平台
  3. 数一下质量字符的最低和最高ASCII码
  4. 用awk 'NR%4==0 {print length}' file.fastq | sort | uniq -c确认所有read长度一致
  5. 用wc -l除以4得到read总数

这些操作不需要任何生物信息学软件,一个终端加几个管道命令就能搞定。嗯,这里要注意:如果发现有些read长度不一致,可能是测序仪在末端提前终止了,这种数据在做比对前需要做trimming。

FASTQ文件内部结构一览

FASTQ 记录四行结构 @EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG ← 标识符行 CTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGC ← 序列行 + ← 分隔行 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ← 质量行 质量字符 → Q值转换(Phred+33) 字符 '!' (ASCII 33) → Q=0 错误概率≈1 字符 'I' (ASCII 73) → Q=40 错误概率≈0.0001 字符 '7' (ASCII 55) → Q=22 错误概率≈0.006 快速检查命令 head -n 20 sample.fastq 必检步骤

常见陷阱

  • 不要混淆FASTQ和FASTA:FASTQ有质量行,FASTA没有
  • 双端测序会产生两个FASTQ文件(R1和R2),两者的read顺序必须严格一致
  • 压缩格式通常是.fastq.gz,解压前用zcat或seqtk处理
  • 我曾经碰到过FASTQ文件被从Windows传到Linux时换行符变成\r\n,导致解析报错——先跑个dos2unix再干活

实战:用一行命令检查FASTQ质量概况

别急着写大脚本,先用seqtk看个概览:

# 安装seqtk(如果还没有)
conda install -c bioconda seqtk

# 查看质量统计
seqtk fqchk sample.fastq.gz

# 输出示例(截取关键行)
# min_len: 150    max_len: 150    avg_len: 150
# qual: 36.2      min_qual: 12    max_qual: 41
# base_N: 0.02%

平均质量在36以上(Q36对应错误概率0.00025),说明数据很干净。如果平均质量低于30,我建议你先把QC报告跑出来看看具体问题出在哪。

说到这个,我记得有一次帮同事看数据,平均质量显示29.5,但实际是编码判断错误——工具自动识别成了Phred+64,而真实数据是Phred+33。所以自己手动检查一下质量字符范围,永远比完全相信自动检测要靠谱。

总结:FASTQ文件就是你的"测序日志"

每一条记录都记录了测序仪当时对那个片段的"所见"和"信心"。做RNA-seq分析的起点,就是理解并验证这个结构。从标识符提取样本信息,从序列行读取生物学内容,从质量行判断数据可靠性——三者缺一不可。下次收到数据时,先把FASTQ的这四行结构刻在脑子里,后续的质量控制、比对、定量才不至于在第一步就翻车。