@@ -134,3 +134,203 @@ def test_viewer_nonRAS():
134
134
assert_array_equal (sag , data1 [6 , :, :])
135
135
assert_array_equal (cor , data1 [:, :, 32 ].T )
136
136
assert_array_equal (axi , data1 [:, 13 , :].T )
137
+
138
+
139
+
140
+ @needs_mpl
141
+ def test_viewer_nonRAS_on_mouse ():
142
+ """
143
+ test on_mouse selection on non RAS matrices
144
+
145
+ """
146
+ # This affine simulates an acquisition on a quadruped subject that is in a prone position.
147
+ # This corresponds to an acquisition with:
148
+ # - LR inverted on scanner x (i)
149
+ # - IS on scanner y (j)
150
+ # - PA on scanner z (k)
151
+ # This example enables to test also OrthoSlicer3D properties `_flips` and `_order`.
152
+
153
+ (I , J , K ) = (10 , 20 , 40 )
154
+ data1 = np .random .rand (I , J , K )
155
+ (i_target , j_target , k_target ) = (2 , 14 , 12 )
156
+ i1 = i_target - 2
157
+ i2 = i_target + 2
158
+ j1 = j_target - 3
159
+ j2 = j_target + 3
160
+ k1 = k_target - 4
161
+ k2 = k_target + 4
162
+ data1 [i1 : i2 + 1 , j1 : j2 + 1 , k1 : k2 + 1 ] = 0
163
+ data1 [i_target , j_target , k_target ] = 1
164
+ valp1 = 1.5
165
+ valm1 = 0.5
166
+ data1 [i_target - 1 , j_target , k_target ] = valp1 # x flipped
167
+ data1 [i_target + 1 , j_target , k_target ] = valm1 # x flipped
168
+ data1 [i_target , j_target - 1 , k_target ] = valm1
169
+ data1 [i_target , j_target + 1 , k_target ] = valp1
170
+ data1 [i_target , j_target , k_target - 1 ] = valm1
171
+ data1 [i_target , j_target , k_target + 1 ] = valp1
172
+
173
+ aff1 = np .array ([[- 1 , 0 , 0 , 5 ],
174
+ [0 , 0 , 1 , - 10 ],
175
+ [0 , 1 , 0 , - 30 ],
176
+ [0 , 0 , 0 , 1 ]])
177
+
178
+ o1 = OrthoSlicer3D (data1 , aff1 )
179
+
180
+ class Event :
181
+ def __init__ (self ):
182
+ self .name = "simulated mouse event"
183
+ self .button = 1
184
+
185
+ event = Event ()
186
+ event .xdata = k_target
187
+ event .ydata = j_target
188
+ event .inaxes = o1 ._ims [0 ].axes
189
+ o1 ._on_mouse (event )
190
+
191
+ event .inaxes = o1 ._ims [1 ].axes
192
+ event .xdata = (I - 1 ) - i_target # x flipped
193
+ event .ydata = j_target
194
+ o1 ._on_mouse (event )
195
+
196
+ event .inaxes = o1 ._ims [2 ].axes
197
+ event .xdata = (I - 1 ) - i_target # x flipped
198
+ event .ydata = k_target
199
+ o1 ._on_mouse (event )
200
+
201
+ sag = o1 ._ims [0 ].get_array ()
202
+ cor = o1 ._ims [1 ].get_array ()
203
+ axi = o1 ._ims [2 ].get_array ()
204
+
205
+ assert_array_equal (sag , data1 [i_target , :, :]) #
206
+ assert_array_equal (cor , data1 [::- 1 , :, k_target ].T ) # x flipped
207
+ assert_array_equal (axi , data1 [::- 1 , j_target , :].T ) # x flipped
208
+ return None
209
+
210
+
211
+ @needs_mpl
212
+ def test_viewer_nonRAS_on_scroll ():
213
+ """
214
+ test scrolling on non RAS matrices
215
+
216
+ """
217
+ # This affine simulates an acquisition on a quadruped subject that is in a prone position.
218
+ # This corresponds to an acquisition with:
219
+ # - LR inverted on scanner x (i)
220
+ # - IS on scanner y (j)
221
+ # - PA on scanner z (k)
222
+ # This example enables to test also OrthoSlicer3D properties `_flips` and `_order`.
223
+
224
+ (I , J , K ) = (10 , 20 , 40 )
225
+ data1 = np .random .rand (I , J , K )
226
+ (i_target , j_target , k_target ) = (2 , 14 , 12 )
227
+ i1 = i_target - 2
228
+ i2 = i_target + 2
229
+ j1 = j_target - 3
230
+ j2 = j_target + 3
231
+ k1 = k_target - 4
232
+ k2 = k_target + 4
233
+ data1 [i1 : i2 + 1 , j1 : j2 + 1 , k1 : k2 + 1 ] = 0
234
+ data1 [i_target , j_target , k_target ] = 1
235
+ valp1 = 1.5
236
+ valm1 = 0.5
237
+ data1 [i_target - 1 , j_target , k_target ] = valp1 # x flipped
238
+ data1 [i_target + 1 , j_target , k_target ] = valm1 # x flipped
239
+ data1 [i_target , j_target - 1 , k_target ] = valm1
240
+ data1 [i_target , j_target + 1 , k_target ] = valp1
241
+ data1 [i_target , j_target , k_target - 1 ] = valm1
242
+ data1 [i_target , j_target , k_target + 1 ] = valp1
243
+
244
+ aff1 = np .array ([[- 1 , 0 , 0 , 5 ],
245
+ [0 , 0 , 1 , - 10 ],
246
+ [0 , 1 , 0 , - 30 ],
247
+ [0 , 0 , 0 , 1 ]])
248
+
249
+ o1 = OrthoSlicer3D (data1 , aff1 )
250
+
251
+ class Event :
252
+ def __init__ (self ):
253
+ self .name = "simulated mouse event"
254
+ self .button = None
255
+ self .key = None
256
+
257
+ i_last = data1 .shape [0 ] - 1
258
+
259
+ [x_t , y_t , z_t ] = list (aff1 .dot (np .array ([i_target , j_target , k_target , 1 ]))[:3 ])
260
+ # print(x_t, y_t, z_t)
261
+ # scanner positions are x_t=3, y_t=2, z_t=16
262
+
263
+ event = Event ()
264
+
265
+ # Sagittal plane - one scroll up
266
+ # x coordinate is flipped so index decrease by 1
267
+ o1 .set_position (x_t , y_t , z_t )
268
+ event .inaxes = o1 ._ims [0 ].axes
269
+ event .button = 'up'
270
+ o1 ._on_scroll (event )
271
+ sag = o1 ._ims [0 ].get_array ()
272
+ cor = o1 ._ims [1 ].get_array ()
273
+ axi = o1 ._ims [2 ].get_array ()
274
+ assert_array_equal (sag , data1 [i_target - 1 , :, :])
275
+ assert_array_equal (cor , data1 [::- 1 , :, k_target ].T ) # ::-1 because the array is flipped in x
276
+ assert_array_equal (axi , data1 [::- 1 , j_target , :].T ) # ::-1 because the array is flipped in x
277
+
278
+ # Sagittal plane - one scrolled down
279
+ o1 .set_position (x_t , y_t , z_t )
280
+ event .button = 'down'
281
+ o1 ._on_scroll (event )
282
+ sag = o1 ._ims [0 ].get_array ()
283
+ cor = o1 ._ims [1 ].get_array ()
284
+ axi = o1 ._ims [2 ].get_array ()
285
+ assert_array_equal (sag , data1 [i_target + 1 , :, :])
286
+ assert_array_equal (cor , data1 [::- 1 , :, k_target ].T )
287
+ assert_array_equal (axi , data1 [::- 1 , j_target , :].T )
288
+
289
+ # Coronal plane - one scroll up
290
+ # y coordinate is increase by 1
291
+ o1 .set_position (x_t , y_t , z_t )
292
+ event .inaxes = o1 ._ims [1 ].axes
293
+ event .button = 'up'
294
+ o1 ._on_scroll (event )
295
+ sag = o1 ._ims [0 ].get_array ()
296
+ cor = o1 ._ims [1 ].get_array ()
297
+ axi = o1 ._ims [2 ].get_array ()
298
+ assert_array_equal (sag , data1 [i_target , :, :])
299
+ assert_array_equal (cor , data1 [::- 1 , :, k_target + 1 ].T ) # ::-1 because the array is flipped in x
300
+ assert_array_equal (axi , data1 [::- 1 , j_target , :].T ) # ::-1 because the array is flipped in x
301
+
302
+ # Coronal plane - one scrolled down
303
+ o1 .set_position (x_t , y_t , z_t )
304
+ event .button = 'down'
305
+ o1 ._on_scroll (event )
306
+ sag = o1 ._ims [0 ].get_array ()
307
+ cor = o1 ._ims [1 ].get_array ()
308
+ axi = o1 ._ims [2 ].get_array ()
309
+ assert_array_equal (sag , data1 [i_target , :, :])
310
+ assert_array_equal (cor , data1 [::- 1 , :, k_target - 1 ].T )
311
+ assert_array_equal (axi , data1 [::- 1 , j_target , :].T )
312
+
313
+ # Axial plane - one scroll up
314
+ # y is increase by 1
315
+ o1 .set_position (x_t , y_t , z_t )
316
+ event .inaxes = o1 ._ims [2 ].axes
317
+ event .button = 'up'
318
+ o1 ._on_scroll (event )
319
+ sag = o1 ._ims [0 ].get_array ()
320
+ cor = o1 ._ims [1 ].get_array ()
321
+ axi = o1 ._ims [2 ].get_array ()
322
+ assert_array_equal (sag , data1 [i_target , :, :])
323
+ assert_array_equal (cor , data1 [::- 1 , :, k_target ].T ) # ::-1 because the array is flipped in x
324
+ assert_array_equal (axi , data1 [::- 1 , j_target + 1 , :].T ) # ::-1 because the array is flipped in x
325
+
326
+ # Axial plane - one scrolled down
327
+ o1 .set_position (x_t , y_t , z_t )
328
+ event .button = 'down'
329
+ o1 ._on_scroll (event )
330
+ sag = o1 ._ims [0 ].get_array ()
331
+ cor = o1 ._ims [1 ].get_array ()
332
+ axi = o1 ._ims [2 ].get_array ()
333
+ assert_array_equal (sag , data1 [i_target , :, :])
334
+ assert_array_equal (cor , data1 [::- 1 , :, k_target ].T )
335
+ assert_array_equal (axi , data1 [::- 1 , j_target - 1 , :].T )
336
+ return None
0 commit comments