Skip to main content

VEP Yielding Performant Results — Python interface for Ensembl VEP annotation in Rust

Project description

vepyr

vepyr (/ˈvaɪpər/) — VEP Yielding Performant Results — a blazing-fast Rust reimplementation of Ensembl's Variant Effect Predictor.

logo.png

Setup with uv

  1. Install uv.
curl -LsSf https://astral.sh/uv/install.sh | sh
  1. Clone the repository and enter it.
git clone git@github.com:biodatageeks/vepyr.git
cd vepyr
  1. Sync dependencies and build the package in place.
RUSTFLAGS="-C target-cpu=native" uv sync --reinstall-package vepyr
  1. Run Python commands inside the managed environment.
uv run python -c "import vepyr; print(vepyr.__all__)"
  1. Run the test suite.
uv run pytest

Quick start

The repository ships with small test fixtures so you can verify the full pipeline — build, annotate with indexed Parquet, and write VCF output — without downloading any external data.

1. Build a cache from a local Ensembl VEP cache directory

tests/data/ensembl_cache contains a tiny slice of the Ensembl VEP 115 offline cache (chr22). Convert it to the default indexed Parquet cache:

import vepyr

results = vepyr.build_cache(
    release=115,
    cache_dir="/tmp/vepyr_cache",
    cache_type="ensembl",
    local_cache="tests/data/ensembl_cache",  # skip download
)
for path, rows in results:
    print(f"{path}: {rows:,} rows")

2a. Annotate variants

A small 5-variant VCF for chr22 ships with the cache fixture:

import vepyr

cache_dir = "/tmp/vepyr_cache/115_GRCh38_ensembl"

lf = vepyr.annotate(
    vcf="tests/data/ensembl_cache/sample.vcf",
    cache_dir=cache_dir,
    check_existing=True,
    af=True,
    af_gnomadg=True,
    max_af=True,
)

df = lf.collect()
print(df.select("chrom", "start", "ref", "alt", "most_severe_consequence").head())

workers controls how many within-contig annotation pipelines run concurrently. workers=1 is the serial path; workers > 1 requires a tabix-indexed (bgzip + .tbi) input VCF.

df = vepyr.annotate(
    "input.vcf.gz",
    cache_dir,
    workers=4,
).collect()

build_cache() writes variation as chrN_warm.parquet and chrN_cold.parquet files, plus cold-position and variant-bloom indexes. Re-running build_cache() is idempotent by default; pass overwrite=True to rebuild existing cache outputs.

out = vepyr.annotate(
    "input.vcf.gz",
    cache_dir,
    workers=8,
    output_vcf="annotated.vcf",
)

2b. Write annotated VCF output

Instead of a LazyFrame, write results directly to a VCF file with CSQ in the INFO column — use .vcf.gz for bgzf compression or .vcf for plain text:

out_path = vepyr.annotate(
    vcf="tests/data/ensembl_cache/sample.vcf",
    cache_dir=cache_dir,
    check_existing=True,
    af=True,
    af_gnomadg=True,
    max_af=True,
    output_vcf="/tmp/annotated.vcf",  # or .vcf.gz for bgzf
)
print(f"Wrote annotated VCF to {out_path}")

3. Full --everything annotation (golden test data)

tests/data/golden has a pre-built chr1 cache, a 100-variant VCF, and a matching reference FASTA. Run a full --everything annotation:

import vepyr

lf = vepyr.annotate(
    vcf="tests/data/golden/input.vcf.gz",
    cache_dir="tests/data/golden/cache",
    everything=True,
    reference_fasta="tests/data/golden/reference.fa",
)

df = lf.collect()
print(f"{df.height} variants × {df.width} columns")
print(df.select("chrom", "start", "ref", "alt",
                "most_severe_consequence", "SYMBOL", "IMPACT").head(5))

Documentation

Build and serve the docs locally:

uv sync --extra docs
uv run mkdocs serve

Then open http://127.0.0.1:8000. Docs are auto-deployed to GitHub Pages on each tag push.

One-liner smoke test

Exercises cache build, indexed Parquet annotation, and VCF output:

uv run python -c "
import vepyr, tempfile, os
with tempfile.TemporaryDirectory() as d:
    r = vepyr.build_cache(115, d, cache_type='ensembl', local_cache='tests/data/ensembl_cache', show_progress=False)
    cache = os.path.join(d, '115_GRCh38_ensembl')
    print(f'build_cache : {len(r)} parquet files, {sum(n for _,n in r):,} rows')
    vcf = 'tests/data/ensembl_cache/sample.vcf'
    df1 = vepyr.annotate(vcf, cache, check_existing=True, af=True, max_af=True).collect()
    print(f'indexed     : {df1.height} variants × {df1.width} columns')
    out = os.path.join(d, 'annotated.vcf')
    vepyr.annotate(vcf, cache, check_existing=True, af=True, max_af=True, output_vcf=out, show_progress=False)
    print(f'vcf output  : {os.path.getsize(out):,} bytes')
    assert os.path.getsize(out) > 0, 'empty VCF'
lf = vepyr.annotate('tests/data/golden/input.vcf.gz', 'tests/data/golden/cache', everything=True, reference_fasta='tests/data/golden/reference.fa')
df = lf.collect()
print(f'everything  : {df.height} variants × {df.width} columns')
assert df.height > 0 and df.width > 80, 'smoke test failed'
print('smoke test passed')
"
Source Added fields Count
VCF CSQ fixed base fields Allele, Consequence, IMPACT, SYMBOL, Gene, etc. 18
--everything --hgvs flag-derived fields, de-duplicated against VCF base includes frequency, MANE, UniProt, HGVS offset, regulatory, etc. 59
VEP option-set implication: frequency/pubmed flags enable check_existing CLIN_SIG, SOMATIC, PHENO 3
--merged REFSEQ_MATCH, SOURCE, REFSEQ_OFFSET 3
--flag_pick_allele_gene PICK 1
BAM-edited cache auto-enables --use_transcript_ref + bam_edited GIVEN_REF, USED_REF, BAM_EDIT 3
Total 87
# Field Breakdown bucket
1 Allele VCF CSQ fixed base
2 Consequence VCF CSQ fixed base
3 IMPACT VCF CSQ fixed base
4 SYMBOL VCF CSQ fixed base
5 Gene VCF CSQ fixed base
6 Feature_type VCF CSQ fixed base
7 Feature VCF CSQ fixed base
8 BIOTYPE VCF CSQ fixed base
9 EXON VCF CSQ fixed base
10 INTRON VCF CSQ fixed base
11 HGVSc VCF CSQ fixed base
12 HGVSp VCF CSQ fixed base
13 cDNA_position VCF CSQ fixed base
14 CDS_position VCF CSQ fixed base
15 Protein_position VCF CSQ fixed base
16 Amino_acids VCF CSQ fixed base
17 Codons VCF CSQ fixed base
18 Existing_variation VCF CSQ fixed base
19 DISTANCE Default / --everything flag-derived
20 STRAND Default / --everything flag-derived
21 FLAGS Default / --everything flag-derived
22 PICK --flag_pick_allele_gene
23 VARIANT_CLASS --everything
24 SYMBOL_SOURCE --everything
25 HGNC_ID --everything
26 CANONICAL --everything
27 MANE --everything
28 MANE_SELECT --everything
29 MANE_PLUS_CLINICAL --everything
30 TSL --everything
31 APPRIS --everything
32 CCDS --everything
33 ENSP --everything
34 SWISSPROT --everything
35 TREMBL --everything
36 UNIPARC --everything
37 UNIPROT_ISOFORM --everything
38 REFSEQ_MATCH --merged
39 SOURCE --merged
40 REFSEQ_OFFSET --merged
41 GIVEN_REF BAM-edited cache / --use_transcript_ref
42 USED_REF BAM-edited cache / --use_transcript_ref
43 BAM_EDIT BAM-edited cache
44 GENE_PHENO --everything
45 SIFT --everything
46 PolyPhen --everything
47 DOMAINS --everything
48 miRNA --everything
49 HGVS_OFFSET --everything --hgvs
50 AF --everything
51 AFR_AF --everything
52 AMR_AF --everything
53 EAS_AF --everything
54 EUR_AF --everything
55 SAS_AF --everything
56 gnomADe_AF --everything
57 gnomADe_AFR_AF --everything
58 gnomADe_AMR_AF --everything
59 gnomADe_ASJ_AF --everything
60 gnomADe_EAS_AF --everything
61 gnomADe_FIN_AF --everything
62 gnomADe_MID_AF --everything
63 gnomADe_NFE_AF --everything
64 gnomADe_REMAINING_AF --everything
65 gnomADe_SAS_AF --everything
66 gnomADg_AF --everything
67 gnomADg_AFR_AF --everything
68 gnomADg_AMI_AF --everything
69 gnomADg_AMR_AF --everything
70 gnomADg_ASJ_AF --everything
71 gnomADg_EAS_AF --everything
72 gnomADg_FIN_AF --everything
73 gnomADg_MID_AF --everything
74 gnomADg_NFE_AF --everything
75 gnomADg_REMAINING_AF --everything
76 gnomADg_SAS_AF --everything
77 MAX_AF --everything
78 MAX_AF_POPS --everything
79 CLIN_SIG implied check_existing
80 SOMATIC implied check_existing
81 PHENO implied check_existing
82 PUBMED --everything
83 MOTIF_NAME --everything
84 MOTIF_POS --everything
85 HIGH_INF_POS --everything
86 MOTIF_SCORE_CHANGE --everything
87 TRANSCRIPTION_FACTORS --everything

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vepyr-0.1.1.tar.gz (3.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

vepyr-0.1.1-cp310-abi3-win_amd64.whl (51.1 MB view details)

Uploaded CPython 3.10+Windows x86-64

vepyr-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (58.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

vepyr-0.1.1-cp310-abi3-macosx_11_0_arm64.whl (51.8 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

vepyr-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl (54.7 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file vepyr-0.1.1.tar.gz.

File metadata

  • Download URL: vepyr-0.1.1.tar.gz
  • Upload date:
  • Size: 3.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vepyr-0.1.1.tar.gz
Algorithm Hash digest
SHA256 ae2211f71c25523ed499dc036abb5e28f706f64603a4ce2a7cc6df690f7be0cf
MD5 b6c3840fec601b8c516b8acb1901f062
BLAKE2b-256 fdc4b303e1ee72840d191aca4e06751f779e0d44ea6d5f0bd4ba1c70e00bc334

See more details on using hashes here.

Provenance

The following attestation bundles were made for vepyr-0.1.1.tar.gz:

Publisher: publish_to_pypi.yml on biodatageeks/vepyr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vepyr-0.1.1-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: vepyr-0.1.1-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 51.1 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vepyr-0.1.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a3f2213f169e758edb8da0258f49a9f404b0f50c635e0d1e76663a35cf043606
MD5 61f433840b846ddc14ed57bd4299281c
BLAKE2b-256 c155a9fec7a3cdfbd8262070afded44f736ceadd544866c7df9933fee7944efa

See more details on using hashes here.

Provenance

The following attestation bundles were made for vepyr-0.1.1-cp310-abi3-win_amd64.whl:

Publisher: publish_to_pypi.yml on biodatageeks/vepyr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vepyr-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vepyr-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 85e41a81d7ea70b3ff90a4d71af6d906a868a77a97857b84c7289d563795fe29
MD5 ab106f0d30118d4aee1cceade6e92bf2
BLAKE2b-256 75352fe8914e76923fd62a12999f76c153cd5b59f9f7a849b889e3361c48ee31

See more details on using hashes here.

Provenance

The following attestation bundles were made for vepyr-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish_to_pypi.yml on biodatageeks/vepyr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vepyr-0.1.1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vepyr-0.1.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b91649ccf09e777ec050a0da1b06f89eac27de1e07195c4a70d6076c16c50b6b
MD5 c10ffca5b0b23e6ed4a5ee23a4a3f9b5
BLAKE2b-256 15a2a3b2fd0424ca8b7a7e2bd56ca74460251a8d24936674fa3208369fbdd67c

See more details on using hashes here.

Provenance

The following attestation bundles were made for vepyr-0.1.1-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: publish_to_pypi.yml on biodatageeks/vepyr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vepyr-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for vepyr-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a1b50d60bf02fd36bbd553377b66f389c74c7c195e9acd4f78b1305a9f10bc11
MD5 03b84f156193fe2d778280f5016d3f65
BLAKE2b-256 e546dc8ba77039586cd20fb1c3b3ab16a546a7690c081ef4e063556e525a3807

See more details on using hashes here.

Provenance

The following attestation bundles were made for vepyr-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: publish_to_pypi.yml on biodatageeks/vepyr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page