import os import re import pandas import pytest from freesurfer_volume_reader.freesurfer import HippocampalSubfieldsVolumeFile from conftest import SUBJECTS_DIR, assert_volume_frames_equal @pytest.mark.parametrize(('volume_file_path', 'expected_attrs'), [ ('bert/mri/lh.hippoSfVolumes-T1.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': True, 'analysis_id': None}), ('bert/mri/lh.hippoSfVolumes-T1-T2.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': True, 'analysis_id': 'T2'}), ('bert/mri/lh.hippoSfVolumes-T2.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': False, 'analysis_id': 'T2'}), ('bert/mri/lh.hippoSfVolumes-T1-T2-high-res.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': True, 'analysis_id': 'T2-high-res'}), ('bert/mri/lh.hippoSfVolumes-T2-high-res.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': False, 'analysis_id': 'T2-high-res'}), ('bert/mri/lh.hippoSfVolumes-PD.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': False, 'analysis_id': 'PD'}), ('bert/mri/rh.hippoSfVolumes-T1.v10.txt', {'subject': 'bert', 'hemisphere': 'right', 't1_input': True, 'analysis_id': None}), ('bert/mri/rh.hippoSfVolumes-T1-T2.v10.txt', {'subject': 'bert', 'hemisphere': 'right', 't1_input': True, 'analysis_id': 'T2'}), ('freesurfer/subjects/bert/mri/lh.hippoSfVolumes-T1.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': True, 'analysis_id': None}), ('../../bert/mri/lh.hippoSfVolumes-T1.v10.txt', {'subject': 'bert', 'hemisphere': 'left', 't1_input': True, 'analysis_id': None}), ]) def test_hippocampal_subfields_volume_file_init(volume_file_path, expected_attrs): volume_file = HippocampalSubfieldsVolumeFile(path=volume_file_path) assert os.path.basename(volume_file_path) == os.path.basename(volume_file.absolute_path) for attr, value in expected_attrs.items(): assert value == getattr(volume_file, attr) @pytest.mark.parametrize('volume_file_path', [ 'bert/mri/lh.hippoSfLabels-T1.v10.mgz', 'bert/mri/lh.hippoSfVolumes-T1.v9.txt', 'bert/mri/lh.hippoSfVolumes.v10.txt', 'bert/mri/mh.hippoSfVolumes-T1.v10.txt', ]) def test_hippocampal_subfields_volume_file_init_invalid(volume_file_path): with pytest.raises(Exception): HippocampalSubfieldsVolumeFile(path=volume_file_path) @pytest.mark.parametrize(('volume_file_path', 'expected_volumes'), [ (os.path.join(SUBJECTS_DIR, 'bert/mri/lh.hippoSfVolumes-T1.v10.txt'), {'Hippocampal_tail': 123.456789, 'subiculum': 234.567891, 'CA1': 34.567891, 'hippocampal-fissure': 345.678912, 'presubiculum': 456.789123, 'parasubiculum': 45.678912, 'molecular_layer_HP': 56.789123, 'GC-ML-DG': 567.891234, 'CA3': 678.912345, 'CA4': 789.123456, 'fimbria': 89.123456, 'HATA': 91.234567, 'Whole_hippocampus': 1234.567899}), ]) def test_hippocampal_subfields_volume_file_read_volumes_mm3(volume_file_path, expected_volumes): volume_file = HippocampalSubfieldsVolumeFile(path=volume_file_path) assert expected_volumes == volume_file.read_volumes_mm3() def test_hippocampal_subfields_volume_file_read_volumes_mm3_not_found(): volume_file = HippocampalSubfieldsVolumeFile( path=os.path.join(SUBJECTS_DIR, 'non-existing', 'lh.hippoSfVolumes-T1.v10.txt')) with pytest.raises(FileNotFoundError): volume_file.read_volumes_mm3() @pytest.mark.parametrize(('volume_file_path', 'expected_dataframe'), [ (os.path.join(SUBJECTS_DIR, 'alice', 'mri', 'lh.hippoSfVolumes-T1.v10.txt'), pandas.DataFrame({ 'subfield': ['Hippocampal_tail', 'subiculum', 'CA1', 'hippocampal-fissure', 'presubiculum', 'parasubiculum', 'molecular_layer_HP', 'GC-ML-DG', 'CA3', 'CA4', 'fimbria', 'HATA', 'Whole_hippocampus'], 'volume_mm^3': [173.456789, 734.567891, 34.567891, 345.678917, 456.789173, 45.678917, 56.789173, 567.891734, 678.917345, 789.173456, 89.173456, 91.734567, 1734.567899], 'subject': 'alice', 'hemisphere': 'left', 'T1_input': True, 'analysis_id': None, })), ]) def test_hippocampal_subfields_volume_file_read_volumes_dataframe( volume_file_path: str, expected_dataframe: pandas.DataFrame): assert_volume_frames_equal( left=expected_dataframe, right=HippocampalSubfieldsVolumeFile(path=volume_file_path).read_volumes_dataframe(), ) def test_hippocampal_subfields_volume_file_read_volumes_dataframe_not_found(): volume_file = HippocampalSubfieldsVolumeFile( path=os.path.join(SUBJECTS_DIR, 'non-existing', 'lh.hippoSfVolumes-T1.v10.txt')) with pytest.raises(FileNotFoundError): volume_file.read_volumes_dataframe() @pytest.mark.parametrize(('root_dir_path', 'expected_file_paths'), [ (SUBJECTS_DIR, {os.path.join(SUBJECTS_DIR, 'alice', 'mri', 'lh.hippoSfVolumes-T1.v10.txt'), os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1-T2.v10.txt'), os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1.v10.txt')}), (os.path.join(SUBJECTS_DIR, 'bert'), {os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1-T2.v10.txt'), os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1.v10.txt')}), (os.path.join(SUBJECTS_DIR, 'bert', 'mri'), {os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1-T2.v10.txt'), os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1.v10.txt')}), ]) def test_hippocampal_subfields_volume_file_find(root_dir_path, expected_file_paths): volume_files_iterator = HippocampalSubfieldsVolumeFile.find(root_dir_path=root_dir_path) assert expected_file_paths == set(f.absolute_path for f in volume_files_iterator) @pytest.mark.parametrize(('root_dir_path', 'filename_pattern', 'expected_file_paths'), [ (SUBJECTS_DIR, r'hippoSfVolumes-T1\.v10', {os.path.join(SUBJECTS_DIR, 'alice', 'mri', 'lh.hippoSfVolumes-T1.v10.txt'), os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1.v10.txt')}), (os.path.join(SUBJECTS_DIR, 'bert'), r'hippoSfVolumes-T1-T2', {os.path.join(SUBJECTS_DIR, 'bert', 'mri', 'lh.hippoSfVolumes-T1-T2.v10.txt')}), ]) def test_hippocampal_subfields_volume_file_find_pattern(root_dir_path, filename_pattern, expected_file_paths): assert expected_file_paths == set( f.absolute_path for f in HippocampalSubfieldsVolumeFile.find( root_dir_path=root_dir_path, filename_regex=re.compile(filename_pattern)))