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/docs/api/datasets/pyhealth.datasets.MRIDataset.rst b/docs/api/datasets/pyhealth.datasets.MRIDataset.rst new file mode 100644 index 000000000..a80afffb5 --- /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/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 new file mode 100644 index 000000000..e350a4f7b --- /dev/null +++ b/pyhealth/datasets/mri_dataset.py @@ -0,0 +1,231 @@ +""" +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, "oasis_cross-sectional.csv") + self._image_path: str = os.path.join(root, "oasis/OASIS") + + 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/oasis-1-shinohara', 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(Path(root)) + logger.info(f"Counting MRIs in {Path(root)}") + num_mris = 0 + for root, dirs, files in os.walk(Path(root)): + 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) + if not os.path.isfile(self._label_path): + msg = "Dataset path must contain 'oasis_cross-sectional.csv'!" + logger.error(msg) + raise FileNotFoundError(msg) + if not list(Path(self._image_path).glob("*.nii")): + msg = "Dataset 'images' directory must contain NII 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[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) + df['path'] = df['path'].apply(lambda p: os.path.join(self._image_path, p)) + ''' + df.to_csv(os.path.join(root, "mri-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()