输入文件格式: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
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) |
| 查询速度 | 慢(需顺序扫描) | 快(按索引随机访问) |
| 推荐场景 | 小规模、交换、手动检查 | 大规模分析流程内部存储 |
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、BCF还是GVCF,它们都共用这个“头+列头+数据行”的骨架。差别只在于GVCF的数据行更多更密,BCF只是把同样的信息用二进制打包。做Pipeline时,理解这一点就够了。