diff --git a/cellfinder/napari/detect/detect.py b/cellfinder/napari/detect/detect.py index 5ad6c7da..f801d462 100644 --- a/cellfinder/napari/detect/detect.py +++ b/cellfinder/napari/detect/detect.py @@ -148,7 +148,7 @@ def restore_options_defaults(widget: FunctionGui) -> None: def get_results_callback( - skip_classification: bool, viewer: napari.Viewer + skip_classification: bool, viewer: napari.Viewer, scale ) -> Callable: """ Returns the callback that is connected to output of the pipeline. @@ -162,6 +162,7 @@ def done_func(points): viewer=viewer, name="Cell candidates", cell_type=Cell.UNKNOWN, + scale=scale, ) else: @@ -172,6 +173,7 @@ def done_func(points): viewer=viewer, unknown_name="Rejected", cell_name="Detected", + scale=scale, ) return done_func @@ -453,7 +455,11 @@ def widget( ) worker.returned.connect( - get_results_callback(skip_classification, options["viewer"]) + get_results_callback( + skip_classification, + options["viewer"], + options["signal_image"].scale, + ) ) # Make sure if the worker emits an error, it is propagated to this # thread diff --git a/cellfinder/napari/utils.py b/cellfinder/napari/utils.py index 2f853fe0..6935bb73 100644 --- a/cellfinder/napari/utils.py +++ b/cellfinder/napari/utils.py @@ -1,4 +1,4 @@ -from typing import List, Tuple +from typing import List, Optional, Tuple import napari import napari.layers @@ -44,6 +44,7 @@ def add_classified_layers( viewer: napari.Viewer, unknown_name: str = "Rejected", cell_name: str = "Detected", + scale: Optional[Tuple[float, float, float]] = None, ) -> None: """ Adds cell candidates as two separate point layers - unknowns and cells, to @@ -60,6 +61,7 @@ def add_classified_layers( face_color="lightskyblue", visible=False, metadata=dict(point_type=Cell.UNKNOWN), + scale=scale, ) viewer.add_points( cells_to_array(points, Cell.CELL, napari_order=True), @@ -70,6 +72,7 @@ def add_classified_layers( symbol="ring", face_color="lightgoldenrodyellow", metadata=dict(point_type=Cell.CELL), + scale=scale, ) @@ -78,6 +81,7 @@ def add_single_layer( viewer: napari.Viewer, name: str, cell_type: int, + scale: Optional[Tuple[float, float, float]] = None, ) -> None: """ Adds all cells of cell_type Cell.TYPE to a new point layer in the napari @@ -93,6 +97,7 @@ def add_single_layer( face_color="lightskyblue", visible=True, metadata=dict(point_type=cell_type), + scale=scale, ) diff --git a/tests/napari/test_utils.py b/tests/napari/test_utils.py index 6cf864f3..a9fb686d 100644 --- a/tests/napari/test_utils.py +++ b/tests/napari/test_utils.py @@ -65,6 +65,32 @@ def test_add_classified_layers(make_napari_viewer): assert cells_again == points +def test_add_classified_layers_propagates_scale(make_napari_viewer): + """Ensure scale is propagated to created Points layers.""" + scale = (5.0, 1.46, 1.46) + + points = [ + Cell(pos=[1, 2, 3], cell_type=Cell.CELL), + Cell(pos=[4, 5, 6], cell_type=Cell.UNKNOWN), + ] + + viewer = make_napari_viewer() + + add_classified_layers( + points, + viewer, + unknown_name="rejected", + cell_name="accepted", + scale=scale, + ) + # scale is applied to both created Points layers + accepted = viewer.layers["accepted"] + rejected = viewer.layers["rejected"] + + assert np.allclose(accepted.scale, scale) + assert np.allclose(rejected.scale, scale) + + def test_html_label_widget(): """Simple unit test for the HTML Label widget""" label_widget = html_label_widget("A nice label", tag="h1")