VEP实战指南:从零到一完成SNP注释(生信)

VEP实战指南:从零到一完成SNP注释(生信)

1. 认识VEP:SNP注释的瑞士军刀

第一次接触VEP(Variant Effect Predictor)是在三年前的一个肿瘤基因组项目里。当时面对几百万个SNP位点,手动注释根本不可能完成。VEP就像一把精准的瑞士军刀,帮我快速理清了这些变异的功能影响。简单来说,它能告诉你某个SNP位于哪个基因、是否改变氨基酸、在人群中的频率如何,甚至预测致病性。举个例子,当你发现某个患者有BRCA1基因的突变,VEP能在秒级内告诉你这个突变是否会导致蛋白质截断——这对临床诊断至关重要。

VEP最厉害的地方在于它的多维度注释能力。它不仅标注基因区域(比如外显子/内含子),还能整合dbSNP、ClinVar等20多个数据库的信息。我常用它来做三重过滤:先筛编码区变异,再排除人群频率>1%的常见变异,最后保留预测有害的突变。去年分析一组癫痫病例时,用这个流程从30万个变异中快速锁定了5个候选位点。

2. 环境搭建:避坑指南

2.1 安装方式对比

新手最常问的问题就是:"该用conda还是docker?"我的经验是:

  • conda安装适合本地开发环境,但要注意版本匹配。曾经踩过坑:用conda默认安装的VEP 105版本,结果cache用了108的数据,直接报错退出。正确的姿势是:
conda create -n vep python=3.8 conda install -c bioconda ensembl-vep=108
  • docker方案更适合生产环境,尤其当需要多个物种数据库时。启动时记得挂载数据卷,否则每次都要重新下载cache:
docker run -v /local/cache:/opt/vep/.vep ensemblorg/ensembl-vep

2.2 数据库配置

cache文件下载是另一个容易翻车的环节。有次半夜跑数据分析,发现vep卡住不动——原来是忘了加--offline参数导致联网超时。推荐用wget断点续传下载(人类GRCh37的cache约25GB):

wget -c ftp://ftp.ensembl.org/pub/grch37/release-108/variation/indexed_vep_cache/homo_sapiens_vep_108_GRCh37.tar.gz

解压后目录结构应该是:

.vep/ └── homo_sapiens ├── 108_GRCh37 │ ├── transcript │ └── variation

3. 实战参数解析

3.1 基础命令模板

这是我优化过的标准分析命令,包含六个核心参数组:

vep -i input.vcf \ --dir_cache /path/to/cache \ --species homo_sapiens \ --assembly GRCh38 \ --offline \ --fork 8 \ --vcf \ --output_file annotated.vcf

关键参数说明:

  • --fork:并行线程数,实测8线程比单线程快6倍
  • --vcf:保持输入文件的格式一致性
  • --polyphen b可以添加致病性预测

3.2 高级过滤技巧

在肿瘤研究中,我常用这个组合拳:

  1. 先保留错义突变和终止增益:
    --filter "Consequence matches missense_variant or stop_gained"
  2. 再筛选MAF<0.01的低频变异:
    --af_gnomad < 0.01
  3. 最后叠加ClinVar致病性标注:
    --custom clinvar.vcf.gz,ClinVar,vcf,exact,0,CLNSIG

4. 结果解读实战

4.1 VCF输出详解

看一个实际注释结果:

#CHROM POS ID REF ALT QUAL FILTER INFO 1 12345 rs123 C T . . CSQ=T|missense|MODERATE|BRCA1|ENST00000357654|1/22|c.123C>T|p.Arg42Cys

各字段含义:

  • CSQ是VEP的标准输出字段
  • p.Arg42Cys表示第42位的精氨酸变为半胱氨酸
  • MODERATE代表功能影响程度

4.2 可视化技巧

用bcftools+gnuplot可以做简单的频率分布图:

bcftools query -f '%INFO/AF\n' annotated.vcf > af.txt gnuplot -e "set terminal png; plot 'af.txt' with boxes" > af_dist.png

对于临床报告,我习惯用这个Python脚本提取关键信息:

import vcf reader = vcf.Reader(open('annotated.vcf')) for record in reader: if 'PATHOGENIC' in record.INFO['CLNSIG']: print(f"{record.CHROM}:{record.POS} {record.INFO['CSQ'][0]}")

5. 性能优化经验

5.1 速度提升三招

  1. 预过滤输入文件:用bcftools先过滤质量值低的变异
    bcftools filter -i 'QUAL>20' input.vcf > filtered.vcf
  2. 使用SSD存储cache:机械硬盘读取速度会差3-5倍
  3. 合理设置fork数:建议不超过CPU核心数的80%

5.2 内存管理

大样本分析时容易OOM,有两个解决方案:

  • 分染色体处理:
    for chr in {1..22}; do vep -i chr${chr}.vcf --output_file chr${chr}_anno.vcf done
  • 添加内存限制参数:
    --buffer_size 5000 # 限制每批次处理变异数

6. 特殊场景处理

6.1 线粒体变异注释

线粒体基因组需要特殊处理:

--assembly GRCh37 \ --custom MITOMAP.vcf.gz,Mitomap,vcf,exact \ --plugin LoFtool

注意要指定MT染色体名而非"chrM"

6.2 癌症体细胞突变

需要额外加载COSMIC数据库:

--custom cosmic.vcf.gz,COSMIC,vcf,exact,0,CNT

并关注这些字段:

  • COSMIC_CNT:该突变在COSMIC中的出现次数
  • SOMATIC:是否被标注为体细胞突变

7. 常见报错解决

  1. Cache版本不匹配

    ERROR: Cache version does not match software version

    解决方法:重新下载对应版本的cache

  2. 内存不足

    Out of memory!

    加参数:--buffer_size 1000

  3. 转录本版本冲突

    No valid transcripts found

    检查--refseq--merged参数是否选对

8. 自动化脚本分享

最后分享我的自动化脚本模板:

#!/bin/bash # 自动注释流程 input=$1 species=${2:-homo_sapiens} vep -i $input \ --species $species \ --cache \ --offline \ --fork 12 \ --vcf \ --output_file ${input%.*}_annotated.vcf \ || { echo "Annotation failed"; exit 1; } # 提取致病突变 bcftools filter -i 'INFO/CLNSIG ~ "pathogenic"' \ ${input%.*}_annotated.vcf > pathogenic.vcf

把这个脚本保存为run_vep.sh后,只需要执行:

./run_vep.sh sample.vcf

就能一键完成从注释到致病突变筛选的全流程