Repository navigation
BrucellaID 2.1.0
The k-mer copy threshold was re-derived, and reported distances change because of it. Before MASH
sketches a read set it drops every k-mer seen fewer than m times, to throw away the ones that exist only
because of a sequencing error. m was one more copy per 20x of coverage, capped at 20; it is now one more
copy per 5x, capped at 48. The floor of 2 is unchanged.
No species call and no sequence type changes: the 2,022-sample simulated validation returns exactly the
same 1,538 of 1,543 held-out named samples, and the repository's own suite still passes 22 of 22. What
changes is MashDistance and SharedHashes, on real libraries especially:
| library | depth | before | after |
|---|---|---|---|
| ERR2136546 | 47x | 0.00652, 773/1000 | 0.000119, 995/1000 |
| ERR3454415 | 70x | 0.00068, 972/1000 | 0.000144, 994/1000 |
| SRR19520329 | 53x | 0.00051, 979/1000 | 0.000119, 995/1000 |
| SRR8550484 | 69x | 0.00645, 775/1000 | 0.000264, 989/1000 |
If you compare distances across versions, they are not comparable. A distance from 2.0.0 or earlier is
larger than the same measurement today, by a factor that depends on the depth of the library. Pin any fixed
value with --min-kmer-copies to reproduce an old report: 2 gives a 1.1.0 report exactly.
What it was fitted on. 81 threshold sweeps over 63 real libraries from 5x to 1903x. The new rule lands
inside the measured plateau for 80 of the 81 curves; the old one for 26. Simulated reads cannot settle it,
and an earlier derivation that rested on them got it wrong.
Also in this release
--loose-distanceis recalibrated, 0.005 to 0.001. Same rule as before — the 95th percentile of the
distance of calls that agree with the ENA submitter — but that percentile was measured on distances the
old copy threshold had inflated about sevenfold. Re-measured on 207 public read sets it is 0.00066. The
note stays about as rare, flagging 4.0% of identified runs against 4.9% before.- A claim behind the old calibration was circular, and is withdrawn. It offered as corroboration that
every agreeing call past the threshold shared fewer than 900 of its 1000 hashes. MASH derives the
distance from the shared-hash count, so that is the threshold restated in another unit. What does
support leaving the species call alone is that agreement with the submitter is flat in distance. - Three head-to-head figures of the public sweep are corrected, all stale the same way and all moving
in the extended set's favour: it wins 94 of the 146 disagreements rather than 91, 89 of them are runs
the vSNP set cannot name rather than 72, and 21 of those are B. intermedia rather than 15. - The loose-match note's advice is reversed where it suggested raising
--min-kmer-copies; on a deep
mixed library the threshold now has to come down. - Evidence is shipped for every derived constant:
scripts/kmer_threshold_sweep.tsv,
kmer_threshold_simulated.tsv,loose_distance_calibration.tsv,
public_sweep_disagreements.tsv, withrecalibrate_loose_distance.pyandscore_public_sweep.py
deriving the published figures from them. - A fix in
validation/check_results.py, which after the rule change could fail a sample whose coverage
it had just accepted. - 392 tests, 100% statement and branch coverage.
Full detail: Changelog ·
The k-mer copy threshold