{ "cells": [ { "cell_type": "markdown", "id": "0193e9c9", "metadata": {}, "source": [ "# Overview\n", "\n", "{mod}`mantispy.ds` ships example screens that span several assays and resolutions. This page places them against each other, so you can find the one closest to your own data, and then shows where the per-well cell counts come from.\n", "\n", "## Which dataset is like yours\n", "\n", "| dataset | assay and perturbation | unit of analysis | size | the example of |\n", "| --- | --- | --- | --- | --- |\n", "| [bbbc021](bbbc021.ipynb) | compound screen, 38 compounds and DMSO, MCF-7 | well | 632 wells, 103 treatments | the mechanism-of-action benchmark |\n", "| [rohban](rohban.ipynb) | ORF overexpression (gain of function), U2OS | well | 1,918 wells, 5 plates | pathway hits by overexpression |\n", "| [pki](pki.ipynb) | kinase inhibitors, few doses and many replicates, U2OS | well | 3,072 wells, 8 plates | hit calling and normalization |\n", "| [oasis_pilot](oasis_pilot.ipynb) | 36 compounds over a 10-point dose range, U2OS and HepaRG | well | 12 plates, two cell lines | concentration-response curves |\n", "| [jump_target2](jump_target2.ipynb) | one JUMP compound plate map run at every site | well | up to 141 plates, 11 sources | cross-laboratory batch effects |\n", "| [jump_crispr](jump_crispr.ipynb) | CRISPR knockout (loss of function), U2OS | well (guides as replicates) | 51,185 wells | an arrayed genetic screen |\n", "| [jump_lite](jump_lite.ipynb) | one JUMP plate map under six feature sets | well (one field each) | 4 plates, 1,536 wells | embeddings against CellProfiler |\n", "| [chroma](chroma.ipynb) | alternative-dye pilot, 8 channels, 91 compounds | well | 8 acquisitions | a non-standard stain panel |\n", "| [neuropainting](neuropainting.ipynb) | iPSC neurons and astrocytes, no perturbation | well | 1,691 wells, 20x and 63x | a design-factor screen (genotype, donor) |\n", "| [pooled_rare](pooled_rare.ipynb) | pooled coding-variant screen, pre-aggregated | barcode | 290 barcodes, 132 genes | a pre-aggregated allele series |\n", "| [scallops_arv471](scallops_arv471.ipynb) | optical pooled CRISPR under ARV-471, targeted readout | single cell | 2M+ cells, 9 features | a single-cell pooled screen |\n", "| [cp_posh](cp_posh.ipynb) | optical pooled CRISPR knockout, broad morphology | single cell | 124 genes, ~1,278 features | broad single-cell pooled morphology |\n", "| [jump_cells](jump_cells.ipynb) | single cells of one JUMP plate | single cell | 13,578 cells, 24 wells | per-cell CellProfiler measurements |\n", "| [jump_plate](jump_plate.ipynb) | images and segmentations of one well | image (field of view) | 2 fields, 8 channels | raw images as SpatialData |\n", "| [jump_export](jump_export.ipynb) | one raw CellProfiler export | field of view | 1 field | the input to `read_profiles` |\n", "\n", "## The JUMP datasets\n", "\n", "Six of these come from JUMP, the `cpg0016-jump` accession of the Cell Painting Gallery, where each source is one laboratory.\n", "The compound plates and the CRISPR plates are separate sets of plates, and each loader reads one of them:\n", "\n", "- {func}`~mantispy.ds.jump_target2`: the compound arm. One plate map, JUMP-Target-2, run at up to 141 plates from 11 sources.\n", "- {func}`~mantispy.ds.jump_lite`: four plates of that same plate map, one per source, under six feature sets.\n", "- {func}`~mantispy.ds.jump_crispr`: the CRISPR arm, assembled across its sources, with one gene knocked out per well in U2OS cells.\n", "- {func}`~mantispy.ds.jump_cells`, {func}`~mantispy.ds.jump_plate` and {func}`~mantispy.ds.jump_export`: one plate as single cells, one well as images and segmentations, and one field of view as a raw CellProfiler export.\n", "\n", "## Well counts\n", "\n", "Every well-level screen, with how many wells, features and controls it has, and how many cells a well holds." ] }, { "cell_type": "code", "execution_count": 1, "id": "bf65414c", "metadata": { "execution": { "iopub.execute_input": "2026-10-22T03:24:34.236472Z", "iopub.status.busy": "2026-10-22T03:24:34.236065Z", "iopub.status.idle": "2026-10-22T03:24:38.918913Z", "shell.execute_reply": "2026-10-22T03:24:38.918008Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import mantispy as mt" ] }, { "cell_type": "code", "execution_count": 2, "id": "358c4ac6", "metadata": { "execution": { "iopub.execute_input": "2026-10-22T03:24:38.921071Z", "iopub.status.busy": "2026-10-22T03:24:38.920888Z", "iopub.status.idle": "2026-10-22T03:24:47.063208Z", "shell.execute_reply": "2026-10-22T03:24:47.061798Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Updating file 'rohban.h5ad' from 'https://exampledata.scverse.org/mantispy/rohban/rohban.h5ad' to ''.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/28.7M [00:00'.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/78.8M [00:00'.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/128M [00:00'.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/1.64M [00:00'.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/1.57M [00:00'.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/2.71M [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
wellsfeaturesplatescontrolscells per wellfields per well
dataset
bbbc02163246755330592.04.0
rohban191836165120633.09.0
pki3072583989601669.09.0
jump_target253743616118981427.59.0
jump_crispr5118559514880473093.0<NA>
neuropainting16912044<NA>92.04.0
chroma3455648216625.09.0
oasis_pilot460499125114443.59.0
\n", "" ], "text/plain": [ " wells features plates controls cells per well \\\n", "dataset \n", "bbbc021 632 467 55 330 592.0 \n", "rohban 1918 3616 5 120 633.0 \n", "pki 3072 5839 8 960 1669.0 \n", "jump_target2 5374 3616 11 898 1427.5 \n", "jump_crispr 51185 595 148 8047 3093.0 \n", "neuropainting 1691 204 4 92.0 \n", "chroma 3455 64 8 216 625.0 \n", "oasis_pilot 4604 99 12 511 4443.5 \n", "\n", " fields per well \n", "dataset \n", "bbbc021 4.0 \n", "rohban 9.0 \n", "pki 9.0 \n", "jump_target2 9.0 \n", "jump_crispr \n", "neuropainting 4.0 \n", "chroma 9.0 \n", "oasis_pilot 9.0 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "WELLS = [\n", " \"bbbc021\",\n", " \"rohban\",\n", " \"pki\",\n", " \"jump_target2\",\n", " \"jump_crispr\",\n", " \"neuropainting\",\n", " \"chroma\",\n", " \"oasis_pilot\",\n", "]\n", "datasets = {name: getattr(mt.ds, name)() for name in WELLS}\n", "\n", "rows = []\n", "for name, adata in datasets.items():\n", " obs = adata.obs\n", " rows.append(\n", " {\n", " \"dataset\": name,\n", " \"wells\": adata.n_obs,\n", " \"features\": adata.n_vars,\n", " \"plates\": obs[\"Metadata_Plate\"].nunique(),\n", " \"controls\": int(obs[\"Metadata_Control\"].sum()) if \"Metadata_Control\" in obs else pd.NA,\n", " \"cells per well\": obs[\"Metadata_CellCount\"].median(),\n", " \"fields per well\": obs[\"Metadata_SiteCount\"].median() if \"Metadata_SiteCount\" in obs else pd.NA,\n", " }\n", " )\n", "pd.DataFrame(rows).set_index(\"dataset\")" ] }, { "cell_type": "markdown", "id": "8b77b940", "metadata": {}, "source": [ "`controls` is `Metadata_Control`, which the loaders of bbbc021, rohban, pki, jump_target2, jump_crispr,\n", "oasis_pilot and chroma set.\n", "neuropainting has no perturbation reagent, so it marks no controls.\n", "Seven datasets are left out of the well-count table:\n", "\n", "- `pooled_rare` holds one profile per barcode of a pooled screen, so there is no well to count cells in;\n", "- `scallops_arv471` holds single cells of an optical pooled screen, so again there is no well to count;\n", "- `cp_posh` holds single cells of an optical pooled CRISPR screen, likewise;\n", "- `jump_cells` holds 13,578 single cells of one JUMP plate, see [its page](jump_cells.ipynb);\n", "- `jump_plate` holds the images and segmentations of one well of the same plate;\n", "- `jump_export` is the CellProfiler export directory of one field of view of that plate;\n", "- `jump_lite` holds the same 1,536 JUMP wells under six feature sets, see [its page](jump_lite.ipynb).\n", "\n", "## Where the cell counts come from\n", "\n", "`Metadata_CellCount` is the number of cells behind a row, and `Metadata_SiteCount` the number of fields of view\n", "that contributed cells.\n", "Every count is exact, taken from what the upstream pipeline measured:\n", "\n", "| dataset | cell count |\n", "| --- | --- |\n", "| bbbc021 | summed from the `Image.csv` of each well, see [its page](bbbc021.ipynb) |\n", "| rohban, pki | `Metadata_Count_Cells` in the augmented profiles |\n", "| oasis_pilot, chroma | `Metadata_Count_Cells` in the profiles |\n", "| neuropainting | `Metadata_Object_Count` in the profiles |\n", "| jump_target2 | each plate's backend table, see [its page](jump_target2.ipynb) |\n", "| jump_crispr | `crispr_cell_counts.csv.gz` of [jump-profiling-recipe](https://github.com/broadinstitute/jump-profiling-recipe), the counts its cell-count correction regresses out |\n", "\n", "`Metadata_Object_Count` is the number of cells pycytominer aggregated into a well.\n", "It equals `Metadata_Count_Cells` in every well of every file here that publishes both, so it is as exact.\n", "{func}`~mantispy.io.read_profiles` copies either one to `Metadata_CellCount`, and `Metadata_Site_Count` to `Metadata_SiteCount`, so a Gallery file read directly carries them too.\n", "\n", "## Cells per field\n", "\n", "Datasets image different numbers of fields per well, and so do plates within some of them.\n", "Cells per field compares them on one scale." ] }, { "cell_type": "code", "execution_count": 3, "id": "f164ad84", "metadata": { "execution": { "iopub.execute_input": "2026-10-22T03:24:47.066743Z", "iopub.status.busy": "2026-10-22T03:24:47.066540Z", "iopub.status.idle": "2026-10-22T03:24:47.573928Z", "shell.execute_reply": "2026-10-22T03:24:47.573001Z" } }, "outputs": [ { "data": { "image/png": "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vPPOO5KYmCjHjx8XAPnOF69Zs6Z4e3tLWFiYIjmtzaRJk8TOzk6WLVumO5abm2t1D9ux2Fq5v79sm5KSIu+++640b95cTp06pTuem5srQ4cOzVNuS4qny214eLj8+9//1ju/aNGiPOX2xo0bfALaSKtWrZKGDRtKUlKSiIiMGTNGSpcurffNJz09XV544YUSv1WzKVy/fl0AyOXLl/OcS01N5fQOsinanfK0r6SFh4dLlSpV9B5ounv3rpQvX15+++03cXZ2lri4OAUTWw/tyO3rr78u3377rXTr1k1atmxpVUujsdhasVu3bkn16tXl559/1h27ffu2+Pv7CwDZvn273vUst/8rtwDynXqRX7mlwluwYIF06tRJ75WAzMxM6dGjhzg4OMiwYcNk3rx5EhQUJD179uTTySaQnp4uLi4usmDBgjznDhw4IJMmTVIkF5EpZWZmysqVK6Vu3bp6P8QlJSXJP/7xDylTpoxMmjRJFi5cKA0bNtSt49y+fXv+P1AI2nLboEED+eabb6zuB2MWWysXFRUlISEhesdu3rwp/v7+Ur9+/TwLrmvLbUxMTDEntQzacuvq6ipqtTrP+UWLFkloaCjLlpG060YCkK1bt+qdy83NlYULF0qbNm10L22VxKXlzOW9994TDw8POXHihN7xPn36yKJFixTLRWQqBw8e1M0Tf3ojHXlSeufMmSNNmjSRF198UWbPni25ubmSlZUlderU0Xt5nQo2adIkKVWqlPz4449KRyk0lYgIyKolJyeje/fuGDNmDLp27QoAuHXrFtq2bQtHR0fs3LkT5cuX110vIlCpVAomVlZ2djb69u2LPXv2YOfOnWjcuLHe+ZL++SmqP/74A23btkX16tVx8OBBODk5KR3JquXk5ODBgwfw8vLSHdu8eTMWLFgAEUGXLl3w5ptvIisrC507d8aRI0cwatQo+Pv7Y/369bhx4wYOHTqEUqVKKfr3IDKFDRs2oG/fvoiIiMB//vOf516blpaGUaNG4ezZs9i/fz/s7e2LLactiI6OxuzZs7FmzRp0795d6TgGs1M6ABWdu7s7AgMD0atXL/zyyy8AgIoVK2L37t3IzMxE+/btce/ePd31Jam0rVq1Cp07d0bHjh0RGxuL7OxsODg4YNWqVXj11VfRvn17HD9+XO99StLnxxxefPFF7N69G5cvX0Z4eDgy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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "per_field = {\n", " name: (adata.obs[\"Metadata_CellCount\"] / adata.obs[\"Metadata_SiteCount\"]).dropna().to_numpy()\n", " for name, adata in datasets.items()\n", " if \"Metadata_SiteCount\" in adata.obs\n", "}\n", "order = sorted(per_field, key=lambda name: np.median(per_field[name]))\n", "fig, ax = plt.subplots(figsize=(8, 4))\n", "ax.boxplot([per_field[name] for name in order], tick_labels=order, showfliers=False)\n", "ax.set_yscale(\"log\")\n", "ax.set_ylabel(\"cells per field of view\")\n", "ax.tick_params(axis=\"x\", rotation=45)" ] }, { "cell_type": "markdown", "id": "d69ca9e9", "metadata": {}, "source": [ "`Metadata_SiteCount` counts the fields of view that contributed cells, which need not be all those imaged: an empty field\n", "contributes none, and so does one left out of the analysis.\n", "[JUMP-Target-2](jump_target2.ipynb) has examples of both.\n", "jump_crispr has no field count, because the recipe's table publishes none." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.15" } }, "nbformat": 4, "nbformat_minor": 5 }