VEP基础用法:命令行参数、输入输出、常用选项

VEP 这东西,说白了就是给你的 VCF 文件做“基因注解”。你手里有一堆突变位点,但不知道这些位点在哪个基因上、影响什么转录本、是不是已知的致病位点——VEP 就是干这个的。

我个人习惯是先看它的输入输出,再一步步调参数。你想想看,连数据从哪进、往哪出都没搞明白,后面调啥都是白搭。

基本命令骨架

VEP 的运行命令,其实核心就那么几个参数。我拿个真实项目里的命令给你演示一下:

vep \
    --cache \
    --offline \
    --assembly GRCh38 \
    --input_file input.vcf \
    --output_file output_annotated.vcf \
    --vcf \
    --symbol \
    --terms SO \
    --variant_class

这行命令里,--input_file 和 --output_file 是必填的,一个指出你的原始 VCF 在哪,一个告诉 VEP 把结果写到哪里去。格式方面,输入可以是 VCF、BCF、VEP 自己的格式,甚至是 GFF 格式;输出默认是 VCF,但你也可以用 --tab 输出表格格式。

我刚开始学 VEP 时,默认的 VCF 输出看得我头晕。字段全挤在一起,根本不知道哪个是哪个。后来发现加上 --tab 选项,输出变成表格格式,每个注释字段一列,清晰多了。

常用选项详解

--assembly:指定参考基因组版本

这个选项可是个坑。VEP 默认会用 GRCh37,但很多新项目跑的已经是 GRCh38 了。你想想看,用了错误的 assembly,基因坐标对不上,出来的注释全是错的。

# 指定为 GRCh38
vep --assembly GRCh38 ...

# 你也可以用 GRCh37
vep --assembly GRCh37 ...
我曾经在项目中忘记指定 assembly,结果 VEP 默认用了 GRCh37,而我的数据是对齐到 GRCh38 的。最后注释出来的基因名全是错的,排查了半天才发现。所以每次跑 VEP 前,我第一件事就是检查 assembly。

--variant_class:告诉你怎么看突变类型

这个选项会输出突变类型,比如错义突变、同义突变、终止获得等等。它实际上调用的是 --check_existing 和 --check_allele 功能,但更直观一些。

--variant_class 的输出我一般会这么用:筛选出那些“有害”的突变类型,比如“stop_gained”、“frameshift_variant”,直接定位到关键位点。做疾病队列分析时特别有用。

选项 参数值 作用 我的经验
--assembly GRCh37 / GRCh38 指定参考基因组版本 先确认 fasta 文件的版本,否则坐标全错
--variant_class 无(开关选项) 输出 SO 描述的突变类型 筛选有害突变时必开
--symbol 无(开关选项) 输出基因的 HGNC 符号 默认输出 Ensembl ID,加上这个才看懂
--terms SO / NCBI 选择序列本体论术语体系 推荐用 SO,更符合研究习惯
--cache 无(开关选项) 使用本地缓存数据 联网跑太慢,离线缓存是必备

--cache 与 --offline:离线的艺术

VEP 默认是联网查询数据库的。但你想想看,跑一整个项目,几千个 VCF 文件,每次都去连 Ensembl 服务器——那速度简直能让你怀疑人生。

所以我强烈建议你设置本地缓存。先下载对应 assembly 的缓存文件:

# 下载 GRCh38 的 VEP 缓存
wget ftp://ftp.ensembl.org/pub/release-110/variation/indexed_vep_cache/homo_sapiens_vep_110_GRCh38.tar.gz

# 解压到 VEP 缓存目录
tar -xzf homo_sapiens_vep_110_GRCh38.tar.gz -C ~/.vep/

然后在命令行里加上 --cache 和 --offline:

vep \
    --cache \
    --offline \
    --dir_cache ~/.vep/ \
    --assembly GRCh38 \
    --input_file input.vcf \
    --output_file output_annotated.vcf \
    --vcf \
    --symbol \
    --terms SO \
    --variant_class

--fork:利用多核加速

VCF 文件大起来,几百万行那是常有的事。单线程跑,慢得你想哭。VEP 支持多线程并行,用 --fork 选项指定线程数:

vep --fork 8 ...

我一般会设成 CPU 核心数减 1,给系统留一个核心响应其他任务。但你也别贪心,设太多线程内存会爆掉。每个线程大概需要 1-2GB 内存,所以 8 线程差不多要 16GB 内存才稳。

记得在服务器上跑的时候,先看看 ulimit 和内存限制。我在一个 HPC 集群上设了 32 线程,结果内存不够直接 OOM kill 了。嗯,从那以后我就学乖了,先测个小文件试试资源消耗。

--output_format:VCF 还是表格?

默认输出是 VCF,但如果你想做下游分析,表格格式更友好。用 --tab 或者 --json:

# VCF 格式(默认)
vep --vcf ...

# 表格格式
vep --tab ...

# JSON 格式
vep --json ...

# 合并输出所有转录本的注释
vep --everything ...

我个人习惯先用表格格式看看结果,确认注释对了,再切回 VCF 格式用于下游工具。

核心工作流一图看懂

VEP 核心工作流 输入 VCF 文件 命令行参数解析 --assembly --variant_class --symbol --fork 本地缓存 (--cache) 在线查询 VEP 核心注释引擎 输出 VCF/Tab/JSON 建议:先 --tab 检查结果 再切 --vcf 用于下游 避坑:assembly 不一致 导致注释全错

常用选项速查表

我把工作中最常用的选项整理成了表格,方便你直接复制粘贴用:

类别 选项 典型值 说明
输入输出 --input_file input.vcf 输入 VCF/BCF 文件
--output_file output_annotated.vcf 输出注释文件
--vcf / --tab / --json --tab 选择输出格式
参考数据 --assembly GRCh38 基因组版本
--cache 无 使用本地缓存
--offline 无 离线模式
注释内容 --symbol 无 输出基因符号
--variant_class 无 输出突变分类
--terms SO 术语体系
--everything 无 输出所有可用注释
性能 --fork 4 或 8 并行线程数

几个实用的小技巧

  1. 先跑小文件测试:我习惯先拿一个只有几十行的 VCF 跑一遍,看看参数对不对。等确认没问题了,再全量跑。
  2. 用好 --dir_cache:缓存目录可以自定义,我一般放在项目目录下,这样不同项目可以用不同版本。
  3. 保存配置文件:把常用的参数写进一个脚本里,下次直接改输入输出文件就行,不用每次都敲一遍。
你想想看,项目越做越大,VCF 文件越来越多。用脚本管理参数配置,能省不少事。我现在的习惯是在项目根目录放一个 vep_config.sh,里面定义好所有参数,跑的时候直接 source 进去。

关于杂项参数

除了上面这些核心选项,VEP 还有一大筐可选参数。比如 --coding_only 可以只注释编码区变异,--minimal 可以精简输出。但我说实话,80% 的场景下你只需要我上面列的那几个。其他的等你遇到具体问题了再查文档也不迟。

我个人习惯是先跑一个不带任何附加参数的版本,看看基础注释。然后再根据需求逐步加选项,比如需要突变分类就加 --variant_class。这样不容易被一堆参数搞晕。

好了,VEP 的基础用法就这些。记住:assembly 对了吗?缓存下了吗?输出格式选好了吗?这三个问题搞定了,VEP 基本就跑得通了。剩下的就是选参数调优,那是后面章节会讲的内容。