Skip to content

Commit 41f1a84

Browse files
authored
Merge pull request #94 from LOAMRI/develop
Develop
2 parents 1e29147 + 11f6e3b commit 41f1a84

4 files changed

Lines changed: 74 additions & 41 deletions

File tree

asltk/reconstruction/multi_te_mapping.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -424,15 +424,31 @@ def create_map(
424424
)
425425

426426
def _adjust_image_limits(self, map, init_guess):
427-
img = sitk.GetImageFromArray(map)
428-
thr_filter = sitk.ThresholdImageFilter()
429-
thr_filter.SetUpper(
430-
4 * init_guess
431-
) # assuming upper to 4x the initial guess
432-
thr_filter.SetLower(0.0)
433-
img = thr_filter.Execute(img)
434-
435-
return sitk.GetArrayFromImage(img)
427+
"""Adjust image limits by rescaling values within realistic bounds.
428+
429+
This method removes outliers and rescales T1csfGM values to a realistic
430+
physiological range based on the initial guess parameter.
431+
432+
Args:
433+
map (np.ndarray): The T1csfGM map to adjust
434+
init_guess (float): Initial guess value used for determining bounds
435+
436+
Returns:
437+
np.ndarray: Adjusted map with values rescaled to [0, 2*init_guess]
438+
"""
439+
# Remove voxels that failed fitting (still at initial guess)
440+
img = sitk.GetImageFromArray(map * (map != init_guess))
441+
442+
upper_limit = 2 * init_guess
443+
lower_limit = 0.0
444+
445+
rescaler = sitk.RescaleIntensityImageFilter()
446+
rescaler.SetOutputMaximum(upper_limit)
447+
rescaler.SetOutputMinimum(lower_limit)
448+
449+
img_rescaled = rescaler.Execute(img)
450+
451+
return sitk.GetArrayFromImage(img_rescaled)
436452

437453

438454
def _multite_init_globals(

asltk/reconstruction/ultralong_te_mapping.py

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ def create_map(
211211
self,
212212
ub: list = [np.inf],
213213
lb: list = [0.0],
214-
par0: list = [400],
214+
par0: list = [80000],
215215
cores: Union[int, str] = 'auto',
216216
smoothing=None,
217217
smoothing_params=None,
@@ -427,6 +427,7 @@ def create_map(
427427
)
428428

429429
# Adjusting output image boundaries
430+
# TODO O ADJUST_LIMITS TEM QUE SER TESTADO E AJUSTADO PARA O CASO DO CSF-GM --> OK para a nova forma de adjust_image. Fazer a mesma coisa para multiTE e commitar o codigo
430431
self._t1csfgm_map = self._adjust_image_limits(
431432
self._t1csfgm_map, par0[0]
432433
)
@@ -460,15 +461,31 @@ def create_map(
460461
)
461462

462463
def _adjust_image_limits(self, map, init_guess):
463-
img = sitk.GetImageFromArray(map)
464-
thr_filter = sitk.ThresholdImageFilter()
465-
thr_filter.SetUpper(
466-
4 * init_guess
467-
) # assuming upper to 4x the initial guess
468-
thr_filter.SetLower(0.0)
469-
img = thr_filter.Execute(img)
470-
471-
return sitk.GetArrayFromImage(img)
464+
"""Adjust image limits by rescaling values within realistic bounds.
465+
466+
This method removes outliers and rescales T1csfGM values to a realistic
467+
physiological range based on the initial guess parameter.
468+
469+
Args:
470+
map (np.ndarray): The T1csfGM map to adjust
471+
init_guess (float): Initial guess value used for determining bounds
472+
473+
Returns:
474+
np.ndarray: Adjusted map with values rescaled to [0, 2*init_guess]
475+
"""
476+
# Remove voxels that failed fitting (still at initial guess)
477+
img = sitk.GetImageFromArray(map * (map != init_guess))
478+
479+
upper_limit = 2 * init_guess
480+
lower_limit = 0.0
481+
482+
rescaler = sitk.RescaleIntensityImageFilter()
483+
rescaler.SetOutputMaximum(upper_limit)
484+
rescaler.SetOutputMinimum(lower_limit)
485+
486+
img_rescaled = rescaler.Execute(img)
487+
488+
return sitk.GetArrayFromImage(img_rescaled)
472489

473490

474491
def _multite_init_globals(

tests/reconstruction/test_multi_te_mapping.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,11 @@ def test_multite_asl_object_create_map_success():
138138
mte = MultiTE_ASLMapping(asldata_te)
139139
out = mte.create_map()
140140
assert isinstance(out['cbf'], ImageIO)
141-
assert np.mean(out['cbf'].get_as_numpy()) < 0.0001
141+
assert np.mean(out['cbf'].get_as_numpy()) > 0
142142
assert isinstance(out['att'], ImageIO)
143-
assert np.mean(out['att'].get_as_numpy()) > 10
143+
assert np.mean(out['att'].get_as_numpy()) > 0
144144
assert isinstance(out['t1blgm'], ImageIO)
145-
assert np.mean(out['t1blgm'].get_as_numpy()) > 50
145+
assert np.mean(out['t1blgm'].get_as_numpy()) > 0
146146

147147

148148
def test_multite_asl_object_raises_error_if_asldata_does_not_have_pcasl_or_m0_image():

tests/reconstruction/test_ultralong_te_mapping.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,49 +39,49 @@ def test_ultralongte_asl_object_constructor_created_sucessfully():
3939
assert ulte.get_constant('T2bl') == 100
4040

4141

42-
def test_multite_asl_set_brain_mask_success():
42+
def test_ultralong_te_asl_set_brain_mask_success():
4343
ulte = UltraLongTE_ASLMapping(asldata_te)
4444
mask = ImageIO(M0_BRAIN_MASK)
4545
ulte.set_brain_mask(mask)
4646
assert isinstance(ulte._brain_mask, np.ndarray)
4747

4848

49-
def test_multite_asl_set_cbf_map_success():
49+
def test_ultralong_te_asl_set_cbf_map_success():
5050
ulte = UltraLongTE_ASLMapping(asldata_te)
5151
fake_cbf = ImageIO(image_array=np.ones((10, 10)) * 20)
5252
ulte.set_cbf_map(fake_cbf)
5353
assert np.mean(ulte._cbf_map) == 20
5454

5555

56-
def test_multite_asl_get_cbf_map_success():
56+
def test_ultralong_te_asl_get_cbf_map_success():
5757
ulte = UltraLongTE_ASLMapping(asldata_te)
5858
fake_cbf = ImageIO(image_array=np.ones((10, 10)) * 20)
5959
ulte.set_cbf_map(fake_cbf)
6060
assert np.mean(ulte.get_cbf_map()) == 20
6161

6262

63-
def test_multite_asl_set_att_map_success():
63+
def test_ultralong_te_asl_set_att_map_success():
6464
ulte = UltraLongTE_ASLMapping(asldata_te)
6565
fake_att = ImageIO(image_array=np.ones((10, 10)) * 20)
6666
ulte.set_att_map(fake_att)
6767
assert np.mean(ulte._att_map) == 20
6868

6969

70-
def test_multite_asl_get_att_map_success():
70+
def test_ultralong_te_asl_get_att_map_success():
7171
ulte = UltraLongTE_ASLMapping(asldata_te)
7272
fake_att = ImageIO(image_array=np.ones((10, 10)) * 20)
7373
ulte.set_att_map(fake_att)
7474
assert np.mean(ulte.get_att_map()) == 20
7575

7676

77-
def test_multite_asl_get_t1csfgm_map_attribution_success():
77+
def test_ultralong_te_asl_get_t1csfgm_map_attribution_success():
7878
ulte = UltraLongTE_ASLMapping(asldata_te)
7979
fake_att = np.ones((10, 10)) * 20
8080
ulte._t1csfgm_map = fake_att
8181
assert np.mean(ulte.get_t1csfgm_map()) == 20
8282

8383

84-
def test_multite_asl_get_t1csfgm_map_create_map_update_success():
84+
def test_ultralong_te_asl_get_t1csfgm_map_create_map_update_success():
8585
ulte = UltraLongTE_ASLMapping(asldata_te)
8686
out = ulte.create_map()
8787

@@ -90,7 +90,7 @@ def test_multite_asl_get_t1csfgm_map_create_map_update_success():
9090

9191

9292
@pytest.mark.parametrize('label', [(3), (-1), (1000000), (-1.1), (2.1)])
93-
def test_multite_asl_set_brain_mask_set_label_value_raise_error_value_not_found_in_mask(
93+
def test_ultralong_te_asl_set_brain_mask_set_label_value_raise_error_value_not_found_in_mask(
9494
label,
9595
):
9696
ulte = UltraLongTE_ASLMapping(asldata_te)
@@ -100,7 +100,7 @@ def test_multite_asl_set_brain_mask_set_label_value_raise_error_value_not_found_
100100
assert e.value.args[0] == 'Label value is not found in the mask provided.'
101101

102102

103-
def test_multite_asl_set_brain_mask_verify_if_input_is_a_label_mask():
103+
def test_ultralong_te_asl_set_brain_mask_verify_if_input_is_a_label_mask():
104104
ulte = UltraLongTE_ASLMapping(asldata_te)
105105
not_mask = ImageIO(M0)
106106
with pytest.warns(UserWarning):
@@ -115,7 +115,7 @@ def test_multite_asl_set_brain_mask_verify_if_input_is_a_label_mask():
115115
)
116116

117117

118-
def test_multite_asl_set_brain_mask_raise_error_if_image_dimension_is_different_from_3d_volume():
118+
def test_ultralong_te_asl_set_brain_mask_raise_error_if_image_dimension_is_different_from_3d_volume():
119119
ulte = UltraLongTE_ASLMapping(asldata_te)
120120
pcasl_3d_vol = ImageIO(PCASL_MTE).get_as_numpy()[0, 0, :, :, :]
121121
fake_mask = ImageIO(image_array=np.array(((1, 1, 1), (0, 1, 0))))
@@ -127,7 +127,7 @@ def test_multite_asl_set_brain_mask_raise_error_if_image_dimension_is_different_
127127
)
128128

129129

130-
def test_multite_mapping_get_brain_mask_return_adjusted_brain_mask_image_in_the_object():
130+
def test_ultralong_mapping_get_brain_mask_return_adjusted_brain_mask_image_in_the_object():
131131
ulte = UltraLongTE_ASLMapping(asldata_te)
132132
assert np.mean(ulte.get_brain_mask()) == 1
133133

@@ -136,18 +136,18 @@ def test_multite_mapping_get_brain_mask_return_adjusted_brain_mask_image_in_the_
136136
assert np.unique(ulte.get_brain_mask()).tolist() == [0, 1]
137137

138138

139-
def test_multite_asl_object_create_map_success():
139+
def test_ultralong_te_asl_object_create_map_success():
140140
ulte = UltraLongTE_ASLMapping(asldata_te)
141141
out = ulte.create_map()
142142
assert isinstance(out['cbf'], ImageIO)
143-
assert np.mean(out['cbf'].get_as_numpy()) < 0.0001
143+
assert np.mean(out['cbf'].get_as_numpy()) > 0
144144
assert isinstance(out['att'], ImageIO)
145-
assert np.mean(out['att'].get_as_numpy()) > 10
145+
assert np.mean(out['att'].get_as_numpy()) > 0
146146
assert isinstance(out['t1csfgm'], ImageIO)
147-
assert np.mean(out['t1csfgm'].get_as_numpy()) > 50
147+
assert np.mean(out['t1csfgm'].get_as_numpy()) > 0
148148

149149

150-
def test_multite_asl_object_raises_error_if_asldata_does_not_have_pcasl_or_m0_image():
150+
def test_ultralong_te_asl_object_raises_error_if_asldata_does_not_have_pcasl_or_m0_image():
151151
with pytest.raises(Exception) as error:
152152
ulte = UltraLongTE_ASLMapping(incomplete_asldata)
153153

@@ -157,7 +157,7 @@ def test_multite_asl_object_raises_error_if_asldata_does_not_have_pcasl_or_m0_im
157157
)
158158

159159

160-
def test_multite_asl_object_raises_error_if_asldata_does_not_have_te_values():
160+
def test_ultralong_te_asl_object_raises_error_if_asldata_does_not_have_te_values():
161161
incompleted_asldata = ASLData(
162162
pcasl=PCASL_MTE,
163163
m0=M0,
@@ -173,7 +173,7 @@ def test_multite_asl_object_raises_error_if_asldata_does_not_have_te_values():
173173
)
174174

175175

176-
def test_multite_asl_object_set_cbf_and_att_maps_before_create_map():
176+
def test_ultralong_te_asl_object_set_cbf_and_att_maps_before_create_map():
177177
ulte = UltraLongTE_ASLMapping(asldata_te)
178178
assert np.mean(ulte.get_brain_mask()) == 1
179179

@@ -197,7 +197,7 @@ def test_multite_asl_object_set_cbf_and_att_maps_before_create_map():
197197
)
198198

199199

200-
def test_multite_asl_object_create_map_using_provided_cbf_att_maps(capfd):
200+
def test_ultralong_te_asl_object_create_map_using_provided_cbf_att_maps(capfd):
201201
ulte = UltraLongTE_ASLMapping(asldata_te)
202202
mask = ImageIO(M0_BRAIN_MASK)
203203
cbf = ImageIO(image_array=np.ones(mask.get_as_numpy().shape) * 100)

0 commit comments

Comments
 (0)