Skip to content

BrucellaID 2.1.0

Choose a tag to compare

@duceppemo duceppemo released this 08 Nov 19:38
· 16 commits to main since this release

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-distance is 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, with recalibrate_loose_distance.py and score_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