Spaces:
Running
Running
Commit History
5 days ago
-
taxonova 26.11.3: short reads (80 to 119 valid bases) are classified, with a note in the results and a hint before the run; pin 26.11.3 Running
MeluXina user4ffc1bd
9 days ago
-
Region list in region order: V4, V4-V5, V3-V4, V5-V7, full-length 16S, then the rRNA operon
7f63629 -
Greengenes2 only: one Region list with the reference named under it; SILVA and RDP removed from README, comments, tests and the V4-V5 parity fixture
Taxonova 26.11.1 offers Greengenes2 2024.09 (V4, V4-V5, V3-V4, V5-V7, whole 16S) and the GROND operon model. The reference selector is replaced by one Region list; the line under it names the reference of the chosen model. The V4-V5 parity fixture keeps its 66 Greengenes2 reads and their 3 mutated copies. A test checks that the 26.11.0 SILVA and RDP ids and file names are unknown to the web app. The Dockerfile asserts that the models directory holds exactly the files the registry lists.2a0d367
10 days ago
-
Unknown at a rank counts as no name in the reference: apart from the named taxa and from Unclassified in the summary, the confidence caption and the charts (dark grey); downloads unchanged
135bd2c -
Confidence caption: reasons worded as phrases; no 'the others none' when every sequence has a label
43025f9 -
Withheld species calls: count those lost to a higher rank, to rounding or to another rule apart from the gate and the group rule; confidence caption gives the counted reasons per rank
abd0a69 -
Parity fixtures picked again with taxonova 26.11.1: V4-V5 gated reads of the new files, and reads whose species call is lost to the genus threshold
40530ca -
Inputs: the alphabet error states what is accepted and does not call a text file protein
a57d074 -
Orientation check once per job, on the first chunk, which now holds the first 200 reads
The package's reverse-complement check only decides whether to warn; it was run again for every chunk. Output is unchanged (parity test with 7-read chunks); on 2,000 reads it saves about 1.9 s of 17 to 19 s.37b693a -
Withheld counts: a read the species gate holds counts as gated also when its label is a species group
Counts follow the writer's order (low information, gate, group rule), so each read is counted under one reason; synthetic test with both rules.ce01cb7 -
Inputs: refuse records with characters that are not IUPAC nucleotide codes
The whole input is refused, naming up to five records and the first offending character with its position; gaps and whitespace are allowed and ';' comment lines skipped, as taxonova's FASTA reader does.ede71c6 -
Page: file pickers reachable by keyboard, region hint wording, stats in one row, rank labels left-aligned
7dfc239 -
Model cache: state the measured memory per model
bb2adf3 -
Pin taxonova 26.11.0; Dockerfile asserts the requirements pin and runs parity for every model; README for 26.11
12a6b26 -
Parity tests for every registry model on reads that exercise the species gate and group labels
- test_parity: web TSV equals taxonova classify (separate process) for each listed model at the model's own thresholds, --confidence 0.8 and --confidence 0.5 --genus-threshold 0.6; API download equals CLI rows - fixtures per region with gated reads, V4-V5 group-label reads, mutated and low-information reads; a test fails if a model's rules stop firing on them - test_package_adapter: fails loudly if the package internals the adapter uses change; page settings equal the loaded checkpoint - test_reference_parity removed (hard-coded 26.10 file names)3dc4a95 -
Page: model's own thresholds by default, custom confidence opt-in; region hint lists regions it cannot separate
- threshold panel shows the selected model's operating point, species gate and species-group rule; a species confidence is sent only when chosen - results state the thresholds used and their source, and count species calls withheld by the gate - confidence chart colours sequences by whether they have a label at the rank, not by the threshold alone - region hint: primer, then measured length windows; V4 and V4-V5 (shared primer) and V4-V5 and V5-V7 (same length) are listed together when the reads do not separate them - command-line snippet pins the installed taxonova versionaa59ee1 -
Backend for 26.11: classify through the package, operating point by default, lazy models, registry-only catalogue
- classifier.py runs taxonova classify through package_adapter instead of a copy of the 26.10 handler body, so the species gate and the V4-V5 species-group rule apply as on the command line - no confidence sent: the model's operating point; /classify keeps 0.8 - models load on first use into a bounded cache; start-up loads the default - deprecated ids get a message naming the command-line tool - preview_registry removed (withdrawn models); V4-V5 labels, primers and measured length windows - run summary: thresholds used and their source, species calls withheld by the gate, group labels reported at the genus, low-information reads9e4e9f9 -
Package adapter: run taxonova's own classification_mode with a held model; bounded model cache
a0c0093
15 days ago
-
Reference list: no '(default)' label
Verified signatureaf77d7b -
Region names without repetition
Verified signature69b285b -
Full names always: exact labels, no names switch
Verified signaturef1da1dc -
Reference database selector and per-reference name display
Verified signaturea69199c -
Footer: drop the model line
Verified signaturef66afc2 -
Species-first example data; content-hash cache busting for static files
Verified signature8e7087a -
Composition view opens at species rank
Verified signaturee8bbde8 -
Shorter Greengenes2 names for display, with a switch for full names
Verified signature2ac3ae7 -
Align web chunks with classifier batches; README wording on rounding
Verified signaturedd0813b -
Build check: tolerate float rounding across batch sizes
Verified signature6b5959c -
New web app: composition plots, count tables, downloads; taxonova 26.10.1
Verified signatureRedesigned interface with an example dataset, composition, hierarchy and confidence plots, optional ASV count table for per-sample composition, and TSV, QIIME 2 and phyloseq downloads. Installs taxonova==26.10.1 and uses the short model ids.b018397
16 days ago
-
Serve taxonova 26.10.0 and the v26.10.0 models
Verified signatureInstalls taxonova==26.10.0 from PyPI instead of a bundled copy; the Docker build downloads the v26.10.0 Greengenes2 checkpoints (RRN from v1.0.0). Releases before 26.10.0 applied no confidence thresholds to the Greengenes2 models.89bbd94
-
Update webapp/templates/index.html
Verified signatureaed3a56
-
Halve the pre-filter's cost by consulting the two SSU models in turn
A sequence passes the guard if it hits EITHER SSU model, so the two searches need not both run over everything. The HMM stage now runs the bacterial model over the whole submission and the archaeal model only over what that missed. The predicate is unchanged; a union does not care in which order it is taken. It is worth about a factor of two on any submission that is mostly rRNA, which is the case a user waits on. The two models cost about the same (3.1 s and 3.0 s per thousand V4 amplicons at two threads) and each detects nearly everything the other does, so the second search almost always runs on a handful of sequences rather than all of them. Measured against the shipped implementation, two threads, identical inputs: legitimate V4 x1000 6.46s -> 3.53s 998 passing, both archaeal V4 x300 3.12s -> 1.62s 300 passing, both mixed 400/400/200 3.59s -> 1.93s 599 passing, both adversarial x1000 0.39s -> 0.34s 0 passing, both single sequence 0.129s …9099298 -
Scale the per-rank gates in the package, not just in the web app
The graded profile (0.5 domain through family, 0.7 genus, 0.8 species) and the rule that a single requested confidence scales it lived only in webapp/app.py. The package defaulted to a flat 0.5 at every rank and to a species gate of 0.5, with help text claiming 0.7. So the two user-facing entry points disagreed: `--confidence_threshold 0.8` on the command line still accepted a genus label at 0.5, the page opened at 80% while the CLI opened at 50%, and on 60 V4 sequences the two differed on the deepest reported rank for 3 of them at the same nominal 0.5. Reviewer 2 asked for the default "to be made clearer throughout all user facing entry points", and Methods, "Architecture" states the scaling as a property of the tool, not of the web page. It now is one. - taxonova/core/thresholds.py, new: GRADED_PROFILE, GRADED_SPECIES and scaled_profile(). Stdlib-only, so --help still works without the deep-learning stack. - _get_level_thresholds applies the scaled profile; an explicit --<lev…c9c0154 -
Accept aligned FASTA, and two smaller service fixes
A single gap character anywhere in a submission aborted the whole request. `_is_nucleotide` strips `-` and `.` before validating, so a gapped sequence was accepted as input, but the FASTA handed to cmsearch kept them; Easel rejects a gap in an unaligned sequence file and cmsearch exits 1. The RuntimeError that followed failed the entire batch, so one gap returned "rRNA pre-filter failed" and classified nothing, not even the clean sequences beside it. Aligned FASTA from SILVA, mothur and QIIME carries gaps routinely. Fixed with one `_ungapped` helper used by the validator and by both FASTA writers, so validation and the search can no longer disagree about what the sequence is. Detection is unchanged. On a 1,000-sequence legitimate V4 panel and a 1,000-sequence adversarial panel (cds / random / shuffled_16s / tandem, 250 each, seed 42), the patched guard passes 998/1000 and 0/1000, missing exactly the same two sequence ids as the deployed version. 200 gapped V4 sequences go from aborti…fd68e3e
-
Fix the rRNA guard rejecting every short amplicon, and make it fast
Second attempt. The first (6c71ee8, reverted in 0d2b75d) was correct in the guard but failed the image build, because it fetched the covariance models out of the installed barrnap and that build does not keep them under db/<kingdom>/. The models are now committed here instead, so nothing about a package's layout or version can change what the guard does. The bug being fixed. The service returned Unclassified at every rank for any input under about 375 bp, which is every V4, V3-V4 and V5-V7 amplicon and so the majority of real submissions. Measured live, same sequence at descending lengths: 1388 bp passed, 800 passed, 500 passed, 300 rejected, 253 rejected. The guard shelled out to barrnap, which applies --reject, a proportional length filter discarding any hit under 25% of the expected gene length: about 375 bp against the 1,500 bp 16S model. Whether it is applied differs between bioconda builds, so the guard was validated on a build without it and deployed on a build with it, from an…3461aeb -
Revert "Fix the rRNA guard rejecting every short amplicon, and make it fast"
This reverts commit 6c71ee8dab0a5661bb7bc8dcba160ceca994f98d.0d2b75d -
Fix the rRNA guard rejecting every short amplicon, and make it fast
The hosted service returned Unclassified at every rank for any input under about 375 bp, which is every V4, V3-V4 and V5-V7 amplicon and so the majority of real submissions. Measured on the live service before this change, same sequence at descending lengths: 1388 bp passed, 800 passed, 500 passed, 300 rejected, 253 rejected. Cause. The guard shelled out to barrnap, which applies --reject, a proportional length filter discarding any hit spanning less than 25% of the expected gene length. Against the ~1,500 bp 16S model that is a floor of about 375 bp. Whether it is applied at all differs between bioconda builds: barrnap-1.10.6 has the option commented out and detects V4 fine, while the build this image pulled applied it. The guard was therefore validated on one build and deployed on another, from an identical command line, and looked correct in both places. Fix. Call cmsearch directly against the two SSU covariance models, fetched out of barrnap's own databases at image build time. N…6c71ee8 -
Replace the example sequences with ones that actually classify
The four chips were labelled Escherichia, Bacillus, Pseudomonas and Staphylococcus. At the page's default gates (parents 0.5, genus 0.7, species 0.8) none of them reached genus: they stopped at family, family, family and phylum respectively, so the landing page for a species-level classifier opened by returning Unclassified. The Bacillus example was also placed in Erysipelotrichales / Coprobacillaceae rather than Bacillales, so its chip label did not match its own result. The four replacements are real Greengenes2 V4 reference sequences, one per phylum, each checked to resolve to the correct species at those same default gates before being added: Faecalibacterium prausnitzii Bacillota species conf 0.847 Prevotella copri Bacteroidota species conf 0.851 Bifidobacterium avesanii Actinomycetota species conf 0.893 Klebsiella granulomatis Pseudomonadota species conf 0.860 Chips now carry the abbreviated binomial in italics with the full name…b38e134 -
Fix the four webserver defects raised in peer review
Reviewer 2, major comment 3, on the hosted service: 1. Duplicate FASTA headers. Results were keyed on the sequence identifier, which parse_sequence_id takes as the first word of the header. Headers are not required to be unique, so sequences sharing a name collapsed to one entry and every duplicate was handed the same call and confidence. Sequences now carry unique internal ids and are reported back under the user's own names, by position. 2. Default confidence was 50% in the UI against the manuscript's recommended 70% genus and 80% species. The slider and the hidden field now default to 0.8 and the label names the rank it gates. 3. Labels appearing below the requested threshold. Parent ranks were pinned at 0.5 regardless of what the user asked for, so a request for 0.8 still accepted genus labels at 0.5; and because abstention propagates downward, a parent failing that fixed gate discarded an already-computed species call. The whole per-rank profile…e477625
-
Make the confidence slider actually gate species calls
The production checkpoints carry an ood_config with relaxed_thresholds of 0.0 and an energy-phylum OOD detector that flags ~100% of inputs; write_tsv_output then applied those 0.0 thresholds instead of the user's confidence_threshold, so the UI slider had no effect (a species at 0.30 was returned even at a 0.50 threshold). Out-of-distribution / non-rRNA rejection is now handled upstream by the barrnap pre-filter, so the web app no longer attaches the checkpoint's ood_config: write_tsv_output falls back to strict per-rank thresholds where the species threshold = the slider value. The slider now gates species calls monotonically (higher threshold -> more abstention).e4d9c3f
-
Surface region + confidence settings on the main page
The hypervariable-region selector and confidence threshold were hidden behind a settings gear/modal, so most users never saw that it defaults to V4 / 50%. Move both controls inline into the form as a clean settings panel placed between the sequence input and the Run Classification button, always visible before running. Region renders as a wrapping row of pills (V4 selected by default); confidence is a slider with a live percentage. Removed the gear button, the modal, and their now-unused CSS/JS. Same element IDs and form fields, so submission is unchanged.015c794 -
Speed up rRNA pre-filter: drop fungal kingdom, run kingdoms concurrently
The pre-filter dominated runtime at table scale (Infernal cmsearch is ~per-seq linear and the fungal pass is the slowest). Screen only bac + arc (Taxonova classifies bacterial/archaeal 16S; eukaryotic models are out of scope and were the slowest kingdom) and run the two kingdoms concurrently (one cmsearch each) so wall time is ~max(bac, arc) instead of the sum. Local benchmark: 100 seqs 61s -> 13.8s (4.4x), with identical reject/accept behaviour.6c5a101 -
Pre-filter: reject non-nucleotide input instead of erroring
A non-rRNA input containing non-nucleotide characters (e.g. a protein sequence or stray digits) crashed cmsearch ("illegal character") and surfaced as a hard error to the user. Now each sequence is validated for IUPAC nucleotide content first: non-nucleotide input is rejected directly as non-rRNA (Unclassified at every rank) and never sent to barrnap, so the whole batch no longer fails. Only clean nucleotide sequences go to barrnap for the rRNA hit test.626186e -
Add rRNA pre-filter (OOD input guard) to the web app
Non-rRNA input was being confidently mis-classified. Each input sequence is now screened with barrnap (bundled rRNA HMM models; kingdoms bac/arc/fun, e-value 1e-3) before classification: sequences with no rRNA hit are returned as Unclassified at every rank, and only passing sequences go through the canonical classifier. Results are merged back in input order; rejected rows are flagged in the UI as "not rRNA - filtered". The canonical classification path is unchanged. - webapp/rrna_prefilter.py: barrnap-based pass/fail screen. - webapp/app.py: prefilter step wrapping run_classification; startup detection; /classify refuses to run if barrnap is unavailable (never silently classifies). - Dockerfile: install barrnap (HMMER + bedtools + perl) with a build-time check. - index.html: muted badge for prefilter-rejected sequences.5faa488 -
Update to canonical Taxonova 26.6.0 with full per-region models
Bring the Space in line with the published PyPI/GitHub release so the web app produces the same results as the command-line tool: - Replace the bundled package with the canonical taxonova 26.6.0 code (adds calibration/tau-norm, OOD-aware thresholding, species-safe split; removes the old custom factory_quantized path). - Rewrite webapp/app.py to load each model once at startup and run the exact canonical classification pipeline per request (consistency enforcement, per-rank thresholds, abstention, OOD config), so predictions match the CLI. - Serve the five full-precision per-region models (V4, V3-V4, V5-V7, V1-V9, full rRNA operon), fetched from the GitHub release at Docker build time and kept out of the repo to stay within the Space storage limit. - Render multi-taxon consensus calls "[a|b|c]" (indiscriminable taxa in a region) as a labelled stack of candidate chips in the results table. - Remove committed __pycache__, add .gitignore, drop emoji from docs/logs, refresh…1cf36f0
-
Update webapp/templates/index.html
Verified signature5733712
-
Update webapp/templates/index.html
Verified signaturebf0483d -
Update webapp/templates/index.html
Verified signatureab73fc8 -
Update webapp/templates/index.html
Verified signaturef106507
-
Upload 142 files
Verified signature9db9bd0