2 测序数据格式精讲:FASTQ、BAM、VCF/BCF

做GATK质控,说白了就是跟三种文件打交道:FASTQ、BAM、VCF。你想想看,从原始下机数据到最终变异结果,每一步都存在这些文件里。我刚开始接触这行的时候,也整天被这些格式搞晕。今天我就带你把它们掰开揉碎,看看里面到底装了啥。

2.1 FASTQ:最原始的“生数据”

FASTQ文件,可以看作测序仪吐出来的“毛坯房”。它里面存的是每一条读段(read)的碱基序列,以及对应的质量值。GATK的质控,就是从检查这些原始数据开始的。

2.1.1 文件结构:四行一个记录

每个FASTQ记录是固定的四行结构,我习惯叫它“四行打卡”:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTCAAGGTTGTTGCAAGACGGGAGGTAGGTGTAGCTGGG
+
>;>=;=?==?=?=?>=>?=?=?=?=?>=>?=?=?>=>?
  • 第1行(@开头):序列标识符,包含仪器ID、flowcell、lane、tile、X/Y坐标等位置信息。GATK在做标记重复(MarkDuplicates)时,就会解析这行的信息。
  • 第2行:碱基序列,就是A、T、C、G的组合。
  • 第3行(+开头):分隔符,后面可以再写一遍标识符(但通常省略)。
  • 第4行:质量值,用ASCII字符表示。每个字符对应第2行每个碱基的测序质量。
避坑指南:我曾经在项目中遇到过一条“脏数据”,第4行的质量值字符长度和第2行不一致。这在后续比对时直接报错。所以拿到FASTQ后,第一件事就是检查每行记录的行数和长度是否一致。

2.1.2 质量值的“数”与“符”

质量值核心是Phred质量分数(Q-score)。公式很简单:Q = -10 × log10(P),P是碱基测序错误的概率。

Q值错误概率碱基准确率
Q101/10(10%)90%
Q201/100(1%)99%
Q301/1000(0.1%)99.9%
Q401/10000(0.01%)99.99%

那ASCII字符又是怎么对应这些数字的呢?目前常用的是Sanger格式(Phred+33)。具体做法:

ASCII值 = Q值 + 33

例如:Q=30 → ASCII值=63 → 字符 '?'
      Q=20 → ASCII值=53 → 字符 '5'

所以,你看到FASTQ文件第4行里那些“HHHH”之类的字符,其实背后都是有数值含义的。GATK的BaseRecalibrator就是依据这些数值,来校正系统性的测序偏差。

重要经验:我在实践中发现,如果FASTQ文件中质量值全是“B”或“K”这类极端字符,说明测序质量很差或者格式编码选错了。记得用zcat或seqtk多看几条记录,确认质量值的中位数。

2.2 BAM:比对后的“集装箱”

FASTQ好比是散装零件,BAM就是把这些零件安装到参考基因组这个“地图”上之后的集装箱文件。我个人觉得,BAM才是GATK质控的主战场。

2.2.1 从SAM到BAM

SAM(Sequence Alignment/Map)是文本格式,BAM是它的二进制压缩版。说白了,BAM就是SAM的“打包快递”,读取更快,占空间更小。GATK所有核心工具都优先读写BAM。

一个BAM文件主要分两部分:

  • 头部(Header):以@开头,记录测序样本、参考基因组、比对参数等信息。
  • 比对记录(Records):每行一条比对结果,包含11个必填字段(列),用TAB分隔。

2.2.2 核心字段解读

我挑几个GATK经常用到的字段说说:

字段列序号说明GATK质控作用
QNAME1读段名称(与FASTQ第一行@后面的内容对应)用于分组、去重
FLAG2比对标志位(数字),指示读段是否比对、是否配对了等等过滤低质量/未比对读段
MAPQ5比对质量分数(类似Phred值,越高越可靠)GATK推荐MAPQ≥20
CIGAR6紧凑的比对描述,记录碱基匹配、插入、删除的情况区分真正变异与比对错误
SEQ10读段序列(与FASTQ中的序列一致)与参考基因组对比发现变异
QUAL11序列质量值(与FASTQ中的质量字符串相同)BaseRecalibrator使用
注意:FLAG字段别看是个数字,它其实是二进制位运算的结果。比如FLAG=83表示“read paired、read mapped in proper pair、mate reverse strand”。我曾经在处理BAM时,用samtools flags工具把FLAG值转换成文字说明,发现这个习惯帮我避了很多坑。

2.2.3 元数据查看

BAM的头部元数据里藏着很多信息,我建议你随时用samtools view -H查看:

@HD     VN:1.6  SO:coordinate
@SQ     SN:chr1 LN:248956422
@RG     ID:sample_01    PL:ILLUMINA    SM:NA12878
@PG     ID:bwa  PN:bwa  VN:0.7.17
  • @HD:格式版本、排序方式(coordinate或queryname)
  • @SQ:参考序列名称(SN)和长度(LN)
  • @RG:读组信息。这里面包含样本ID(SM)、文库(LB)、平台(PL)。GATK在做标记重复和BaseRecalibrator时,必须用到读组信息。如果没有RG标签,很多GATK工具会直接报错。
  • @PG:处理程序记录,记录每一步用到的工具和参数。
个人习惯:我每次拿到新BAM,都会先检查@RG标签是否完整。特别是SM字段,一定得跟后续分析中的样本名一致。不然GATK到VQSR阶段可能会因为读组混淆而出错。

2.3 VCF/BCF:最终的“变异清单”

VCF(Variant Call Format)是变异检测的终极输出。说白了,它就是一份列着所有变异位点的清单。BCF是它的二进制格式,读写更快。

2.3.1 文件结构

VCF也分两部分:元数据和数据体。

元数据行(以##开头):

##fileformat=VCFv4.2
##FILTER=
##INFO=
##FORMAT=
##contig=

数据体(以#CHROM开头为列名):

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  sample
chr1    12345   .       G       A       500.73  PASS    DP=100  GT:DP:GQ:AD  0/1:50:99:25,25
chr1    23456   rs12345 T       C       999.90  PASS    DP=200  GT:DP:GQ:AD  1/1:100:99:10,90

2.3.2 核心字段解读

字段说明
CHROM & POS染色体及位置(1-based)
ID变异标识,通常是dbSNP编号(如rs12345)
REF & ALT参考等位基因和替代等位基因
QUALPhred-scaled质量值,表示该变异是真实而非错误的概率
FILTER过滤状态。PASS表示通过所有过滤器;其他值表示被特定过滤器标记为低质量
INFO逗号分隔的字段-值对,如深度(DP)、等位基因频率(AF)等
FORMAT每个样本的字段格式定义
样本列按FORMAT定义的顺序,存放每个样本的具体信息

2.3.3 FORMAT字段详解

FORMAT字段里最关键的几个:

  • GT(基因型):0表示参考等位基因,1表示第一个ALT等位基因,以此类推。例如“0/1”表示杂合,“1/1”表示纯合变异。
  • DP(深度):该位点覆盖的读段总数。
  • GQ(基因型质量):Phred-scaled质量,表示该基因型判断的可信度。
  • AD(等位基因深度):支持REF和每个ALT的读段数。比如“25,25”说明REF和ALT各有25条读段支持。
避坑经验:我曾经在项目中看到一个VCF,全文件都是“GT=./.”的缺失基因型。查了半天才发现,是因为BAM中读组信息配错了,导致HaplotypeCaller根本无法正确统计每个样本的深度。所以拿到VCF后,先统计缺失率的分布,这个习惯救了我好几次。

2.4 三种格式的“数据流”关系

最后,我用一张SVG图来展示这三种格式在GATK质控流程中是如何串联起来的:

FASTQ、BAM、VCF/BCF在GATK质控流程中的关系 三种测序数据格式在GATK质控流程中的关系 FASTQ 原始测序数据 比对(BWA) BAM 比对后的“集装箱” 变异检测(HaplotypeCaller) VCF/BCF 变异清单 质量分布检查 标记重复+BaseRecalibrator VQSR+过滤 说明:在GATK流程中,FASTQ的初始质量决定了后续分析的上限;BAM阶段的质控(去重、重校准)最耗时但影响最大;VCF阶段的过滤(VQSR)决定了最终变异集的准确性。