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