12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- """
- Read hippocampal subfield volumes computed by Freesurfer
- https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
- """
- import argparse
- import os
- import re
- import typing
- import pandas
- from freesurfer_volume_reader.freesurfer import HippocampalSubfieldsVolumeFile
- def remove_group_names_from_regex(regex_pattern: str) -> str:
- return re.sub(r'\?P<.+?>', '', regex_pattern)
- def read_hippocampal_volumes_mm3(volume_file_path: str) -> dict:
- subfield_volumes = {}
- with open(volume_file_path, 'r') as volume_file:
- for line in volume_file.read().rstrip().split('\n'):
- # https://github.com/freesurfer/freesurfer/blob/release_6_0_0/HippoSF/src/segmentSubjectT1T2_autoEstimateAlveusML.m#L8
- # https://github.com/freesurfer/freesurfer/blob/release_6_0_0/HippoSF/src/segmentSubjectT1T2_autoEstimateAlveusML.m#L1946
- subfield_name, subfield_volume_mm3_str = line.split(' ')
- subfield_volumes[subfield_name] = float(subfield_volume_mm3_str)
- return subfield_volumes
- def read_hippocampal_volume_file_dataframe(volume_file: HippocampalSubfieldsVolumeFile,
- ) -> pandas.DataFrame:
- volumes_frame = pandas.DataFrame([
- {'subfield': s, 'volume_mm^3': v}
- for s, v in read_hippocampal_volumes_mm3(volume_file.absolute_path).items()
- ])
- volumes_frame['subject'] = volume_file.subject
- volumes_frame['hemisphere'] = volume_file.hemisphere
- # volumes_frame['hemisphere'] = volumes_frame['hemisphere'].astype('category')
- volumes_frame['T1_input'] = volume_file.t1_input
- volumes_frame['analysis_id'] = volume_file.analysis_id
- return volumes_frame
- def main():
- argparser = argparse.ArgumentParser(description=__doc__)
- argparser.add_argument('--filename-regex', type=re.compile,
- default=remove_group_names_from_regex(
- HippocampalSubfieldsVolumeFile.FILENAME_PATTERN),
- help='default: %(default)s')
- argparser.add_argument('--output-format', choices=['csv'], default='csv',
- help='default: %(default)s')
- subjects_dir_path = os.environ.get('SUBJECTS_DIR', None)
- argparser.add_argument('root_dir_paths',
- metavar='ROOT_DIR',
- nargs='*' if subjects_dir_path else '+',
- default=[subjects_dir_path],
- help='default: $SUBJECTS_DIR ({})'.format(subjects_dir_path))
- args = argparser.parse_args()
- volume_files = [f for d in args.root_dir_paths
- for f in HippocampalSubfieldsVolumeFile.find(
- root_dir_path=d, filename_regex=args.filename_regex)]
- volume_frames = []
- for volume_file in volume_files:
- volume_frame = read_hippocampal_volume_file_dataframe(volume_file)
- volume_frame['source_path'] = volume_file.absolute_path
- volume_frames.append(volume_frame)
- united_volume_frame = pandas.concat(volume_frames, ignore_index=True)
- print(united_volume_frame.to_csv(index=False))
- if __name__ == '__main__':
- main()
|