2.33.0 — the repair policy, and the D posterior moves to vdjtools
Closes #141, #142, #143, #144.
The repair policy: when it is not certain, flag it — do not change it
cdr3fix admits four edits, in this order, and rewrites nothing else:
- re-call the V or J when another allele explains 2 more residues contiguously from its own anchor and does not break an anchor the submission already holds;
- trim framework past that allele's anchor;
- add back germline the submission was cut inside of;
- substitute the first or last residue only, to the anchor, on a solid match.
A residue disagreeing with germline inside the templated run is reported (new mismatch flag) and left as submitted — a curation error and an allele IMGT does not record are indistinguishable from one junction. The previous behaviour turned CAAAETSYDKV{M,R,T,V}F on TRAJ50 into four copies of CAAAETSYDKVIF.
_RECALL_GAIN = 2 is measured against isalgo/airr_control's nucleotide-called V/J on 3,059 human TRA and 426 human TRB curation keys: the smallest margin at which no re-call moves a call away from the nucleotide answer.
Against the authoritative VDJdb 2026-06-03 release, all 187,488 keys
| 2.32.0 (unreleased) | 2.33.0 | |
|---|---|---|
| repaired junction agrees | 98.3604 % | 99.8352 % |
| the release's own repairs reproduced | 4,267/4,499 | 4,331/4,499 |
| rewrites the release never ships | 2,842 | 141 |
| — into an already-canonical junction | 2,744 | 35 |
| non-canonical junctions shipped (release: 715) | 709 | 677 |
arda ships fewer malformed junctions than the release it is measured against. Reproduce with scripts/compare_vdjdb_release.py.
BREAKING: arda.dpost moved to vdjtools.model.posterior_d
A posterior over the D gene marginalises model distributions, so it belongs with the recombination model (#144). Ported, not rewritten: identical field-for-field on 3,000 real human TRB junctions, and it gained the batch entry point #142 asked for. arda markup --d-posterior / --d-prior are gone. The prior table, its fitter and its new reader (arda.scenarios.load_prior_table) stay here.
Needs vdjtools>=4.8.0 for the posterior.
Also
v_alts/j_alts— the alleles a junction cannot separate travel with the answer, for the nucleotide stage to settle.map_d_junction(v_end=, j_start=)— take the interior instead of re-deriving it from an inferred sequence.arda.hmmdeprecated: nothing consumes it, andvdjtools.model.infer_nt_batchanswers the same question batched and in C++.- #143 is closed by the 2.32.0 port — there is no Python alignment DP in
cdr3fixany more; throughput is 28,900 keys/s including the new per-record re-call.
1,312 tests pass.