Prechádzať zdrojové kódy

CorticalParcellationStats.structure_measurements column names: lower & replace spaces with underscores

Fabian Peter Hammerle 5 rokov pred
rodič
commit
a983315872

+ 7 - 6
freesurfer_stats/__init__.py

@@ -41,6 +41,7 @@ class CorticalParcellationStats:
     _HEMISPHERE_PREFIX_TO_SIDE = {'lh': 'left', 'rh': 'right'}
     _GENERAL_MEASUREMENTS_REGEX = re.compile(
         r'^Measure \S+, ([^,\s]+),? ([^,]+), ([\d\.]+), (\S+)$')
+    _COLUMN_NAMES_NON_SAFE_REGEX = re.compile(r'\s+')
 
     def __init__(self):
         self.headers \
@@ -91,13 +92,13 @@ class CorticalParcellationStats:
                         attr_value, '%Y/%m/%d %H:%M:%S')
                 self.headers[attr_name] = attr_value
 
-    @staticmethod
-    def _format_column_name(column_attrs: typing.Dict[str, str]) -> str:
-        name = column_attrs['FieldName']
+    @classmethod
+    def _format_column_name(cls, column_attrs: typing.Dict[str, str]) -> str:
+        name = column_attrs['FieldName'].lower()
         unit = column_attrs['Units']
-        if unit in ['unitless', 'NA']:
-            return name
-        return '{} ({})'.format(name, unit)
+        if unit not in ['unitless', 'NA']:
+            name += '_' + unit
+        return cls._COLUMN_NAMES_NON_SAFE_REGEX.sub('_', name)
 
     @classmethod
     def _read_column_attributes(cls, num: int, stream: typing.TextIO) \

+ 60 - 60
tests/test_cortical_parcellation_stats.py

@@ -39,36 +39,36 @@ from freesurfer_stats import CorticalParcellationStats
        'Supratentorial volume': (1172669.548920, 'mm^3'),
        'Supratentorial volume Without Ventricles': (1164180.548920, 'mm^3'),
        'Estimated Total Intracranial Volume': (1670487.274486, 'mm^3')},
-      [{'Structure Name': 'caudalanteriorcingulate',
-        'Number of Vertices': 2061,
-        'Surface Area (mm^2)': 1472,
-        'Gray Matter Volume (mm^3)': 4258,
-        'Average Thickness (mm)': 2.653,
-        'Thickness StdDev (mm)': 0.644,
-        'Integrated Rectified Mean Curvature (mm^-1)': 0.135,
-        'Integrated Rectified Gaussian Curvature (mm^-2)': 0.020,
-        'Folding Index': 27,
-        'Intrinsic Curvature Index': 1.6},
-       {'Structure Name': 'caudalmiddlefrontal',
-        'Number of Vertices': 4451,
-        'Surface Area (mm^2)': 3039,
-        'Gray Matter Volume (mm^3)': 8239,
-        'Average Thickness (mm)': 2.456,
-        'Thickness StdDev (mm)': 0.486,
-        'Integrated Rectified Mean Curvature (mm^-1)': 0.116,
-        'Integrated Rectified Gaussian Curvature (mm^-2)': 0.020,
-        'Folding Index': 42,
-        'Intrinsic Curvature Index': 3.7},
-       {'Structure Name': 'insula',
-        'Number of Vertices': 3439,
-        'Surface Area (mm^2)': 2304,
-        'Gray Matter Volume (mm^3)': 7594,
-        'Average Thickness (mm)': 3.193,
-        'Thickness StdDev (mm)': 0.620,
-        'Integrated Rectified Mean Curvature (mm^-1)': 0.116,
-        'Integrated Rectified Gaussian Curvature (mm^-2)': 0.027,
-        'Folding Index': 33,
-        'Intrinsic Curvature Index': 3.5}]),
+      [{'structure_name': 'caudalanteriorcingulate',
+        'number_of_vertices': 2061,
+        'surface_area_mm^2': 1472,
+        'gray_matter_volume_mm^3': 4258,
+        'average_thickness_mm': 2.653,
+        'thickness_stddev_mm': 0.644,
+        'integrated_rectified_mean_curvature_mm^-1': 0.135,
+        'integrated_rectified_gaussian_curvature_mm^-2': 0.020,
+        'folding_index': 27,
+        'intrinsic_curvature_index': 1.6},
+       {'structure_name': 'caudalmiddlefrontal',
+        'number_of_vertices': 4451,
+        'surface_area_mm^2': 3039,
+        'gray_matter_volume_mm^3': 8239,
+        'average_thickness_mm': 2.456,
+        'thickness_stddev_mm': 0.486,
+        'integrated_rectified_mean_curvature_mm^-1': 0.116,
+        'integrated_rectified_gaussian_curvature_mm^-2': 0.020,
+        'folding_index': 42,
+        'intrinsic_curvature_index': 3.7},
+       {'structure_name': 'insula',
+        'number_of_vertices': 3439,
+        'surface_area_mm^2': 2304,
+        'gray_matter_volume_mm^3': 7594,
+        'average_thickness_mm': 3.193,
+        'thickness_stddev_mm': 0.620,
+        'integrated_rectified_mean_curvature_mm^-1': 0.116,
+        'integrated_rectified_gaussian_curvature_mm^-2': 0.027,
+        'folding_index': 33,
+        'intrinsic_curvature_index': 3.5}]),
      (os.path.join(
          SUBJECTS_DIR, 'fabian', 'stats', 'rh.aparc.pial.stats.short'),
       {'CreationTime': datetime.datetime(2019, 5, 9, 21, 3, 42, tzinfo=datetime.timezone.utc),
@@ -98,26 +98,26 @@ from freesurfer_stats import CorticalParcellationStats
        'Supratentorial volume': (1172669.548920, 'mm^3'),
        'Supratentorial volume Without Ventricles': (1164180.548920, 'mm^3'),
        'Estimated Total Intracranial Volume': (1670487.274486, 'mm^3')},
-      [{'Structure Name': 'bankssts',
-        'Number of Vertices': 1344,
-        'Surface Area (mm^2)': 825,
-        'Gray Matter Volume (mm^3)': 2171,
-        'Average Thickness (mm)': 2.436,
-        'Thickness StdDev (mm)': 0.381,
-        'Integrated Rectified Mean Curvature (mm^-1)': 0.115,
-        'Integrated Rectified Gaussian Curvature (mm^-2)': 0.028,
-        'Folding Index': 19,
-        'Intrinsic Curvature Index': 1.7},
-       {'Structure Name': 'transversetemporal',
-        'Number of Vertices': 651,
-        'Surface Area (mm^2)': 545,
-        'Gray Matter Volume (mm^3)': 1061,
-        'Average Thickness (mm)': 2.251,
-        'Thickness StdDev (mm)': 0.317,
-        'Integrated Rectified Mean Curvature (mm^-1)': 0.110,
-        'Integrated Rectified Gaussian Curvature (mm^-2)': 0.021,
-        'Folding Index': 3,
-        'Intrinsic Curvature Index': 0.6}])],
+      [{'structure_name': 'bankssts',
+        'number_of_vertices': 1344,
+        'surface_area_mm^2': 825,
+        'gray_matter_volume_mm^3': 2171,
+        'average_thickness_mm': 2.436,
+        'thickness_stddev_mm': 0.381,
+        'integrated_rectified_mean_curvature_mm^-1': 0.115,
+        'integrated_rectified_gaussian_curvature_mm^-2': 0.028,
+        'folding_index': 19,
+        'intrinsic_curvature_index': 1.7},
+       {'structure_name': 'transversetemporal',
+        'number_of_vertices': 651,
+        'surface_area_mm^2': 545,
+        'gray_matter_volume_mm^3': 1061,
+        'average_thickness_mm': 2.251,
+        'thickness_stddev_mm': 0.317,
+        'integrated_rectified_mean_curvature_mm^-1': 0.110,
+        'integrated_rectified_gaussian_curvature_mm^-2': 0.021,
+        'folding_index': 3,
+        'intrinsic_curvature_index': 0.6}])],
 )
 def test_read(path, headers, hemisphere, whole_brain_measurements, structure_measurements):
     stats = CorticalParcellationStats.read(path)
@@ -126,16 +126,16 @@ def test_read(path, headers, hemisphere, whole_brain_measurements, structure_mea
     assert_approx_equal(whole_brain_measurements,
                         stats.whole_brain_measurements)
     assert list(stats.structure_measurements.columns) == [
-        'Structure Name',
-        'Number of Vertices',
-        'Surface Area (mm^2)',
-        'Gray Matter Volume (mm^3)',
-        'Average Thickness (mm)',
-        'Thickness StdDev (mm)',
-        'Integrated Rectified Mean Curvature (mm^-1)',
-        'Integrated Rectified Gaussian Curvature (mm^-2)',
-        'Folding Index',
-        'Intrinsic Curvature Index',
+        'structure_name',
+        'number_of_vertices',
+        'surface_area_mm^2',
+        'gray_matter_volume_mm^3',
+        'average_thickness_mm',
+        'thickness_stddev_mm',
+        'integrated_rectified_mean_curvature_mm^-1',
+        'integrated_rectified_gaussian_curvature_mm^-2',
+        'folding_index',
+        'intrinsic_curvature_index',
     ]
     pandas.util.testing.assert_frame_equal(
         left=pandas.DataFrame(structure_measurements),