Skip to content

Commit 6bfdcaf

Browse files
authored
Add files via upload
1 parent 4d09e33 commit 6bfdcaf

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed

nibabel/tests/test_viewers.py

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,203 @@ def test_viewer_nonRAS():
134134
assert_array_equal(sag, data1[6, :, :])
135135
assert_array_equal(cor, data1[:, :, 32].T)
136136
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

Comments
 (0)