Changelog¶
All notable changes to SNPick are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.2 - 2026-07-18¶
Added¶
Filtering & selection - Per-site filtering: --max-missing, --mac, --maf, --min-samples, --max-alleles. Filtered sites stay variable (never re-enter fconst), so ASC correction remains valid. - --keep-samples / --exclude-samples (comma-separated IDs or @file) subset the panel before the scan, so fconst is recomputed for the retained samples. - --mask <BED> (and --mask-ref) excludes regions from both the output and fconst.
Coordinates & references - --reference <ID> chooses the REF/polarity sequence and the VCF ##reference. - --ref-coords writes VCF POS as ungapped reference positions. - --sites-output <TSV> maps each site's alignment column to its reference position.
I/O & formats - Transparent gzip/bgzip input, plus stdin (-f -) and stdout (-o -) streaming. - --format {fasta,phylip,nexus} for the reduced alignment. - --stats-json <FILE> (or -) writes a typed JSON run summary with the fconst array.
Robustness & QC - --dry-run (stats only) and --check (composition audit) exit without writing. - --on-invalid {ignore,warn,error} guards against non-nucleotide input. - --iupac-mode resolve optionally resolves IUPAC codes to their bases. - Empty/duplicate sequence IDs are rejected (--allow-dup-ids to permit). - -v/-vv diagnostics; distinct exit codes (2 bad input, 1 I/O).
Threading & VCF - -t, --threads <N> pins the Rayon thread pool (deterministic wall-clock; output is unaffected by thread count). - --chrom <NAME> sets the VCF CHROM / ##contig name (default 1). - -q, --quiet silences the [snpick] progress logs (errors still print). - A valid header-only VCF is written when --vcf is requested but there are no variable sites, so pipelines declaring the .vcf output no longer break.
Packaging - Published as a reusable Rust library crate, with Python (pyo3/maturin) and WebAssembly bindings, and Docker/Apptainer container recipes.
Fixed¶
- Silent SNP loss when a single-line FASTA record contained a blank line: such records were read with misaligned byte offsets. They now use the newline-skipping scanner.
- Gap reference bases produced an invalid VCF
REFof-under--include-gaps; theREFis now rendered asN(a valid VCF base). ALT gaps stay*(the snp-sites convention), soREFandALTgap encodings differ by design. - All-gap columns were tallied in no category under
--include-gaps, breaking the reportedvariable + constant + ambiguous == lengthinvariant. - Bare output filenames (
-o snps.fasta, no directory) were rejected during path resolution, breaking the documented quickstart. - The release workflow's "tag already exists" guard was never read, so merges without a version bump re-published over existing tags.
- The README's pre-built binary download command pointed at an asset name the release never publishes (404).
Performance¶
- VCF data rows are assembled in a reused byte buffer instead of one formatted write per genotype field — a large speedup on many-sample inputs. Output is byte-identical.
1.0.1 - 2026-03-31¶
- First Bioconda release.
- Cross-platform Build & Release CI workflow (Linux/macOS, x86_64/aarch64).
- README overhaul and benchmarks.
1.0.0 - 2024-11-16¶
- Initial release: zero-copy memory-mapped extraction of variable sites from FASTA alignments, optional VCF v4.2 output, and ASC
fconstreporting.