From f62b2fc91325370a5c201ab41beb0203aea84aff Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 22:40:29 +0200 Subject: [PATCH 01/10] save voxelsize as explictit parameters rather than np array --- src/napari_stress/_reconstruction/toolbox.py | 16 ++++++---------- .../_utils/import_export_settings.py | 16 ---------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/src/napari_stress/_reconstruction/toolbox.py b/src/napari_stress/_reconstruction/toolbox.py index 53044b5f..4997167b 100644 --- a/src/napari_stress/_reconstruction/toolbox.py +++ b/src/napari_stress/_reconstruction/toolbox.py @@ -78,13 +78,9 @@ def _export_settings(self, file_name: str = None): from .._utils.import_export_settings import export_settings reconstruction_parameters = { - "voxelsize": np.asarray( - [ - self.doubleSpinBox_voxelsize_z.value(), - self.doubleSpinBox_voxelsize_y.value(), - self.doubleSpinBox_voxelsize_x.value(), - ] - ), + "voxelsize_z": self.doubleSpinBox_voxelsize_z.value(), + "voxelsize_y": self.doubleSpinBox_voxelsize_y.value(), + "voxelsize_x": self.doubleSpinBox_voxelsize_x.value(), "target_voxelsize": self.doubleSpinBox_target_voxelsize.value(), "smoothing_sigma": self.doubleSpinBox_gaussian_blur.value(), "n_smoothing_iterations": self.spinBox_n_smoothing.value(), @@ -111,13 +107,13 @@ def _import_settings(self, file_name: str = None): reconstruction_parameters = import_settings(self, file_name=file_name) self.doubleSpinBox_voxelsize_z.setValue( - reconstruction_parameters["voxelsize"][0] + reconstruction_parameters["voxelsize_z"] ) self.doubleSpinBox_voxelsize_y.setValue( - reconstruction_parameters["voxelsize"][1] + reconstruction_parameters["voxelsize_y"] ) self.doubleSpinBox_voxelsize_x.setValue( - reconstruction_parameters["voxelsize"][2] + reconstruction_parameters["voxelsize_x"] ) self.doubleSpinBox_target_voxelsize.setValue( reconstruction_parameters["target_voxelsize"] diff --git a/src/napari_stress/_utils/import_export_settings.py b/src/napari_stress/_utils/import_export_settings.py index b9c1a880..3a889bb3 100644 --- a/src/napari_stress/_utils/import_export_settings.py +++ b/src/napari_stress/_utils/import_export_settings.py @@ -19,13 +19,6 @@ def import_settings(parent=None, file_name: str = None) -> dict: """ from qtpy.QtWidgets import QFileDialog - def ndarray_constructor( - loader: yaml.Loader, node: yaml.Node - ) -> np.ndarray: - return np.array(loader.construct_sequence(node)) - - yaml.add_constructor("tag:yaml.org,2002:ndarray", ndarray_constructor) - if not file_name: file_name, _ = QFileDialog.getOpenFileName( parent, @@ -54,15 +47,6 @@ def export_settings( """ from qtpy.QtWidgets import QFileDialog - def ndarray_representer( - dumper: yaml.Dumper, data: np.ndarray - ) -> yaml.Node: - return dumper.represent_sequence( - "tag:yaml.org,2002:ndarray", data.tolist() - ) - - yaml.add_representer(np.ndarray, ndarray_representer) - if not file_name: file_name, _ = QFileDialog.getSaveFileName( parent, From 5dfa671de2714300b078020682a1477f0a6dd40a Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 22:42:30 +0200 Subject: [PATCH 02/10] Update reconstruction_settings.yaml --- docs/01_code_usage/reconstruction_settings.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/01_code_usage/reconstruction_settings.yaml b/docs/01_code_usage/reconstruction_settings.yaml index 1e2e15ab..cca9156b 100644 --- a/docs/01_code_usage/reconstruction_settings.yaml +++ b/docs/01_code_usage/reconstruction_settings.yaml @@ -11,7 +11,6 @@ sampling_distance: 2.0 smoothing_sigma: 2.0 target_voxelsize: 0.23 trace_length: 80.0 -voxelsize: !!ndarray -- 0.37 -- 0.0901 -- 0.0901 +voxelsize_z: 0.37 +voxelsize_y: 0.0901 +voxelsize_x: 0.0901 From 40b19a775821eeb003321a28b1db8d09b60c42b4 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 22:43:52 +0200 Subject: [PATCH 03/10] Update .pre-commit-config.yaml --- .pre-commit-config.yaml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a575c3d3..3ade7eb6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,22 +1,27 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v4.5.0 hooks: - id: check-docstring-first - id: end-of-file-fixer - id: trailing-whitespace exclude: ^\.napari-hub/.* - id: check-yaml # checks for correct yaml syntax for github actions ex. - exclude: ^docs/04_FAQ/settings_reconstruction_(bulk|surface).yaml$ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.7 + rev: v0.3.4 hooks: - id: ruff - repo: https://github.com/psf/black - rev: 24.4.0 + rev: 24.3.0 hooks: - id: black - repo: https://github.com/tlambert03/napari-plugin-checks rev: v0.3.0 hooks: - id: napari-plugin-checks + # https://mypy.readthedocs.io/en/stable/ + # you may wish to add this as well! + # - repo: https://github.com/pre-commit/mirrors-mypy + # rev: v1.9.0 + # hooks: + # - id: mypy \ No newline at end of file From fc5bb1876e7393775a1ffac54ada0ba91a059d52 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 22:46:43 +0200 Subject: [PATCH 04/10] updated yaml settings --- docs/04_FAQ/settings_reconstruction_bulk.yaml | 7 +++---- docs/04_FAQ/settings_reconstruction_surface.yaml | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/04_FAQ/settings_reconstruction_bulk.yaml b/docs/04_FAQ/settings_reconstruction_bulk.yaml index 08e78d99..716ae2e5 100644 --- a/docs/04_FAQ/settings_reconstruction_bulk.yaml +++ b/docs/04_FAQ/settings_reconstruction_bulk.yaml @@ -12,7 +12,6 @@ smoothing_sigma: 1.0 target_voxelsize: 0.2868 trace_length: 30.0 return_intermediate_results: true -voxelsize: !!ndarray -- 0.47 -- 0.1036 -- 0.1036 +voxelsize_z: 0.47 +voxelsize_y: 0.1036 +voxelsize_x: 0.1036 diff --git a/docs/04_FAQ/settings_reconstruction_surface.yaml b/docs/04_FAQ/settings_reconstruction_surface.yaml index 99585699..c5c28258 100644 --- a/docs/04_FAQ/settings_reconstruction_surface.yaml +++ b/docs/04_FAQ/settings_reconstruction_surface.yaml @@ -12,7 +12,6 @@ smoothing_sigma: 1.0 target_voxelsize: 0.2868 trace_length: 30.0 return_intermediate_results: true -voxelsize: !!ndarray -- 0.47 -- 0.1036 -- 0.1036 +voxelsize_z: 0.47 +voxelsize_y: 0.1036 +voxelsize_x: 0.1036 From bd3a9202485d5e827eedca3bfb29474e518e27d9 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 23:06:27 +0200 Subject: [PATCH 05/10] added conditional napari import for type checking --- src/napari_stress/_approximation/expansion.py | 4 ++++ src/napari_stress/_approximation/expansion_base.py | 2 ++ src/napari_stress/_approximation/expansion_napari.py | 3 +++ src/napari_stress/_measurements/curvature.py | 4 ++++ src/napari_stress/_measurements/geodesics.py | 4 ++++ src/napari_stress/_measurements/intensity.py | 4 +++- src/napari_stress/_measurements/stresses.py | 4 +++- src/napari_stress/_measurements/toolbox.py | 5 ++++- src/napari_stress/_reconstruction/patches.py | 4 +++- src/napari_stress/_reconstruction/reconstruct_surface.py | 5 +++++ src/napari_stress/_reconstruction/refine_surfaces.py | 4 +++- src/napari_stress/_reconstruction/toolbox.py | 4 +++- 12 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/napari_stress/_approximation/expansion.py b/src/napari_stress/_approximation/expansion.py index fe46be13..d0c2b1d6 100644 --- a/src/napari_stress/_approximation/expansion.py +++ b/src/napari_stress/_approximation/expansion.py @@ -1,4 +1,8 @@ import numpy as np +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + import napari from .expansion_base import Expander diff --git a/src/napari_stress/_approximation/expansion_base.py b/src/napari_stress/_approximation/expansion_base.py index 4ff3ca32..8d23479c 100644 --- a/src/napari_stress/_approximation/expansion_base.py +++ b/src/napari_stress/_approximation/expansion_base.py @@ -1,4 +1,6 @@ from abc import ABC, abstractmethod +if TYPE_CHECKING: + import napari class Expander(ABC): diff --git a/src/napari_stress/_approximation/expansion_napari.py b/src/napari_stress/_approximation/expansion_napari.py index ed422028..80d6c5bc 100644 --- a/src/napari_stress/_approximation/expansion_napari.py +++ b/src/napari_stress/_approximation/expansion_napari.py @@ -1,4 +1,7 @@ from napari_tools_menu import register_function +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari from .._utils import frame_by_frame from .expansion import EllipsoidExpander, SphericalHarmonicsExpander diff --git a/src/napari_stress/_measurements/curvature.py b/src/napari_stress/_measurements/curvature.py index acc3f813..e1d46a62 100644 --- a/src/napari_stress/_measurements/curvature.py +++ b/src/napari_stress/_measurements/curvature.py @@ -25,6 +25,10 @@ manifold, ) +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari + @register_function( menu="Measurement > Measure mean curvature on ellipsoid (n-STRESS)" diff --git a/src/napari_stress/_measurements/geodesics.py b/src/napari_stress/_measurements/geodesics.py index 2e42afc0..de7b9a89 100644 --- a/src/napari_stress/_measurements/geodesics.py +++ b/src/napari_stress/_measurements/geodesics.py @@ -6,6 +6,10 @@ from .._utils.frame_by_frame import frame_by_frame +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari + def geodesic_distance_matrix(surface: SurfaceData) -> np.ndarray: """ diff --git a/src/napari_stress/_measurements/intensity.py b/src/napari_stress/_measurements/intensity.py index 340c8998..527b2fac 100644 --- a/src/napari_stress/_measurements/intensity.py +++ b/src/napari_stress/_measurements/intensity.py @@ -4,7 +4,9 @@ from napari_tools_menu import register_function from .._utils.frame_by_frame import frame_by_frame - +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari @register_function( menu="Measurement > Measure intensities on surface (n-STRESS)" diff --git a/src/napari_stress/_measurements/stresses.py b/src/napari_stress/_measurements/stresses.py index e40a3e47..2baa1d15 100644 --- a/src/napari_stress/_measurements/stresses.py +++ b/src/napari_stress/_measurements/stresses.py @@ -1,4 +1,6 @@ -from typing import Tuple +from typing import Tuple, TYPE_CHECKING +if TYPE_CHECKING: + import napari import numpy as np import pandas as pd diff --git a/src/napari_stress/_measurements/toolbox.py b/src/napari_stress/_measurements/toolbox.py index cf5ca222..51289906 100644 --- a/src/napari_stress/_measurements/toolbox.py +++ b/src/napari_stress/_measurements/toolbox.py @@ -1,6 +1,9 @@ import os from pathlib import Path -from typing import List +from typing import List, TYPE_CHECKING + +if TYPE_CHECKING: + import napari import numpy as np from magicgui.widgets import create_widget diff --git a/src/napari_stress/_reconstruction/patches.py b/src/napari_stress/_reconstruction/patches.py index ad32c0c1..4bc199b3 100644 --- a/src/napari_stress/_reconstruction/patches.py +++ b/src/napari_stress/_reconstruction/patches.py @@ -1,4 +1,6 @@ -from typing import Tuple +from typing import Tuple, TYPE_CHECKING +if TYPE_CHECKING: + import napari import numpy as np diff --git a/src/napari_stress/_reconstruction/reconstruct_surface.py b/src/napari_stress/_reconstruction/reconstruct_surface.py index 4fce275e..2ec75b65 100644 --- a/src/napari_stress/_reconstruction/reconstruct_surface.py +++ b/src/napari_stress/_reconstruction/reconstruct_surface.py @@ -3,6 +3,11 @@ from .._utils.frame_by_frame import frame_by_frame +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari + + @register_function( menu="Surfaces > Create surface from lebedev points (n-STRESS)" diff --git a/src/napari_stress/_reconstruction/refine_surfaces.py b/src/napari_stress/_reconstruction/refine_surfaces.py index 0cc26607..3ada971d 100644 --- a/src/napari_stress/_reconstruction/refine_surfaces.py +++ b/src/napari_stress/_reconstruction/refine_surfaces.py @@ -1,5 +1,7 @@ import warnings -from typing import List +from typing import List, TYPE_CHECKING +if TYPE_CHECKING: + import napari import numpy as np import pandas as pd diff --git a/src/napari_stress/_reconstruction/toolbox.py b/src/napari_stress/_reconstruction/toolbox.py index 4997167b..a22468d5 100644 --- a/src/napari_stress/_reconstruction/toolbox.py +++ b/src/napari_stress/_reconstruction/toolbox.py @@ -1,6 +1,8 @@ import os from pathlib import Path -from typing import List +from typing import List, TYPE_CHECKING +if TYPE_CHECKING: + import napari import numpy as np from magicgui.widgets import create_widget From 6e4662f65611c4616e47aa74b69d28d728d26987 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 23:12:57 +0200 Subject: [PATCH 06/10] make precommit happy 1 --- src/napari_stress/_approximation/expansion_base.py | 1 + src/napari_stress/_approximation/fit_ellipsoid.py | 3 +++ src/napari_stress/_measurements/toolbox.py | 8 ++++---- src/napari_stress/_reconstruction/fit_utils.py | 6 ++++-- src/napari_stress/_reconstruction/patches.py | 2 +- src/napari_stress/_reconstruction/toolbox.py | 4 ++-- .../_spherical_harmonics/spherical_harmonics_napari.py | 2 +- 7 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/napari_stress/_approximation/expansion_base.py b/src/napari_stress/_approximation/expansion_base.py index 8d23479c..fca4c019 100644 --- a/src/napari_stress/_approximation/expansion_base.py +++ b/src/napari_stress/_approximation/expansion_base.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from typing import TYPE_CHECKING if TYPE_CHECKING: import napari diff --git a/src/napari_stress/_approximation/fit_ellipsoid.py b/src/napari_stress/_approximation/fit_ellipsoid.py index 409fddb5..96e04264 100644 --- a/src/napari_stress/_approximation/fit_ellipsoid.py +++ b/src/napari_stress/_approximation/fit_ellipsoid.py @@ -2,6 +2,9 @@ import numpy as np from napari.types import PointsData, VectorsData from napari_tools_menu import register_function +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari from .. import __version__ from .._utils.frame_by_frame import frame_by_frame diff --git a/src/napari_stress/_measurements/toolbox.py b/src/napari_stress/_measurements/toolbox.py index 51289906..7592edeb 100644 --- a/src/napari_stress/_measurements/toolbox.py +++ b/src/napari_stress/_measurements/toolbox.py @@ -44,7 +44,7 @@ def __init__(self, napari_viewer): # populate quadrature dropdown: Only specific n_quadrature points # are allowed points_lookup = lebedev_info_SPB.quad_deg_lookUp - for n_points in points_lookup.keys(): + for n_points in points_lookup: self.comboBox_quadpoints.addItem(str(n_points), n_points) # select default value corresponding to current max_degree @@ -131,7 +131,7 @@ def _check_minimal_point_number(self) -> None: max_degree = self.spinBox_max_degree.value() lookup = lebedev_info_SPB.pts_of_lbdv_lookup for degree in range(max_degree, list(lookup.keys())[-1] + 1): - if degree in lookup.keys(): + if degree in lookup: minimal_point_number = lookup.get(degree) break @@ -252,7 +252,7 @@ def _export(self, results_stress_analysis): n_frames=self.n_frames, ) - for fig in figures_dict.keys(): + for fig in figures_dict: figure = figures_dict[fig] figure["figure"].tight_layout() figure["figure"].savefig( @@ -260,7 +260,7 @@ def _export(self, results_stress_analysis): ) # Export pointclouds - for i, layer in enumerate(results_stress_analysis): + for layer in results_stress_analysis: if layer[2] == "points": export_layer = napari.layers.Layer.create(*layer) napari.save_layers( diff --git a/src/napari_stress/_reconstruction/fit_utils.py b/src/napari_stress/_reconstruction/fit_utils.py index adaf0100..87b0ad1c 100644 --- a/src/napari_stress/_reconstruction/fit_utils.py +++ b/src/napari_stress/_reconstruction/fit_utils.py @@ -1,6 +1,8 @@ import inspect from enum import Enum -from typing import List +from typing import List, TYPE_CHECKING +if TYPE_CHECKING: + import napari import numpy as np import pandas as pd @@ -221,7 +223,7 @@ def _fancy_edge_fit( parameter_error = np.sqrt(np.diag(_covariance)) # If fit fails, replace bad values with NaN - except Exception: + except (RuntimeError, ValueError): optimal_fit_parameters = np.repeat(np.nan, len(params)) parameter_error = np.repeat(np.nan, len(params)) diff --git a/src/napari_stress/_reconstruction/patches.py b/src/napari_stress/_reconstruction/patches.py index 4bc199b3..268cbd2a 100644 --- a/src/napari_stress/_reconstruction/patches.py +++ b/src/napari_stress/_reconstruction/patches.py @@ -474,7 +474,7 @@ def iterative_curvature_adaptive_patch_fitting( point_cloud, minimum_permitted_range=minimum_search_radius ) - for it in range(n_iterations): + for _ in range(n_iterations): neighbor_indices = _find_neighbor_indices(point_cloud, search_radii) mean_curvatures = [np.nan] * len(point_cloud) principal_curvatures = [np.nan] * len(point_cloud) diff --git a/src/napari_stress/_reconstruction/toolbox.py b/src/napari_stress/_reconstruction/toolbox.py index a22468d5..47b08779 100644 --- a/src/napari_stress/_reconstruction/toolbox.py +++ b/src/napari_stress/_reconstruction/toolbox.py @@ -70,7 +70,7 @@ def _set_scales(self): # set target voxel size to mean of scales as default mean_scale = np.mean([scales[0], scales[2]]) self.doubleSpinBox_target_voxelsize.setValue(mean_scale) - except Exception: + except Exception as e: pass def _export_settings(self, file_name: str = None): @@ -322,7 +322,7 @@ def reconstruct_droplet( points = copy.deepcopy(points_first_guess) # repeat tracing `n_tracing_iterations` times - for i in range(n_tracing_iterations): + for _ in range(n_tracing_iterations): resampled_points = resample_pointcloud( points, sampling_length=resampling_length ) diff --git a/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py b/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py index 460861bc..52342c6b 100644 --- a/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py +++ b/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py @@ -107,7 +107,7 @@ def perform_lebedev_quadrature( """ metadata = points.metadata - if "spherical_harmonics_coefficients" not in metadata.keys(): + if "spherical_harmonics_coefficients" not in metadata: raise ValueError( "Missing spherical harmonics coefficients. " + "Use spherical harmonics expansion first" From 8b80185fc9fe0926401322612819a37166cbd795 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 23:18:25 +0200 Subject: [PATCH 07/10] fixed key dict check --- .../_utils/_aggregate_measurements.py | 31 ++++++++++--------- src/napari_stress/_utils/frame_by_frame.py | 24 +++++++------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/napari_stress/_utils/_aggregate_measurements.py b/src/napari_stress/_utils/_aggregate_measurements.py index 2a806c42..26111de4 100644 --- a/src/napari_stress/_utils/_aggregate_measurements.py +++ b/src/napari_stress/_utils/_aggregate_measurements.py @@ -1,4 +1,7 @@ -from typing import List +from typing import List, TYPE_CHECKING + +if TYPE_CHECKING: + import napari import numpy as np import pandas as pd @@ -129,10 +132,10 @@ def find_metadata_in_layers(layers: list, name: str) -> "napari.layers.Layer": import pandas as pd for layer in layers: - if "metadata" in layer[1].keys(): - if name in layer[1]["metadata"].keys(): + if "metadata" in layer[1]: + if name in layer[1]["metadata"]: return pd.DataFrame(layer[1]["metadata"]) - if "features" in layer[1].keys(): + if "features" in layer[1]: if name in pd.DataFrame(layer[1]["features"]).columns: return pd.DataFrame(layer[1]["features"]) @@ -213,7 +216,7 @@ def flatten_dictionary(input_dict, parent_key_prefix="", separator="_"): _metadata = [ layer[1]["metadata"] for layer in results_stress_analysis - if "metadata" in layer[1].keys() + if "metadata" in layer[1] ] _metadata = [flatten_dictionary(d) for d in _metadata] df_over_time = pd.concat([pd.DataFrame(x) for x in _metadata], axis=1) @@ -228,13 +231,13 @@ def flatten_dictionary(input_dict, parent_key_prefix="", separator="_"): # Find layer with stress_tissue in features for layer in results_stress_analysis: - if "features" not in layer[1].keys(): + if "features" not in layer[1]: continue - if _METADATAKEY_STRESS_TOTAL in layer[1]["features"].keys(): + if _METADATAKEY_STRESS_TOTAL in layer[1]["features"]: df_total_stress = pd.DataFrame(layer[1]["features"]) df_total_stress["time"] = layer[0][:, 0] * time_step - if _METADATAKEY_STRESS_TISSUE in layer[1]["features"].keys(): + if _METADATAKEY_STRESS_TISSUE in layer[1]["features"]: df_tissue_stress = pd.DataFrame(layer[1]["features"]) df_tissue_stress["time"] = layer[0][:, 0] * time_step @@ -305,11 +308,11 @@ def aggregate_extrema_results( # Find layer with NEAREST EXTREMA data for layer in results_stress_analysis: - if "metadata" not in layer[1].keys(): + if "metadata" not in layer[1]: continue if ( _METADATAKEY_STRESS_CELL_NEAREST_PAIR_ANISO - in layer[1]["metadata"].keys() + in layer[1]["metadata"] ): break @@ -358,11 +361,11 @@ def aggregate_extrema_results( # Find layer with ALL PAIR EXTREMA data for layer in results_stress_analysis: - if "metadata" not in layer[1].keys(): + if "metadata" not in layer[1]: continue if ( _METADATAKEY_STRESS_CELL_ALL_PAIR_ANISO - in layer[1]["metadata"].keys() + in layer[1]["metadata"] ): break @@ -447,9 +450,9 @@ def aggregate_spatial_autocorrelations_results( # Find layer with SPATIAL AUTOCORRELATIONS for layer in results_stress_analysis: - if "metadata" not in layer[1].keys(): + if "metadata" not in layer[1]: continue - if _METADATAKEY_AUTOCORR_SPATIAL_CELL in layer[1]["metadata"].keys(): + if _METADATAKEY_AUTOCORR_SPATIAL_CELL in layer[1]["metadata"]: break # TOTAL STRESS diff --git a/src/napari_stress/_utils/frame_by_frame.py b/src/napari_stress/_utils/frame_by_frame.py index 5defaba7..122c8cfd 100644 --- a/src/napari_stress/_utils/frame_by_frame.py +++ b/src/napari_stress/_utils/frame_by_frame.py @@ -51,7 +51,7 @@ def frame_by_frame(function: callable, progress_bar: bool = False): def wrapper(*args, **kwargs): sig = inspect.signature(function) annotations = [ - sig.parameters[key].annotation for key in sig.parameters.keys() + sig.parameters[key].annotation for key in sig.parameters ] converter = TimelapseConverter() @@ -61,7 +61,7 @@ def wrapper(*args, **kwargs): # Inspect arguments and check if `use_dask` is passed as keyword argument use_dask = False - if "use_dask" in kwargs.keys(): + if "use_dask" in kwargs: use_dask = kwargs["use_dask"] del kwargs["use_dask"] @@ -205,7 +205,7 @@ def data_to_list_of_data(self, data, layertype: type) -> list: """ if layertype not in list( - self.data_to_list_conversion_functions.keys() + self.data_to_list_conversion_functions ): raise TypeError( f"{layertype} data to list conversion currently not supported." @@ -292,7 +292,7 @@ def _ldtuple_to_list_of_ldtuple(self, tuple_data: list) -> LayerDataTuple: else: # unstack features - if "features" in tuple_data[1].keys(): + if "features" in tuple_data[1]: # group features by time-stamp features = tuple_data[1]["features"] list_of_features = [ @@ -303,7 +303,7 @@ def _ldtuple_to_list_of_ldtuple(self, tuple_data: list) -> LayerDataTuple: list_of_features = [None] * len(list_of_data) # unstack metadata - if "metadata" in tuple_data[1].keys(): + if "metadata" in tuple_data[1]: metadata = tuple_data[1]["metadata"] list_of_metadata = [ {key: value[i] for key, value in metadata.items()} @@ -360,19 +360,19 @@ def _list_of_ldtuple_to_layerdatatuple( # If data was only 3D _properties = {} if len(tuple_data) == 1: - if "features" in properties[0].keys(): + if "features" in properties[0]: _properties["features"] = tuple_data[0][1]["features"] _properties["features"]["frame"] = np.zeros( len(tuple_data[0][0]), dtype=int ) [frame.pop("features") for frame in properties] - if "metadata" in properties[0].keys(): + if "metadata" in properties[0]: _properties["metadata"] = tuple_data[0][1]["metadata"] _properties["metadata"]["frame"] = [0] [frame.pop("metadata") for frame in properties] else: # Stack features - if "features" in properties[0].keys(): + if "features" in properties[0]: # concatenate features and add time column features = self._list_of_dataframes_to_dataframe( [pd.DataFrame(frame["features"]) for frame in properties] @@ -387,10 +387,10 @@ def _list_of_ldtuple_to_layerdatatuple( [frame.pop("features") for frame in properties] # Stack metadata - if "metadata" in properties[0].keys(): + if "metadata" in properties[0]: metadata_list = [frame["metadata"] for frame in properties] new_metadata = {} - for key in metadata_list[0].keys(): + for key in metadata_list[0]: new_metadata[key] = [frame[key] for frame in metadata_list] new_metadata["frame"] = [t for t in range(len(metadata_list))] @@ -401,10 +401,10 @@ def _list_of_ldtuple_to_layerdatatuple( layer_props = self._list_of_dictionaries_to_dictionary(properties) # exclude 'scale' from stacked metadata - if "scale" in layer_props.keys() and len(tuple_data) != 1: + if "scale" in layer_props and len(tuple_data) != 1: layer_props["scale"] = properties[0]["scale"] - for key in layer_props.keys(): + for key in layer_props: _properties[key] = layer_props[key] result = [None] * 3 From a2cff8bc0a9f9ed05d8a8e4c6b75b4f30bb62479 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 23:21:37 +0200 Subject: [PATCH 08/10] make precommit happy 2 --- src/napari_stress/_utils/frame_by_frame.py | 2 +- src/napari_stress/_vectors.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/napari_stress/_utils/frame_by_frame.py b/src/napari_stress/_utils/frame_by_frame.py index 122c8cfd..4a368243 100644 --- a/src/napari_stress/_utils/frame_by_frame.py +++ b/src/napari_stress/_utils/frame_by_frame.py @@ -438,7 +438,7 @@ def _dataframes_to_list_of_dataframes( def _list_of_dictionaries_to_dictionary(self, dictionaries: list) -> dict: _dictionary = {} - for key in dictionaries[-1].keys(): + for key in dictionaries[-1]: if isinstance(dictionaries[-1][key], dict): _dictionary[key] = self._list_of_dictionaries_to_dictionary( [frame[key] for frame in dictionaries] diff --git a/src/napari_stress/_vectors.py b/src/napari_stress/_vectors.py index 5c18c080..7d3c262d 100644 --- a/src/napari_stress/_vectors.py +++ b/src/napari_stress/_vectors.py @@ -1,4 +1,7 @@ -from typing import Annotated +from typing import Annotated, TYPE_CHECKING + +if TYPE_CHECKING: + import napari import numpy as np from napari_tools_menu import register_function From 7928f908b8190705de18dcade39291b46f43d6a8 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Mon, 26 May 2025 23:34:10 +0200 Subject: [PATCH 09/10] make precommit happy 3 --- .../spherical_harmonics_napari.py | 2 +- .../_stress/euclidian_k_form_SPB.py | 6 ++---- src/napari_stress/_stress/manifold_SPB.py | 20 +++++++------------ .../_tests/test_approximation.py | 6 +++--- src/napari_stress/_tests/test_types.py | 2 +- src/napari_stress/_tests/test_utils.py | 6 +++++- .../_utils/_aggregate_measurements.py | 10 ++++------ 7 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py b/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py index 52342c6b..7619df85 100644 --- a/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py +++ b/src/napari_stress/_spherical_harmonics/spherical_harmonics_napari.py @@ -110,7 +110,7 @@ def perform_lebedev_quadrature( if "spherical_harmonics_coefficients" not in metadata: raise ValueError( "Missing spherical harmonics coefficients. " - + "Use spherical harmonics expansion first" + "Use spherical harmonics expansion first" ) max_degree = metadata["spherical_harmonics_coefficients"].shape[-1] - 1 diff --git a/src/napari_stress/_stress/euclidian_k_form_SPB.py b/src/napari_stress/_stress/euclidian_k_form_SPB.py index 339e3465..bd1b226f 100644 --- a/src/napari_stress/_stress/euclidian_k_form_SPB.py +++ b/src/napari_stress/_stress/euclidian_k_form_SPB.py @@ -2042,14 +2042,12 @@ def Divergence_1_Form(self, lbdv, debug_mode=False): if debug_mode is True: print( - "\n" - + "All_A_inv_successful = " + "\nAll_A_inv_successful = " + str(All_A_inv_successful) ) print( "All_B_inv_successful = " - + str(All_B_inv_successful) - + "\n" + + str(All_B_inv_successful) + "\n" ) return Debug_Dict else: diff --git a/src/napari_stress/_stress/manifold_SPB.py b/src/napari_stress/_stress/manifold_SPB.py index 05024d79..39878080 100644 --- a/src/napari_stress/_stress/manifold_SPB.py +++ b/src/napari_stress/_stress/manifold_SPB.py @@ -111,11 +111,9 @@ def Non_Radial_Manifold_X_Def(theta, phi, r_0, Manny_Name): ) else: print( - "\n" - + "ERROR: NON-radial Manifold Name: " + + "\nERROR: NON-radial Manifold Name: " + str(Manny_Name) - + ", (X-Coor) Not Recognized" - + "\n" + + ", (X-Coor) Not Recognized\n" ) @@ -173,11 +171,9 @@ def Non_Radial_Manifold_Y_Def(theta, phi, r_0, Manny_Name): ) else: print( - "\n" - + "ERROR: NON-radial Manifold Name: " + + "\nERROR: NON-radial Manifold Name: " + str(Manny_Name) - + ", (Y-Coor) Not Recognized" - + "\n" + + ", (Y-Coor) Not Recognized\n" ) @@ -239,11 +235,9 @@ def Non_Radial_Manifold_Z_Def(theta, phi, r_0, Manny_Name): ) else: print( - "\n" - + "ERROR: NON-radial Manifold Name: " + + "\nERROR: NON-radial Manifold Name: " + str(Manny_Name) - + ", (Z-Coor) Not Recognized" - + "\n" + + ", (Z-Coor) Not Recognized\n" ) @@ -664,7 +658,7 @@ class manifold: Use Manifold name to automatically load/pickle manny inv mats: Format: Maniold_Official_Name = Man_Shape_Name+"R_0_"+R_0_str+"_Pdeg_"+str(deg_basis)+"_Q"+str(num_quad_pts) - Filename "Manny_Inv_Mats_" + + Filename "Manny_Inv_Mats_" Maniold_Official_Name + ".p", goes in 'Pickled_Manny_Inv_Mat_Files' sub-directory Man_Shape_Name = "S2", "Chew_Toy", "Gen_R0_Pill", "Dog_Shit", etc R_0_str = "0pt3", "0pt0" for example. diff --git a/src/napari_stress/_tests/test_approximation.py b/src/napari_stress/_tests/test_approximation.py index 2128d07d..e2344639 100644 --- a/src/napari_stress/_tests/test_approximation.py +++ b/src/napari_stress/_tests/test_approximation.py @@ -143,6 +143,6 @@ def test_curvature_and_normals(generate_pointclouds, make_napari_viewer): viewer.add_points(fitted_points) viewer.add_vectors(ellipsoid) results = measurements.curvature_on_ellipsoid(ellipsoid, fitted_points) - assert types._METADATAKEY_H_E123_ELLIPSOID in results[1]["metadata"].keys() - assert types._METADATAKEY_H0_ELLIPSOID in results[1]["metadata"].keys() - assert types._METADATAKEY_MEAN_CURVATURE in results[1]["features"].keys() + assert types._METADATAKEY_H_E123_ELLIPSOID in results[1]["metadata"] + assert types._METADATAKEY_H0_ELLIPSOID in results[1]["metadata"] + assert types._METADATAKEY_MEAN_CURVATURE in results[1]["features"] diff --git a/src/napari_stress/_tests/test_types.py b/src/napari_stress/_tests/test_types.py index 80243b78..38deb86c 100644 --- a/src/napari_stress/_tests/test_types.py +++ b/src/napari_stress/_tests/test_types.py @@ -45,5 +45,5 @@ def test_function(argument: manifold) -> manifold: viewer.window.add_dock_widget(widget) results = widget(viewer.layers[-1]) - assert _METADATAKEY_MEAN_CURVATURE in viewer.layers[-1].features.keys() + assert _METADATAKEY_MEAN_CURVATURE in viewer.layers[-1].features assert isinstance(results, tuple) diff --git a/src/napari_stress/_tests/test_utils.py b/src/napari_stress/_tests/test_utils.py index b3ffeb60..6b03b1e4 100644 --- a/src/napari_stress/_tests/test_utils.py +++ b/src/napari_stress/_tests/test_utils.py @@ -9,6 +9,10 @@ VectorsData, ) +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari + def test_fit_functions(): from napari_stress._reconstruction.fit_utils import ( @@ -91,7 +95,7 @@ def test_decorator_points_layerdatatuple(): ) assert np.array_equal(ldtuple_3d[0], list_of_ldtuples[0][0]) - assert "data1" in ldtuple_4d[1]["metadata"].keys() + assert "data1" in ldtuple_4d[1]["metadata"] assert ldtuple_4d[0][-1, 0] == 9 list_of_ldtuples_conv = Converter.data_to_list_of_data( diff --git a/src/napari_stress/_utils/_aggregate_measurements.py b/src/napari_stress/_utils/_aggregate_measurements.py index 26111de4..8f524c07 100644 --- a/src/napari_stress/_utils/_aggregate_measurements.py +++ b/src/napari_stress/_utils/_aggregate_measurements.py @@ -132,12 +132,10 @@ def find_metadata_in_layers(layers: list, name: str) -> "napari.layers.Layer": import pandas as pd for layer in layers: - if "metadata" in layer[1]: - if name in layer[1]["metadata"]: - return pd.DataFrame(layer[1]["metadata"]) - if "features" in layer[1]: - if name in pd.DataFrame(layer[1]["features"]).columns: - return pd.DataFrame(layer[1]["features"]) + if "metadata" in layer[1] and name in layer[1]["metadata"]: + return pd.DataFrame(layer[1]["metadata"]) + if "features" in layer[1] and name in pd.DataFrame(layer[1]["features"]).columns: + return pd.DataFrame(layer[1]["features"]) def aggregate_ellipsoid_contribution_matrix( From d1f81ac454038146c5e46a07ed9b3adc59c6e1f0 Mon Sep 17 00:00:00 2001 From: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com> Date: Tue, 27 May 2025 00:17:13 +0200 Subject: [PATCH 10/10] make precommit happy 4 --- src/napari_stress/_stress/lebedev_info_SPB.py | 22 +++++++++---------- src/napari_stress/_tests/test_measurements.py | 10 --------- src/napari_stress/_utils/_utils.py | 3 +++ src/napari_stress/_utils/frame_by_frame.py | 2 +- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/napari_stress/_stress/lebedev_info_SPB.py b/src/napari_stress/_stress/lebedev_info_SPB.py index 40525b77..81696d2a 100644 --- a/src/napari_stress/_stress/lebedev_info_SPB.py +++ b/src/napari_stress/_stress/lebedev_info_SPB.py @@ -638,18 +638,16 @@ def __init__( -1 * np.cos(theta_bar_pt_rot) * np.sin(phi_bar_pt_rot) ) - if abs(x_pt - x_pt_rot) < 1e-7: - if abs(y_pt - y_pt_rot) < 1e-7: - if abs(z_pt - z_pt_rot) < 1e-7: - if rot_pt_found is False: - rot_pt_found = True - - self.Rot_Lbdv_Quad_vals[quad_pt] = ( - quad_pt_rot - ) - self.Inv_Rot_Lbdv_Quad_vals[ - quad_pt_rot - ] = quad_pt + if all(abs(pt - pt_rot) < 1e-7 for pt, pt_rot in zip((x_pt, y_pt, z_pt), (x_pt_rot, y_pt_rot, z_pt_rot))): + if rot_pt_found is False: + rot_pt_found = True + + self.Rot_Lbdv_Quad_vals[quad_pt] = ( + quad_pt_rot + ) + self.Inv_Rot_Lbdv_Quad_vals[ + quad_pt_rot + ] = quad_pt if rot_pt_found is False: print("!!ROTATED QUAD PT NOT FOUND!!") diff --git a/src/napari_stress/_tests/test_measurements.py b/src/napari_stress/_tests/test_measurements.py index daa27312..fa861c4f 100644 --- a/src/napari_stress/_tests/test_measurements.py +++ b/src/napari_stress/_tests/test_measurements.py @@ -1,8 +1,6 @@ import numpy as np import os import shutil -from pathlib import Path -import pandas as pd import vedo from napari_stress import ( measurements, @@ -11,11 +9,6 @@ approximation, get_droplet_point_cloud, get_droplet_point_cloud_4d, - create_manifold, - lebedev_quadrature, -) -from napari_stress._spherical_harmonics.spherical_harmonics import ( - stress_spherical_harmonics_expansion, ) def cartesian_to_spherical(cartesian_coords): @@ -331,6 +324,3 @@ def test_temporal_autocorrelation(): measurements.temporal_autocorrelation(df, feature="feature") ) assert np.all(gradient < 0) - -if __name__ == "__main__": - test_autocorrelation() \ No newline at end of file diff --git a/src/napari_stress/_utils/_utils.py b/src/napari_stress/_utils/_utils.py index d6145926..fe7c597b 100644 --- a/src/napari_stress/_utils/_utils.py +++ b/src/napari_stress/_utils/_utils.py @@ -1,4 +1,7 @@ import numpy as np +from typing import TYPE_CHECKING +if TYPE_CHECKING: + import napari def sanitize_faces(surface: "napari.types.SurfaceData") -> "napari.types.SurfaceData": """ diff --git a/src/napari_stress/_utils/frame_by_frame.py b/src/napari_stress/_utils/frame_by_frame.py index 4a368243..d38b0e17 100644 --- a/src/napari_stress/_utils/frame_by_frame.py +++ b/src/napari_stress/_utils/frame_by_frame.py @@ -334,7 +334,7 @@ def _list_of_multiple_ldtuples_to_multiple_ldt_tuples( # Convert data to array with dimensions [frame, results, data] converted_tuples = [] - for idx, res_type in enumerate(layertypes): + for idx in range(len(layertypes)): tuples_to_convert = [td[idx] for td in tuple_data] converted_tuples.append( self._list_of_ldtuple_to_layerdatatuple(