Skip to content

v0.3.0 — gap-block alignment, calibrated cutoffs, batch scoring, island profiles

Choose a tag to compare

@mikessh mikessh released this 10 Jul 10:41
· 46 commits to master since this release

Gap-block alignment, calibrated cutoffs, batch scoring, and per-island profiles — plus a corrected background control that changes every E-value.

Added

  • gapblock — single contiguous-indel alignment for V(D)J junctions, the position set by a gap prior (central_prior, profile_prior, frame_prior, positions_prior) rather than the score alone. Exactly optimal against unrestricted affine alignment on 98.8% of genuinely related pairs at a calibrated gap_open.
  • gapblock.score_matrix / ScoreMatrix — every query × every reference in one GIL-released C++ call: ~532 M pairs/s on 16 cores, numpy.asarray is zero-copy, and seqtree keeps its zero runtime dependencies. The shape a prototype-distance embedding needs, where nothing can be pruned.
  • gapblock.IslandProfile — a per-island position weight matrix whose column penalty is measured against the column consensus, so it stays ≥ 0, is 0 on the consensus, and flows through threshold_for_evalue unchanged. Beats min-over-members only at a strict cutoff (48.5% vs 37.6% at repertoire scale; indistinguishable at a loose one).
  • threshold_for_evalue / thetas_from_scores — the per-query score cutoff that achieves a target E-value, inverted exactly from the integer scores.

Breaking

  • The bundled control is regenerated as a uniform sample of productive clonotypes (it was the abundance head, 25.8× too self-similar). Every E-value moves. After upgrading, delete ~/.cache/seqtree/control_*.sqtree so the cached index is rebuilt from the corrected control.
  • engine="auto" always resolves to seqtm; passing a matrix to seqtrie without an explicit max_penalty now raises. GapPrior takes (block_start, block_length, longer_length).

Full detail in CHANGELOG.md.