From 8ae4676e1e94c45d546735250f4a0246a47b50eb Mon Sep 17 00:00:00 2001 From: LeSasse Date: Fri, 27 Jan 2023 11:21:35 +0100 Subject: [PATCH 1/4] update the AOMIC ID1000 datagrabber to include BOLD and T1w masks outputted by fMRIprep --- junifer/datagrabber/aomic/id1000.py | 13 +++++++++++++ junifer/datagrabber/aomic/tests/test_id1000.py | 8 +++++++- tools/create_aomic1000_example_dataset.py | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/junifer/datagrabber/aomic/id1000.py b/junifer/datagrabber/aomic/id1000.py index 14a50d3ce..eaad3b302 100644 --- a/junifer/datagrabber/aomic/id1000.py +++ b/junifer/datagrabber/aomic/id1000.py @@ -34,7 +34,9 @@ class DataladAOMICID1000(PatternDataladDataGrabber): types = [ "BOLD", "BOLD_confounds", + "BOLD_mask", "T1w", + "T1w_mask", "probseg_CSF", "probseg_GM", "probseg_WM", @@ -52,11 +54,22 @@ class DataladAOMICID1000(PatternDataladDataGrabber): "sub-{subject}_task-moviewatching_" "desc-confounds_regressors.tsv" ), + "BOLD_mask": ( + "derivatives/fmriprep/sub-{subject}/func/" + "sub-{subject}_task-moviewatching_" + "space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz" + ), "T1w": ( "derivatives/fmriprep/sub-{subject}/anat/" "sub-{subject}_space-MNI152NLin2009cAsym_" "desc-preproc_T1w.nii.gz" ), + "T1w_mask": ( + "derivatives/fmriprep/sub-{subject}/anat/" + "sub-{subject}_space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz" + ), "probseg_CSF": ( "derivatives/fmriprep/sub-{subject}/anat/" "sub-{subject}_space-MNI152NLin2009cAsym_label-" diff --git a/junifer/datagrabber/aomic/tests/test_id1000.py b/junifer/datagrabber/aomic/tests/test_id1000.py index 925bbce66..528325007 100644 --- a/junifer/datagrabber/aomic/tests/test_id1000.py +++ b/junifer/datagrabber/aomic/tests/test_id1000.py @@ -51,6 +51,9 @@ def test_aomic1000_datagrabber() -> None: assert out["BOLD_confounds"]["path"].exists() assert out["BOLD_confounds"]["path"].is_file() + # assert BOLD_mask + assert out["BOLD_masks"]["path"].exists() + # asserts type "T1w" assert "T1w" in out @@ -63,6 +66,9 @@ def test_aomic1000_datagrabber() -> None: assert out["T1w"]["path"].exists() assert out["T1w"]["path"].is_file() + # asserts T1w_mask + assert out["T1w_masks"]["path"].exists() + # asserts type "probseg_CSF" assert "probseg_CSF" in out @@ -115,4 +121,4 @@ def test_aomic1000_datagrabber() -> None: meta = out["BOLD"]["meta"] assert "element" in meta assert "subject" in meta["element"] - assert test_element == meta["element"]["subject"] + assert test_element == meta["element"]["subject"] \ No newline at end of file diff --git a/tools/create_aomic1000_example_dataset.py b/tools/create_aomic1000_example_dataset.py index 8f95fecae..7cc98e833 100644 --- a/tools/create_aomic1000_example_dataset.py +++ b/tools/create_aomic1000_example_dataset.py @@ -52,6 +52,10 @@ with TemporaryDirectory() as tmpdir_name: '_regressors.tsv'), (f'func/{t_sub}_task-moviewatching_desc-confounds' '_regressors.json'), + (f"func/sub-{t_sub}_task-moviewatching_" + "space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz"), + (f"anat/sub-{t_sub}_space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz") ] elif dtype == 'dwipreproc': -- 2.52.0 From 601706cfc5b524b3fc73f4dac5c14a5dcf246587 Mon Sep 17 00:00:00 2001 From: LeSasse Date: Fri, 27 Jan 2023 12:19:07 +0100 Subject: [PATCH 2/4] update all AOMIC datagrabber to include fmriprep masks, and update testing datasets too --- junifer/datagrabber/aomic/id1000.py | 27 +++++- junifer/datagrabber/aomic/piop1.py | 14 +++ junifer/datagrabber/aomic/piop2.py | 36 +++++++- .../datagrabber/aomic/tests/test_id1000.py | 10 +-- junifer/datagrabber/aomic/tests/test_piop1.py | 6 ++ junifer/datagrabber/aomic/tests/test_piop2.py | 7 +- tools/create_aomic1000_example_dataset.py | 88 ++++++++++++------- tools/create_aomicpiop1_example_dataset.py | 32 +++---- tools/create_aomicpiop2_example_dataset.py | 32 +++---- 9 files changed, 176 insertions(+), 76 deletions(-) diff --git a/junifer/datagrabber/aomic/id1000.py b/junifer/datagrabber/aomic/id1000.py index eaad3b302..1a1b188e2 100644 --- a/junifer/datagrabber/aomic/id1000.py +++ b/junifer/datagrabber/aomic/id1000.py @@ -7,7 +7,7 @@ # License: AGPL from pathlib import Path -from typing import Union +from typing import Union, Dict from junifer.datagrabber import PatternDataladDataGrabber @@ -66,9 +66,9 @@ class DataladAOMICID1000(PatternDataladDataGrabber): "desc-preproc_T1w.nii.gz" ), "T1w_mask": ( - "derivatives/fmriprep/sub-{subject}/anat/" - "sub-{subject}_space-MNI152NLin2009cAsym_" - "desc-brain_mask.nii.gz" + "derivatives/fmriprep/sub-{subject}/anat/" + "sub-{subject}_space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz" ), "probseg_CSF": ( "derivatives/fmriprep/sub-{subject}/anat/" @@ -101,3 +101,22 @@ class DataladAOMICID1000(PatternDataladDataGrabber): replacements=replacements, confounds_format="fmriprep", ) + + def get_item(self, subject: str) -> Dict: + """Index one element in the dataset. + + Parameters + ---------- + subject : str + The subject ID. + + Returns + ------- + out : dict + Dictionary of paths for each type of data required for the + specified element. + """ + out = super().get_item(subject=subject) + out["BOLD"]["mask_item"] = "BOLD_mask" + out["T1w"]["mask_item"] = "T1w_mask" + return out diff --git a/junifer/datagrabber/aomic/piop1.py b/junifer/datagrabber/aomic/piop1.py index d38feea67..4342a23c7 100644 --- a/junifer/datagrabber/aomic/piop1.py +++ b/junifer/datagrabber/aomic/piop1.py @@ -41,7 +41,9 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber): types = [ "BOLD", "BOLD_confounds", + "BOLD_mask", "T1w", + "T1w_mask", "probseg_CSF", "probseg_GM", "probseg_WM", @@ -83,11 +85,21 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber): "sub-{subject}_task-{task}_" "desc-confounds_regressors.tsv" ), + "BOLD_mask": ( + "derivatives/fmriprep/sub-{subject}/func/" + "sub-{subject}_task-{task}_" + "space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz" + ), "T1w": ( "derivatives/fmriprep/sub-{subject}/anat/" "sub-{subject}_space-MNI152NLin2009cAsym_" "desc-preproc_T1w.nii.gz" ), + "T1w_mask": ( + "derivatives/fmriprep/sub-{subject}/anat/" + "sub-{subject}_space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz" + ), "probseg_CSF": ( "derivatives/fmriprep/sub-{subject}/anat/" "sub-{subject}_space-MNI152NLin2009cAsym_label-" @@ -149,6 +161,8 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber): new_task = f"{task}_acq-{acq}" out = super().get_item(subject=subject, task=new_task) + out["BOLD"]["mask_item"] = "BOLD_mask" + out["T1w"]["mask_item"] = "T1w_mask" return out def get_elements(self) -> List: diff --git a/junifer/datagrabber/aomic/piop2.py b/junifer/datagrabber/aomic/piop2.py index aeae58cb3..b9fad565e 100644 --- a/junifer/datagrabber/aomic/piop2.py +++ b/junifer/datagrabber/aomic/piop2.py @@ -7,7 +7,7 @@ # License: AGPL from pathlib import Path -from typing import List, Union +from typing import List, Union, Dict from junifer.datagrabber import PatternDataladDataGrabber @@ -40,7 +40,9 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber): types = [ "BOLD", "BOLD_confounds", + "BOLD_mask", "T1w", + "T1w_mask", "probseg_CSF", "probseg_GM", "probseg_WM", @@ -80,11 +82,21 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber): "sub-{subject}_task-{task}_acq-seq_" "desc-confounds_regressors.tsv" ), + "BOLD_mask": ( + "derivatives/fmriprep/sub-{subject}/func/" + "sub-{subject}_task-{task}_acq-seq_space" + "-MNI152NLin2009cAsym_desc-brain_mask.nii.gz" + ), "T1w": ( "derivatives/fmriprep/sub-{subject}/anat/" "sub-{subject}_space-MNI152NLin2009cAsym_" "desc-preproc_T1w.nii.gz" ), + "T1w_mask": ( + "derivatives/fmriprep/sub-{subject}/anat/" + "sub-{subject}_space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz" + ), "probseg_CSF": ( "derivatives/fmriprep/sub-{subject}/anat/" "sub-{subject}_space-MNI152NLin2009cAsym_label-" @@ -127,3 +139,25 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber): """ all_elements = super().get_elements() return [x for x in all_elements if x[1] in self.tasks] + + def get_item(self, subject: str, task: str) -> Dict: + """Index one element in the dataset. + + Parameters + ---------- + subject : str + The subject ID. + task : str + The task to get. Possible values are: + {"restingstate", "stopsignal", "emomatching", "workingmemory"} + + Returns + ------- + out : dict + Dictionary of paths for each type of data required for the + specified element. + """ + out = super().get_item(subject=subject, task=task) + out["BOLD"]["mask_item"] = "BOLD_mask" + out["T1w"]["mask_item"] = "T1w_mask" + return out diff --git a/junifer/datagrabber/aomic/tests/test_id1000.py b/junifer/datagrabber/aomic/tests/test_id1000.py index 528325007..29dabb33f 100644 --- a/junifer/datagrabber/aomic/tests/test_id1000.py +++ b/junifer/datagrabber/aomic/tests/test_id1000.py @@ -52,8 +52,8 @@ def test_aomic1000_datagrabber() -> None: assert out["BOLD_confounds"]["path"].is_file() # assert BOLD_mask - assert out["BOLD_masks"]["path"].exists() - + assert out["BOLD_mask"]["path"].exists() + # asserts type "T1w" assert "T1w" in out @@ -67,8 +67,8 @@ def test_aomic1000_datagrabber() -> None: assert out["T1w"]["path"].is_file() # asserts T1w_mask - assert out["T1w_masks"]["path"].exists() - + assert out["T1w_mask"]["path"].exists() + # asserts type "probseg_CSF" assert "probseg_CSF" in out @@ -121,4 +121,4 @@ def test_aomic1000_datagrabber() -> None: meta = out["BOLD"]["meta"] assert "element" in meta assert "subject" in meta["element"] - assert test_element == meta["element"]["subject"] \ No newline at end of file + assert test_element == meta["element"]["subject"] diff --git a/junifer/datagrabber/aomic/tests/test_piop1.py b/junifer/datagrabber/aomic/tests/test_piop1.py index 1378c2dd1..02a15116b 100644 --- a/junifer/datagrabber/aomic/tests/test_piop1.py +++ b/junifer/datagrabber/aomic/tests/test_piop1.py @@ -66,6 +66,9 @@ def test_aomic_piop1_datagrabber() -> None: assert out["BOLD_confounds"]["path"].exists() assert out["BOLD_confounds"]["path"].is_file() + # assert BOLD_mask + assert out["BOLD_mask"]["path"].exists() + # asserts type "T1w" assert "T1w" in out @@ -78,6 +81,9 @@ def test_aomic_piop1_datagrabber() -> None: assert out["T1w"]["path"].exists() assert out["T1w"]["path"].is_file() + # asserts T1w_mask + assert out["T1w_mask"]["path"].exists() + # asserts type "probseg_CSF" assert "probseg_CSF" in out diff --git a/junifer/datagrabber/aomic/tests/test_piop2.py b/junifer/datagrabber/aomic/tests/test_piop2.py index 19f45704d..799381122 100644 --- a/junifer/datagrabber/aomic/tests/test_piop2.py +++ b/junifer/datagrabber/aomic/tests/test_piop2.py @@ -35,7 +35,6 @@ def test_aomic_piop2_datagrabber() -> None: test_element = all_elements[0] sub, task = test_element - out = dg[test_element] # asserts type "BOLD" @@ -62,6 +61,9 @@ def test_aomic_piop2_datagrabber() -> None: assert out["BOLD_confounds"]["path"].exists() assert out["BOLD_confounds"]["path"].is_file() + # assert BOLD_mask + assert out["BOLD_mask"]["path"].exists() + # asserts type "T1w" assert "T1w" in out @@ -74,6 +76,9 @@ def test_aomic_piop2_datagrabber() -> None: assert out["T1w"]["path"].exists() assert out["T1w"]["path"].is_file() + # asserts T1w_mask + assert out["T1w_mask"]["path"].exists() + # asserts type "probseg_CSF" assert "probseg_CSF" in out diff --git a/tools/create_aomic1000_example_dataset.py b/tools/create_aomic1000_example_dataset.py index 7cc98e833..f22b5654f 100644 --- a/tools/create_aomic1000_example_dataset.py +++ b/tools/create_aomic1000_example_dataset.py @@ -1,3 +1,5 @@ +"""Create a testing dataset for the DataladAOMICID1000 pattern datagrabber.""" + # Authors: Federico Raimondo # Vera Komeyer # Xuan Li @@ -8,7 +10,7 @@ from pathlib import Path import datalad.api as dl # repo has to be created on gin manually beforehand if not owner -dst = 'git@gin.g-node.org:/juaml/datalad-example-aomic1000.git' +dst = "git@gin.g-node.org:/juaml/datalad-example-aomic1000.git" # Use this if you create repo directly when pushing (see below) # dst_api = 'git@gin.g-node.org' @@ -19,61 +21,81 @@ with TemporaryDirectory() as tmpdir_name: tmpdir = Path(tmpdir_name) ds = dl.create(tmpdir) # type: ignore - base_dir = tmpdir / 'derivatives' + base_dir = tmpdir / "derivatives" base_dir.mkdir(exist_ok=True, parents=True) - for dtype in ['dwipreproc', 'fmriprep']: + for dtype in ["dwipreproc", "fmriprep"]: dtype_dir = base_dir / dtype dtype_dir.mkdir() for i_sub in range(1, 10): - t_sub = f'sub-{i_sub:04d}' + t_sub = f"sub-{i_sub:04d}" sub_dir = dtype_dir / t_sub sub_dir.mkdir() - if dtype == 'fmriprep': - for dname in ['func', 'anat']: + if dtype == "fmriprep": + for dname in ["func", "anat"]: (sub_dir / dname).mkdir() fnames = [ - (f'anat/{t_sub}_space-MNI152NLin2009cAsym_desc-preproc' - '_T1w.nii.gz'), - (f'anat/{t_sub}_space-MNI152NLin2009cAsym_label-' - 'CSF_probseg.nii.gz'), - (f'anat/{t_sub}_space-MNI152NLin2009cAsym_label-' - 'GM_probseg.nii.gz'), - (f'anat/{t_sub}_space-MNI152NLin2009cAsym_label-' - 'WM_probseg.nii.gz'), - (f'func/{t_sub}_task-moviewatching_space-' - 'MNI152NLin2009cAsym_desc-preproc_bold.nii.gz'), - (f'func/{t_sub}_task-moviewatching_space-' - 'MNI152NLin2009cAsym_desc-preproc_bold.json'), - (f'func/{t_sub}_task-moviewatching_desc-confounds' - '_regressors.tsv'), - (f'func/{t_sub}_task-moviewatching_desc-confounds' - '_regressors.json'), - (f"func/sub-{t_sub}_task-moviewatching_" - "space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz"), - (f"anat/sub-{t_sub}_space-MNI152NLin2009cAsym_" - "desc-brain_mask.nii.gz") + ( + f"anat/{t_sub}_space-MNI152NLin2009cAsym_desc-preproc" + "_T1w.nii.gz" + ), + ( + f"anat/{t_sub}_space-MNI152NLin2009cAsym_label-" + "CSF_probseg.nii.gz" + ), + ( + f"anat/{t_sub}_space-MNI152NLin2009cAsym_label-" + "GM_probseg.nii.gz" + ), + ( + f"anat/{t_sub}_space-MNI152NLin2009cAsym_label-" + "WM_probseg.nii.gz" + ), + ( + f"func/{t_sub}_task-moviewatching_space-" + "MNI152NLin2009cAsym_desc-preproc_bold.nii.gz" + ), + ( + f"func/{t_sub}_task-moviewatching_space-" + "MNI152NLin2009cAsym_desc-preproc_bold.json" + ), + ( + f"func/{t_sub}_task-moviewatching_desc-confounds" + "_regressors.tsv" + ), + ( + f"func/{t_sub}_task-moviewatching_desc-confounds" + "_regressors.json" + ), + ( + f"func/{t_sub}_task-moviewatching_" + "space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz" + ), + ( + f"anat/{t_sub}_space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz" + ), ] - elif dtype == 'dwipreproc': - dname = 'dwi' + elif dtype == "dwipreproc": + dname = "dwi" (sub_dir / dname).mkdir() fnames = [ - (f'{dname}/{t_sub}_desc-preproc_dwi.nii.gz'), + (f"{dname}/{t_sub}_desc-preproc_dwi.nii.gz"), ] for fname in fnames: - with open(sub_dir / fname, 'w') as f: - f.write('placeholder') + with open(sub_dir / fname, "w") as f: + f.write("placeholder") ds.save(recursive=True) # use this to create the repo automatically, only possible for juaml owner # ds.create_sibling_gin( # (org_name/repo_basename).as_posix(), name='gin', existing='reconfigure', # api=dst_api, access_protocol='ssh') - ds.siblings('add', name='gin', url=dst) - ds.push(to='gin', force='all') + ds.siblings("add", name="gin", url=dst) + ds.push(to="gin", force="all") diff --git a/tools/create_aomicpiop1_example_dataset.py b/tools/create_aomicpiop1_example_dataset.py index ca09c625c..a5ff9a192 100644 --- a/tools/create_aomicpiop1_example_dataset.py +++ b/tools/create_aomicpiop1_example_dataset.py @@ -38,6 +38,10 @@ with TemporaryDirectory() as tmpdir_name: f"anat/{t_sub}_space-MNI152NLin2009cAsym_desc-preproc" "_T1w.nii.gz" ), + ( + f"anat/{t_sub}_space-MNI152NLin2009cAsym_" + "desc-brain_mask.nii.gz" + ), ( f"anat/{t_sub}_space-MNI152NLin2009cAsym_label-" "CSF_probseg.nii.gz" @@ -62,28 +66,24 @@ with TemporaryDirectory() as tmpdir_name: ] for t in tasks: fnames.append( - ( - f"func/{t_sub}_task-{t}_space-" - "MNI152NLin2009cAsym_desc-preproc_bold.nii.gz" - ) + f"func/{t_sub}_task-{t}_space-" + "MNI152NLin2009cAsym_desc-preproc_bold.nii.gz" ) fnames.append( - ( - f"func/{t_sub}_task-{t}_space-" - "MNI152NLin2009cAsym_desc-preproc_bold.json" - ) + f"func/{t_sub}_task-{t}_space-" + "MNI152NLin2009cAsym_desc-preproc_bold.json" ) fnames.append( - ( - f"func/{t_sub}_task-{t}_desc-confounds" - "_regressors.tsv" - ) + f"func/{t_sub}_task-{t}_space-" + "MNI152NLin2009cAsym_desc-brain_mask.nii.gz" ) fnames.append( - ( - f"func/{t_sub}_task-{t}_desc-confounds" - "_regressors.json" - ) + f"func/{t_sub}_task-{t}_desc-confounds" + "_regressors.tsv" + ) + fnames.append( + f"func/{t_sub}_task-{t}_desc-confounds" + "_regressors.json" ) elif dtype == "dwipreproc": diff --git a/tools/create_aomicpiop2_example_dataset.py b/tools/create_aomicpiop2_example_dataset.py index c3a5b2035..5d2187b78 100644 --- a/tools/create_aomicpiop2_example_dataset.py +++ b/tools/create_aomicpiop2_example_dataset.py @@ -38,6 +38,10 @@ with TemporaryDirectory() as tmpdir_name: f"anat/{t_sub}_space-MNI152NLin2009cAsym_desc-preproc" "_T1w.nii.gz" ), + ( + f"anat/{t_sub}_space-MNI152NLin2009cAsym" + "_desc-brain_mask.nii.gz" + ), ( f"anat/{t_sub}_space-MNI152NLin2009cAsym_label-" "CSF_probseg.nii.gz" @@ -60,28 +64,24 @@ with TemporaryDirectory() as tmpdir_name: ] for t in tasks: fnames.append( - ( - f"func/{t_sub}_task-{t}_space-" - "MNI152NLin2009cAsym_desc-preproc_bold.nii.gz" - ) + f"func/{t_sub}_task-{t}_space-" + "MNI152NLin2009cAsym_desc-preproc_bold.nii.gz" ) fnames.append( - ( - f"func/{t_sub}_task-{t}_space-" - "MNI152NLin2009cAsym_desc-preproc_bold.json" - ) + f"func/{t_sub}_task-{t}_space-" + "MNI152NLin2009cAsym_desc-preproc_bold.json" ) fnames.append( - ( - f"func/{t_sub}_task-{t}_desc-confounds" - "_regressors.tsv" - ) + f"func/{t_sub}_task-{t}_space-" + "MNI152NLin2009cAsym_desc-brain_mask.nii.gz" ) fnames.append( - ( - f"func/{t_sub}_task-{t}_desc-confounds" - "_regressors.json" - ) + f"func/{t_sub}_task-{t}_desc-confounds" + "_regressors.tsv" + ) + fnames.append( + f"func/{t_sub}_task-{t}_desc-confounds" + "_regressors.json" ) elif dtype == "dwipreproc": -- 2.52.0 From da27a881bd7544b00977e29d2f24dba3fe283d08 Mon Sep 17 00:00:00 2001 From: LeSasse Date: Fri, 27 Jan 2023 14:35:31 +0100 Subject: [PATCH 3/4] resolve conflict in latest.inc --- docs/changes/latest.inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 0207cf57d..5b3176466 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -40,6 +40,9 @@ Enhancements - Add support for nilearn computed masks (``compute_epi_mask``, ``compute_brain_mask``, ``compute_background_mask``, ``fetch_icbm152_brain_gm_mask``) (:gh:`175` by `Fede Raimondo`_). +- Add fMRIprep brain masks to the datagrabber patterns for all datagrabbers in the aomic sub-package + (:gh:`177` by `Leonard Sasse`_) + Bugs ~~~~ -- 2.52.0 From 5352093bacfc2c7f2455b9e0dbe72b61ebcd257c Mon Sep 17 00:00:00 2001 From: LeSasse Date: Mon, 30 Jan 2023 11:51:14 +0100 Subject: [PATCH 4/4] fix latest.inc --- docs/changes/latest.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 5b3176466..83e7cbe37 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -40,8 +40,8 @@ Enhancements - Add support for nilearn computed masks (``compute_epi_mask``, ``compute_brain_mask``, ``compute_background_mask``, ``fetch_icbm152_brain_gm_mask``) (:gh:`175` by `Fede Raimondo`_). -- Add fMRIprep brain masks to the datagrabber patterns for all datagrabbers in the aomic sub-package - (:gh:`177` by `Leonard Sasse`_) +- Add fMRIPrep brain masks to the datagrabber patterns for all datagrabbers in the aomic sub-package + (:gh:`177` by `Leonard Sasse`_). Bugs ~~~~ -- 2.52.0