@@ -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