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 输出表格格式。
--tab 选项,输出变成表格格式,每个注释字段一列,清晰多了。
常用选项详解
--assembly:指定参考基因组版本
这个选项可是个坑。VEP 默认会用 GRCh37,但很多新项目跑的已经是 GRCh38 了。你想想看,用了错误的 assembly,基因坐标对不上,出来的注释全是错的。
# 指定为 GRCh38
vep --assembly GRCh38 ...
# 你也可以用 GRCh37
vep --assembly GRCh37 ...
--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 内存才稳。
--output_format:VCF 还是表格?
默认输出是 VCF,但如果你想做下游分析,表格格式更友好。用 --tab 或者 --json:
# VCF 格式(默认)
vep --vcf ...
# 表格格式
vep --tab ...
# JSON 格式
vep --json ...
# 合并输出所有转录本的注释
vep --everything ...
我个人习惯先用表格格式看看结果,确认注释对了,再切回 VCF 格式用于下游工具。
核心工作流一图看懂
常用选项速查表
我把工作中最常用的选项整理成了表格,方便你直接复制粘贴用:
| 类别 | 选项 | 典型值 | 说明 |
|---|---|---|---|
| 输入输出 | --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 | 并行线程数 |
几个实用的小技巧
- 先跑小文件测试:我习惯先拿一个只有几十行的 VCF 跑一遍,看看参数对不对。等确认没问题了,再全量跑。
- 用好 --dir_cache:缓存目录可以自定义,我一般放在项目目录下,这样不同项目可以用不同版本。
- 保存配置文件:把常用的参数写进一个脚本里,下次直接改输入输出文件就行,不用每次都敲一遍。
vep_config.sh,里面定义好所有参数,跑的时候直接 source 进去。
关于杂项参数
除了上面这些核心选项,VEP 还有一大筐可选参数。比如 --coding_only 可以只注释编码区变异,--minimal 可以精简输出。但我说实话,80% 的场景下你只需要我上面列的那几个。其他的等你遇到具体问题了再查文档也不迟。
--variant_class。这样不容易被一堆参数搞晕。
好了,VEP 的基础用法就这些。记住:assembly 对了吗?缓存下了吗?输出格式选好了吗?这三个问题搞定了,VEP 基本就跑得通了。剩下的就是选参数调优,那是后面章节会讲的内容。