SAWA
ActiveAntiretroviral-resistance surveillance for sub-Saharan Africa: version-pinned HIVdb Sierra resistance calls, HXB2 K03455 alignment, per-subtype phylogenies and transmission clustering, with every figure emitted from a notebook. No clinical claims.
- Python
- mappy
- IQ-TREE 2
- TreeTime
- tn93
- Marimo
- Docker
- GitHub Actions
Alignment via mappy at ~700 seq/s; a ~25k-sequence East Africa cohort aligns in under a minute on a laptop. Transmission clusters via tn93 at the 0.015 convention, with parity against HIV-TRACE on simulated ground truth. Benchmarks checked into git and refreshed weekly by CI.
Licence — MIT
docker compose up && make paper1What was broken.
Antiretroviral-resistance surveillance runs on a reference database that moves, tooling that assumes a reference build, and figures that arrive in a manuscript as images. A surveillance number nobody can regenerate six months later is not a result, and a mismatched reference build gives you a plausible wrong one instead of an error. These are research tools; no clinical claims are made for them.
How it is wired.
Resistance calls come from HIVdb Sierra, pinned to a specific release and cached locally rather than taken from whatever the service serves that week. Sequences align to HXB2 K03455 through mappy. Per-subtype phylogenies are built in IQ-TREE 2 under GTR+F+I+G4 and dated with TreeTime; transmission clusters come from tn93 at the 0.015 convention. The biological dimensions — organism, reference build, coordinate system, sample order, identifier namespace — come from ligase and are checked when the pipeline is assembled, before a step runs. Every figure is emitted from a Marimo notebook, and the whole pipeline comes up under Docker in one command.
What I shipped.
- Version-pinned, locally cached HIVdb Sierra resistance calls
- HXB2 K03455 alignment through mappy at ~700 seq/s
- Per-subtype phylogenies in IQ-TREE 2 (GTR+F+I+G4), dated with TreeTime
- Transmission clustering via tn93 at the 0.015 convention, checked for parity against HIV-TRACE on simulated ground truth
- Every paper figure emitted from a Marimo notebook, regenerated in one command
- Benchmarks checked into git and refreshed weekly by CI
Why these choices.
Pinned the resistance database rather than tracking it: a surveillance series whose calls change underneath it is not a series. Checked clustering against an established tool on simulated data, where the answer is known in advance, rather than against its output on real cohorts, where agreement proves only that two tools share an assumption. MIT, because a surveillance tool a public-health lab cannot run is a paper rather than a tool.