SAbR
SAbR (Structure-based Antibody Renumbering) assigns antibody residue numbers from backbone coordinates. It combines the original trained Haiku encoder with the original affine Smith–Waterman alignment and ANARCI numbering rules.
SAbR is intentionally small and feature-complete. It provides one Python API and one command-line program.
The complete usage guide is available in the SAbR documentation.
Installation
SAbR requires Python 3.11 or newer.
pip install sabr-kit
Command line
sabr -i antibody.pdb -c H -o numbered.pdb
The complete interface is:
sabr -i INPUT -c CHAIN -o OUTPUT
[-n imgt|chothia|kabat|martin|aho|wolfguy]
[-t auto|TYPES]
[--noise-level 0.0|0.2|0.5|1.0|2.0]
[-m sabr|softalign]
[--residue-range START END]
[--scfv]
[--dangerously-allow-structural-gaps]
[--no-mmcif]
[--overwrite] [-v]
Defaults are IMGT numbering, automatic H/K/L selection, noise level 0.0,
sabr mode, and the entire selected chain. --chain-type accepts a
comma-separated set of candidates. Each candidate is a sequence of H, K,
and L domains: H,K tries heavy and kappa single domains, HK,HL tries
heavy-kappa and heavy-lambda two-domain chains, and HHK,HHL tries the
corresponding three-domain chains. Existing outputs are never replaced unless
--overwrite is given. Normal output contains only warnings and errors; -v
reports reference scores and pipeline decisions.
Use --mode softalign to select the original SoftAlign encoder weights,
reference embeddings, and affine gap penalties together. SoftAlign references
do not vary with --noise-level, so that option is ignored in this mode.
Use --scfv to search only the scFv candidate set. It is equivalent to
--chain-type HK,HL,KH,LH and still requires the default automatic chain type
when used as a flag. Multi-domain results place successive domains in separate
1000-number residue blocks: 1–128, 1001–1128, 2001–2128, and so on.
Linker residues continue sequentially from the preceding domain's last number.
Multi-domain references use the selected parameter mode, so either form can be
combined with --mode softalign.
Input and output may be PDB (.pdb) or mmCIF (.cif or .mmcif). When a
requested PDB output needs multi-character insertion codes, SAbR warns and
automatically writes it to the corresponding .cif path instead. Pass
--no-mmcif to forbid this conversion and fail. Other values that exceed PDB
field limits still require an explicitly named mmCIF output. Writes are atomic,
so a failed run does not leave a partial output.
CLI conversion guarantees preservation of atomic structure content, not arbitrary non-atomic mmCIF categories. It warns for every mmCIF input.
Python API
from Bio.PDB import PDBParser
from sabr import renumber_structure
structure = PDBParser(QUIET=True).get_structure("antibody", "antibody.pdb")
numbered = renumber_structure(structure, chain="H")
renumber_structure accepts a Biopython Structure, never mutates its input,
and returns a new Biopython Structure. Non-target chains, hetero residues,
waters, and residues outside an inclusive residue_range are preserved. SAbR
rejects multi-model structures rather than silently modifying only one model.
If a partial range would create duplicate residue IDs with unchanged residues,
the operation fails with an explanation.
The copy preserves metadata represented by the input Biopython object.
Alternate conformers are normalized deterministically: a complete blank-altloc
backbone is preferred, then the complete conformer with the greatest summed
occupancy, with altloc name as the final tie-breaker. Selections above 1,024
polymer residues are rejected before quadratic model work; use
residue_range to select the antibody domain.
Modified peptide residues are translated only for sequence generation. Their
original names and atoms remain unchanged. The committed mapping was generated
from the wwPDB Chemical Component Dictionary snapshot dated 2026-07-11
(components.cif.gz SHA-256
0b3323123ec10b997afe1c530b4cad30306e60b451b2b062c59bc9bb5cbe0679) and
contains only peptide-linking components with exactly one canonical amino-acid
parent. Unsupported or ambiguous polymer chemistry fails explicitly; no
runtime network access occurs.
For unusually long loops that need extended insertion codes, use mmCIF output.
Scientific behavior
- The default
sabrmode preserves the trained SAbR encoder weights, references, and gap penalties unchanged. - The optional
softalignmode usessoftalign_encoder.npz,softalign_embeddings.npz, and the exact penalties insoftalign_gap.npzas one parameter set. - Alignment uses the original differentiable affine Smith–Waterman method.
- In
sabrmode, gap extension is-0.175027and gap opening is-2.525591. Insoftalignmode, they are0.1942468136548996and-2.5441808700561523, respectively, as stored in the repository asset. - Deterministic CDR gap distribution and DE-loop correction are always applied. Between IMGT anchors 79 and 85, DE-loop residues fill 80 first, then 84 back through 81; additional residues are inserted after 82.
- No deterministic C-terminal correction is applied.
- Automatic chain selection aligns against H, K, and L references and uses the highest score, with deterministic H/K/L tie order.
chain_typecandidate order is deterministic and resolves score ties.- scFv mode searches only the
HK,HL,KH,LHcandidate list in that order. - Multi-domain candidates do not apply gap-open or gap-extension costs to query linker residues aligned at any boundary between domain references.
- Multi-domain candidates receive normal affine gap-open and gap-extension costs for unaligned query and reference termini when their selection scores are compared; the underlying alignments and raw alignment scores are unchanged.
A structural gap is detected when the C–N distance between consecutive
residues exceeds 2.66 Å. SAbR refuses to run when a structural gap is
detected. To override this safety check, pass
--dangerously-allow-structural-gaps; a warning is printed before any other
runtime output. Python API callers can set
dangerously_allow_structural_gaps=True. When overridden, a gap skips only
the affected CDR or DE-loop correction and other regions continue normally.
T-cell receptors are not an officially supported SAbR target. For
experimental use, pass the actual TCR chain type (A, B, G, or D) with
--chain-type or chain_type. SAbR aligns only against the K reference,
which includes IMGT position 10 as TCRs do, while retaining the TCR type for
ANARCI conversion. This workflow is limited to IMGT and AHo numbering; the
other bundled schemes are antibody-specific.
Development
pip install -c constraints.txt -e '.[test]'
JAX_PLATFORMS=cpu pytest
pre-commit run --all-files
constraints.txt records the exact canonical development and CI environment.
Package metadata remains ranged for normal installation. SAbR does not force a
JAX backend; CPU is simply the canonical CI regression baseline.
The committed tests are self-contained and never download data. They verify the fixed asset hashes, encoder and alignment baselines, all numbering schemes, H/K/L selection, regional corrections, structure-object behavior, and CLI failure handling.
Deferred full benchmark
The historical pre-2021 SAbDab manifest contains approximately 1,012 chains. The current method scores about 90% on that set, not 100%. The full corpus is not bundled or downloaded by CI.
Future benchmark work should create a checksum-pinned corpus, verify residue IDs, insertion codes, and coordinate parity, and compare a lossless archive with Foldcomp before adding a separate manual or nightly workflow. This is a benchmarking TODO, not a unit-test or release requirement.
License and attribution
SAbR is distributed under the repository license. The vendored ANARCI
numbering code retains its original license in src/sabr/_anarci/LICENSE.
Release files for sabr-kit 0.4.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sabr_kit-0.4.6.tar.gz | 2.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sabr_kit-0.4.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 4.9 MB
Release files / sabr_kit-0.4.6.tar.gz
| Download URL | sabr_kit-0.4.6.tar.gz |
|---|---|
| Size | 2.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a1cb91dece728f76919fa26a25d8ec1f5e5d567f8a99148f2de833b005419a5f
|
|
BLAKE2b-256 checksum How to use checksums |
085019211ddc055aa447e5acd1903bfd6e707a4201ca29a26c092d8f4c26156c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / sabr_kit-0.4.6-py3-none-any.whl
| Download URL | sabr_kit-0.4.6-py3-none-any.whl |
|---|---|
| Size | 2.5 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
33c475e2e7caadaa6fcfa66cf4ac379803d2fda92d54eed34a0473084723f2f8
|
|
BLAKE2b-256 checksum How to use checksums |
21cf3cf0e3c0fa1eebe616b17ccd5e17e355102b18ef54497f0338f823c0d98a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|