From 39ea45789077b21560bb7db1e206618c7f43e035 Mon Sep 17 00:00:00 2001 From: Jonas Windhager Date: Sun, 10 Apr 2022 19:28:58 +0200 Subject: [PATCH 1/6] sort analysis stack channels by mass (closes #88) --- scripts/imc_preprocessing.ipynb | 20 +++++++++++++------- scripts/imc_preprocessing.py | 16 +++++++++++----- src/imcsegpipe/__init__.py | 13 ++++++------- src/imcsegpipe/_imcsegpipe.py | 16 ++++++++-------- src/imcsegpipe/utils.py | 13 +++++++++---- 5 files changed, 47 insertions(+), 31 deletions(-) diff --git a/scripts/imc_preprocessing.ipynb b/scripts/imc_preprocessing.ipynb index 66ef105..f2d51bb 100755 --- a/scripts/imc_preprocessing.ipynb +++ b/scripts/imc_preprocessing.ipynb @@ -16,18 +16,20 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "id": "70edc343", "metadata": {}, "outputs": [], "source": [ - "import imcsegpipe\n", - "import pandas as pd\n", "import shutil\n", - "\n", "from pathlib import Path\n", "from tempfile import TemporaryDirectory\n", - "from typing import List" + "from typing import List\n", + "\n", + "import pandas as pd\n", + "\n", + "import imcsegpipe\n", + "from imcsegpipe.utils import sort_channels_by_mass" ] }, { @@ -316,7 +318,9 @@ " imcsegpipe.create_analysis_stacks(\n", " acquisition_dir=acquisition_dir,\n", " analysis_dir=final_images_dir,\n", - " analysis_channels=panel.loc[panel[panel_keep_col] == 1, panel_channel_col].tolist(),\n", + " analysis_channels=sort_channels_by_mass(\n", + " panel.loc[panel[panel_keep_col] == 1, panel_channel_col].tolist()\n", + " ),\n", " suffix=\"_full\",\n", " hpf=50.0,\n", " )\n", @@ -324,7 +328,9 @@ " imcsegpipe.create_analysis_stacks(\n", " acquisition_dir=acquisition_dir,\n", " analysis_dir=ilastik_dir,\n", - " analysis_channels=panel.loc[panel[panel_ilastik_col] == 1, panel_channel_col].tolist(),\n", + " analysis_channels=sort_channels_by_mass(\n", + " panel.loc[panel[panel_ilastik_col] == 1, panel_channel_col].tolist()\n", + " ),\n", " suffix=\"_ilastik\",\n", " hpf=50.0,\n", " )" diff --git a/scripts/imc_preprocessing.py b/scripts/imc_preprocessing.py index d31270c..29218ba 100644 --- a/scripts/imc_preprocessing.py +++ b/scripts/imc_preprocessing.py @@ -6,14 +6,16 @@ # !{sys.executable} -m pip install -e {Path.cwd().parent} # %% -import imcsegpipe -import pandas as pd import shutil - from pathlib import Path from tempfile import TemporaryDirectory from typing import List +import pandas as pd + +import imcsegpipe +from imcsegpipe.utils import sort_channels_by_mass + # %% [markdown] # # # Preprocessing of IMC data for image segmentation @@ -197,7 +199,9 @@ imcsegpipe.create_analysis_stacks( acquisition_dir=acquisition_dir, analysis_dir=final_images_dir, - analysis_channels=panel.loc[panel[panel_keep_col] == 1, panel_channel_col].tolist(), + analysis_channels=sort_channels_by_mass( + panel.loc[panel[panel_keep_col] == 1, panel_channel_col].tolist() + ), suffix="_full", hpf=50.0, ) @@ -205,7 +209,9 @@ imcsegpipe.create_analysis_stacks( acquisition_dir=acquisition_dir, analysis_dir=ilastik_dir, - analysis_channels=panel.loc[panel[panel_ilastik_col] == 1, panel_channel_col].tolist(), + analysis_channels=sort_channels_by_mass( + panel.loc[panel[panel_ilastik_col] == 1, panel_channel_col].tolist() + ), suffix="_ilastik", hpf=50.0, ) diff --git a/src/imcsegpipe/__init__.py b/src/imcsegpipe/__init__.py index f2fd224..1bef2ed 100644 --- a/src/imcsegpipe/__init__.py +++ b/src/imcsegpipe/__init__.py @@ -1,16 +1,15 @@ from ._imcsegpipe import ( - extract_zip_file, - match_txt_files, - extract_mcd_file, create_analysis_stacks, export_to_histocat, + extract_mcd_file, + extract_zip_file, + match_txt_files, ) - __all__ = [ - "extract_zip_file", - "match_txt_files", - "extract_mcd_file", "create_analysis_stacks", "export_to_histocat", + "extract_mcd_file", + "extract_zip_file", + "match_txt_files", ] diff --git a/src/imcsegpipe/_imcsegpipe.py b/src/imcsegpipe/_imcsegpipe.py index 15a1a6d..81c53cb 100644 --- a/src/imcsegpipe/_imcsegpipe.py +++ b/src/imcsegpipe/_imcsegpipe.py @@ -1,19 +1,19 @@ -import imageio import logging -import numpy as np -import pandas as pd import re import shutil -import tifffile -import xtiff - from os import PathLike from pathlib import Path -from readimc import MCDFile, TXTFile -from readimc.data import Acquisition, Panorama, Slide from typing import Dict, List, Optional, Sequence, Union from zipfile import ZipFile +import imageio +import numpy as np +import pandas as pd +import tifffile +import xtiff +from readimc import MCDFile, TXTFile +from readimc.data import Acquisition, Panorama, Slide + from .utils import AcquisitionMetadata, filter_hot_pixels, get_acquisition_ome_xml diff --git a/src/imcsegpipe/utils.py b/src/imcsegpipe/utils.py index 33fc3b1..c4eac04 100644 --- a/src/imcsegpipe/utils.py +++ b/src/imcsegpipe/utils.py @@ -1,12 +1,13 @@ +import re +from dataclasses import dataclass +from typing import List, Optional, Sequence +from xml.etree import ElementTree as ET + import numpy as np import xtiff - -from dataclasses import dataclass from readimc import MCDFile from readimc.data import Acquisition from scipy.ndimage import maximum_filter -from typing import Optional, Sequence -from xml.etree import ElementTree as ET @dataclass @@ -156,3 +157,7 @@ def filter_hot_pixels(img: np.ndarray, thres: float) -> np.ndarray: kernel[0, 1, 1] = False max_neighbor_img = maximum_filter(img, footprint=kernel, mode="mirror") return np.where(img - max_neighbor_img > thres, max_neighbor_img, img) + + +def sort_channels_by_mass(channels: Sequence[str]) -> List[str]: + return sorted(channels, lambda channel: int(re.sub("[^0-9]", "", channel) or 0)) From 6f8e0623700c777136eb59d69e29884e378bae1a Mon Sep 17 00:00:00 2001 From: nilseling Date: Mon, 11 Apr 2022 15:47:27 +0200 Subject: [PATCH 2/6] Added link to newest classifier --- scripts/download_examples.ipynb | 156 +++++++++++++++++--------------- scripts/download_examples.py | 4 +- 2 files changed, 85 insertions(+), 75 deletions(-) diff --git a/scripts/download_examples.ipynb b/scripts/download_examples.ipynb index 7df7382..8c0bb3f 100644 --- a/scripts/download_examples.ipynb +++ b/scripts/download_examples.ipynb @@ -60,7 +60,7 @@ "# Ilastik project\n", "ilastik_project = Path(\"..\") / \"IMCWorkflow.ilp\"\n", "if not ilastik_project.exists():\n", - " request.urlretrieve(\"https://zenodo.org/record/6043544/files/IMCWorkflow.ilp\", ilastik_project)\n", + " request.urlretrieve(\"https://zenodo.org/record/6404960/files/IMCWorkflow.ilp\", ilastik_project)\n", " \n", "# Sample metadata\n", "sample_metadata = Path(\"..\") / \"sample_metadata.xlsx\"\n", @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "5cebbf89", "metadata": {}, "outputs": [ @@ -82,134 +82,142 @@ "#\n", "# Name Version Build Channel\n", "anyio 3.5.0 py39h6e9494a_0 conda-forge\n", - "appnope 0.1.2 py39h6e9494a_2 conda-forge\n", + "appnope 0.1.3 pyhd8ed1ab_0 conda-forge\n", "argon2-cffi 21.3.0 pyhd8ed1ab_0 conda-forge\n", - "argon2-cffi-bindings 21.2.0 py39h89e85a6_1 conda-forge\n", + "argon2-cffi-bindings 21.2.0 py39h63b48b0_2 conda-forge\n", "asttokens 2.0.5 pyhd8ed1ab_0 conda-forge\n", "attrs 21.4.0 pyhd8ed1ab_0 conda-forge\n", "babel 2.9.1 pyh44b312d_0 conda-forge\n", "backcall 0.2.0 pyh9f0ad1d_0 conda-forge\n", "backports 1.0 py_2 conda-forge\n", "backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge\n", - "black 22.1.0 pyhd8ed1ab_0 conda-forge\n", - "bleach 4.1.0 pyhd8ed1ab_0 conda-forge\n", - "brotlipy 0.7.0 py39h89e85a6_1003 conda-forge\n", + "beautifulsoup4 4.11.1 pyha770c72_0 conda-forge\n", + "bleach 5.0.0 pyhd8ed1ab_0 conda-forge\n", + "brotlipy 0.7.0 py39h63b48b0_1004 conda-forge\n", "bzip2 1.0.8 h0d85af4_4 conda-forge\n", "ca-certificates 2021.10.8 h033912b_0 conda-forge\n", - "certifi 2021.10.8 py39h6e9494a_1 conda-forge\n", + "certifi 2021.10.8 py39h6e9494a_2 conda-forge\n", "cffi 1.15.0 py39he338e87_0 conda-forge\n", - "charset-normalizer 2.0.11 pyhd8ed1ab_0 conda-forge\n", - "click 8.0.3 py39h6e9494a_1 conda-forge\n", - "cryptography 36.0.1 py39h209aa08_0 conda-forge\n", - "dataclasses 0.8 pyhc8e2a94_3 conda-forge\n", - "debugpy 1.5.1 py39h9fcab8e_0 conda-forge\n", + "charset-normalizer 2.0.12 pyhd8ed1ab_0 conda-forge\n", + "cryptography 36.0.2 py39h1644bb1_1 conda-forge\n", + "debugpy 1.6.0 py39hfd1d529_0 conda-forge\n", "decorator 5.1.1 pyhd8ed1ab_0 conda-forge\n", "defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge\n", "entrypoints 0.4 pyhd8ed1ab_0 conda-forge\n", - "executing 0.8.2 pyhd8ed1ab_0 conda-forge\n", - "flit-core 3.6.0 pyhd8ed1ab_0 conda-forge\n", + "executing 0.8.3 pyhd8ed1ab_0 conda-forge\n", + "flit-core 3.7.1 pyhd8ed1ab_0 conda-forge\n", "idna 3.3 pyhd8ed1ab_0 conda-forge\n", - "imageio 2.16.0 pypi_0 pypi\n", - "importlib-metadata 4.11.0 py39h6e9494a_0 conda-forge\n", - "importlib_resources 5.4.0 pyhd8ed1ab_0 conda-forge\n", - "ipykernel 6.9.0 py39h71a6800_0 conda-forge\n", - "ipython 8.0.1 py39h6e9494a_0 conda-forge\n", + "imageio 2.16.2 pypi_0 pypi\n", + "importlib-metadata 4.11.3 py39h6e9494a_1 conda-forge\n", + "importlib_resources 5.6.0 pyhd8ed1ab_0 conda-forge\n", + "ipykernel 6.12.1 py39h71a6800_0 conda-forge\n", + "ipython 8.2.0 py39h6e9494a_0 conda-forge\n", "ipython_genutils 0.2.0 py_1 conda-forge\n", - "jedi 0.18.1 py39h6e9494a_0 conda-forge\n", - "jinja2 3.0.3 pyhd8ed1ab_0 conda-forge\n", + "jedi 0.18.1 py39h6e9494a_1 conda-forge\n", + "jinja2 3.1.1 pyhd8ed1ab_0 conda-forge\n", "json5 0.9.5 pyh9f0ad1d_0 conda-forge\n", "jsonschema 4.4.0 pyhd8ed1ab_0 conda-forge\n", - "jupyter_client 7.1.2 pyhd8ed1ab_0 conda-forge\n", - "jupyter_core 4.9.1 py39h6e9494a_1 conda-forge\n", - "jupyter_server 1.13.5 pyhd8ed1ab_1 conda-forge\n", - "jupyterlab 3.2.9 pyhd8ed1ab_0 conda-forge\n", - "jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge\n", - "jupyterlab_server 2.10.3 pyhd8ed1ab_0 conda-forge\n", - "jupytext 1.13.6 pyheef035f_0 conda-forge\n", - "libcxx 12.0.1 habf9029_1 conda-forge\n", + "jupyter_client 7.2.2 pyhd8ed1ab_1 conda-forge\n", + "jupyter_core 4.9.2 py39h6e9494a_0 conda-forge\n", + "jupyter_server 1.16.0 pyhd8ed1ab_1 conda-forge\n", + "jupyterlab 3.3.3 pyhd8ed1ab_0 conda-forge\n", + "jupyterlab_pygments 0.2.0 pyhd8ed1ab_0 conda-forge\n", + "jupyterlab_server 2.12.0 pyhd8ed1ab_0 conda-forge\n", + "jupytext 1.13.8 pyh4b9bcc7_0 conda-forge\n", + "libcxx 13.0.1 hc203e6f_0 conda-forge\n", "libffi 3.4.2 h0d85af4_5 conda-forge\n", "libsodium 1.0.18 hbcb3906_1 conda-forge\n", - "libzlib 1.2.11 h9173be1_1013 conda-forge\n", - "markdown-it-py 1.1.0 pyhd8ed1ab_0 conda-forge\n", - "markupsafe 2.0.1 py39h89e85a6_1 conda-forge\n", + "libzlib 1.2.11 h6c3fc93_1014 conda-forge\n", + "markdown-it-py 2.0.1 pyhd8ed1ab_0 conda-forge\n", + "markupsafe 2.1.1 py39h63b48b0_1 conda-forge\n", "matplotlib-inline 0.1.3 pyhd8ed1ab_0 conda-forge\n", "mdit-py-plugins 0.3.0 pyhd8ed1ab_0 conda-forge\n", + "mdurl 0.1.0 pyhd8ed1ab_0 conda-forge\n", "mistune 0.8.4 py39h89e85a6_1005 conda-forge\n", - "mypy_extensions 0.4.3 py39h6e9494a_4 conda-forge\n", - "nbclassic 0.3.5 pyhd8ed1ab_0 conda-forge\n", - "nbclient 0.5.10 pyhd8ed1ab_1 conda-forge\n", - "nbconvert 6.4.2 py39h6e9494a_0 conda-forge\n", - "nbformat 5.1.3 pyhd8ed1ab_0 conda-forge\n", - "ncurses 6.3 he49afe7_0 conda-forge\n", - "nest-asyncio 1.5.4 pyhd8ed1ab_0 conda-forge\n", - "notebook 6.4.8 pyha770c72_0 conda-forge\n", - "numpy 1.22.2 pypi_0 pypi\n", - "openssl 1.1.1l h0d85af4_0 conda-forge\n", + "nbclassic 0.3.7 pyhd8ed1ab_0 conda-forge\n", + "nbclient 0.5.13 pyhd8ed1ab_0 conda-forge\n", + "nbconvert 6.4.5 pyhd8ed1ab_2 conda-forge\n", + "nbconvert-core 6.4.5 pyhd8ed1ab_2 conda-forge\n", + "nbconvert-pandoc 6.4.5 pyhd8ed1ab_2 conda-forge\n", + "nbformat 5.3.0 pyhd8ed1ab_0 conda-forge\n", + "ncurses 6.3 h96cf925_1 conda-forge\n", + "nest-asyncio 1.5.5 pyhd8ed1ab_0 conda-forge\n", + "notebook 6.4.10 pyha770c72_0 conda-forge\n", + "notebook-shim 0.1.0 pyhd8ed1ab_0 conda-forge\n", + "numpy 1.22.3 pypi_0 pypi\n", + "openssl 1.1.1n h6c3fc93_0 conda-forge\n", "packaging 21.3 pyhd8ed1ab_0 conda-forge\n", - "pandas 1.4.1 pypi_0 pypi\n", + "pandas 1.4.2 pypi_0 pypi\n", "pandoc 2.17.1.1 h694c41f_0 conda-forge\n", "pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge\n", "parso 0.8.3 pyhd8ed1ab_0 conda-forge\n", - "pathspec 0.9.0 pyhd8ed1ab_0 conda-forge\n", "pexpect 4.8.0 pyh9f0ad1d_2 conda-forge\n", "pickleshare 0.7.5 py_1003 conda-forge\n", - "pillow 9.0.1 pypi_0 pypi\n", - "pip 22.0.3 pyhd8ed1ab_0 conda-forge\n", - "platformdirs 2.5.0 pyhd8ed1ab_0 conda-forge\n", - "prometheus_client 0.13.1 pyhd8ed1ab_0 conda-forge\n", - "prompt-toolkit 3.0.27 pyha770c72_0 conda-forge\n", + "pillow 9.1.0 pypi_0 pypi\n", + "pip 22.0.4 pyhd8ed1ab_0 conda-forge\n", + "prometheus_client 0.14.1 pyhd8ed1ab_0 conda-forge\n", + "prompt-toolkit 3.0.29 pyha770c72_0 conda-forge\n", + "psutil 5.9.0 py39h63b48b0_1 conda-forge\n", "ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge\n", "pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge\n", "pycparser 2.21 pyhd8ed1ab_0 conda-forge\n", "pygments 2.11.2 pyhd8ed1ab_0 conda-forge\n", "pyopenssl 22.0.0 pyhd8ed1ab_0 conda-forge\n", - "pyparsing 3.0.7 pyhd8ed1ab_0 conda-forge\n", - "pyrsistent 0.18.1 py39h89e85a6_0 conda-forge\n", - "pysocks 1.7.1 py39h6e9494a_4 conda-forge\n", - "python 3.9.10 h1dd9edd_2_cpython conda-forge\n", + "pyparsing 3.0.8 pyhd8ed1ab_0 conda-forge\n", + "pyrsistent 0.18.1 py39h63b48b0_1 conda-forge\n", + "pysocks 1.7.1 py39h6e9494a_5 conda-forge\n", + "python 3.9.12 h8b4d769_1_cpython conda-forge\n", "python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge\n", + "python-fastjsonschema 2.15.3 pyhd8ed1ab_0 conda-forge\n", "python_abi 3.9 2_cp39 conda-forge\n", - "pytz 2021.3 pyhd8ed1ab_0 conda-forge\n", - "pyyaml 6.0 py39h89e85a6_3 conda-forge\n", - "pyzmq 22.3.0 py39h7fec2f1_1 conda-forge\n", + "pytz 2022.1 pyhd8ed1ab_0 conda-forge\n", + "pyyaml 6.0 py39h63b48b0_4 conda-forge\n", + "pyzmq 22.3.0 py39hc2dc7ec_2 conda-forge\n", "readimc 0.6.1 pypi_0 pypi\n", "readline 8.1 h05e3726_0 conda-forge\n", "requests 2.27.1 pyhd8ed1ab_0 conda-forge\n", "scipy 1.8.0 pypi_0 pypi\n", "send2trash 1.8.0 pyhd8ed1ab_0 conda-forge\n", - "setuptools 60.9.0 py39h6e9494a_0 conda-forge\n", + "setuptools 62.1.0 py39h6e9494a_0 conda-forge\n", "six 1.16.0 pyh6c4a22f_0 conda-forge\n", - "sniffio 1.2.0 py39h6e9494a_2 conda-forge\n", - "sqlite 3.37.0 h23a322b_0 conda-forge\n", - "stack_data 0.1.4 pyhd8ed1ab_0 conda-forge\n", - "terminado 0.13.1 py39h6e9494a_0 conda-forge\n", - "testpath 0.5.0 pyhd8ed1ab_0 conda-forge\n", - "tifffile 2022.2.9 pypi_0 pypi\n", - "tk 8.6.11 h5dbffcc_1 conda-forge\n", + "sniffio 1.2.0 py39h6e9494a_3 conda-forge\n", + "soupsieve 2.3.1 pyhd8ed1ab_0 conda-forge\n", + "sqlite 3.37.1 hb516253_0 conda-forge\n", + "stack_data 0.2.0 pyhd8ed1ab_0 conda-forge\n", + "terminado 0.13.3 py39h6e9494a_1 conda-forge\n", + "testpath 0.6.0 pyhd8ed1ab_0 conda-forge\n", + "tifffile 2022.4.8 pypi_0 pypi\n", + "tk 8.6.12 h5dbffcc_0 conda-forge\n", "toml 0.10.2 pyhd8ed1ab_0 conda-forge\n", - "tomli 2.0.1 pyhd8ed1ab_0 conda-forge\n", - "tornado 6.1 py39h89e85a6_2 conda-forge\n", + "tornado 6.1 py39h63b48b0_3 conda-forge\n", "traitlets 5.1.1 pyhd8ed1ab_0 conda-forge\n", - "typed-ast 1.5.2 py39h89e85a6_0 conda-forge\n", - "typing_extensions 4.0.1 pyha770c72_0 conda-forge\n", - "tzdata 2021e he74cb21_0 conda-forge\n", - "urllib3 1.26.8 pyhd8ed1ab_1 conda-forge\n", + "typing_extensions 4.1.1 pyha770c72_0 conda-forge\n", + "tzdata 2022a h191b570_0 conda-forge\n", + "urllib3 1.26.9 pyhd8ed1ab_0 conda-forge\n", "wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge\n", "webencodings 0.5.1 py_1 conda-forge\n", - "websocket-client 1.2.3 pyhd8ed1ab_0 conda-forge\n", + "websocket-client 1.3.2 pyhd8ed1ab_0 conda-forge\n", "wheel 0.37.1 pyhd8ed1ab_0 conda-forge\n", "xtiff 0.7.7 pypi_0 pypi\n", "xz 5.2.5 haf1e3a3_1 conda-forge\n", "yaml 0.2.5 h0d85af4_2 conda-forge\n", "zeromq 4.3.4 he49afe7_1 conda-forge\n", - "zipp 3.7.0 pyhd8ed1ab_1 conda-forge\n", - "zlib 1.2.11 h9173be1_1013 conda-forge\n" + "zipp 3.8.0 pyhd8ed1ab_0 conda-forge\n", + "zlib 1.2.11 h6c3fc93_1014 conda-forge\n" ] } ], "source": [ "!conda list" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c208521-9c2e-449e-8652-69a2016c7c88", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/scripts/download_examples.py b/scripts/download_examples.py index 17439fb..b2f6636 100644 --- a/scripts/download_examples.py +++ b/scripts/download_examples.py @@ -43,7 +43,7 @@ # Ilastik project ilastik_project = Path("..") / "IMCWorkflow.ilp" if not ilastik_project.exists(): - request.urlretrieve("https://zenodo.org/record/6043544/files/IMCWorkflow.ilp", ilastik_project) + request.urlretrieve("https://zenodo.org/record/6404960/files/IMCWorkflow.ilp", ilastik_project) # Sample metadata sample_metadata = Path("..") / "sample_metadata.xlsx" @@ -52,3 +52,5 @@ # %% # !conda list + +# %% From 281ef1f9c2953f7ca39eeb1eac689d4462669a35 Mon Sep 17 00:00:00 2001 From: Jonas Windhager Date: Mon, 11 Apr 2022 15:58:13 +0200 Subject: [PATCH 3/6] Update utils.py --- src/imcsegpipe/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imcsegpipe/utils.py b/src/imcsegpipe/utils.py index c4eac04..cb8d7ca 100644 --- a/src/imcsegpipe/utils.py +++ b/src/imcsegpipe/utils.py @@ -160,4 +160,4 @@ def filter_hot_pixels(img: np.ndarray, thres: float) -> np.ndarray: def sort_channels_by_mass(channels: Sequence[str]) -> List[str]: - return sorted(channels, lambda channel: int(re.sub("[^0-9]", "", channel) or 0)) + return sorted(channels, key=lambda channel: int(re.sub("[^0-9]", "", channel) or 0)) From 9ecb1a39994819275b237056e6595c01830ef452 Mon Sep 17 00:00:00 2001 From: nilseling Date: Mon, 11 Apr 2022 18:38:20 +0200 Subject: [PATCH 4/6] Reran notebook --- scripts/imc_preprocessing.ipynb | 181 +++++++++++++++++--------------- scripts/imc_preprocessing.py | 2 + 2 files changed, 97 insertions(+), 86 deletions(-) diff --git a/scripts/imc_preprocessing.ipynb b/scripts/imc_preprocessing.ipynb index f2d51bb..debf429 100755 --- a/scripts/imc_preprocessing.ipynb +++ b/scripts/imc_preprocessing.ipynb @@ -11,7 +11,7 @@ "\n", "# from pathlib import Path\n", "\n", - "# !{sys.executable} -m pip install -e {Path.cwd().parent}" + "!{sys.executable} -m pip install -e {Path.cwd().parent}" ] }, { @@ -78,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "id": "59626637", "metadata": {}, "outputs": [], @@ -123,7 +123,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "id": "281ad642", "metadata": {}, "outputs": [], @@ -157,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "id": "0ac63953", "metadata": {}, "outputs": [], @@ -189,7 +189,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "id": "1169391e", "metadata": {}, "outputs": [], @@ -235,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "id": "ce4a4040", "metadata": {}, "outputs": [ @@ -245,7 +245,7 @@ "PosixPath('../analysis/cpout/panel.csv')" ] }, - "execution_count": 13, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -267,7 +267,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "id": "0dc3d319", "metadata": {}, "outputs": [], @@ -305,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "id": "320202b6", "metadata": {}, "outputs": [], @@ -348,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 9, "id": "ece67368", "metadata": {}, "outputs": [ @@ -358,7 +358,7 @@ "PosixPath('../analysis/cpinp/full_channelmeta.csv')" ] }, - "execution_count": 16, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -378,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "id": "d7a25f2b", "metadata": {}, "outputs": [], @@ -422,7 +422,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 11, "id": "e6cb34d5", "metadata": {}, "outputs": [ @@ -434,134 +434,143 @@ "#\n", "# Name Version Build Channel\n", "anyio 3.5.0 py39h6e9494a_0 conda-forge\n", - "appnope 0.1.2 py39h6e9494a_2 conda-forge\n", + "appnope 0.1.3 pyhd8ed1ab_0 conda-forge\n", "argon2-cffi 21.3.0 pyhd8ed1ab_0 conda-forge\n", - "argon2-cffi-bindings 21.2.0 py39h89e85a6_1 conda-forge\n", + "argon2-cffi-bindings 21.2.0 py39h63b48b0_2 conda-forge\n", "asttokens 2.0.5 pyhd8ed1ab_0 conda-forge\n", "attrs 21.4.0 pyhd8ed1ab_0 conda-forge\n", "babel 2.9.1 pyh44b312d_0 conda-forge\n", "backcall 0.2.0 pyh9f0ad1d_0 conda-forge\n", "backports 1.0 py_2 conda-forge\n", "backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge\n", - "black 22.1.0 pyhd8ed1ab_0 conda-forge\n", - "bleach 4.1.0 pyhd8ed1ab_0 conda-forge\n", - "brotlipy 0.7.0 py39h89e85a6_1003 conda-forge\n", + "beautifulsoup4 4.11.1 pyha770c72_0 conda-forge\n", + "bleach 5.0.0 pyhd8ed1ab_0 conda-forge\n", + "brotlipy 0.7.0 py39h63b48b0_1004 conda-forge\n", "bzip2 1.0.8 h0d85af4_4 conda-forge\n", "ca-certificates 2021.10.8 h033912b_0 conda-forge\n", - "certifi 2021.10.8 py39h6e9494a_1 conda-forge\n", + "certifi 2021.10.8 py39h6e9494a_2 conda-forge\n", "cffi 1.15.0 py39he338e87_0 conda-forge\n", - "charset-normalizer 2.0.11 pyhd8ed1ab_0 conda-forge\n", - "click 8.0.3 py39h6e9494a_1 conda-forge\n", - "cryptography 36.0.1 py39h209aa08_0 conda-forge\n", - "dataclasses 0.8 pyhc8e2a94_3 conda-forge\n", - "debugpy 1.5.1 py39h9fcab8e_0 conda-forge\n", + "charset-normalizer 2.0.12 pyhd8ed1ab_0 conda-forge\n", + "cryptography 36.0.2 py39h1644bb1_1 conda-forge\n", + "debugpy 1.6.0 py39hfd1d529_0 conda-forge\n", "decorator 5.1.1 pyhd8ed1ab_0 conda-forge\n", "defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge\n", "entrypoints 0.4 pyhd8ed1ab_0 conda-forge\n", - "executing 0.8.2 pyhd8ed1ab_0 conda-forge\n", - "flit-core 3.6.0 pyhd8ed1ab_0 conda-forge\n", + "executing 0.8.3 pyhd8ed1ab_0 conda-forge\n", + "flit-core 3.7.1 pyhd8ed1ab_0 conda-forge\n", "idna 3.3 pyhd8ed1ab_0 conda-forge\n", - "imageio 2.16.0 pypi_0 pypi\n", - "importlib-metadata 4.11.0 py39h6e9494a_0 conda-forge\n", - "importlib_resources 5.4.0 pyhd8ed1ab_0 conda-forge\n", - "ipykernel 6.9.0 py39h71a6800_0 conda-forge\n", - "ipython 8.0.1 py39h6e9494a_0 conda-forge\n", + "imageio 2.16.2 pypi_0 pypi\n", + "imcsegpipe 1.0.0 dev_0 \n", + "importlib-metadata 4.11.3 py39h6e9494a_1 conda-forge\n", + "importlib_resources 5.6.0 pyhd8ed1ab_1 conda-forge\n", + "ipykernel 6.13.0 py39h71a6800_0 conda-forge\n", + "ipython 8.2.0 py39h6e9494a_0 conda-forge\n", "ipython_genutils 0.2.0 py_1 conda-forge\n", - "jedi 0.18.1 py39h6e9494a_0 conda-forge\n", - "jinja2 3.0.3 pyhd8ed1ab_0 conda-forge\n", + "jedi 0.18.1 py39h6e9494a_1 conda-forge\n", + "jinja2 3.1.1 pyhd8ed1ab_0 conda-forge\n", "json5 0.9.5 pyh9f0ad1d_0 conda-forge\n", "jsonschema 4.4.0 pyhd8ed1ab_0 conda-forge\n", - "jupyter_client 7.1.2 pyhd8ed1ab_0 conda-forge\n", - "jupyter_core 4.9.1 py39h6e9494a_1 conda-forge\n", - "jupyter_server 1.13.5 pyhd8ed1ab_1 conda-forge\n", - "jupyterlab 3.2.9 pyhd8ed1ab_0 conda-forge\n", - "jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge\n", - "jupyterlab_server 2.10.3 pyhd8ed1ab_0 conda-forge\n", - "jupytext 1.13.6 pyheef035f_0 conda-forge\n", - "libcxx 12.0.1 habf9029_1 conda-forge\n", + "jupyter_client 7.2.2 pyhd8ed1ab_1 conda-forge\n", + "jupyter_core 4.9.2 py39h6e9494a_0 conda-forge\n", + "jupyter_server 1.16.0 pyhd8ed1ab_1 conda-forge\n", + "jupyterlab 3.3.3 pyhd8ed1ab_0 conda-forge\n", + "jupyterlab_pygments 0.2.0 pyhd8ed1ab_0 conda-forge\n", + "jupyterlab_server 2.12.0 pyhd8ed1ab_0 conda-forge\n", + "jupytext 1.13.8 pyh4b9bcc7_0 conda-forge\n", + "libcxx 13.0.1 hc203e6f_0 conda-forge\n", "libffi 3.4.2 h0d85af4_5 conda-forge\n", "libsodium 1.0.18 hbcb3906_1 conda-forge\n", - "libzlib 1.2.11 h9173be1_1013 conda-forge\n", - "markdown-it-py 1.1.0 pyhd8ed1ab_0 conda-forge\n", - "markupsafe 2.0.1 py39h89e85a6_1 conda-forge\n", + "libzlib 1.2.11 h6c3fc93_1014 conda-forge\n", + "markdown-it-py 2.0.1 pyhd8ed1ab_0 conda-forge\n", + "markupsafe 2.1.1 py39h63b48b0_1 conda-forge\n", "matplotlib-inline 0.1.3 pyhd8ed1ab_0 conda-forge\n", "mdit-py-plugins 0.3.0 pyhd8ed1ab_0 conda-forge\n", + "mdurl 0.1.0 pyhd8ed1ab_0 conda-forge\n", "mistune 0.8.4 py39h89e85a6_1005 conda-forge\n", - "mypy_extensions 0.4.3 py39h6e9494a_4 conda-forge\n", - "nbclassic 0.3.5 pyhd8ed1ab_0 conda-forge\n", - "nbclient 0.5.10 pyhd8ed1ab_1 conda-forge\n", - "nbconvert 6.4.2 py39h6e9494a_0 conda-forge\n", - "nbformat 5.1.3 pyhd8ed1ab_0 conda-forge\n", - "ncurses 6.3 he49afe7_0 conda-forge\n", - "nest-asyncio 1.5.4 pyhd8ed1ab_0 conda-forge\n", - "notebook 6.4.8 pyha770c72_0 conda-forge\n", - "numpy 1.22.2 pypi_0 pypi\n", - "openssl 1.1.1l h0d85af4_0 conda-forge\n", + "nbclassic 0.3.7 pyhd8ed1ab_0 conda-forge\n", + "nbclient 0.5.13 pyhd8ed1ab_0 conda-forge\n", + "nbconvert 6.5.0 pyhd8ed1ab_0 conda-forge\n", + "nbconvert-core 6.5.0 pyhd8ed1ab_0 conda-forge\n", + "nbconvert-pandoc 6.5.0 pyhd8ed1ab_0 conda-forge\n", + "nbformat 5.3.0 pyhd8ed1ab_0 conda-forge\n", + "ncurses 6.3 h96cf925_1 conda-forge\n", + "nest-asyncio 1.5.5 pyhd8ed1ab_0 conda-forge\n", + "notebook 6.4.10 pyha770c72_0 conda-forge\n", + "notebook-shim 0.1.0 pyhd8ed1ab_0 conda-forge\n", + "numpy 1.22.3 pypi_0 pypi\n", + "openssl 1.1.1n h6c3fc93_0 conda-forge\n", "packaging 21.3 pyhd8ed1ab_0 conda-forge\n", - "pandas 1.4.1 pypi_0 pypi\n", - "pandoc 2.17.1.1 h694c41f_0 conda-forge\n", + "pandas 1.4.2 pypi_0 pypi\n", + "pandoc 2.18 h694c41f_0 conda-forge\n", "pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge\n", "parso 0.8.3 pyhd8ed1ab_0 conda-forge\n", - "pathspec 0.9.0 pyhd8ed1ab_0 conda-forge\n", "pexpect 4.8.0 pyh9f0ad1d_2 conda-forge\n", "pickleshare 0.7.5 py_1003 conda-forge\n", - "pillow 9.0.1 pypi_0 pypi\n", - "pip 22.0.3 pyhd8ed1ab_0 conda-forge\n", - "platformdirs 2.5.0 pyhd8ed1ab_0 conda-forge\n", - "prometheus_client 0.13.1 pyhd8ed1ab_0 conda-forge\n", - "prompt-toolkit 3.0.27 pyha770c72_0 conda-forge\n", + "pillow 9.1.0 pypi_0 pypi\n", + "pip 22.0.4 pyhd8ed1ab_0 conda-forge\n", + "prometheus_client 0.14.1 pyhd8ed1ab_0 conda-forge\n", + "prompt-toolkit 3.0.29 pyha770c72_0 conda-forge\n", + "psutil 5.9.0 py39h63b48b0_1 conda-forge\n", "ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge\n", "pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge\n", "pycparser 2.21 pyhd8ed1ab_0 conda-forge\n", "pygments 2.11.2 pyhd8ed1ab_0 conda-forge\n", "pyopenssl 22.0.0 pyhd8ed1ab_0 conda-forge\n", - "pyparsing 3.0.7 pyhd8ed1ab_0 conda-forge\n", - "pyrsistent 0.18.1 py39h89e85a6_0 conda-forge\n", - "pysocks 1.7.1 py39h6e9494a_4 conda-forge\n", - "python 3.9.10 h1dd9edd_2_cpython conda-forge\n", + "pyparsing 3.0.8 pyhd8ed1ab_0 conda-forge\n", + "pyrsistent 0.18.1 py39h63b48b0_1 conda-forge\n", + "pysocks 1.7.1 py39h6e9494a_5 conda-forge\n", + "python 3.9.12 h8b4d769_1_cpython conda-forge\n", "python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge\n", + "python-fastjsonschema 2.15.3 pyhd8ed1ab_0 conda-forge\n", "python_abi 3.9 2_cp39 conda-forge\n", - "pytz 2021.3 pyhd8ed1ab_0 conda-forge\n", - "pyyaml 6.0 py39h89e85a6_3 conda-forge\n", - "pyzmq 22.3.0 py39h7fec2f1_1 conda-forge\n", + "pytz 2022.1 pyhd8ed1ab_0 conda-forge\n", + "pyyaml 6.0 py39h63b48b0_4 conda-forge\n", + "pyzmq 22.3.0 py39hc2dc7ec_2 conda-forge\n", "readimc 0.6.1 pypi_0 pypi\n", "readline 8.1 h05e3726_0 conda-forge\n", "requests 2.27.1 pyhd8ed1ab_0 conda-forge\n", "scipy 1.8.0 pypi_0 pypi\n", "send2trash 1.8.0 pyhd8ed1ab_0 conda-forge\n", - "setuptools 60.9.0 py39h6e9494a_0 conda-forge\n", + "setuptools 62.1.0 py39h6e9494a_0 conda-forge\n", "six 1.16.0 pyh6c4a22f_0 conda-forge\n", - "sniffio 1.2.0 py39h6e9494a_2 conda-forge\n", - "sqlite 3.37.0 h23a322b_0 conda-forge\n", - "stack_data 0.1.4 pyhd8ed1ab_0 conda-forge\n", - "terminado 0.13.1 py39h6e9494a_0 conda-forge\n", - "testpath 0.5.0 pyhd8ed1ab_0 conda-forge\n", - "tifffile 2022.2.9 pypi_0 pypi\n", - "tk 8.6.11 h5dbffcc_1 conda-forge\n", + "sniffio 1.2.0 py39h6e9494a_3 conda-forge\n", + "soupsieve 2.3.1 pyhd8ed1ab_0 conda-forge\n", + "sqlite 3.38.2 hb516253_0 conda-forge\n", + "stack_data 0.2.0 pyhd8ed1ab_0 conda-forge\n", + "terminado 0.13.3 py39h6e9494a_1 conda-forge\n", + "tifffile 2022.4.8 pypi_0 pypi\n", + "tinycss2 1.1.1 pyhd8ed1ab_0 conda-forge\n", + "tk 8.6.12 h5dbffcc_0 conda-forge\n", "toml 0.10.2 pyhd8ed1ab_0 conda-forge\n", - "tomli 2.0.1 pyhd8ed1ab_0 conda-forge\n", - "tornado 6.1 py39h89e85a6_2 conda-forge\n", + "tornado 6.1 py39h63b48b0_3 conda-forge\n", "traitlets 5.1.1 pyhd8ed1ab_0 conda-forge\n", - "typed-ast 1.5.2 py39h89e85a6_0 conda-forge\n", - "typing_extensions 4.0.1 pyha770c72_0 conda-forge\n", - "tzdata 2021e he74cb21_0 conda-forge\n", - "urllib3 1.26.8 pyhd8ed1ab_1 conda-forge\n", + "typing_extensions 4.1.1 pyha770c72_0 conda-forge\n", + "tzdata 2022a h191b570_0 conda-forge\n", + "urllib3 1.26.9 pyhd8ed1ab_0 conda-forge\n", "wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge\n", "webencodings 0.5.1 py_1 conda-forge\n", - "websocket-client 1.2.3 pyhd8ed1ab_0 conda-forge\n", + "websocket-client 1.3.2 pyhd8ed1ab_0 conda-forge\n", "wheel 0.37.1 pyhd8ed1ab_0 conda-forge\n", "xtiff 0.7.7 pypi_0 pypi\n", "xz 5.2.5 haf1e3a3_1 conda-forge\n", "yaml 0.2.5 h0d85af4_2 conda-forge\n", "zeromq 4.3.4 he49afe7_1 conda-forge\n", - "zipp 3.7.0 pyhd8ed1ab_1 conda-forge\n", - "zlib 1.2.11 h9173be1_1013 conda-forge\n" + "zipp 3.8.0 pyhd8ed1ab_0 conda-forge\n", + "zlib 1.2.11 h6c3fc93_1014 conda-forge\n" ] } ], "source": [ "!conda list" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "688e2f34-8852-49b1-9c67-5e711414f7bf", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/scripts/imc_preprocessing.py b/scripts/imc_preprocessing.py index 29218ba..c7bbc11 100644 --- a/scripts/imc_preprocessing.py +++ b/scripts/imc_preprocessing.py @@ -250,3 +250,5 @@ # %% # !conda list + +# %% From 1605c6f30cbe91bdfeffbd698542794eec129e55 Mon Sep 17 00:00:00 2001 From: nilseling Date: Mon, 11 Apr 2022 20:00:31 +0200 Subject: [PATCH 5/6] Updated CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65fa7b6..1780c60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [3.2] + + - sort channels by metal tag when creating the ilastik and full stacks + ## [3.1] - fixed git submodule issue From 83a81d14502ca0cb70ae33d80c72aefbd3f64aee Mon Sep 17 00:00:00 2001 From: nilseling Date: Mon, 11 Apr 2022 20:07:11 +0200 Subject: [PATCH 6/6] Updated classifier link --- scripts/download_examples.ipynb | 2 +- scripts/download_examples.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/download_examples.ipynb b/scripts/download_examples.ipynb index 8c0bb3f..95659ec 100644 --- a/scripts/download_examples.ipynb +++ b/scripts/download_examples.ipynb @@ -60,7 +60,7 @@ "# Ilastik project\n", "ilastik_project = Path(\"..\") / \"IMCWorkflow.ilp\"\n", "if not ilastik_project.exists():\n", - " request.urlretrieve(\"https://zenodo.org/record/6404960/files/IMCWorkflow.ilp\", ilastik_project)\n", + " request.urlretrieve(\"https://zenodo.org/record/6449127/files/IMCWorkflow.ilp\", ilastik_project)\n", " \n", "# Sample metadata\n", "sample_metadata = Path(\"..\") / \"sample_metadata.xlsx\"\n", diff --git a/scripts/download_examples.py b/scripts/download_examples.py index b2f6636..b4bdbf7 100644 --- a/scripts/download_examples.py +++ b/scripts/download_examples.py @@ -43,7 +43,7 @@ # Ilastik project ilastik_project = Path("..") / "IMCWorkflow.ilp" if not ilastik_project.exists(): - request.urlretrieve("https://zenodo.org/record/6404960/files/IMCWorkflow.ilp", ilastik_project) + request.urlretrieve("https://zenodo.org/record/6449127/files/IMCWorkflow.ilp", ilastik_project) # Sample metadata sample_metadata = Path("..") / "sample_metadata.xlsx"