Skip to main content

STR annotation tool for VCF files

Project description

STR (Short Tandem Repeat) annotation tool for VCF files.

strvcf_annotator is a Python library and CLI tool for annotating variants in VCF files that overlap short tandem repeat (STR) regions. The tool converts SNPs, SNVs and indels into full repeat sequences and adds STR metadata.

Features

  • Dual Usage: Works as both a library and CLI tool

  • Extensible: Easy to add custom parsers for different VCF formats

  • Efficient: Streaming support for large files

Installation

Package is available through PyPI. To install, type:

pip install strvcf-annotator
# Install from source
git clone https://github.com/acg-team/strvcf_annotator.git
cd strvcf_annotator
pip install -e .
# Dev dependencies
pip install -r requirements_dev.txt

Quick Start

Command Line

# Annotate a single VCF
strvcf-annotator --input input.vcf --str-bed repeats.bed --output output.vcf

# Batch-process a directory
strvcf-annotator --input-dir vcf_files/ --str-bed repeats.bed --output-dir annotated/

# With verbose logging
strvcf-annotator --input input.vcf --str-bed repeats.bed --output output.vcf --verbose

Library Usage

from strvcf_annotator import STRAnnotator

# Create the annotator
annotator = STRAnnotator('repeats.bed')

# Annotate a single file
annotator.annotate_vcf_file('input.vcf', 'output.vcf')

# Batch processing
annotator.process_directory('vcf_files/', 'annotated/')

# Streaming processing
import pysam
vcf_in = pysam.VariantFile('input.vcf')
for record in annotator.annotate_vcf_stream(vcf_in):
    print(f"Repeat unit: {record.info['RU']}")

Input format

BED file with STR regions

CHROM   START   END     PERIOD  RU
chr1    100     115     3       CAG
chr1    200     212     4       ATCG
chr2    300     318     3       GAT
  • CHROM: Chromosome name

  • START: Start position (0-based, BED format)

  • END: End position (0-based, exclusive)

  • PERIOD: Repeat unit length

  • RU: Repeat unit sequence

VCF file

A standard VCF with variants. Must contain:

  • FORMAT field GT (genotype)

  • Optional: AD (allelic depth), DP (total depth)

Output format

The annotated VCF contains additional fields:

INFO fields

  • RU: Repeat unit

  • PERIOD: Repeat period (unit length)

  • REF: Reference copy number

  • PERFECT: TRUE if both alleles are perfect repeats

FORMAT fields

  • REPCN: Genotype expressed as repeat copy numbers

Example

##INFO=<ID=RU,Number=1,Type=String,Description="Repeat unit">
##INFO=<ID=PERIOD,Number=1,Type=Integer,Description="Repeat period">
##INFO=<ID=REF,Number=1,Type=Integer,Description="Reference copy number">
##INFO=<ID=PERFECT,Number=1,Type=String,Description="Perfect repeat indicator">
##FORMAT=<ID=REPCN,Number=2,Type=Integer,Description="Repeat copy number">

#CHROM  POS  ID  REF         ALT             QUAL  FILTER  INFO                              FORMAT      Sample1
chr1    101  .   CAGCAGCAG   CAGCAGCAGCAG    .     .       RU=CAG;PERIOD=3;REF=3;PERFECT=TRUE  GT:REPCN    0/1:3,4

Architecture

src/strvcf_annotator/
├── __init__.py          # Public API
├── api.py               # Library API
├── cli.py               # CLI interface
├── core/                # Core functionality
│   ├── annotation.py    # Annotation engine
│   ├── vcf_processor.py # VCF processing
│   ├── str_reference.py # STR reference management
│   └── repeat_utils.py  # Repeat sequence utilities
├── parsers/             # Parser system
│   ├── base.py          # Abstract parser interface
│   └── generic.py       # Generic VCF parser
└── utils/               # Utilities
    ├── vcf_utils.py     # VCF helpers
    └── validation.py    # Input validation

Extending functionality

Creating a custom parser

from strvcf_annotator.parsers.base import BaseVCFParser

class CustomParser(BaseVCFParser):
    def get_genotype(self, record, sample_idx):
        # Your logic for extracting the genotype
        pass

    def has_variant(self, record, sample_idx):
        # Your logic for determining if there is a variant
        pass

    def extract_info(self, record, sample_idx):
        # Your logic for extracting additional fields
        pass

    def validate_record(self, record):
        # Your logic for validating the record
        pass

# Usage
annotator = STRAnnotator('repeats.bed', parser=CustomParser())

Performance

  • Streaming processing: Does not load the entire VCF into memory

  • Efficient lookup: Uses sorted data for fast STR searches

  • Batch processing: Supports processing multiple files

Troubleshooting

Issue: ModuleNotFoundError

# Install the package in editable (dev) mode
pip install -e .

Issue: Unnormalized VCF

This tool only accepts normalized VCFs. Please normalize with bcftools before running. Example (produces a normalized, indexed VCF):

# Replace reference.fa with the exact reference used for the VCF
bcftools norm -f reference.fa -m input.vcf

Issue: Unsorted VCF

The tool automatically sorts the VCF in memory, but for large files pre-sorting is recommended:

bcftools sort input.vcf -o sorted.vcf

Issue: Reference mismatch

If you see warnings about a reference mismatch, check:

  • The correctness of the STR BED file

  • Matching reference genome versions

Documentation

Contributing

Contributions are welcome! For major changes, please open an issue first to discuss what you’d like to change. Please ensure:

  1. All tests pass

  2. Code follows existing style

  3. New features include tests

  4. Documentation is updated

License

MIT License

Credits

Test bed files were taken from ConSTRain repository https://github.com/acg-team/ConSTRain.

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

strvcf_annotator-0.2.1.tar.gz (25.0 MB view details)

Uploaded Source

Built Distribution

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

strvcf_annotator-0.2.1-py3-none-any.whl (25.8 kB view details)

Uploaded Python 3

File details

Details for the file strvcf_annotator-0.2.1.tar.gz.

File metadata

  • Download URL: strvcf_annotator-0.2.1.tar.gz
  • Upload date:
  • Size: 25.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for strvcf_annotator-0.2.1.tar.gz
Algorithm Hash digest
SHA256 18e8cd4d5a3b81c0564d2bf72cc230402e5726e7b26ee06fb1c99ea0b1b6fc6c
MD5 573eb36dbf2dd36fdce3e791204517d5
BLAKE2b-256 89220ba514dbe6cf26701ac76d1bec93a405656c805bd001330fd2d926a21acd

See more details on using hashes here.

File details

Details for the file strvcf_annotator-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for strvcf_annotator-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b53a1bbaf700af855654692152f628a9c2d117732f3dae69492b1415d2e04a23
MD5 34d148f2bef6fbded95d03713262f18e
BLAKE2b-256 b1600256ddfbb435eabe6b079d47fab57a8397603d6c4c1a309dd3a1f39dc37d

See more details on using hashes here.

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