[BUG]: fMRIPrepConfoundRemover sets incorrect t_r due to nilearn.image.clean_img #420
3 changed files with 33 additions and 10 deletions
1
docs/changes/newsfragments/420.bugfix
Normal file
1
docs/changes/newsfragments/420.bugfix
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Fix ``t_r`` tampering by :func:`nilearn.image.clean_img` in :class:`.fMRIPrepConfoundRemover` by `Fede Raimondo`_ and `Synchon Mandal`_
|
||||||
|
|
@ -596,6 +596,8 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
|
||||||
t_r=t_r,
|
t_r=t_r,
|
||||||
mask_img=mask_img,
|
mask_img=mask_img,
|
||||||
)
|
)
|
||||||
|
# Fix t_r as nilearn messes it up
|
||||||
|
cleaned_img.header["pixdim"][4] = t_r
|
||||||
# Save deconfounded data
|
# Save deconfounded data
|
||||||
deconfounded_img_path = element_tempdir / "deconfounded_data.nii.gz"
|
deconfounded_img_path = element_tempdir / "deconfounded_data.nii.gz"
|
||||||
nib.save(cleaned_img, deconfounded_img_path)
|
nib.save(cleaned_img, deconfounded_img_path)
|
||||||
|
|
|
||||||
|
|
@ -460,22 +460,32 @@ def test_fMRIPrepConfoundRemover_fit_transform() -> None:
|
||||||
|
|
||||||
with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg:
|
with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg:
|
||||||
element_data = DefaultDataReader().fit_transform(dg["sub-01"])
|
element_data = DefaultDataReader().fit_transform(dg["sub-01"])
|
||||||
orig_bold = element_data["BOLD"]["data"].get_fdata().copy()
|
# Get original data
|
||||||
|
input_img = element_data["BOLD"]["data"]
|
||||||
|
input_bold = input_img.get_fdata().copy()
|
||||||
|
input_tr = input_img.header.get_zooms()[3]
|
||||||
|
# Fit-transform
|
||||||
output = confound_remover.fit_transform(element_data)
|
output = confound_remover.fit_transform(element_data)
|
||||||
trans_bold = output["BOLD"]["data"].get_fdata()
|
output_img = output["BOLD"]["data"]
|
||||||
|
output_bold = output_img.get_fdata()
|
||||||
|
output_tr = output_img.header.get_zooms()[3]
|
||||||
|
|
||||||
# Transformation is in place
|
# Transformation is in place
|
||||||
assert_array_equal(
|
assert_array_equal(
|
||||||
trans_bold, element_data["BOLD"]["data"].get_fdata()
|
output_bold, element_data["BOLD"]["data"].get_fdata()
|
||||||
)
|
)
|
||||||
|
|
||||||
# Data should have the same shape
|
# Data should have the same shape
|
||||||
assert orig_bold.shape == trans_bold.shape
|
assert input_bold.shape == output_bold.shape
|
||||||
|
|
||||||
# but be different
|
# but be different
|
||||||
assert_raises(
|
assert_raises(
|
||||||
AssertionError, assert_array_equal, orig_bold, trans_bold
|
AssertionError, assert_array_equal, input_bold, output_bold
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Check t_r
|
||||||
|
assert input_tr == output_tr
|
||||||
|
|
||||||
assert "meta" in output["BOLD"]
|
assert "meta" in output["BOLD"]
|
||||||
assert "preprocess" in output["BOLD"]["meta"]
|
assert "preprocess" in output["BOLD"]["meta"]
|
||||||
t_meta = output["BOLD"]["meta"]["preprocess"]
|
t_meta = output["BOLD"]["meta"]["preprocess"]
|
||||||
|
|
@ -506,22 +516,32 @@ def test_fMRIPrepConfoundRemover_fit_transform_masks() -> None:
|
||||||
|
|
||||||
with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg:
|
with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg:
|
||||||
element_data = DefaultDataReader().fit_transform(dg["sub-01"])
|
element_data = DefaultDataReader().fit_transform(dg["sub-01"])
|
||||||
orig_bold = element_data["BOLD"]["data"].get_fdata().copy()
|
# Get original data
|
||||||
|
input_img = element_data["BOLD"]["data"]
|
||||||
|
input_bold = input_img.get_fdata().copy()
|
||||||
|
input_tr = input_img.header.get_zooms()[3]
|
||||||
|
# Fit-transform
|
||||||
output = confound_remover.fit_transform(element_data)
|
output = confound_remover.fit_transform(element_data)
|
||||||
trans_bold = output["BOLD"]["data"].get_fdata()
|
output_img = output["BOLD"]["data"]
|
||||||
|
output_bold = output_img.get_fdata()
|
||||||
|
output_tr = output_img.header.get_zooms()[3]
|
||||||
|
|
||||||
# Transformation is in place
|
# Transformation is in place
|
||||||
assert_array_equal(
|
assert_array_equal(
|
||||||
trans_bold, element_data["BOLD"]["data"].get_fdata()
|
output_bold, element_data["BOLD"]["data"].get_fdata()
|
||||||
)
|
)
|
||||||
|
|
||||||
# Data should have the same shape
|
# Data should have the same shape
|
||||||
assert orig_bold.shape == trans_bold.shape
|
assert input_bold.shape == output_bold.shape
|
||||||
|
|
||||||
# but be different
|
# but be different
|
||||||
assert_raises(
|
assert_raises(
|
||||||
AssertionError, assert_array_equal, orig_bold, trans_bold
|
AssertionError, assert_array_equal, input_bold, output_bold
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Check t_r
|
||||||
|
assert input_tr == output_tr
|
||||||
|
|
||||||
assert "meta" in output["BOLD"]
|
assert "meta" in output["BOLD"]
|
||||||
assert "preprocess" in output["BOLD"]["meta"]
|
assert "preprocess" in output["BOLD"]["meta"]
|
||||||
t_meta = output["BOLD"]["meta"]["preprocess"]
|
t_meta = output["BOLD"]["meta"]["preprocess"]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue