From 6b3450b212f26e1608ab45c76a6546e6e565ec52 Mon Sep 17 00:00:00 2001 From: Karan Desai Date: Sun, 12 Apr 2026 17:44:36 -0400 Subject: [PATCH 1/4] initial commit with dataset and testfile and docs --- .../datasets/pyhealth.datasets.MRIDataset.rst | 21 ++ pyhealth/datasets/__init__.py | 1 + pyhealth/datasets/mri_dataset.py | 233 ++++++++++++++++++ tests/core/test_mri.py | 94 +++++++ 4 files changed, 349 insertions(+) create mode 100644 docs/api/datasets/pyhealth.datasets.MRIDataset.rst create mode 100644 pyhealth/datasets/mri_dataset.py create mode 100644 tests/core/test_mri.py diff --git a/docs/api/datasets/pyhealth.datasets.MRIDataset.rst b/docs/api/datasets/pyhealth.datasets.MRIDataset.rst new file mode 100644 index 000000000..736c93b03 --- /dev/null +++ b/docs/api/datasets/pyhealth.datasets.MRIDataset.rst @@ -0,0 +1,21 @@ +pyhealth.datasets.MRIDataset +=================================== + +The dataset used is the OASIS MRI dataset (https://sites.wustl.edu/oasisbrains/), which consists of 80,000 brain MRI images. The images have been divided into four classes based on Alzheimer's progression. The dataset aims to provide a valuable resource for analyzing and detecting early signs of Alzheimer's disease. + +To make the dataset accessible, the original .img and .hdr files were converted into Nifti format (.nii) using FSL (FMRIB Software Library). The converted MRI images of 461 patients have been uploaded to a GitHub repository, which can be accessed in multiple parts. + +For the neural network training, 2D images were used as input. The brain images were sliced along the z-axis into 256 pieces, and slices ranging from 100 to 160 were selected from each patient. This approach resulted in a comprehensive dataset for analysis. + +Patient classification was performed based on the provided metadata and Clinical Dementia Rating (CDR) values, resulting in four classes: demented, very mild demented, mild demented, and non-demented. These classes enable the detection and study of different stages of Alzheimer's disease progression. + +During the dataset preparation, the .nii MRI scans were converted to .jpg files. Although this conversion presented some challenges, the files were successfully processed using appropriate tools. The resulting dataset size is 1.3 GB. + +With this comprehensive dataset, the project aims to explore various neural network models and achieve optimal results in Alzheimer's disease detection and analysis. + +Refer to `doc `_ for more information. + +.. autoclass:: pyhealth.datasets.MRIDataset + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/pyhealth/datasets/__init__.py b/pyhealth/datasets/__init__.py index 54e77670c..578eddd73 100644 --- a/pyhealth/datasets/__init__.py +++ b/pyhealth/datasets/__init__.py @@ -60,6 +60,7 @@ def __init__(self, *args, **kwargs): from .mimic3 import MIMIC3Dataset from .mimic4 import MIMIC4CXRDataset, MIMIC4Dataset, MIMIC4EHRDataset, MIMIC4NoteDataset from .mimicextract import MIMICExtractDataset +from .mri_dataset import MRIDataset from .omop import OMOPDataset from .sample_dataset import SampleBuilder, SampleDataset, create_sample_dataset from .shhs import SHHSDataset diff --git a/pyhealth/datasets/mri_dataset.py b/pyhealth/datasets/mri_dataset.py new file mode 100644 index 000000000..e794ffa4e --- /dev/null +++ b/pyhealth/datasets/mri_dataset.py @@ -0,0 +1,233 @@ +""" +PyHealth dataset for the OASIS MRI dataset. + +Dataset link: + https://www.kaggle.com/datasets/ninadaithal/imagesoasis + +Dataset paper: (please cite if you use this dataset) + N. Aithal, A. M. Deshmukh, A. A. Deshmukh, et al. "OASIS: A Publicly Available Dataset for Alzheimer's Disease Research." 2016 IEEE 13th International Symposium on Biomedical Imaging (ISBI), pp. 1222-1225. + +Author: + N. Aithal (nina.aithal@gmail.com) +""" + +from functools import wraps +import sys +import logging +import os +from pathlib import Path +import zipfile +import requests +import tarfile +from typing import List, Optional +import urllib.request +import pandas as pd + +from pyhealth.datasets import BaseDataset +from pyhealth.processors import ImageProcessor +# from pyhealth.tasks import AlzheimerDiseaseClassification + +logger = logging.getLogger(__name__) + +class MRIDataset(BaseDataset): + """Dataset class for the OASIS MRI dataset. + + Attributes: + root (str): Root directory of the raw data. + dataset_name (str): Name of the dataset. + config_path (str): Path to the configuration file. + classes (List[str]): List of classes that appear in the dataset. + """ + classes: List[str] = ["mild_demented", "very_mild_demented", "mild_demented", "non_demented"] + + def __init__(self, + root: str = ".", + config_path: Optional[str] = str(Path(__file__).parent / "configs" / "mri_dataset.yaml"), + download: bool = False, + partial: bool = False, + **kwargs) -> None: + """Initializes the MRI dataset. + + Args: + root (str): Root directory of the raw data. Defaults to the working directory. + config_path (Optional[str]): Path to the configuration file. Defaults to "../configs/mri_dataset.yaml" + download (bool): Whether to download the dataset or use an existing copy. Defaults to False. + partial (bool): Whether to download only a subset of the dataset (specifically, the first image archive). Defaults to False. + + Raises: + ValueError: If the MD5 checksum check fails during the download. + ValueError: If an unexpected number of images are downloaded. + FileNotFoundError: If the dataset path does not exist. + FileNotFoundError: If the dataset path does not contain 'oasis_longitudinal.csv'. + FileNotFoundError: If the dataset path does not contain the 'images' directory. + ValueError: If the dataset 'images' directory does not contain any NIFTI files. + + Example:: + >>> dataset = MRIDataset(root="./data") + """ + self._label_path: str = os.path.join(root, "labels") + self._image_path: str = os.path.join(root, "images") + + if download: + self._download(root, partial) + + self._verify_data(root) + self._index_data(root) + + super().__init__( + root=root, + tables=["mri_dataset"], + dataset_name="MRI Dataset", + config_path=config_path, + **kwargs + ) + + ''' add these tests later when we have the AlzheimerDiseaseClassification task + @property + def default_task(self) -> AlzheimerDiseaseClassification: + """Returns the default task for this dataset. + + Returns: + AlzheimerDiseaseClassification: The default classification task. + + Example:: + >>> dataset = MRIDataset() + >>> task = dataset.default_task + """ + return AlzheimerDiseaseClassification() + ''' + + @wraps(BaseDataset.set_task) + def set_task(self, *args, **kwargs): + input_processors = kwargs.get("input_processors", None) + + if input_processors is None: + input_processors = {} + + if "mri" not in input_processors: + input_processors["mri"] = MRIImageProcessor(mode='L') + + kwargs["input_processors"] = input_processors + + return super().set_task(*args, **kwargs) + + set_task.__doc__ = ( + f"{set_task.__doc__}\n" + " Note:\n" + " If no mri processor is provided, a default `MRIImageProcessor` is injected. " + "This is needed because the MRI dataset mris do not all have the same number of channels, " + "causing the default PyHealth mri processor to fail." + ) + + def _download(self, root: str, partial: bool) -> None: + """Downloads and verifies the MRI dataset files. + + This method performs the following steps: + 1. Downloads the label CSV file from the shared NIH Box folder. + 2. Downloads compressed mri archives from static NIH Box links. + 3. Verifies the integrity of each downloaded file using its MD5 checksum. + 4. Extracts the mri archives to the dataset directory. + 5. Removes the original compressed files after successful extraction. + 6. Validates that the expected number of mris are present in the mri directory. + + Args: + root (str): Root directory of the raw data. + partial (bool): Whether to download only a subset of the dataset (specifically, the first mri archive). + + Raises: + ValueError: If the MD5 checksum check fails during the download. + ValueError: If an mri tar file contains an unsafe path. + ValueError: If an unexpected number of mris are downloaded. + + curl -L -o root/imagesoasis.zip https://www.kaggle.com/api/v1/datasets/download/ninadaithal/imagesoasis + """ + response = requests.get('https://www.kaggle.com/api/v1/datasets/download/ninadaithal/imagesoasis', stream=True) + logger.info("Downloading dataset for processing") + + zip_path = Path(root) / "imagesoasis.zip" + logger.info(f"Downloaded to: {zip_path}") + with open(zip_path, "wb") as f: + f.write(response.content) + with zipfile.ZipFile(zip_path, "r") as zip_ref: + zip_ref.extractall(self._image_path) + logger.info(f"Counting MRIs in {self._image_path}") + num_mris = 0 + for root, dirs, files in os.walk(self._image_path): + num_mris += len(files) + + logger.info(f"Downloaded {num_mris} mris") + logger.info("Download complete") + + def _verify_data(self, root: str) -> None: + """Verifies the presence and structure of the dataset directory. + + Checks for the existence of the dataset root path, the CSV file containing + image labels, the image directory, and at least one PNG image file. + + This method ensures that the dataset has been properly downloaded and extracted + before any further processing. + + Args: + root (str): Root directory of the raw data. + + Raises: + FileNotFoundError: If the dataset path does not exist. + FileNotFoundError: If the dataset path does not contain 'Data_Entry_2017_v2020.csv'. + FileNotFoundError: If the dataset path does not contain the 'images' directory. + ValueError: If the dataset 'images' directory does not contain any PNG files. + """ + if not os.path.exists(root): + msg = "Dataset path does not exist!" + logger.error(f"Looking for root directory: {root}") + logger.error(msg) + raise FileNotFoundError(msg) + if not os.path.exists(self._image_path): + msg = "Dataset path must contain an 'images' directory!" + logger.error(msg) + raise FileNotFoundError(msg) + ''' not sure these tests are needed + if not os.path.isfile(self._label_path): + msg = "Dataset path must contain 'Data_Entry_2017_v2020.csv'!" + logger.error(msg) + raise FileNotFoundError(msg) + if not list(Path(self._image_path).glob("*.png")): + msg = "Dataset 'images' directory must contain PNG files!" + logger.error(msg) + raise ValueError(msg) + ''' + + def _index_data(self, root: str) -> pd.DataFrame: + """Parses and indexes metadata for all available images in the dataset. + + Args: + root (str): Root directory of the raw data. + + Returns: + pd.DataFrame: Table of image paths and metadata. + + Raises: + FileNotFoundError: If the label CSV file does not exist. + ValueError: If no matching image files are found in the CSV. + """ + df = pd.read_csv(self._label_path) + image_names = [f.name for f in Path(self._image_path).iterdir() if f.is_file()] + df = df[df["Image Index"].isin(image_names)] + + for _class in self.classes: + df[_class] = df['Finding Labels'].str.contains(_class, case=False).astype(int) + + df.drop(columns=["Finding Labels"], inplace=True) + df.rename(columns={'Image Index': 'path', + 'Follow-up #': 'visit_id', + 'Patient ID': 'patient_id', + 'Patient Age': 'patient_age', + 'Patient Sex': 'patient_sex', + 'View Position': 'view_position', + 'OriginalImage[Width': 'original_image_width', + 'Height]': 'original_image_height', + 'OriginalImagePixelSpacing[x': 'original_image_pixel_spacing_x', + 'y]': 'original_image_pixel_spacing_y'}, inplace=True) + df['path'] = df['path'].apply(lambda p: os.path.join(self._image_path, p)) + df.to_csv(os.path.join(root, "chestxray14-metadata-pyhealth.csv"), index=False) + + return df \ No newline at end of file diff --git a/tests/core/test_mri.py b/tests/core/test_mri.py new file mode 100644 index 000000000..462d5ce0e --- /dev/null +++ b/tests/core/test_mri.py @@ -0,0 +1,94 @@ +""" +Unit tests for the MRIDataset, AlzheimerDiseaseClassification classes. + +Author: + Soheil Golara (sgolara@illinois.edu), Karan Desai (kdesai2@illinois.edu) +""" +from pathlib import Path +import tempfile +import unittest + +import numpy as np +from PIL import Image + +from pyhealth.datasets import MRIDataset +# from pyhealth.tasks import AlzheimerDiseaseClassification + +class TestMRIDataset(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.root = Path(__file__).parent.parent.parent / "test-resources" / "core" / "mri" + cls.cache_dir = tempfile.TemporaryDirectory() + cls.dataset = MRIDataset(cls.root, cache_dir=cls.cache_dir.name, download=True, partial=True) + + # cls.samples_alzheimer = cls.dataset.set_task(AlzheimerDiseaseClassification(disease="alzheimer")) + + @classmethod + def tearDownClass(cls): + cls.samples_alzheimer.close() + + Path(cls.dataset.root / "mri-metadata-pyhealth.csv").unlink() + + @classmethod + def generate_fake_images(cls): + with open(Path(cls.root / "oasis_longitudinal.csv"), 'r') as f: + lines = f.readlines() + + for line in lines[1:]: # Skip header row + name = line.split(',')[0] + mri = Image.fromarray(np.random.randint(0, 256, (224, 224, 4), dtype=np.uint8)) + mri.save(Path(cls.root / "oasis_longitudinal_nifti" / name)) + + def test_stats(self): + self.dataset.stats() + + def test_num_patients(self): + self.assertEqual(len(self.dataset.unique_patient_ids), 3) + + def test_get_patient_1(self): + events = self.dataset.get_patient('1').get_events() + + self.assertEqual(len(events), 3) + + self.assertEqual(events[0]['visit_id'], '0') + self.assertEqual(events[0]['patient_age'], '57') + self.assertEqual(events[0]['mild_demented'], '1') + self.assertEqual(events[0]['effusion'], '0') + self.assertEqual(events[0]['very_mild_demented'], '0') + self.assertEqual(events[0]['non_demented'], '0') + + def test_get_patient_2(self): + events = self.dataset.get_patient('2').get_events() + + self.assertEqual(len(events), 1) + self.assertEqual(events[0]['visit_id'], '0') + self.assertEqual(events[0]['patient_age'], '80') + self.assertEqual(events[0]['mild_demented'], '0') + self.assertEqual(events[0]['very_mild_demented'], '0') + self.assertEqual(events[0]['non_demented'], '1') + + def test_get_patient_3(self): + events = self.dataset.get_patient('3').get_events() + + self.assertEqual(len(events), 6) + + self.assertEqual(events[0]['mild_demented'], '0') + self.assertEqual(events[0]['very_mild_demented'], '0') + self.assertEqual(events[0]['non_demented'], '1') + + ''' add these tests later when we have the AlzheimerDiseaseClassification task + def test_default_task(self): + self.assertIsInstance(self.dataset.default_task, AlzheimerDiseaseClassification) + + def test_task_given_invalid_disease(self): + with self.assertRaises(ValueError): + _ = AlzheimerDiseaseClassification(disease="arthritis") + + def test_task_classify_cardiomegaly(self): + self.assertEqual(len(self.samples_alzheimer), 10) + self.assertEqual(sum(sample["mild_demented"] for sample in self.samples_alzheimer), 3) + ''' + + +if __name__ == "__main__": + unittest.main() From 3c059317a400479ddb55cfdd9651b653cb3e6dc4 Mon Sep 17 00:00:00 2001 From: Karan Desai Date: Sun, 12 Apr 2026 17:50:06 -0400 Subject: [PATCH 2/4] docs change Co-authored-by: Soheil Golara sgolara2@illinois.edu --- docs/api/datasets/pyhealth.datasets.MRIDataset.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/datasets/pyhealth.datasets.MRIDataset.rst b/docs/api/datasets/pyhealth.datasets.MRIDataset.rst index 736c93b03..a80afffb5 100644 --- a/docs/api/datasets/pyhealth.datasets.MRIDataset.rst +++ b/docs/api/datasets/pyhealth.datasets.MRIDataset.rst @@ -13,7 +13,7 @@ During the dataset preparation, the .nii MRI scans were converted to .jpg files. With this comprehensive dataset, the project aims to explore various neural network models and achieve optimal results in Alzheimer's disease detection and analysis. -Refer to `doc `_ for more information. +Refer to `doc `_ for more information. .. autoclass:: pyhealth.datasets.MRIDataset :members: From 27743548ba5fbd0e792277ecd000c6b62b1f861b Mon Sep 17 00:00:00 2001 From: Karan Desai Date: Sun, 12 Apr 2026 19:23:45 -0400 Subject: [PATCH 3/4] creating df --- .gitignore | 442 ++++++++++++++++++++++++++++++- pyhealth/datasets/mri_dataset.py | 49 ++-- 2 files changed, 464 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 9993737db..e23d5a131 100644 --- a/.gitignore +++ b/.gitignore @@ -139,4 +139,444 @@ data/physionet.org/ .vscode/ # Model weight files (large binaries, distributed separately) -weightfiles/ \ No newline at end of file +weightfiles/ +test-resources/core/mri/.~lock.oasis_cross-sectional.csv# +test-resources/core/mri/imagesoasis.zip +test-resources/core/mri/oasis_cross-sectional_facts.pdf +test-resources/core/mri/oasis_cross-sectional.csv +test-resources/core/mri/oasis/OASIS/OAS1_0001_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0002_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0003_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0004_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0005_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0006_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0007_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0009_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0010_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0011_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0012_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0013_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0014_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0015_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0016_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0017_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0018_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0019_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0020_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0021_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0022_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0023_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0025_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0026_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0027_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0028_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0029_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0030_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0031_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0032_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0033_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0034_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0035_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0037_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0038_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0039_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0040_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0041_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0042_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0043_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0044_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0045_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0046_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0047_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0049_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0050_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0051_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0052_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0053_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0054_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0055_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0056_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0057_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0058_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0059_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0060_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0061_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0061_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0062_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0063_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0064_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0065_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0066_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0067_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0068_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0069_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0070_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0071_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0072_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0073_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0074_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0075_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0076_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0077_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0078_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0079_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0080_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0080_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0081_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0082_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0083_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0084_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0085_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0086_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0087_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0088_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0090_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0091_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0092_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0092_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0094_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0095_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0096_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0097_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0098_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0099_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0101_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0101_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0102_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0103_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0104_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0105_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0106_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0107_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0108_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0109_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0110_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0111_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0111_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0112_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0113_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0114_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0115_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0116_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0117_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0117_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0119_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0120_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0121_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0122_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0123_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0124_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0125_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0126_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0127_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0129_MR1_mpr_n4_fdcanon_sbj_111.4dfp_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0130_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0131_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0132_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0133_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0134_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0135_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0136_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0137_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0138_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0139_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0140_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0141_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0142_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0143_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0144_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0145_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0145_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0146_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0147_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0148_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0150_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0150_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0151_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0152_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0153_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0155_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0156_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0156_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0157_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0158_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0159_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0160_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0161_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0162_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0163_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0164_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0165_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0166_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0167_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0168_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0169_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0170_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0173_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0174_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0176_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0177_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0178_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0179_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0180_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0181_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0182_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0183_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0184_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0185_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0186_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0188_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0189_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0190_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0191_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0191_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0192_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0193_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0195_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0197_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0198_MR1_mpr_n4_fdcanon_sbj_111.4dfp_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0199_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0200_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0201_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0202_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0202_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0203_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0204_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0205_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0206_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0207_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0208_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0209_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0210_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0211_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0212_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0213_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0214_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0216_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0217_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0218_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0220_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0221_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0222_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0223_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0224_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0226_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0227_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0228_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0229_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0230_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0230_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0231_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0232_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0233_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0234_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0235_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0236_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0236_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0237_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0238_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0239_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0239_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0240_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0241_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0243_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0244_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0246_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0247_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0249_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0249_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0250_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0253_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0254_MR1_mpr_n6_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0255_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0256_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0258_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0259_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0260_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0261_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0262_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0263_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0264_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0265_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0266_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0267_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0268_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0269_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0270_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0271_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0272_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0273_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0274_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0275_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0277_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0278_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0279_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0280_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0281_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0282_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0283_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0284_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0285_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0285_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0286_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0287_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0288_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0289_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0290_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0291_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0292_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0293_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0294_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0295_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0296_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0298_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0299_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0300_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0301_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0302_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0303_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0304_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0305_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0307_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0308_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0309_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0310_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0311_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0312_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0313_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0314_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0315_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0316_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0317_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0318_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0319_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0321_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0322_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0323_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0325_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0326_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0327_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0328_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0329_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0330_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0331_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0332_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0333_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0335_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0336_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0337_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0338_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0339_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0340_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0341_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0342_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0343_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0344_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0345_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0346_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0348_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0349_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0350_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0351_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0352_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0353_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0353_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0354_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0355_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0356_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0357_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0358_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0359_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0361_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0362_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0363_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0365_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0366_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0367_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0368_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0368_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0369_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0370_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0371_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0372_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0373_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0374_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0375_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0376_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0377_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0378_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0379_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0379_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0380_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0381_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0382_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0383_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0384_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0385_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0386_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0387_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0388_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0389_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0390_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0392_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0394_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0395_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0395_MR2_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0396_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0397_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0398_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0399_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0400_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0401_MR1_mpr_n5_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0402_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0403_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0404_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0405_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0406_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0407_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0408_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0409_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0410_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0411_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0413_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0415_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0416_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0417_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0418_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0419_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0420_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0421_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0422_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0423_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0424_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0425_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0426_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0428_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0429_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0430_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0431_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0432_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0433_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0434_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0435_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0437_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0438_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0439_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0440_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0441_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0442_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0443_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0444_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0445_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0446_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0447_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0448_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0449_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0450_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0451_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0452_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0453_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0454_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0455_MR1_mpr_n3_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0456_MR1_mpr_n4_anon_sbj_111_normalised.nii +test-resources/core/mri/oasis/OASIS/OAS1_0457_MR1_mpr_n3_anon_sbj_111_normalised.nii diff --git a/pyhealth/datasets/mri_dataset.py b/pyhealth/datasets/mri_dataset.py index e794ffa4e..2534eb356 100644 --- a/pyhealth/datasets/mri_dataset.py +++ b/pyhealth/datasets/mri_dataset.py @@ -65,8 +65,8 @@ def __init__(self, Example:: >>> dataset = MRIDataset(root="./data") """ - self._label_path: str = os.path.join(root, "labels") - self._image_path: str = os.path.join(root, "images") + self._label_path: str = os.path.join(root, "oasis_cross-sectional.csv") + self._image_path: str = os.path.join(root, "oasis/OASIS") if download: self._download(root, partial) @@ -141,7 +141,7 @@ def _download(self, root: str, partial: bool) -> None: curl -L -o root/imagesoasis.zip https://www.kaggle.com/api/v1/datasets/download/ninadaithal/imagesoasis """ - response = requests.get('https://www.kaggle.com/api/v1/datasets/download/ninadaithal/imagesoasis', stream=True) + response = requests.get('https://www.kaggle.com/api/v1/datasets/download/ninadaithal/oasis-1-shinohara', stream=True) logger.info("Downloading dataset for processing") zip_path = Path(root) / "imagesoasis.zip" @@ -149,10 +149,10 @@ def _download(self, root: str, partial: bool) -> None: with open(zip_path, "wb") as f: f.write(response.content) with zipfile.ZipFile(zip_path, "r") as zip_ref: - zip_ref.extractall(self._image_path) - logger.info(f"Counting MRIs in {self._image_path}") + zip_ref.extractall(Path(root)) + logger.info(f"Counting MRIs in {Path(root)}") num_mris = 0 - for root, dirs, files in os.walk(self._image_path): + for root, dirs, files in os.walk(Path(root)): num_mris += len(files) logger.info(f"Downloaded {num_mris} mris") @@ -185,16 +185,14 @@ def _verify_data(self, root: str) -> None: msg = "Dataset path must contain an 'images' directory!" logger.error(msg) raise FileNotFoundError(msg) - ''' not sure these tests are needed if not os.path.isfile(self._label_path): - msg = "Dataset path must contain 'Data_Entry_2017_v2020.csv'!" + msg = "Dataset path must contain 'oasis_cross-sectional.csv'!" logger.error(msg) raise FileNotFoundError(msg) - if not list(Path(self._image_path).glob("*.png")): - msg = "Dataset 'images' directory must contain PNG files!" + if not list(Path(self._image_path).glob("*.nii")): + msg = "Dataset 'images' directory must contain NII files!" logger.error(msg) - raise ValueError(msg) - ''' + raise ValueError(msg) def _index_data(self, root: str) -> pd.DataFrame: """Parses and indexes metadata for all available images in the dataset. @@ -210,24 +208,23 @@ def _index_data(self, root: str) -> pd.DataFrame: ValueError: If no matching image files are found in the CSV. """ df = pd.read_csv(self._label_path) - image_names = [f.name for f in Path(self._image_path).iterdir() if f.is_file()] - df = df[df["Image Index"].isin(image_names)] - + # image_names = [f.name[0:f.name.find("_mpr")] for f in Path(self._image_path).iterdir() if f.is_file()] + df['img_path'] = df['ID'] + '_mpr_n3_anon_sbj_111_normalised.nii' + ''' don't think we need this piece for _class in self.classes: df[_class] = df['Finding Labels'].str.contains(_class, case=False).astype(int) - df.drop(columns=["Finding Labels"], inplace=True) df.rename(columns={'Image Index': 'path', - 'Follow-up #': 'visit_id', - 'Patient ID': 'patient_id', - 'Patient Age': 'patient_age', - 'Patient Sex': 'patient_sex', - 'View Position': 'view_position', - 'OriginalImage[Width': 'original_image_width', - 'Height]': 'original_image_height', - 'OriginalImagePixelSpacing[x': 'original_image_pixel_spacing_x', - 'y]': 'original_image_pixel_spacing_y'}, inplace=True) + 'Follow-up #': 'visit_id', + 'Patient ID': 'patient_id', + 'Patient Age': 'patient_age', + 'Patient Sex': 'patient_sex', + 'View Position': 'view_position', + 'OriginalImage[Width': 'original_image_width', + 'Height]': 'original_image_height', + 'OriginalImagePixelSpacing[x': 'original_image_pixel_spacing_x', + 'y]': 'original_image_pixel_spacing_y'}, inplace=True) df['path'] = df['path'].apply(lambda p: os.path.join(self._image_path, p)) df.to_csv(os.path.join(root, "chestxray14-metadata-pyhealth.csv"), index=False) - + ''' return df \ No newline at end of file From 9b47b7ca768c0028a737bc39618ce6a6d45cddf4 Mon Sep 17 00:00:00 2001 From: Karan Desai Date: Sun, 12 Apr 2026 19:29:30 -0400 Subject: [PATCH 4/4] dataset config --- pyhealth/datasets/configs/mri.yaml | 19 +++++++++++++++++++ pyhealth/datasets/mri_dataset.py | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 pyhealth/datasets/configs/mri.yaml diff --git a/pyhealth/datasets/configs/mri.yaml b/pyhealth/datasets/configs/mri.yaml new file mode 100644 index 000000000..ff58715d4 --- /dev/null +++ b/pyhealth/datasets/configs/mri.yaml @@ -0,0 +1,19 @@ +version: "1.0" +tables: + mri: + file_path: "mri-metadata-pyhealth.csv" + patient_id: "id" + timestamp: null + attributes: + - "img_path" + - "sex" + - "dominant_hand" + - "age" + - "education" + - "ses" + - "mmse" + - "cdr" + - "etiv" + - "nwbv" + - "asf" + - "delay" \ No newline at end of file diff --git a/pyhealth/datasets/mri_dataset.py b/pyhealth/datasets/mri_dataset.py index 2534eb356..e350a4f7b 100644 --- a/pyhealth/datasets/mri_dataset.py +++ b/pyhealth/datasets/mri_dataset.py @@ -225,6 +225,7 @@ def _index_data(self, root: str) -> pd.DataFrame: 'OriginalImagePixelSpacing[x': 'original_image_pixel_spacing_x', 'y]': 'original_image_pixel_spacing_y'}, inplace=True) df['path'] = df['path'].apply(lambda p: os.path.join(self._image_path, p)) - df.to_csv(os.path.join(root, "chestxray14-metadata-pyhealth.csv"), index=False) ''' + df.to_csv(os.path.join(root, "mri-metadata-pyhealth.csv"), index=False) + return df \ No newline at end of file