From 01c60bc853137176f5ad7a66fbcaef99dfaf91db Mon Sep 17 00:00:00 2001 From: aliceeeeeeeeee Date: Sun, 6 Jul 2025 17:30:29 +0200 Subject: [PATCH 1/4] adding labels to filtering and correlation plots --- ...patial_correlation_analysis_notebook.ipynb | 89 ++++--------------- .../spectral_filtering_notebook.ipynb | 41 +++++---- 2 files changed, 40 insertions(+), 90 deletions(-) diff --git a/src/tapenade/notebooks/spatial_correlation_analysis_notebook.ipynb b/src/tapenade/notebooks/spatial_correlation_analysis_notebook.ipynb index 7bd96ad..6c7ec44 100644 --- a/src/tapenade/notebooks/spatial_correlation_analysis_notebook.ipynb +++ b/src/tapenade/notebooks/spatial_correlation_analysis_notebook.ipynb @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -79,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -100,30 +100,13 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_85973/16992269.py:2: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", - " fig.show()\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = spatial_correlation_plotter.get_heatmap_figure()\n", + "ax.set_xlabel('Hoechst')\n", + "ax.set_ylabel('T-Bra')\n", "fig.show()" ] }, @@ -138,60 +121,24 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function get_heatmap_figure in module tapenade.analysis.spatial_correlation._spatial_correlation_plotter:\n", - "\n", - "get_heatmap_figure(self, bins: tuple = (40, 40), show_individual_cells: bool = False, show_linear_fit: bool = True, normalize_quantities: bool = False, extent_X: tuple = None, extent_Y: tuple = None, percentiles_X: tuple = (0, 100), percentiles_Y: tuple = (0, 100), log_scale_X: bool = False, log_scale_Y: bool = False, figsize: tuple = (7, 4), label_X: str = 'X', label_Y: str = 'Y', colormap: str = 'plasma', sample_fraction: float = 0.005, display_quadrants: bool = False, fig_ax_tuple: tuple = None)\n", - " Create a heatmap of the spatial correlation between two quantities X and Y.\n", - " \n", - " Parameters:\n", - " - bins: list of two integers, number of bins in each dimension\n", - " - show_individual_cells: bool, if True and if labels was specified in __init__,\n", - " individual cells will be displayed as a scatter plot on top of the heatmap.\n", - " - show_linear_fit: bool, if True, a linear fit will be displayed on the heatmap.\n", - " - normalize_quantities: bool, if True, the quantities will be normalized to have\n", - " zero mean and unit standard deviation.\n", - " - extent_X: tuple of two floats, the extent of the X axis\n", - " - extent_Y: tuple of two floats, the extent of the Y axis\n", - " - percentiles_X: tuple of two floats, only the values of X between these percentiles\n", - " will be considered\n", - " - percentiles_Y: tuple of two floats, the percentiles of Y between thse percentiles\n", - " will be considered\n", - " - log_scale_X: bool, if True, the X axis will be displayed in log scale\n", - " - log_scale_Y: bool, if True, the Y axis will be displayed in log scale\n", - " - figsize: tuple of two floats, the size of the figure\n", - " - label_X: str, the label of the X axis\n", - " - label_Y: str, the label of the Y axis\n", - " - colormap: str, the name of the colormap\n", - " - sample_fraction: float, if labels has not been specified in __init__, sample_fraction\n", - " represents the fraction of the total number of values of X and Y that will be\n", - " randomly selected to be used for the computation of the statistics.\n", - " - display_quadrants: bool, if True, quadrants will be displayed as vertical and horizontal\n", - " dashed lines at the Otsu thresholds of X and Y.\n", - " - fig_ax_tuple: tuple of matplotlib figure and axis, if not None, the heatmap will be\n", - " displayed on the provided figure and axis.\n", - " \n", - " Returns:\n", - " - fig: matplotlib figure\n", - " - ax: matplotlib axis\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "help(SpatialCorrelationPlotter.get_heatmap_figure)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "napari-mine", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -205,9 +152,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.10.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/src/tapenade/notebooks/spectral_filtering_notebook.ipynb b/src/tapenade/notebooks/spectral_filtering_notebook.ipynb index a95cdcd..1575f12 100644 --- a/src/tapenade/notebooks/spectral_filtering_notebook.ipynb +++ b/src/tapenade/notebooks/spectral_filtering_notebook.ipynb @@ -4,15 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "

🏗️

\n", - "This notebook is still under construction !\n", - "

⚠️

\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "\n", + "## Spectral filtering of multichannels images\n", + "\n", "### After clicking on a code cell, press \"Shift+Enter\" to run the code, or click on the \"Run\" button in the toolbar above.
\n", "\n", "### Replace \"...\" signs with the appropriate path to your data.\n", @@ -68,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -113,24 +107,33 @@ "source": [ "z_to_plot = 50 # index of the z-slice to plot\n", "\n", - "fout, axarrout = plt.subplots(1,channels, figsize=(20, 5)) \n", + "fig1, ax1 = plt.subplots(1,channels, figsize=(20, 5)) \n", "\n", "for i in range(channels):\n", - " axarrout[i].imshow(img[z_to_plot,i,:,:])\n", + " ax1[i].imshow(img[z_to_plot,i,:,:])\n", "\n", - "fout2, axarrout2 = plt.subplots(1,channels, figsize=(20, 5))\n", + "fig1.suptitle('Channels before spectral filtering')\n", + "fig2, ax2 = plt.subplots(1,channels, figsize=(20, 5))\n", "\n", "for i in range(channels):\n", - " axarrout2[i].imshow(image_filtered[z_to_plot,i,:,:])\n", + " ax2[i].imshow(image_filtered[z_to_plot,i,:,:])\n", "\n", - "fout.tight_layout()\n", - "fout2.tight_layout()" + "fig2.suptitle('Chanels after spectral filtering')\n", + "fig1.tight_layout()\n", + "fig2.tight_layout()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "napari-mine", + "display_name": "test-tapenade", "language": "python", "name": "python3" }, @@ -144,9 +147,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.10.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 1add8fe64511eb5147dab4cb3c5bbd67f6c2cf97 Mon Sep 17 00:00:00 2001 From: aliceeeeeeeeee Date: Sun, 6 Jul 2025 17:52:06 +0200 Subject: [PATCH 2/4] include visualizaiton of result fused image --- .../notebooks/registration_notebook.ipynb | 37 +++++++++++++++---- src/tapenade/reconstruction/_reconstruct.py | 6 +-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/tapenade/notebooks/registration_notebook.ipynb b/src/tapenade/notebooks/registration_notebook.ipynb index b35189c..40c4c0c 100644 --- a/src/tapenade/notebooks/registration_notebook.ipynb +++ b/src/tapenade/notebooks/registration_notebook.ipynb @@ -39,6 +39,9 @@ "metadata": {}, "source": [ "### Install the registration package by following the user manual available on Tapenade's GitHub page\n", + "conda install vt -c morpheme\n", + "\n", + "pip install 3D-registration\n", "" ] }, @@ -170,7 +173,7 @@ "filename_ref = list_ref[i]\n", "filename_float = list_float[i]\n", "input_voxel = [0.3,0.3,2] #voxel size of your input image (XYZ)\n", - "output_voxel = [0.3,0.3,2] #voxel size of the output registered image (XYZ)\n", + "output_voxel = [1,1,1] #voxel size of the output registered image (XYZ)\n", "channel_reference = 'hoechst' #name of the ubiquitous channel\n", "##if you have a first idea of your tranformations (rotation, translation), you can input them here:\n", "rot = [180,0,0] #XYZ in degrees. ([180,0,0] is a rotation of 180 degrees around the X axis, that we use when flipping the sample)\n", @@ -195,7 +198,7 @@ " rot=rot,\n", " trans2=trans2,\n", " # input_init_trsf_from_plugin=... #path of the json file saved from the plugin\n", - " save_json=Path(path_to_data) / filename_ref, #to save all parameters\n", + " save_json=Path(path_to_data) / filename_ref, #to save all parameters;\n", ")\n", "\n", "##applying the same transformation to the other channels\n", @@ -209,7 +212,7 @@ " floating_image=f\"{filename_float}_{channel}.tif\",\n", " input_voxel=input_voxel,\n", " output_voxel=output_voxel,\n", - " compute_trsf=0,\n", + " compute_trsf=0\n", " )" ] }, @@ -295,12 +298,32 @@ "metadata": {}, "outputs": [], "source": [ - "reconstruction.write_hyperstacks(\n", + "registered_image = reconstruction.write_hyperstacks(\n", " path=Path(path_to_data) / filename_ref / \"fused\",\n", " sample_id=\"fusion\",\n", " channels=channels\n", ")\n", - "#the result is saved under the name 'sample_id'_registered.tif in the folder 'fused'." + "#the result is saved under the name 'fusion_registered.tif in the folder 'fused'." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eaf7c4ab-9a65-477e-8cc5-c3075542eb96", + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " import napari\n", + " napari_installed = True\n", + "except ImportError:\n", + " print(\"napari is not installed, skipping visualization step.\")\n", + " napari_installed = False\n", + "\n", + "if napari_installed:\n", + " viewer=napari.Viewer()\n", + " viewer.add_image(registered_image)\n", + " napari.run()" ] }, { @@ -374,7 +397,7 @@ ], "metadata": { "kernelspec": { - "display_name": "napari-mine", + "display_name": "test-tapenade", "language": "python", "name": "python3" }, @@ -388,7 +411,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.10.18" } }, "nbformat": 4, diff --git a/src/tapenade/reconstruction/_reconstruct.py b/src/tapenade/reconstruction/_reconstruct.py index 2b97de3..f5a31e9 100644 --- a/src/tapenade/reconstruction/_reconstruct.py +++ b/src/tapenade/reconstruction/_reconstruct.py @@ -806,10 +806,8 @@ def write_hyperstacks( tifffile.imwrite( Path(path) / f"{sample_id}_registered.tif", new_image.astype(dtype), - imagej=True, - compression=("zlib", 1), - ) # float16 not compatible with Fiji - + ) + return new_image.astype(dtype) def add_centermass(landmarks, radius: int = 10, centermass_label: int = 10): """ From 7ba494944bca393fa75cc0ca8e795ebd14ecf41d Mon Sep 17 00:00:00 2001 From: aliceeeeeeeeee Date: Sun, 6 Jul 2025 18:05:01 +0200 Subject: [PATCH 3/4] np.product is deprecated --- .../deformation/additional_regionprops_properties.py | 2 +- src/tapenade/notebooks/preprocessing_notebook.ipynb | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/tapenade/analysis/deformation/additional_regionprops_properties.py b/src/tapenade/analysis/deformation/additional_regionprops_properties.py index 34e233d..46e7c81 100644 --- a/src/tapenade/analysis/deformation/additional_regionprops_properties.py +++ b/src/tapenade/analysis/deformation/additional_regionprops_properties.py @@ -200,7 +200,7 @@ def prop_true_strain_tensor(regionprops_prop, scale): principal_lengths = np.array(regionprops_prop.principal_lengths) principal_vectors = regionprops_prop.principal_vectors - denominator = np.power(np.product(principal_lengths), 1 / 3) + denominator = np.power(np.prod(principal_lengths), 1 / 3) true_strains = np.log(principal_lengths / denominator) tensor = ( diff --git a/src/tapenade/notebooks/preprocessing_notebook.ipynb b/src/tapenade/notebooks/preprocessing_notebook.ipynb index f1c62f4..fb5c426 100644 --- a/src/tapenade/notebooks/preprocessing_notebook.ipynb +++ b/src/tapenade/notebooks/preprocessing_notebook.ipynb @@ -75,7 +75,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Before starting, specify if you wish to display each intermediate result in a Napari viewer:" + "Before starting, specify if you wish to display each intermediate result in a Napari viewer\n", + "\n", + "(IF YES,KEEP THE NAPARI WINDOW OPEN)" ] }, { @@ -439,7 +441,7 @@ ], "metadata": { "kernelspec": { - "display_name": "napari-mine", + "display_name": "test-tapenade", "language": "python", "name": "python3" }, @@ -453,7 +455,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.10.18" } }, "nbformat": 4, From ec022f2dcfb5dd1c550b028c8523b085ef51fce1 Mon Sep 17 00:00:00 2001 From: aliceeeeeeeeee Date: Sun, 6 Jul 2025 18:12:40 +0200 Subject: [PATCH 4/4] clear outputs --- .../deformation_analysis_notebook.ipynb | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/tapenade/notebooks/deformation_analysis_notebook.ipynb b/src/tapenade/notebooks/deformation_analysis_notebook.ipynb index b113a34..0bbd5e7 100644 --- a/src/tapenade/notebooks/deformation_analysis_notebook.ipynb +++ b/src/tapenade/notebooks/deformation_analysis_notebook.ipynb @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -103,17 +103,9 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5139/5139 [00:06<00:00, 841.33it/s] \n" - ] - } - ], + "outputs": [], "source": [ "# props is made of objects 'prop' with many morphological properties\n", "# like volume, centroid, etc...\n", @@ -159,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -191,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -230,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -265,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -298,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -322,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -362,7 +354,7 @@ ], "metadata": { "kernelspec": { - "display_name": "napari-mine", + "display_name": "test-tapenade", "language": "python", "name": "python3" }, @@ -376,7 +368,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.10.18" } }, "nbformat": 4,