Funcotator 概览:它到底是什么?
我第一次接触 Funcotator 时,心里也犯过嘀咕:这不就是个注释工具吗?GATK 里工具那么多,为什么单独给 Funcotator 开一章?后来在项目里踩过坑才明白——注释这件事,远不止“把数据库里的信息贴上去”那么简单。
Funcotator,全称是 FUNctional COmmenTATOR。说白了,它就是个变体注释引擎。你给它一个 VCF 文件——里面全是位点、基因型、等位基因频率这些东西——它帮你把这些枯燥的坐标翻译成生物学含义:这个突变落在哪个基因上?是错义还是同义?会不会影响蛋白功能?
核心功能:三件事
我个人习惯把 Funcotator 的核心功能归纳为三块:
- 变体分类:告诉你每个位点的变异类型。SNP、插入、缺失、多核甘酸替换……这些分类不是简单看 VCF 里的 ALT 字段就行,得结合参考序列和转录本结构才能准确判断。
- 功能预测:这个变体会不会改变蛋白序列?影响哪个转录本?落在内含子还是外显子?我记得有一次注释一批肿瘤样本,Funcotator 把一批内含子区的深度突变标注为“可能影响剪接”,后来实验验证确实如此——这个信息临床上太关键了。
- 数据库整合:把 dbSNP、gnomAD、ClinVar、COSMIC 这些公共数据库的条目对应到你样本的每个位点上。有意思的是,我见过好几个团队自己写脚本来做这件事,最后发现 Funcotator 内置的逻辑和查重策略比手写脚本稳健得多。
一句话总结:Funcotator 解决的是“这个突变到底有什么生物学意义”这个问题。它不生产数据,但让数据变得可解读。
在 GATK 工具链里的定位
GATK 工具链从原始测序数据到可解读的变异列表,通常走这么几步:先做 BQSR 和质量过滤,再用 HaplotypeCaller 或 Mutect2 做变异检出,接着用 VQSR 或硬过滤做质控,最后才是注释。Funcotator 就站在这个流程的末端。
你想想看,流程里大多数工具都在做“统计”和“过滤”——判断这个位点是不是真的变异、质量够不够高。Funcotator 做的却是“翻译”和“增强”的工作。它不判断这个位点是不是真的存在(那是上游的事),而是告诉你:如果这个位点存在,它意味着什么。
| 流程阶段 | 工具举例 | 核心任务 |
|---|---|---|
| 数据预处理 | BQSR、MarkDuplicates | 去除噪声、校准碱基质量 |
| 变异检出 | HaplotypeCaller、Mutect2 | 从比对结果中识别变异位点 |
| 质控过滤 | VQSR、VariantFiltration | 区分真实变异与测序/比对假阳性 |
| 注释增强 | Funcotator | 赋予变异生物学/临床意义 |
我曾经遇到过一个团队,他们用 Mutect2 检出了一堆体细胞突变,直接拿去给临床团队看。结果被问得哑口无言:“这个位点是已知的 driver 吗?有没有临床药物关联?”——这正是缺乏注释这一步的后果。后来他们加上 Funcotator 跑了一遍,十几个之前被认为“可能重要”的位点,实际在 ClinVar 里已经被标注为良性,避免了不必要的验证实验。
注意:Funcotator 不是变异检出的替代工具,也不是质控工具。它依赖上游传递的 VCF 数据质量。如果上游的假阳性率高,注释再丰富也是垃圾进垃圾出。这个顺序千万不能搞反。
数据源结构
Funcotator 的数据源是它最容易被低估的部分。很多人以为注释就是把几个数据库文件扔进去就跑,结果运行时遇到“DataSource error: missing required field”这种错误,才发现数据源格式有严格约定。
Funcotator 支持两种数据源格式:
- 文件夹模式(推荐):每个数据源一个独立文件夹,内含配置文件和原始数据。我一般用这个模式,因为容易管理和复用。
- 单项文件模式:数据源直接是一个 VCF、BED 或 GTF 文件。适合快速测试,但生产环境里不够灵活。
每个数据源文件夹下必须有一个 funcotator_dataSources.txt 配置文件,写法像这样:
name = gnomAD_exome
version = v3.1.2
src_header = CHROM POS ID REF ALT AF AN AC
src_file = gnomad.exomes.r2.1.1.sites.liftover.b38.vcf.gz
origin = https://gnomad.broadinstitute.org
preprocessing_script = download_gnomAD.sh
嗯,这里要注意一个坑:src_header 的顺序必须跟 src_file 里的列顺序完全一致,少一列多一列都会导致解析失败。我曾经就是复制粘贴时漏了一个空格,排查了整整一下午才找到问题。
一行命令跑起来
Funcotator 的运行方式很直接,基本命令长这样:
gatk Funcotator \
--variant input.vcf \
--reference reference.fasta \
--ref-version hg38 \
--data-sources-path /path/to/data_sources/ \
--output output.vcf \
--output-file-format VCF
这里 --ref-version 参数我建议每次都显式声明。默认值虽然是 hg19,但你想想看,如果你用的是 hg38 参考基因组却忘记改这个参数,Funcotator 会按照 hg19 的转录本结构来做注释——染色体名称、基因坐标全对不上,结果就是一塌糊涂。
一个小技巧:第一次跑的时候加上 --verbosity DEBUG,Funcotator 会把每个步骤的解析日志打出来。看到 Parsing datasource [gnomAD_exome] ... completed. 这样的输出,就说明数据源加载成功了。我第一次跑的时候遇到“incompatible datasource”,全靠 DEBUG 日志定位到是版本号写错了。
为什么你该关心数据源版本
我见过最离谱的问题,是一个团队用了 2020 年下载的 ClinVar 数据源,注释出来一个位点在 ClinVar 里标注为“意义未明”。但实际上 ClinVar 2023 年底已经把这个位点更新为“致病性”了。这事在临床报告里差别太大了。
Funcotator 本身不会帮你自动更新数据源。你得自己去 Broad 官网或对应数据库官网下载最新版本。我个人习惯每季度检查一次数据源版本,确保注释结果反映的是当前最新的知识。
知识体系快速梳理
这一章的内容,我用一张图来帮你梳理核心脉络: