Skip to main content

Production-quality Whole Exome Sequencing analysis pipeline

Project description

ExomeFlow Cover

ExomeFlow: A Production-Quality Python WES Analysis Toolkit

ExomeFlow Icon

Testing CI Platform
Package PyPI Latest Release Downloads Wheel PyPI Status
Container Docker Pulls Docker Image Size
Meta License - MIT Python Versions DOI bio.tools OpenEBench
Author AIIMS New Delhi ORCID

What is it?

ExomeFlow is a Python package that provides a complete, automated Whole Exome Sequencing (WES) analysis workflow from raw FASTQ files to functionally annotated variants in a single reproducible CLI command.

It aims to be the standard high-level pipeline for WES analysis in Python, combining GATK best-practice variant calling, hard filtering, and ANNOVAR annotation into one modular, maintainable package. It handles cohort-level processing (multiple samples), checkpointing for resumable runs, structured logging, and parallel execution out of the box.


Table of Contents


Main Features

Here are the things ExomeFlow does well:

  • Zero-config first runexomeflow run auto-detects bundled GATK/ANNOVAR, installs missing tools, and downloads reference data + ANNOVAR databases on first use, saving everything to ~/.exomeflow/config.json so later runs need no extra flags
  • Automatic sample detection — scans an input directory and detects all paired-end samples from FASTQ filenames; no manifest file required
  • Per-sample by default — any number of samples processed together still produces one separate annotated output file per sample, exactly like running them one at a time
  • Complete GATK best-practice workflow — fastp QC → BWA MEM alignment → coordinate sorting → duplicate marking → BQSR → HaplotypeCaller → hard filtering → ANNOVAR annotation
  • Cohort joint genotyping (opt-in)--joint-genotyping switches to GenomicsDBImport + GenotypeGVCFs, producing one shared cohort VCF/annotation instead of per-sample files
  • Somatic mode--mode somatic calls variants tumor-only with Mutect2 instead of HaplotypeCaller (tumor-normal pairing is on the roadmap, not yet supported)
  • Read-depth CNV calling (opt-in)--cnv adds GATK CollectReadCounts/DenoiseReadCounts/ PlotDenoisedCopyRatios per sample (no panel-of-normals required)
  • GRCh37/hg19 or hg38--genome-build selects the reference build; ANNOVAR buildver and resource-bundle downloads follow automatically
  • HPO + ACMG enrichment — every annotated table is automatically joined with HPO gene-to-phenotype terms and ACMG/AMP pathogenicity classification (via InterVar)
  • Cohort QC rollup — a MultiQC report aggregating fastp/flagstat/GATK metrics across all samples, generated automatically at the end of each run
  • Cohort processing — processes any number of samples sequentially or in parallel with --max-workers
  • Checkpointing and resume — every completed step is recorded; an interrupted run resumes exactly where it left off without repeating work
  • Automatic requirements check — every tool/database this pipeline needs is auto-detected and, if missing, auto-installed or auto-downloaded — no manual setup step
  • Structured logging — per-sample log files plus a pipeline-wide log with INFO / WARNING / ERROR / SUCCESS levels
  • GATK hard filters — applies GATK best-practice SNP and INDEL hard-filter thresholds and extracts PASS-only variants automatically
  • ANNOVAR functional annotation — annotates variants against 8 databases: refGene, ClinVar, gnomAD, dbNSFP, COSMIC, ExAC, avSNP150, and dbscSNV
  • Modular architecture — each pipeline step is an independent Python module composed through a pluggable step registry; easy to extend without touching the rest
  • PyPI installablepip install exomeflow; no Docker or Nextflow required

Pipeline Workflow

ExomeFlow Pipeline Workflow

Text version
Raw FASTQ
    │
    ▼
┌─────────────────────────────────────────────────────────┐
│  Step 1   fastp         Quality control & adapter trim   │
│           length ≥ 50 bp · base quality ≥ Q30            │
└──────────────────────────┬──────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│  Step 2   BWA MEM        Read alignment to hg38          │
│           -Y -K 100000000 · read-group tags set          │
└──────────────────────────┬──────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│  Step 3   GATK SortSam   Coordinate-sort BAM             │
│  Step 4   samtools       Flagstat alignment QC           │
│  Step 5   GATK MarkDuplicates   PCR duplicate removal    │
│  Step 6   GATK BuildBamIndex    BAI index                │
└──────────────────────────┬──────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│  Step 7   GATK BQSR      BaseRecalibrator + ApplyBQSR    │
│           Known sites: dbSNP · Mills · known indels      │
│           → recalibrated.bam  (IGV-ready)                │
└──────────────────────────┬──────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│  Step 8   GATK HaplotypeCaller   Variant calling         │
│           Exome intervals + padding · dbSNP annotation   │
└──────────────────────────┬──────────────────────────────┘
                           │
                    ┌──────┴──────┐
                    ▼             ▼
               SNP filters   INDEL filters
               (Step 9)       (Step 10)
                    └──────┬──────┘
                           │  MergeVcfs
                           ▼
┌─────────────────────────────────────────────────────────┐
│  Step 11  SelectVariants  Extract PASS-only variants     │
└──────────────────────────┬──────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│  Step 12  ANNOVAR         Functional annotation          │
│           refGene · ClinVar · gnomAD · dbNSFP · COSMIC   │
│           → multianno.vcf  +  multianno.txt              │
└─────────────────────────────────────────────────────────┘

Benchmarks

Benchmarked on NA12878 (HG001) whole-exome sequencing data (Agilent SureSelect V8 Clinical Exome, hg38). Accuracy evaluated against GIAB NISTv4.2.1 truth set restricted to Agilent V8 capture regions.

Performance

Metric Value
Total runtime (12 steps) 218.4 min
Slowest step BQSR (141.3 min)
Threads 24

Variant Quality (PASS variants)

Metric Value Expected range
SNPs called 38,413
INDELs called 5,971
Ts/Tv ratio 2.58 2.0–3.3 ✓
Het/Hom ratio 3.10 1.5–2.5
dbSNP concordance 44.7%

Accuracy (vs GIAB NISTv4.2.1, PASS-only)

Variant type Precision Recall F1 score TP FP FN
SNP 99.41% 64.67% 78.36% 7,787 46 4,255
INDEL 89.38% 66.14% 76.02% 623 74 319

Recall reflects PASS-only evaluation (conservative hard filters applied). PASS-only extraction is unconditional in ExomeFlow — there is no flag to disable it; the raw pre-filter VCF (<sample>.vcf / .g.vcf.gz) is also kept if you need it.

Functional Annotation (NA12878)

Category Count
Total annotated variants 44,673
Exonic 15,466 (34.6%)
Nonsynonymous SNV 6,957
Synonymous SNV 8,158
Stopgain 57
Frameshift indel 224
Splicing 62
ClinVar pathogenic/likely-pathogenic 5
Novel (not in dbSNP avSNP150) 658

Where to get it

ExomeFlow is available via three installation methods:

Option 1 — Python Package (recommended)

pip install exomeflow

Option 2 — Docker

# Pull
docker pull itsrobintomar/exomeflow:2.0.0

# Run
docker run --rm -it \
  -v /path/to/fastq:/data/fastq \
  -v /path/to/refs:/refs \
  -v /path/to/vcf:/vcf \
  -v /path/to/annovar:/annovar \
  -v /path/to/results:/data/results \
  itsrobintomar/exomeflow:2.0.0 run \
    --input-dir    /data/fastq \
    --output       /data/results \
    --reference    /refs/Homo_sapiens_assembly38.fasta \
    --dbsnp        /vcf/Homo_sapiens_assembly38.dbsnp138.vcf.gz \
    --mills        /vcf/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz \
    --known-indels /vcf/Homo_sapiens_assembly38.known_indels.vcf.gz \
    --annovar-bin  /annovar \
    --annovar-db   /annovar/humandb \
    --threads      24
Volume mount Host path Container path
Input FASTQs /your/fastq/ /data/fastq
Reference FASTA + BWA index /your/refs/ /refs
VCF files (dbSNP, Mills, known indels) /your/vcf/ /vcf
ANNOVAR scripts /your/annovar/ /annovar
ANNOVAR humandb /your/annovar/humandb/ /annovar/humandb
Output /your/results/ /data/results

Note: ANNOVAR must be mounted — it cannot be bundled due to licensing. Register and download at annovar.openbioinformatics.org

Option 3 — Singularity (HPC clusters)

# Option A — Pull directly from Docker Hub (easiest)
singularity pull exomeflow-2.0.0.sif docker://itsrobintomar/exomeflow:2.0.0

# Option B — Build from definition file (contact author for .def file)
singularity build exomeflow-2.0.0.sif exomeflow.def

# Run
singularity exec \
  --bind /path/to/fastq:/data/fastq \
  --bind /path/to/refs:/refs \
  --bind /path/to/vcf:/vcf \
  --bind /path/to/annovar:/annovar \
  --bind /path/to/results:/data/results \
  exomeflow-2.0.0.sif exomeflow run \
    --input-dir    /data/fastq \
    --output       /data/results \
    --reference    /refs/Homo_sapiens_assembly38.fasta \
    --dbsnp        /vcf/Homo_sapiens_assembly38.dbsnp138.vcf.gz \
    --mills        /vcf/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz \
    --known-indels /vcf/Homo_sapiens_assembly38.known_indels.vcf.gz \
    --annovar-bin  /annovar \
    --annovar-db   /annovar/humandb \
    --threads      24
SLURM job script example
#!/bin/bash
#SBATCH --job-name=exomeflow
#SBATCH --cpus-per-task=24
#SBATCH --mem=90G
#SBATCH --time=24:00:00
#SBATCH --output=exomeflow_%j.log

singularity exec \
  --bind $FASTQ_DIR:/data/fastq \
  --bind $REFS_DIR:/refs \
  --bind $VCF_DIR:/vcf \
  --bind $ANNOVAR_DIR:/annovar \
  --bind $RESULTS_DIR:/data/results \
  exomeflow-2.0.0.sif exomeflow run \
    --input-dir    /data/fastq \
    --output       /data/results \
    --reference    /refs/Homo_sapiens_assembly38.fasta \
    --dbsnp        /vcf/Homo_sapiens_assembly38.dbsnp138.vcf.gz \
    --mills        /vcf/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz \
    --known-indels /vcf/Homo_sapiens_assembly38.known_indels.vcf.gz \
    --annovar-bin  /annovar \
    --annovar-db   /annovar/humandb \
    --threads      $SLURM_CPUS_PER_TASK

System Requirements

ExomeFlow calls the following external tools via the command line. They must be installed separately and available on your PATH.

Tool Minimum Version Install
BWA ≥ 0.7.17 conda install -c bioconda bwa
SAMtools ≥ 1.13 conda install -c bioconda samtools
GATK ≥ 4.6.0 conda install -c bioconda gatk4
fastp ≥ 0.20.1 conda install -c bioconda fastp
Perl ≥ 5.26 conda install perl
ANNOVAR latest Register + download from website

Tip: Run exomeflow setup after installation to automatically verify tools, download hg38 reference files, and populate ANNOVAR databases in one step.


Python Dependencies

  • typer — Builds the CLI interface
  • rich — Provides coloured terminal output and structured logging
  • pandas — Data handling, variant count summaries, HPO/ACMG enrichment joins

All Python dependencies are installed automatically with pip install exomeflow. matplotlib (needed only for --cnv plots) is an optional extra (pip install exomeflow[viz]) — the dependency checker installs it automatically the first time you run with --cnv, so you never need to install it by hand.


Quick Start

1. Install ExomeFlow

pip install exomeflow

2. Prepare FASTQ files

fastq/
├── sample1_1.fastq.gz
├── sample1_2.fastq.gz
├── sample2_1.fastq.gz
└── sample2_2.fastq.gz

3. Run the pipeline

exomeflow run --input-dir fastq/ --output results/

That's it. On first run, ExomeFlow detects bundled GATK/ANNOVAR, installs any missing system tools, and walks you through fetching (or locating) reference data, ANNOVAR databases, the HPO gene-to-phenotype mapping, and InterVar — then saves everything to ~/.exomeflow/config.json so every later run needs nothing but --input-dir/--output.

Prefer to control every path explicitly (e.g. on a shared HPC where refs already exist)? Every auto-resolved value can still be set explicitly:

exomeflow run \
  --input-dir    fastq/ \
  --output       results/ \
  --reference    /data/references/hg38/hg38.fa \
  --dbsnp        /data/references/hg38/dbsnp.vcf.gz \
  --mills        /data/references/hg38/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz \
  --known-indels /data/references/hg38/Homo_sapiens_assembly38.known_indels.vcf.gz \
  --intervals    refs/Illumina_Exome_TargetedRegions_v1.2.hg38.bed \
  --annovar-bin  /opt/annovar \
  --annovar-db   /opt/annovar/humandb \
  --threads      32 \
  --max-workers  2

exomeflow setup still exists if you'd rather run provisioning as its own step (or re-run it later to change reference paths / download new databases) — it's optional, not a prerequisite.

Cohort, somatic, CNV, and GRCh37 modes

# Cohort joint genotyping instead of per-sample VCFs (opt-in)
exomeflow run --input-dir fastq/ --output results/ --joint-genotyping --intervals targets.bed

# Somatic tumor-only calling with Mutect2
exomeflow run --input-dir fastq/ --output results/ --mode somatic --germline-resource af-only-gnomad.vcf.gz

# Read-depth CNV calling alongside the normal germline workflow
exomeflow run --input-dir fastq/ --output results/ --cnv --intervals targets.bed

# GRCh37/hg19 instead of hg38
exomeflow run --input-dir fastq/ --output results/ --genome-build GRCh37

Commands

exomeflow run — Execute the WES pipeline

exomeflow run [OPTIONS]
Option Default Description
--input-dir, -i required Directory containing paired FASTQ files
--output, -o results/ Root output directory
--reference, -r auto-resolved BWA-indexed reference FASTA
--dbsnp auto-resolved dbSNP VCF (bgzipped + tabix-indexed)
--mills auto-resolved Mills and 1000G gold standard indels VCF
--known-indels auto-resolved Known indels VCF for BQSR
--intervals (optional) Exome capture BED file — required for --joint-genotyping/--cnv
--interval-padding 100 Base-pair padding around each target interval
--annovar-bin auto-resolved Directory containing table_annovar.pl
--annovar-db auto-resolved ANNOVAR humandb directory
--mode germline germline (HaplotypeCaller) or somatic (tumor-only Mutect2)
--genome-build hg38 hg38 or GRCh37
--joint-genotyping off Cohort mode: one shared VCF/annotation instead of per-sample files
--cnv off Also call read-depth CNVs per sample (needs --intervals)
--germline-resource (optional) gnomAD AF-only VCF for Mutect2, used by --mode somatic
--threads, -t 24 Threads for BWA MEM and GATK HaplotypeCaller
--fastp-threads 8 Threads for fastp
--annovar-threads 24 Threads for ANNOVAR
--max-workers 1 Number of samples to process in parallel
--java-opts -Xmx80g JVM options passed via JAVA_OPTS

exomeflow setup — Optional: run provisioning as its own step

exomeflow setup [--refs-dir PATH] [--annovar-bin PATH] [--annovar-db PATH] [--genome-build hg38|GRCh37] [--existing-refs PATH]

Not required before exomeflow run — first-run auto-setup covers the same ground. Useful for re-provisioning (switching reference builds, refreshing databases) without running the pipeline itself.


Reference Files

File Source Size
hg38.fa + BWA index UCSC / GATK resource bundle ~10 GB
dbsnp.vcf.gz GATK resource bundle ~10 GB
Mills_and_1000G_gold_standard.indels.hg38.vcf.gz GATK resource bundle ~200 MB
Homo_sapiens_assembly38.known_indels.vcf.gz GATK resource bundle ~100 MB
Exome capture BED Your sequencing kit vendor varies
ANNOVAR humandb (8 databases) ANNOVAR download server ~100 GB

exomeflow setup downloads all GATK resource bundle files automatically.

Manual download:

gsutil -m cp -r gs://gcp-public-data--broad-references/hg38/v0/ /data/refs/

Input Convention

ExomeFlow automatically detects samples from paired-end FASTQ filenames. Files must follow the pattern:

<sample_id>_1.fastq.gz   ← Read 1
<sample_id>_2.fastq.gz   ← Read 2

The sample_id can be any string — SRR accession, patient ID, etc.


Output Files

Per-sample output (default — one full set of these per sample, regardless of how many samples are in the run):

File Description
Mapsam/<sample>_recalibrated.bam Analysis-ready BAM — open in IGV
VCF/<sample>.vcf Raw HaplotypeCaller output (germline)
VCF/<sample>_unfiltered.vcf.gz Raw Mutect2 output (--mode somatic)
VCF/<sample>_PASS.vcf PASS-only filtered variants
VCF/<sample>.annovar.<buildver>_multianno.{vcf,txt} ANNOVAR-annotated variants
VCF/<sample>.annovar.hpo.txt Annotated table + HPO terms + ACMG classification
filtered_fastp/<sample>_fastp.html fastp QC report
Mapsam/<sample>_flagstat.txt Alignment statistics
CNV/<sample>_denoised_cr.tsv + plot Read-depth CNV calls (--cnv only)
logs/analysis_<timestamp>.log Full pipeline log
logs/<sample>_<timestamp>.log Per-sample log

Cohort output (--joint-genotyping only — replaces the per-sample VCF/annotation files above with one shared set):

File Description
VCF/cohort/cohort.vcf.gz Joint-genotyped multi-sample VCF
VCF/cohort/cohort_PASS.vcf PASS-only filtered cohort variants
VCF/cohort/cohort.annovar.<buildver>_multianno.{vcf,txt} Annotated cohort variants
VCF/cohort/cohort.annovar.hpo.txt Annotated cohort table + HPO/ACMG

Always generated at the end of a run:

File Description
multiqc/exomeflow_report.html Cohort-wide QC rollup (fastp, flagstat, GATK metrics)

Getting Help

For usage questions and bug reports, contact:

Robin Kumaritsrobintomar@gmail.com AIIMS New Delhi


License

MIT — see pypi.org/project/exomeflow for details.


Citation

If you use ExomeFlow in your research, please cite:

Robin Kumar. (2026). ExomeFlow (2.0.0). Zenodo. https://doi.org/10.5281/zenodo.20155767

ORCID: 0009-0002-9084-2019 · PyPI: pypi.org/project/exomeflow


Built for the bioinformatics community · Robin Kumar, AIIMS New Delhi

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

exomeflow-2.0.0.tar.gz (60.3 kB view details)

Uploaded Source

Built Distribution

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

exomeflow-2.0.0-py3-none-any.whl (56.4 kB view details)

Uploaded Python 3

File details

Details for the file exomeflow-2.0.0.tar.gz.

File metadata

  • Download URL: exomeflow-2.0.0.tar.gz
  • Upload date:
  • Size: 60.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for exomeflow-2.0.0.tar.gz
Algorithm Hash digest
SHA256 3d9e26e19798948b11e59cb4abd9cf802db86b047482724b36a5d30db788494f
MD5 628745a73f2dadcc9ad7a3e663613ab4
BLAKE2b-256 0fbc113fda110ca30fa402a9a3f2d0eb3a3305a3eb2344917f2dabe05d25ca4f

See more details on using hashes here.

File details

Details for the file exomeflow-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: exomeflow-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 56.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for exomeflow-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4ab35c3475be1b2edf9ec0e9eec98db8b35b0d017e83f63ca68dca220c078e32
MD5 263e289903cc5407cc7e979e32c279c9
BLAKE2b-256 5721564de306beeab7649dbcb8068ebf69b25c6afcf6b40618a96ad778a3673a

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