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 官网或对应数据库官网下载最新版本。我个人习惯每季度检查一次数据源版本,确保注释结果反映的是当前最新的知识。

知识体系快速梳理

这一章的内容,我用一张图来帮你梳理核心脉络:

Funcotator 核心知识框架 输入:VCF 文件 数据源 (文件夹模式 / 文件模式) 参考基因组 (hg19/hg38) Funcotator 核心引擎 变体分类 → 功能预测 → 数据库整合 输出:注释后 VCF 含 INFO 字段 输出:MAF 格式 TCGA 兼容 输出:SEG 格式 GATK Segment 兼容 输出:TSV 表格格式 ⚠️ 关键注意事项 数据源版本需要手动更新 · 参考基因组必须匹配 · 注释不是质控