Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions cellfinder/napari/detect/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -162,6 +162,7 @@ def done_func(points):
viewer=viewer,
name="Cell candidates",
cell_type=Cell.UNKNOWN,
scale=scale,
)

else:
Expand All @@ -172,6 +173,7 @@ def done_func(points):
viewer=viewer,
unknown_name="Rejected",
cell_name="Detected",
scale=scale,
)

return done_func
Expand Down Expand Up @@ -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
Expand Down
7 changes: 6 additions & 1 deletion cellfinder/napari/utils.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Tuple
from typing import List, Optional, Tuple

import napari
import napari.layers
Expand Down Expand Up @@ -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
Expand All @@ -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),
Expand All @@ -70,6 +72,7 @@ def add_classified_layers(
symbol="ring",
face_color="lightgoldenrodyellow",
metadata=dict(point_type=Cell.CELL),
scale=scale,
)


Expand All @@ -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
Expand All @@ -93,6 +97,7 @@ def add_single_layer(
face_color="lightskyblue",
visible=True,
metadata=dict(point_type=cell_type),
scale=scale,
)


Expand Down
26 changes: 26 additions & 0 deletions tests/napari/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Loading