输入文件格式:VCF、BCF、GVCF 详解

做变异解读Pipeline,首先得搞定输入文件。说白了,VCF就是行内标准,BCF是它的二进制小老弟,GVCF则是群体分析专属。我刚开始接触时也被这三个东西绕晕过,今天一次讲透。

VCF:那个大家都认识的文本格式

VCF(Variant Call Format)本质就是个制表符分隔的文本文件,但里面结构化得很好。版本现在主流是VCF v4.2,绝大多数工具都兼容。你打开一个VCF文件,第一眼看到的是以 ## 开头的元信息行,接着是一行带 #CHROM 的列头,再往下才是真正的变异记录。

我记得有一次分析单样本WGS,VCF文件直接飙到好几个GB。别慌,文本文件虽然可读性好,但大起来真受不了。所以实际生产环境里,我习惯直接上BCF。

##fileformat=VCFv4.2
##source=GATK
##contig=
##INFO=
#CHROM  POS  ID  REF  ALT  QUAL  FILTER  INFO  FORMAT  NA12878
chr1    12345  .  A  G  600.5  PASS  DP=100  GT:AD:DP  0/1:50,50:100
小经验:VCF里 FILTER 列如果全是PASS,不代表数据绝对干净,只是表明通过了你设定的硬阈值。真正要小心的是INFO里的QD、FS这些质量指标。

BCF:二进制版VCF,量级飞跃

BCF(Binary Call Format)是对VCF的二进制压缩+索引封装。文件体积能缩小3~5倍,加载和查询速度却快一个数量级。为什么?因为BCF用BGZF压缩,而且自带CSI或者TBI索引,你想看某个区域的变异,不用扫全文件。

我自己做Pipeline配置时,中间环节一律用BCF,仅在最终交付时转回VCF给别人看。你想想看,每天几千个样本的联合基因分型,要是都存文本,硬盘先扛不住。

特性 VCF BCF
格式 纯文本 二进制(BGZF)
可读性 高,可cat查看 低,需专用工具(bcftools view)
文件大小 大(通常≈原始压缩文本) 小(通常为VCF的1/3)
查询速度 慢(需顺序扫描) 快(按索引随机访问)
推荐场景 小规模、交换、手动检查 大规模分析流程内部存储
注意:BCF的版本需要和bcftools匹配。我曾经在一次升级bcftools后,老版本的BCF读不出来,报“unsupported major version”。所以版本兼容性得提前确认,别快跑完了才发现读不了。

GVCF:群体分析的利器

GVCF(Genomic VCF)简单说就是VCF的变种,它不只在变异位点记录信息,更在整个基因组上逐位置列出“证据”。每个位置都有GT、DP、AD这些数据,即使没有变异,也会用 ./. 占位。这样做的目的,是方便群体联合基因分型时统一重做基因型赋值。

我在做WES家系分析时也用过GVCF。当时需要同时分析三口之家,直接合并三个GVCF文件,再调用GATK GenotypeGVCFs,出来的结果比单独call每个样本后再合并准确得多。说白了,GVCF保留了原始测序深度信息,联合分型时能更精确地区分“纯合参考”与“缺失数据”。

# 典型的GVCF记录(非变异位点)
##GVCFBlock=...
#CHROM  POS  ID  REF  ALT  QUAL  FILTER  INFO  FORMAT  sample1
chr1    100  .  A  .  .  .  .  GT:DP:AD  ./.  .  .

实际项目中,GVCF文件大小是普通VCF的3~5倍,全基因组单样本GVCF经常 50~100 GB。这时候你不可能用文本格式——必须转BCF。所以流程里我推荐先把GVCF转BCF并建立索引,后续所有操作全在二进制层面跑。

避坑指南:格式转换与头文件玄学

我曾经在一条Pipeline里卡了三天,最后发现是因为VCF头里的contig定义不全。bcftools转换或合并时,如果contig不在头里,会直接报错跳过,导致最终文件少了一堆位点。切记:头文件元信息是VCF/BCF/GVCF的骨架,任何操作前先用 bcftools head 看一眼。

# 查看VCF头
bcftools head input.vcf.gz | less

# 将VCF转为BCF(自动带压缩和索引)
bcftools view -O b -o output.bcf input.vcf.gz

# 从BCF转回VCF
bcftools view -O v -o output.vcf output.bcf
我的惯用原则:
  • 原始数据尽量保持VCF.gz(兼容性好)
  • 流程中间环节全用BCF(索引、速度、空间)
  • 群体分析启用GVCF→BCF路线,最终输出VCF.gz
  • 每次格式转换后,用 bcftools index -s 检查索引行数
VCF 文件结构示意 元信息行 (## 开头) 列头行 (#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 样本名) 变异行1: chr1 12345 . A G 600.5 PASS DP=100 GT:AD:DP 0/1:50:100 变异行2: chr1 23456 . CT C 800 PASS QD=20 GT:AD 1/1 0:100 关键点 • 元信息行包含格式版本、参考基因组、过滤阈值等 • 列头固定8个必选列(CHROM~FORMAT),之后是样本列 • GVCF会在所有基因组位置(包括非变异位点)写入记录 • BCF是二进制版,结构相同但存储效率更高

看到这个结构图你就明白了:无论是VCF、BCF还是GVCF,它们都共用这个“头+列头+数据行”的骨架。差别只在于GVCF的数据行更多更密,BCF只是把同样的信息用二进制打包。做Pipeline时,理解这一点就够了。