mantispy.ds.jump_lite

Contents

mantispy.ds.jump_lite#

mantispy.ds.jump_lite(model='openphenom', annotate=True, cache_dir=None)[source]#

JUMP-Lite Target-2: 1,536 wells, four imaging sites, one feature set at a time.

cpg0016-jump, the compact benchmark of Muñoz et al. [2026]. Four plates of the JUMP Target-2 plate map, one from each of source_3, source_4, source_5 and source_6, so the four batches are four different laboratories running the same 302 compounds with 64 DMSO wells each.

Every model covers the same 1,536 wells, which is what makes this a comparison rather than six datasets: the rows, their order and the metadata are identical and only the feature block changes. The files list the wells in a different order for every model, so the rows are sorted by plate and well and every model is aligned. Five are learned embeddings and one, "cp_measure", is the CellProfiler-equivalent measurement of the same images.

The annotated object for each model is pre-built by scripts/build_staged_datasets.py and rehosted on scverse-exampledata, so the annotated call fetches a single h5ad rather than joining the count and annotation tables on every call. Passing annotate=False still assembles the un-annotated wells directly.

Parameters:
  • model (str (default: 'openphenom')) – Which feature set to read, one of ds.JUMP_LITE_MODELS. "dinov2_random" is the same architecture with untrained weights, which is the null model the benchmark scores the others against.

  • annotate (bool (default: True)) – Fetch the annotated object, which joins the JUMP well and compound tables that name the compound of each well. False assembles the un-annotated wells without that join.

  • cache_dir (str | Path | None (default: None)) – Where to keep the download. Defaults to mantispy.settings.cache_dir.

Return type:

AnnData

Returns:

Wells by features at well resolution, indexed by plate and well, read with mantispy.io.read() when annotated, with Metadata_Source, Metadata_Batch, Metadata_Plate, Metadata_Well, Metadata_CellCount and, when annotated, Metadata_JCP2022, Metadata_Perturbation, Metadata_Perturbation_Type ("compound"), Metadata_InChIKey and Metadata_Control.

Raises:

ValueError – model is not one of ds.JUMP_LITE_MODELS.

Notes

A dimension of a learned embedding is a coordinate in the model’s own basis, not a measurement with a name to parse, so for every model but "cp_measure" the annotation columns of var are supplied empty. Anything that reads var["feature_group"] or var["channel"], such as the feature families effect_sizes() colours by, has nothing to work with on those.

"cp_measure" is CellProfiler-style measurements and keeps its parsed compartment, feature group and channel. Its channel is the index cp_measure numbered its inputs by rather than the name of a stain, because the name lives in the acquisition metadata and not in the feature name.

The embeddings are not normalized. They are the model’s output on each well’s images, so a per-plate control normalization is still the first step.

The trained embeddings here carry the cell count in their leading components, where it can account for more of the variance than either the laboratory or the imaging site. The untrained "dinov2_random" does not, and neither does "cp_measure", whose per-cell measurements are averaged over the well. Measure it with evaluate_correction() before correcting for anything else, and read Learned embeddings against CellProfiler on why removing it is not obviously right.

References

Muñoz et al. [2026], Chandrasekaran et al. [2023], Weisbart et al. [2024].