CLI Reference¶
eskaks uses subcommands for its two modes of operation:
eskaks <COMMAND> [OPTIONS]
eskaks --list-codes
eskaks --version
Global flags¶
| Flag | Description |
|---|---|
--demo |
Run a quick demo on the bundled example data (no input files needed) and exit |
--list-codes |
List available NCBI genetic code tables and exit |
--completions <SHELL> |
Print a shell completion script and exit (bash, zsh, fish, elvish, powershell) |
-v, --verbose |
Increase log verbosity: -v shows info, -vv shows debug. Data-quality warnings show by default |
-q, --quiet |
Silence all logs except errors (also hides the run-confirmation block) |
-h, --help |
Show help. Per subcommand, flags are grouped into sections (Output / Analysis / Statistics / Filtering / Input) and followed by usage examples |
-V, --version |
Show version |
Run confirmation & logging¶
Every eskaks fasta / eskaks vcf run ends with a short confirmation block on
stderr (sequence/gene counts, model, and the list of files written), so a run is
never silent about where its output went. Add --quiet to suppress it.
Diagnostics are printed as clean warning: / error: lines (coloured only when
stderr is a terminal). Set RUST_LOG to override the level entirely.
eskaks fasta: Pairwise dN/dS¶
Compute pairwise dN/dS from codon-aligned FASTA sequences.
eskaks fasta <INPUT_FILE> [OPTIONS]
| Argument | Description |
|---|---|
<INPUT_FILE> |
Aligned coding sequences in FASTA format. Use - for stdin. |
| Flag | Description | Default |
|---|---|---|
-o, --output <PREFIX> |
Base name for output files | output |
-w, --workers <N> |
Number of parallel threads | 4 |
--model <nei\|li> |
Substitution model | nei |
--format <tsv\|csv\|json> |
Output format | tsv |
--genetic-code <N> |
NCBI translation table number | 1 |
--lineage |
Lineage summary mode | off |
--group-average |
Group average mode | off |
--first-letter-lineage |
Group by first character of ID | off |
--window-size <N> |
Sliding window size (codons) | off |
--window-step <N> |
Window step size | 1 |
--min-codons <N> |
Filter sequences with < N valid codons | 0 |
--summary |
Print summary statistics to stderr | off |
--neutrality |
Write a per-pair Nei-Gojobori neutrality test (<output>_pairwise_tests): dN, dS, SEs, Z, p-value (Nei only) |
off |
--bootstrap <N> |
Per-pair 95% bootstrap CIs on dN, dS, dN/dS (<output>_pairwise_bootstrap); resamples codons, works for both models |
0 |
--seed <N> |
Seed for reproducible bootstrap resampling | 42 |
--plot |
Generate SVG plot(s) | off |
--report |
Write an interactive HTML report (<output>_report.html): lineage/group scatter with per-group means, or the pairwise dN/dS distribution |
off |
Examples¶
# Basic Nei model
eskaks fasta input.fasta
# Li model, 16 threads, CSV output
eskaks fasta input.fasta --model li --workers 16 --format csv -o results
# Vertebrate mitochondrial code, JSON output
eskaks fasta mito.fasta --genetic-code 2 --format json -o mito
# Sliding window with plot
eskaks fasta input.fasta --window-size 100 --window-step 10 --plot -o windows
# From stdin
cat input.fasta | eskaks fasta - --summary -o piped
eskaks vcf: pN/pS per gene¶
Compute pN/pS per gene from a VCF file, reference FASTA, and GFF3 annotation.
eskaks vcf --ref <FASTA> --gff <GFF3> --vcf <VCF> [OPTIONS]
Inputs & output
| Flag | Description | Default |
|---|---|---|
--ref <FASTA> |
Reference genome in FASTA format | required |
--gff <GFF3> |
Gene annotation in GFF3 format | required |
--vcf <VCF> |
VCF file(s), use multiple times for per-sample VCFs | one of --vcf / --vcf-list required |
--vcf-list <FILE> |
File with one VCF path per line (alternative to repeated --vcf) |
one of --vcf / --vcf-list required |
-o, --output <PREFIX> |
Base name for output files | output |
--format <tsv\|csv\|json> |
Output format | tsv |
--genetic-code <N> |
NCBI translation table number | 1 |
--workers <N> |
Parallel threads (output is deterministic) | 4 |
Variant filters
| Flag | Description | Default |
|---|---|---|
--pass-only |
Only include FILTER=PASS variants | off |
--min-af <FLOAT> |
Minimum allele frequency (0.0–1.0) | none |
--max-af <FLOAT> |
Maximum allele frequency (exclude fixed variants) | none |
--min-depth <INT> |
Minimum read depth (INFO/DP) | none |
--af-weighted |
Weight counts by AF (πN/πS instead of pN/pS) | off |
Model, test & correction
| Flag | Description | Default |
|---|---|---|
--kappa <FLOAT> |
ts/tv rate ratio for spectrum-aware site counting | 1.0 |
--min-snps <N> |
Drop genes with fewer SNPs from the table, plot, and test | 0 |
--fdr <FLOAT> |
Benjamini-Hochberg threshold for significant genes | 0.05 |
--mk |
Run the McDonald-Kreitman test (<prefix>_mk.<ext>) |
off |
--mk-fixed-af <FLOAT> |
AF at/above which a variant is "fixed" in the MK test | 0.99 |
--bootstrap <N> |
Replicates for a 95% CI on the genome-wide pooled pN/pS | 0 |
--seed <N> |
Seed for reproducible bootstrap resampling | 42 |
--genomic-control |
Divide each χ² by the inflation factor λ and re-test | off |
--exclude-repetitive |
Drop PE/PPE/PGRS/IS genes from the pooled estimate and test | off |
--codon-scan |
Rank codons by their count of distinct nonsynonymous alleles (<prefix>_codons.<ext>). Tests allelic multiplicity, not carrier counts and not a per-codon pN/pS |
off |
--tree <FILE> |
Newick tree over the cohort's samples. Adds independent-origin counting to --codon-scan and --variants, which is what lets a single allele that arose many times independently be seen as convergent (rpoB S450L, rpsL K43R). Tip names must match the VCF's sample names exactly; any mismatch is a hard error. Read the limitations before using the p-values |
none |
--min-origin-support <N> |
Minimum carriers in the clade an origin subtends for that origin to count (requires --tree). The default is load-bearing: at 1, three isolated false calls on top of one real clade allele are enough to fake genome-wide significance |
2 |
Output & reporting
| Flag | Description | Default |
|---|---|---|
--variants |
Write a per-coding-SNP table (<prefix>_variants.<ext>): position, base and amino-acid change (e.g. S315T), AF, and effect (synonymous/missense/nonsense/stop_loss) |
off |
--shared-codons |
Append Codon_Shared and Codon_Change to that table: true when a sample carrying this ALT also carries another SNP in the same codon, so the row's amino-acid change is the joint (multi-nucleotide) one, plus the codon change itself (CTT>TTA, coding strand). Requires --variants |
off |
--diversity |
Write per-gene πN/πS, Watterson θ and Tajima's D (<prefix>_diversity.<ext>); needs the sample size, so a multi-sample VCF or --vcf-list |
off |
--summary |
Print the pN/pS summary block to stderr | off |
--plot |
Generate Manhattan / p-value SVG plots | off |
--report |
Write a self-contained interactive HTML report | off |
--divergence <FILE> |
Per-gene dN/dS TSV for the report's polymorphism-vs-divergence panel | none |
Examples¶
# Population πN/πS from per-sample VCFs
eskaks vcf --ref H37Rv.fasta --gff H37Rv.gff3 \
--vcf sample1.vcf --vcf sample2.vcf --vcf sample3.vcf \
--af-weighted --genetic-code 11 -o mtb_pnps
# Full selection scan with the interactive report
eskaks vcf --ref H37Rv.fasta --gff H37Rv.gff3 --vcf-list samples.txt \
--genetic-code 11 --kappa 2 --min-snps 5 \
--mk --bootstrap 1000 --seed 42 --report --plot -o mtb_scan
# Single multi-sample VCF with filters
eskaks vcf --ref ref.fasta --gff ref.gff3 --vcf calls.vcf \
--pass-only --min-af 0.05 --min-depth 10 -o filtered
# Convergence scan: how many times did each allele arise, on a supplied phylogeny
eskaks vcf --ref H37Rv.fasta --gff H37Rv.gff3 --vcf-list samples.txt \
--genetic-code 11 --codon-scan --variants --exclude-repetitive \
--tree samples.nwk -o mtb_origins
Exit codes¶
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Error (invalid input, missing file, bad arguments) |
| 2 | Argument parsing error (clap) |
Environment variables¶
| Variable | Description |
|---|---|
RUST_LOG |
Set log level: info, warn, debug |