@@ -33,37 +33,37 @@ class TestT1:
33
33
1689.08502946 ])
34
34
# The ideal signal produced by the equation M0 * (1 - 2 * exp(-t / T1))
35
35
# where M0 = 5000 and T1 = 1000 acquired over three slices at 9 t
36
- # between 200 and 1000 ms + a temporal slice spacing of 10 ms
36
+ # between 200 and 1000 ms + a temporal slice spacing of 100 ms
37
37
correct_signal_two_param_tss = np .array ([[[- 3187.30753078 , - 2408.18220682 ,
38
38
- 1703.20046036 , - 1065.30659713 ,
39
39
- 488.11636094 , 34.14696209 ,
40
40
506.71035883 , 934.30340259 ,
41
41
1321.20558829 ],
42
- [- 3105.8424597 , - 2334.46956224 ,
43
- - 1636.50250136 , - 1004.95578812 ,
44
- - 433.50869074 , 83.55802539 ,
45
- 551.41933777 , 974.75775966 ,
46
- 1357.81020428 ],
47
- [- 3025.18797962 , - 2261.49037074 ,
48
- - 1570.46819815 , - 945.2054797 ,
49
- - 379.44437595 , 132.4774404 ,
50
- 595.68345494 , 1014.80958915 ,
51
- 1394.05059827 ]],
42
+ [- 2408.18220682 , - 1703.20046036 ,
43
+ - 1065.30659713 , - 488.11636094 ,
44
+ 34.14696209 , 506.71035883 ,
45
+ 934.30340259 , 1321.20558829 ,
46
+ 1671.28916302 ],
47
+ [- 1703.20046036 , - 1065.30659713 ,
48
+ - 488.11636094 , 34.14696209 ,
49
+ 506.71035883 , 934.30340259 ,
50
+ 1321.20558829 , 1671.28916302 ,
51
+ 1988.05788088 ]],
52
52
[[- 3187.30753078 , - 2408.18220682 ,
53
53
- 1703.20046036 , - 1065.30659713 ,
54
54
- 488.11636094 , 34.14696209 ,
55
55
506.71035883 , 934.30340259 ,
56
56
1321.20558829 ],
57
- [- 3105.8424597 , - 2334.46956224 ,
58
- - 1636.50250136 , - 1004.95578812 ,
59
- - 433.50869074 , 83.55802539 ,
60
- 551.41933777 , 974.75775966 ,
61
- 1357.81020428 ],
62
- [- 3025.18797962 , - 2261.49037074 ,
63
- - 1570.46819815 , - 945.2054797 ,
64
- - 379.44437595 , 132.4774404 ,
65
- 595.68345494 , 1014.80958915 ,
66
- 1394.05059827 ]]
57
+ [- 2408.18220682 , - 1703.20046036 ,
58
+ - 1065.30659713 , - 488.11636094 ,
59
+ 34.14696209 , 506.71035883 ,
60
+ 934.30340259 , 1321.20558829 ,
61
+ 1671.28916302 ],
62
+ [- 1703.20046036 , - 1065.30659713 ,
63
+ - 488.11636094 , 34.14696209 ,
64
+ 506.71035883 , 934.30340259 ,
65
+ 1321.20558829 , 1671.28916302 ,
66
+ 1988.05788088 ]]
67
67
])
68
68
# Make some silly data that the code won't be able to fit any values to.
69
69
signal_fail_fit = np .arange (0 , 9 ) % 2
@@ -147,20 +147,61 @@ def test_three_param_fit(self):
147
147
def test_tss (self ):
148
148
149
149
mapper = T1 (self .correct_signal_two_param_tss , self .t , self .affine ,
150
- tss = 10 , mag_corr = True )
150
+ tss = 100 , mag_corr = True )
151
151
assert mapper .shape == self .correct_signal_two_param_tss .shape [:- 1 ]
152
- npt .assert_almost_equal (mapper .t1_map .mean (), self .t1 )
153
- npt .assert_almost_equal (mapper .m0_map .mean (), self .m0 )
154
- npt .assert_almost_equal (mapper .r1_map ().mean (), 1 / self .t1 )
152
+ npt .assert_almost_equal (mapper .t1_map .mean (), self .t1 , 4 )
153
+ npt .assert_almost_equal (mapper .m0_map .mean (), self .m0 , 4 )
154
+ npt .assert_almost_equal (mapper .r1_map ().mean (), 1 / self .t1 , 4 )
155
155
npt .assert_almost_equal (mapper .r2 .mean (), 1 )
156
156
157
157
def test_tss_axis (self ):
158
158
signal_array = np .swapaxes (self .correct_signal_two_param_tss , 0 , 1 )
159
- mapper = T1 (signal_array , self .t , self .affine , tss = 10 , tss_axis = 0 ,
159
+ mapper = T1 (signal_array , self .t , self .affine , tss = 100 , tss_axis = 0 ,
160
160
mag_corr = True )
161
- npt .assert_almost_equal (mapper .t1_map .mean (), self .t1 )
162
- npt .assert_almost_equal (mapper .m0_map .mean (), self .m0 )
163
- npt .assert_almost_equal (mapper .r1_map ().mean (), 1 / self .t1 )
161
+ npt .assert_almost_equal (mapper .t1_map .mean (), self .t1 , 4 )
162
+ npt .assert_almost_equal (mapper .m0_map .mean (), self .m0 , 4 )
163
+ npt .assert_almost_equal (mapper .r1_map ().mean (), 1 / self .t1 , 4 )
164
+ npt .assert_almost_equal (mapper .r2 .mean (), 1 )
165
+
166
+ def test_acq_order (self ):
167
+ # Descending order
168
+ signal_array = np .tile (self .correct_signal_two_param_tss , (10 , 10 , 1 , 1 ))
169
+ signal_array = signal_array [:, :, ::- 1 , :]
170
+ mapper = T1 (signal_array , self .t , self .affine , tss = 100 ,
171
+ acq_order = 'descend' , mag_corr = True )
172
+ npt .assert_almost_equal (mapper .t1_map .mean (), self .t1 , 4 )
173
+ npt .assert_almost_equal (mapper .m0_map .mean (), self .m0 , 4 )
174
+ npt .assert_almost_equal (mapper .r1_map ().mean (), 1 / self .t1 , 4 )
175
+ npt .assert_almost_equal (mapper .r2 .mean (), 1 )
176
+
177
+ # Centric order
178
+ signal_array_asc = np .tile (self .correct_signal_two_param_tss ,
179
+ (10 , 10 , 1 , 1 ))
180
+ signal_array = np .zeros (signal_array_asc .shape )
181
+ signal_array [:, :, 0 , :] = signal_array_asc [:, :, 2 , :]
182
+ signal_array [:, :, 1 , :] = signal_array_asc [:, :, 0 , :]
183
+ signal_array [:, :, 2 , :] = signal_array_asc [:, :, 1 , :]
184
+
185
+ mapper = T1 (signal_array , self .t , self .affine , tss = 100 , tss_axis = 2 ,
186
+ acq_order = 'centric' , mag_corr = True )
187
+ npt .assert_almost_equal (mapper .t1_map .mean (), self .t1 , 4 )
188
+ npt .assert_almost_equal (mapper .m0_map .mean (), self .m0 , 4 )
189
+ npt .assert_almost_equal (mapper .r1_map ().mean (), 1 / self .t1 , 4 )
190
+ npt .assert_almost_equal (mapper .r2 .mean (), 1 )
191
+
192
+ # Custom order
193
+ signal_array_asc = np .tile (self .correct_signal_two_param_tss ,
194
+ (10 , 10 , 1 , 1 ))
195
+ signal_array = np .zeros (signal_array_asc .shape )
196
+ signal_array [:, :, 1 , :] = signal_array_asc [:, :, 0 , :]
197
+ signal_array [:, :, 0 , :] = signal_array_asc [:, :, 1 , :]
198
+ signal_array [:, :, 2 , :] = signal_array_asc [:, :, 2 , :]
199
+ acq_order = [1 , 0 , 2 ]
200
+ mapper = T1 (signal_array , self .t , self .affine , tss = 100 , tss_axis = 2 ,
201
+ acq_order = acq_order , mag_corr = True )
202
+ npt .assert_almost_equal (mapper .t1_map .mean (), self .t1 , 4 )
203
+ npt .assert_almost_equal (mapper .m0_map .mean (), self .m0 , 4 )
204
+ npt .assert_almost_equal (mapper .r1_map ().mean (), 1 / self .t1 , 4 )
164
205
npt .assert_almost_equal (mapper .r2 .mean (), 1 )
165
206
166
207
def test_failed_fit (self ):
@@ -268,6 +309,28 @@ def test_tss_valid_axis(self):
268
309
inversion_list = np .linspace (0 , 2000 , 10 ),
269
310
affine = self .affine , tss = 1 , tss_axis = 2 )
270
311
312
+ def test_acq_order_options (self ):
313
+ # Invalid string
314
+ with pytest .raises (ValueError ):
315
+ mapper = T1 (pixel_array = np .zeros ((5 , 5 , 5 , 10 )),
316
+ inversion_list = np .linspace (0 , 2000 , 10 ),
317
+ affine = self .affine , tss = 1 , tss_axis = 2 ,
318
+ acq_order = 'invalid' )
319
+
320
+ # List length doesn't match number of slices
321
+ with pytest .raises (AssertionError ):
322
+ mapper = T1 (pixel_array = np .zeros ((5 , 5 , 5 , 4 )),
323
+ inversion_list = np .linspace (0 , 2000 , 10 ),
324
+ affine = self .affine , tss = 1 , tss_axis = 2 ,
325
+ acq_order = [0 , 1 , 2 ])
326
+
327
+ # List type not int
328
+ with pytest .raises (AssertionError ):
329
+ mapper = T1 (pixel_array = np .zeros ((5 , 5 , 5 , 4 )),
330
+ inversion_list = np .linspace (0 , 2000 , 10 ),
331
+ affine = self .affine , tss = 1 , tss_axis = 2 ,
332
+ acq_order = [0.0 , 1.0 , 2.0 , 3.0 ])
333
+
271
334
def test_mag_corr_options (self ):
272
335
# Test that the mag_corr option can be set to True, False, auto is
273
336
# checked more thoroughly in the next test
0 commit comments