Browse Source

script: added param --source-types to optionally enable collection of ASHS volumes files; added column `source_type`

Fabian Peter Hammerle 5 years ago
parent
commit
189dd5303c

+ 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 -- /my/subjects
+freesurfer-volume-reader --source-types ashs freesurfer -- /my/ashs/subjects /my/freesurfer/subjects /other/subjects
+```
+
 ## Tests
 
 ```sh

+ 1 - 0
examples/barplot.py

@@ -12,6 +12,7 @@ def generate_freesurfer_mode_label(row):
                      row['analysis_id'].split('_')[0] if row['analysis_id'] else None]
     return ' & '.join(filter(None, mri_sequences))
 
+
 def main():
     argparser = argparse.ArgumentParser()
     argparser.add_argument('--subject', required=True)

+ 27 - 14
freesurfer_volume_reader/__main__.py

@@ -1,5 +1,5 @@
 """
-Read hippocampal subfield volumes computed by Freesurfer
+Read hippocampal subfield volumes computed by Freesurfer and/or ASHS
 and export collected data as CSV.
 """
 
@@ -9,16 +9,25 @@ import re
 
 import pandas
 
-from freesurfer_volume_reader import freesurfer, remove_group_names_from_regex
+from freesurfer_volume_reader import ashs, freesurfer, remove_group_names_from_regex
+
+VOLUME_FILE_FINDERS = {
+    'ashs': ashs.HippocampalSubfieldsVolumeFile,
+    'freesurfer': 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(
-                               freesurfer.HippocampalSubfieldsVolumeFile.FILENAME_PATTERN),
-                           help='default: %(default)s')
+    argparser.add_argument('--source-types', nargs='+', default=['freesurfer'],
+                           choices=VOLUME_FILE_FINDERS.keys(),
+                           help='default: [freesurfer]')
+    for source_type, file_class in VOLUME_FILE_FINDERS.items():
+        argparser.add_argument('--{}-filename-regex'.format(source_type),
+                               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)
@@ -28,15 +37,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 freesurfer.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.endswith('_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:
+        finder = VOLUME_FILE_FINDERS[source_type].find
+        for root_dir_path in args.root_dir_paths:
+            for volume_file in finder(root_dir_path=root_dir_path,
+                                      filename_regex=filename_regexs[source_type]):
+                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 = pandas.concat(volume_frames, ignore_index=True, sort=False)
     print(united_volume_frame.to_csv(index=False))
 
 if __name__ == '__main__':

+ 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)

+ 114 - 23
tests/main_test.py

@@ -28,30 +28,102 @@ def assert_main_volume_frame_equals(capsys, argv: list, expected_frame: pandas.D
     )
 
 
-@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'],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer'],
+     [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'],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer', 'ashs'],
+     [os.path.join(SUBJECTS_DIR, 'alice')],
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'ashs', 'freesurfer'],
+     [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'],
+     [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'],
+     SUBJECTS_DIR,
+     os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer'],
+     os.path.join(SUBJECTS_DIR, 'bert'),
+     os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer'],
+     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'],
+     os.path.join(SUBJECTS_DIR, 'alice'),
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer', 'ashs'],
+     os.path.join(SUBJECTS_DIR, 'alice'),
+     os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
+    (['--source-types', 'freesurfer', '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,
@@ -59,29 +131,48 @@ 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-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,
+    )

+ 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,679.903,,,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,alice,left,Hippocampal_tail,173.456789,True,,
+freesurfer,alice,left,subiculum,734.567891,True,,
+freesurfer,alice,left,CA1,34.567891,True,,
+freesurfer,alice,left,hippocampal-fissure,345.678917,True,,
+freesurfer,alice,left,presubiculum,456.789173,True,,
+freesurfer,alice,left,parasubiculum,45.678917,True,,
+freesurfer,alice,left,molecular_layer_HP,56.789173,True,,
+freesurfer,alice,left,GC-ML-DG,567.891734,True,,
+freesurfer,alice,left,CA3,678.917345,True,,
+freesurfer,alice,left,CA4,789.173456,True,,
+freesurfer,alice,left,fimbria,89.173456,True,,
+freesurfer,alice,left,HATA,91.734567,True,,
+freesurfer,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,679.903
+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

+ 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,Hippocampal_tail,173.456789,alice,left,True,
+freesurfer,subiculum,734.567891,alice,left,True,
+freesurfer,CA1,34.567891,alice,left,True,
+freesurfer,hippocampal-fissure,345.678917,alice,left,True,
+freesurfer,presubiculum,456.789173,alice,left,True,
+freesurfer,parasubiculum,45.678917,alice,left,True,
+freesurfer,molecular_layer_HP,56.789173,alice,left,True,
+freesurfer,GC-ML-DG,567.891734,alice,left,True,
+freesurfer,CA3,678.917345,alice,left,True,
+freesurfer,CA4,789.173456,alice,left,True,
+freesurfer,fimbria,89.173456,alice,left,True,
+freesurfer,HATA,91.734567,alice,left,True,
+freesurfer,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,679.903,,
+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.6710000000007,,
+ashs,alice,left,,SUB,458.782,,
+ashs,bert,left,nogray,CA1,678.9010000000002,,
+ashs,bert,left,nogray,CA2+3,123.456,,
+ashs,bert,left,nogray,DG,901.234,,
+ashs,bert,left,nogray,ERC,678.9010000000002,,
+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.9019999999998,,
+ashs,bert,left,usegray,CA2+3,123.457,,
+ashs,bert,left,usegray,DG,901.235,,
+ashs,bert,left,usegray,ERC,678.9019999999998,,
+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,678.903,,
+ashs,bert,right,nogray,PHC,2345.878,,
+ashs,bert,right,nogray,PRC,2345.67,,
+ashs,bert,right,nogray,SUB,457.781,,
+freesurfer,alice,left,,Hippocampal_tail,173.456789,True,
+freesurfer,alice,left,,subiculum,734.567891,True,
+freesurfer,alice,left,,CA1,34.567890999999996,True,
+freesurfer,alice,left,,hippocampal-fissure,345.678917,True,
+freesurfer,alice,left,,presubiculum,456.78917300000006,True,
+freesurfer,alice,left,,parasubiculum,45.678917,True,
+freesurfer,alice,left,,molecular_layer_HP,56.789173,True,
+freesurfer,alice,left,,GC-ML-DG,567.8917339999999,True,
+freesurfer,alice,left,,CA3,678.9173450000001,True,
+freesurfer,alice,left,,CA4,789.173456,True,
+freesurfer,alice,left,,fimbria,89.173456,True,
+freesurfer,alice,left,,HATA,91.734567,True,
+freesurfer,alice,left,,Whole_hippocampus,1734.567899,True,
+freesurfer,bert,left,,Hippocampal_tail,123.45678899999999,True,
+freesurfer,bert,left,,subiculum,234.567891,True,
+freesurfer,bert,left,,CA1,34.567890999999996,True,
+freesurfer,bert,left,,hippocampal-fissure,345.678912,True,
+freesurfer,bert,left,,presubiculum,456.789123,True,
+freesurfer,bert,left,,parasubiculum,45.678912,True,
+freesurfer,bert,left,,molecular_layer_HP,56.789123,True,
+freesurfer,bert,left,,GC-ML-DG,567.8912339999999,True,
+freesurfer,bert,left,,CA3,678.9123450000001,True,
+freesurfer,bert,left,,CA4,789.1234559999999,True,
+freesurfer,bert,left,,fimbria,89.123456,True,
+freesurfer,bert,left,,HATA,91.234567,True,
+freesurfer,bert,left,,Whole_hippocampus,1234.5678990000001,True,
+freesurfer,bert,left,,Hippocampal_tail,124.45678899999999,True,T2
+freesurfer,bert,left,,subiculum,244.567891,True,T2
+freesurfer,bert,left,,CA1,44.567890999999996,True,T2
+freesurfer,bert,left,,hippocampal-fissure,445.678912,True,T2
+freesurfer,bert,left,,presubiculum,456.789124,True,T2
+freesurfer,bert,left,,parasubiculum,45.678912,True,T2
+freesurfer,bert,left,,molecular_layer_HP,56.789124,True,T2
+freesurfer,bert,left,,GC-ML-DG,567.891244,True,T2
+freesurfer,bert,left,,CA3,678.912445,True,T2
+freesurfer,bert,left,,CA4,789.124456,True,T2
+freesurfer,bert,left,,fimbria,89.12445600000001,True,T2
+freesurfer,bert,left,,HATA,91.244567,True,T2
+freesurfer,bert,left,,Whole_hippocampus,1244.5678990000001,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,679.903
+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,678.901
+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,678.902
+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,678.903
+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,678.901
+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,678.902
+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,678.903
+ashs,bert,nogray,right,PHC,2345.878
+ashs,bert,nogray,right,PRC,2345.670
+ashs,bert,nogray,right,SUB,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,Hippocampal_tail,123.456789,bert,left,True,
+freesurfer,subiculum,234.567891,bert,left,True,
+freesurfer,CA1,34.567891,bert,left,True,
+freesurfer,hippocampal-fissure,345.678912,bert,left,True,
+freesurfer,presubiculum,456.789123,bert,left,True,
+freesurfer,parasubiculum,45.678912,bert,left,True,
+freesurfer,molecular_layer_HP,56.789123,bert,left,True,
+freesurfer,GC-ML-DG,567.891234,bert,left,True,
+freesurfer,CA3,678.912345,bert,left,True,
+freesurfer,CA4,789.123456,bert,left,True,
+freesurfer,fimbria,89.123456,bert,left,True,
+freesurfer,HATA,91.234567,bert,left,True,
+freesurfer,Whole_hippocampus,1234.567899,bert,left,True,
+freesurfer,Hippocampal_tail,124.456789,bert,left,True,T2
+freesurfer,subiculum,244.567891,bert,left,True,T2
+freesurfer,CA1,44.567891,bert,left,True,T2
+freesurfer,hippocampal-fissure,445.678912,bert,left,True,T2
+freesurfer,presubiculum,456.789124,bert,left,True,T2
+freesurfer,parasubiculum,45.678912,bert,left,True,T2
+freesurfer,molecular_layer_HP,56.789124,bert,left,True,T2
+freesurfer,GC-ML-DG,567.891244,bert,left,True,T2
+freesurfer,CA3,678.912445,bert,left,True,T2
+freesurfer,CA4,789.124456,bert,left,True,T2
+freesurfer,fimbria,89.124456,bert,left,True,T2
+freesurfer,HATA,91.244567,bert,left,True,T2
+freesurfer,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,Hippocampal_tail,173.456789,alice,left,True,
+freesurfer,subiculum,734.567891,alice,left,True,
+freesurfer,CA1,34.567891,alice,left,True,
+freesurfer,hippocampal-fissure,345.678917,alice,left,True,
+freesurfer,presubiculum,456.789173,alice,left,True,
+freesurfer,parasubiculum,45.678917,alice,left,True,
+freesurfer,molecular_layer_HP,56.789173,alice,left,True,
+freesurfer,GC-ML-DG,567.891734,alice,left,True,
+freesurfer,CA3,678.917345,alice,left,True,
+freesurfer,CA4,789.173456,alice,left,True,
+freesurfer,fimbria,89.173456,alice,left,True,
+freesurfer,HATA,91.734567,alice,left,True,
+freesurfer,Whole_hippocampus,1734.567899,alice,left,True,
+freesurfer,Hippocampal_tail,123.456789,bert,left,True,
+freesurfer,subiculum,234.567891,bert,left,True,
+freesurfer,CA1,34.567891,bert,left,True,
+freesurfer,hippocampal-fissure,345.678912,bert,left,True,
+freesurfer,presubiculum,456.789123,bert,left,True,
+freesurfer,parasubiculum,45.678912,bert,left,True,
+freesurfer,molecular_layer_HP,56.789123,bert,left,True,
+freesurfer,GC-ML-DG,567.891234,bert,left,True,
+freesurfer,CA3,678.912345,bert,left,True,
+freesurfer,CA4,789.123456,bert,left,True,
+freesurfer,fimbria,89.123456,bert,left,True,
+freesurfer,HATA,91.234567,bert,left,True,
+freesurfer,Whole_hippocampus,1234.567899,bert,left,True,
+freesurfer,Hippocampal_tail,124.456789,bert,left,True,T2
+freesurfer,subiculum,244.567891,bert,left,True,T2
+freesurfer,CA1,44.567891,bert,left,True,T2
+freesurfer,hippocampal-fissure,445.678912,bert,left,True,T2
+freesurfer,presubiculum,456.789124,bert,left,True,T2
+freesurfer,parasubiculum,45.678912,bert,left,True,T2
+freesurfer,molecular_layer_HP,56.789124,bert,left,True,T2
+freesurfer,GC-ML-DG,567.891244,bert,left,True,T2
+freesurfer,CA3,678.912445,bert,left,True,T2
+freesurfer,CA4,789.124456,bert,left,True,T2
+freesurfer,fimbria,89.124456,bert,left,True,T2
+freesurfer,HATA,91.244567,bert,left,True,T2
+freesurfer,Whole_hippocampus,1244.567899,bert,left,True,T2