Skip to content

Commit c91e036

Browse files
committed
feat: remove fixed dims
1 parent 61488cf commit c91e036

File tree

1 file changed

+44
-42
lines changed

1 file changed

+44
-42
lines changed

python/examples/example_linear_registration.py

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,10 @@ def create_demo_data(size: int | tuple = 60, radius: float = 20):
108108
return data
109109

110110

111-
# TODO can we avoid calling this at all? Can the layers just be created and dims inferred?
112-
def create_dimensions():
113-
if NUM_DEMO_DIMS == 2:
114-
return neuroglancer.CoordinateSpace(names=["x", "y"], units="nm", scales=[1, 1])
111+
def create_dimensions(viewer_dims: neuroglancer.CoordinateSpace):
112+
print(viewer_dims)
115113
return neuroglancer.CoordinateSpace(
116-
names=["x", "y", "z"], units="nm", scales=[1, 1, 1]
114+
names=viewer_dims.names, units=viewer_dims.units, scales=viewer_dims.scales
117115
)
118116

119117

@@ -125,16 +123,20 @@ def __init__(self, fixed_url: str, moving_url: str):
125123
self.stored_points = [[], []]
126124
self.stored_group_number = -1
127125
self.affine = None
126+
self.ready = False
128127

129128
if fixed_url is None or moving_url is None:
130129
self.demo_data = create_demo_data()
131130

132131
self.setup_viewer()
133132
self.last_updated_print = -1
134133

135-
def __str__(self):
134+
def get_state(self):
136135
with self.viewer.txn() as s:
137-
return str(s)
136+
return s
137+
138+
def __str__(self):
139+
return str(self.get_state())
138140

139141
def _clear_status_messages(self):
140142
to_pop = []
@@ -172,8 +174,29 @@ def setup_viewer(self):
172174
s.layers["moving"] = moving_layer
173175
s.layers["registered"] = registered_layer
174176
s.layers["registered"].visible = False
177+
178+
viewer.actions.add(
179+
"toggle-registered-visibility", self.toggle_registered_visibility
180+
)
181+
182+
with viewer.config_state.txn() as s:
183+
s.input_event_bindings.viewer["keyt"] = "toggle-registered-visibility"
184+
self.viewer.shared_state.add_changed_callback(
185+
lambda: self.viewer.defer_callback(self.on_state_changed)
186+
)
187+
188+
self._set_status_message(
189+
"help",
190+
"Waiting for viewer to initialize...",
191+
)
192+
193+
@debounce(0.5)
194+
def post_setup_viewer(self):
195+
with self.viewer.txn() as s:
196+
if s.dimensions.names == []:
197+
return
175198
s.layers["markers"] = neuroglancer.LocalAnnotationLayer(
176-
dimensions=create_dimensions(),
199+
dimensions=create_dimensions(s.dimensions),
177200
annotation_properties=[
178201
neuroglancer.AnnotationPropertySpec(
179202
id="label",
@@ -190,6 +213,10 @@ def setup_viewer(self):
190213
],
191214
shader=MARKERS_SHADER,
192215
)
216+
s.layers["markers"].tool = "annotatePoint"
217+
s.selected_layer.layer = "markers"
218+
s.selected_layer.visible = True
219+
193220
s.layout = neuroglancer.row_layout(
194221
[
195222
neuroglancer.LayerGroupViewer(
@@ -205,30 +232,20 @@ def setup_viewer(self):
205232
s.layout.children[1].crossSectionScale.link = "unlinked"
206233
s.layout.children[1].projectionOrientation.link = "unlinked"
207234
s.layout.children[1].projectionScale.link = "unlinked"
208-
s.layers["markers"].tool = "annotatePoint"
209-
s.selected_layer.layer = "markers"
210-
s.selected_layer.visible = True
211-
212-
viewer.actions.add(
213-
"toggle-registered-visibility", self.toggle_registered_visibility
214-
)
215-
216-
with viewer.config_state.txn() as s:
217-
s.input_event_bindings.viewer["keyt"] = "toggle-registered-visibility"
218235

219236
self._set_status_message(
220237
"help",
221238
"Place markers in pairs, starting with the fixed, and then the moving. The registered layer will automatically update as you add markers. Press 't' to toggle between viewing the fixed and registered layers.",
222239
)
223-
224-
self.viewer.shared_state.add_changed_callback(
225-
lambda: self.viewer.defer_callback(self.on_state_changed)
226-
)
240+
self.ready = True
227241

228242
def on_state_changed(self):
229243
self.viewer.defer_callback(self.update)
230244

231245
def update(self):
246+
if not self.ready:
247+
self.post_setup_viewer()
248+
return
232249
current_time = time()
233250
if current_time - self.last_updated_print > 5:
234251
print(f"Viewer states are successfully syncing at {ctime()}")
@@ -252,19 +269,14 @@ def create_fixed_image(self):
252269
return neuroglancer.ImageLayer(
253270
source=[
254271
neuroglancer.LayerDataSource(
255-
neuroglancer.LocalVolume(
256-
self.demo_data, dimensions=create_dimensions()
257-
)
272+
neuroglancer.LocalVolume(self.demo_data)
258273
)
259274
]
260275
)
261276
else:
262277
return neuroglancer.ImageLayer(source=self.fixed_url)
263278

264-
def create_moving_image(self, registration_matrix: list | np.ndarray | None = None):
265-
transform_kwargs = {}
266-
if registration_matrix is not None:
267-
transform_kwargs["matrix"] = registration_matrix
279+
def create_moving_image(self):
268280
if self.moving_url is None:
269281
if NUM_DEMO_DIMS == 2:
270282
desired_output_matrix_homogenous = [
@@ -287,25 +299,16 @@ def create_moving_image(self, registration_matrix: list | np.ndarray | None = No
287299
print("target demo affine", inverse_matrix)
288300
return neuroglancer.ImageLayer(
289301
source=[
290-
neuroglancer.LayerDataSource(
291-
neuroglancer.LocalVolume(
292-
transformed, dimensions=create_dimensions()
293-
),
294-
transform=neuroglancer.CoordinateSpaceTransform(
295-
output_dimensions=create_dimensions(),
296-
**transform_kwargs,
297-
),
298-
)
302+
neuroglancer.LayerDataSource(neuroglancer.LocalVolume(transformed))
299303
]
300304
)
301305
else:
302306
return neuroglancer.ImageLayer(
303307
source=self.moving_url,
304-
transform=neuroglancer.CoordinateSpaceTransform(**transform_kwargs),
305308
)
306309

307310
def create_registered_image(self):
308-
return self.create_moving_image(registration_matrix=self.affine)
311+
return self.create_moving_image()
309312

310313
def split_points_into_pairs(self, annotations):
311314
num_points = len(annotations) // 2
@@ -335,9 +338,8 @@ def automatically_group_markers(self, s: neuroglancer.ViewerState):
335338
def update_registered_layer(self, s: neuroglancer.ViewerState):
336339
existing_transform = s.layers["registered"].source[0].transform
337340
if existing_transform is None:
338-
# TODO again the create dimensions call needs to be fixed
339341
existing_transform = neuroglancer.CoordinateSpaceTransform(
340-
output_dimensions=create_dimensions()
342+
output_dimensions=create_dimensions(s.dimensions)
341343
)
342344
s.layers["registered"].source[0].transform = existing_transform
343345
if self.affine is not None:

0 commit comments

Comments
 (0)