{ "cells": [ { "cell_type": "markdown", "id": "c000", "metadata": {}, "source": [ "# Mechanism of action\n", "\n", "This tutorial runs on BBBC021, the field's reference benchmark: 38 compounds with published\n", "mechanism labels, at one to seven concentrations each, downloaded and cached by\n", "`mt.ds.bbbc021()`. The images are from {cite:t}`Caie_2010`; the profiles and the MOA benchmark\n", "are from {cite:t}`Ljosa_2013`.\n", "\n", "The questions are whether a profile tells us what a compound does and, where it does not,\n", "which mechanisms morphology cannot separate." ] }, { "cell_type": "code", "execution_count": 1, "id": "c001", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:00.441800Z", "iopub.status.busy": "2026-10-21T01:03:00.441418Z", "iopub.status.idle": "2026-10-21T01:03:04.488565Z", "shell.execute_reply": "2026-10-21T01:03:04.486455Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import mantispy as mt\n", "\n", "# Palette shared with the mantispy plotters (mt.pl.hits/mt.pl.cytotoxicity):\n", "ACCENT = \"crimson\" # observed / significant / the headline result to report (mt.pl.hits \"hit\")\n", "NULL = \"grey\" # null / shuffled / not-significant / background" ] }, { "cell_type": "code", "execution_count": 2, "id": "0cb313e1", "metadata": { "execution": { "iopub.execute_input": "2026-09-27T04:01:42.433408Z", "iopub.status.busy": "2026-09-27T04:01:42.431910Z", "iopub.status.idle": "2026-09-27T04:01:43.224687Z", "shell.execute_reply": "2026-09-27T04:01:43.222505Z" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "c002", "metadata": {}, "source": [ "## From wells to one signature per treatment\n", "\n", "The preparation is the one from [Normalize, select, aggregate](../profiles/normalize_and_select.ipynb),\n", "followed by one consensus signature per treatment." ] }, { "cell_type": "code", "execution_count": 2, "id": "c003", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:04.491960Z", "iopub.status.busy": "2026-10-21T01:03:04.491703Z", "iopub.status.idle": "2026-10-21T01:03:04.956888Z", "shell.execute_reply": "2026-10-21T01:03:04.956131Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":2: UserWarning: 2 of 467 features have no spread in at least one group of 'Metadata_Plate' among the rows selected by reference='negcon'. Adding epsilon=1e-18 to their scale multiplies them by up to 1e18, so they dominate every distance downstream. They are flagged in var['degenerate_scale'], and pp.feature_select drops them by default; to drop them now, adata = adata[:, ~adata.var['degenerate_scale']].copy(). A variance or outlier cut does not catch a feature that varies across a plate but is constant among its control wells; the flag does.\n", " mt.pp.normalize(adata, method=\"mad_robustize\", by=\"Metadata_Plate\", reference=\"negcon\")\n" ] }, { "data": { "text/plain": [ "{'features kept': 343, 'treatments': 103, 'mechanisms': 12}" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adata = mt.ds.bbbc021()\n", "mt.pp.normalize(adata, method=\"mad_robustize\", by=\"Metadata_Plate\", reference=\"negcon\")\n", "mt.pp.feature_select(adata, na_cutoff=0.0)\n", "adata = mt.pp.subset_features(adata)\n", "\n", "treated = adata[~adata.obs[\"Metadata_Control\"].to_numpy()].copy()\n", "signatures = mt.tl.consensus(treated, method=\"median\", min_replicates=1)\n", "signatures = signatures[signatures.obs[\"Metadata_MOA\"].notna().to_numpy()].copy()\n", "\n", "{\n", " \"features kept\": int(adata.n_vars),\n", " \"treatments\": int(signatures.n_obs),\n", " \"mechanisms\": int(signatures.obs[\"Metadata_MOA\"].nunique()),\n", "}" ] }, { "cell_type": "markdown", "id": "c004", "metadata": {}, "source": [ "103 treatments over 12 mechanisms, the shape of the published benchmark.\n", "\n", "## Classifying\n", "\n", "`tl.nn_moa_classify` assigns each treatment the mechanism of its nearest neighbor. The\n", "`scheme` decides what the number means:\n", "\n", "- `\"nn\"` allows any neighbor. A compound's nearest neighbor is usually the same compound at\n", " another concentration, so the task reduces to a profile finding its own compound.\n", "- `\"nsc\"` (not-same-compound) excludes every neighbor with the same compound. The\n", " classifier has to generalize from one molecule to a different one with the same\n", " mechanism. The published benchmark uses this rule." ] }, { "cell_type": "code", "execution_count": 3, "id": "c005", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:04.958595Z", "iopub.status.busy": "2026-10-21T01:03:04.958437Z", "iopub.status.idle": "2026-10-21T01:03:04.974785Z", "shell.execute_reply": "2026-10-21T01:03:04.973524Z" } }, "outputs": [ { "data": { "text/plain": [ "{'nn accuracy': 0.951,\n", " 'not-same-compound accuracy': 0.777,\n", " 'largest class share (the honest chance level)': 0.136}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for scheme in (\"nn\", \"nsc\"):\n", " mt.tl.nn_moa_classify(signatures, scheme=scheme, key_added=scheme)\n", "\n", "shares = signatures.obs[\"Metadata_MOA\"].value_counts(normalize=True)\n", "{\n", " \"nn accuracy\": round(signatures.uns[\"mantispy\"][\"nn\"][\"accuracy\"], 3),\n", " \"not-same-compound accuracy\": round(signatures.uns[\"mantispy\"][\"nsc\"][\"accuracy\"], 3),\n", " \"largest class share (the honest chance level)\": round(float(shares.iloc[0]), 3),\n", "}" ] }, { "cell_type": "code", "execution_count": 4, "id": "804ba552", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:04.976956Z", "iopub.status.busy": "2026-10-21T01:03:04.976820Z", "iopub.status.idle": "2026-10-21T01:03:05.089473Z", "shell.execute_reply": "2026-10-21T01:03:05.087921Z" } }, "outputs": [ { "data": { "image/png": "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//2TIdmAwakKMDjRy47BiV42CxcuRExMDLKzsxEbG4vVq1eX+UecjOPy5ctwdHSEu7t7lc6jVqtx6NAhdOnSRXIfQ7IBT9UREdFL74033oC3tzdsbGzg7+9f6R9Bp+dX+knHqiaXyw0KTYZicCIiopdeRW97QGQofuUKERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEpsYugIiIqDoqLCzEsWPHUFBQgDfeeAOOjo5lrrt582YUFxfrtPfs2RM2NjYAgKysLJw5cwYqlQp+fn7w8PCo0vqpajA4ERERPeXOnTsIDQ2FlZUVHB0dMWTIEGzatAldu3bVu/6OHTtQWFgoPr569Spu3LiBBw8eAAD27t2LAQMGwNfXF7a2toiOjsasWbMwefLkF7ZNVDkYnIiIiJ7y6aefomHDhoiKioKJiQm++eYbjBgxArdv34ZcLtdZf82aNVqPu3TpgjZt2ohHm6ZOnYoRI0bgu+++AwBs2rQJgwYNwvjx42FlZfWCtooqA69xIiIi+ofi4mJERUVhzJgxMDH5z5/JsWPH4t69e4iNjX1m/8TERBw8eBBjx44V24qKiuDt7S0+9vHxEdvp5WL0I05xcXE4dOgQLCws0KNHD9SqVeuZfQ4dOoS///4b5ubmCAwMhJ+f3wuplYiIXn3379+HSqVCnTp1xDZnZ2fY2tri5s2baNu2bbn9ly9fjtatW6Nly5Zi2/z58zFx4kSUlJTA1tYWK1aswOzZs2Fvb1+l20KVz6hHnBYtWoQ2bdrg1KlT2LZtGxo0aIDDhw+XuX5RURG6dOmCwYMH4++//8axY8fQrl07niMmIqJKU1JSAgAwNzfXalcoFOKysqhUKqxZs0braBMAWFlZwc7ODlFRUdi+fTvy8vLg5ORUBdVTVTPaEaekpCR8/vnn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ZcsQHx+PtLQ0jBkzBj///DO2bt2Kzz77rGoqJSIiIjIyg484HTt2DGFhYRg8eDAcHBxgYWEBf39//PDDD2jVqhV27dpVNZUSERERGZnBwenRo0fw9PQEANjb2yM1NVVc1rJlSyQkJFRuhURERETVhMHBSRAEyGQyAICfnx/27duHO3fuIDMzEzt27IC7u3tV1ElERERkdAZf4+Tt7Q07OzvgyXfThYSEwMfHByYmJmjUqBGGDh1aFXUSERERGZ3Bwal///5ajzds2ICpU6ciOzsbrVu3hkKhqMz6iIiIiKoNg4PT3r17kZWVJQYomUyGZs2aVUVtRERERNWKwdc4JSYm4siRI1VTDREREVE1ZnBwat++PY4cOYLi4uKqqYiIiIiomjL4VJ1cLoe5uTkCAwPRv39/uLi4aC338/NDmzZtKrNGIiIiomrB4OB08uRJpKWlAQBWrFihs3z06NEMTkRERPRKMjg4RUZGIjIysmqqISIiIqrGKvQlv0RERESvI4OPOJ0+fRoHDx4sc3lgYCBCQkKety4iIiKiasfg4HT9+nVs2rRJqy0vLw+JiYlQKpX46quvGJyIiIjolWRwcBoyZAiGDBmi0x4fH48+ffro3FmciIiI6FVRadc4NW7cGOHh4fjzzz8ra0giIiKiaqVSLw4vLi7Go0ePKnNIIiIiomrD4FN1iYmJiIuL02pTq9W4fPkyli9fjp07d1ZmfURERETVhsHBaefOnZg6dar2IKam8PLywqJFi3hhOBEREb2yDA5OH330ET766KOqqYaIiIioGuMNMImIiIgkqlBwmjNnDmJjY7XaEhIS8MUXX1RWXURERETVjsHB6fz589iyZQsCAgK02uvXr4/Lly9j7969lVkfERERUbVhcHCKiYlB69at9S4LCAjAiRMnKqMuIiIiomrH4ODk5OSECxcu6F12/vx52NvbV0ZdRERERNWOwcEpLCwMCQkJmDBhApKTkwEAjx49wvTp07Fv3z7069evKuokIiIiMjqDb0egVCqxdetWDBo0CEuWLIGpqSlKSkrg4OCAjRs3wsvLq2oqJSIiIjIyg4MTAAQFBeHWrVs4duwYUlJS4OzsjA4dOsDa2rryKyQiIiKqJioUnABAoVCgc+fOlVsNERERUTXG+zgRERERScT7OBERERFJxPs4EREREUnE+zgRERERScT7OBER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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "labels = [\"nearest neighbor\", \"not-same-compound\"]\n", "accuracies = [\n", " signatures.uns[\"mantispy\"][\"nn\"][\"accuracy\"],\n", " signatures.uns[\"mantispy\"][\"nsc\"][\"accuracy\"],\n", "]\n", "chance = float(shares.iloc[0])\n", "\n", "fig, ax = plt.subplots(figsize=(6, 4))\n", "bars = ax.bar(labels, accuracies, width=0.6, color=[NULL, ACCENT])\n", "ax.axhline(chance, ls=\"--\", lw=1, color=\"0.4\", label=f\"largest-class chance ({chance:.0%})\")\n", "ax.bar_label(bars, fmt=\"%.2f\", padding=3, fontsize=9)\n", "ax.set(ylabel=\"accuracy\", ylim=(0, 1), title=\"Retrieval accuracy vs chance\")\n", "ax.legend(frameon=False, fontsize=8)\n", "fig.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "c006", "metadata": {}, "source": [ "The two schemes give 0.95 and 0.78. The `nn` number mostly measures how well a profile\n", "recognizes its own compound at another dose.\n", "\n", "Against a largest-class share of 0.14, not-same-compound retrieval of 0.78 is a strong\n", "result.\n", "\n", "## What gets confused with what\n", "\n", "An off-diagonal block in the confusion matrix usually reflects biology." ] }, { "cell_type": "code", "execution_count": 5, "id": "c007", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:05.092497Z", "iopub.status.busy": "2026-10-21T01:03:05.092349Z", "iopub.status.idle": "2026-10-21T01:03:05.510069Z", "shell.execute_reply": "2026-10-21T01:03:05.508539Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mt.pl.moa_confusion(signatures, key=\"nsc\");" ] }, { "cell_type": "code", "execution_count": 6, "id": "c008", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:05.513034Z", "iopub.status.busy": "2026-10-21T01:03:05.512824Z", "iopub.status.idle": "2026-10-21T01:03:05.531992Z", "shell.execute_reply": "2026-10-21T01:03:05.530506Z" } }, "outputs": [ { "data": { "text/html": [ "
\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", "
truepredictedcount
5Eg5 inhibitorsMicrotubule destabilizers7
6Microtubule destabilizersEg5 inhibitors7
14DNA replicationDNA damage2
15Protein degradationActin disruptors1
16Protein degradationMicrotubule destabilizers1
\n", "
" ], "text/plain": [ " true predicted count\n", "5 Eg5 inhibitors Microtubule destabilizers 7\n", "6 Microtubule destabilizers Eg5 inhibitors 7\n", "14 DNA replication DNA damage 2\n", "15 Protein degradation Actin disruptors 1\n", "16 Protein degradation Microtubule destabilizers 1" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "confusion = signatures.uns[\"mantispy\"][\"nsc_confusion\"]\n", "confusion[confusion[\"true\"] != confusion[\"predicted\"]].nlargest(5, \"count\")" ] }, { "cell_type": "markdown", "id": "c009", "metadata": {}, "source": [ "The largest confusion is symmetric and biologically expected: Eg5 inhibitors and microtubule\n", "destabilizers, seven treatments each way. Eg5 is the kinesin that separates the centrosomes.\n", "Inhibiting it gives a monopolar spindle, and destabilizing microtubules also arrests mitosis.\n", "At these doses the two look alike under the microscope, which is a limit of the assay rather\n", "than of the classifier.\n", "\n", "The second is DNA damage against DNA replication, for the same reason: both stall the cell\n", "cycle and both are read out through the DNA channel.\n", "\n", "## Predicting a hidden mechanism\n", "\n", "A blind test is more convincing. For each compound in turn, remove its mechanism label, use\n", "`tl.moa_enrichment` to find what its neighborhood is enriched for, and compare the answer with\n", "the removed label. `moa_enrichment` needs no label on the profile it scores, which is the\n", "situation of an uncharacterized compound.\n", "\n", "This cell hides each of the 38 compounds in turn, so it is the slowest cell on this page." ] }, { "cell_type": "code", "execution_count": 7, "id": "c010", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:05.534802Z", "iopub.status.busy": "2026-10-21T01:03:05.534655Z", "iopub.status.idle": "2026-10-21T01:03:05.774946Z", "shell.execute_reply": "2026-10-21T01:03:05.773496Z" } }, "outputs": [ { "data": { "text/plain": [ "{'compounds tested': 38, 'mechanism recovered': 26, 'rate': 0.684}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "compounds = signatures.obs[\"Metadata_Compound\"].astype(str)\n", "truth = signatures.obs.groupby(compounds, observed=True)[\"Metadata_MOA\"].first().astype(str)\n", "\n", "# One copy, reused across compounds: each pass restores the labels, then hides the one under test.\n", "blind = signatures.copy()\n", "moa_labels = signatures.obs[\"Metadata_MOA\"].astype(str).to_numpy()\n", "\n", "records = []\n", "for compound in truth.index:\n", " blind.obs[\"Metadata_MOA\"] = moa_labels\n", " hidden = (compounds == compound).to_numpy()\n", " blind.obs.loc[hidden, \"Metadata_MOA\"] = \"unknown\"\n", "\n", " mt.tl.moa_enrichment(blind, k=10)\n", " table = blind.uns[\"mantispy\"][\"moa_enrichment\"]\n", " asked = set(blind.obs.loc[hidden, \"Metadata_Perturbation\"].astype(str))\n", " rows = table[table[\"group\"].isin(asked) & (table[\"moa\"] != \"unknown\")]\n", " if rows.empty:\n", " continue\n", " predicted = rows.groupby(\"moa\")[\"pvalue\"].min().idxmin()\n", " records.append({\"compound\": compound, \"true\": truth[compound], \"predicted\": predicted})\n", "\n", "blind_test = pd.DataFrame(records)\n", "blind_test[\"correct\"] = blind_test[\"true\"] == blind_test[\"predicted\"]\n", "{\n", " \"compounds tested\": len(blind_test),\n", " \"mechanism recovered\": int(blind_test[\"correct\"].sum()),\n", " \"rate\": round(float(blind_test[\"correct\"].mean()), 3),\n", "}" ] }, { "cell_type": "code", "execution_count": 8, "id": "c011", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:05.777984Z", "iopub.status.busy": "2026-10-21T01:03:05.777846Z", "iopub.status.idle": "2026-10-21T01:03:05.785276Z", "shell.execute_reply": "2026-10-21T01:03:05.783823Z" } }, "outputs": [ { "data": { "text/html": [ "
\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", " \n", "
compoundtruepredictedcorrect
0ALLNProtein degradationProtein synthesisFalse
2AZ-CEg5 inhibitorsMicrotubule destabilizersFalse
4AZ-UEpithelialProtein synthesisFalse
8MG-132Protein degradationMicrotubule stabilizersFalse
11alsterpaulloneKinase inhibitorsDNA damageFalse
14camptothecinDNA replicationDNA damageFalse
17colchicineMicrotubule destabilizersDNA damageFalse
19cytochalasin BActin disruptorsProtein synthesisFalse
20cytochalasin DActin disruptorsProtein synthesisFalse
25etoposideDNA damageDNA replicationFalse
27lactacystinProtein degradationEg5 inhibitorsFalse
28latrunculin BActin disruptorsProtein synthesisFalse
\n", "
" ], "text/plain": [ " compound true predicted \\\n", "0 ALLN Protein degradation Protein synthesis \n", "2 AZ-C Eg5 inhibitors Microtubule destabilizers \n", "4 AZ-U Epithelial Protein synthesis \n", "8 MG-132 Protein degradation Microtubule stabilizers \n", "11 alsterpaullone Kinase inhibitors DNA damage \n", "14 camptothecin DNA replication DNA damage \n", "17 colchicine Microtubule destabilizers DNA damage \n", "19 cytochalasin B Actin disruptors Protein synthesis \n", "20 cytochalasin D Actin disruptors Protein synthesis \n", "25 etoposide DNA damage DNA replication \n", "27 lactacystin Protein degradation Eg5 inhibitors \n", "28 latrunculin B Actin disruptors Protein synthesis \n", "\n", " correct \n", "0 False \n", "2 False \n", "4 False \n", "8 False \n", "11 False \n", "14 False \n", "17 False \n", "19 False \n", "20 False \n", "25 False \n", "27 False \n", "28 False " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "blind_test[~blind_test[\"correct\"]]" ] }, { "cell_type": "code", "execution_count": 9, "id": "8795463f", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:05.787793Z", "iopub.status.busy": "2026-10-21T01:03:05.787613Z", "iopub.status.idle": "2026-10-21T01:03:05.915913Z", "shell.execute_reply": "2026-10-21T01:03:05.914542Z" } }, "outputs": [ { "data": { "image/png": "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3r17+Pfff1GrVq1C56qIuXPn4smTJ3BycpK2MvTu3btI8weQ71yIiIiIPrUiPX6rZ8+eKFOmTK7ypk2bolq1agCAvn37Qk1NDWpqarh48SIcHR1x8eJFuLu748WLFwAAV1dXufY2Njbw8vJCYmIi7t+/j23btkl1LCwssHr1aly5cgWXLl1C+fLlcfz4cTx9+hQJCQnYvHkzWrduDbxbIf3pp58waNAg+Pn5oWvXrlizZo10Lr92RkZGcHZ2BgCYm5vjzp07MDExwdmzZ+Hu7g5vb+88r0e1atVw7tw5REREID4+Hjt27ECbNm0K7cfX1xfu7u44ffo0TExMpD2278915MiRGDlyJK5du4ZKlSph3bp10laOguaacz75/ZyRkYEKFSrA3d1demVmZhYYd/ny5dG2bVu5a5DfXIiIiIg+NRWR871qos9EJpNBT08PNw0cUFb1g94YICIiJVQl6kpJh0AlIPv3fkJCAnR1dYut36/qK2qJiIiI6NvBRJaIiIiIlBITWSIiIiJSSkxkiYiIiEgp8VM2VKIqB58p1k3fRERE9O3giiwRERERKSUmskRERESklJjIEhEREZFS4h5ZKlHPKnXgFyIQEX1D+IUIVJy4IktERERESomJLBEREREpJSayRERERKSUmMgSERERkVJiIqtkfH19MWrUqJIOg4iIiKjEMZEtoidPnsDOzg52dnZo0KABunbtijVr1uDt27dy51etWiW1CQ4ORuvWreX68fHxgZ2dHby8vIo0flJSEoKDg4tpNkRERETKi4lsEaWmpiIsLAxubm5Yt24dXF1dsWnTJjg7OyMzMxOpqakICQnBX3/9hbi4OABAWloaHjx4INfPxo0bUbZsWWzcuLGEZkJERESk3JjIfgA1NTXY2dmhcePGGDBgAC5evIj79+/jxIkTAABDQ0P06tULS5YsybN9UlISTpw4ATc3N5w+fRoymazA8fbt24fWrVujV69eePTokVQeHBwMOzs71K5dG23atJFLin19fTF06FD89ddfaN68OYYNG4bo6GhMmTIFjRs3xs8//4zMzMxC+wGAPXv2SOPv2bNHbmuDl5cXevToAQcHB0yaNAmxsbEfeFWJiIiIioaJbDHQ19dHixYtcOPGDans999/x5YtWxAREZGr/oEDB9C2bVtYW1ujQ4cOcHNzy7dvb29v/Pjjj/jh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NxEREX07uCJLREREREqJiSwRERERKSUmskRERESklLhHlkrUs0od+IUIREQfiV+IQN8qrsgSERERkVJiIktERERESomJLBEREREpJSayRERERKSUmMh+5fz8/DBy5Mgit7t79y4GDx78ydsQERERfSgmsl+Qp0+fwt7eXu7l5ORUaLucCeStW7cwbNgw6dybN2/w5MmTIseSlJSER48e5epf0TZEREREnxqfe/QFSUlJQUhICC5evCiVaWhoFNquSpUqmD17NvAucX38+HGxxpWzfyIiIqIvBVdkvzBqampyK7K2trZAji0Cy5YtQ+vWrTF69GjExcUB71Zy//zzTwDAhAkTcOvWLdjb22PAgAFSvytXrkTr1q0xdOhQxMTESOXe3t7o06cPHB0dMWXKFMTHx+eKKWf/z58/h729PerVqwdnZ2ds3br1k18TIiIiorwwkf3CxMfHyyWyY8eOBd6ttO7YsQMxMTH466+/kJqaiiFDhgDvvaX/008/oWrVqti+fTvmzJkDALh27RoSEhKwYMECpKSk4I8//gAABAUFYcKECRg8eDCWLVsGANJ4OeXs39TUFNu3b8e2bdswffp0rFq1Cl5eXoXOKy0tDTKZTO5FRERE9DG4teALU7ZsWWzfvl3uOJu1tTUWLFgAAGjYsCH09fWRmpoq175y5cooU6YM7O3tAQDh4eGoVauWtDVACIFff/0VALB7925ERkZK5zIyMhAdHV1gfOrq6jh9+jTOnz+P2NhYRERE4Pr163B0dCyw3cKFCzF37twiXg0iIiKi/DGR/cJkby3Ii76+vvRzqVKloKWlhaSkpEL7LFeunPSzlpYW0tLSgHerv7169cKIESPkxi/Ixo0b8e+//2L27NkwMjLCypUrkZKSUmgMM2fOxNSpU6VjmUwGS0vLQtsRERER5YdbC5TI7du3cffuXQDA8ePHYWBgAENDQ7k6ZcqUQWJiokL9tWjRAufPn4eZmZm0laF27doFtgkODoajoyPat2+PSpUq4fr16wqNpaWlBV1dXbkXERER0cfgiuwXJnuPbE63bt0CAFSvXh3Dhg1DfHw8YmJicPDgwVzta9asiZSUFFSrVg2NGjXCqFGj8h2rf//+8PPzQ5UqVWBlZQUNDQ20bNkSK1euzLfNwIED0bZtWxw+fBjJycmoUaPGR82XiIiI6EOpCCFESQdB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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Recovered fraction per true mechanism, sorted ascending so the classes that fail sit at the bottom.\n", "recovered = blind_test.groupby(\"true\")[\"correct\"].mean().sort_values()\n", "colours = np.where(recovered.to_numpy() >= 0.5, ACCENT, NULL)\n", "\n", "fig, ax = plt.subplots(figsize=(7, 4))\n", "ax.barh(range(len(recovered)), recovered.to_numpy(), color=colours)\n", "ax.set_yticks(range(len(recovered)), recovered.index, fontsize=8)\n", "ax.set(xlabel=\"share of compounds recovered\", xlim=(0, 1), title=\"Blind mechanism recovery, per class\")\n", "fig.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "06a84187", "metadata": {}, "source": [ "The two lowest bars are actin disruptors and protein degradation, neither of them among the largest confusions above, which involve Eg5 inhibitors, microtubule destabilizers and DNA replication. The blind test and the confusion matrix do not fail on the same classes." ] }, { "cell_type": "markdown", "id": "c012", "metadata": {}, "source": [ "Two thirds of the compounds have their mechanism recovered from morphology alone, without the label, against a\n", "chance level of 0.11, the largest mechanism's share of the 38 compounds.\n", "\n", "Ten of the twelve failures fall into three groups.\n", "\n", "Some repeat the confusion matrix. Etoposide and camptothecin swap DNA damage and DNA replication in both\n", "directions, and AZ-C, an Eg5 inhibitor, is predicted as a microtubule destabilizer. A mechanism that is hard for\n", "the nearest-neighbor rule is also hard for the neighborhood test, so the two methods are consistent.\n", "\n", "Some are most of a class. All three actin disruptors miss, each predicted as protein synthesis, so in the\n", "neighbourhood test the actin phenotype does not separate that class. Three of the four\n", "protein-degradation compounds miss as well: ALLN, MG-132 and lactacystin, three proteasome inhibitors with three\n", "different wrong answers, while proteasome inhibitor I is recovered. The nearest-neighbour classifier above gets most\n", "of these treatments right, so the failure belongs to the neighbourhood test. A class that fails in three different directions has no\n", "consistent readout in this assay, which says more than a single confused pair.\n", "\n", "One is unexpected: colchicine, a standard microtubule destabilizer, is predicted as DNA damage. Look at its\n", "images before drawing further conclusions about it.\n", "\n", "The other two are single compounds: AZ-U, labelled epithelial, is predicted as protein synthesis, and\n", "alsterpaullone, a kinase inhibitor, as DNA damage." ] }, { "cell_type": "markdown", "id": "c013", "metadata": {}, "source": [ "## Which measurements separate the mechanisms\n", "\n", "[Which measurements moved](../phenotypes/which_features_moved.ipynb) collapses each treatment's differential\n", "features into families, such as tubulin intensity in the nucleus, and reads them against these mechanisms." ] }, { "cell_type": "markdown", "id": "c014", "metadata": {}, "source": [ "## Distances between mechanisms\n", "\n", "`tl.edistance` with `reference=None` gives the full treatment-by-treatment energy\n", "distance matrix, and `pl.distance_heatmap` orders it by mechanism so related treatments sit\n", "together." ] }, { "cell_type": "code", "execution_count": 10, "id": "c015", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:05.919058Z", "iopub.status.busy": "2026-10-21T01:03:05.918918Z", "iopub.status.idle": "2026-10-21T01:03:06.329368Z", "shell.execute_reply": "2026-10-21T01:03:06.327741Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mt.tl.edistance(signatures, reference=None)\n", "mt.pl.distance_heatmap(signatures, groupby=\"Metadata_MOA\");" ] }, { "cell_type": "markdown", "id": "c016", "metadata": {}, "source": [ "## Scoring the whole map in one number\n", "\n", "The heatmap shows the mechanism blocks. `metrics.known_relationships` scores them: of the\n", "compound pairs the annotation relates, what share lands in either tail of the map's own\n", "similarity distribution over all pairs? It is the benchmark {cite:t}`Celik_2024` selects\n", "perturbative maps by, and it needs only an annotation of which perturbations belong together,\n", "so the same call works for mechanisms here and for gene sets in a\n", "[genetic screen](../../case_studies/crispr.ipynb).\n", "\n", "Both tails count. Two compounds with opposite effects on one process are as related as two\n", "with the same effect, and a one-sided test would score an inhibitor and an activator of the\n", "same pathway as unrelated.\n", "\n", "The profiles are aggregated to one per compound rather than one per treatment, so every\n", "annotated pair is two different molecules. That is the not-same-compound rule from the top of\n", "this page, applied to the annotation instead of to the classifier." ] }, { "cell_type": "code", "execution_count": 11, "id": "c017", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:06.335817Z", "iopub.status.busy": "2026-10-21T01:03:06.335657Z", "iopub.status.idle": "2026-10-21T01:03:06.373737Z", "shell.execute_reply": "2026-10-21T01:03:06.372274Z" } }, "outputs": [ { "data": { "text/plain": [ "{'compounds': 38,\n", " 'mechanisms': 12,\n", " 'pairs sharing a mechanism': 44,\n", " 'pairs in total': 703}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "per_compound = treated.copy()\n", "per_compound.obs[\"Metadata_Perturbation\"] = per_compound.obs[\"Metadata_Compound\"].astype(str)\n", "compounds = mt.tl.consensus(per_compound, method=\"median\", min_replicates=1)\n", "compounds = compounds[compounds.obs[\"Metadata_MOA\"].notna().to_numpy()].copy()\n", "\n", "# source names a set, target one of its members. A mechanism is a set of compounds.\n", "net = pd.DataFrame(\n", " {\n", " \"source\": compounds.obs[\"Metadata_MOA\"].astype(str).to_numpy(),\n", " \"target\": compounds.obs[\"Metadata_Perturbation\"].astype(str).to_numpy(),\n", " }\n", ")\n", "\n", "sizes = net[\"source\"].value_counts()\n", "{\n", " \"compounds\": int(compounds.n_obs),\n", " \"mechanisms\": int(sizes.size),\n", " \"pairs sharing a mechanism\": int((sizes * (sizes - 1) // 2).sum()),\n", " \"pairs in total\": compounds.n_obs * (compounds.n_obs - 1) // 2,\n", "}" ] }, { "cell_type": "markdown", "id": "c018", "metadata": {}, "source": [ "44 annotated pairs out of 703. Every compound here belongs to exactly one mechanism, so a map that carried no\n", "information would put twice the tail size of them in the tails. `n_permutations` measures that level on the\n", "map rather than assuming it: it shuffles which compound each annotation row names, keeping every mechanism's\n", "size, and reports the mean recall over the shuffles as `null` and the share of shuffles that recall at least as\n", "much as `p_value`." ] }, { "cell_type": "code", "execution_count": 12, "id": "c019", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:06.376636Z", "iopub.status.busy": "2026-10-21T01:03:06.376491Z", "iopub.status.idle": "2026-10-21T01:03:07.540028Z", "shell.execute_reply": "2026-10-21T01:03:07.538565Z" } }, "outputs": [ { "data": { "text/html": [ "
\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", "
tail width (%)twice the tailshuffled annotationobservedp
01.00.020.0240.1360.01
15.00.100.1060.5230.01
210.00.200.2100.6590.01
\n", "
" ], "text/plain": [ " tail width (%) twice the tail shuffled annotation observed p\n", "0 1.0 0.02 0.024 0.136 0.01\n", "1 5.0 0.10 0.106 0.523 0.01\n", "2 10.0 0.20 0.210 0.659 0.01" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rows = []\n", "for percentile in (1.0, 5.0, 10.0):\n", " result = mt.metrics.known_relationships(compounds, net, percentile=percentile, n_permutations=100, seed=0).iloc[0]\n", " rows.append(\n", " {\n", " \"tail width (%)\": percentile,\n", " \"twice the tail\": 2 * percentile / 100,\n", " \"shuffled annotation\": float(result[\"null\"]),\n", " \"observed\": float(result[\"value\"]),\n", " \"p\": float(result[\"pvalue\"]),\n", " }\n", " )\n", "\n", "pd.DataFrame(rows).round(3)" ] }, { "cell_type": "code", "execution_count": 13, "id": "da2f9885", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:07.542612Z", "iopub.status.busy": "2026-10-21T01:03:07.542475Z", "iopub.status.idle": "2026-10-21T01:03:07.650202Z", "shell.execute_reply": "2026-10-21T01:03:07.648742Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Reuse the rows built just above; no re-run of known_relationships.\n", "recall = pd.DataFrame(rows)\n", "x = np.arange(len(recall))\n", "width = 0.27\n", "\n", "fig, ax = plt.subplots(figsize=(7, 4))\n", "ax.bar(x - width, recall[\"observed\"], width, label=\"observed\", color=ACCENT)\n", "ax.bar(x, recall[\"shuffled annotation\"], width, label=\"shuffled annotation\", color=NULL)\n", "ax.bar(x + width, recall[\"twice the tail\"], width, label=\"twice the tail\", color=\"#707070\")\n", "ax.set_xticks(x, [f\"{p:g}%\" for p in recall[\"tail width (%)\"]])\n", "ax.set(xlabel=\"tail width\", ylabel=\"recall of annotated pairs\", title=\"Known-pair recall vs its shuffled null\")\n", "ax.legend(frameon=False, fontsize=8)\n", "fig.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "5f0705b8", "metadata": {}, "source": [ "At every tail width the observed recall clears both nulls: it towers over the shuffled annotation and over twice the tail width, so the map relates the annotated pairs well beyond chance." ] }, { "cell_type": "markdown", "id": "c020", "metadata": {}, "source": [ "The shuffled annotation sits on twice the tail width at every width, as it should when every compound belongs\n", "to one mechanism, and no shuffle reaches the observed recall. The observed recall is about five times chance at\n", "the default width of 5% and about six times at the strictest.\n", "\n", "Read this next to the not-same-compound accuracy of 0.78 from the top of the page. They\n", "measure different things: the classifier asks whether the *nearest* neighbor of a compound\n", "shares its mechanism, while this asks how many of the annotated pairs are extreme in the\n", "whole distribution, including the pairs that are related but not nearest. The second is the\n", "harder question, and the smaller number is not a worse result." ] }, { "cell_type": "code", "execution_count": 14, "id": "c021", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:07.653110Z", "iopub.status.busy": "2026-10-21T01:03:07.652974Z", "iopub.status.idle": "2026-10-21T01:03:07.792340Z", "shell.execute_reply": "2026-10-21T01:03:07.790845Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "{'annotated in the upper tail': 23, 'annotated in the lower tail': 0}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from itertools import combinations\n", "\n", "# Cosine similarity between every pair of compound profiles.\n", "scored = mt.tl.similarity(compounds, metric=\"cosine\", copy=True)\n", "similarity = np.asarray(scored.obsp[\"similarity\"])\n", "\n", "upper = np.triu_indices(compounds.n_obs, 1)\n", "position = {name: index for index, name in enumerate(net[\"target\"])}\n", "related = [\n", " (position[a], position[b]) for _, block in net.groupby(\"source\") for a, b in combinations(block[\"target\"], 2)\n", "]\n", "\n", "background = similarity[upper]\n", "annotated = np.array([similarity[i, j] for i, j in related])\n", "low, high = np.quantile(background, [0.05, 0.95], method=\"inverted_cdf\")\n", "\n", "fig, ax = plt.subplots(figsize=(6.5, 3.5))\n", "ax.hist(background, bins=40, density=True, color=\"lightgrey\", label=f\"all {background.size} pairs\")\n", "ax.hist(\n", " annotated,\n", " bins=40,\n", " density=True,\n", " histtype=\"step\",\n", " lw=1.8,\n", " color=ACCENT,\n", " label=f\"{annotated.size} sharing a mechanism\",\n", ")\n", "for cut in (low, high):\n", " ax.axvline(cut, color=\"grey\", ls=\"--\", lw=1)\n", "ax.set_xlabel(\"cosine similarity\")\n", "ax.set_ylabel(\"density\")\n", "ax.legend(fontsize=8)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "{\n", " \"annotated in the upper tail\": int((annotated >= high).sum()),\n", " \"annotated in the lower tail\": int((annotated <= low).sum()),\n", "}" ] }, { "cell_type": "markdown", "id": "c022", "metadata": {}, "source": [ "The annotated pairs are shifted right of the background and pile up past the upper cut. None\n", "of them reach the lower one: at this granularity sharing a mechanism means looking alike, not\n", "looking opposed. The lower tail earns its place in genetic screens, where an activator and an\n", "inhibitor of one pathway are annotated together, rather than in a compound panel like this.\n", "\n", "Per mechanism, the same statistic says which classes the assay resolves. Each row is scored\n", "against the same all-pairs background, so the rows are comparable." ] }, { "cell_type": "code", "execution_count": 15, "id": "c023", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:07.795485Z", "iopub.status.busy": "2026-10-21T01:03:07.795341Z", "iopub.status.idle": "2026-10-21T01:03:07.867486Z", "shell.execute_reply": "2026-10-21T01:03:07.865876Z" } }, "outputs": [ { "data": { "text/html": [ "
\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", " \n", "
mechanismcompoundspairsrecall
1Aurora kinase inhibitors331.000
2Cholesterol-lowering211.000
9Microtubule stabilizers331.000
5Eg5 inhibitors211.000
11Protein synthesis331.000
3DNA damage460.667
8Microtubule destabilizers460.500
0Actin disruptors330.333
7Kinase inhibitors330.333
6Epithelial330.333
4DNA replication460.333
10Protein degradation460.000
\n", "
" ], "text/plain": [ " mechanism compounds pairs recall\n", "1 Aurora kinase inhibitors 3 3 1.000\n", "2 Cholesterol-lowering 2 1 1.000\n", "9 Microtubule stabilizers 3 3 1.000\n", "5 Eg5 inhibitors 2 1 1.000\n", "11 Protein synthesis 3 3 1.000\n", "3 DNA damage 4 6 0.667\n", "8 Microtubule destabilizers 4 6 0.500\n", "0 Actin disruptors 3 3 0.333\n", "7 Kinase inhibitors 3 3 0.333\n", "6 Epithelial 3 3 0.333\n", "4 DNA replication 4 6 0.333\n", "10 Protein degradation 4 6 0.000" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "per_mechanism = pd.DataFrame(\n", " [\n", " {\n", " \"mechanism\": mechanism,\n", " \"compounds\": len(block),\n", " \"pairs\": len(block) * (len(block) - 1) // 2,\n", " \"recall\": mt.metrics.known_relationships(compounds, block)[\"value\"].iloc[0],\n", " }\n", " for mechanism, block in net.groupby(\"source\")\n", " if len(block) > 1\n", " ]\n", ")\n", "per_mechanism.sort_values(\"recall\", ascending=False).round(3)" ] }, { "cell_type": "code", "execution_count": 16, "id": "d8a8f1cf", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:07.870065Z", "iopub.status.busy": "2026-10-21T01:03:07.869928Z", "iopub.status.idle": "2026-10-21T01:03:08.001481Z", "shell.execute_reply": "2026-10-21T01:03:07.999979Z" } }, "outputs": [ { "data": { "image/png": "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7dq1iz1e0lwykddTh4mIiOiDlpycjHLlyqFq1ao4d+5cSYdDVCK4tYCIiEgDHThwAAkJCRg+fHhJh0JUYrgiS0REpGGio6PRoUMHPHv2DLdu3VL6IBRRacIVWSIiIg3SunVr2NnZ4fXr19i6dSuTWCrVuCJLRERERBqJK7JEREREpJGYyBIRERGRRiq6r+whKoTMzEw8ffoUJiYm7/w1pERERPRhE0IgISEB5cuXl75+uSgwkaUS8fTpUzg6OpZ0GERERPQePX78GA4ODkXWHxNZKhEmJibAm3/QpqamJR0OERERFSO5XA5HR0fp939RYSJLJSJrO4GpqSkTWSIiolKiqLcT8sNeRERERKSRmMgSERERkUZiIktEREREGomJLBERERFpJCayRERERKSRmMgSERERkUZiIktEREREGomJLBERERFpJCayRERERKSRmMgSERERkUZiIktEREREGkmnpAOg0u2eazuYaPGfIRER0ccsITO9WPrliiwRERERaSQmskRERESkkZjIEhEREZFGYiJLRERERBqp1CSyISEh6NWrV0mH8c7UncfHMl8iIiIiVYokkU1ISEDFihXxyy+/FEV3xUKhUCAqKirX+bCwMHTp0qVEYnqbOFTNI2cf6tY7d+4cunfv/k6xExEREZWEIklkN2/eDEdHRyxduhQZGRlF0eV7U7NmTaxYsaKkwyiSONTtI3s9hUKBly9fvtO4RERERCWhSBLZVatWYfLkyahSpQoOHjwonZfL5ahdu7Z0nJGRgUqVKknHDg4O2LBhAzw9PfHHH38AANasWQNPT0/UqVMHkydPRlpaGvDmrfIePXrgp59+gpubG06dOoW7d+/CwcEBjo6OqFu3Ln7//Xe14k1KSkL37t2xbNkyREREYOjQodIYPXv2xM8//ww3Nzd06tQJkZGRAJDvWFFRUfDz80OlSpXg4OCAsWPHSmX79+9Hy5YtUa1aNfTv3x/Pnz/PMyZ14wAAIUSeZdn7AIDMzExMmDABbm5u6N69O54+fZqrXv/+/XHu3Dk4ODigY8eOhb4H+c2diIiIqDi9cyJ78+ZNREZGolWrVhg4cCBWrlwplWVmZkrJE94kYE+ePJGOIyMjcfToUaxevRojR47EiRMn8OOPP2LGjBnw9/dHQECAlOAqFArs2LEDdnZ22Lt3Lxo0aABnZ2eEhoYiJCQE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tWvXRr169ZQexTVw4EDs3r0bTk5OMDExQZkyZbB//341rywRERFR8ZGJknhe1AfkwoULSEtLg46ODqysrODi4gKZTKZU7ubmBn19fQBAdHQ07ty5A3d3d9y4cQOurq4wMzNT6vPGjRuwtLSEra1trvFCQ0OVEt8scXFxuHv3LtLS0mBhYYGqVasiMDAQU6dOxdGjR3H79m3Y29tLe28TExPx8OFD1KxZU+nnLFFRUXjw4AEyMjLg4eEBPT09yOVyPHr0CJUrV0ZUVBRkMhns7e2BN1sibt68CW1tbbi4uOTq7/Hjx0hJSUGlSpWgpfW/hXy5XI4nT56gRo0aAICkpCQ8ePBAqZ0qcrkcZmZmCLP0hIkW/56iD1fFqKCSDoGISONl/d6Pj48v0ndlS30i+yHLSmQDAwNLOpQix0SWNAUTWSKid1dciSz3yH7APDw8pEddEREREZEyJrIfMFNTU+lteyIiIiJSxkSWiIiIiDQSNydSiapw/yAfxUVERERvhSuyRERERKSRmMgSERERkUZiIktEREREGomJLBERERFpJCayRERERKSRmMgSERERkUZiIktEREREGomJLBERERFpJCayxSQmJgbnz58v9TEQERERFZcPOpE9f/48AgICcOjQIVy9evWt+4mLi8OZM2fUqhsfH4/Q0NC3HivL5cuXMX78+Hfu533EkPP6FNU1ICIiIipOH3QiO378ePz444+YO3cufH190bJlS6SlpRW6n6tXr+K7775Tq+6zZ8+wefPmt4hWc+W8PqXxGhAREZHm+aATWQAYN24cDh48iNu3b+P+/fvYu3cvACAgIACZmZm4evUqbt++DQDS8blz55Camir1ceHCBcTFxSEgIAAhISHS+bt37+LUqVOIiYmRztnZ2cHPzw9489b82bNnkZqaitDQUDx+/DjfWNPT03H+/Hncv38/z/K8xgOAtLQ0qV327QA5x3/16hWSkpIQEBCAgwcP4sKFC0hPT1crhvza5bw+2a9Bfte1sNeHiIiIqCjplHQA6jIwMICjoyNiY2MBAO3bt0fHjh0RHx+P4cOHw8nJCe3atcPjx49hbm6O2NhYHDp0CJUqVcKOHTsQGRmJ+fPno0qVKmjYsCF69+6Na9euwdbWFtevX8eyZcvQpUsXXL9+Hd988w1CQ0Nx+fJljBw5EqampjAwMMClS5ewfv16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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# barh draws bottom-to-top, so reverse the descending order to put the strongest mechanism on top.\n", "ranked = per_mechanism.sort_values(\"recall\", ascending=False).iloc[::-1]\n", "\n", "fig, ax = plt.subplots(figsize=(7, 4))\n", "ax.barh(range(len(ranked)), ranked[\"recall\"], color=ACCENT)\n", "ax.set_yticks(range(len(ranked)), ranked[\"mechanism\"], fontsize=8)\n", "ax.set(xlabel=\"share of related pairs recovered\", xlim=(0, 1), title=\"Which mechanisms the assay resolves\")\n", "fig.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "c024", "metadata": {}, "source": [ "Five mechanisms recover every pair: Aurora kinase inhibitors, Eg5 inhibitors, microtubule\n", "stabilizers, protein synthesis inhibitors and the two cholesterol-lowering compounds. These\n", "are the classes with one clear cellular readout.\n", "\n", "One recovers none.\n", "Protein degradation is the class where ALLN, MG-132 and lactacystin each drew a different\n", "wrong answer in the blind test above; here their profiles are not even mutually extreme,\n", "which is the same finding with no classifier in the way. Kinase inhibitors recovers one pair of three; the\n", "label covers different kinases with different substrates, so there is no reason for its members\n", "to converge on one morphology: the annotation is broad, not the assay blind.\n", "\n", "That distinction is the point of reading the per-mechanism table rather than the single\n", "number. A low overall recall can mean the map is poor, or it can mean the annotation groups\n", "things the assay has no reason to group, and only the breakdown separates the two." ] }, { "cell_type": "markdown", "id": "multilabel-map-md", "metadata": {}, "source": [ "## When a compound has several mechanisms\n", "\n", "Each compound here carries one mechanism, but a real compound often acts through several. Give `mt.tl.map` an annotation that holds a list of labels per row, and a pair is positive when the two lists share any label, so a compound with several mechanisms is scored toward each of its classes. A scalar column stays single-label.\n", "\n", "A list column does not survive `write_h5ad`, so the practical form is to store the labels as a delimited string, which does survive, and split it at call time with `label_sep`. Compound `c2` carries `X|Y` and is scored toward both classes. Compound `c5` carries `Z` on its own, so it has no within-class pair to rank against and drops out of the table. The per-class table lands in `uns`, with no single per-row score to join onto `obs`. Where classes differ in size the normalized mean average precision is the one comparable across them." ] }, { "cell_type": "code", "execution_count": 17, "id": "multilabel-map-code", "metadata": { "execution": { "iopub.execute_input": "2026-10-21T01:03:08.004670Z", "iopub.status.busy": "2026-10-21T01:03:08.004529Z", "iopub.status.idle": "2026-10-21T01:03:16.641034Z", "shell.execute_reply": "2026-10-21T01:03:16.639531Z" } }, "outputs": [ { "data": { "text/html": [ "
\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", "
Metadata_MOAscoremean_normalized_average_precisionqvalue
0X1.001.0000000.001998
1Y0.750.3865030.263736
\n", "
" ], "text/plain": [ " Metadata_MOA score mean_normalized_average_precision qvalue\n", "0 X 1.00 1.000000 0.001998\n", "1 Y 0.75 0.386503 0.263736" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "from anndata import AnnData\n", "\n", "# A minimal illustration: six consensus profiles with the mechanism stored as a delimited string, the form\n", "# that survives being written to disk. c0-c2 group on one axis, c3-c4 on the other, and c2 carries both.\n", "profiles = np.array([[1, 0], [0.9, 0.1], [0.8, 0], [0, 1], [0.1, 0.9], [0, 0.8]], dtype=\"float32\")\n", "toy = AnnData(\n", " X=profiles,\n", " obs={\n", " \"Metadata_Perturbation\": [f\"c{i}\" for i in range(6)],\n", " \"Metadata_MOA\": [\"X\", \"X\", \"X|Y\", \"Y\", \"Y\", \"Z\"],\n", " },\n", ")\n", "mt.tl.map(toy, mode=\"consistency\", annotation_key=\"Metadata_MOA\", label_sep=\"|\", null_size=1000, seed=0)\n", "toy.uns[\"mantispy\"][\"map\"][[\"Metadata_MOA\", \"score\", \"mean_normalized_average_precision\", \"qvalue\"]]" ] }, { "cell_type": "markdown", "id": "c025", "metadata": {}, "source": [ "## Summary\n", "\n", "- Report the not-same-compound number, or state which rule you used. The gap between the two\n", " is large enough to change conclusions.\n", "- Chance is the largest class's share, not one over the number of classes.\n", "- Confusions are hypotheses about the assay. The confusion between Eg5 inhibitors and\n", " microtubule destabilizers shows what these images can resolve.\n", "- `metrics.known_relationships` scores the whole map against an annotation in one number, read against its\n", " shuffled-annotation null. The per-mechanism breakdown says whether a low number is the map or the annotation.\n", "- `moa_enrichment` scores a compound without a label, as needed in a screen of\n", " uncharacterized molecules.\n", "\n", "Next: [Concentration response](dose_response.ipynb), on how much of a compound was needed." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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 }