From 76075e9eeb8d9d98558263f177a5eba70561175a Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 22 Jan 2025 19:03:54 +0100 Subject: [PATCH 1/3] fix: explicitly assign t_r after clean_img in fMRIPrepConfoundRemover --- junifer/preprocess/confounds/fmriprep_confound_remover.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/junifer/preprocess/confounds/fmriprep_confound_remover.py b/junifer/preprocess/confounds/fmriprep_confound_remover.py index 6129a1a71..64d0ba362 100644 --- a/junifer/preprocess/confounds/fmriprep_confound_remover.py +++ b/junifer/preprocess/confounds/fmriprep_confound_remover.py @@ -596,6 +596,8 @@ class fMRIPrepConfoundRemover(BasePreprocessor): t_r=t_r, mask_img=mask_img, ) + # Fix t_r as nilearn messes it up + cleaned_img.header["pixdim"][4] = t_r # Save deconfounded data deconfounded_img_path = element_tempdir / "deconfounded_data.nii.gz" nib.save(cleaned_img, deconfounded_img_path) -- 2.52.0 From fe4a3310ffc7b7459c792693088974f2220481e3 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 22 Jan 2025 19:19:27 +0100 Subject: [PATCH 2/3] update: improve tests for fMRIPrepConfoundRemover --- .../tests/test_fmriprep_confound_remover.py | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py b/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py index a8f3c554e..97fbf9afb 100644 --- a/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +++ b/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py @@ -460,22 +460,32 @@ def test_fMRIPrepConfoundRemover_fit_transform() -> None: with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: 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) - 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 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 - assert orig_bold.shape == trans_bold.shape + assert input_bold.shape == output_bold.shape # but be different 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 "preprocess" in output["BOLD"]["meta"] t_meta = output["BOLD"]["meta"]["preprocess"] @@ -506,22 +516,32 @@ def test_fMRIPrepConfoundRemover_fit_transform_masks() -> None: with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg: 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) - 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 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 - assert orig_bold.shape == trans_bold.shape + assert input_bold.shape == output_bold.shape # but be different 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 "preprocess" in output["BOLD"]["meta"] t_meta = output["BOLD"]["meta"]["preprocess"] -- 2.52.0 From 2c96d4d241c5462867566eef6637416fb813c8b7 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Wed, 22 Jan 2025 19:28:10 +0100 Subject: [PATCH 3/3] chore: add changelog 420.bugfix --- docs/changes/newsfragments/420.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/newsfragments/420.bugfix diff --git a/docs/changes/newsfragments/420.bugfix b/docs/changes/newsfragments/420.bugfix new file mode 100644 index 000000000..bfad01482 --- /dev/null +++ b/docs/changes/newsfragments/420.bugfix @@ -0,0 +1 @@ +Fix ``t_r`` tampering by :func:`nilearn.image.clean_img` in :class:`.fMRIPrepConfoundRemover` by `Fede Raimondo`_ and `Synchon Mandal`_ -- 2.52.0