From ab6632129071c3970c89892ea8dd9355bb5dad4b Mon Sep 17 00:00:00 2001 From: Corentin <> Date: Thu, 16 Feb 2023 17:03:55 +0100 Subject: [PATCH 1/5] adding erosion setting --- .gitignore | 3 +- .vscode/launch.json | 2 +- myoquant/commands/run_atp.py | 40 ++- myoquant/src/ATP_analysis.py | 131 ++++++-- myoquant/src/common_func.py | 24 +- poetry.lock | 576 +++++++++++++++++------------------ 6 files changed, 435 insertions(+), 341 deletions(-) diff --git a/.gitignore b/.gitignore index 7d403d6..c6906a5 100644 --- a/.gitignore +++ b/.gitignore @@ -169,4 +169,5 @@ debug_data/ !nuclei.tif !cytoplasm.tif !binary_mask_sdh.tif -data/* \ No newline at end of file +data/* +sample_atp_intensity_plot.png \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index a970ca1..f11f1a9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -26,7 +26,7 @@ "request": "launch", "module": "myoquant", "justMyCode": true, - "args": ["atp-analysis", "sample_img/sample_atp.jpg", "--cellpose-path", "sample_img/sample_atp_cellpose_mask.tiff"], + "args": ["atp-analysis", "sample_img/sample_atp.jpg", "--cellpose-path", "sample_img/sample_atp_cellpose_mask.tiff", "--intensity-method", "mean", "--n-classes", "2", "--erosion"], } ] } \ No newline at end of file diff --git a/myoquant/commands/run_atp.py b/myoquant/commands/run_atp.py index 6cde6b6..c94082f 100644 --- a/myoquant/commands/run_atp.py +++ b/myoquant/commands/run_atp.py @@ -59,6 +59,23 @@ def atp_analysis( None, help="Approximative single cell diameter in pixel for CellPose detection. If not specified, Cellpose will try to deduce it.", ), + channel: int = typer.Option( + None, + help="Image channel to use for the analysis. If not specified, the analysis will be performed on all three channels.", + ), + n_classes: int = typer.Option( + 2, + max=10, + help="The number of classes of cell to detect. If not specified this is defaulted to two classes.", + ), + intensity_method: str = typer.Option( + "median", + help="The method to use to compute the intensity of the cell. Can be either 'median' or 'mean'.", + ), + erosion: bool = typer.Option( + False, + help="Perform an erosion on the cells images to remove signal in the cell membrane (usefull for fluo)", + ), export_map: bool = typer.Option( True, help="Export the original image with cells painted by classification label.", @@ -135,6 +152,8 @@ def atp_analysis( ) as progress: progress.add_task(description="Reading all inputs...", total=None) image_ndarray = imread(image_path) + if channel is not None: + image_ndarray = image_ndarray[:, :, channel] if mask_path is not None: mask_ndarray = imread(mask_path) @@ -200,8 +219,13 @@ def atp_analysis( transient=False, ) as progress: progress.add_task(description="Detecting fiber types...", total=None) - result_df, full_label_map, df_cellpose_details = run_atp_analysis( - image_ndarray, mask_cellpose, intensity_threshold + result_df, full_label_map, df_cellpose_details, fig = run_atp_analysis( + image_ndarray, + mask_cellpose, + intensity_threshold, + n_classes, + intensity_method, + erosion, ) if export_map: with Progress( @@ -214,7 +238,12 @@ def atp_analysis( description="Blending label and original image together...", total=None ) labelRGB_map = label2rgb(image_ndarray, full_label_map) - overlay_img = blend_image_with_label(image_ndarray, labelRGB_map) + if channel is not None: + overlay_img = blend_image_with_label( + image_ndarray, labelRGB_map, fluo=True + ) + else: + overlay_img = blend_image_with_label(image_ndarray, labelRGB_map) overlay_filename = image_path.stem + "_label_blend.tiff" overlay_img.save(output_path / overlay_filename) @@ -239,6 +268,11 @@ def atp_analysis( f"💾 OUTPUT: Summary Table saved as {output_path/csv_name}", style="green", ) + plot_name = image_path.stem + "_intensity_plot.png" + fig.savefig(output_path / plot_name) + console.print( + f"💾 OUTPUT: Intensity Plot saved as {output_path/plot_name}", style="green" + ) if export_map: console.print( f"💾 OUTPUT: Overlay image saved as {output_path/overlay_filename}", diff --git a/myoquant/src/ATP_analysis.py b/myoquant/src/ATP_analysis.py index 452e239..41386fb 100644 --- a/myoquant/src/ATP_analysis.py +++ b/myoquant/src/ATP_analysis.py @@ -3,24 +3,35 @@ from sklearn.mixture import GaussianMixture from .common_func import extract_single_image, df_from_cellpose_mask import numpy as np +import matplotlib + +matplotlib.use("agg") + import matplotlib.pyplot as plt labels_predict = {1: "fiber type 1", 2: "fiber type 2"} np.random.seed(42) -def get_all_intensity(image_array, df_cellpose): +def get_all_intensity( + image_array, df_cellpose, intensity_method="median", erosion=False +): all_cell_median_intensity = [] for index in range(len(df_cellpose)): - single_cell_img = extract_single_image(image_array, df_cellpose, index) + single_cell_img = extract_single_image(image_array, df_cellpose, index, erosion) # Calculate median pixel intensity of the cell but ignore 0 values - single_cell_median_intensity = np.median(single_cell_img[single_cell_img > 0]) + if intensity_method == "median": + single_cell_median_intensity = np.median( + single_cell_img[single_cell_img > 0] + ) + elif intensity_method == "mean": + single_cell_median_intensity = np.mean(single_cell_img[single_cell_img > 0]) all_cell_median_intensity.append(single_cell_median_intensity) return all_cell_median_intensity -def estimate_threshold(intensity_list): +def estimate_threshold(intensity_list, n_classes=2): density = gaussian_kde(intensity_list) density.covariance_factor = lambda: 0.25 density._compute_covariance() @@ -28,20 +39,29 @@ def estimate_threshold(intensity_list): # Create a vector of 256 values going from 0 to 256: xs = np.linspace(0, 255, 256) density_xs_values = density(xs) - gmm = GaussianMixture(n_components=2).fit(np.array(intensity_list).reshape(-1, 1)) + gmm = GaussianMixture(n_components=n_classes).fit( + np.array(intensity_list).reshape(-1, 1) + ) # Find the x values of the two peaks peaks_x = np.sort(gmm.means_.flatten()) # Find the minimum point between the two peaks - min_index = np.argmin(density_xs_values[(xs > peaks_x[0]) & (xs < peaks_x[1])]) - threshold = peaks_x[0] + xs[min_index] - return threshold + threshold_list = [] + length = len(peaks_x) + for index, peaks in enumerate(peaks_x): + if index == length - 1: + break + min_index = np.argmin( + density_xs_values[(xs > peaks) & (xs < peaks_x[index + 1])] + ) + threshold_list.append(peaks + xs[min_index]) + return threshold_list -def plot_density(all_cell_median_intensity, intensity_threshold): +def plot_density(all_cell_median_intensity, intensity_threshold, n_classes=2): if intensity_threshold == 0: - intensity_threshold = estimate_threshold(all_cell_median_intensity) + intensity_threshold = estimate_threshold(all_cell_median_intensity, n_classes) fig, ax = plt.subplots(figsize=(10, 5)) density = gaussian_kde(all_cell_median_intensity) density.covariance_factor = lambda: 0.25 @@ -51,22 +71,44 @@ def plot_density(all_cell_median_intensity, intensity_threshold): xs = np.linspace(0, 255, 256) density_xs_values = density(xs) ax.plot(xs, density_xs_values, label="Estimated Density") - ax.axvline(x=intensity_threshold, color="red", label="Threshold") + for values in intensity_threshold: + ax.axvline(x=values, color="red", label="Threshold") ax.set_xlabel("Pixel Intensity") ax.set_ylabel("Density") ax.legend() return fig -def predict_all_cells(histo_img, cellpose_df, intensity_threshold): - all_cell_median_intensity = get_all_intensity(histo_img, cellpose_df) +def merge_peaks_too_close(peak_list): + pass + + +def classify_cells_intensity(all_cell_median_intensity, intensity_threshold): + muscle_fiber_type_all = [] + for intensity in all_cell_median_intensity: + class_cell = np.searchsorted(intensity_threshold, intensity, side="right") + muscle_fiber_type_all.append(class_cell) + return muscle_fiber_type_all + + +def predict_all_cells( + histo_img, + cellpose_df, + intensity_threshold, + n_classes=2, + intensity_method="median", + erosion=False, +): + all_cell_median_intensity = get_all_intensity( + histo_img, cellpose_df, intensity_method, erosion + ) if intensity_threshold is None: - intensity_threshold = estimate_threshold(all_cell_median_intensity) + intensity_threshold = estimate_threshold(all_cell_median_intensity, n_classes) - muscle_fiber_type_all = [ - 1 if x > intensity_threshold else 2 for x in all_cell_median_intensity - ] - return muscle_fiber_type_all, all_cell_median_intensity + muscle_fiber_type_all = classify_cells_intensity( + all_cell_median_intensity, intensity_threshold + ) + return muscle_fiber_type_all, all_cell_median_intensity, intensity_threshold def paint_full_image(image_atp, df_cellpose, class_predicted_all): @@ -76,24 +118,46 @@ def paint_full_image(image_atp, df_cellpose, class_predicted_all): # for index in track(range(len(df_cellpose)), description="Painting cells"): for index in range(len(df_cellpose)): single_cell_mask = df_cellpose.iloc[index, 9].copy() - if class_predicted_all[index] == 1: - image_atp_paint[ - df_cellpose.iloc[index, 5] : df_cellpose.iloc[index, 7], - df_cellpose.iloc[index, 6] : df_cellpose.iloc[index, 8], - ][single_cell_mask] = 1 - elif class_predicted_all[index] == 2: - image_atp_paint[ - df_cellpose.iloc[index, 5] : df_cellpose.iloc[index, 7], - df_cellpose.iloc[index, 6] : df_cellpose.iloc[index, 8], - ][single_cell_mask] = 2 + image_atp_paint[ + df_cellpose.iloc[index, 5] : df_cellpose.iloc[index, 7], + df_cellpose.iloc[index, 6] : df_cellpose.iloc[index, 8], + ][single_cell_mask] = ( + class_predicted_all[index] + 1 + ) return image_atp_paint -def run_atp_analysis(image_array, mask_cellpose, intensity_threshold=None): +def label_list_from_threhsold(threshold_list): + label_list = [] + length = len(threshold_list) + for index, threshold in enumerate(threshold_list): + if index == 0: + label_list.append(f"<{threshold}") + if index == length - 1: + label_list.append(f">{threshold}") + else: + label_list.append(f">{threshold} & <{threshold_list[index+1]}") + return label_list + + +def run_atp_analysis( + image_array, + mask_cellpose, + intensity_threshold=None, + n_classes=2, + intensity_method="median", + erosion=False, +): df_cellpose = df_from_cellpose_mask(mask_cellpose) - class_predicted_all, intensity_all = predict_all_cells( - image_array, df_cellpose, intensity_threshold + class_predicted_all, intensity_all, intensity_threshold = predict_all_cells( + image_array, + df_cellpose, + intensity_threshold, + n_classes, + intensity_method, + erosion, ) + fig = plot_density(intensity_all, intensity_threshold, n_classes) df_cellpose["muscle_cell_type"] = class_predicted_all df_cellpose["cell_intensity"] = intensity_all count_per_label = np.unique(class_predicted_all, return_counts=True) @@ -102,10 +166,11 @@ def run_atp_analysis(image_array, mask_cellpose, intensity_threshold=None): headers = ["Feature", "Raw Count", "Proportion (%)"] data = [] data.append(["Muscle Fibers", len(class_predicted_all), 100]) + label_list = label_list_from_threhsold(intensity_threshold) for index, elem in enumerate(count_per_label[0]): data.append( [ - labels_predict[int(elem)], + label_list[int(elem)], count_per_label[1][int(index)], 100 * count_per_label[1][int(index)] / len(class_predicted_all), ] @@ -113,4 +178,4 @@ def run_atp_analysis(image_array, mask_cellpose, intensity_threshold=None): result_df = pd.DataFrame(columns=headers, data=data) # Paint The Full Image full_label_map = paint_full_image(image_array, df_cellpose, class_predicted_all) - return result_df, full_label_map, df_cellpose + return result_df, full_label_map, df_cellpose, fig diff --git a/myoquant/src/common_func.py b/myoquant/src/common_func.py index 5252f5c..f6ed068 100644 --- a/myoquant/src/common_func.py +++ b/myoquant/src/common_func.py @@ -5,6 +5,8 @@ os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" import sys +import math + import tensorflow as tf import torch from cellpose.models import Cellpose @@ -14,11 +16,14 @@ import numpy as np from PIL import Image from skimage.measure import regionprops_table +from skimage.morphology import binary_erosion import pandas as pd # from .gradcam import make_gradcam_heatmap, save_and_display_gradcam from .random_brightness import RandomBrightness +import imageio + tf.random.set_seed(42) np.random.seed(42) @@ -168,12 +173,21 @@ def df_from_stardist_mask(mask, intensity_image=None): return df_stardist -def extract_single_image(raw_image, df_props, index): +def extract_single_image(raw_image, df_props, index, erosion=False): single_entity_img = raw_image[ df_props.iloc[index, 5] : df_props.iloc[index, 7], df_props.iloc[index, 6] : df_props.iloc[index, 8], ].copy() + surface_area = df_props.iloc[index, 1] + cell_radius = math.sqrt(surface_area / math.pi) single_entity_mask = df_props.iloc[index, 9] + erosion_size = int(cell_radius / 5) # 20% of the cell + if erosion: + for i in range(erosion_size): + single_entity_mask = binary_erosion( + single_entity_mask, out=single_entity_mask + ) + single_entity_img[~single_entity_mask] = 0 return single_entity_img @@ -192,6 +206,14 @@ def label2rgb(img_ndarray, label_map): 0: [255, 255, 255], 1: [15, 157, 88], 2: [219, 68, 55], + 3: [100, 128, 170], + 4: [231, 204, 143], + 5: [202, 137, 115], + 6: [178, 143, 172], + 7: [144, 191, 207], + 8: [148, 187, 187], + 9: [78, 86, 105], + 10: [245, 90, 87], } img_rgb = np.zeros((img_ndarray.shape[0], img_ndarray.shape[1], 3), dtype=np.uint8) diff --git a/poetry.lock b/poetry.lock index ff85c1c..79ebbd9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -91,34 +91,48 @@ files = [ [[package]] name = "black" -version = "22.12.0" +version = "23.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, ] [package.dependencies] click = ">=8.0.0" ipython = {version = ">=7.8.0", optional = true, markers = "extra == \"jupyter\""} mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" tokenize-rt = {version = ">=3.2.0", optional = true, markers = "extra == \"jupyter\""} -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -491,21 +505,17 @@ test-no-images = ["pytest"] [[package]] name = "csbdeep" -version = "0.7.2" +version = "0.7.3" description = "CSBDeep - a toolbox for Content-aware Image Restoration (CARE)" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "csbdeep-0.7.2-py2.py3-none-any.whl", hash = "sha256:57e2816f08d7b3aba5b3c6b53b9d8067532d9a5d5fbd5379e7266c2f6b5855a6"}, - {file = "csbdeep-0.7.2.tar.gz", hash = "sha256:8a000eb71d04aa753f52ffe81a34c0a30a06ee986d20b9986d76272253e2fd53"}, + {file = "csbdeep-0.7.3-py2.py3-none-any.whl", hash = "sha256:759340b16af1d67ecdcf20eeb680ac6f30e75fd3655847a100724473ac110197"}, + {file = "csbdeep-0.7.3.tar.gz", hash = "sha256:e4874f37fd932b9cba60c9ec27e5b088d1bb7b09e36b16a158476371cbbffa5a"}, ] [package.dependencies] -h5py = [ - {version = "<3", markers = "python_version < \"3.9\""}, - {version = ">=3", markers = "python_version >= \"3.9\""}, -] matplotlib = "*" numpy = "*" packaging = "*" @@ -583,18 +593,6 @@ files = [ {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, ] -[[package]] -name = "entrypoints" -version = "0.4" -description = "Discover and load entry points from installed packages." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, - {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, -] - [[package]] name = "exceptiongroup" version = "1.1.0" @@ -627,46 +625,46 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "fastremap" -version = "1.13.3" +version = "1.13.4" description = "Remap, mask, renumber, unique, and in-place transposition of 3D labeled images. Point cloud too." category = "main" optional = false python-versions = "~=3.6" files = [ - {file = "fastremap-1.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2c3b1a6c2527a17ba5f63cd01f69fb1a42488a5b51b0c87f5c46d75f88e5eb67"}, - {file = "fastremap-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d268e597ed93b796a88621bed036cbf3a1ea1138e9d3e205bfd5e25cbf4fb11"}, - {file = "fastremap-1.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f272745005429cce3d65cb122f882e43b39c728e2b63d010c0f4d3fa4aed9ab"}, - {file = "fastremap-1.13.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3253eedeb0e410ed9c1ee39507fc712775f0d520b87a146d6a2ea591f1d222ab"}, - {file = "fastremap-1.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cca768c47023a4ea99862695ea927da21d58e314070e91e9301845c33e2ebe7d"}, - {file = "fastremap-1.13.3-cp310-cp310-win32.whl", hash = "sha256:798fb555ef69d2bb0afa12f2bf4839cd315af6764a4a7f9d8f47bc1e5e491f8c"}, - {file = "fastremap-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:946c0d7426140f6d6092cdf0ab75bce88b058fa9906e208e71526377702ee654"}, - {file = "fastremap-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1d26846b47e73ffd95f0edcefefe1e1b45df4bb9bd99b897541b081a8d8db5c8"}, - {file = "fastremap-1.13.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f375a49c00ce91f70235fab4fa591c77d6f50c2457efb2a269a29d8b6b8e68e"}, - {file = "fastremap-1.13.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd7be0e3820f85dc7684015c0b8ac652e6ef015133fcbd6e3bcdefc9266b1ca4"}, - {file = "fastremap-1.13.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ed461cae15de34b62e87f97a5c3d5ea794197cdfa96c72b965a486e3cc1adc9"}, - {file = "fastremap-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:a9aa1ae0865dbdde54ac1a6be43891ca297f4fb253eeab03e2d00260ee4f0f2c"}, - {file = "fastremap-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2f8340b774315db9d1e46920cb01f171814e4210878ea4ec33c0ce35f6c08139"}, - {file = "fastremap-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:231725229c6d0f72c5a8f8193b957418f6398a226cdec85f6f344df1ee6e9231"}, - {file = "fastremap-1.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0a765c5ad9c78e523a2f46c62a5534e31fd5eb62abed00328fb08328a38d579"}, - {file = "fastremap-1.13.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f26270206da18938acf1e750ba9cf998ee742123e66adfc9eab7c1094942c90"}, - {file = "fastremap-1.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b50d3fc80ec4851564b5bc6f4e209a0e7bed9102f0f9568cee146898edf2bdae"}, - {file = "fastremap-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:195de61565fff88454cb15815defce770e893cf83fca8ef0c74a91602b3d33ef"}, - {file = "fastremap-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a4a949efd9f71ca82a6431a896d5121b7a32dcc910d9b3807e0adcbb0e696f53"}, - {file = "fastremap-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7312cac3ced1d650d13ee6df0b6f0433d145afa9f059a2508c6734b05280d4ce"}, - {file = "fastremap-1.13.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:ee5ab1eaebcb8fc30dbf5c3d7db0e8dd8c8c3e68e0c89de33e41ce89758e25b1"}, - {file = "fastremap-1.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:768dfc3968b8864f5ecdcd9a1928e0995248c7e905d0ce0bfb6eae34ed14a69e"}, - {file = "fastremap-1.13.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98a533081be53197e895aa890c239a345bf13e8ba088bf1750614532fd092967"}, - {file = "fastremap-1.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a051fd08ea2fe2056d971d1e82742a910f180eb3417b1729e2ed549c12d1fd1"}, - {file = "fastremap-1.13.3-cp38-cp38-win32.whl", hash = "sha256:a6fc113a1c3759a001a520e79dde9b61149081b744e92f70994d9d9c961dc930"}, - {file = "fastremap-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:889f4d68ae37bc816e90cc96ad5c87ad6ea6096797a2a5dc79c018b74caf5f55"}, - {file = "fastremap-1.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8e0f6303ed1e6bb71641d770c1c91c8819b0bccc6ea8a4d1ff35f71953e453fa"}, - {file = "fastremap-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9c4c4c1a1083b125e94fc99af30a2972a43a56888c170557bb766fa77441dd0d"}, - {file = "fastremap-1.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f03b9ee4380b65952787ad3956e8b58b2f3be853ea2256c9a41068bc381731c"}, - {file = "fastremap-1.13.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d8e5059de66c1159a8e768a3d16e95cf3236878e538e50b47276db07c91500b"}, - {file = "fastremap-1.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cfd6187dd3c92fccf5ed904bd445152a41b27257e6f1b5e89f3a78a9f9c7f7b"}, - {file = "fastremap-1.13.3-cp39-cp39-win32.whl", hash = "sha256:ea00bcea485fd4768f1bc291489f2ecc98574f307baf6660671e3af994780f1e"}, - {file = "fastremap-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:47e5e1a1f41c22f94511ff1380e8d2e34fd58f614cb3fea8f79113fca85dc063"}, - {file = "fastremap-1.13.3.tar.gz", hash = "sha256:c07e1b1d42192a46352b55e33da8062560940dcaf4ae4e667f4de71e05a5e5d0"}, + {file = "fastremap-1.13.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a8f8b70d783ad7832b4cc149499a7d2c5168d0ac54e95fd917ff1b7bddee3eb"}, + {file = "fastremap-1.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc574f7bb2645ae0c1e68843a141918fc30c1eb9c259545c81afe8818a6b7778"}, + {file = "fastremap-1.13.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e3740e6bbd8a9272ac3ed49ee79ade347dcfead10c25729bdfd55cb1221426"}, + {file = "fastremap-1.13.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d8b8c9819482556c68482963d6e7696e48b79806ce753315213fa9e1e257554"}, + {file = "fastremap-1.13.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef826ffaf6662acfb2bcb2486484e265e028fc07d2898c0cbd12c3d6b4fca126"}, + {file = "fastremap-1.13.4-cp310-cp310-win32.whl", hash = "sha256:ad8fe242a67be915332d4ae09002cc7c06e7354688675fb22b274a5a89102fe0"}, + {file = "fastremap-1.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:4662b0e94e64b339769e3660597242c52ae9c1074fd5e9ef938557486540bedd"}, + {file = "fastremap-1.13.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5385c43f6b6bbb91cc09841d5519333a042b41d54e2bdb59c3cc1c5480cbed3e"}, + {file = "fastremap-1.13.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec4e9f85e252a195dc75d64272577163dd9692cb610b425eff292233e8295095"}, + {file = "fastremap-1.13.4-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d46b416a633084fbd1c5e067a031945a8dec612cebcd1ca9cae0df504646af62"}, + {file = "fastremap-1.13.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2697f91a21c749a2d9606fa25b3f2d953efa016d4e9c67fa1151dcbabc562aa5"}, + {file = "fastremap-1.13.4-cp36-cp36m-win32.whl", hash = "sha256:eb3c9258d78f51f16a6806f698b0ef56a4639116281619df1c28d2cbcd9b28aa"}, + {file = "fastremap-1.13.4-cp36-cp36m-win_amd64.whl", hash = "sha256:83b382d64a4138a237956350cdce11160c7de73c24775555c53b740c1bdab38e"}, + {file = "fastremap-1.13.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4e2490b304d61efee2af560e0017fad79c3564a97087fac9130be20ca2b460db"}, + {file = "fastremap-1.13.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d368de6660fd8bac6e61b91ee4d35bf17c85c4a1709c1133ce4568ee9c8620ad"}, + {file = "fastremap-1.13.4-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:646f88298dd73c3ecfa51f53a75018ede599c7165065b0475a0ab44faf3bf69e"}, + {file = "fastremap-1.13.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:066daebe6c89b2d29d9033241a4a73d07a7861639d72f31eedb2bd2d679175c4"}, + {file = "fastremap-1.13.4-cp37-cp37m-win32.whl", hash = "sha256:976dad2a77cb53c4cbdb1416a9860106ccb56d42ffd46b5ebbedec84b084546b"}, + {file = "fastremap-1.13.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6d07f4e02a26740b6f182d7e33098bd2cf80cb26299d8cb77a939abf359af9ed"}, + {file = "fastremap-1.13.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:92e517915e73a2a42398e32ed549c6e9955b8c27f31521c65ada704da4a24880"}, + {file = "fastremap-1.13.4-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:bbc9c8deb73c41d6e6de64905c8e78ba4b36ac09d99811eb15a12fe3ae694c41"}, + {file = "fastremap-1.13.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c026202b0df95583f407264b7d6572d6121510beb476af205f09c54ac15a88e"}, + {file = "fastremap-1.13.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d569e2c1f773a5589af561703d40fe651314f5221bab149fa1df1d5dab544bf8"}, + {file = "fastremap-1.13.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:740cd5052a30e38c011ee566033240ce9a2eacdcaf4eea3dd72e3781e0e8f239"}, + {file = "fastremap-1.13.4-cp38-cp38-win32.whl", hash = "sha256:476693c05618f0af97f48b67373c71a21127ac88325adc7cb245d9aabe0e3d4b"}, + {file = "fastremap-1.13.4-cp38-cp38-win_amd64.whl", hash = "sha256:2d0372375811f4836659fd978ae4eca95130c89c776fca8ba42449600a8ef51f"}, + {file = "fastremap-1.13.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d0a239870a7c28c615af07a19839262d6efb1bedcac8a87b7d2ebf96b24994df"}, + {file = "fastremap-1.13.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1b1f87f572f26c3bba8095d23e87378b61ab3abde94895684067fc439aabeb63"}, + {file = "fastremap-1.13.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa000b8cf68b6338bd1234a7e02d600bdc7e30a1c3185e2ff5d0f6193805b797"}, + {file = "fastremap-1.13.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83fe79a140b560f4f1c33fb3d6328e96eac6cdca292808d01389b31761b54ace"}, + {file = "fastremap-1.13.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e95825420e6bffb11d18ad781196454db5b0af204ae564be17ed9895bf74e079"}, + {file = "fastremap-1.13.4-cp39-cp39-win32.whl", hash = "sha256:fae4825a3b6a7c16062914a08eef4274d8749d07d75b3a6e6c1a05ee60ffc9c7"}, + {file = "fastremap-1.13.4-cp39-cp39-win_amd64.whl", hash = "sha256:a8ee15500625b923e783f72cf44d40eb66fb36893df96099a63f591f38d912b9"}, + {file = "fastremap-1.13.4.tar.gz", hash = "sha256:77a65182fa66f278af5349cd7d36e4cb24d1f6ff889c296bde73b19752e8cf37"}, ] [package.dependencies] @@ -874,49 +872,6 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.51.1)"] -[[package]] -name = "h5py" -version = "2.10.0" -description = "Read and write HDF5 files from Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "h5py-2.10.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:ecf4d0b56ee394a0984de15bceeb97cbe1fe485f1ac205121293fc44dcf3f31f"}, - {file = "h5py-2.10.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:86868dc07b9cc8cb7627372a2e6636cdc7a53b7e2854ad020c9e9d8a4d3fd0f5"}, - {file = "h5py-2.10.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:aac4b57097ac29089f179bbc2a6e14102dd210618e94d77ee4831c65f82f17c0"}, - {file = "h5py-2.10.0-cp27-cp27m-win32.whl", hash = "sha256:7be5754a159236e95bd196419485343e2b5875e806fe68919e087b6351f40a70"}, - {file = "h5py-2.10.0-cp27-cp27m-win_amd64.whl", hash = "sha256:13c87efa24768a5e24e360a40e0bc4c49bcb7ce1bb13a3a7f9902cec302ccd36"}, - {file = "h5py-2.10.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:79b23f47c6524d61f899254f5cd5e486e19868f1823298bc0c29d345c2447172"}, - {file = "h5py-2.10.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbf28ae4b5af0f05aa6e7551cee304f1d317dbed1eb7ac1d827cee2f1ef97a99"}, - {file = "h5py-2.10.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:c0d4b04bbf96c47b6d360cd06939e72def512b20a18a8547fa4af810258355d5"}, - {file = "h5py-2.10.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:549ad124df27c056b2e255ea1c44d30fb7a17d17676d03096ad5cd85edb32dc1"}, - {file = "h5py-2.10.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:a5f82cd4938ff8761d9760af3274acf55afc3c91c649c50ab18fcff5510a14a5"}, - {file = "h5py-2.10.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3dad1730b6470fad853ef56d755d06bb916ee68a3d8272b3bab0c1ddf83bb99e"}, - {file = "h5py-2.10.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:063947eaed5f271679ed4ffa36bb96f57bc14f44dd4336a827d9a02702e6ce6b"}, - {file = "h5py-2.10.0-cp35-cp35m-win32.whl", hash = "sha256:c54a2c0dd4957776ace7f95879d81582298c5daf89e77fb8bee7378f132951de"}, - {file = "h5py-2.10.0-cp35-cp35m-win_amd64.whl", hash = "sha256:6998be619c695910cb0effe5eb15d3a511d3d1a5d217d4bd0bebad1151ec2262"}, - {file = "h5py-2.10.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:ff7d241f866b718e4584fa95f520cb19405220c501bd3a53ee11871ba5166ea2"}, - {file = "h5py-2.10.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:54817b696e87eb9e403e42643305f142cd8b940fe9b3b490bbf98c3b8a894cf4"}, - {file = "h5py-2.10.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d3c59549f90a891691991c17f8e58c8544060fdf3ccdea267100fa5f561ff62f"}, - {file = "h5py-2.10.0-cp36-cp36m-win32.whl", hash = "sha256:d7ae7a0576b06cb8e8a1c265a8bc4b73d05fdee6429bffc9a26a6eb531e79d72"}, - {file = "h5py-2.10.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bffbc48331b4a801d2f4b7dac8a72609f0b10e6e516e5c480a3e3241e091c878"}, - {file = "h5py-2.10.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:51ae56894c6c93159086ffa2c94b5b3388c0400548ab26555c143e7cfa05b8e5"}, - {file = "h5py-2.10.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:16ead3c57141101e3296ebeed79c9c143c32bdd0e82a61a2fc67e8e6d493e9d1"}, - {file = "h5py-2.10.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0e25bb91e7a02efccb50aba6591d3fe2c725479e34769802fcdd4076abfa917"}, - {file = "h5py-2.10.0-cp37-cp37m-win32.whl", hash = "sha256:f23951a53d18398ef1344c186fb04b26163ca6ce449ebd23404b153fd111ded9"}, - {file = "h5py-2.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8bb1d2de101f39743f91512a9750fb6c351c032e5cd3204b4487383e34da7f75"}, - {file = "h5py-2.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64f74da4a1dd0d2042e7d04cf8294e04ddad686f8eba9bb79e517ae582f6668d"}, - {file = "h5py-2.10.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d35f7a3a6cefec82bfdad2785e78359a0e6a5fbb3f605dd5623ce88082ccd681"}, - {file = "h5py-2.10.0-cp38-cp38-win32.whl", hash = "sha256:6ef7ab1089e3ef53ca099038f3c0a94d03e3560e6aff0e9d6c64c55fb13fc681"}, - {file = "h5py-2.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:769e141512b54dee14ec76ed354fcacfc7d97fea5a7646b709f7400cf1838630"}, - {file = "h5py-2.10.0.tar.gz", hash = "sha256:84412798925dc870ffd7107f045d7659e60f5d46d1c70c700375248bf6bf512d"}, -] - -[package.dependencies] -numpy = ">=1.7" -six = "*" - [[package]] name = "h5py" version = "3.8.0" @@ -952,14 +907,14 @@ numpy = ">=1.14.5" [[package]] name = "identify" -version = "2.5.15" +version = "2.5.18" description = "File identification library for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.15-py2.py3-none-any.whl", hash = "sha256:1f4b36c5f50f3f950864b2a047308743f064eaa6f6645da5e5c780d1c7125487"}, - {file = "identify-2.5.15.tar.gz", hash = "sha256:c22aa206f47cc40486ecf585d27ad5f40adbfc494a3fa41dc3ed0499a23b123f"}, + {file = "identify-2.5.18-py2.py3-none-any.whl", hash = "sha256:93aac7ecf2f6abf879b8f29a8002d3c6de7086b8c28d88e1ad15045a15ab63f9"}, + {file = "identify-2.5.18.tar.gz", hash = "sha256:89e144fa560cc4cffb6ef2ab5e9fb18ed9f9b3cb054384bab4b95c12f6c309fe"}, ] [package.extras] @@ -1019,14 +974,14 @@ all = ["matplotlib", "numcodecs", "tifffile"] [[package]] name = "imageio" -version = "2.25.0" +version = "2.25.1" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "imageio-2.25.0-py3-none-any.whl", hash = "sha256:9ef2fdef1235eef849b1aea399f08508493624a2a2c8cc3bba957dabb7d0b79f"}, - {file = "imageio-2.25.0.tar.gz", hash = "sha256:b80796a1f8c38c697a940a2ad7397ee28900d5c4e51061b9a67d16aca867f33e"}, + {file = "imageio-2.25.1-py3-none-any.whl", hash = "sha256:5bce7f88eef7ee4e9aac798d3b218fea2e98cbbaa59a3e37b730a7aa5784eeac"}, + {file = "imageio-2.25.1.tar.gz", hash = "sha256:6021d42debd2187e9c781e494a49a30eba002fbac1eef43f491bbc731e7a6d2b"}, ] [package.dependencies] @@ -1070,6 +1025,25 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +[[package]] +name = "importlib-resources" +version = "5.10.2" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"}, + {file = "importlib_resources-5.10.2.tar.gz", hash = "sha256:e4a96c8cc0339647ff9a5e0550d9f276fc5a01ffa276012b58ec108cfd7b8484"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -1084,27 +1058,28 @@ files = [ [[package]] name = "ipykernel" -version = "6.20.2" +version = "6.21.2" description = "IPython Kernel for Jupyter" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.20.2-py3-none-any.whl", hash = "sha256:5d0675d5f48bf6a95fd517d7b70bcb3b2c5631b2069949b5c2d6e1d7477fb5a0"}, - {file = "ipykernel-6.20.2.tar.gz", hash = "sha256:1893c5b847033cd7a58f6843b04a9349ffb1031bc6588401cadc9adb58da428e"}, + {file = "ipykernel-6.21.2-py3-none-any.whl", hash = "sha256:430d00549b6aaf49bd0f5393150691edb1815afa62d457ee6b1a66b25cb17874"}, + {file = "ipykernel-6.21.2.tar.gz", hash = "sha256:6e9213484e4ce1fb14267ee435e18f23cc3a0634e635b9fb4ed4677b84e0fdf8"}, ] [package.dependencies] appnope = {version = "*", markers = "platform_system == \"Darwin\""} comm = ">=0.1.1" -debugpy = ">=1.0" +debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=17" +pyzmq = ">=20" tornado = ">=6.1" traitlets = ">=5.4.0" @@ -1117,14 +1092,14 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" [[package]] name = "ipython" -version = "8.8.0" +version = "8.10.0" description = "IPython: Productive Interactive Computing" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipython-8.8.0-py3-none-any.whl", hash = "sha256:da01e6df1501e6e7c32b5084212ddadd4ee2471602e2cf3e0190f4de6b0ea481"}, - {file = "ipython-8.8.0.tar.gz", hash = "sha256:f3bf2c08505ad2c3f4ed5c46ae0331a8547d36bf4b21a451e8ae80c0791db95b"}, + {file = "ipython-8.10.0-py3-none-any.whl", hash = "sha256:b38c31e8fc7eff642fc7c597061fff462537cf2314e3225a19c906b7b0d8a345"}, + {file = "ipython-8.10.0.tar.gz", hash = "sha256:b13a1d6c1f5818bd388db53b7107d17454129a70de2b87481d555daede5eb49e"}, ] [package.dependencies] @@ -1136,13 +1111,13 @@ jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pickleshare = "*" -prompt-toolkit = ">=3.0.11,<3.1.0" +prompt-toolkit = ">=3.0.30,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.20)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] @@ -1152,7 +1127,7 @@ notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.20)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] [[package]] name = "jedi" @@ -1206,39 +1181,38 @@ files = [ [[package]] name = "jupyter-client" -version = "7.4.9" +version = "8.0.2" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_client-7.4.9-py3-none-any.whl", hash = "sha256:214668aaea208195f4c13d28eb272ba79f945fc0cf3f11c7092c20b2ca1980e7"}, - {file = "jupyter_client-7.4.9.tar.gz", hash = "sha256:52be28e04171f07aed8f20e1616a5a552ab9fee9cbbe6c1896ae170c3880d392"}, + {file = "jupyter_client-8.0.2-py3-none-any.whl", hash = "sha256:c53731eb590b68839b0ce04bf46ff8c4f03278f5d9fe5c3b0f268a57cc2bd97e"}, + {file = "jupyter_client-8.0.2.tar.gz", hash = "sha256:47ac9f586dbcff4d79387ec264faf0fdeb5f14845fa7345fd7d1e378f8096011"}, ] [package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.9.2" -nest-asyncio = ">=1.5.4" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" -traitlets = "*" +traitlets = ">=5.3" [package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["codecov", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "5.1.4" +version = "5.2.0" description = "Jupyter core package. A base package on which Jupyter projects rely." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.1.4-py3-none-any.whl", hash = "sha256:fe812ffffd0ead286327dc570888684183cef4070e57d9ebadc92f3bd9c9a05d"}, - {file = "jupyter_core-5.1.4.tar.gz", hash = "sha256:80d29fef4210ca8d30f25018a28d06dcc582bb1a82b848f2eab61a349a007af1"}, + {file = "jupyter_core-5.2.0-py3-none-any.whl", hash = "sha256:4bdc2928c37f6917130c667d8b8708f20aee539d8283c6be72aabd2a4b4c83b0"}, + {file = "jupyter_core-5.2.0.tar.gz", hash = "sha256:1407cdb4c79ee467696c04b76633fc1884015fa109323365a6372c8e890cc83f"}, ] [package.dependencies] @@ -1500,64 +1474,65 @@ files = [ [[package]] name = "matplotlib" -version = "3.6.3" +version = "3.7.0" description = "Python plotting package" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "matplotlib-3.6.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:80c166a0e28512e26755f69040e6bf2f946a02ffdb7c00bf6158cca3d2b146e6"}, - {file = "matplotlib-3.6.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eb9421c403ffd387fbe729de6d9a03005bf42faba5e8432f4e51e703215b49fc"}, - {file = "matplotlib-3.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5223affa21050fb6118353c1380c15e23aedfb436bf3e162c26dc950617a7519"}, - {file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00c248ab6b92bea3f8148714837937053a083ff03b4c5e30ed37e28fc0e7e56"}, - {file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca94f0362f6b6f424b555b956971dcb94b12d0368a6c3e07dc7a40d32d6d873d"}, - {file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59400cc9451094b7f08cc3f321972e6e1db4cd37a978d4e8a12824bf7fd2f03b"}, - {file = "matplotlib-3.6.3-cp310-cp310-win32.whl", hash = "sha256:57ad1aee29043163374bfa8990e1a2a10ff72c9a1bfaa92e9c46f6ea59269121"}, - {file = "matplotlib-3.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:1fcc4cad498533d3c393a160975acc9b36ffa224d15a6b90ae579eacee5d8579"}, - {file = "matplotlib-3.6.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d2cfaa7fd62294d945b8843ea24228a27c8e7c5b48fa634f3c168153b825a21b"}, - {file = "matplotlib-3.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c3f08df2ac4636249b8bc7a85b8b82c983bef1441595936f62c2918370ca7e1d"}, - {file = "matplotlib-3.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff2aa84e74f80891e6bcf292ebb1dd57714ffbe13177642d65fee25384a30894"}, - {file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11011c97d62c1db7bc20509572557842dbb8c2a2ddd3dd7f20501aa1cde3e54e"}, - {file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c235bf9be052347373f589e018988cad177abb3f997ab1a2e2210c41562cc0c"}, - {file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bebcff4c3ed02c6399d47329f3554193abd824d3d53b5ca02cf583bcd94470e2"}, - {file = "matplotlib-3.6.3-cp311-cp311-win32.whl", hash = "sha256:d5f18430f5cfa5571ab8f4c72c89af52aa0618e864c60028f11a857d62200cba"}, - {file = "matplotlib-3.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:dfba7057609ca9567b9704626756f0142e97ec8c5ba2c70c6e7bd1c25ef99f06"}, - {file = "matplotlib-3.6.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:9fb8fb19d03abf3c5dab89a8677e62c4023632f919a62b6dd1d6d2dbf42cd9f5"}, - {file = "matplotlib-3.6.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bbf269e1d24bc25247095d71c7a969813f7080e2a7c6fa28931a603f747ab012"}, - {file = "matplotlib-3.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:994637e2995b0342699b396a320698b07cd148bbcf2dd2fa2daba73f34dd19f2"}, - {file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77b384cee7ab8cf75ffccbfea351a09b97564fc62d149827a5e864bec81526e5"}, - {file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:73b93af33634ed919e72811c9703e1105185cd3fb46d76f30b7f4cfbbd063f89"}, - {file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:debeab8e2ab07e5e3dac33e12456da79c7e104270d2b2d1df92b9e40347cca75"}, - {file = "matplotlib-3.6.3-cp38-cp38-win32.whl", hash = "sha256:acc3b1a4bddbf56fe461e36fb9ef94c2cb607fc90d24ccc650040bfcc7610de4"}, - {file = "matplotlib-3.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:1183877d008c752d7d535396096c910f4663e4b74a18313adee1213328388e1e"}, - {file = "matplotlib-3.6.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6adc441b5b2098a4b904bbf9d9e92fb816fef50c55aa2ea6a823fc89b94bb838"}, - {file = "matplotlib-3.6.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6d81b11ede69e3a751424b98dc869c96c10256b2206bfdf41f9c720eee86844c"}, - {file = "matplotlib-3.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:29f17b7f2e068dc346687cbdf80b430580bab42346625821c2d3abf3a1ec5417"}, - {file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f56a7252eee8f3438447f75f5e1148a1896a2756a92285fe5d73bed6deebff4"}, - {file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbddfeb1495484351fb5b30cf5bdf06b3de0bc4626a707d29e43dfd61af2a780"}, - {file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809119d1cba3ece3c9742eb01827fe7a0e781ea3c5d89534655a75e07979344f"}, - {file = "matplotlib-3.6.3-cp39-cp39-win32.whl", hash = "sha256:e0a64d7cc336b52e90f59e6d638ae847b966f68582a7af041e063d568e814740"}, - {file = "matplotlib-3.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:79e501eb847f4a489eb7065bb8d3187117f65a4c02d12ea3a19d6c5bef173bcc"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2787a16df07370dcba385fe20cdd0cc3cfaabd3c873ddabca78c10514c799721"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68d94a436f62b8a861bf3ace82067a71bafb724b4e4f9133521e4d8012420dd7"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b409b2790cf8d7c1ef35920f01676d2ae7afa8241844e7aa5484fdf493a9a0"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:faff486b36530a836a6b4395850322e74211cd81fc17f28b4904e1bd53668e3e"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:38d38cb1ea1d80ee0f6351b65c6f76cad6060bbbead015720ba001348ae90f0c"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f999661589981e74d793ee2f41b924b3b87d65fd929f6153bf0f30675c59b1"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01b7f521a9a73c383825813af255f8c4485d1706e4f3e2ed5ae771e4403a40ab"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9ceebaf73f1a3444fa11014f38b9da37ff7ea328d6efa1652241fe3777bfdab9"}, - {file = "matplotlib-3.6.3.tar.gz", hash = "sha256:1f4d69707b1677560cd952544ee4962f68ff07952fb9069ff8c12b56353cb8c9"}, + {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:3da8b9618188346239e51f1ea6c0f8f05c6e218cfcc30b399dd7dd7f52e8bceb"}, + {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c0592ba57217c22987b7322df10f75ef95bc44dce781692b4b7524085de66019"}, + {file = "matplotlib-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:21269450243d6928da81a9bed201f0909432a74e7d0d65db5545b9fa8a0d0223"}, + {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb2e76cd429058d8954121c334dddfcd11a6186c6975bca61f3f248c99031b05"}, + {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de20eb1247725a2f889173d391a6d9e7e0f2540feda24030748283108b0478ec"}, + {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5465735eaaafd1cfaec3fed60aee776aeb3fd3992aa2e49f4635339c931d443"}, + {file = "matplotlib-3.7.0-cp310-cp310-win32.whl", hash = "sha256:092e6abc80cdf8a95f7d1813e16c0e99ceda8d5b195a3ab859c680f3487b80a2"}, + {file = "matplotlib-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:4f640534ec2760e270801056bc0d8a10777c48b30966eef78a7c35d8590915ba"}, + {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f336e7014889c38c59029ebacc35c59236a852e4b23836708cfd3f43d1eaeed5"}, + {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a10428d4f8d1a478ceabd652e61a175b2fdeed4175ab48da4a7b8deb561e3fa"}, + {file = "matplotlib-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46ca923e980f76d34c1c633343a72bb042d6ba690ecc649aababf5317997171d"}, + {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c849aa94ff2a70fb71f318f48a61076d1205c6013b9d3885ade7f992093ac434"}, + {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:827e78239292e561cfb70abf356a9d7eaf5bf6a85c97877f254009f20b892f89"}, + {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:691ef1f15360e439886186d0db77b5345b24da12cbc4fc57b26c4826db4d6cab"}, + {file = "matplotlib-3.7.0-cp311-cp311-win32.whl", hash = "sha256:21a8aeac39b4a795e697265d800ce52ab59bdeb6bb23082e2d971f3041074f02"}, + {file = "matplotlib-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:01681566e95b9423021b49dea6a2395c16fa054604eacb87f0f4c439750f9114"}, + {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cf119eee4e57389fba5ac8b816934e95c256535e55f0b21628b4205737d1de85"}, + {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:21bd4033c40b95abd5b8453f036ed5aa70856e56ecbd887705c37dce007a4c21"}, + {file = "matplotlib-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:111ef351f28fd823ed7177632070a6badd6f475607122bc9002a526f2502a0b5"}, + {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f91d35b3ef51d29d9c661069b9e4ba431ce283ffc533b981506889e144b5b40e"}, + {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a776462a4a63c0bfc9df106c15a0897aa2dbab6795c693aa366e8e283958854"}, + {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dfd4a0cbd151f6439e6d7f8dca5292839ca311e7e650596d073774847ca2e4f"}, + {file = "matplotlib-3.7.0-cp38-cp38-win32.whl", hash = "sha256:56b7b79488209041a9bf7ddc34f1b069274489ce69e34dc63ae241d0d6b4b736"}, + {file = "matplotlib-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:8665855f3919c80551f377bc16df618ceabf3ef65270bc14b60302dce88ca9ab"}, + {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:f910d924da8b9fb066b5beae0b85e34ed1b6293014892baadcf2a51da1c65807"}, + {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cf6346644e8fe234dc847e6232145dac199a650d3d8025b3ef65107221584ba4"}, + {file = "matplotlib-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d1e52365d8d5af699f04581ca191112e1d1220a9ce4386b57d807124d8b55e6"}, + {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c869b646489c6a94375714032e5cec08e3aa8d3f7d4e8ef2b0fb50a52b317ce6"}, + {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4ddac5f59e78d04b20469bc43853a8e619bb6505c7eac8ffb343ff2c516d72f"}, + {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0304c1cd802e9a25743414c887e8a7cd51d96c9ec96d388625d2cd1c137ae3"}, + {file = "matplotlib-3.7.0-cp39-cp39-win32.whl", hash = "sha256:a06a6c9822e80f323549c6bc9da96d4f233178212ad9a5f4ab87fd153077a507"}, + {file = "matplotlib-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:cb52aa97b92acdee090edfb65d1cb84ea60ab38e871ba8321a10bbcebc2a3540"}, + {file = "matplotlib-3.7.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3493b48e56468c39bd9c1532566dff3b8062952721b7521e1f394eb6791495f4"}, + {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d0dcd1a0bf8d56551e8617d6dc3881d8a1c7fb37d14e5ec12cbb293f3e6170a"}, + {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51fb664c37714cbaac69c16d6b3719f517a13c96c3f76f4caadd5a0aa7ed0329"}, + {file = "matplotlib-3.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4497d88c559b76da320b7759d64db442178beeea06a52dc0c629086982082dcd"}, + {file = "matplotlib-3.7.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9d85355c48ef8b9994293eb7c00f44aa8a43cad7a297fbf0770a25cdb2244b91"}, + {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03eb2c8ff8d85da679b71e14c7c95d16d014c48e0c0bfa14db85f6cdc5c92aad"}, + {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71b751d06b2ed1fd017de512d7439c0259822864ea16731522b251a27c0b2ede"}, + {file = "matplotlib-3.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b51ab8a5d5d3bbd4527af633a638325f492e09e45e78afdf816ef55217a09664"}, + {file = "matplotlib-3.7.0.tar.gz", hash = "sha256:8f6efd313430d7ef70a38a3276281cb2e8646b3a22b3b21eb227da20e15e6813"}, ] [package.dependencies] contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.19" +numpy = ">=1.20" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.2.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [[package]] @@ -1702,42 +1677,38 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mypy" -version = "0.991" +version = "1.0.0" description = "Optional static typing for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, - {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, - {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, - {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, - {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, - {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, - {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, - {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, - {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, - {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, - {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, - {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, - {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, - {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, - {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, - {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, - {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, - {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, - {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, - {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, - {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, - {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, - {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, - {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, + {file = "mypy-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0626db16705ab9f7fa6c249c017c887baf20738ce7f9129da162bb3075fc1af"}, + {file = "mypy-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ace23f6bb4aec4604b86c4843276e8fa548d667dbbd0cb83a3ae14b18b2db6c"}, + {file = "mypy-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87edfaf344c9401942883fad030909116aa77b0fa7e6e8e1c5407e14549afe9a"}, + {file = "mypy-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0ab090d9240d6b4e99e1fa998c2d0aa5b29fc0fb06bd30e7ad6183c95fa07593"}, + {file = "mypy-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:7cc2c01dfc5a3cbddfa6c13f530ef3b95292f926329929001d45e124342cd6b7"}, + {file = "mypy-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14d776869a3e6c89c17eb943100f7868f677703c8a4e00b3803918f86aafbc52"}, + {file = "mypy-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb2782a036d9eb6b5a6efcdda0986774bf798beef86a62da86cb73e2a10b423d"}, + {file = "mypy-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cfca124f0ac6707747544c127880893ad72a656e136adc935c8600740b21ff5"}, + {file = "mypy-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8845125d0b7c57838a10fd8925b0f5f709d0e08568ce587cc862aacce453e3dd"}, + {file = "mypy-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b1b9e1ed40544ef486fa8ac022232ccc57109f379611633ede8e71630d07d2"}, + {file = "mypy-1.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c7cf862aef988b5fbaa17764ad1d21b4831436701c7d2b653156a9497d92c83c"}, + {file = "mypy-1.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd187d92b6939617f1168a4fe68f68add749902c010e66fe574c165c742ed88"}, + {file = "mypy-1.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4e5175026618c178dfba6188228b845b64131034ab3ba52acaffa8f6c361f805"}, + {file = "mypy-1.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2f6ac8c87e046dc18c7d1d7f6653a66787a4555085b056fe2d599f1f1a2a2d21"}, + {file = "mypy-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7306edca1c6f1b5fa0bc9aa645e6ac8393014fa82d0fa180d0ebc990ebe15964"}, + {file = "mypy-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3cfad08f16a9c6611e6143485a93de0e1e13f48cfb90bcad7d5fde1c0cec3d36"}, + {file = "mypy-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67cced7f15654710386e5c10b96608f1ee3d5c94ca1da5a2aad5889793a824c1"}, + {file = "mypy-1.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a86b794e8a56ada65c573183756eac8ac5b8d3d59daf9d5ebd72ecdbb7867a43"}, + {file = "mypy-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:50979d5efff8d4135d9db293c6cb2c42260e70fb010cbc697b1311a4d7a39ddb"}, + {file = "mypy-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ae4c7a99e5153496243146a3baf33b9beff714464ca386b5f62daad601d87af"}, + {file = "mypy-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e398652d005a198a7f3c132426b33c6b85d98aa7dc852137a2a3be8890c4072"}, + {file = "mypy-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be78077064d016bc1b639c2cbcc5be945b47b4261a4f4b7d8923f6c69c5c9457"}, + {file = "mypy-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92024447a339400ea00ac228369cd242e988dd775640755fa4ac0c126e49bb74"}, + {file = "mypy-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:fe523fcbd52c05040c7bee370d66fee8373c5972171e4fbc323153433198592d"}, + {file = "mypy-1.0.0-py3-none-any.whl", hash = "sha256:2efa963bdddb27cb4a0d42545cd137a8d2b883bd181bbc4525b568ef6eca258f"}, + {file = "mypy-1.0.0.tar.gz", hash = "sha256:f34495079c8d9da05b183f9f7daec2878280c2ad7cc81da686ef0b484cea2ecf"}, ] [package.dependencies] @@ -1753,14 +1724,14 @@ reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] @@ -2113,14 +2084,14 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.10.3" +version = "0.11.0" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.10.3-py3-none-any.whl", hash = "sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6"}, - {file = "pathspec-0.10.3.tar.gz", hash = "sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6"}, + {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, + {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, ] [[package]] @@ -2243,19 +2214,19 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "2.6.2" +version = "3.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, - {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, + {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, + {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -2275,14 +2246,14 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.0.0" +version = "3.0.4" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "pre_commit-3.0.0-py2.py3-none-any.whl", hash = "sha256:6af0a0b4137c0903794632f77b7223c4af0373f5cd3337056d2dab32aa3a5caf"}, - {file = "pre_commit-3.0.0.tar.gz", hash = "sha256:de265f74325f0c3ff1a727a974449315ea9b11975cf6b02c11f26e50acfa48f1"}, + {file = "pre_commit-3.0.4-py2.py3-none-any.whl", hash = "sha256:9e3255edb0c9e7fe9b4f328cb3dc86069f8fdc38026f1bf521018a05eaf4d67b"}, + {file = "pre_commit-3.0.4.tar.gz", hash = "sha256:bc4687478d55578c4ac37272fe96df66f73d9b5cf81be6f28627d4e712e752d5"}, ] [package.dependencies] @@ -2791,23 +2762,23 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rich" -version = "13.2.0" +version = "13.3.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.2.0-py3-none-any.whl", hash = "sha256:7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003"}, - {file = "rich-13.2.0.tar.gz", hash = "sha256:f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5"}, + {file = "rich-13.3.1-py3-none-any.whl", hash = "sha256:8aa57747f3fc3e977684f0176a88e789be314a99f99b43b75d1e9cb5dc6db9e9"}, + {file = "rich-13.3.1.tar.gz", hash = "sha256:125d96d20c92b946b983d0d392b84ff945461e5a06d3867e9f9e575f8697b67f"}, ] [package.dependencies] markdown-it-py = ">=2.1.0,<3.0.0" -pygments = ">=2.6.0,<3.0.0" +pygments = ">=2.14.0,<3.0.0" typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} [package.extras] -jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] +jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rsa" @@ -2826,28 +2797,29 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.0.231" +version = "0.0.247" description = "An extremely fast Python linter, written in Rust." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.231-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:3ec386c323d4faa4add9e891601c709a7bf55793eb11b9adab8514e77b9a8f46"}, - {file = "ruff-0.0.231-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:d1517e587105a44c5e4cb17b10059d12bd5fefb22e54a7b52804323acd3de9e6"}, - {file = "ruff-0.0.231-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde5ec76eb667b31729eff8dcc8adf1d1da894cc5827a33147c2b640ace5b54a"}, - {file = "ruff-0.0.231-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1aff23f080904003b664df97e301fe59714552b3c2c7e7213407547186be1618"}, - {file = "ruff-0.0.231-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99b39496163880395d8dc8815445431c8feb94613738d67916984902811f7c4"}, - {file = "ruff-0.0.231-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0ca593bb41c9ca363ed24c8985ae65faf483fc1f6831e9ca5dc5383f87737b2e"}, - {file = "ruff-0.0.231-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef39e57d2cd21601c20c1861a5d580aa7f389aa5360403634ae354a14965b94b"}, - {file = "ruff-0.0.231-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40bb1b071489523c18e4ca9a2b3f4e58fcf4d66f3707cdb6e706e44fa8e88abc"}, - {file = "ruff-0.0.231-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1d086a08ddda1b971ed875dd82b264b821c505687e1b71881b3d839feb22e5b"}, - {file = "ruff-0.0.231-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1e39b1fbdb2147a000ca477111cb1f5929ec4dc75a499f9a929e4f5b8d2be763"}, - {file = "ruff-0.0.231-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:662cb063c90cb21f37e82ce6bd8b07a292d7c2718bf5926e2f9e1597791bdf20"}, - {file = "ruff-0.0.231-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3f4c99e8e622c524b8e292c248f9f52eb84ede59b504904cddfc812005b0e8b5"}, - {file = "ruff-0.0.231-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:089c16bdfef873361328d22e9ef0dd6fd20566962d23661db3493f7e87ca5aed"}, - {file = "ruff-0.0.231-py3-none-win32.whl", hash = "sha256:4f5327669010b5d603a9176a37de862b3f0e7c60722f2bf9910d44f186e58f0f"}, - {file = "ruff-0.0.231-py3-none-win_amd64.whl", hash = "sha256:c3f47ecee98279366bc0cbcd3fa799641e7c8444cbc2be28fc5fb221a53b5730"}, - {file = "ruff-0.0.231.tar.gz", hash = "sha256:6f7e7a3251edece0bf37df83e3f0fa316a38b160e24fce7169440fa2a1eb4288"}, + {file = "ruff-0.0.247-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:0151face9ef0e09c0d09166eae5f6df9d61ed7b1686086092d56164b790d1adf"}, + {file = "ruff-0.0.247-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:0abffda0039dc0eec18d624a48a725c414587c816194d1c9889eceba82e87ad0"}, + {file = "ruff-0.0.247-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e34ce0a12a9c7ac25fcfd8a9a25ade778f4e54df37f7ce58c406c36f9d5a1e3"}, + {file = "ruff-0.0.247-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c31adc9f08e1652acb6c1b6d494a3e52895e341398b5dcaffe3325688f70de87"}, + {file = "ruff-0.0.247-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebc3b3077a880ea8af9f17c5614f606d6c1a15db6823501f4b8d3daf51f78782"}, + {file = "ruff-0.0.247-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:403f67452655923d0775c6c3854750e77c9c97eb875ea979ad515d3c75a45cff"}, + {file = "ruff-0.0.247-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53dd6124c6b822c27ee23965ce9d8c5fbc76a97ecc209daef0bbfbe8f905cb18"}, + {file = "ruff-0.0.247-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1483c7435db4926da3793a89f6bbb68dedf2990aeddef01407d8c47953403e0"}, + {file = "ruff-0.0.247-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ce619be01206ab71054c9f492a803cc81be678222379c69a0d60aa66c30e4a2"}, + {file = "ruff-0.0.247-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:172c0a8fb295259d9e12e43c39cf3bd006ae85eae89b8e9ca6ece7252241b603"}, + {file = "ruff-0.0.247-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0cda3a13e67adaf5198c69847a2f04011434bdfbfdca05ac32c101991dd56162"}, + {file = "ruff-0.0.247-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4481b5b6103dffc09156f2fea79a9a9282a72c0109ca4ab74828ae1089ec8c7e"}, + {file = "ruff-0.0.247-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8c835b703cebb0f23d59ec3d83ff498c5290fae51f98df548aacbb9ff85cc93c"}, + {file = "ruff-0.0.247-py3-none-win32.whl", hash = "sha256:3695f5fd2f4ad44030799a6021b2626442e8d92e432d646aadeefd4a1fceab12"}, + {file = "ruff-0.0.247-py3-none-win_amd64.whl", hash = "sha256:3e22f08bc403d3b4f32488ea52cd69fc3cb343b2c99431fd969cda1c83f4bc2f"}, + {file = "ruff-0.0.247-py3-none-win_arm64.whl", hash = "sha256:737b7fd25d2523b7c526830a3670364a953cb6c6bbf9912c78cba06bbf0ca125"}, + {file = "ruff-0.0.247.tar.gz", hash = "sha256:cce9566cea1cb348bb2dec99f810d846d112627fa52bf3a554773ce4737a061b"}, ] [[package]] @@ -2904,33 +2876,33 @@ test = ["asv", "codecov", "flake8", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", " [[package]] name = "scikit-learn" -version = "1.2.0" +version = "1.2.1" description = "A set of python modules for machine learning and data mining" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.2.0.tar.gz", hash = "sha256:680b65b3caee469541385d2ca5b03ff70408f6c618c583948312f0d2125df680"}, - {file = "scikit_learn-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1beaa631434d1f17a20b1eef5d842e58c195875d2bc11901a1a70b5fe544745b"}, - {file = "scikit_learn-1.2.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d395730f26d8fc752321f1953ddf72647c892d8bed74fad4d7c816ec9b602dfa"}, - {file = "scikit_learn-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd3480c982b9e616b9f76ad8587804d3f4e91b4e2a6752e7dafb8a2e1f541098"}, - {file = "scikit_learn-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:184a42842a4e698ffa4d849b6019de50a77a0aa24d26afa28fa49c9190bb144b"}, - {file = "scikit_learn-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:867023a044fdfe59e5014a7fec7a3086a8928f10b5dce9382eedf4135f6709a2"}, - {file = "scikit_learn-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5546a8894a0616e92489ef995b39a0715829f3df96e801bb55cbf196be0d9649"}, - {file = "scikit_learn-1.2.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:bc7073e025b62c1067cbfb76e69d08650c6b9d7a0e7afdfa20cb92d4afe516f6"}, - {file = "scikit_learn-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc0a72237f0c56780cf550df87201a702d3bdcbbb23c6ef7d54c19326fa23f19"}, - {file = "scikit_learn-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1ea0bc1706da45589bcf2490cde6276490a1b88f9af208dbb396fdc3a0babf"}, - {file = "scikit_learn-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:f17420a8e3f40129aeb7e0f5ee35822d6178617007bb8f69521a2cefc20d5f00"}, - {file = "scikit_learn-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25ba705ee1600ffc5df1dccd8fae129d7c6836e44ffcbb52d78536c9eaf8fcf9"}, - {file = "scikit_learn-1.2.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:6b63ca2b0643d30fbf9d25d93017ed3fb8351f31175d82d104bfec60cba7bb87"}, - {file = "scikit_learn-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c772fa8c64776ad769fd764752c8452844307adcf10dee3adcc43988260f21"}, - {file = "scikit_learn-1.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0834e4cec2a2e0d8978f39cb8fe1cad3be6c27a47927e1774bf5737ea65ec228"}, - {file = "scikit_learn-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:da29d2e379c396a63af5ed4b671ad2005cd690ac373a23bee5a0f66504e05272"}, - {file = "scikit_learn-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:23a88883ca60c571a06278e4726b3b51b3709cfa4c93cacbf5568b22ba960899"}, - {file = "scikit_learn-1.2.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:40f3ff68c505cb9d1f3693397c73991875d609da905087e00e7b4477645ec67b"}, - {file = "scikit_learn-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9535e867281ae6987bb80620ba14cf1649e936bfe45f48727b978b7a2dbe835"}, - {file = "scikit_learn-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de897720173b26842e21bed54362f5294e282422116b61cd931d4f5d870b9855"}, - {file = "scikit_learn-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:ceb0008f345188aa236e49c973dc160b9ed504a3abd7b321a0ecabcb669be0bd"}, + {file = "scikit-learn-1.2.1.tar.gz", hash = "sha256:fbf8a5c893c9b4b99bcc7ed8fb3e8500957a113f4101860386d06635520f7cfb"}, + {file = "scikit_learn-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bed9f75763bd392c094bf474c7ab75a01d68b15146ea7a20c0f9ff6fb3063dad"}, + {file = "scikit_learn-1.2.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c9285275a435d1f8f47bbe3500346ab9ead2499e0e090518404d318ea90d1c1c"}, + {file = "scikit_learn-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc838b5a4057c55ba81b82316ea8bf443af445f96eb21500b0e40618017e0923"}, + {file = "scikit_learn-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8bcd303dd982494842a3f482f844d539484c6043b4eed896b43ea8e5f609a21"}, + {file = "scikit_learn-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:a9abf17d177df54e529154f26acfd42930e19117d045e8a9a8e893ca82dd94ec"}, + {file = "scikit_learn-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:70fa30d146b7e9d0c256e73e271b3e17f23123b7c4adcbde1a385031adf59090"}, + {file = "scikit_learn-1.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5a8111f3c7a314017ebf90d6feab861c11d1ca14f3dbafb39abcc31aa4c54ba6"}, + {file = "scikit_learn-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba0c7c6bf1493f8ce670bab69f9317874826ee838988de377ae355abd4d74cf"}, + {file = "scikit_learn-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479aedd0abedbda6b8b4529145fe4cd8622f69f726a72cef8f75548a93eeb1e1"}, + {file = "scikit_learn-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5523e21ab2b4d52b2bd41bedd335dbe8f3c1b5f6dd7c9c001b2e17ec9818af8d"}, + {file = "scikit_learn-1.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dcfab6a19b236194af88771d8e6e778a60c3339248ab0018696ebf2b7c8bed4b"}, + {file = "scikit_learn-1.2.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559f66e12f93b34c8c85c0a5728c3b8af98f04eb12f2c9ee18ea3c82c3d2fad1"}, + {file = "scikit_learn-1.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbb7831b2308c67bb6dd83c5ea3cdaf8e8cafd2de4000b93d78bb689126bd2cf"}, + {file = "scikit_learn-1.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2c5d9930ced2b7821ad936b9940706ccb5471d89b8a516bb641cec87257d1c"}, + {file = "scikit_learn-1.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:54731e2c2fbff40da6d76cbb9022ace5f44a4020a10bd5cd92107e86882bad15"}, + {file = "scikit_learn-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d00e46a2a7fce6e118ed0f4c6263785bf6c297a94ffd0cd7b32455043c508cc8"}, + {file = "scikit_learn-1.2.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da0e2d50a8435ea8dc5cd21f1fc1a45d329bae03dcca92087ebed859d22d184e"}, + {file = "scikit_learn-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61bb9c654b5d2e6cdd4b1c7e6048fc66270c1682bda1b0f7d2726fdae09010f4"}, + {file = "scikit_learn-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0ee4d4d32c94e082344308528f7b3c9294b60ab19c84eb37a2d9c88bdffd9d1"}, + {file = "scikit_learn-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:c722f3446ad8c4f1a93b2399fe1a188635b94709a3f25e6f4d61efbe75fe8eaa"}, ] [package.dependencies] @@ -3008,14 +2980,14 @@ stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] [[package]] name = "setuptools" -version = "66.1.1" +version = "67.3.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-66.1.1-py3-none-any.whl", hash = "sha256:6f590d76b713d5de4e49fe4fbca24474469f53c83632d5d0fd056f7ff7e8112b"}, - {file = "setuptools-66.1.1.tar.gz", hash = "sha256:ac4008d396bc9cd983ea483cb7139c0240a07bbc74ffb6232fceffedc6cf03a8"}, + {file = "setuptools-67.3.2-py3-none-any.whl", hash = "sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48"}, + {file = "setuptools-67.3.2.tar.gz", hash = "sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012"}, ] [package.extras] @@ -3270,14 +3242,14 @@ files = [ [[package]] name = "tifffile" -version = "2023.1.23.1" +version = "2023.2.3" description = "Read and write TIFF files" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "tifffile-2023.1.23.1-py3-none-any.whl", hash = "sha256:2b626a8ee81b692e1fa5320201a4b70f1915d2567945e68665621a75a12b3730"}, - {file = "tifffile-2023.1.23.1.tar.gz", hash = "sha256:a3d0c149cc7faef796fd598856314f43fdcd0895c79c3cb662a38c1c1bd49572"}, + {file = "tifffile-2023.2.3-py3-none-any.whl", hash = "sha256:6df45c1eab632eadb9384994c8ae8bc424cd3c26e9508481a345dbef1dcfd480"}, + {file = "tifffile-2023.2.3.tar.gz", hash = "sha256:458df5ad9a5217f668edd636dc19fbc736062bf78aac823ab84cdbae9de8eaa6"}, ] [package.dependencies] @@ -3395,14 +3367,14 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.8.1" +version = "5.9.0" description = "Traitlets Python configuration system" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "traitlets-5.8.1-py3-none-any.whl", hash = "sha256:a1ca5df6414f8b5760f7c5f256e326ee21b581742114545b462b35ffe3f04861"}, - {file = "traitlets-5.8.1.tar.gz", hash = "sha256:32500888f5ff7bbf3b9267ea31748fa657aaf34d56d85e60f91dda7dc7f5785b"}, + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, ] [package.extras] @@ -3432,14 +3404,14 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6. [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] [[package]] @@ -3461,24 +3433,24 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.17.1" +version = "20.19.0" description = "Virtual Python Environment builder" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "virtualenv-20.17.1-py3-none-any.whl", hash = "sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4"}, - {file = "virtualenv-20.17.1.tar.gz", hash = "sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058"}, + {file = "virtualenv-20.19.0-py3-none-any.whl", hash = "sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1"}, + {file = "virtualenv-20.19.0.tar.gz", hash = "sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590"}, ] [package.dependencies] distlib = ">=0.3.6,<1" filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<3" +platformdirs = ">=2.4,<4" [package.extras] -docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] -testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] [[package]] name = "watchdog" @@ -3535,14 +3507,14 @@ files = [ [[package]] name = "werkzeug" -version = "2.2.2" +version = "2.2.3" description = "The comprehensive WSGI web application library." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Werkzeug-2.2.2-py3-none-any.whl", hash = "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5"}, - {file = "Werkzeug-2.2.2.tar.gz", hash = "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f"}, + {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, + {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, ] [package.dependencies] @@ -3642,18 +3614,18 @@ files = [ [[package]] name = "zipp" -version = "3.11.0" +version = "3.13.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, - {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, + {file = "zipp-3.13.0-py3-none-any.whl", hash = "sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b"}, + {file = "zipp-3.13.0.tar.gz", hash = "sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] From 98c0837b81c43379e8c6c34995b3a37d9a8d0495 Mon Sep 17 00:00:00 2001 From: Corentin <> Date: Fri, 17 Feb 2023 11:24:23 +0100 Subject: [PATCH 2/5] better atp options and treatment --- .gitignore | 2 +- myoquant/commands/run_atp.py | 26 ++++++++++++++++++++++---- myoquant/src/ATP_analysis.py | 6 +++--- myoquant/src/common_func.py | 12 +++++++----- poetry.lock | 13 +++---------- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index c6906a5..7a5cbed 100644 --- a/.gitignore +++ b/.gitignore @@ -170,4 +170,4 @@ debug_data/ !cytoplasm.tif !binary_mask_sdh.tif data/* -sample_atp_intensity_plot.png \ No newline at end of file +*intensity_plot.png \ No newline at end of file diff --git a/myoquant/commands/run_atp.py b/myoquant/commands/run_atp.py index c94082f..1bf736c 100644 --- a/myoquant/commands/run_atp.py +++ b/myoquant/commands/run_atp.py @@ -63,6 +63,14 @@ def atp_analysis( None, help="Image channel to use for the analysis. If not specified, the analysis will be performed on all three channels.", ), + channel_first: bool = typer.Option( + False, + help="If the channel is the first dimension of the image, set this to True. False by default.", + ), + rescale_exposure: bool = typer.Option( + False, + help="Rescale the image exposure if your image is not in the 0 255 forma, False by default.", + ), n_classes: int = typer.Option( 2, max=10, @@ -72,9 +80,10 @@ def atp_analysis( "median", help="The method to use to compute the intensity of the cell. Can be either 'median' or 'mean'.", ), - erosion: bool = typer.Option( + erosion: int = typer.Option( False, - help="Perform an erosion on the cells images to remove signal in the cell membrane (usefull for fluo)", + max=45, + help="Perform an erosion on the cells images to remove signal in the cell membrane (usefull for fluo). Expressed in percentage of the cell radius", ), export_map: bool = typer.Option( True, @@ -127,6 +136,7 @@ def atp_analysis( from ..src.ATP_analysis import run_atp_analysis import numpy as np from PIL import Image + from skimage.exposure import rescale_intensity try: from imageio.v2 import imread @@ -153,8 +163,16 @@ def atp_analysis( progress.add_task(description="Reading all inputs...", total=None) image_ndarray = imread(image_path) if channel is not None: - image_ndarray = image_ndarray[:, :, channel] - + if channel_first: + # Put the channel as third dimension instead of first + image_ndarray = np.moveaxis(image_ndarray, 0, -1) + image_ndarray = image_ndarray[:, :, channel] + if rescale_exposure: + image_ndarray = rescale_intensity( + image_ndarray, + in_range=(np.amin(image_ndarray), np.amax(image_ndarray)), + out_range=np.uint8, + ) if mask_path is not None: mask_ndarray = imread(mask_path) if np.unique(mask_ndarray).shape[0] != 2: diff --git a/myoquant/src/ATP_analysis.py b/myoquant/src/ATP_analysis.py index 41386fb..cc8cbdd 100644 --- a/myoquant/src/ATP_analysis.py +++ b/myoquant/src/ATP_analysis.py @@ -14,7 +14,7 @@ def get_all_intensity( - image_array, df_cellpose, intensity_method="median", erosion=False + image_array, df_cellpose, intensity_method="median", erosion=None ): all_cell_median_intensity = [] for index in range(len(df_cellpose)): @@ -97,7 +97,7 @@ def predict_all_cells( intensity_threshold, n_classes=2, intensity_method="median", - erosion=False, + erosion=None, ): all_cell_median_intensity = get_all_intensity( histo_img, cellpose_df, intensity_method, erosion @@ -146,7 +146,7 @@ def run_atp_analysis( intensity_threshold=None, n_classes=2, intensity_method="median", - erosion=False, + erosion=None, ): df_cellpose = df_from_cellpose_mask(mask_cellpose) class_predicted_all, intensity_all, intensity_threshold = predict_all_cells( diff --git a/myoquant/src/common_func.py b/myoquant/src/common_func.py index f6ed068..0a6080e 100644 --- a/myoquant/src/common_func.py +++ b/myoquant/src/common_func.py @@ -173,17 +173,19 @@ def df_from_stardist_mask(mask, intensity_image=None): return df_stardist -def extract_single_image(raw_image, df_props, index, erosion=False): +def extract_single_image(raw_image, df_props, index, erosion=None): single_entity_img = raw_image[ df_props.iloc[index, 5] : df_props.iloc[index, 7], df_props.iloc[index, 6] : df_props.iloc[index, 8], ].copy() surface_area = df_props.iloc[index, 1] cell_radius = math.sqrt(surface_area / math.pi) - single_entity_mask = df_props.iloc[index, 9] - erosion_size = int(cell_radius / 5) # 20% of the cell - if erosion: - for i in range(erosion_size): + single_entity_mask = df_props.iloc[index, 9].copy() + erosion_size = cell_radius * ( + erosion / 100 + ) # Erosion in percentage of the cell radius + if erosion is not None: + for i in range(int(erosion_size)): single_entity_mask = binary_erosion( single_entity_mask, out=single_entity_mask ) diff --git a/poetry.lock b/poetry.lock index 79ebbd9..0bf3b92 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1181,14 +1181,14 @@ files = [ [[package]] name = "jupyter-client" -version = "8.0.2" +version = "8.0.3" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.0.2-py3-none-any.whl", hash = "sha256:c53731eb590b68839b0ce04bf46ff8c4f03278f5d9fe5c3b0f268a57cc2bd97e"}, - {file = "jupyter_client-8.0.2.tar.gz", hash = "sha256:47ac9f586dbcff4d79387ec264faf0fdeb5f14845fa7345fd7d1e378f8096011"}, + {file = "jupyter_client-8.0.3-py3-none-any.whl", hash = "sha256:be48ac6bd659cbbddb7a674cf06b3b8afbf53f228253cf58bde604c03bd487b0"}, + {file = "jupyter_client-8.0.3.tar.gz", hash = "sha256:ed65498bea6d876ef9d8da3e0db3dd33c5d129f5b2645f56ae03993782966bd0"}, ] [package.dependencies] @@ -2136,13 +2136,6 @@ files = [ {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, - {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, - {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, - {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, - {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, - {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, - {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, From 7550a153827a1e2ad40dae61149adbe4244b2134 Mon Sep 17 00:00:00 2001 From: Corentin <> Date: Mon, 27 Feb 2023 11:40:25 +0100 Subject: [PATCH 3/5] bug fix atp --- .gitignore | 3 ++- myoquant/commands/run_atp.py | 2 +- myoquant/src/ATP_analysis.py | 11 +++++++---- notebooks/atp_exploration.ipynb | 34 +++++++++++++++++++++++++++------ 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 7a5cbed..fc4303d 100644 --- a/.gitignore +++ b/.gitignore @@ -170,4 +170,5 @@ debug_data/ !cytoplasm.tif !binary_mask_sdh.tif data/* -*intensity_plot.png \ No newline at end of file +*intensity_plot.png +*.idea \ No newline at end of file diff --git a/myoquant/commands/run_atp.py b/myoquant/commands/run_atp.py index 1bf736c..881e745 100644 --- a/myoquant/commands/run_atp.py +++ b/myoquant/commands/run_atp.py @@ -166,7 +166,7 @@ def atp_analysis( if channel_first: # Put the channel as third dimension instead of first image_ndarray = np.moveaxis(image_ndarray, 0, -1) - image_ndarray = image_ndarray[:, :, channel] + image_ndarray = image_ndarray[:, :, channel] if rescale_exposure: image_ndarray = rescale_intensity( image_ndarray, diff --git a/myoquant/src/ATP_analysis.py b/myoquant/src/ATP_analysis.py index cc8cbdd..e11fbf7 100644 --- a/myoquant/src/ATP_analysis.py +++ b/myoquant/src/ATP_analysis.py @@ -33,7 +33,7 @@ def get_all_intensity( def estimate_threshold(intensity_list, n_classes=2): density = gaussian_kde(intensity_list) - density.covariance_factor = lambda: 0.25 + density.covariance_factor = lambda: 0.05 density._compute_covariance() # Create a vector of 256 values going from 0 to 256: @@ -64,13 +64,16 @@ def plot_density(all_cell_median_intensity, intensity_threshold, n_classes=2): intensity_threshold = estimate_threshold(all_cell_median_intensity, n_classes) fig, ax = plt.subplots(figsize=(10, 5)) density = gaussian_kde(all_cell_median_intensity) - density.covariance_factor = lambda: 0.25 + density.covariance_factor = lambda: 0.1 density._compute_covariance() - # Create a vector of 256 values going from 0 to 256: + # Create a vector of 256 values going from 0 to 25 xs = np.linspace(0, 255, 256) density_xs_values = density(xs) - ax.plot(xs, density_xs_values, label="Estimated Density") + ax.hist( + all_cell_median_intensity, bins=255, density=True, alpha=0.5, label="Histogram" + ) + ax.plot(xs, density_xs_values, label="Estimated Density", linewidth=3) for values in intensity_threshold: ax.axvline(x=values, color="red", label="Threshold") ax.set_xlabel("Pixel Intensity") diff --git a/notebooks/atp_exploration.ipynb b/notebooks/atp_exploration.ipynb index 0197859..a7f8b2d 100644 --- a/notebooks/atp_exploration.ipynb +++ b/notebooks/atp_exploration.ipynb @@ -18,12 +18,10 @@ "metadata": {}, "outputs": [], "source": [ - "ATP_IMAGE_DF = df[df[\"Staining method\"] == \"ATP 9.4\"]\n", - "ATP_IMAGE_NAME = ATP_IMAGE_DF[\"Number\"].tolist()\n", "IMAGE_INDEX = 189\n", "# show the first image in the list using the image name\n", "from IPython.display import Image\n", - "Image(filename='../data/muscle_atlas/images/' + ATP_IMAGE_NAME[IMAGE_INDEX])" + "Image(filename='../sample_img/sample_atp.jpg')" ] }, { @@ -39,7 +37,7 @@ "except ImportError:\n", " from imageio import imread\n", "\n", - "image_array = imread('../data/muscle_atlas/images/' + ATP_IMAGE_NAME[IMAGE_INDEX])\n", + "image_array = imread('../sample_img/sample_atp.jpg')\n", "model_cellpose = load_cellpose()\n", "mask_cellpose = run_cellpose(image_array, model_cellpose)\n", "plt.imshow(mask_cellpose)" @@ -92,6 +90,19 @@ " all_cell_median_intensity.append(single_cell_median_intensity)\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Histogram plot of the median pixel intensity of all cells\n", + "plt.hist(all_cell_median_intensity, bins=255, density=True, alpha=0.5)\n", + "plt.plot(xs,density(xs))\n", + "plt.xlim(50,220)\n", + "plt.show()" + ] + }, { "cell_type": "code", "execution_count": null, @@ -103,7 +114,7 @@ "# Build a \"density\" function based on the dataset\n", "# When you give a value from the X axis to this function, it returns the according value on the Y axis\n", "density = gaussian_kde(all_cell_median_intensity)\n", - "density.covariance_factor = lambda : .25\n", + "density.covariance_factor = lambda : .05\n", "density._compute_covariance()\n", "\n", "# Create a vector of 256 values going from 0 to 256:\n", @@ -115,10 +126,19 @@ "# Make the chart\n", "# We're actually building a line chart where x values are set all along the axis and y value are\n", "# the corresponding values from the density function\n", + "\n", "plt.plot(xs,density(xs))\n", + "plt.xlim(50,220)\n", "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -179,7 +199,9 @@ "threshold = sorted_peaks[0]+xs[min_index]\n", "print(threshold)\n", "# Plot the data\n", - "plt.plot(xs, density(xs), label='Density')\n", + "plt.hist(all_cell_median_intensity, bins=255, density=True, alpha=0.5, label='Histogram')\n", + "plt.plot(xs,density(xs), label='Density', linewidth=3)\n", + "plt.xlim(50,220)\n", "plt.axvline(threshold, color='r', label='Threshold')\n", "plt.legend()\n", "plt.show()" From 38d991fd67497591731d874d0afede62ec0545a6 Mon Sep 17 00:00:00 2001 From: Corentin <> Date: Wed, 10 May 2023 14:35:16 +0200 Subject: [PATCH 4/5] v0.3.2 fixing erosion bug --- .gitignore | 4 +++- .python-version | 2 +- myoquant/__main__.py | 27 +++++++++++++++++++++++++++ myoquant/src/common_func.py | 6 +++--- pyproject.toml | 2 +- 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index fc4303d..2b2d6b2 100644 --- a/.gitignore +++ b/.gitignore @@ -171,4 +171,6 @@ debug_data/ !binary_mask_sdh.tif data/* *intensity_plot.png -*.idea \ No newline at end of file +*.idea +cellpose.sh +nohup.out diff --git a/.python-version b/.python-version index 54c5196..09dcc78 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.10.9 +3.10.11 diff --git a/myoquant/__main__.py b/myoquant/__main__.py index 2c6d1cf..26bc77f 100644 --- a/myoquant/__main__.py +++ b/myoquant/__main__.py @@ -1,11 +1,27 @@ import typer from rich.console import Console +import pkg_resources + +__version__ = pkg_resources.get_distribution("myoquant").version +__version_cellpose__ = pkg_resources.get_distribution("cellpose").version +__version_stardist__ = pkg_resources.get_distribution("stardist").version +__version_torch__ = pkg_resources.get_distribution("torch").version +__version_tensorflow__ = pkg_resources.get_distribution("tensorflow").version from .commands.docs import app as docs_app from .commands import run_sdh, run_he, run_atp console = Console() + +def version_callback(value: bool): + if value: + print( + f"MyoQuant Version: {__version__} \nCellpose Version: {__version_cellpose__} \nStardist Version: {__version_stardist__} \nTorch Version: {__version_torch__} \nTensorflow Version: {__version_tensorflow__}" + ) + raise typer.Exit() + + app = typer.Typer( name="MyoQuant", add_completion=False, @@ -15,6 +31,17 @@ app.add_typer(docs_app, name="docs", help="Generate documentation") +@app.callback() +def main( + version: bool = typer.Option( + None, "--version", callback=version_callback, is_eager=True + ) +): + """ + MyoQuant Analysis Command Line Interface + """ + + app.registered_commands += ( run_sdh.app.registered_commands + run_he.app.registered_commands diff --git a/myoquant/src/common_func.py b/myoquant/src/common_func.py index 0a6080e..8fedc65 100644 --- a/myoquant/src/common_func.py +++ b/myoquant/src/common_func.py @@ -181,10 +181,10 @@ def extract_single_image(raw_image, df_props, index, erosion=None): surface_area = df_props.iloc[index, 1] cell_radius = math.sqrt(surface_area / math.pi) single_entity_mask = df_props.iloc[index, 9].copy() - erosion_size = cell_radius * ( - erosion / 100 - ) # Erosion in percentage of the cell radius if erosion is not None: + erosion_size = cell_radius * ( + erosion / 100 + ) # Erosion in percentage of the cell radius for i in range(int(erosion_size)): single_entity_mask = binary_erosion( single_entity_mask, out=single_entity_mask diff --git a/pyproject.toml b/pyproject.toml index 17c5ed4..4fa1821 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "myoquant" -version = "0.3.1" +version = "0.3.2" description = "MyoQuant🔬: a tool to automatically quantify pathological features in muscle fiber histology images." authors = ["Corentin Meyer "] maintainers = ["Corentin Meyer "] From 695659e56fa6796297cb043044673a705c56b914 Mon Sep 17 00:00:00 2001 From: Corentin <> Date: Wed, 10 May 2023 14:39:39 +0200 Subject: [PATCH 5/5] documentation --- CLI_Documentation.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CLI_Documentation.md b/CLI_Documentation.md index 48f0147..53301ff 100644 --- a/CLI_Documentation.md +++ b/CLI_Documentation.md @@ -10,6 +10,7 @@ $ myoquant [OPTIONS] COMMAND [ARGS]... **Options**: +- `--version` - `--help`: Show this message and exit. **Commands**: @@ -43,6 +44,12 @@ $ myoquant atp-analysis [OPTIONS] IMAGE_PATH - `--output-path PATH`: The path to the folder to save the results. Will save in the same folder as input image if not specified. - `--intensity-threshold INTEGER RANGE`: Fiber intensity threshold to differenciate between the two fiber types. If not specified, the analysis will try to deduce it. [1<=x<=254] - `--cellpose-diameter INTEGER`: Approximative single cell diameter in pixel for CellPose detection. If not specified, Cellpose will try to deduce it. +- `--channel INTEGER`: Image channel to use for the analysis. If not specified, the analysis will be performed on all three channels. +- `--channel-first / --no-channel-first`: If the channel is the first dimension of the image, set this to True. False by default. [default: no-channel-first] +- `--rescale-exposure / --no-rescale-exposure`: Rescale the image exposure if your image is not in the 0 255 forma, False by default. [default: no-rescale-exposure] +- `--n-classes INTEGER RANGE`: The number of classes of cell to detect. If not specified this is defaulted to two classes. [default: 2; x<=10] +- `--intensity-method TEXT`: The method to use to compute the intensity of the cell. Can be either 'median' or 'mean'. [default: median] +- `--erosion INTEGER RANGE`: Perform an erosion on the cells images to remove signal in the cell membrane (usefull for fluo). Expressed in percentage of the cell radius [default: False; x<=45] - `--export-map / --no-export-map`: Export the original image with cells painted by classification label. [default: export-map] - `--export-stats / --no-export-stats`: Export per fiber and per nuclei stat table. [default: export-stats] - `--help`: Show this message and exit.