[BUG]: HCP1200 datagrabber does not provide the correct BOLD files #183

Merged
fraimondo merged 5 commits from fix/183 into main 2023-03-31 10:11:42 +00:00
5 changed files with 97 additions and 24 deletions

View file

@ -0,0 +1 @@
Fix a bug in which only ``REST1`` and ``REST2`` tasks could be accesed in :class:`.DataladHCP1200` and :class:`.HCP1200` datagrabbers by `Fede Raimondo`_
synchon commented 2023-03-31 08:47:28 +00:00 (Migrated from github.com)
``REST1`` and ``REST2``
``` ``REST1`` and ``REST2`` ```

View file

@ -0,0 +1 @@
Add ``ica_fix`` parameter to :class:`.DataladHCP1200` and :class:`.HCP1200` datagrabbers to allow for selecting data processed with ICA+FIX. Default value is ``False`` which changes behaviour since 0.0.1 release. By `Fede Raimondo`_

View file

@ -26,9 +26,12 @@ class HCP1200(PatternDataGrabber):
phase_encodings : {"LR", "RL"} or list of the options, optional
synchon commented 2023-03-31 08:48:52 +00:00 (Migrated from github.com)

Whether to retrieve data ...

Whether to retrieve data ...
fraimondo commented 2023-03-31 09:29:14 +00:00 (Migrated from github.com)

damn copilot

damn copilot
HCP phase encoding directions. If None, both will be used
(default None).
ica_fix : bool, optional
Whether to retrieve data that was processed with ICA+FIX.
Only 'REST1' and 'REST2' tasks are available with ICA+FIX (default
False).
**kwargs
Keyword arguments passed to superclass.
"""
def __init__(
@ -36,6 +39,7 @@ class HCP1200(PatternDataGrabber):
datadir: Union[str, Path],
tasks: Union[str, List[str], None] = None,
phase_encodings: Union[str, List[str], None] = None,
ica_fix: bool = False,
**kwargs,
) -> None:
# All tasks
@ -82,6 +86,12 @@ class HCP1200(PatternDataGrabber):
f"{all_phase_encodings}."
synchon commented 2023-03-31 08:49:38 +00:00 (Migrated from github.com)

if ica_fix:?

```if ica_fix:```?
synchon commented 2023-03-31 08:50:19 +00:00 (Migrated from github.com)

... if ica_fix else ...?

```... if ica_fix else ...```?
)
if ica_fix:
if not all([task in ["REST1", "REST2"] for task in self.tasks]):
raise_error(
"ICA+FIX is only available for 'REST1' and 'REST2' tasks."
)
suffix = "_hp2000_clean" if ica_fix else ""
# The types of data
types = ["BOLD"]
# The patterns
@ -89,7 +99,8 @@ class HCP1200(PatternDataGrabber):
"BOLD": (
"{subject}/MNINonLinear/Results/"
"{task}_{phase_encoding}/"
"{task}_{phase_encoding}_hp2000_clean.nii.gz"
"{task}_{phase_encoding}"
f"{suffix}.nii.gz"
)
}
# The replacements
@ -173,6 +184,10 @@ class DataladHCP1200(DataladDataGrabber, HCP1200):
phase_encodings : {"LR", "RL"} or list of the options, optional
synchon commented 2023-03-31 08:51:15 +00:00 (Migrated from github.com)

icafix => ica_fix

icafix => ica_fix
synchon commented 2023-03-31 08:51:28 +00:00 (Migrated from github.com)

Whether to retrieve data ...

Whether to retrieve data ...
HCP phase encoding directions. If None, both will be used
(default None).
ica_fix : bool, optional
Whether to retrieve data that was processed with ICA+FIX.
Only 'REST1' and 'REST2' tasks are available with ICA+FIX (default
False).
"""
def __init__(
@ -180,6 +195,7 @@ class DataladHCP1200(DataladDataGrabber, HCP1200):
datadir: Union[str, Path, None] = None,
tasks: Union[str, List[str], None] = None,
phase_encodings: Union[str, List[str], None] = None,
ica_fix: bool = False,
) -> None:
uri = (
"https://github.com/datalad-datasets/"
@ -192,6 +208,7 @@ class DataladHCP1200(DataladDataGrabber, HCP1200):
phase_encodings=phase_encodings,
uri=uri,
rootdir=rootdir,
ica_fix=ica_fix,
)
@property

View file

@ -29,33 +29,38 @@ def hcpdg() -> Iterable[DataladHCP1200]:
@pytest.mark.parametrize(
"tasks, phase_encodings, expected_path_name",
"tasks, phase_encodings, ica_fix, expected_path_name",
[
(None, None, "rfMRI_REST1_LR_hp2000_clean.nii.gz"),
("REST1", "LR", "rfMRI_REST1_LR_hp2000_clean.nii.gz"),
("REST1", "RL", "rfMRI_REST1_RL_hp2000_clean.nii.gz"),
("REST2", "LR", "rfMRI_REST2_LR_hp2000_clean.nii.gz"),
("REST2", "RL", "rfMRI_REST2_RL_hp2000_clean.nii.gz"),
("SOCIAL", "LR", "tfMRI_SOCIAL_LR_hp2000_clean.nii.gz"),
("SOCIAL", "RL", "tfMRI_SOCIAL_RL_hp2000_clean.nii.gz"),
("WM", "LR", "tfMRI_WM_LR_hp2000_clean.nii.gz"),
("WM", "RL", "tfMRI_WM_RL_hp2000_clean.nii.gz"),
("RELATIONAL", "LR", "tfMRI_RELATIONAL_LR_hp2000_clean.nii.gz"),
("RELATIONAL", "RL", "tfMRI_RELATIONAL_RL_hp2000_clean.nii.gz"),
("EMOTION", "LR", "tfMRI_EMOTION_LR_hp2000_clean.nii.gz"),
("EMOTION", "RL", "tfMRI_EMOTION_RL_hp2000_clean.nii.gz"),
("LANGUAGE", "LR", "tfMRI_LANGUAGE_LR_hp2000_clean.nii.gz"),
("LANGUAGE", "RL", "tfMRI_LANGUAGE_RL_hp2000_clean.nii.gz"),
("GAMBLING", "LR", "tfMRI_GAMBLING_LR_hp2000_clean.nii.gz"),
("GAMBLING", "RL", "tfMRI_GAMBLING_RL_hp2000_clean.nii.gz"),
("MOTOR", "LR", "tfMRI_MOTOR_LR_hp2000_clean.nii.gz"),
("MOTOR", "RL", "tfMRI_MOTOR_RL_hp2000_clean.nii.gz"),
(None, None, False, "rfMRI_REST1_LR.nii.gz"),
("REST1", "LR", False, "rfMRI_REST1_LR.nii.gz"),
("REST1", "RL", False, "rfMRI_REST1_RL.nii.gz"),
("REST2", "LR", False, "rfMRI_REST2_LR.nii.gz"),
("REST2", "RL", False, "rfMRI_REST2_RL.nii.gz"),
("SOCIAL", "LR", False, "tfMRI_SOCIAL_LR.nii.gz"),
("SOCIAL", "RL", False, "tfMRI_SOCIAL_RL.nii.gz"),
("WM", "LR", False, "tfMRI_WM_LR.nii.gz"),
("WM", "RL", False, "tfMRI_WM_RL.nii.gz"),
("RELATIONAL", "LR", False, "tfMRI_RELATIONAL_LR.nii.gz"),
("RELATIONAL", "RL", False, "tfMRI_RELATIONAL_RL.nii.gz"),
("EMOTION", "LR", False, "tfMRI_EMOTION_LR.nii.gz"),
("EMOTION", "RL", False, "tfMRI_EMOTION_RL.nii.gz"),
("LANGUAGE", "LR", False, "tfMRI_LANGUAGE_LR.nii.gz"),
("LANGUAGE", "RL", False, "tfMRI_LANGUAGE_RL.nii.gz"),
("GAMBLING", "LR", False, "tfMRI_GAMBLING_LR.nii.gz"),
("GAMBLING", "RL", False, "tfMRI_GAMBLING_RL.nii.gz"),
("MOTOR", "LR", False, "tfMRI_MOTOR_LR.nii.gz"),
("MOTOR", "RL", False, "tfMRI_MOTOR_RL.nii.gz"),
("REST1", "LR", True, "rfMRI_REST1_LR_hp2000_clean.nii.gz"),
("REST1", "RL", True, "rfMRI_REST1_RL_hp2000_clean.nii.gz"),
("REST2", "LR", True, "rfMRI_REST2_LR_hp2000_clean.nii.gz"),
("REST2", "RL", True, "rfMRI_REST2_RL_hp2000_clean.nii.gz"),
],
)
def test_hcp1200_datagrabber(
hcpdg: DataladHCP1200,
tasks: Optional[str],
phase_encodings: Optional[str],
ica_fix: bool,
expected_path_name: str,
) -> None:
"""Test HCP1200 datagrabber.
@ -69,6 +74,8 @@ def test_hcp1200_datagrabber(
The parametrized tasks.
phase_encodings : str
The parametrized phase encodings.
ica_fix : bool
The parametrized ICA-FIX flag.
expected_path_name : str
The parametrized expected path name.
@ -78,6 +85,7 @@ def test_hcp1200_datagrabber(
datadir=hcpdg.datadir,
tasks=tasks,
phase_encodings=phase_encodings,
ica_fix=ica_fix,
)
# Get all elements
all_elements = dg.get_elements()
@ -342,3 +350,38 @@ def test_hcp1200_datagrabber_elements(
assert element[2] in ["LR", "RL"]
assert set(found_subjects) == set(expected_subjects)
@pytest.mark.parametrize(
"tasks, ica_fix",
[
("SOCIAL", True),
("WM", True),
("RELATIONAL", True),
("EMOTION", True),
("LANGUAGE", True),
("GAMBLING", True),
("MOTOR", True),
],
)
def test_hcp1200_datagrabber_incorrect_access_icafix(
tasks: Optional[str],
ica_fix: bool
) -> None:
"""Test HCP1200 datagrabber incorrect access for icafix.
Parameters
----------
tasks : str
The parametrized tasks.
ica_fix : bool
The parametrized ICA-FIX flag.
"""
configure_logging(level="DEBUG")
with pytest.raises(ValueError, match="is only available for"):
_ = HCP1200(
datadir=".",
tasks=tasks,
ica_fix=ica_fix,
)

View file

@ -22,7 +22,7 @@ if __name__ == "__main__":
# Set base directory
basedir = tmpdir_path / "example_hcp1200"
# Create new datalad dataset
dataset = dl.create(path=str(basedir.absolute()))
dataset = dl.create(path=str(basedir.absolute())) # type: ignore
# Generate subject directories
for sub in range(1, 10):
subdir = basedir / f"sub-{sub:02d}"
@ -57,15 +57,26 @@ if __name__ == "__main__":
)
# Create subject data directory
sub_datadir.mkdir(parents=True)
# Set subject data file
sub_datafile = (
sub_datadir
/ f"{new_task}_{phase_encoding}_hp2000_clean.nii.gz"
/ f"{new_task}_{phase_encoding}.nii.gz"
)
# Create subject data file
with open(sub_datafile, "w") as f:
f.write("placeholder")
if "REST" in task:
# Set subject data file with ICA+FIX
sub_datafile = (
sub_datadir
/ f"{new_task}_{phase_encoding}_hp2000_clean.nii.gz"
)
# Create subject data file with ICA+FIX
with open(sub_datafile, "w") as f:
f.write("placeholder")
# Save datalad dataset
dataset.save(recursive=True)
# Add datalad sibling