Skip to main content

vdjtools

vdjtools — immune-repertoire analysis

PyPI CI docs python license

TCR/BCR immune-repertoire analysis — a clean-room Python + C++ rewrite of the legacy Groovy/Java vdjtools, standardised on the AIRR schema and polars DataFrames with minimal object-orientation.

Built on the antigenomics ecosystem: seqtree (fuzzy search / e-value engine), vdjmatch (overlap + TCRnet), arda (AIRR annotation + markup repair).

Status: stable (version: the PyPI badge above). The native V(D)J model engine plus the full analytics suite (diversity, overlap/TCRnet, preprocessing, biomarkers, single-cell), longitudinal clonotype dynamics (paired expansion testing + the VDJtrack recapture model), CDR features, and legacy-format ingestion (MiXcr, MiGec, immunoSEQ, IMGT/HighV-QUEST, Vidjil, RTCR, TRUST4, arda). Clonotype columns follow the AIRR junction convention (junction_nt / junction_aa). The legacy v1.x tool lives on the legacy-1.x branch and its releases remain available under the repository tags (v0.0.1 … 1.2.1).

Install

pip install vdjtools

Prebuilt wheels ship for CPython 3.10–3.13 on Linux, macOS (Apple Silicon), and Windows; the native _core C++ extension is bundled (the source distribution compiles it on install).

That one command gives you everything vdjtools advertises — no extras to opt into. The three antigenomics engines it delegates to are base dependencies:

Engine Powers
arda the germline reference (V/D/J + CDR3 anchors), model engine, annotation
seqtree fuzzy search / e-values → error correction, similarity overlap, TCRnet
vdjmatch sample overlap, TCRnet, metaclonotypes

So preprocess.correct(), overlap.tcrnet(), biomarker.metaclonotypes() and model.reference.load_germline() all just work from a plain install — and downstream libraries can depend on plain vdjtools and rely on them being there. All three are imported lazily, so import vdjtools stays light; between them they add only requests on top of what vdjtools already needs. arda fetches its IMGT reference once, on first use.

Two things are still optional, because each has a working alternative or is a side integration:

pip install "vdjtools[overlap]"   # scikit-learn — only for cluster_samples(method="mds");
                                  # method="hclust" works out of the box (scipy)
pip install "vdjtools[sc]"        # single-cell: anndata + awkward + mudata (scverse
                                  # bridges), pyyaml (AIRR Cell export)

MMseqs2 is needed only for arda's alignment/annotation path (model.stitch.annotate) — never for germline lookup, Pgen, generation, or the analytics. Install it via conda/brew if you need it.

Development

Uses uv — one repo-local .venv, no conda:

uv venv && source .venv/bin/activate
uv pip install -e ".[dev,test]"       # builds the _core C++ extension (scikit-build-core)

Or run the bootstrap script (portable across bash/zsh, uv-first with a python -m venv fallback):

bash setup.sh --dev-parents --tests   # or: zsh setup.sh

You need a C++ toolchain (Xcode CLT on macOS, build-essential on Linux) for the native _core extension. MMseqs2 is arda's aligner, needed only for the annotation path and the slow arda round-trip tests — brew install mmseqs2, or use the optional environment.yml conda env which bundles it.

Where to start

You want to Go to
Load samples and run diversity / overlap / usage Quickstart · User guide
Clean, filter, downsample, batch-correct a cohort Pre-processing
Pgen, V(D)J markup, generate sequences, fit a model Model engine · Models
One fixed feature vector per sample, for a classifier Repertoire signatures · Signature
Single-cell / 10x / scirpy / Dandelion interop Single cell
Worked examples as notebooks Notebook gallery

Quickstart

Read any format, get one canonical AIRR frame, and run the analyses the tool is for:

from vdjtools import io as vio, stats, overlap

sample = vio.read("clones.tsv")                 # MiXcr / immunoSEQ / AIRR / Parquet / native — sniffed
cohort = vio.read_samples(vio.read_metadata("metadata.txt"), base_dir="samples/")

stats.diversity.diversity_stats(sample)         # richness, Chao, Shannon, Simpson, d50
stats.usage.segment_usage(sample, segment="v")  # V / J / VJ usage
stats.spectratype.spectratype(sample)           # junction-length spectrum
overlap.overlap_matrix(cohort)                  # pairwise repertoire overlap

The same thing without Python at all:

vdjtools diversity     sampleA.tsv sampleB.tsv -o diversity.tsv
vdjtools overlap       *.tsv -o overlap.tsv
vdjtools segment-usage -m metadata.txt --base-dir samples/ -t 0 -o usage.tsv

Command line

pip install vdjtools installs the vdjtools command — the model engine (OLGA/IGoR-style) and the repertoire analytics (over sample files or a metadata table, like the legacy tool):

# recombination model engine — built-in models for all 7 loci (no download)
vdjtools models                                # list the bundled models
vdjtools generate -m TRB -n 1000 -o gen.tsv    # sample sequences   (cf. olga-generate_sequences)
vdjtools pgen seqs.tsv -m TRB -o pgen.tsv      # Pgen per CDR3       (cf. olga-compute_pgen)
vdjtools pgen seqs.tsv -m TRB --mismatches 1   # + the Hamming-1 ball; --v-col/--j-col to condition

# model workshop — a model is a directory, or LOCUS[:source[:organism]]
vdjtools model check TRB:learned                     # audit vs its germline; exits 1 on an error
vdjtools model template --locus TRB -o tmpl/         # scaffold from arda, or your own --germline-v/-j
vdjtools model learn clones.tsv -t tmpl/ -o fitted/  # EM on your sequences (--init template = fine-tune)
vdjtools model log fitted/                           # log-likelihood per iteration
vdjtools model diversity TRB:olga                    # entropy + total diversity estimate
vdjtools model compare TRB:olga TRB:learned --by gene --dot diff.pdf
vdjtools model loglik seqs.tsv TRB:learned           # log-likelihood, free parameters, AIC, BIC
vdjtools model extend fitted/ --locus TRB -o bigger/ # add a larger allele library
vdjtools model export TRB:olga --long -o marginals.tsv

# data — convert any format to the canonical table (TSV, or Parquet by extension), preprocess
vdjtools convert mixcr.txt.gz -o clones.parquet   # MiXcr/immunoSEQ/AIRR/… → canonical Parquet
vdjtools downsample clones.parquet 100000 -o ds.tsv

# filtering — THREE SEPARATE AXES, deliberately separate flags:
#   --productive       the REARRANGEMENT encodes a chain   (AIRR: in frame, no stop codon)
#   --functional-genes the GERMLINE GENE is real           (IMGT: F / ORF / P)
#   --min-len/--max-len  junction_aa length, INCLUSIVE     (default sanity bound 5..60)
# A productive rearrangement can still use a pseudogene V — filtering one says nothing
# about the other.
vdjtools filter clones.parquet --productive --min-freq 1e-4 -o productive.tsv
vdjtools filter clones.parquet --nonproductive -o nonproductive.tsv   # isolate them instead
vdjtools filter clones.parquet --functional-genes --keep-orf -o f_orf.tsv
vdjtools filter clones.parquet --productive --keep-frequencies -o kept.tsv  # file's own freqs

# cross-batch V/J-usage bias — correct the usage, and rewrite the clonotype tables
vdjtools correct-vj s1.tsv s2.tsv s3.tsv s4.tsv -b A,A,B,B \
    --transform sigmoid --usage-out usage.tsv --outdir corrected/

vdjtools pool s1.tsv s2.tsv s3.tsv --join --min-samples 2 -o joint.tsv

# repertoire analytics — sample files, or a cohort via -m/--metadata + --base-dir
vdjtools diversity      sampleA.tsv sampleB.tsv -o diversity.tsv
vdjtools overlap        *.tsv -o overlap.tsv
vdjtools segment-usage  *.tsv --segment v -o usage.tsv
vdjtools spectratype    *.tsv -o spectra.tsv
vdjtools diversity      -m metadata.txt --base-dir samples/ --threads 8 -o div.tsv   # parallel cohort
vdjtools spectratype    --cohort cohort_parquet/ -o spectra.tsv                       # one streamed pass

# the portable signature — one fixed, named feature vector per sample (see below)
vdjtools signature      --preset classify -m metadata.txt --base-dir samples/ -o sig.tsv

# longitudinal — paired within-donor expansion test between two timepoints
vdjtools dynamics day0.tsv day15.tsv -o tracked.tsv

Native vdjtools, AIRR Rearrangement, Parquet, and third-party inputs are auto-detected; every command writes to -o — TSV, or Parquet when the path ends in .parquet / .pq — or to stdout (so it pipes). Cohort commands parallelise over samples with -t/--threads or stream a pre-ingested Parquet cohort with --cohort. Run vdjtools <command> --help for options.

Analytics (Python API)

Every reader returns one canonical polars clonotype frame (AIRR junction columns), and every analysis function takes and returns such frames — so results chain together and drop straight into plotting. A tour of the analysis modules (full runnable walkthrough in the User guide):

from vdjtools import io as vio, stats, features, overlap, preprocess

# load (auto-detects MiXcr / immunoSEQ / AIRR / native / … and converts), or a whole cohort:
sample = vio.read("clones.tsv")
cohort = vio.read_samples(vio.read_metadata("metadata.txt"), base_dir="samples/")

# diversity, rarefaction, segment usage, spectratype
stats.diversity_stats(sample)                 # observed, Chao1, Shannon, inverse-Simpson, d50, …
stats.inext(sample, q=(0, 1, 2))              # Hill-number rarefaction/extrapolation + bootstrap CIs
stats.segment_usage(sample, "v")              # V (or "j") usage;  stats.spectratype(sample)

# CDR3 physicochemistry & k-mers
features.physchem_profile(sample, region="all")

# repertoire overlap & TCRnet (fuzzy/similarity/TCRnet via the [overlap] engine)
overlap.overlap_metrics(sampleA, sampleB)     # F / D / Jaccard / Morisita-Horn …
overlap.tcrnet(sample)                         # per-clonotype neighbourhood enrichment

# preprocessing: downsample to a common depth, error-correct, filter, pool
preprocess.downsample(sample, 100_000)
preprocess.correct(preprocess.filter_productive(sample))

# three filtering axes, kept apart: AIRR productivity, IMGT gene functionality, length
preprocess.filter_productive(sample, recompute_frequencies=False)  # keep the file's freqs
preprocess.filter_functional_genes(sample, keep=("F", "ORF"))      # IMGT axis
preprocess.filter_length(sample, min_len=5, max_len=60)            # inclusive bounds

# cross-batch V/J-usage bias: batch-correct usage, then resample the clonotype table
usage = preprocess.correct_vj_usage(cohort, batch_col="batch", transform="sigmoid")
fixed = preprocess.apply_vj_correction(sampleA, usage, sample_id="A0")

The portable signature — one repertoire in, a fixed named positional feature vector out, on a scale a downstream model can consume without fitting a scaler of its own. This is the statistics half (vsig); the geometry half (rsig, features of the prototype-sum embedding) is mirpy's mir.signature, and the two concatenate on sample_id into one contract:

from vdjtools.signature import vsig, vsig_cohort, columns, describe

v = vsig({"TRB": sample}, tier="standard")    # {column: value}, in frozen layout order
describe("standard")                          # the column dictionary

Every feature carries a variance-stabilising transform chosen from its support — Haldane–Anscombe logit for a proportion, Anscombe arcsine for a share, CLR (k−1 parts) for a composition, log for a count — so that a read count, an isotype fraction and a principal component can sit in one matrix. core ⊂ standard ⊂ full are exact index subsets of one frozen column order. A locus that was not sequenced is nan plus a mask: column, never a zero.

Longitudinal tracking — which clonotypes changed between two timepoints, and the VDJtrack recapture model (Pavlova, Zvyagin & Shugay 2024):

from vdjtools import dynamics

# paired within-donor test: emergent / expanded / persistent / contracted / vanishing
tracked = dynamics.test_pair(day0, day15)                  # depth handled per-pair (effective N)
grouped = dynamics.test_metaclonotypes(day0, day15, scope="1,0,0,1")  # 1-Hamming CDR3 ball first
called  = dynamics.expansion_test(day0, day15)             # edgeR NB-exact caller (log2FC + p)

# VDJtrack size-bucket recapture model — recapture fraction per clone-size class (Beta bands);
# split by a group column + capture_test() for the group effect (see examples/vaccination_tracking.py)
rates = dynamics.capture_rates(pre, post)

Incidence-based clonotype association (Emerson 2017 / Howie 2015 / De Witt 2018 / Vlasova 2026) — a choice of test, condition, and co-occurrence — and single-cell paired-chain Pgen:

from vdjtools import biomarker, sc
from vdjtools.biomarker import association, condition

# feature vs condition: Fisher / chi2 / Bayesian / permutation; binary, per-HLA-allele, or CMH-stratified
association(cohort, condition.binary(meta, "cmv"), test=["fisher", "bayes_bf"])
association(cohort, condition.stratified(meta, "cmv", "hla"), stratum_col="_stratum")  # CMV | HLA (CMH)

# feature vs feature: in-silico α-β pairing / same-chain co-specificity (θ lift + Fisher + FDR)
biomarker.cooccurrence(cohort, chain_a="TRA", chain_b="TRB", evalue=True)

sc.paired_pgen(sc.pair_chains(sc.read_10x("filtered_contig_annotations.csv")))  # pgen_alpha·pgen_beta

Repertoire signatures (extended)

An optional layer on top of the analytics above, for when the question is a model rather than a statistic: one AIRR sample in, one fixed-width, named, already-standardised feature vector out — so your matrix and a collaborator's are the same coordinate system, computed independently, with no scaler of your own.

vdjtools signature --preset classify -m metadata.txt --base-dir samples/ -o vsig.tsv
vdjtools presets                       # the named feature sets, ranked
vdjtools signature --describe          # the exact columns, reading no input
vdjtools signature --channels          # the channel vocabulary — what each group of columns measures
from vdjtools.signature import vsig, vsig_cohort, channels, describe

Columns are <sig>:<channel>:<locus>:<feature>, and the tiers core (152) ⊂ standard (688) ⊂ full (1403) are exact index subsets of one frozen order. The second field is the channel — the named group of columns that measures one thing, and the level a finding is stated at ("the groups separate in IGH diversity"). Twenty channels cover the whole vector.

This command emits the statistics half (vsig). The geometry half (rsig) needs the prototype embedding and lives in mirpy — mir signature emits both as one vector, which is usually what you want.

Full documentation, including which scale reference to use and what "weighted" means: Signature · Channels

Recombination model engine

Precomputed models for all 7 human loci ship in the wheel — no OLGA or download needed:

from vdjtools.model import load_bundled, native
from vdjtools.model.generate import generate

model = load_bundled("TRB", source="olga")     # or source="learned" (fit to real repertoires)

native.pgen_nt(model, "TGTGCCAGCAGC...")        # nucleotide generation probability (native C++)
native.pgen_aa(model, "CASSLAPGATNEKLFF")       # amino-acid Pgen (codon-marginalised)
native.pgen_aa(model, "CASSLAPGATNEKLFF", mismatches=1)   # + the whole Hamming-1 ball
native.pgen_aa_batch(model, seqs, mismatches=1, threads=0)  # Pgen over many CDR3s, thread-parallel (~11×)
generate(model, 1000, seed=1)                    # sample a repertoire -> polars DataFrame
                                                # seed= is process-stable from 3.3.0

Where Pgen sums over recombination scenarios, model.viterbi takes the argmax — the single most likely one, which is the V/D/J boundary markup:

from vdjtools.model import best_scenario

sc = best_scenario(model, "TGTGCCAGCAGCTTAGGGACAGGGGGCTACGAGCAGTACTTC",
                   v="TRBV19*01", j="TRBJ2-7*01")     # ALLELE names, as the model's tables are

sc.v_end, sc.d_call, sc.d_start, sc.d_end, sc.j_start   # 0-based, half-open, in CDR3-nt space
# -> 8, 'TRBD1*01', 15, 24, 26

It reuses the same tables and the same loops as pgen_nt, so the chosen D obeys P(D|J) — a TRBD2–TRBJ1 pair is genomically impossible and cannot be called.

infer_nt goes the other way, reconstructing a nucleotide CDR3 from an amino-acid one — the VDJdb case, where a record carries (V, J, CDR3aa) and no nucleotides:

from vdjtools.model import infer_nt

sc = infer_nt(model, "CASSLGQAYEQYF", v="TRBV5-1*01", j="TRBJ2-3*01")
sc.cdr3_nt, sc.pgen, sc.margin        # sequence, its exact Pgen, and how far ahead of the runner-up

Germline positions are pinned to their segment; each free N-region position takes the nucleotide the insertion model prefers. It reproduces the exponential brute-force oracle exactly on every record the oracle can resolve (25/25 TRG, 19/19 TRA) — fixing the germline trim first and then picking the best codon per residue only manages 9/25 and 4/19, because a trim chosen before the codons pins a codon the true optimum would have trimmed away.

The search is native (the same Pi_L·Pi_R transfer matrix as pgen_aa, with max for the sums): 2.5 ms per human TRB CDR3, 0.5 ms per TRA — all 80k VDJdb records in about 3 minutes. v=/j= take one allele, several (a list or the comma-separated string an ambiguous v_call carries), or nothing at all, in which case the DP marginalizes over every gene at essentially no extra cost.

Matches OLGA's Pgen to machine precision across all 7 loci, and adds tandem-D (D-D) support that OLGA/IGoR lack. Learn a model from your own non-functional reads (out-of-frame or stop-codon — both escaped selection, which is all a generative model needs) with model.infer.infer_native.

Explore any model's recombination Bayes net interactively (entropy, mutual information, marginals):

pip install "vdjtools[examples]"
marimo edit examples/model_explorer.py

Interactive marimo notebooks (data auto-loads from HuggingFace, or a local ~/hf/ copy):

  • examples/vaccination_tracking.py — clonotype tracking + the recapture model across yellow-fever / influenza / TBE vaccination time courses (vdjtools.dynamics).
  • examples/aging.py — cohort-streaming diversity, clone-size and spectratype vs age.
  • examples/ankspond_motif.py — the ankylosing-spondylitis TRBV9 "AS27" motif: disease vs HLA-B27 carriage.
  • examples/biomarker_explorer.py — Emerson public-TCR association + co-occurrence.

Performance

The Pgen / generation / EM / diversity hot paths are a native C++ (pybind11) core; everything else is polars. Amino-acid Pgen matches OLGA to machine precision (1e-15) across all 7 loci while being several times faster, and the built-in models keep the resident set small. Single thread, Apple M3 (arm64), bundled human TRB model:

operation throughput vs OLGA
nucleotide Pgen (single-D VDJ) ~0.5 ms/seq 9×
amino-acid Pgen ~0.6–0.9 ms/seq 8.6×
Pgen + Hamming-1 ball (1 substitution) ~15 ms/seq 8.7×
sequence generation ~32 000 seq/s —

Nucleotide Pgen (via the same transfer-matrix DP as the aa path — an in-frame CDR3 is an aa query with one codon fixed per position) is exact vs OLGA across all loci. Batched Pgen / 1-mismatch over many CDR3s parallelises over sequences (native.pgen_aa_batch, ~11× on 16 cores, bitwise-identical to the serial result); the EM E-step parallelises over reads (~6.7× on 8 threads); diversity/rarefaction run on a native iNEXT kernel (bootstrap + parallel batch). Memory stays light — ~63 MB resident for import vdjtools plus one loaded model, ~123 MB with all seven bundled models resident. Reproduce the in-repo half with RUN_BENCHMARK=1 pytest tests/python -k benchmark; the standalone Pgen harness lives in the separate 2026-vdjtools-benchmark repository.

Capabilities

Reference: the User guide walks through every module with runnable examples; the API reference documents every symbol.

  • IO — canonical clonotype frame on AIRR junction columns (junction_nt / junction_aa); readers for native vdjtools, AIRR Rearrangement TSV, and Parquet, plus format-detecting converters for MiXcr (v1/2 + v3/4, incl. C-gene / BCR isotype), MiGec, Adaptive immunoSEQ (v1/v2), IMGT/HighV-QUEST, Vidjil, RTCR, TRUST4, and arda AIRR output (vdjtools.io.convert); metadata-driven batch + hive-partitioned cohorts.

  • Model — native V(D)J recombination model: generation probability (Pgen — nt, aa, 1-mismatch, V/J-agnostic, thread-parallel batch), sequence generation, and EM inference, all in a native (pybind11) core. Supersedes OLGA and IGoR: arda-driven scenario enumeration, polars marginal tables, read-parallelised EM, and tandem-D (D-D) support. Concordant with OLGA across all 7 loci; precomputed OLGA + real-data-learned models bundled (load_bundled).

  • Model workshop (user guide) — build a model on your own V(D)J germline library (from_germline, FASTA + anchors) and fit it to your own sequences; export and re-import every marginal as tables; check a model against its germline (check_model — functional genes stuck at P=0, unreachable deletion mass, incomplete conditionals); read the EM training log and per-iteration likelihood; compare two models (per-event Jensen-Shannon / total variation, gene usage, a bnlearn-style comparison graph) and their Pgen distributions; compute log-likelihood, AIC and BIC of a clonotype set under a model; fine-tune it, extend it with a larger allele library, and re-weight V/J usage for protocol bias. Plus information content per recombination event and a total diversity estimate (human TRB: ~52 bits per rearrangement, ~45 bits per sequence, ~3·10¹³ effective sequences).

  • Stats — diversity (Chao1/Shannon/Simpson/…), spectratype, V/J/VJ usage.

  • Features — CDR physicochemical profiles, k-mer / V+k-mer summaries.

  • Overlap — sample overlap and TCRnet (via vdjmatch/seqtree), similarity-aware overlap, clustering.

  • Preprocess — downsampling, error-correction, VJ-usage batch-effect correction, pooling/joining.

  • Biomarker — incidence association (Fisher / χ² / Bayesian / permutation) against binary, per-HLA-allele or CMH-stratified conditions; α-β and same-chain co-occurrence pairing; metaclonotypes.

  • Dynamics — longitudinal clonotype tracking between timepoints: the paired within-donor expansion test (emergent / expanded / persistent / contracted / vanishing), the VDJtrack size-bucket recapture model, metaclonotype-grouped testing, and an edgeR NB-exact caller (vdjtools.dynamics).

  • Single-cell — CellRanger / AIRR Cell / arda ingestion, chain pairing + doublet & mispairing QC, paired α/β Pgen, clustering evaluation, and round-trip interop with the downstream single-cell stack (vdjtools.sc, guide).

    Ecosystem Out Back in Needs
    scirpy / scverse to_scirpy (scirpy's obsm["airr"], or a MuData with GEX) from_scirpy scirpy out; only awkward back
    dandelion to_dandelion from_dandelion, read_h5ddl sc-dandelion out; only h5py back
    scRepertoire (R) write_screpertoire (AIRR or 10x shaped) — nothing
    Any AIRR consumer to_airr / write_airr from_airr, read_airr_cell nothing

    All four read the same thing — a flat AIRR Rearrangement table with sequence_id + cell_id — so there is one emitter and one inverse, and each bridge is a thin adapter. Writing a container delegates to the library that owns it (no stale copy of someone else's schema to drift); reading one is ours, so a result handed to you is always openable. push_obs pushes a vdjtools-computed column (pgen_paired, mispairing flags) onto an AnnData.obs or Dandelion.metadata you did not build. CLI: vdjtools sc convert|pair|qc|pgen|export.

License

GPL-3.0-or-later.

Release files for vdjtools 3.16.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vdjtools 3.16.0
File Size Uploaded
vdjtools-3.16.0.tar.gz 1.4 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for vdjtools 3.16.0
File
vdjtools-3.16.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
vdjtools-3.16.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
vdjtools-3.16.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
vdjtools-3.16.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
vdjtools-3.16.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
vdjtools-3.16.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
vdjtools-3.16.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
vdjtools-3.16.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
vdjtools-3.16.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
vdjtools-3.16.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
vdjtools-3.16.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
vdjtools-3.16.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 22.8 MB

Release files / vdjtools-3.16.0.tar.gz

Download URL vdjtools-3.16.0.tar.gz
Size 1.4 MB
Tags Source
SHA-256 checksum
How to use checksums
5a6402eac50d7ef0688a345e6a974f881a88e3b3c36cccbcf0af739705a07800
BLAKE2b-256 checksum
How to use checksums
d3224be26bd4c5a04530594f26190600fd176de7166f7226cfa6aa06b8750877
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp313-cp313-win_amd64.whl

Download URL vdjtools-3.16.0-cp313-cp313-win_amd64.whl
Size 1.8 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
403523e9b48797237d9064518e75c414d33209ac13336a2c357226092c9fbf95
BLAKE2b-256 checksum
How to use checksums
e639b9fe6be97a422e94e0724bf622fff0ff14b417037b762fb51290deed3674
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL vdjtools-3.16.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.8 MB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
df5f7386ad981b7ad60b4774e1f5589c6082bcce9fb96202159933c5b5a0f20f
BLAKE2b-256 checksum
How to use checksums
b25fcc1df3f2df3a3941e1dd0f4332a32034c15c8d1416f8d22ab0707236facd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL vdjtools-3.16.0-cp313-cp313-macosx_11_0_arm64.whl
Size 1.8 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
17e3177a6e44605a6a8785a31208398e70bd25cca902c83d2f1f8226d71edca3
BLAKE2b-256 checksum
How to use checksums
840f74f17eac1e95f071159466d726536fae042f9d578363053062718ed8f60e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp312-cp312-win_amd64.whl

Download URL vdjtools-3.16.0-cp312-cp312-win_amd64.whl
Size 1.8 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
e2cc86205946838e8d2ef35147a3efbd0220d8f92d47d720a1ff3e5781f23845
BLAKE2b-256 checksum
How to use checksums
a5061b61bb29a41575f330044525ee2ff2a969a1d8bd92ec1ac1cc4c4e899017
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL vdjtools-3.16.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.8 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
080bc65c864f9fc965835421956d382babd1630c1da667efa4883fe719e16a07
BLAKE2b-256 checksum
How to use checksums
ca4059b649fe66c9c0a2ba69d1b96ab6015eb1442393a1575c6a66b5ec33916a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL vdjtools-3.16.0-cp312-cp312-macosx_11_0_arm64.whl
Size 1.8 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
92e3eeeeeb128af6eae521c90856dc77523a83c070c2cd03e1ef0ed3019805a8
BLAKE2b-256 checksum
How to use checksums
d198d80bcfdee1b1c66e2da82ddb04adf2057739e26d6c27733f92132838e0a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp311-cp311-win_amd64.whl

Download URL vdjtools-3.16.0-cp311-cp311-win_amd64.whl
Size 1.8 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
1a9b1d1742a82c223df27ddc6b39249eb47f25e0e8fdeba86ffe339bbc3c636c
BLAKE2b-256 checksum
How to use checksums
f27bb9c5699a563dfe675286d88a5c07b4824159e46839bb5b9d031633cbfff1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL vdjtools-3.16.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.8 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
8d79d5281a742730b576302376014ec5417974fe60316fa49310b0f69ba3ea3c
BLAKE2b-256 checksum
How to use checksums
8ed227a1fbc3958dd26583e37d548afe404db027503b18e8e3ad51b233c1a7ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL vdjtools-3.16.0-cp311-cp311-macosx_11_0_arm64.whl
Size 1.8 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9268b0f7252bb97060563d24bfc9fc4a8a0f23aa6578a4a84725f04a2fd8f980
BLAKE2b-256 checksum
How to use checksums
4bd77b621b2e165045b41ac69e4432f1f11e5a318214b85c8d8570de42ff521b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp310-cp310-win_amd64.whl

Download URL vdjtools-3.16.0-cp310-cp310-win_amd64.whl
Size 1.8 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
d09829ea1989d595b1d0a12b610c9cdd5c4a5b42f97f0ac54ae87ef5c79f3b7d
BLAKE2b-256 checksum
How to use checksums
3294afab66ea433eaa594ab1405d98470f3f6d4f0e7db63ca8663b28f350162a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL vdjtools-3.16.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.8 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
abaf1e437433afb247db14b87db2d330d4b9d46fbba8fe564383e073e5ca8831
BLAKE2b-256 checksum
How to use checksums
b1e900f9f959eb0c89fd0765660bb2387cada0ad72ec2ad7d6dd0c3fb88e6b3c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / vdjtools-3.16.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL vdjtools-3.16.0-cp310-cp310-macosx_11_0_arm64.whl
Size 1.8 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
be5e2b8d81b701946ba8aacf30d2b9857931cf3d5b15767bbb20181f96843edd
BLAKE2b-256 checksum
How to use checksums
a74dcc9e99d357c9558f52442c9d32a8bc6d25720eab3df0213ff08d5cdc1bee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page