From 16378f21c14dfaae6b500d542bc29285bd4a5bb3 Mon Sep 17 00:00:00 2001 From: 15bonte Date: Mon, 6 Jul 2026 16:01:22 +0200 Subject: [PATCH 1/2] Parameters must be required and not optional --- .../extract_images_from_cell_counter.py | 4 ++- .../generate_semi_images.py | 4 ++- playground/mid_body_detection.py | 2 ++ playground/mitosis_track_generation.py | 3 ++- playground/mt_cut_detection.py | 4 ++- playground/napari_layer.py | 4 ++- playground/results_saving.py | 2 ++ .../test_micro_tubules_cut_detection.py | 2 ++ .../_tests/test_mid_body_detection.py | 4 +++ .../_tests/test_results_saving.py | 2 ++ .../_tests/test_track_generation.py | 2 ++ src/cut_detector/_widget.py | 26 ++++++++++++------- .../factories/mt_cut_detection_factory.py | 2 +- .../factories/results_saving_factory.py | 2 +- .../widget_functions/mid_body_detection.py | 6 ++--- .../mitosis_track_generation.py | 6 ++--- .../widget_functions/mt_cut_detection.py | 6 ++--- .../widget_functions/save_results.py | 6 ++--- 18 files changed, 59 insertions(+), 28 deletions(-) diff --git a/developers/ground_truth_generation/bridges/extract_images_from_cell_counter.py b/developers/ground_truth_generation/bridges/extract_images_from_cell_counter.py index 510a801..790ec19 100644 --- a/developers/ground_truth_generation/bridges/extract_images_from_cell_counter.py +++ b/developers/ground_truth_generation/bridges/extract_images_from_cell_counter.py @@ -1,6 +1,7 @@ import os import xmltodict from bigfish import stack +from cut_detector.utils.parameters import Parameters from munch import Munch from cnn_framework.utils.tools import save_tiff @@ -29,7 +30,8 @@ def extract_bridge_images( save_dir : str Path to the folder where to save the images. """ - margin = MtCutDetectionFactory().margin + params = Parameters() + margin = MtCutDetectionFactory(params).margin # Create save_dir if not exists if not os.path.exists(save_dir): diff --git a/developers/ground_truth_generation/bridges/semi_images_generation/generate_semi_images.py b/developers/ground_truth_generation/bridges/semi_images_generation/generate_semi_images.py index a318135..509084b 100644 --- a/developers/ground_truth_generation/bridges/semi_images_generation/generate_semi_images.py +++ b/developers/ground_truth_generation/bridges/semi_images_generation/generate_semi_images.py @@ -6,6 +6,7 @@ from cnn_framework.utils.readers.tiff_reader import TiffReader +from cut_detector.utils.parameters import Parameters from developers.ground_truth_generation.bridges.semi_images_generation.micro_tubules_augmentations_advanced import ( MicroTubulesAugmentationAdvanced, ) @@ -22,7 +23,8 @@ def main(params, save_dir, debug_plot, circle_radius=11, diff_radius=4.54): - factory = MtCutDetectionFactoryAdvanced() + params = Parameters() + factory = MtCutDetectionFactoryAdvanced(params) file_paths = os.listdir(params.data_dir) # Create the save directory if it does not exist diff --git a/playground/mid_body_detection.py b/playground/mid_body_detection.py index 33b5ebb..dadccbf 100644 --- a/playground/mid_body_detection.py +++ b/playground/mid_body_detection.py @@ -7,6 +7,7 @@ from cnn_framework.utils.readers.tiff_reader import TiffReader from cut_detector.data.tools import get_data_path +from cut_detector.utils.parameters import Parameters from cut_detector.utils.tools import re_organize_channels from cut_detector.widget_functions.mid_body_detection import ( perform_mid_body_detection, @@ -48,6 +49,7 @@ def main( video_name, mitoses_path, tracks_path, + Parameters(), save=save, movies_save_dir=movies_save_dir, ) diff --git a/playground/mitosis_track_generation.py b/playground/mitosis_track_generation.py index 1ebd224..93678d6 100644 --- a/playground/mitosis_track_generation.py +++ b/playground/mitosis_track_generation.py @@ -10,6 +10,7 @@ from cut_detector.utils.cell_spot import CellSpot from cut_detector.utils.cell_track import CellTrack from cut_detector.utils.mitosis_track import MitosisTrack +from cut_detector.utils.parameters import Parameters from cut_detector.utils.tools import re_organize_channels from cut_detector.widget_functions.mitosis_track_generation import ( perform_mitosis_track_generation, @@ -155,7 +156,7 @@ def main( image = re_organize_channels(image.squeeze()) # TYXC mitosis_tracks, cell_spots, cell_tracks = perform_mitosis_track_generation( - image, video_name, spots_dir, tracks_dir + image, video_name, spots_dir, tracks_dir, Parameters() ) plot_predictions_evolution(cell_spots, cell_tracks, mitosis_tracks) diff --git a/playground/mt_cut_detection.py b/playground/mt_cut_detection.py index 13953ef..66fa8df 100644 --- a/playground/mt_cut_detection.py +++ b/playground/mt_cut_detection.py @@ -13,6 +13,7 @@ MtCutDetectionFactory, ) from cut_detector.utils.mitosis_track import MitosisTrack +from cut_detector.utils.parameters import Parameters from cut_detector.utils.tools import re_organize_channels @@ -57,7 +58,8 @@ def main( image = re_organize_channels(image.squeeze()) # TYXC - factory = MtCutDetectionFactory() + params = Parameters() + factory = MtCutDetectionFactory(params) results = factory.update_mt_cut_detection( [mitosis_track], diff --git a/playground/napari_layer.py b/playground/napari_layer.py index 2fd3d42..51c8090 100644 --- a/playground/napari_layer.py +++ b/playground/napari_layer.py @@ -8,6 +8,7 @@ from cut_detector.factories.results_saving_factory import ResultsSavingFactory from cut_detector.utils.cell_track import CellTrack from cut_detector.utils.mitosis_track import MitosisTrack +from cut_detector.utils.parameters import Parameters def main( @@ -60,7 +61,8 @@ def main( mitosis_track = MitosisTrack.load(f) mitosis_tracks.append(mitosis_track) - ResultsSavingFactory().generate_napari_tracking_mask( + params = Parameters() + ResultsSavingFactory(params).generate_napari_tracking_mask( mitosis_tracks, video, viewer, diff --git a/playground/results_saving.py b/playground/results_saving.py index 33c34b0..f3e7fe4 100644 --- a/playground/results_saving.py +++ b/playground/results_saving.py @@ -6,6 +6,7 @@ from cnn_framework.utils.readers.tiff_reader import TiffReader from cut_detector.data.tools import get_data_path +from cut_detector.utils.parameters import Parameters from cut_detector.utils.tools import re_organize_channels from cut_detector.widget_functions.save_results import perform_results_saving @@ -33,6 +34,7 @@ def main( perform_results_saving( mitosis_path, + Parameters(), show=False, save_dir=results_dir, verbose=True, diff --git a/src/cut_detector/_tests/test_micro_tubules_cut_detection.py b/src/cut_detector/_tests/test_micro_tubules_cut_detection.py index 15d7ceb..eac6c2a 100644 --- a/src/cut_detector/_tests/test_micro_tubules_cut_detection.py +++ b/src/cut_detector/_tests/test_micro_tubules_cut_detection.py @@ -3,6 +3,7 @@ from cut_detector._widget import micro_tubules_cut_detection from cut_detector.data.tools import get_data_path +from cut_detector.utils.parameters import Parameters from cut_detector.widget_functions.mt_cut_detection import ( perform_mt_cut_detection, ) @@ -25,6 +26,7 @@ def test_micro_tubules_cut_detection(): video, "example_video", get_data_path("mitoses"), + Parameters(), save=False, ) diff --git a/src/cut_detector/_tests/test_mid_body_detection.py b/src/cut_detector/_tests/test_mid_body_detection.py index 4b401ad..9c42ccd 100644 --- a/src/cut_detector/_tests/test_mid_body_detection.py +++ b/src/cut_detector/_tests/test_mid_body_detection.py @@ -3,6 +3,7 @@ from cut_detector._widget import mid_body_detection from cut_detector.data.tools import get_data_path +from cut_detector.utils.parameters import Parameters from cut_detector.widget_functions.mid_body_detection import ( perform_mid_body_detection, ) @@ -25,6 +26,7 @@ def test_mid_body_detection(): "example_video", get_data_path("mitoses"), get_data_path("tracks"), + params=Parameters(), save=False, parallel_detection=True, ) @@ -40,6 +42,7 @@ def test_mid_body_detection(): "example_video", get_data_path("mitoses"), get_data_path("tracks"), + params=Parameters(), save=False, parallel_detection=False, ) @@ -48,6 +51,7 @@ def test_mid_body_detection(): "example_video", get_data_path("mitoses"), get_data_path("tracks"), + params=Parameters(), save=False, parallel_detection=False, detection_method="h_maxima", diff --git a/src/cut_detector/_tests/test_results_saving.py b/src/cut_detector/_tests/test_results_saving.py index 6bfa411..df09976 100644 --- a/src/cut_detector/_tests/test_results_saving.py +++ b/src/cut_detector/_tests/test_results_saving.py @@ -3,6 +3,7 @@ from cut_detector._widget import results_saving from cut_detector.data.tools import get_data_path +from cut_detector.utils.parameters import Parameters from cut_detector.widget_functions.save_results import perform_results_saving @@ -19,6 +20,7 @@ def test_results_saving(): perform_results_saving( get_data_path("mitoses"), + Parameters(), show=False, save_dir=get_data_path("results"), verbose=True, diff --git a/src/cut_detector/_tests/test_track_generation.py b/src/cut_detector/_tests/test_track_generation.py index ac794f0..6131265 100644 --- a/src/cut_detector/_tests/test_track_generation.py +++ b/src/cut_detector/_tests/test_track_generation.py @@ -3,6 +3,7 @@ from cut_detector._widget import mitosis_track_generation from cut_detector.data.tools import get_data_path +from cut_detector.utils.parameters import Parameters from cut_detector.widget_functions.mitosis_track_generation import ( perform_mitosis_track_generation, ) @@ -27,6 +28,7 @@ def test_track_generation(): "example_video", get_data_path("spots"), get_data_path("tracks"), + Parameters(), save=False, ) diff --git a/src/cut_detector/_widget.py b/src/cut_detector/_widget.py index 27a32e4..702874a 100644 --- a/src/cut_detector/_widget.py +++ b/src/cut_detector/_widget.py @@ -92,20 +92,20 @@ def video_whole_process( video_name, spots_dir_name, tracks_dir_name, + params, mitoses_dir_name, - params=params, ) perform_mid_body_detection( video, video_name, mitoses_dir_name, tracks_dir_name, + params, movies_save_dir if save_check_box else None, parallel_detection=True, - params=params, ) perform_mt_cut_detection( - video, video_name, mitoses_dir_name, params=params + video, video_name, mitoses_dir_name, params ) save_galleries(video, video_name, mitoses_dir_name, results_save_dir) @@ -147,6 +147,11 @@ def video_whole_process( text="Display segmentation and tracking", value=False, ), + pixel_size=dict( + widget_type="SpinBox", + label="Pixel size (nm): ", + value=225, # Default value + ), ) def whole_process( img_layer: "napari.layers.Image", @@ -158,11 +163,12 @@ def whole_process( results_save_dir: str, debug_mode_check_box: bool, display_check_box: bool, + pixel_size: float, ): start = time.time() - params = Parameters() + params = Parameters(spatial_resolution=pixel_size) # Create temporary folders spots_dir = tempfile.TemporaryDirectory() @@ -192,6 +198,7 @@ def whole_process( if display_check_box: perform_results_saving( mitoses_dir.name, + params, save_dir=results_save_dir, video=img_layer.data, viewer=viewer, @@ -201,6 +208,7 @@ def whole_process( else: perform_results_saving( mitoses_dir.name, + params, save_dir=results_save_dir, video=img_layer.data, viewer=viewer, @@ -292,7 +300,7 @@ def whole_process_folder( ) # Results saving - perform_results_saving(mitoses_dir.name, save_dir=results_save_dir) + perform_results_saving(mitoses_dir.name, params, save_dir=results_save_dir) # Delete temporary folders spots_dir.cleanup() @@ -379,8 +387,8 @@ def mitosis_track_generation( img_layer.name, spots_load_dir, tracks_load_dir, + params, mitoses_save_dir, - params=params, ) @@ -421,9 +429,9 @@ def mid_body_detection( img_layer.name, exported_mitoses_dir, exported_tracks_dir, + params, movies_save_dir if save_check_box else None, parallel_detection=True, - params=params, ) @@ -445,7 +453,7 @@ def micro_tubules_cut_detection( raw_video, img_layer.name, exported_mitoses_dir, - params=params, + params, ) @@ -492,11 +500,11 @@ def results_saving( perform_results_saving( exported_mitoses_dir, + params, save_dir=results_save_dir, video=img_layer.data, viewer=viewer, cell_tracks=cell_tracks, - params=params, ) diff --git a/src/cut_detector/factories/mt_cut_detection_factory.py b/src/cut_detector/factories/mt_cut_detection_factory.py index 67e8c97..201ef05 100644 --- a/src/cut_detector/factories/mt_cut_detection_factory.py +++ b/src/cut_detector/factories/mt_cut_detection_factory.py @@ -28,7 +28,7 @@ class MtCutDetectionFactory: def __init__( self, - params=Parameters(), + params: Parameters, margin=50, ) -> None: self.params = params diff --git a/src/cut_detector/factories/results_saving_factory.py b/src/cut_detector/factories/results_saving_factory.py index dbfa830..acc6f40 100644 --- a/src/cut_detector/factories/results_saving_factory.py +++ b/src/cut_detector/factories/results_saving_factory.py @@ -116,7 +116,7 @@ class ResultsSavingFactory: def __init__( self, - params=Parameters(), + params: Parameters, max_frame=np.inf, ): self.params = params diff --git a/src/cut_detector/widget_functions/mid_body_detection.py b/src/cut_detector/widget_functions/mid_body_detection.py index 2ad42b9..0f51185 100644 --- a/src/cut_detector/widget_functions/mid_body_detection.py +++ b/src/cut_detector/widget_functions/mid_body_detection.py @@ -18,12 +18,12 @@ def perform_mid_body_detection( video_name: str, exported_mitoses_dir: str, exported_tracks_dir: str, + params: Parameters, movies_save_dir: Optional[str] = None, save: bool = True, parallel_detection: bool = False, detection_method: str = "difference_gaussian", target_mitosis_id: Optional[int] = None, - params=Parameters(), ) -> list[MitosisTrack]: """Perform mid-body detection on mitosis tracks. @@ -37,6 +37,8 @@ def perform_mid_body_detection( Directory where mitosis tracks are saved. exported_tracks_dir : str Directory where cell tracks are saved. + params : Parameters + Video parameters. movies_save_dir : Optional[str], optional Directory where mitosis movies are saved, by default None. save : bool, optional @@ -47,8 +49,6 @@ def perform_mid_body_detection( Detection method to use, by default "difference_gaussian". target_mitosis_id : Optional[int], optional Target mitosis id to perform mid-body detection on, by default None. - params : Parameters, optional - Video parameters. Returns ------- diff --git a/src/cut_detector/widget_functions/mitosis_track_generation.py b/src/cut_detector/widget_functions/mitosis_track_generation.py index 62fd773..c0baeb9 100644 --- a/src/cut_detector/widget_functions/mitosis_track_generation.py +++ b/src/cut_detector/widget_functions/mitosis_track_generation.py @@ -19,13 +19,13 @@ def perform_mitosis_track_generation( video_name: str, spots_dir: str, tracks_dir: str, + params: Parameters, mitoses_dir: Optional[str] = None, metaphase_model_path: Optional[str] = None, hmm_metaphase_parameters_file: Optional[str] = None, predictions_file: Optional[str] = None, only_predictions_update: bool = False, save: bool = True, - params=Parameters(), ) -> tuple[Union[list[MitosisTrack], None], list[CellSpot], list[CellTrack]]: """Perform mitosis track generation. @@ -39,6 +39,8 @@ def perform_mitosis_track_generation( Directory where spots are saved. tracks_dir : str Directory where tracks are saved. + params: Parameters + Video parameters. mitoses_dir : Optional[str], optional Directory where mitoses are saved, by default None. metaphase_model_path : Optional[str], optional @@ -51,8 +53,6 @@ def perform_mitosis_track_generation( Only update predictions, by default False. save : bool, optional Save, by default True. - params: Parameters, optional - Video parameters, by default Parameters(). Returns ------- diff --git a/src/cut_detector/widget_functions/mt_cut_detection.py b/src/cut_detector/widget_functions/mt_cut_detection.py index 1721d22..d154bbe 100644 --- a/src/cut_detector/widget_functions/mt_cut_detection.py +++ b/src/cut_detector/widget_functions/mt_cut_detection.py @@ -13,10 +13,10 @@ def perform_mt_cut_detection( raw_video: np.ndarray, video_name: str, exported_mitoses_dir: str, + params: Parameters, hmm_bridges_parameters_file: Optional[str] = None, bridges_mt_cnn_model_path: Optional[str] = None, save: bool = True, - params=Parameters(), ) -> list[MitosisTrack]: """Perform micro-tubules cut detection. @@ -28,14 +28,14 @@ def perform_mt_cut_detection( Video name. exported_mitoses_dir : str Directory where mitosis tracks are saved. + params: Parameters + Video parameters. hmm_bridges_parameters_file : Optional[str], optional HMM bridges parameters file. bridges_mt_cnn_model_path : Optional[str], optional Bridges micro-tubules CNN model path. save : bool, optional Save updated mitosis tracks, by default True. - params: Parameters, optional - Video parameters, by default Parameters(). """ if hmm_bridges_parameters_file is None: hmm_bridges_parameters_file = os.path.join( diff --git a/src/cut_detector/widget_functions/save_results.py b/src/cut_detector/widget_functions/save_results.py index 7e2f103..e2909c4 100644 --- a/src/cut_detector/widget_functions/save_results.py +++ b/src/cut_detector/widget_functions/save_results.py @@ -16,6 +16,7 @@ def perform_results_saving( exported_mitoses_dir: str, + params: Parameters, show: bool = False, save_dir: Optional[str] = None, verbose: bool = False, @@ -23,16 +24,15 @@ def perform_results_saving( viewer: Optional["napari.Viewer"] = None, segmentation_results: Optional[np.ndarray] = None, cell_tracks: Optional[list[CellTrack]] = None, - params=Parameters(), ) -> None: """Perform a series of tests, prints and plots following process. Parameters ---------- - video : np.ndarray - Video. TYXC. exported_mitoses_dir : str Directory where mitosis tracks are saved. + params : Parameters + Video parameters. show : bool, optional Show plots, by default False. save_dir : Optional[str], optional From 3353f42255c173777580f505531c07819222c8f5 Mon Sep 17 00:00:00 2001 From: 15bonte Date: Mon, 6 Jul 2026 17:20:59 +0200 Subject: [PATCH 2/2] Add possibility to twick spatial resoluton from GUI --- src/cut_detector/_widget.py | 41 +++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/cut_detector/_widget.py b/src/cut_detector/_widget.py index 702874a..53fa4a7 100644 --- a/src/cut_detector/_widget.py +++ b/src/cut_detector/_widget.py @@ -261,6 +261,11 @@ def whole_process( label="Directory to save results: ", mode="d", ), + pixel_size=dict( + widget_type="SpinBox", + label="Pixel size (nm): ", + value=225, # Default value + ), ) def whole_process_folder( raw_data_dir: str, @@ -269,6 +274,7 @@ def whole_process_folder( save_check_box: bool, movies_save_dir: str, results_save_dir: str, + pixel_size: float, ): # Create temporary folders @@ -276,7 +282,7 @@ def whole_process_folder( tracks_dir = tempfile.TemporaryDirectory() mitoses_dir = tempfile.TemporaryDirectory() - params = Parameters() + params = Parameters(spatial_resolution=pixel_size) # Run process on each video tiff_files = list(Path(raw_data_dir).rglob("*.tif")) @@ -371,16 +377,22 @@ def segmentation_tracking( label="Directory to save .bin mitoses: ", mode="d", ), + pixel_size=dict( + widget_type="SpinBox", + label="Pixel size (nm): ", + value=225, # Default value + ), ) def mitosis_track_generation( img_layer: "napari.layers.Image", spots_load_dir: str, tracks_load_dir: str, mitoses_save_dir: Optional[str], + pixel_size: float, ): raw_video = re_organize_channels(img_layer.data) # TYXC - params = Parameters() + params = Parameters(spatial_resolution=pixel_size) perform_mitosis_track_generation( raw_video, @@ -413,6 +425,11 @@ def mitosis_track_generation( label="If checked, directory to save division movies: ", mode="d", ), + pixel_size=dict( + widget_type="SpinBox", + label="Pixel size (nm): ", + value=225, # Default value + ), ) def mid_body_detection( img_layer: "napari.layers.Image", @@ -420,8 +437,9 @@ def mid_body_detection( exported_tracks_dir: str, save_check_box: bool, movies_save_dir: str, + pixel_size: float, ): - params = Parameters() + params = Parameters(spatial_resolution=pixel_size) raw_video = re_organize_channels(img_layer.data) # TYXC perform_mid_body_detection( @@ -443,12 +461,17 @@ def mid_body_detection( label="Directory to load .bin mitoses: ", mode="d", ), + pixel_size=dict( + widget_type="SpinBox", + label="Pixel size (nm): ", + value=225, # Default value + ), ) def micro_tubules_cut_detection( - img_layer: "napari.layers.Image", exported_mitoses_dir: str + img_layer: "napari.layers.Image", exported_mitoses_dir: str, pixel_size: float ): raw_video = re_organize_channels(img_layer.data) # TYXC - params = Parameters() + params = Parameters(spatial_resolution=pixel_size) perform_mt_cut_detection( raw_video, img_layer.name, @@ -475,6 +498,11 @@ def micro_tubules_cut_detection( label="Directory to save results: ", mode="d", ), + pixel_size=dict( + widget_type="SpinBox", + label="Pixel size (nm): ", + value=225, # Default value + ), ) def results_saving( img_layer: "napari.layers.Image", @@ -482,8 +510,9 @@ def results_saving( exported_mitoses_dir: str, exported_tracks_dir: str, results_save_dir: str, + pixel_size: float, ): - params = Parameters() + params = Parameters(spatial_resolution=pixel_size) # Load cell tracks cell_tracks: list[CellTrack] = [] # Iterate over "bin" files in exported_tracks_dir