__init__.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. """
  2. Read hippocampal subfield volumes computed by Freesurfer
  3. https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
  4. """
  5. import argparse
  6. import os
  7. import re
  8. import typing
  9. import pandas
  10. from freesurfer_volume_reader.freesurfer import HippocampalSubfieldsVolumeFile
  11. def remove_group_names_from_regex(regex_pattern: str) -> str:
  12. return re.sub(r'\?P<.+?>', '', regex_pattern)
  13. def read_hippocampal_volumes_mm3(volume_file_path: str) -> dict:
  14. subfield_volumes = {}
  15. with open(volume_file_path, 'r') as volume_file:
  16. for line in volume_file.read().rstrip().split('\n'):
  17. # https://github.com/freesurfer/freesurfer/blob/release_6_0_0/HippoSF/src/segmentSubjectT1T2_autoEstimateAlveusML.m#L8
  18. # https://github.com/freesurfer/freesurfer/blob/release_6_0_0/HippoSF/src/segmentSubjectT1T2_autoEstimateAlveusML.m#L1946
  19. subfield_name, subfield_volume_mm3_str = line.split(' ')
  20. subfield_volumes[subfield_name] = float(subfield_volume_mm3_str)
  21. return subfield_volumes
  22. def read_hippocampal_volume_file_dataframe(volume_file: HippocampalSubfieldsVolumeFile,
  23. ) -> pandas.DataFrame:
  24. volumes_frame = pandas.DataFrame([
  25. {'subfield': s, 'volume_mm^3': v}
  26. for s, v in read_hippocampal_volumes_mm3(volume_file.absolute_path).items()
  27. ])
  28. volumes_frame['subject'] = volume_file.subject
  29. volumes_frame['hemisphere'] = volume_file.hemisphere
  30. # volumes_frame['hemisphere'] = volumes_frame['hemisphere'].astype('category')
  31. volumes_frame['T1_input'] = volume_file.t1_input
  32. volumes_frame['analysis_id'] = volume_file.analysis_id
  33. return volumes_frame
  34. def main():
  35. argparser = argparse.ArgumentParser(description=__doc__)
  36. argparser.add_argument('--filename-regex', type=re.compile,
  37. default=remove_group_names_from_regex(
  38. HippocampalSubfieldsVolumeFile.FILENAME_PATTERN),
  39. help='default: %(default)s')
  40. argparser.add_argument('--output-format', choices=['csv'], default='csv',
  41. help='default: %(default)s')
  42. subjects_dir_path = os.environ.get('SUBJECTS_DIR', None)
  43. argparser.add_argument('root_dir_paths',
  44. metavar='ROOT_DIR',
  45. nargs='*' if subjects_dir_path else '+',
  46. default=[subjects_dir_path],
  47. help='default: $SUBJECTS_DIR ({})'.format(subjects_dir_path))
  48. args = argparser.parse_args()
  49. volume_files = [f for d in args.root_dir_paths
  50. for f in HippocampalSubfieldsVolumeFile.find(
  51. root_dir_path=d, filename_regex=args.filename_regex)]
  52. volume_frames = []
  53. for volume_file in volume_files:
  54. volume_frame = read_hippocampal_volume_file_dataframe(volume_file)
  55. volume_frame['source_path'] = volume_file.absolute_path
  56. volume_frames.append(volume_frame)
  57. united_volume_frame = pandas.concat(volume_frames, ignore_index=True)
  58. print(united_volume_frame.to_csv(index=False))
  59. if __name__ == '__main__':
  60. main()