Explorar el Código

script: added param --source-types to optionally enable collection of ASHS volumes files

https://github.com/fphammerle/freesurfer-volume-reader/pull/7
Fabian Peter Hammerle hace 6 años
padre
commit
88a2a730e0

+ 26 - 2
README.md

@@ -3,9 +3,10 @@
 [![Build Status](https://travis-ci.org/fphammerle/freesurfer-volume-reader.svg?branch=master)](https://travis-ci.org/fphammerle/freesurfer-volume-reader)
 [![Build Status](https://travis-ci.org/fphammerle/freesurfer-volume-reader.svg?branch=master)](https://travis-ci.org/fphammerle/freesurfer-volume-reader)
 
 
 Python script & library to
 Python script & library to
-read hippocampal subfield volumes computed by Freesurfer
+read hippocampal subfield volumes computed by Freesurfer & ASHS
 
 
-https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
+* Freesurfer https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
+* ASHS https://sites.google.com/site/hipposubfields/home
 
 
 ## Install
 ## Install
 
 
@@ -16,6 +17,8 @@ freesurfer-volume-reader --help
 
 
 ## Usage
 ## Usage
 
 
+### Freesurfer
+
 ```sh
 ```sh
 export SUBJECTS_DIR=/my/freesurfer/subjects
 export SUBJECTS_DIR=/my/freesurfer/subjects
 freesurfer-volume-reader
 freesurfer-volume-reader
@@ -41,6 +44,20 @@ for volume_file in freesurfer.HippocampalSubfieldsVolumeFile.find('/my/freesurfe
 
 
 ### ASHS
 ### ASHS
 
 
+```sh
+export SUBJECTS_DIR=/my/ashs/subjects
+freesurfer-volume-reader --source-types ashs
+```
+
+or
+
+```sh
+freesurfer-volume-reader --source-types ashs -- /my/ashs/subjects
+freesurfer-volume-reader --source-types ashs -- /my/ashs/subjects /other/ashs/subjects
+```
+
+or
+
 ```python
 ```python
 from freesurfer_volume_reader import ashs
 from freesurfer_volume_reader import ashs
 
 
@@ -50,6 +67,13 @@ for volume_file in ashs.HippocampalSubfieldsVolumeFile.find('/my/ashs/subjects')
     print(volume_file.read_volumes_dataframe())
     print(volume_file.read_volumes_dataframe())
 ```
 ```
 
 
+### Freesurfer & ASHS
+
+```sh
+freesurfer-volume-reader --source-types ashs freesurfer-hipposf -- /my/subjects
+freesurfer-volume-reader --source-types ashs freesurfer-hipposf -- /my/ashs/subjects /my/freesurfer/subjects /other/subjects
+```
+
 ## Tests
 ## Tests
 
 
 ```sh
 ```sh

+ 9 - 0
freesurfer_volume_reader/__init__.py

@@ -17,11 +17,20 @@ https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
 
 
 import abc
 import abc
 import os
 import os
+import re
 import typing
 import typing
 
 
 import pandas
 import pandas
 
 
 
 
+def parse_version_string(version_string: str) -> typing.Tuple[typing.Union[int, str]]:
+    return tuple(int(p) if p.isdigit() else p for p in version_string.split('.'))
+
+
+def remove_group_names_from_regex(regex_pattern: str) -> str:
+    return re.sub(r'\?P<.+?>', '', regex_pattern)
+
+
 class VolumeFile(metaclass=abc.ABCMeta):
 class VolumeFile(metaclass=abc.ABCMeta):
 
 
     FILENAME_REGEX = NotImplemented
     FILENAME_REGEX = NotImplemented

+ 37 - 16
freesurfer_volume_reader/__main__.py

@@ -1,28 +1,45 @@
 """
 """
-Read hippocampal subfield volumes computed by Freesurfer
+Read hippocampal subfield volumes computed by Freesurfer and/or ASHS
 and export collected data as CSV.
 and export collected data as CSV.
 """
 """
 
 
 import argparse
 import argparse
 import os
 import os
 import re
 import re
+import typing
 
 
 import pandas
 import pandas
 
 
-from freesurfer_volume_reader.freesurfer import HippocampalSubfieldsVolumeFile
+from freesurfer_volume_reader import ashs, freesurfer, parse_version_string, \
+                                     remove_group_names_from_regex
 
 
+def concat_dataframes(dataframes: typing.Iterable[pandas.DataFrame]
+                      ) -> pandas.DataFrame:  # pragma: no cover
+    # pylint: disable=unexpected-keyword-arg
+    if parse_version_string(pandas.__version__) < (0, 23):
+        return pandas.concat(dataframes, ignore_index=True)
+    return pandas.concat(dataframes, ignore_index=True, sort=False)
 
 
-def remove_group_names_from_regex(regex_pattern: str) -> str:
-    return re.sub(r'\?P<.+?>', '', regex_pattern)
+
+VOLUME_FILE_FINDERS = {
+    'ashs': ashs.HippocampalSubfieldsVolumeFile,
+    # https://github.com/freesurfer/freesurfer/tree/release_6_0_0/HippoSF
+    'freesurfer-hipposf': freesurfer.HippocampalSubfieldsVolumeFile,
+}
 
 
 
 
 def main():
 def main():
     argparser = argparse.ArgumentParser(description=__doc__,
     argparser = argparse.ArgumentParser(description=__doc__,
                                         formatter_class=argparse.RawDescriptionHelpFormatter)
                                         formatter_class=argparse.RawDescriptionHelpFormatter)
-    argparser.add_argument('--filename-regex', type=re.compile,
-                           default=remove_group_names_from_regex(
-                               HippocampalSubfieldsVolumeFile.FILENAME_PATTERN),
-                           help='default: %(default)s')
+    argparser.add_argument('--source-types', nargs='+', default=['freesurfer-hipposf'],
+                           choices=VOLUME_FILE_FINDERS.keys(),
+                           help='default: [freesurfer-hipposf]')
+    for source_type, file_class in VOLUME_FILE_FINDERS.items():
+        argparser.add_argument('--{}-filename-regex'.format(source_type),
+                               dest='filename_regex.{}'.format(source_type),
+                               metavar='REGULAR_EXPRESSION', type=re.compile,
+                               default=remove_group_names_from_regex(file_class.FILENAME_PATTERN),
+                               help='default: %(default)s')
     argparser.add_argument('--output-format', choices=['csv'], default='csv',
     argparser.add_argument('--output-format', choices=['csv'], default='csv',
                            help='default: %(default)s')
                            help='default: %(default)s')
     subjects_dir_path = os.environ.get('SUBJECTS_DIR', None)
     subjects_dir_path = os.environ.get('SUBJECTS_DIR', None)
@@ -32,15 +49,19 @@ def main():
                            default=[subjects_dir_path],
                            default=[subjects_dir_path],
                            help='default: $SUBJECTS_DIR ({})'.format(subjects_dir_path))
                            help='default: $SUBJECTS_DIR ({})'.format(subjects_dir_path))
     args = argparser.parse_args()
     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)]
+    filename_regexs = {k[len('filename_regex.'):]: v for k, v in vars(args).items()
+                       if k.startswith('filename_regex.')}
     volume_frames = []
     volume_frames = []
-    for volume_file in volume_files:
-        volume_frame = volume_file.read_volumes_dataframe()
-        volume_frame['source_path'] = volume_file.absolute_path
-        volume_frames.append(volume_frame)
-    united_volume_frame = pandas.concat(volume_frames, ignore_index=True)
+    for source_type in args.source_types:
+        find_volume_files = lambda dir_path: VOLUME_FILE_FINDERS[source_type].find(
+            root_dir_path=dir_path, filename_regex=filename_regexs[source_type])
+        for root_dir_path in args.root_dir_paths:
+            for volume_file in find_volume_files(root_dir_path):
+                volume_frame = volume_file.read_volumes_dataframe()
+                volume_frame['source_type'] = source_type
+                volume_frame['source_path'] = volume_file.absolute_path
+                volume_frames.append(volume_frame)
+    united_volume_frame = concat_dataframes(volume_frames)
     print(united_volume_frame.to_csv(index=False))
     print(united_volume_frame.to_csv(index=False))
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':

+ 1 - 0
freesurfer_volume_reader/freesurfer.py

@@ -2,6 +2,7 @@
 Read hippocampal subfield volumes computed by Freesurfer
 Read hippocampal subfield volumes computed by Freesurfer
 
 
 https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
 https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
+https://github.com/freesurfer/freesurfer/tree/release_6_0_0/HippoSF
 
 
 >>> from freesurfer_volume_reader.freesurfer import HippocampalSubfieldsVolumeFile
 >>> from freesurfer_volume_reader.freesurfer import HippocampalSubfieldsVolumeFile
 >>>
 >>>

+ 1 - 1
tests/ashs_test.py

@@ -54,7 +54,7 @@ def test_hippocampal_subfields_volume_file_init_invalid(volume_file_path):
      {'CA1': 678.901,
      {'CA1': 678.901,
       'CA2+3': 123.456,
       'CA2+3': 123.456,
       'DG': 901.234,
       'DG': 901.234,
-      'ERC': 678.901,
+      'ERC': 789.012,
       'PHC': 2345.876,
       'PHC': 2345.876,
       'PRC': 2345.678,
       'PRC': 2345.678,
       'SUB': 457.789}),
       'SUB': 457.789}),

+ 1 - 1
tests/conftest.py

@@ -7,7 +7,7 @@ SUBJECTS_DIR = os.path.join(os.path.dirname(__file__), 'subjects')
 
 
 def assert_volume_frames_equal(left: pandas.DataFrame, right: pandas.DataFrame):
 def assert_volume_frames_equal(left: pandas.DataFrame, right: pandas.DataFrame):
     sort_by = list(filter(lambda n: n in left,
     sort_by = list(filter(lambda n: n in left,
-                          ['volume_mm^3', 'analysis_id', 'correction']))
+                          ['subject', 'volume_mm^3', 'analysis_id', 'correction']))
     left.sort_values(sort_by, inplace=True)
     left.sort_values(sort_by, inplace=True)
     right.sort_values(sort_by, inplace=True)
     right.sort_values(sort_by, inplace=True)
     left.reset_index(inplace=True, drop=True)
     left.reset_index(inplace=True, drop=True)

+ 32 - 2
tests/init_test.py

@@ -1,9 +1,39 @@
 import pytest
 import pytest
 
 
-import freesurfer_volume_reader
+from freesurfer_volume_reader import parse_version_string, remove_group_names_from_regex, \
+                                     VolumeFile
 
 
 
 
-class DummyVolumeFile(freesurfer_volume_reader.VolumeFile):
+@pytest.mark.parametrize(('version_string', 'expected_tuple'), [
+    ('0.24.2', (0, 24, 2)),
+    ('0.21.0', (0, 21, 0)),
+    ('0.2.2.dev28+g526f05c.d20190504', (0, 2, 2, 'dev28+g526f05c', 'd20190504')),
+])
+def test_parse_version_string(version_string, expected_tuple):
+    assert expected_tuple == parse_version_string(version_string)
+
+
+def test_parse_version_string_comparison():
+    assert parse_version_string('0.24.2') == (0, 24, 2)
+    assert parse_version_string('0.24.2') < (0, 25)
+    assert parse_version_string('0.24.2') < (0, 24, 3)
+    assert parse_version_string('0.24.2') <= (0, 24, 2)
+    assert parse_version_string('0.24.2') >= (0, 24, 2)
+    assert parse_version_string('0.24.2') > (0, 24, 1)
+    assert parse_version_string('0.24.2') > (0, 24)
+    assert parse_version_string('0.2.2.dev28+g526f05c.d20190504') > (0, 2, 2)
+    assert parse_version_string('0.2.2.dev28+g526f05c.d20190504') < (0, 2, 3)
+
+
+@pytest.mark.parametrize(('source_pattern', 'expected_pattern'), [
+    (r'^(?P<h>[lr])h\.hippoSfVolumes', r'^([lr])h\.hippoSfVolumes'),
+    (r'(?P<a>a(?P<b>b))', r'(a(b))'),
+])
+def test_remove_group_names_from_regex(source_pattern, expected_pattern):
+    assert expected_pattern == remove_group_names_from_regex(regex_pattern=source_pattern)
+
+
+class DummyVolumeFile(VolumeFile):
 
 
     # pylint: disable=useless-super-delegation
     # pylint: disable=useless-super-delegation
 
 

+ 137 - 34
tests/main_test.py

@@ -13,16 +13,6 @@ import freesurfer_volume_reader.__main__
 from conftest import SUBJECTS_DIR, assert_volume_frames_equal
 from conftest import SUBJECTS_DIR, assert_volume_frames_equal
 
 
 
 
-@pytest.mark.parametrize(('source_pattern', 'expected_pattern'), [
-    (r'^(?P<h>[lr])h\.hippoSfVolumes', r'^([lr])h\.hippoSfVolumes'),
-    (r'(?P<a>a(?P<b>b))', r'(a(b))'),
-])
-def test_remove_group_names_from_regex(source_pattern, expected_pattern):
-    assert expected_pattern == freesurfer_volume_reader.__main__.remove_group_names_from_regex(
-        regex_pattern=source_pattern,
-    )
-
-
 def assert_main_volume_frame_equals(capsys, argv: list, expected_frame: pandas.DataFrame,
 def assert_main_volume_frame_equals(capsys, argv: list, expected_frame: pandas.DataFrame,
                                     subjects_dir: typing.Optional[str] = None):
                                     subjects_dir: typing.Optional[str] = None):
     if subjects_dir:
     if subjects_dir:
@@ -32,37 +22,112 @@ def assert_main_volume_frame_equals(capsys, argv: list, expected_frame: pandas.D
     with unittest.mock.patch('sys.argv', [''] + argv):
     with unittest.mock.patch('sys.argv', [''] + argv):
         freesurfer_volume_reader.__main__.main()
         freesurfer_volume_reader.__main__.main()
     out, _ = capsys.readouterr()
     out, _ = capsys.readouterr()
+    resulted_frame = pandas.read_csv(io.StringIO(out)).drop(columns=['source_path'])
+    if 'correction' in resulted_frame:
+        resulted_frame['correction'] = resulted_frame['correction'].astype('object')
     assert_volume_frames_equal(
     assert_volume_frames_equal(
         left=expected_frame,
         left=expected_frame,
         # pandas.DataFrame.drop(columns=[...], ...) >= pandas0.21.0
         # pandas.DataFrame.drop(columns=[...], ...) >= pandas0.21.0
-        right=pandas.read_csv(io.StringIO(out)).drop(columns=['source_path']),
+        right=resulted_frame,
     )
     )
 
 
 
 
-@pytest.mark.parametrize(('root_dir_paths', 'expected_csv_path'), [
-    ([os.path.join(SUBJECTS_DIR, 'alice')],
-     os.path.join(SUBJECTS_DIR, 'alice', 'hippocampal-volumes.csv')),
-    ([os.path.join(SUBJECTS_DIR, 'bert')],
-     os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv')),
-    ([os.path.join(SUBJECTS_DIR, 'alice'),
+@pytest.mark.parametrize(('args', 'root_dir_paths', 'expected_csv_path'), [
+    ([],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'freesurfer-hippocampal-volumes.csv')),
+    ([],
+     [os.path.join(SUBJECTS_DIR, 'bert')],
+     os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
+    ([],
+     [os.path.join(SUBJECTS_DIR, 'alice'),
       os.path.join(SUBJECTS_DIR, 'bert')],
       os.path.join(SUBJECTS_DIR, 'bert')],
+     os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
+    ([],
+     [SUBJECTS_DIR],
+     os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf'],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf'],
+     [SUBJECTS_DIR],
+     os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     [os.path.join(SUBJECTS_DIR, 'bert')],
+     os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     [os.path.join(SUBJECTS_DIR, 'alice'),
+      os.path.join(SUBJECTS_DIR, 'bert')],
+     os.path.join(SUBJECTS_DIR, 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     [SUBJECTS_DIR],
+     os.path.join(SUBJECTS_DIR, 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs', 'freesurfer-hipposf'],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf', 'ashs'],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs', 'freesurfer-hipposf'],
+     [os.path.join(SUBJECTS_DIR, 'alice'),
+      os.path.join(SUBJECTS_DIR, 'bert')],
+     os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs', 'freesurfer-hipposf'],
+     [SUBJECTS_DIR],
      os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
      os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
 ])
 ])
-def test_main_root_dir_param(capsys, root_dir_paths: list, expected_csv_path):
+def test_main_root_dir_param(capsys, args, root_dir_paths: list, expected_csv_path):
     assert_main_volume_frame_equals(
     assert_main_volume_frame_equals(
-        argv=root_dir_paths,
+        argv=args + ['--'] + root_dir_paths,
         expected_frame=pandas.read_csv(expected_csv_path),
         expected_frame=pandas.read_csv(expected_csv_path),
         capsys=capsys,
         capsys=capsys,
     )
     )
 
 
 
 
-@pytest.mark.parametrize(('root_dir_path', 'expected_csv_path'), [
-    (os.path.join(SUBJECTS_DIR, 'bert'),
-     os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv')),
+@pytest.mark.parametrize(('args', 'root_dir_path', 'expected_csv_path'), [
+    ([],
+     SUBJECTS_DIR,
+     os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
+    ([],
+     os.path.join(SUBJECTS_DIR, 'bert'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf'],
+     SUBJECTS_DIR,
+     os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf'],
+     os.path.join(SUBJECTS_DIR, 'bert'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf'],
+     os.path.join(SUBJECTS_DIR, 'bert', 'mri'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     SUBJECTS_DIR,
+     os.path.join(SUBJECTS_DIR, 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     os.path.join(SUBJECTS_DIR, 'bert'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     os.path.join(SUBJECTS_DIR, 'bert', 'final'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     os.path.join(SUBJECTS_DIR, 'alice'),
+     os.path.join(SUBJECTS_DIR, 'alice', 'ashs-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs', 'freesurfer-hipposf'],
+     os.path.join(SUBJECTS_DIR, 'alice'),
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf', 'ashs'],
+     os.path.join(SUBJECTS_DIR, 'alice'),
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer-hipposf', 'ashs'],
+     SUBJECTS_DIR,
+     os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
 ])
 ])
-def test_main_root_dir_env(capsys, root_dir_path, expected_csv_path):
+def test_main_root_dir_env(capsys, args, root_dir_path, expected_csv_path):
     assert_main_volume_frame_equals(
     assert_main_volume_frame_equals(
-        argv=[],
+        argv=args,
         subjects_dir=root_dir_path,
         subjects_dir=root_dir_path,
         expected_frame=pandas.read_csv(expected_csv_path),
         expected_frame=pandas.read_csv(expected_csv_path),
         capsys=capsys,
         capsys=capsys,
@@ -70,34 +135,72 @@ def test_main_root_dir_env(capsys, root_dir_path, expected_csv_path):
 
 
 
 
 @pytest.mark.timeout(8)
 @pytest.mark.timeout(8)
-@pytest.mark.parametrize(('root_dir_path', 'subjects_dir', 'expected_csv_path'), [
-    (os.path.join(SUBJECTS_DIR, 'bert'),
+@pytest.mark.parametrize(('args', 'root_dir_path', 'subjects_dir', 'expected_csv_path'), [
+    ([],
+     os.path.join(SUBJECTS_DIR, 'bert'),
+     os.path.join(SUBJECTS_DIR, 'alice'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs'],
+     os.path.join(SUBJECTS_DIR, 'bert'),
      os.path.join(SUBJECTS_DIR, 'alice'),
      os.path.join(SUBJECTS_DIR, 'alice'),
-     os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv')),
-    (os.path.join(SUBJECTS_DIR, 'bert'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
+    ([],
+     os.path.join(SUBJECTS_DIR, 'bert'),
      os.path.abspath(os.sep),
      os.path.abspath(os.sep),
-     os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv')),
+     os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
 ])
 ])
-def test_main_root_dir_overwrite_env(capsys, root_dir_path, subjects_dir, expected_csv_path):
+def test_main_root_dir_overwrite_env(capsys, args, root_dir_path, subjects_dir, expected_csv_path):
     assert_main_volume_frame_equals(
     assert_main_volume_frame_equals(
-        argv=[root_dir_path],
+        argv=args + ['--', root_dir_path],
         subjects_dir=subjects_dir,
         subjects_dir=subjects_dir,
         expected_frame=pandas.read_csv(expected_csv_path),
         expected_frame=pandas.read_csv(expected_csv_path),
         capsys=capsys,
         capsys=capsys,
     )
     )
 
 
 
 
-def test_main_root_dir_filename_regex(capsys):
+def test_main_root_dir_filename_regex_freesurfer(capsys):
     expected_volume_frame = pandas.read_csv(
     expected_volume_frame = pandas.read_csv(
-        os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv'))
+        os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv'))
     assert_main_volume_frame_equals(
     assert_main_volume_frame_equals(
-        argv=['--filename-regex', r'^.*-T1-T2\.v10\.txt$',
+        argv=['--freesurfer-hipposf-filename-regex', r'^.*-T1-T2\.v10\.txt$',
               os.path.join(SUBJECTS_DIR, 'bert')],
               os.path.join(SUBJECTS_DIR, 'bert')],
         expected_frame=expected_volume_frame[expected_volume_frame['analysis_id'] == 'T2'].copy(),
         expected_frame=expected_volume_frame[expected_volume_frame['analysis_id'] == 'T2'].copy(),
         capsys=capsys,
         capsys=capsys,
     )
     )
 
 
 
 
+def test_main_root_dir_filename_regex_ashs(capsys):
+    expected_volume_frame = pandas.read_csv(
+        os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv'))
+    assert_main_volume_frame_equals(
+        argv=['--ashs-filename-regex', r'_nogray_volumes.txt$',
+              '--source-types', 'ashs', '--',
+              os.path.join(SUBJECTS_DIR, 'bert')],
+        expected_frame=expected_volume_frame[expected_volume_frame['correction']
+                                             == 'nogray'].copy(),
+        capsys=capsys,
+    )
+
+
+def test_main_root_dir_filename_regex_combined(capsys):
+    expected_volume_frame = pandas.read_csv(
+        os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv'))
+    expected_volume_frame = expected_volume_frame[
+        # pylint: disable=singleton-comparison
+        (expected_volume_frame['T1_input'] == True)
+        | ((expected_volume_frame['source_type'] == 'ashs')
+           & expected_volume_frame['correction'].isnull())
+    ]
+    assert_main_volume_frame_equals(
+        argv=['--ashs-filename-regex', r'^alice_left_heur_',
+              '--freesurfer-hipposf-filename-regex', r'hippoSfVolumes-T1.v10.txt$',
+              '--source-types', 'ashs', 'freesurfer-hipposf',
+              '--', os.path.join(SUBJECTS_DIR, 'alice')],
+        expected_frame=expected_volume_frame.copy(),
+        capsys=capsys,
+    )
+
+
 def test_main_module_script():
 def test_main_module_script():
     subprocess.run(['python', '-m', 'freesurfer_volume_reader', '--help'],
     subprocess.run(['python', '-m', 'freesurfer_volume_reader', '--help'],
                    check=True)
                    check=True)

+ 28 - 0
tests/subjects/alice/all-hippocampal-volumes.csv

@@ -0,0 +1,28 @@
+source_type,subject,hemisphere,subfield,volume_mm^3,T1_input,analysis_id,correction
+ashs,alice,left,CA1,679.903,,,nogray
+ashs,alice,left,CA2+3,124.458,,,nogray
+ashs,alice,left,DG,902.236,,,nogray
+ashs,alice,left,ERC,789.011,,,nogray
+ashs,alice,left,PHC,2346.878,,,nogray
+ashs,alice,left,PRC,2346.670,,,nogray
+ashs,alice,left,SUB,458.781,,,nogray
+ashs,alice,left,CA1,679.904,,,
+ashs,alice,left,CA2+3,124.459,,,
+ashs,alice,left,DG,902.237,,,
+ashs,alice,left,ERC,789.012,,,
+ashs,alice,left,PHC,2346.879,,,
+ashs,alice,left,PRC,2346.671,,,
+ashs,alice,left,SUB,458.782,,,
+freesurfer-hipposf,alice,left,Hippocampal_tail,173.456789,True,,
+freesurfer-hipposf,alice,left,subiculum,734.567891,True,,
+freesurfer-hipposf,alice,left,CA1,34.567891,True,,
+freesurfer-hipposf,alice,left,hippocampal-fissure,345.678917,True,,
+freesurfer-hipposf,alice,left,presubiculum,456.789173,True,,
+freesurfer-hipposf,alice,left,parasubiculum,45.678917,True,,
+freesurfer-hipposf,alice,left,molecular_layer_HP,56.789173,True,,
+freesurfer-hipposf,alice,left,GC-ML-DG,567.891734,True,,
+freesurfer-hipposf,alice,left,CA3,678.917345,True,,
+freesurfer-hipposf,alice,left,CA4,789.173456,True,,
+freesurfer-hipposf,alice,left,fimbria,89.173456,True,,
+freesurfer-hipposf,alice,left,HATA,91.734567,True,,
+freesurfer-hipposf,alice,left,Whole_hippocampus,1734.567899,True,,

+ 15 - 0
tests/subjects/alice/ashs-hippocampal-volumes.csv

@@ -0,0 +1,15 @@
+source_type,subject,hemisphere,correction,subfield,volume_mm^3
+ashs,alice,left,nogray,CA1,679.903
+ashs,alice,left,nogray,CA2+3,124.458
+ashs,alice,left,nogray,DG,902.236
+ashs,alice,left,nogray,ERC,789.011
+ashs,alice,left,nogray,PHC,2346.878
+ashs,alice,left,nogray,PRC,2346.670
+ashs,alice,left,nogray,SUB,458.781
+ashs,alice,left,,CA1,679.904
+ashs,alice,left,,CA2+3,124.459
+ashs,alice,left,,DG,902.237
+ashs,alice,left,,ERC,789.012
+ashs,alice,left,,PHC,2346.879
+ashs,alice,left,,PRC,2346.671
+ashs,alice,left,,SUB,458.782

+ 1 - 1
tests/subjects/alice/final/alice_left_corr_nogray_volumes.txt

@@ -1,7 +1,7 @@
 alice left CA1 26 679.903
 alice left CA1 26 679.903
 alice left CA2+3 26 124.458
 alice left CA2+3 26 124.458
 alice left DG 25 902.236
 alice left DG 25 902.236
-alice left ERC 18 679.903
+alice left ERC 18 789.011
 alice left PHC 16 2346.878
 alice left PHC 16 2346.878
 alice left PRC 26 2346.670
 alice left PRC 26 2346.670
 alice left SUB 26 458.781
 alice left SUB 26 458.781

+ 14 - 0
tests/subjects/alice/freesurfer-hippocampal-volumes.csv

@@ -0,0 +1,14 @@
+source_type,subfield,volume_mm^3,subject,hemisphere,T1_input,analysis_id
+freesurfer-hipposf,Hippocampal_tail,173.456789,alice,left,True,
+freesurfer-hipposf,subiculum,734.567891,alice,left,True,
+freesurfer-hipposf,CA1,34.567891,alice,left,True,
+freesurfer-hipposf,hippocampal-fissure,345.678917,alice,left,True,
+freesurfer-hipposf,presubiculum,456.789173,alice,left,True,
+freesurfer-hipposf,parasubiculum,45.678917,alice,left,True,
+freesurfer-hipposf,molecular_layer_HP,56.789173,alice,left,True,
+freesurfer-hipposf,GC-ML-DG,567.891734,alice,left,True,
+freesurfer-hipposf,CA3,678.917345,alice,left,True,
+freesurfer-hipposf,CA4,789.173456,alice,left,True,
+freesurfer-hipposf,fimbria,89.173456,alice,left,True,
+freesurfer-hipposf,HATA,91.734567,alice,left,True,
+freesurfer-hipposf,Whole_hippocampus,1734.567899,alice,left,True,

+ 0 - 15
tests/subjects/alice/hippocampal-volumes.csv

@@ -1,15 +0,0 @@
-subfield,volume_mm^3,subject,hemisphere,T1_input,analysis_id
-Hippocampal_tail,173.456789,alice,left,True,
-subiculum,734.567891,alice,left,True,
-CA1,34.567891,alice,left,True,
-hippocampal-fissure,345.678917,alice,left,True,
-presubiculum,456.789173,alice,left,True,
-parasubiculum,45.678917,alice,left,True,
-molecular_layer_HP,56.789173,alice,left,True,
-GC-ML-DG,567.891734,alice,left,True,
-CA3,678.917345,alice,left,True,
-CA4,789.173456,alice,left,True,
-fimbria,89.173456,alice,left,True,
-HATA,91.734567,alice,left,True,
-Whole_hippocampus,1734.567899,alice,left,True,
-

+ 75 - 40
tests/subjects/all-hippocampal-volumes.csv

@@ -1,40 +1,75 @@
-subfield,volume_mm^3,subject,hemisphere,T1_input,analysis_id
-Hippocampal_tail,173.456789,alice,left,True,
-subiculum,734.567891,alice,left,True,
-CA1,34.567891,alice,left,True,
-hippocampal-fissure,345.678917,alice,left,True,
-presubiculum,456.789173,alice,left,True,
-parasubiculum,45.678917,alice,left,True,
-molecular_layer_HP,56.789173,alice,left,True,
-GC-ML-DG,567.891734,alice,left,True,
-CA3,678.917345,alice,left,True,
-CA4,789.173456,alice,left,True,
-fimbria,89.173456,alice,left,True,
-HATA,91.734567,alice,left,True,
-Whole_hippocampus,1734.567899,alice,left,True,
-Hippocampal_tail,123.456789,bert,left,True,
-subiculum,234.567891,bert,left,True,
-CA1,34.567891,bert,left,True,
-hippocampal-fissure,345.678912,bert,left,True,
-presubiculum,456.789123,bert,left,True,
-parasubiculum,45.678912,bert,left,True,
-molecular_layer_HP,56.789123,bert,left,True,
-GC-ML-DG,567.891234,bert,left,True,
-CA3,678.912345,bert,left,True,
-CA4,789.123456,bert,left,True,
-fimbria,89.123456,bert,left,True,
-HATA,91.234567,bert,left,True,
-Whole_hippocampus,1234.567899,bert,left,True,
-Hippocampal_tail,124.456789,bert,left,True,T2
-subiculum,244.567891,bert,left,True,T2
-CA1,44.567891,bert,left,True,T2
-hippocampal-fissure,445.678912,bert,left,True,T2
-presubiculum,456.789124,bert,left,True,T2
-parasubiculum,45.678912,bert,left,True,T2
-molecular_layer_HP,56.789124,bert,left,True,T2
-GC-ML-DG,567.891244,bert,left,True,T2
-CA3,678.912445,bert,left,True,T2
-CA4,789.124456,bert,left,True,T2
-fimbria,89.124456,bert,left,True,T2
-HATA,91.244567,bert,left,True,T2
-Whole_hippocampus,1244.567899,bert,left,True,T2
+source_type,subject,hemisphere,correction,subfield,volume_mm^3,T1_input,analysis_id
+ashs,alice,left,nogray,CA1,679.903,,
+ashs,alice,left,nogray,CA2+3,124.458,,
+ashs,alice,left,nogray,DG,902.236,,
+ashs,alice,left,nogray,ERC,789.011,,
+ashs,alice,left,nogray,PHC,2346.878,,
+ashs,alice,left,nogray,PRC,2346.67,,
+ashs,alice,left,nogray,SUB,458.781,,
+ashs,alice,left,,CA1,679.904,,
+ashs,alice,left,,CA2+3,124.459,,
+ashs,alice,left,,DG,902.237,,
+ashs,alice,left,,ERC,789.012,,
+ashs,alice,left,,PHC,2346.879,,
+ashs,alice,left,,PRC,2346.671,,
+ashs,alice,left,,SUB,458.782,,
+ashs,bert,left,nogray,CA1,678.901,,
+ashs,bert,left,nogray,CA2+3,123.456,,
+ashs,bert,left,nogray,DG,901.234,,
+ashs,bert,left,nogray,ERC,789.012,,
+ashs,bert,left,nogray,PHC,2345.876,,
+ashs,bert,left,nogray,PRC,2345.678,,
+ashs,bert,left,nogray,SUB,457.789,,
+ashs,bert,left,usegray,CA1,678.902,,
+ashs,bert,left,usegray,CA2+3,123.457,,
+ashs,bert,left,usegray,DG,901.235,,
+ashs,bert,left,usegray,ERC,789.013,,
+ashs,bert,left,usegray,PHC,2345.877,,
+ashs,bert,left,usegray,PRC,2345.679,,
+ashs,bert,left,usegray,SUB,457.78,,
+ashs,bert,right,nogray,CA1,678.903,,
+ashs,bert,right,nogray,CA2+3,123.458,,
+ashs,bert,right,nogray,DG,901.236,,
+ashs,bert,right,nogray,ERC,789.013,,
+ashs,bert,right,nogray,PHC,2345.878,,
+ashs,bert,right,nogray,PRC,2345.67,,
+ashs,bert,right,nogray,SUB,457.781,,
+freesurfer-hipposf,alice,left,,Hippocampal_tail,173.456789,True,
+freesurfer-hipposf,alice,left,,subiculum,734.567891,True,
+freesurfer-hipposf,alice,left,,CA1,34.567891,True,
+freesurfer-hipposf,alice,left,,hippocampal-fissure,345.678917,True,
+freesurfer-hipposf,alice,left,,presubiculum,456.789173,True,
+freesurfer-hipposf,alice,left,,parasubiculum,45.678917,True,
+freesurfer-hipposf,alice,left,,molecular_layer_HP,56.789173,True,
+freesurfer-hipposf,alice,left,,GC-ML-DG,567.891734,True,
+freesurfer-hipposf,alice,left,,CA3,678.917345,True,
+freesurfer-hipposf,alice,left,,CA4,789.173456,True,
+freesurfer-hipposf,alice,left,,fimbria,89.173456,True,
+freesurfer-hipposf,alice,left,,HATA,91.734567,True,
+freesurfer-hipposf,alice,left,,Whole_hippocampus,1734.567899,True,
+freesurfer-hipposf,bert,left,,Hippocampal_tail,123.456789,True,
+freesurfer-hipposf,bert,left,,subiculum,234.567891,True,
+freesurfer-hipposf,bert,left,,CA1,34.567891,True,
+freesurfer-hipposf,bert,left,,hippocampal-fissure,345.678912,True,
+freesurfer-hipposf,bert,left,,presubiculum,456.789123,True,
+freesurfer-hipposf,bert,left,,parasubiculum,45.678912,True,
+freesurfer-hipposf,bert,left,,molecular_layer_HP,56.789123,True,
+freesurfer-hipposf,bert,left,,GC-ML-DG,567.891234,True,
+freesurfer-hipposf,bert,left,,CA3,678.912345,True,
+freesurfer-hipposf,bert,left,,CA4,789.123456,True,
+freesurfer-hipposf,bert,left,,fimbria,89.123456,True,
+freesurfer-hipposf,bert,left,,HATA,91.234567,True,
+freesurfer-hipposf,bert,left,,Whole_hippocampus,1234.567899,True,
+freesurfer-hipposf,bert,left,,Hippocampal_tail,124.456789,True,T2
+freesurfer-hipposf,bert,left,,subiculum,244.567891,True,T2
+freesurfer-hipposf,bert,left,,CA1,44.567891,True,T2
+freesurfer-hipposf,bert,left,,hippocampal-fissure,445.678912,True,T2
+freesurfer-hipposf,bert,left,,presubiculum,456.789124,True,T2
+freesurfer-hipposf,bert,left,,parasubiculum,45.678912,True,T2
+freesurfer-hipposf,bert,left,,molecular_layer_HP,56.789124,True,T2
+freesurfer-hipposf,bert,left,,GC-ML-DG,567.891244,True,T2
+freesurfer-hipposf,bert,left,,CA3,678.912445,True,T2
+freesurfer-hipposf,bert,left,,CA4,789.124456,True,T2
+freesurfer-hipposf,bert,left,,fimbria,89.124456,True,T2
+freesurfer-hipposf,bert,left,,HATA,91.244567,True,T2
+freesurfer-hipposf,bert,left,,Whole_hippocampus,1244.567899,True,T2

+ 36 - 0
tests/subjects/ashs-hippocampal-volumes.csv

@@ -0,0 +1,36 @@
+source_type,subject,correction,hemisphere,subfield,volume_mm^3
+ashs,alice,nogray,left,CA1,679.903
+ashs,alice,nogray,left,CA2+3,124.458
+ashs,alice,nogray,left,DG,902.236
+ashs,alice,nogray,left,ERC,789.011
+ashs,alice,nogray,left,PHC,2346.878
+ashs,alice,nogray,left,PRC,2346.670
+ashs,alice,nogray,left,SUB,458.781
+ashs,alice,,left,CA1,679.904
+ashs,alice,,left,CA2+3,124.459
+ashs,alice,,left,DG,902.237
+ashs,alice,,left,ERC,789.012
+ashs,alice,,left,PHC,2346.879
+ashs,alice,,left,PRC,2346.671
+ashs,alice,,left,SUB,458.782
+ashs,bert,nogray,left,CA1,678.901
+ashs,bert,nogray,left,CA2+3,123.456
+ashs,bert,nogray,left,DG,901.234
+ashs,bert,nogray,left,ERC,789.012
+ashs,bert,nogray,left,PHC,2345.876
+ashs,bert,nogray,left,PRC,2345.678
+ashs,bert,nogray,left,SUB,457.789
+ashs,bert,usegray,left,CA1,678.902
+ashs,bert,usegray,left,CA2+3,123.457
+ashs,bert,usegray,left,DG,901.235
+ashs,bert,usegray,left,ERC,789.013
+ashs,bert,usegray,left,PHC,2345.877
+ashs,bert,usegray,left,PRC,2345.679
+ashs,bert,usegray,left,SUB,457.780
+ashs,bert,nogray,right,CA1,678.903
+ashs,bert,nogray,right,CA2+3,123.458
+ashs,bert,nogray,right,DG,901.236
+ashs,bert,nogray,right,ERC,789.013
+ashs,bert,nogray,right,PHC,2345.878
+ashs,bert,nogray,right,PRC,2345.670
+ashs,bert,nogray,right,SUB,457.781

+ 22 - 0
tests/subjects/bert/ashs-hippocampal-volumes.csv

@@ -0,0 +1,22 @@
+source_type,subject,correction,hemisphere,subfield,volume_mm^3
+ashs,bert,nogray,left,CA1,678.901
+ashs,bert,nogray,left,CA2+3,123.456
+ashs,bert,nogray,left,DG,901.234
+ashs,bert,nogray,left,ERC,789.012
+ashs,bert,nogray,left,PHC,2345.876
+ashs,bert,nogray,left,PRC,2345.678
+ashs,bert,nogray,left,SUB,457.789
+ashs,bert,usegray,left,CA1,678.902
+ashs,bert,usegray,left,CA2+3,123.457
+ashs,bert,usegray,left,DG,901.235
+ashs,bert,usegray,left,ERC,789.013
+ashs,bert,usegray,left,PHC,2345.877
+ashs,bert,usegray,left,PRC,2345.679
+ashs,bert,usegray,left,SUB,457.780
+ashs,bert,nogray,right,CA1,678.903
+ashs,bert,nogray,right,CA2+3,123.458
+ashs,bert,nogray,right,DG,901.236
+ashs,bert,nogray,right,ERC,789.013
+ashs,bert,nogray,right,PHC,2345.878
+ashs,bert,nogray,right,PRC,2345.670
+ashs,bert,nogray,right,SUB,457.781

+ 1 - 1
tests/subjects/bert/final/bert_left_corr_nogray_volumes.txt

@@ -1,7 +1,7 @@
 bert left CA1 26 678.901
 bert left CA1 26 678.901
 bert left CA2+3 26 123.456
 bert left CA2+3 26 123.456
 bert left DG 25 901.234
 bert left DG 25 901.234
-bert left ERC 18 678.901
+bert left ERC 18 789.012
 bert left PHC 16 2345.876
 bert left PHC 16 2345.876
 bert left PRC 26 2345.678
 bert left PRC 26 2345.678
 bert left SUB 26 457.789
 bert left SUB 26 457.789

+ 1 - 1
tests/subjects/bert/final/bert_left_corr_usegray_volumes.txt

@@ -1,7 +1,7 @@
 bert left CA1 26 678.902
 bert left CA1 26 678.902
 bert left CA2+3 26 123.457
 bert left CA2+3 26 123.457
 bert left DG 25 901.235
 bert left DG 25 901.235
-bert left ERC 18 678.902
+bert left ERC 18 789.013
 bert left PHC 16 2345.877
 bert left PHC 16 2345.877
 bert left PRC 26 2345.679
 bert left PRC 26 2345.679
 bert left SUB 26 457.780
 bert left SUB 26 457.780

+ 1 - 1
tests/subjects/bert/final/bert_right_corr_nogray_volumes.txt

@@ -1,7 +1,7 @@
 bert right CA1 26 678.903
 bert right CA1 26 678.903
 bert right CA2+3 26 123.458
 bert right CA2+3 26 123.458
 bert right DG 25 901.236
 bert right DG 25 901.236
-bert right ERC 18 678.903
+bert right ERC 18 789.013
 bert right PHC 16 2345.878
 bert right PHC 16 2345.878
 bert right PRC 26 2345.670
 bert right PRC 26 2345.670
 bert right SUB 26 457.781
 bert right SUB 26 457.781

+ 27 - 0
tests/subjects/bert/freesurfer-hippocampal-volumes.csv

@@ -0,0 +1,27 @@
+source_type,subfield,volume_mm^3,subject,hemisphere,T1_input,analysis_id
+freesurfer-hipposf,Hippocampal_tail,123.456789,bert,left,True,
+freesurfer-hipposf,subiculum,234.567891,bert,left,True,
+freesurfer-hipposf,CA1,34.567891,bert,left,True,
+freesurfer-hipposf,hippocampal-fissure,345.678912,bert,left,True,
+freesurfer-hipposf,presubiculum,456.789123,bert,left,True,
+freesurfer-hipposf,parasubiculum,45.678912,bert,left,True,
+freesurfer-hipposf,molecular_layer_HP,56.789123,bert,left,True,
+freesurfer-hipposf,GC-ML-DG,567.891234,bert,left,True,
+freesurfer-hipposf,CA3,678.912345,bert,left,True,
+freesurfer-hipposf,CA4,789.123456,bert,left,True,
+freesurfer-hipposf,fimbria,89.123456,bert,left,True,
+freesurfer-hipposf,HATA,91.234567,bert,left,True,
+freesurfer-hipposf,Whole_hippocampus,1234.567899,bert,left,True,
+freesurfer-hipposf,Hippocampal_tail,124.456789,bert,left,True,T2
+freesurfer-hipposf,subiculum,244.567891,bert,left,True,T2
+freesurfer-hipposf,CA1,44.567891,bert,left,True,T2
+freesurfer-hipposf,hippocampal-fissure,445.678912,bert,left,True,T2
+freesurfer-hipposf,presubiculum,456.789124,bert,left,True,T2
+freesurfer-hipposf,parasubiculum,45.678912,bert,left,True,T2
+freesurfer-hipposf,molecular_layer_HP,56.789124,bert,left,True,T2
+freesurfer-hipposf,GC-ML-DG,567.891244,bert,left,True,T2
+freesurfer-hipposf,CA3,678.912445,bert,left,True,T2
+freesurfer-hipposf,CA4,789.124456,bert,left,True,T2
+freesurfer-hipposf,fimbria,89.124456,bert,left,True,T2
+freesurfer-hipposf,HATA,91.244567,bert,left,True,T2
+freesurfer-hipposf,Whole_hippocampus,1244.567899,bert,left,True,T2

+ 0 - 28
tests/subjects/bert/hippocampal-volumes.csv

@@ -1,28 +0,0 @@
-subfield,volume_mm^3,subject,hemisphere,T1_input,analysis_id
-Hippocampal_tail,123.456789,bert,left,True,
-subiculum,234.567891,bert,left,True,
-CA1,34.567891,bert,left,True,
-hippocampal-fissure,345.678912,bert,left,True,
-presubiculum,456.789123,bert,left,True,
-parasubiculum,45.678912,bert,left,True,
-molecular_layer_HP,56.789123,bert,left,True,
-GC-ML-DG,567.891234,bert,left,True,
-CA3,678.912345,bert,left,True,
-CA4,789.123456,bert,left,True,
-fimbria,89.123456,bert,left,True,
-HATA,91.234567,bert,left,True,
-Whole_hippocampus,1234.567899,bert,left,True,
-Hippocampal_tail,124.456789,bert,left,True,T2
-subiculum,244.567891,bert,left,True,T2
-CA1,44.567891,bert,left,True,T2
-hippocampal-fissure,445.678912,bert,left,True,T2
-presubiculum,456.789124,bert,left,True,T2
-parasubiculum,45.678912,bert,left,True,T2
-molecular_layer_HP,56.789124,bert,left,True,T2
-GC-ML-DG,567.891244,bert,left,True,T2
-CA3,678.912445,bert,left,True,T2
-CA4,789.124456,bert,left,True,T2
-fimbria,89.124456,bert,left,True,T2
-HATA,91.244567,bert,left,True,T2
-Whole_hippocampus,1244.567899,bert,left,True,T2
-

+ 40 - 0
tests/subjects/freesurfer-hippocampal-volumes.csv

@@ -0,0 +1,40 @@
+source_type,subfield,volume_mm^3,subject,hemisphere,T1_input,analysis_id
+freesurfer-hipposf,Hippocampal_tail,173.456789,alice,left,True,
+freesurfer-hipposf,subiculum,734.567891,alice,left,True,
+freesurfer-hipposf,CA1,34.567891,alice,left,True,
+freesurfer-hipposf,hippocampal-fissure,345.678917,alice,left,True,
+freesurfer-hipposf,presubiculum,456.789173,alice,left,True,
+freesurfer-hipposf,parasubiculum,45.678917,alice,left,True,
+freesurfer-hipposf,molecular_layer_HP,56.789173,alice,left,True,
+freesurfer-hipposf,GC-ML-DG,567.891734,alice,left,True,
+freesurfer-hipposf,CA3,678.917345,alice,left,True,
+freesurfer-hipposf,CA4,789.173456,alice,left,True,
+freesurfer-hipposf,fimbria,89.173456,alice,left,True,
+freesurfer-hipposf,HATA,91.734567,alice,left,True,
+freesurfer-hipposf,Whole_hippocampus,1734.567899,alice,left,True,
+freesurfer-hipposf,Hippocampal_tail,123.456789,bert,left,True,
+freesurfer-hipposf,subiculum,234.567891,bert,left,True,
+freesurfer-hipposf,CA1,34.567891,bert,left,True,
+freesurfer-hipposf,hippocampal-fissure,345.678912,bert,left,True,
+freesurfer-hipposf,presubiculum,456.789123,bert,left,True,
+freesurfer-hipposf,parasubiculum,45.678912,bert,left,True,
+freesurfer-hipposf,molecular_layer_HP,56.789123,bert,left,True,
+freesurfer-hipposf,GC-ML-DG,567.891234,bert,left,True,
+freesurfer-hipposf,CA3,678.912345,bert,left,True,
+freesurfer-hipposf,CA4,789.123456,bert,left,True,
+freesurfer-hipposf,fimbria,89.123456,bert,left,True,
+freesurfer-hipposf,HATA,91.234567,bert,left,True,
+freesurfer-hipposf,Whole_hippocampus,1234.567899,bert,left,True,
+freesurfer-hipposf,Hippocampal_tail,124.456789,bert,left,True,T2
+freesurfer-hipposf,subiculum,244.567891,bert,left,True,T2
+freesurfer-hipposf,CA1,44.567891,bert,left,True,T2
+freesurfer-hipposf,hippocampal-fissure,445.678912,bert,left,True,T2
+freesurfer-hipposf,presubiculum,456.789124,bert,left,True,T2
+freesurfer-hipposf,parasubiculum,45.678912,bert,left,True,T2
+freesurfer-hipposf,molecular_layer_HP,56.789124,bert,left,True,T2
+freesurfer-hipposf,GC-ML-DG,567.891244,bert,left,True,T2
+freesurfer-hipposf,CA3,678.912445,bert,left,True,T2
+freesurfer-hipposf,CA4,789.124456,bert,left,True,T2
+freesurfer-hipposf,fimbria,89.124456,bert,left,True,T2
+freesurfer-hipposf,HATA,91.244567,bert,left,True,T2
+freesurfer-hipposf,Whole_hippocampus,1244.567899,bert,left,True,T2