Browse Source

accept multiple args for positional param `root_dir_paths`

fixes https://github.com/fphammerle/freesurfer-volume-reader/pull/3/commits/8fd97e7d69488307d229adcdf489d676f34e8e40#diff-4ee116919089288637eedee88ed59101R187
Fabian Peter Hammerle 5 years ago
parent
commit
dc771c0829

+ 1 - 0
README.md

@@ -25,6 +25,7 @@ or
 
 ```sh
 freesurfer-volume-reader /my/freesurfer/subjects
+freesurfer-volume-reader /my/freesurfer/subjects /other/freesurfer/subjects
 ```
 
 or

+ 1 - 0
examples/barplot.py

@@ -7,6 +7,7 @@ import seaborn
 from freesurfer_volume_reader import find_hippocampal_volume_files, \
                                      read_hippocampal_volume_file_dataframe
 
+
 def abbreviate_analysis_id(analysis_id):
     return analysis_id.split('_')[0] if analysis_id else None
 

+ 7 - 6
freesurfer_volume_reader/__init__.py

@@ -66,20 +66,21 @@ def read_hippocampal_volume_file_dataframe(volume_file_path: str) -> pandas.Data
 
 def main():
     argparser = argparse.ArgumentParser(description=__doc__)
-    argparser.add_argument('--filename-regex', dest='filename_pattern',
+    argparser.add_argument('--filename-regex', type=re.compile,
                            default=DEFAULT_HIPPOCAMPAL_VOLUME_FIND_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)
-    argparser.add_argument('root_dir_path',
-                           nargs='?' if subjects_dir_path  else 1,
+    argparser.add_argument('root_dir_paths',
+                           metavar='ROOT_DIR',
+                           nargs='*' if subjects_dir_path else '+',
                            default=[subjects_dir_path],
                            help='default: $SUBJECTS_DIR ({})'.format(subjects_dir_path))
     args = argparser.parse_args()
-    volume_file_paths = find_hippocampal_volume_files(
-        root_dir_path=args.root_dir_path[0],
-        filename_regex=re.compile(args.filename_pattern))
+    volume_file_paths = [p for d in args.root_dir_paths
+                         for p in find_hippocampal_volume_files(
+                             root_dir_path=d, filename_regex=args.filename_regex)]
     volume_frames = []
     for volume_file_path in volume_file_paths:
         volume_frame = read_hippocampal_volume_file_dataframe(volume_file_path)

+ 28 - 5
tests/hippocampus_test.py

@@ -51,7 +51,7 @@ def test_find_hippocampal_volume_files_pattern(root_dir_path, filename_pattern,
       'CA1': 34.567891,
       'hippocampal-fissure': 345.678912,
       'presubiculum': 456.789123,
-      'parasubiculum':  45.678912,
+      'parasubiculum': 45.678912,
       'molecular_layer_HP': 56.789123,
       'GC-ML-DG': 567.891234,
       'CA3': 678.912345,
@@ -147,14 +147,19 @@ def assert_volume_frames_equal(left: pandas.DataFrame, right: pandas.DataFrame):
     )
 
 
-@pytest.mark.parametrize(('root_dir_path', 'expected_csv_path'), [
-    (os.path.join(SUBJECTS_DIR, 'bert'),
+@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'),
+      os.path.join(SUBJECTS_DIR, 'bert')],
+     os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
 ])
-def test_main_root_dir_param(capsys, root_dir_path, expected_csv_path):
+def test_main_root_dir_param(capsys, root_dir_paths: list, expected_csv_path):
     if 'SUBJECTS_DIR' in os.environ:
         del os.environ['SUBJECTS_DIR']
-    with unittest.mock.patch('sys.argv', ['', root_dir_path]):
+    with unittest.mock.patch('sys.argv', [''] + root_dir_paths):
         freesurfer_volume_reader.main()
     out, _ = capsys.readouterr()
     assert_volume_frames_equal(
@@ -183,6 +188,9 @@ def test_main_root_dir_env(capsys, root_dir_path, expected_csv_path):
     (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.abspath(os.sep),
+     os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv')),
 ])
 def test_main_root_dir_overwrite_env(capsys, root_dir_path, subjects_dir, expected_csv_path):
     os.environ['SUBJECTS_DIR'] = subjects_dir
@@ -193,3 +201,18 @@ def test_main_root_dir_overwrite_env(capsys, root_dir_path, subjects_dir, expect
         left=pandas.read_csv(expected_csv_path),
         right=pandas.read_csv(io.StringIO(out)).drop(columns=['source_path']),
     )
+
+
+def test_main_root_dir_filename_regex(capsys):
+    if 'SUBJECTS_DIR' in os.environ:
+        del os.environ['SUBJECTS_DIR']
+    with unittest.mock.patch('sys.argv', ['', '--filename-regex', r'^.*-T1-T2\.v10\.txt$',
+                                          os.path.join(SUBJECTS_DIR, 'bert')]):
+        freesurfer_volume_reader.main()
+    out, _ = capsys.readouterr()
+    expected_volume_frame = pandas.read_csv(
+        os.path.join(SUBJECTS_DIR, 'bert', 'hippocampal-volumes.csv'))
+    assert_volume_frames_equal(
+        left=expected_volume_frame[expected_volume_frame['analysis_id'] == 'T2'].copy(),
+        right=pandas.read_csv(io.StringIO(out)).drop(columns=['source_path']),
+    )

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

@@ -0,0 +1,15 @@
+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,
+

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

@@ -0,0 +1,40 @@
+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