Savont generates Amplicon Sequence Variants (ASVs) at single-nucleotide resolution from long-read amplicon sequencing data such as
Savont differs from mapping-based approaches (e.g. Emu or ONT's epi2me workflow). Savont instead follows the Reads -> ASV -> Classification paradigm (just like DADA2, but for noisier long reads).
[!NOTE] Savont is optimized for long reads with >98% accuracy. ONT's R10.4 reads with SUP basecalling or PacBio HiFi are preferred. For lower quality reads (e.g. R9.4 ONT data) savont may not be useful.
<img width="90%" alt="github-diagram" src="https://github.com/user-attachments/assets/c0d9e356-ee1d-4d60-a217-c050e5abd0dc" />
[!tip] The savont preprint is now out! Please see the preprint for results and methodological details.
ONT and HiFi results on 8-species community for full-length 16S sequences.
Diversity and ASV metrics on complex full-length ONT 16S amplicons.
Requirements: 1. rust (tested for > v1.88) programming language 2. Standard linux toolchain (tar, gzip, wget, C++, gcc) 3. cmake
git clone https://github.com/bluenote-1577/savont
cd savont
# Build and install
cargo install --path .
savont --help
mamba install -c bioconda savont
# or use conda instead of mamba
You can either run savont in single sample mode or pool samples together. See documentation on multi-sample profiling.
# generate 16S ASVs for ONT / HiFi after cutadapt
savont asv 16s_full-length_trimmed.fastq.gz -o savont-out -t 20 (optional: --hifi)
# OR pool samples, get shared ASVs, quantify each sample independently
savont asv --pooled-samples sample1.fq.gz sample2.fq.gz ...
# download Greengenes, EMU, or silva databases
savont download --location /path/databases --dbs greengenes2-2024.09 emu-1 silva-138.2
# classify against any database
savont classify -i savont-out -d /path/databases/emu-1 -t 20
# export a single run to QIIME2-compatible outputs
savont export -i savont-out -o export_output
# or combine multiple runs into one merged export
savont export -i savont-out1 savont-out2 -o export_output
savont asv)[!NOTE] Savont filters reads based on length and quality. However, savont does not do adapter/primer trimming. Please trim your reads with e.g. cutadapt first.
Default savont parameters assume ONT / HiFi full-length 16S rRNA sequencing with trimmed reads from cutadapt. See below for parameter choices if this is not the case.
# Full-length 16S rRNA reads -> ASVs
savont asv 16s_full-length.fastq.gz -o savont-out -t 20
# Full bacterial rRNA operon amplicons -> ASVs
savont asv operon_reads.fastq.gz -o savont-out -t 20 --rrna-operon
# For single-stranded protocols
savont asv 16s_single_strand.fq --single-strand -o savont-out -t 20
# Other types of amplicons with known length
savont asv amplicons.fastq.gz -o savont-out -t 20 --min-read-length 1600 --max-read-length 2100
# Resulting ASVs
ls savont-out/final_asvs.fasta
You can either
Run savont on multiple samples independently and do savont export to dereplicate ASVs and merge (see below).
Or, you can pool samples through savont asv --pooled-samples sample1.fq sample2.fq .... This runs ASV detection on the concatenation of all samples, but sample-by-sample abundance quantification.
Pooling may allow recovery of low abundance ASVs and prevent cross-sample ASV splitting (see here). However, pooling is more computationally expensive, both in terms of memory and speed.
The savont asv command produces:
Savont can also classify ASVs and generate a taxonomic profile with abundances. Savont supports two classification approaches:
savont classify — minimap2 alignment against database with species- and genus-level output (better for species level). Uses identity thresholds for taxonomic assignment (thresholds from Yarza et al.)savont sintax — SINTAX k-mer bootstrap; genus-level only (better for unknown taxa)# Download one or more databases (emu-1, silva-138.2, greengenes2-2024.09)
savont download --location /path/databases --dbs emu-1
savont download --location /path/databases --dbs silva-138.2
savont download --location /path/databases --dbs greengenes2-2024.09
# Or download multiple at once
savont download --location /path/databases --dbs emu-1 silva-138.2
savont classify)# Classify using any downloaded database (type is auto-detected)
savont classify -i savont-out -d databases/emu-1 -t 20
savont classify -i savont-out -d databases/silva-138.2 -t 20
# Adjust identity thresholds
savont classify -i savont-out -d databases/emu-1 \
--species-threshold 99.9 --genus-threshold 90.0
savont sintax)savont sintax uses 12-mer bootstrap resampling (100 iterations by default) to assign genus-level taxonomy with per-rank confidence scores.
savont sintax -i savont-out -d databases/emu-1 -t 20
# Adjust bootstrap threshold (default: 0.80)
savont sintax -i savont-out -d databases/silva-138.2 --min-bootstrap 0.70
savont classify)The savont classify command produces three output files:
Species-level or genus-level taxonomic abundance table:
abundance species genus family order class phylum clade superkingdom
0.45123 Escherichia_coli Escherichia Enterobacteriaceae ...
0.23456 Staphylococcus_aureus Staphylococcus Staphylococcaceae ...
abundance - Relative abundance estimated by mappings and ASV depthsNote: *_abundance.tsv has extra per-sample abundances if --pooled-samples was specified during savont asv.
Individual ASV mapping details:
asv_header depth alignment_identity number_mismatches tax_id species genus family order class phylum clade superkingdom reference
final_consensus_0_depth_5936 5936 99.67 5 29466 Veillonella parvula Veillonella Veillonellaceae Veillonellales Negativicutes Bacillota Bacteria 29466:emu_db:36875
final_consensus_1_depth_3081 3081 99.27 11 29466 Veillonella parvula Veillonella Veillonellaceae Veillonellales Negativicutes Bacillota Bacteria 29466:emu_db:36873
All taxonomic ranks from species to superkingdom are included. Lower taxonomic ranks may be UNCLASSIFIED if the alignment identity is low. Unmapped ASVs have UNCLASSIFIED in every rank column.
savont sintax)savont sintax produces genus_abundance.tsv (same format as above) and asv_mappings.tsv with bootstrap confidence scores:
asv_header depth species_bootstrap genus_bootstrap family_bootstrap order_bootstrap class_bootstrap phylum_bootstrap superkingdom_bootstrap species genus family ...
final_consensus_0_depth_5936 5936 0.000 0.980 0.990 0.995 0.999 1.000 1.000 UNCLASSIFIED Veillonella Veillonellaceae ...
Ranks below --min-bootstrap are reported as UNCLASSIFIED.
savont export)savont export converts savont output into QIIME2-importable files. It works on a single run directory or combines multiple directories into one merged profile.
ASVs across directories are matched by exact sequence hash. By default, savont also fuzzy-merges ASVs with identical sequences but trimmed to slightly different lengths across runs.
# Export a single run
savont export -i savont-out -o export-out
# Combine multiple runs
savont export -i sample1-out sample2-out -o export-out
# Combine many runs and give them meaningful names
savont export \
-i run1/savont-out run2/savont-out run3/savont-out \
-o export-out \
--relabel SampleA SampleB SampleC
[!NOTE] Make sure to use
--relabelif you have duplicate sample names.
savont classify or savont sintax was run on any input directoryBacteria;Firmicutes;...), columns are sample counts; useful for quick inspection without QIIME2# Feature table
biom convert -i export-out/merged_feature_table.tsv \
-o feature-table.biom --table-type='OTU table' --to-hdf5
qiime tools import --type 'FeatureTable[Frequency]' \
--input-path feature-table.biom --output-path feature-table.qza
# Representative sequences
qiime tools import --type 'FeatureData[Sequence]' \
--input-path export-out/merged_rep_seqs.fasta --output-path rep-seqs.qza
# Taxonomy (if classify/sintax was run)
qiime tools import --type 'FeatureData[Taxonomy]' \
--input-format HeaderlessTSVTaxonomyFormat \
--input-path export-out/merged_asv_taxonomy.tsv --output-path taxonomy.qza
qiime taxa barplot --i-table feature-table.qza --i-taxonomy taxonomy.qza \
--o-visualization taxa-bar-plots.qzv
emu-1)From Emu by Curry et al. (2022, Nature Methods). Curated 16S rRNA database with focused species-level classifications. Less breadth than SILVA or Greengenes2 for complex microbiomes.
silva-138.2) — SSU Ref NR99 v138.2More comprehensive than EMU, especially for understudied taxa. However, species-level classifications are often split across multiple distinct strains.
greengenes2-2024.09)GreenGenes2 2024.09 species-level trainset (DADA2 format). Unannotated ranks are reported as Greengenes_unannotated.
See the changelog.
Jim Shaw, Marie Riisgaard-Jensen, Kasper Skytte Andersen, Rasmus Kirkegaard, Morten Kam Dahl Dueholm, Heng Li. bioRxiv 2026.05.26.727271; doi: https://doi.org/10.64898/2026.05.26.727271
If you use any provided database, cite:
Quast, Christian, et al. "The SILVA ribosomal RNA gene database project: improved data processing and web-based tools." Nucleic acids research 41.D1 (2012): D590-D596.
Curry, Kristen D., et al. "Emu: species-level microbial community profiling of full-length 16S rRNA Oxford Nanopore sequencing data." Nature methods 19.7 (2022): 845-853.
McDonald, D., Jiang, Y., Balaban, M. et al. Greengenes2 unifies microbial data in a single reference tree. Nat Biotechnol 42, 715–718 (2024).
If you use the SINTAX algorithm please cite: Edgar, Robert C. "SINTAX: a simple non-Bayesian taxonomy classifier for 16S and ITS sequences." biorxiv (2016): 074161.
MIT
$ claude mcp add savont \
-- python -m otcore.mcp_server <graph>