Skip to content

Commit 80585c8

Browse files
committed
Merge branch 'main' into public-main
2 parents 27a51a7 + f470fe7 commit 80585c8

File tree

11 files changed

+687
-2
lines changed

11 files changed

+687
-2
lines changed

Diff for: ultrack/cli/main.py

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from ultrack.cli.segment import segmentation_cli
1313
from ultrack.cli.server import server_cli
1414
from ultrack.cli.solve import solve_cli
15+
from ultrack.cli.view import view_cli
1516

1617

1718
@click.group()
@@ -31,3 +32,4 @@ def main():
3132
main.add_command(segmentation_cli)
3233
main.add_command(solve_cli)
3334
main.add_command(server_cli)
35+
main.add_command(view_cli)

Diff for: ultrack/cli/view.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import click
2+
import napari
3+
4+
from ultrack.cli.utils import config_option
5+
from ultrack.config import MainConfig
6+
from ultrack.widgets.hierarchy_viz_widget import HierarchyVizWidget
7+
8+
9+
@click.group("view")
10+
def view_cli() -> None:
11+
"""View data in napari."""
12+
13+
14+
@view_cli.command("hierarchy")
15+
@config_option()
16+
def view_hierarchy_cli(config: MainConfig) -> None:
17+
"""Opens napari viewer with hierarchy visualization widget."""
18+
viewer = napari.Viewer()
19+
widget = HierarchyVizWidget(viewer, config)
20+
viewer.window.add_dock_widget(widget)
21+
napari.run()

Diff for: ultrack/config/config.py

+6
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,9 @@ def load_config(path: Union[str, Path]) -> MainConfig:
8080
data = toml.load(f)
8181
LOG.info(data)
8282
return MainConfig.model_validate(data)
83+
84+
85+
def save_config(config, path: Union[str, Path]):
86+
"""Saved MainConfig to TOML file."""
87+
with open(path, mode="w") as f:
88+
toml.dump(config.model_dump(by_alias=True), f)

Diff for: ultrack/napari.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ contributions:
1717
python_name: ultrack.widgets:UltrackWidget
1818
title: Ultrack
1919

20+
- id: ultrack.hierarchy_viz_widget
21+
python_name: ultrack.widgets:HierarchyVizWidget
22+
title: Hierarchy visualization
23+
2024
###### DEPRECATED & WIP WIDGETS #####
2125
# - id: ultrack.labels_to_edges_widget
2226
# python_name: ultrack.widgets:LabelsToContoursWidget
@@ -67,5 +71,8 @@ contributions:
6771
# - command: ultrack.division_annotation_widget
6872
# display_name: Division annotation
6973

74+
- command: ultrack.hierarchy_viz_widget
75+
display_name: Hierarchy visualization
76+
7077
# - command: ultrack.track_inspection
7178
# display_name: Track inspection

Diff for: ultrack/utils/_test/test_utils_array.py

+35
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
from typing import Tuple
2+
13
import numpy as np
24
import pytest
35

6+
from ultrack.config import MainConfig
47
from ultrack.utils.array import array_apply
8+
from ultrack.utils.ultrack_array import UltrackArray
59

610

711
@pytest.mark.parametrize("axis", [0, 1])
@@ -17,3 +21,34 @@ def sample_func(arr_1, arr_2):
1721
array_apply(in_data, in_data, out_array=out_data, func=sample_func, axis=axis)
1822
other_axes_length = in_data.shape[1 - axis]
1923
assert np.array_equal(out_data, 2 * in_data + other_axes_length)
24+
25+
26+
@pytest.mark.parametrize(
27+
"key,timelapse_mock_data",
28+
[
29+
(1, {"n_dim": 3}),
30+
(1, {"n_dim": 2}),
31+
((slice(None), 1), {"n_dim": 3}),
32+
((slice(None), 1), {"n_dim": 2}),
33+
((0, [1, 2]), {"n_dim": 3}),
34+
((0, [1, 2]), {"n_dim": 2}),
35+
# ((-1, np.asarray([0, 3])),{'n_dim':3}), #does testing negative time make sense?
36+
# ((-1, np.asarray([0, 3])),{'n_dim':2}),
37+
((slice(1), -2), {"n_dim": 3}),
38+
((slice(1), -2), {"n_dim": 2}),
39+
((np.asarray(0),), {"n_dim": 3}),
40+
((np.asarray(0),), {"n_dim": 2}),
41+
((0, 0, slice(32)), {"n_dim": 3}),
42+
((0, 0, slice(32)), {"n_dim": 2}),
43+
],
44+
indirect=[
45+
"timelapse_mock_data",
46+
],
47+
)
48+
def test_ultrack_array(
49+
segmentation_database_mock_data: MainConfig,
50+
key: Tuple,
51+
):
52+
ua = UltrackArray(segmentation_database_mock_data)
53+
ua_numpy = ua[slice(None)]
54+
np.testing.assert_equal(ua_numpy[key], ua[key])

Diff for: ultrack/utils/segmentation.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,6 @@ def copy_segments(
266266
) # not sure why this is necessary in large datasets
267267
else:
268268
for t in tqdm(range(segments.shape[0]), "Copying segments"):
269-
out_segments[t] = segments[t]
269+
out_segments[t] = np.asarray(segments[t])
270270

271271
return out_segments

0 commit comments

Comments
 (0)