Browse Source

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 5 years ago
parent
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)
 
 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
 
@@ -16,6 +17,8 @@ freesurfer-volume-reader --help
 
 ## Usage
 
+### Freesurfer
+
 ```sh
 export SUBJECTS_DIR=/my/freesurfer/subjects
 freesurfer-volume-reader
@@ -41,6 +44,20 @@ for volume_file in freesurfer.HippocampalSubfieldsVolumeFile.find('/my/freesurfe
 
 ### 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
 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())
 ```
 
+### 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
 
 ```sh

+ 9 - 0
freesurfer_volume_reader/__init__.py

@@ -17,11 +17,20 @@ https://surfer.nmr.mgh.harvard.edu/fswiki/HippocampalSubfields
 
 import abc
 import os
+import re
 import typing
 
 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):
 
     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.
 """
 
 import argparse
 import os
 import re
+import typing
 
 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():
     argparser = argparse.ArgumentParser(description=__doc__,
                                         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',
                            help='default: %(default)s')
     subjects_dir_path = os.environ.get('SUBJECTS_DIR', None)
@@ -32,15 +49,19 @@ def main():
                            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)]
+    filename_regexs = {k[len('filename_regex.'):]: v for k, v in vars(args).items()
+                       if k.startswith('filename_regex.')}
     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))
 
 if __name__ == '__main__':

+ 1 - 0
freesurfer_volume_reader/freesurfer.py

@@ -2,6 +2,7 @@
 Read hippocampal subfield volumes computed by Freesurfer
 
 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
 >>>

+ 1 - 1
tests/ashs_test.py

@@ -54,7 +54,7 @@ def test_hippocampal_subfields_volume_file_init_invalid(volume_file_path):
      {'CA1': 678.901,
       'CA2+3': 123.456,
       'DG': 901.234,
-      'ERC': 678.901,
+      'ERC': 789.012,
       'PHC': 2345.876,
       'PRC': 2345.678,
       '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):
     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)
     right.sort_values(sort_by, inplace=True)
     left.reset_index(inplace=True, drop=True)

+ 32 - 2
tests/init_test.py

@@ -1,9 +1,39 @@
 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
 

+ 137 - 34
tests/main_test.py

@@ -13,16 +13,6 @@ import freesurfer_volume_reader.__main__
 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,
                                     subjects_dir: typing.Optional[str] = None):
     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):
         freesurfer_volume_reader.__main__.main()
     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(
         left=expected_frame,
         # 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, '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')),
 ])
-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(
-        argv=root_dir_paths,
+        argv=args + ['--'] + root_dir_paths,
         expected_frame=pandas.read_csv(expected_csv_path),
         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(
-        argv=[],
+        argv=args,
         subjects_dir=root_dir_path,
         expected_frame=pandas.read_csv(expected_csv_path),
         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.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, '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.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(
-        argv=[root_dir_path],
+        argv=args + ['--', root_dir_path],
         subjects_dir=subjects_dir,
         expected_frame=pandas.read_csv(expected_csv_path),
         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(
-        os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv'))
+        os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv'))
     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')],
         expected_frame=expected_volume_frame[expected_volume_frame['analysis_id'] == 'T2'].copy(),
         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():
     subprocess.run(['python', '-m', 'freesurfer_volume_reader', '--help'],
                    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 CA2+3 26 124.458
 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 PRC 26 2346.670
 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 CA2+3 26 123.456
 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 PRC 26 2345.678
 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 CA2+3 26 123.457
 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 PRC 26 2345.679
 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 CA2+3 26 123.458
 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 PRC 26 2345.670
 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