freesurfer.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import os
  2. import re
  3. import typing
  4. # pylint: disable=too-few-public-methods
  5. class HippocampalSubfieldsVolumeFile:
  6. # https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
  7. FILENAME_PATTERN = r'^(?P<h>[lr])h\.hippoSfVolumes' \
  8. r'(?P<T1>-T1)?(-(?P<analysis_id>.+?))?\.v10.txt$'
  9. FILENAME_REGEX = re.compile(FILENAME_PATTERN)
  10. FILENAME_HEMISPHERE_PREFIX_MAP = {'l': 'left', 'r': 'right'}
  11. def __init__(self, path: str):
  12. self._absolute_path = os.path.abspath(path)
  13. subject_dir_path = os.path.dirname(os.path.dirname(self._absolute_path))
  14. self.subject = os.path.basename(subject_dir_path)
  15. filename_match = self.FILENAME_REGEX.match(os.path.basename(path))
  16. assert filename_match, self._absolute_path
  17. filename_groups = filename_match.groupdict()
  18. assert filename_groups['T1'] or filename_groups['analysis_id'], self._absolute_path
  19. self.hemisphere = self.FILENAME_HEMISPHERE_PREFIX_MAP[filename_groups['h']]
  20. self.t1_input = filename_groups['T1'] is not None
  21. self.analysis_id = filename_groups['analysis_id']
  22. @property
  23. def absolute_path(self):
  24. return self._absolute_path
  25. @classmethod
  26. def find(cls, root_dir_path: str,
  27. filename_regex: typing.Pattern = FILENAME_REGEX) -> typing.Iterator[str]:
  28. for dirpath, _, filenames in os.walk(root_dir_path):
  29. for filename in filter(filename_regex.search, filenames):
  30. yield cls(path=os.path.join(dirpath, filename))