{ "cells": [ { "cell_type": "markdown", "id": "dca49492", "metadata": {}, "source": [ "# Tutorial 6: Morphology-Aware Analysis of Subcellular Protein Localization (CellAligner)" ] }, { "cell_type": "markdown", "id": "c27d59b5", "metadata": {}, "source": [ "To demonstrate the functionality of CellAligner-OT, this tutorial analyzes 2D immunofluorescence images from the Human Protein Atlas. We will use a small subset of 373 cells from 70 images, available for download [here](https://www.dropbox.com/scl/fi/63tquyl5b6psiczrgihdn/hpa_images_metadata.zip?rlkey=7iz9cl5u35bvfupip6f0iicf3&st=ocpnazb7&dl=0)." ] }, { "cell_type": "code", "execution_count": null, "id": "be4cb3a2", "metadata": {}, "outputs": [], "source": [ "import os\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from tqdm import tqdm\n", "import skimage as ski\n", "from cajal.subcellular import *\n", "\n", "# change to path to where data is located\n", "data_path = '/workspaces/CellAligner/hpa_images_metadata/'\n", "\n", "# load image metadata\n", "image_metadata = pd.read_csv(os.path.join(data_path, 'image_metadata.csv'), index_col=0)" ] }, { "cell_type": "markdown", "id": "7d7166a0", "metadata": {}, "source": [ "We begin by processing the cell images by sampling points from the cell boundary for morphological analysis and extracting information needed for localization analysis. We assume that cell segmentation has already been performed for each image. Nuclear segmentation is optional, but can substantilly improve localization analysis. " ] }, { "cell_type": "code", "execution_count": 3, "id": "e03a6861", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 60/60 [06:32<00:00, 6.54s/it]\n" ] } ], "source": [ "# create list to store cell objects\n", "cell_objects = []\n", "cell_metadata = pd.DataFrame(columns=image_metadata.columns)\n", "for i in tqdm(range(image_metadata.shape[0])):\n", " im_path = os.path.join(data_path, 'images', image_metadata.iloc[i]['image_file'])\n", " # load image\n", " im = ski.io.imread(im_path)\n", " channels = ['microtubules', 'protein', 'DNA'] # names of channels in image\n", " # load cell and nuclear segmentation masks\n", " im_cell_mask = ski.io.imread(im_path.replace('blue_red_green.jpg','predictedmask.png'))\n", " im_nuc_mask = ski.io.imread(im_path.replace('blue_red_green.jpg','predictednucmask.png'))\n", " # create cell objects from image\n", " image_cell_objects = process_image(im, channels, im_cell_mask, im_nuc_mask, ds_target_size=1000)\n", " cell_objects.extend(image_cell_objects)\n", " # save metadata for each cell\n", " n_image_cells = len(image_cell_objects)\n", " cell_metadata = pd.concat([cell_metadata, image_metadata.iloc[i:i+1].reset_index(drop=True).loc[np.repeat(0, n_image_cells)]], ignore_index=True)" ] }, { "cell_type": "markdown", "id": "363d4b4a", "metadata": {}, "source": [ "The resulting `CellAligner_Cell` objects can be kept in memory for faster analysis or written to disk when memory is limited. All functions that take `CellAligner_Cell` objects as input also accept paths to saved `CellAligner_Cell` objects.\n", "\n", "To quantify morphological variation across cells, we compute the Gromov-Wasserstein distance between each pair of cells based on points sampled from their boundaries using intracellular Euclidean distances." ] }, { "cell_type": "code", "execution_count": 4, "id": "d451e68e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 69378/69378 [31:22<00:00, 36.86it/s] \n" ] } ], "source": [ "gw_dmat = gw_pairwise_parallel(cell_objects, num_processes=cpu_count(), chunksize=20) " ] }, { "cell_type": "markdown", "id": "7c526dd3", "metadata": {}, "source": [ "We can then cluster cells based on their pairwise Gromov-Wasserstein morphology distances to identify groups with similar morphologies. For visualization, we can use UMAP to embed the morphology space in two dimensions." ] }, { "cell_type": "code", "execution_count": 6, "id": "a7317fd0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.12/site-packages/umap/umap_.py:1865: UserWarning:\n", "\n", "using precomputed metric; inverse_transform will be unavailable\n", "\n", "/opt/conda/lib/python3.12/site-packages/umap/umap_.py:1952: UserWarning:\n", "\n", "n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n", "\n" ] }, { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import plotly.io as pio\n", "\n", "# Choose the adequate plotly renderer for visualizing plotly graphs in your system\n", "pio.renderers.default = 'notebook_connected'\n", "# pio.renderers.default = 'iframe'\n", "\n", "import cajal.utilities\n", "import umap\n", "import plotly.express\n", "\n", "# Compute UMAP representation of the GW morphology space\n", "reducer = umap.UMAP(metric=\"precomputed\", random_state=1)\n", "embedding = reducer.fit_transform(gw_dmat)\n", "\n", "# Cluster cells based on the GW morphology space using the leiden algorithm\n", "gw_clusters = cajal.utilities.leiden_clustering(gw_dmat, resolution=0.003, seed=1)\n", "\n", "# Visualize the GW morphology space\n", "plotly.express.scatter(x=embedding[:,0],\n", " y=embedding[:,1],\n", " template=\"simple_white\",\n", " hover_name=[\"cell_\" + str(i) for i in range(gw_dmat.shape[0])],\n", " color = [str(c) for c in gw_clusters]\n", " )" ] }, { "cell_type": "markdown", "id": "28b35ff8", "metadata": {}, "source": [ "Cells within the same cluster are expected to have similar morphologies. For example, we can visualize several cells from cluster 1." ] }, { "cell_type": "code", "execution_count": 7, "id": "2603a863", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cells_to_plot = [122, 177, 188] # Example cells from cluster 1\n", "fig, axes = plt.subplots(1, len(cells_to_plot), figsize=(15, 5))\n", "for ax, i in zip(axes, cells_to_plot):\n", " plot_cell_image(cell_objects[i], channels=['nucleus'], ax=ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "45b44dca", "metadata": {}, "source": [ "Before quantifying variation in subcellular localization patterns, we first map the protein localization pattern of each cell to an anchor cell. We recommend choosing the centroid cell in the morphology space as the anchor.\n", "\n", "There are two approaches for mapping cells to the anchor: Fused Gromov-Wasserstein and Fused Unbalanced Gromov-Wasserstein. Fused Gromov-Wasserstein performs a full cell-to-cell mapping, which is appropriate for datasets with relatively simple cell morphologies. Fused Unbalanced Gromov-Wasserstein allows partial cell-to-cell mappings, which is useful for datasets with more complex cell morphologies, such as neurons, where certain cellular structures may be present in one cell but absent in another.\n", "\n", "The “fused” variant of Gromov-Wasserstein allows the mapping between cells to incorporate additional staining or segmentation information. By default, we use the segmented nuclear mask to inform the mapping and improve the alignment of cellular compartments, but other stains or annotations can also be used. The `fused_cost` and `fused_param` parameters control how strongly this additional information contributes to the mapping. Higher values of `fused_cost` and lower values of `fused_param` give greater weight to this information. In practice, we have found the mappings to be more sensitive to changes in `fused_cost` than to changes in `fused_param`.\n", "\n", "Finally, CellAligner-OT also provides an option for compartment-specific mapping. In this mode, nuclear regions in one cell are constrained to map only to nuclear regions in the other cell, and non-nuclear regions are constrained to map only to non-nuclear regions. This option is most important for full, non-unbalanced mappings, where large differences in nuclear size can otherwise lead to poor alignment of cellular compartments." ] }, { "cell_type": "code", "execution_count": 10, "id": "59478b5f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mapping cells to target cell:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 373/373 [1:09:26<00:00, 11.17s/it]\n" ] } ], "source": [ "# We choose the morphological centroid cell as the anchor cell to map to\n", "target_cell_ind = find_centroid(gw_dmat)\n", "\n", "channels_to_map = ['protein'] # which distributions to quantify variation in localization patterns for\n", "# Mapping all cells to anchor cell\n", "mapped_distbs = map_to_anchor_cell(cell_objects, \n", " channels_to_map, \n", " target_cell_ind, # cell to map to\n", " method='fused', # 'fused' for full mapping, 'fused' for partial mapping\n", " fused_channel='nucleus', # addition info to consider for mapping\n", " fused_cost=1000, fused_param=0.1, # controls weight of additional info\n", " compartment_specific=True) # enforces strict mapping of nucleus to nucleus" ] }, { "cell_type": "markdown", "id": "00434624", "metadata": {}, "source": [ "To assess whether the mapping parameters are appropriate, we can visualize examples of the localization patterns after mapping to the anchor cell." ] }, { "cell_type": "code", "execution_count": 11, "id": "fe14f406", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABcgAAAPmCAYAAADQQXwHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADMgElEQVR4nOzde3hU1dn//08IJAEhwXBIiCSIiCDhYI0VUpUioBGVokQtHtFSrRZ5BLS18esJqoZq66mFqC0P2GqkoqJVH6FIJWgLViIUhEqFgoAQQDQJBDJgsn9/+MvISMK+92QmM8m8X9c115XMuufea+/ZM2tmzdprxTmO4wgAAAAAAAAAgBjTKtIVAAAAAAAAAAAgEuggBwAAAAAAAADEJDrIAQAAAAAAAAAxiQ5yAAAAAAAAAEBMooMcAAAAAAAAABCT6CAHAAAAAAAAAMQkOsgBAAAAAAAAADGJDnIAAAAAAAAAQEyigxwAAAAAAAAAEJPoIAea0P3336+4uLigHjt37lzFxcVpy5Ytoa3UEbZs2aK4uDjNnTs3bNs4lvqOz4knnqjrr78+IvUBAMQe2upjo60GAEQD2utjo70GvKGDHDBYt26drrnmGp1wwglKTExURkaGrr76aq1bty7SVYuoXbt26Y477lDfvn3Vrl07HXfcccrJydEDDzyg8vLyJq/PX/7yF51++ulKSkpSVlaW7rvvPn311VdNXg8AQNOjra5fNLXV+/fv1+TJk9W9e3clJibq1FNPVVFRUb2xixcv1tlnn6127drp+OOP12WXXRbWjgwAQNOgva5fNLXXU6ZM0emnn67U1FS1a9dOp556qu6//37t378/IG7//v267777dMEFFyg1NdX1B4F///vfuuCCC9S+fXulpqbq2muv1Z49e8K8N4BN60hXAIh2r7zyiq688kqlpqZqwoQJ6tmzp7Zs2aLZs2frpZde0rx583TppZeact199936xS9+EVQ9rr32Wo0bN06JiYlBPT7UPvjgA1144YXav3+/rrnmGuXk5EiSVq5cqRkzZmjZsmX661//2mT1eeutt3TJJZdo2LBh+u1vf6u1a9fqgQce0O7duxv88g0AaBloq+sXTW11TU2N8vLytHLlSk2cOFG9e/fWokWL9NOf/lRffvml7rrrLn/sG2+8oTFjxuj000/XjBkzVFlZqSeeeEJnn322Vq1apS5dujRJnQEAoUV7Xb9oaq/r6nPOOefohhtuUFJSklatWqUZM2bo7bff1rJly9Sq1ddjbT///HNNnz5dWVlZGjRokJYuXdpgzu3bt2vo0KFKSUnRQw89pP379+vXv/611q5dq3/+859KSEhoor0DGuAAaNDGjRuddu3aOX379nV2794dULZnzx6nb9++znHHHeds2rTpmHn2798fzmqGzObNmx1Jzpw5c44Z9+WXXzonnHCCk5aW5vz73/8+qrysrMz55S9/6Xn79913n/Ptt6UePXo448ePd31sv379nEGDBjmHDx/23/f//t//c+Li4uqtIwCgZaCtrl+0tdUvvviiI8mZPXt2wP35+flOUlKSs2vXLv99/fr1c04++WTH5/P571u9erXTqlUrZ+rUqZ7rDACIPNrr+kVbe92QX//6144kZ/ny5f77qqurnZ07dzqO4zgffPDBMff3lltucdq2bet8+umn/vsWL17sSHKefvrpoOoEhBJTrADH8Mgjj+jAgQN65plnjhqt1LlzZz399NOqqqrSww8/7L+/bq6v9evX66qrrtLxxx+vs88+O6DsSAcPHtT//M//qHPnzurQoYN+8IMf6LPPPlNcXJzuv/9+f1x986SdeOKJuvjii/Xee+/pzDPPVFJSkk466ST98Y9/DNjGF198oTvuuEMDBgxQ+/btlZycrFGjRulf//pXUMfl6aef1meffaZHH31Uffv2Pao8LS1Nd999d8B9b731ls455xwdd9xx6tChgy666KKQXUa3fv16rV+/XjfddJNat/7mwpif/vSnchxHL730Uki2AwCIPrTV9Yu2tvrdd9+VJI0bNy7g/nHjxqm6ulqvvfaapK+Pw/r163XppZcGjCYbNGiQTj31VM2bNy8k9QEANC3a6/pFW3vdkBNPPFGSAqZ7SUxMVHp6uunxL7/8si6++GJlZWX57xs5cqROOeUUvfjii6GsKhAUOsiBY3j99dd14okn6pxzzqm3fOjQoTrxxBP15ptvHlV2+eWX68CBA3rooYd04403NriN66+/Xr/97W914YUX6le/+pXatm2riy66yFzHjRs36rLLLtN5552n3/zmNzr++ON1/fXXBzSQ//3vf/Xqq6/q4osv1qOPPqqf/exnWrt2rb7//e9rx44d5m3V+ctf/qK2bdvqsssuM8X/6U9/0kUX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f8Xr5ORkFRUV6dprr9Xpp5+ucePGqUuXLtq6davefPNNnXXWWfrd737X6H185JFH9IMf/EDnn3++xo0bp48++ki/+93v9OMf/1innnpqo/MDAKITbXX9orGt/v73v6/c3FydfPLJKisr0zPPPKP9+/frjTfe8C94JknPPfecXn75ZQ0dOlTt27fX22+/rRdffFE//vGPlZ+f3+h6AACaHu11/aKtvV66dKn+53/+R5dddpl69+6tQ4cO6d1339Urr7yiM844Q9dcc01A/O9+9zuVl5f7p0x7/fXXtX37dklfL5CakpIiSbrrrrs0f/58nXvuubrtttu0f/9+PfLIIxowYIBuuOGGRtUZCAU6yAEXl19+ufr27avCwkJ/w92pUyede+65uuuuu9S/f/9G5f/jH/+o9PR0vfDCC1qwYIFGjhypP//5z+rTp49/RefGuuuuu1RVVaXi4mL9+c9/1umnn64333xTv/jFL4LOOXjwYH300Ud65JFH9Oabb+pPf/qTWrVqpVNPPVW/+MUvdOutt/pjr7rqKmVkZGjGjBl65JFH5PP5dMIJJ+icc84JWWN48cUX65VXXtG0adM0adIkdenSRXfddZfuvffekOQHAEQv2ur6RVtbnZOT4x9ll5ycrPPOO0+//OUvj+pUOOWUU/TFF1/ol7/8pQ4ePKg+ffroqaeeYso0AGjmaK/rF03t9YABA3Tuuefqtdde086dO+U4jnr16qV7771XP/vZz46aJ/3Xv/61Pv30U///r7zyil555RVJ0jXXXOPvIM/MzFRJSYmmTp2qX/ziF0pISNBFF12k3/zmN8w/jqgQ53z72hAAEbd69Wp95zvf0XPPPaerr7460tUBAADfQlsNAED0o70GYMEc5ECEHTx48Kj7Hn/8cbVq1UpDhw6NQI0AAMCRaKsBAIh+tNcAgsUUK0CEPfzwwyotLdW5556r1q1b66233tJbb72lm266SZmZmZGuHgAAMY+2GgCA6Ed7DSBYTLECRNjixYs1bdo0rV+/Xvv371dWVpauvfZa/b//9//UujW/YQEAEGm01QAARD/aawDBooMcAAAAAAAAABCTmIMcAAAAAAAAABCT6CAHAAAAAAAAAMSkqJuEqba2Vjt27FCHDh0UFxcX6eoAABASjuNo3759ysjIUKtWLfP3adpwAEBLRBsOAEDz46X9DlsH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ICbRQQ4AAAAAAAAAiEl0kAMAAAAAAAAAYhId5AAAAAAAAACAmEQHOYAAw4YN07BhwyKy7S1btiguLk5z587133f//fcrLi4uIvUBACBa0V4DABDdaKuB5oMOcqABc+fOVVxcnOLi4vTee+8dVe44jjIzMxUXF6eLL744AjWMvJqaGs2ZM0fDhg1TamqqEhMTdeKJJ+qGG27QypUrm7w+n332ma644gp17NhRycnJGjNmjP773/82eT0AAE2H9tpdtLXX8+bN0+mnn66kpCR16dJFEyZM0Oeff35U3K5du3TDDTeoa9euatu2rU4//XTNnz+/yesLAGgc2mp30dRWL1iwQHl5ecrIyFBiYqK6d++uyy67TB999NFRsX/+8591zTXXqHfv3oqLizvmDwI+n0933nmnMjIy1LZtWw0ePFiLFy8O454AdnSQAy6SkpJUXFx81P0lJSXavn27EhMTI1CryDt48KAuvvhi/ehHP5LjOLrrrrtUVFSk6667TsuXL9eZZ56p7du3N1l99u/fr3PPPVclJSW66667NG3aNK1atUrf//73tXfv3iarBwAgMmiv6xdt7XVRUZGuvPJKpaam6tFHH9WNN96oefPmacSIEaqurvbHVVZW6uyzz9bLL7+sn/zkJ/r1r3+tDh066Iorrqj3eQYARD/a6vpFW1u9du1aHX/88brttts0a9Ys3XLLLVq1apXOPPNM/etf/wqILSoq0muvvabMzEwdf/zxx8x7/fXX69FHH9XVV1+tJ554QvHx8brwwgvr/dEEaGqtI10BINpdeOGFmj9/vp588km1bv3NS6a4uFg5OTn1jniKBT/72c+0cOFCPfbYY5o8eXJA2X333afHHnusSesza9YsffLJJ/rnP/+p7373u5KkUaNGqX///vrNb36jhx56qEnrAwBoWrTX9Yum9vrQoUO66667NHToUC1evNh/mff3vvc9jR49Wr///e81adIkSdLTTz+tjRs3asmSJRo+fLgk6ZZbbtGQIUN0++2367LLLlNCQkKT1R0A0Hi01fWLprZaku69996j7vvxj3+s7t27q6ioSE899ZT//j/96U864YQT1KpVK/Xv37/BnP/85z81b948PfLII7rjjjskSdddd5369++vn//85/rHP/4R+h0BPGAEOeDiyiuv1N69ewMu/Tl06JBeeuklXXXVVfU+5te//rW+973vqVOnTmrbtq1ycnL00ksvHRUXFxenW2+9Vc8//7z69OmjpKQk5eTkaNmyZQFxdXOFffzxx7riiiuUnJysTp066bbbbgsYbVXnueeeU05Ojtq2bavU1FSNGzdO27ZtOyrumWeeUa9evdS2bVudeeaZevfdd03HZPv27Xr66ad13nnnHdWAS1J8fLzuuOMOde/e3X/fZ599ph/96EdKS0tTYmKisrOz9b//+7+m7Vm89NJL+u53v+vvHJekvn37asSIEXrxxRdDth0AQHSivT5atLXXH330kcrLy/XDH/4wYA7Uiy++WO3bt9e8efP897377rvq0qWLv3Ncklq1aqUrrrhCZWVlKikpCUmdAABNh7b6aNHWVjeka9euateuncrLywPuz8zMVKtW7l2LL730kuLj43XTTTf570tKStKECRO0fPnyeo8p0JToIAdcnHjiicrNzdULL7zgv++tt95SRUWFxo0bV+9jnnjiCX3nO9/R9OnT9dBDD6l169a6/PLL9eabbx4VW1JSosmTJ+uaa67R9OnTtXfvXl1wwQX1zu91xRVXqLq6WoWFhbrwwgv15JNPBjQwkvTggw/quuuuU+/evfXoo49q8uTJWrJkiYYOHRrQmM2ePVs/+clPlJ6erocfflhnnXWWfvCDH5gaprfeektfffWVrr32WtdY6es5RIcMGaK3335bt956q5544gmdfPLJmjBhgh5//HFTjmOpra3VmjVrdMYZZxxVduaZZ2rTpk3at29fo7cDAIhetNdHi7b22ufzSZLatm17VFnbtm21atUq1dbW+mPri2vXrp0kqbS0tNH1AQA0Ldrqo0VbW32k8vJy7dmzR2vXrtWPf/xjVVZWasSIEUHlWrVqlU455RQlJycH3H/mmWdKklavXt3Y6gKN4wCo15w5cxxJzgcffOD87ne/czp06OAcOHDAcRzHufzyy51zzz3XcRzH6dGjh3PRRRcFPLYurs6hQ4ec/v37O8OHDw+4X5IjyVm5cqX/vk8//dRJSkpyLr30Uv999913nyPJ+cEPfhDw+J/+9KeOJOdf//qX4ziOs2XLFic+Pt558MEHA+LWrl3rtG7d2n//oUOHnK5duzqnnXaa4/P5/HHPPPOMI8n5/ve/f8xjM2XKFEeSs2rVqmPG1ZkwYYLTrVs35/PPPw+4f9y4cU5KSor/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mzevNm/eXHfccUf98i//cv3mb/5mzZw5s6655pr6lV/5lTrvvPPqXe96V23evLluueWW6PekVVX9/u//fn3961+vX//1X6+//Mu/rJ/6qZ+q+fPn1+OPP1633357PfbYY/Xud7+7qqquu+66uvvuu+vss8+uf/Nv/k2tWLGinn322XrwwQfrb/7mb+rZZ5+NjvmD/Nqv/Vp97GMfq3e84x0HHuMf/MEf1KJFi+o3fuM3jnh9AKYOff1dk62vr7vuunr00Ufr7LPPrv7+/vrUpz5Vn//85+uaa6456E7xqqoVK1bUz/3cz9WyZctq8+bNddNNN9WCBQvqIx/5yBHvA4De0tXfNdm6+tRTT63zzz+/zjjjjJo/f3599atfrZtvvrn27t1b11133UHZe+65p+65556q+ucB/a5du+qaa66pqqq3vvWt9da3vrWqqs4+++z6uZ/7uVq3bl099dRTdfLJJ9cf//Ef1ze+8Y26+eabj3jPcMQ6wCu65ZZbOlXVeeCBB35g7sQTT+y84x3vOOh7N998c+eUU07pDAwMdJYvX9655ZZbOldffXXnpX/lqqqzdu3azic/+ckD+R/+4R/u3H333QflvvPvbty4sfOzP/uznXnz5nXmz5/fueyyyzovvvjiy/b03/7bf+u85S1v6cyZM6czZ86czvLlyztr167tbNq06aDcjTfe2DnppJM6AwMDnTPPPLNzzz33dM4999zOueeeG52jffv2dT7+8Y93fvRHf7QzNDTUmTlzZufEE0/svOc97+n8/d///UHZbdu2ddauXdtZunRpZ+bMmZ3Fixd3zj///M5/+k//6UBm8+bNnarq3HLLLS977IktW7Z0fvZnf7YzODjYmTt3buenfuqnOl/96lejfxeAqUlfj28y9fVnPvOZzllnndWZN29e55hjjumcc845nT//8z9/xey73/3uztKlSzuzZs3qLFmypPOrv/qrnW3btkWPGYDJQ1ePbzJ19dVXX90588wzO/Pnz+/09/d3lixZ0nn3u9/defjhh18xW1Wv+HX11VcflH3xxRc7v/mbv9lZvHhxZ2BgoPOmN72p89nPfjY6PzDR+jqdl/x/RYCu6evrq7Vr19aHP/zhH5j7j//xP9bv/M7v1NNPP13HHXdcl3YHAFTpawCY7HQ1cCT8DnIAAAAAAFrJgBwAAAAAgFYyIAcA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54+/AQAAAABgHAbkAAAAAAC00pQYkA8MDNTVV19dAwMDvd7KtOdcd5fz3V3Od/c413yH10L3ONfd5Xx3j3PdXc433+G10D3OdXc5393jXHeX8334Jt1/pBMAAAAAALphStxBDgAAAAAATTMgBwAAAACglQzIAQAAAABoJQNyAAAAAABaadIPyG+44YZ67WtfW7Nnz66zzz67vvSlL/V6S9PCPffcUz/90z9dS5Ysqb6+vvrUpz510J93Op367d/+7Xr1q19dRx99dF1wwQX11a9+tTebneKuvfbaetOb3lTz5s2r448/vi666KLatGnTQZndu3fX2rVra+HChTV37ty65JJLatu2bT3a8dR200031WmnnVaDg4M1ODhYa9asqb/+678+8OfO9cS57rrrqq+vr6688soD33O+202HTwwd3j06vLt0eO/ocF5Kh08MHd49Ory7dHjv6PBmTOoB+Z/92Z/VVVddVVdffXU9+OCDdfrpp9eFF15YTz31VK+3NuXt2rWrTj/99Lrhhhte8c8/8IEP1Ic+9KH6yEc+Uvfff3/NmTOnLrzwwtq9e3eXdzr1rV+/vtauXVv33Xdf3XnnnbV3795629veVrt27TqQed/73lef/vSn6/bbb6/169fXE088URdffHEPdz11nXDCCXXdddfV8PBwffnLX67zzjuv3vnOd9aGDRuqyrmeKA888EB99KMfrdNOO+2g7zvf7aXDJ44O7x4d3l06vDd0OC+lwyeODu8eHd5dOrw3dHiDOpPYWWed1Vm7du2Bf96/f39nyZIlnWuvvbaHu5p+qqpzxx13HPjnsbGxzuLFizu/93u/d+B727dv7wwMDHT+63/9rz3Y4fTy1FNPdaqqs379+k6n88/ndubMmZ3bb7/9QOYrX/lKp6o69957b6+2Oa3Mnz+/8/GPf9y5niA7d+7snHLKKZ0777yzc+6553auuOKKTqfjtd12Orw7dHh36fDu0+ETS4fzSnR4d+jw7tLh3afDJ5YOb9akvYN8z549NTw8XBdccMGB7x111FF1wQUX1L333tvDnU1/mzdvrq1btx507oeGhurss8927hswMjJSVVULFiyoqqrh4eHau3fvQed7+fLltWzZMuf7CO3fv79uu+222rVrV61Zs8a5niBr166td7zjHQed1yqv7TbT4b2jwyeWDu8eHd4dOpyX0uG9o8Mnlg7vHh3eHTq8Wf293sD388wzz9T+/ftr0aJFB31/0aJF9dhjj/VoV+2wdevWqqpXPPff+TMOz9jYWF155ZX15je/uVatWlVV/3y+Z82aVccee+xBWef78D3yyCO1Zs2a2r17d82dO7fuuOOOWrFiRT300EPOdcNuu+22evDBB+uBBx542Z95bbeXDu8dHT5xdHh36PDu0eG8Eh3eOzp84ujw7tDh3aPDmzdpB+QwHa1du7YeffTR+tu//dteb2Vae/3rX18PPfRQjYyM1F/8xV/UpZdeWuvXr+/1tqadLVu21BVXXFF33nlnzZ49u9fbAZhQOrw7dHh36HCgTXR4d+jw7tDhE2PS/oqV4447rmbMmPGy/8rqtm3bavHixT3aVTt85/w698267LLL6jOf+UzdfffddcIJJxz4/uLFi2vPnj21ffv2g/LO9+GbNWtWnXzyybV69eq69tpr6/TTT68//MM/dK4bNjw8XE899VS98Y1vrP7+/urv76/169fXhz70oerv769FixY53y2lw3tHh08MHd49Orw7dDjfjw7vHR0+MXR49+jw7tDhE2PSDshnzZpVq1evrrvuuuvA98bGxuquu+6qNWvW9HBn099JJ51UixcvPujc79ixo+6//37n/jB0Op267LLL6o477qgvfOELddJJJx3056tXr66ZM2cedL43bdpUjz/+uPPdkLGxsRodHXWuG3b++efXI488Ug899NCBrzPPPLN+4Rd+4cD/dr7bSYf3jg5vlg7vPR0+MXQ4348O7x0d3iwd3ns6fGLo8IkxqX/FylVXXVWXXnppnXnmmXXWWWfV9ddfX7t27ar3vOc9vd7alPf888/X1772tQP/vHnz5nrooYdqwYIFtWzZsrryyivrmmuuqVNOOaVOOumkev/7319Lliypiy66qHebnqLWrl1bt956a/3VX/1VzZs378DvfBoaGqqjjz66hoaG6r3vfW9dddVVtWDBghocHKzLL7+81qxZU+ecc06Pdz/1rFu3rt7+9rfXsmXLaufOnXXrrbfWF7/4xfrc5z7nXDds3rx5B36H33fMmTOnFi5ceOD7znd76fCJo8O7R4d3lw7vHh3OD6LDJ44O7x4d3l06vHt0+ATpTHJ/9Ed/1Fm2bFln1qxZnbPOOqtz33339XpL08Ldd9/dqaqXfV166aWdTqfTGRsb67z//e/vLFq0qDMwMNA5//zzO5s2bertpqeoVzrPVdW55ZZbDmRefPHFzq/92q915s+f3znmmGM6/+pf/avOk08+2btNT2G/9Eu/1DnxxBM7s2bN6rzqVa/qnH/++Z3Pf/7zB/7cuZ5Y5557bueKK6448M/Od7vp8Imhw7tHh3eXDu8tHc730uETQ4d3jw7vLh3eWzr8yPV1Op3OhE/hAQAAAABgkpm0v4McAAAAAAAmkgE5AAAAAACtZEAOAAAAAEArGZADAAAAANBKBuQAAAAAALSSATkAAAAAAK1kQA4AAAAAQCsZkAMAAAAA0EoG5AAAAAAAtJIBOQAAAAAArWRADgAAAABAKxmQAwAAAADQSv8/kp4lU7+Yvf4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cells_to_plot = [0, 99, 310]\n", "fig, axes = plt.subplots(2, len(cells_to_plot), figsize=(15, 10))\n", "\n", "for idx, i in enumerate(cells_to_plot):\n", " # Plotting original cell\n", " plot_cell_image(cell_objects[i], channels=['nucleus', 'protein'], ax=axes[0, idx])\n", " axes[0, idx].set_title(f'Original Cell {i}')\n", " \n", " # Plotting mapped cell\n", " mapped_cell_object = cell_objects[target_cell_ind].copy()\n", " for j, channel in enumerate(channels_to_map):\n", " mapped_cell_object.intensities[channel] = mapped_distbs[j][i]\n", " plot_cell_image(mapped_cell_object, channels=['nucleus', 'protein'], ax=axes[1, idx])\n", " axes[1, idx].set_title(f'Mapped Cell {i}')\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "a459d477", "metadata": {}, "source": [ "After mapping all cells to the anchor cell, we compute pairwise Wasserstein distances between the mapped protein distributions to quantify differences in subcellular localization. As in the morphology analysis, we can cluster cells based on these localization distances to identify groups with similar protein localization patterns and use UMAP to visualize the resulting space in two dimensions." ] }, { "cell_type": "code", "execution_count": 12, "id": "4917bb17", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Computing pairwise OT distances:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 69378/69378 [41:01<00:00, 28.18it/s] \n" ] } ], "source": [ "ot_dmats = gw_mapped_ot_pairwise_parallel(cell_objects[target_cell_ind], mapped_distbs, num_processes=cpu_count(), chunksize=20)" ] }, { "cell_type": "code", "execution_count": 13, "id": "696ee320", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.12/site-packages/umap/umap_.py:1865: UserWarning:\n", "\n", "using precomputed metric; inverse_transform will be unavailable\n", "\n", "/opt/conda/lib/python3.12/site-packages/umap/umap_.py:1952: UserWarning:\n", "\n", "n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n", "\n" ] }, { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Compute UMAP representation of the OT localization space\n", "reducer = umap.UMAP(metric=\"precomputed\", random_state=1)\n", "embedding = reducer.fit_transform(ot_dmats[0])\n", "\n", "# Cluster cells based on the OT localization space using the leiden algorithm\n", "ot_clusters = cajal.utilities.leiden_clustering(ot_dmats[0], resolution=0.005, seed=1)\n", "\n", "# Visualize the OT localization space\n", "plotly.express.scatter(x=embedding[:,0],\n", " y=embedding[:,1],\n", " template=\"simple_white\",\n", " hover_name=[\"cell_\" + str(i) for i in range(ot_dmats[0].shape[0])],\n", " color = [str(c) for c in ot_clusters]\n", " )" ] }, { "cell_type": "markdown", "id": "13f8e5cb", "metadata": {}, "source": [ "We can visualize representative cells from cluster 0 together with their protein distributions." ] }, { "cell_type": "code", "execution_count": 14, "id": "839bec6f", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cells_to_plot = [335, 270, 309] # Example cells from cluster 0\n", "fig, axes = plt.subplots(1, len(cells_to_plot), figsize=(15, 5))\n", "for ax, i in zip(axes, cells_to_plot):\n", " plot_cell_image(cell_objects[i], channels=['nucleus', 'protein'], ax=ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "ed7eb1dc", "metadata": {}, "source": [ "We can also color the UMAP representation of the optimal transport localization space by the localization pattern annotations from the Human Protein Atlas. As expected, the annotated localization patterns separate in the localization space." ] }, { "cell_type": "code", "execution_count": 15, "id": "77c4d262", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plotly.express.scatter(x=embedding[:,0],\n", " y=embedding[:,1],\n", " template=\"simple_white\",\n", " hover_name=np.array([\"cell_\" + str(i) for i in range(ot_dmats[0].shape[0])]),\n", " color = np.array([str(c) for c in cell_metadata['locations']])\n", " )" ] }, { "cell_type": "markdown", "id": "86df85ac", "metadata": {}, "source": [ "## Applying existing cell image analysis methods to mapped cells\n", "\n", "CellAligner-OT uses optimal transport distances to quantify differences in subcellular protein localization after mapping each cell to the anchor-cell morphology. However, mapped cells can also be used as input to existing cell image analysis methods, such as [CellProfiler](https://cellprofiler.org/), [Cytoself](https://github.com/royerlab/cytoself), or [Paired Cell Inpainting](https://github.com/alexxijielu/paired_cell_inpainting). For downstream analysis with external tools, we can export the mapped cells as individual images." ] }, { "cell_type": "code", "execution_count": null, "id": "7de842c7", "metadata": {}, "outputs": [], "source": [ "output_dir = '/workspaces/CellAligner/mapped_cell_images' # Path to save mapped cell images (the folder must already exist)\n", "cell_image_channels = ['nucleus', 'protein']\n", "for i in range(len(cell_objects)):\n", " # Create a cell object for the mapped cell\n", " mapped_cell_object = cell_objects[target_cell_ind].copy()\n", " for j, channel in enumerate(channels_to_map):\n", " mapped_cell_object.intensities[channel] = mapped_distbs[j][i]\n", " # Generate cell image from mapped cell object\n", " mapped_cell_image = make_cell_image(mapped_cell_object, channels=cell_image_channels)\n", " # Write mapped cell image to file\n", " ski.io.imsave(os.path.join(output_dir, f'mapped_cell_image_{i}.tif'), mapped_cell_image)" ] }, { "cell_type": "markdown", "id": "c37a71ec", "metadata": {}, "source": [ "The `make_cell_image` function generates multi-channel images. The first channel contains the cell segmentation mask, and the remaining channels correspond to the entries specified by the `channels` parameter." ] }, { "cell_type": "markdown", "id": "8b7a9703", "metadata": {}, "source": [ "## Using multiple anchor cells\n", "\n", "One characteristic of CellAligner is that localization analysis after anchor-cell mapping can depend on the choice of anchor cell. In practice, we have found that choosing the centroid cell in the GW morphology space often produces informative localization analyses. However, users may want their analysis to be more robust to the choice of anchor cell.\n", "\n", "To address this, we suggest mapping the protein distributions of each cell to multiple anchor cells and integrating the resulting localization spaces. One natural way to select anchor cells is to first cluster the GW morphology space and then choose the centroid cell from each morphological cluster. This approach uses a broad range of cellular morphologies when constructing the localization spaces.\n", "\n", "Here, we use CellAligner-OT to construct a separate localization space for each anchor cell. Note that, because this approach repeats the GW-based mapping and optimal transport computations for each anchor cell, it can substantially increase the runtime of the analysis." ] }, { "cell_type": "code", "execution_count": 19, "id": "a0d31aeb", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Find centroid cell for each GW morphology cluster\n", "cluster_centroids = []\n", "for c in np.unique(gw_clusters):\n", " cluster_inds = np.where(gw_clusters == c)[0]\n", " # subset the GW distance matrix to only the cells in the cluster\n", " gw_dmat_cluster = gw_dmat[np.ix_(cluster_inds, cluster_inds)]\n", " # find the centroid cell in the cluster\n", " cluster_centroid_idx = find_centroid(gw_dmat_cluster)\n", " cluster_centroid = cluster_inds[cluster_centroid_idx]\n", " cluster_centroids.append(cluster_centroid)\n", "\n", "# Visualize centroid cells for each GW morphology cluster\n", "fig, axes = plt.subplots(1, len(cluster_centroids), figsize=(15, 5))\n", "for ax, i in zip(axes, cluster_centroids):\n", " plot_cell_image(cell_objects[i], channels=['nucleus'], ax=ax)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 20, "id": "60e26557", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mapping cells to target cell:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 373/373 [1:32:34<00:00, 14.89s/it]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Computing pairwise OT distances:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "100%|██████████| 69378/69378 [41:37<00:00, 27.78it/s] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Mapping cells to target cell:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 373/373 [1:31:14<00:00, 14.68s/it]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Computing pairwise OT distances:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "100%|██████████| 69378/69378 [39:04<00:00, 29.59it/s] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Mapping cells to target cell:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 373/373 [1:20:07<00:00, 12.89s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Computing pairwise OT distances:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 69378/69378 [40:30<00:00, 28.54it/s] \n" ] } ], "source": [ "centroid_mapped_distbs = []\n", "centroid_ot_dmats = []\n", "for target_cell_ind in cluster_centroids[1:]:\n", " # Mapping all cells to anchor cell\n", " mapped_distbs = map_to_anchor_cell(cell_objects, \n", " channels_to_map, \n", " target_cell_ind, # cell to map to\n", " method='fused', # 'fused' for full mapping, 'fused' for partial mapping\n", " fused_channel='nucleus', # addition info to consider for mapping\n", " fused_cost=1000, fused_param=0.1, # controls weight of additional info\n", " compartment_specific=True) # parallelization parameters\n", " # Compute OT distance matrix for the mapped protein distributions\n", " ot_dmats = gw_mapped_ot_pairwise_parallel(cell_objects[target_cell_ind], mapped_distbs, num_processes=cpu_count(), chunksize=20)\n", " centroid_mapped_distbs.append(mapped_distbs)\n", " centroid_ot_dmats.append(ot_dmats)\n", "\n", " out_dir = '/workspaces/CellAligner/mapped_distances' # Path to save distance matrices (the folder must already exist) \n", " for target_cell_ind, mapped_distbs, ot_dmats in zip(cluster_centroids, centroid_mapped_distbs, centroid_ot_dmats):\n", " with open(os.path.join(out_dir, f'anchor_{target_cell_ind}_mapped_distbs.pickle'), 'wb') as f:\n", " pickle.dump(mapped_distbs, f, protocol=pickle.HIGHEST_PROTOCOL)\n", " with open(os.path.join(out_dir, f'anchor_{target_cell_ind}_ot_dmats.pickle'), 'wb') as f:\n", " pickle.dump(ot_dmats, f, protocol=pickle.HIGHEST_PROTOCOL)" ] }, { "cell_type": "markdown", "id": "3c0b69e4", "metadata": {}, "source": [ "Having computed a subcellular localization space based on each cluster centroid, we now build a consolidated space that integrates information across the individual localization spaces. We do this using the Weighted Nearest Neighbors (WNN) algorithm introduced in:\n", "\n", "- Hao, Y. et al. [Integrated analysis of multimodal single-cell data.](https://www.sciencedirect.com/science/article/pii/S0092867421005833) *Cell* 184, 3573–3587 (2021).\n", "\n", "We first construct one `Modality` object for each localization space. The `cajal.wnn.wnn()` function then takes a list of `Modality` objects, together with the number of nearest neighbors to consider in each space." ] }, { "cell_type": "code", "execution_count": 22, "id": "dd369efe", "metadata": {}, "outputs": [], "source": [ "import cajal.wnn\n", "\n", "# Extract protein OT dmat from each centroid cell\n", "centroid_protein_ot_modalities = [cajal.wnn.Modality.of_dmat(ot_dmats[0]) for ot_dmats in centroid_ot_dmats]\n", "# Integrate OT localization spaces from each centroid cell using WNN\n", "integrated_space = 1-cajal.wnn.wnn(centroid_protein_ot_modalities, k=5)" ] }, { "cell_type": "markdown", "id": "4e979675", "metadata": {}, "source": [ "The Weighted Nearest Neighbors algorithm returns an asymmetric similarity matrix. For visualization with UMAP, we symmetrize the matrix before embedding the consolidated representation in two dimensions." ] }, { "cell_type": "code", "execution_count": 23, "id": "64fe8dd2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def symmetrize(a):\n", " a = a.copy()\n", " a[a == 0] = np.max(a)\n", " b = a + a.T\n", " b = np.minimum(a,b)\n", " b = np.minimum(b,a.T)\n", " d=np.zeros(a.shape[0],dtype=int)\n", " b[d,d]=0\n", " return np.array(b)\n", "\n", "wnn_dmat = symmetrize(integrated_space)\n", "\n", "# Compute UMAP representation of the OT localization space\n", "reducer = umap.UMAP(metric=\"precomputed\", random_state=1)\n", "embedding = reducer.fit_transform(wnn_dmat)\n", "\n", "# Visualize the OT localization space\n", "plotly.express.scatter(x=embedding[:,0],\n", " y=embedding[:,1],\n", " template=\"simple_white\",\n", " hover_name=[\"cell_\" + str(i) for i in range(wnn_dmat.shape[0])],\n", " color = [str(c) for c in cell_metadata['locations']]\n", " )" ] } ], "metadata": { "kernelspec": { "display_name": "base", "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.12.8" } }, "nbformat": 4, "nbformat_minor": 5 }