Skip to content

Commit 32ade6a

Browse files
committed
RF: Use a Recoder to handle forms of brain structure names
1 parent ae960ed commit 32ade6a

File tree

2 files changed

+59
-34
lines changed

2 files changed

+59
-34
lines changed

nibabel/cifti2/cifti2.py

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from ..nifti2 import Nifti2Image, Nifti2Header
2727
from ..arrayproxy import reshape_dataobj
2828
from ..caret import CaretMetaData
29+
from ..volumeutils import Recoder
2930
from warnings import warn
3031

3132

@@ -57,38 +58,62 @@ class Cifti2HeaderError(Exception):
5758
'METER',
5859
'RADIAN')
5960

60-
CIFTI_BRAIN_STRUCTURES = ('CIFTI_STRUCTURE_ACCUMBENS_LEFT',
61-
'CIFTI_STRUCTURE_ACCUMBENS_RIGHT',
62-
'CIFTI_STRUCTURE_ALL_WHITE_MATTER',
63-
'CIFTI_STRUCTURE_ALL_GREY_MATTER',
64-
'CIFTI_STRUCTURE_AMYGDALA_LEFT',
65-
'CIFTI_STRUCTURE_AMYGDALA_RIGHT',
66-
'CIFTI_STRUCTURE_BRAIN_STEM',
67-
'CIFTI_STRUCTURE_CAUDATE_LEFT',
68-
'CIFTI_STRUCTURE_CAUDATE_RIGHT',
69-
'CIFTI_STRUCTURE_CEREBELLAR_WHITE_MATTER_LEFT',
70-
'CIFTI_STRUCTURE_CEREBELLAR_WHITE_MATTER_RIGHT',
71-
'CIFTI_STRUCTURE_CEREBELLUM',
72-
'CIFTI_STRUCTURE_CEREBELLUM_LEFT',
73-
'CIFTI_STRUCTURE_CEREBELLUM_RIGHT',
74-
'CIFTI_STRUCTURE_CEREBRAL_WHITE_MATTER_LEFT',
75-
'CIFTI_STRUCTURE_CEREBRAL_WHITE_MATTER_RIGHT',
76-
'CIFTI_STRUCTURE_CORTEX',
77-
'CIFTI_STRUCTURE_CORTEX_LEFT',
78-
'CIFTI_STRUCTURE_CORTEX_RIGHT',
79-
'CIFTI_STRUCTURE_DIENCEPHALON_VENTRAL_LEFT',
80-
'CIFTI_STRUCTURE_DIENCEPHALON_VENTRAL_RIGHT',
81-
'CIFTI_STRUCTURE_HIPPOCAMPUS_LEFT',
82-
'CIFTI_STRUCTURE_HIPPOCAMPUS_RIGHT',
83-
'CIFTI_STRUCTURE_OTHER',
84-
'CIFTI_STRUCTURE_OTHER_GREY_MATTER',
85-
'CIFTI_STRUCTURE_OTHER_WHITE_MATTER',
86-
'CIFTI_STRUCTURE_PALLIDUM_LEFT',
87-
'CIFTI_STRUCTURE_PALLIDUM_RIGHT',
88-
'CIFTI_STRUCTURE_PUTAMEN_LEFT',
89-
'CIFTI_STRUCTURE_PUTAMEN_RIGHT',
90-
'CIFTI_STRUCTURE_THALAMUS_LEFT',
91-
'CIFTI_STRUCTURE_THALAMUS_RIGHT')
61+
62+
def _full_structure(struct):
63+
""" Expands STRUCT_NAME into:
64+
65+
STRUCT_NAME, CIFTI_STRUCTURE_STRUCT_NAME, StructName
66+
"""
67+
return (
68+
struct,
69+
f"CIFTI_STRUCTURE_{struct}",
70+
"".join(word.capitalize() for word in struct.split("_"))
71+
)
72+
73+
74+
CIFTI_BRAIN_STRUCTURES = Recoder((
75+
# For simplicity of comparison, use the ordering from:
76+
# https://github.com/Washington-University/workbench/blob/b985f5d/src/Common/StructureEnum.cxx
77+
# (name, ciftiname, guiname)
78+
# ('CORTEX_LEFT', 'CIFTI_STRUCTURE_CORTEX_LEFT', 'CortexLeft')
79+
_full_structure("CORTEX_LEFT"),
80+
_full_structure("CORTEX_RIGHT"),
81+
_full_structure("CEREBELLUM"),
82+
_full_structure("ACCUMBENS_LEFT"),
83+
_full_structure("ACCUMBENS_RIGHT"),
84+
_full_structure("ALL"),
85+
_full_structure("ALL_GREY_MATTER"),
86+
_full_structure("ALL_WHITE_MATTER"),
87+
_full_structure("AMYGDALA_LEFT"),
88+
_full_structure("AMYGDALA_RIGHT"),
89+
_full_structure("BRAIN_STEM"),
90+
_full_structure("CAUDATE_LEFT"),
91+
_full_structure("CAUDATE_RIGHT"),
92+
_full_structure("CEREBELLAR_WHITE_MATTER_LEFT"),
93+
_full_structure("CEREBELLAR_WHITE_MATTER_RIGHT"),
94+
_full_structure("CEREBELLUM_LEFT"),
95+
_full_structure("CEREBELLUM_RIGHT"),
96+
_full_structure("CEREBRAL_WHITE_MATTER_LEFT"),
97+
_full_structure("CEREBRAL_WHITE_MATTER_RIGHT"),
98+
_full_structure("CORTEX"),
99+
_full_structure("DIENCEPHALON_VENTRAL_LEFT"),
100+
_full_structure("DIENCEPHALON_VENTRAL_RIGHT"),
101+
_full_structure("HIPPOCAMPUS_LEFT"),
102+
_full_structure("HIPPOCAMPUS_RIGHT"),
103+
_full_structure("INVALID"),
104+
_full_structure("OTHER"),
105+
_full_structure("OTHER_GREY_MATTER"),
106+
_full_structure("OTHER_WHITE_MATTER"),
107+
_full_structure("PALLIDUM_LEFT"),
108+
_full_structure("PALLIDUM_RIGHT"),
109+
_full_structure("PUTAMEN_LEFT"),
110+
_full_structure("PUTAMEN_RIGHT"),
111+
## Also commented out in connectome_wb; unclear if deprecated, planned, or what
112+
# _full_structure("SUBCORTICAL_WHITE_MATTER_LEFT")
113+
# _full_structure("SUBCORTICAL_WHITE_MATTER_RIGHT")
114+
_full_structure("THALAMUS_LEFT"),
115+
_full_structure("THALAMUS_RIGHT"),
116+
), fields=('name', 'ciftiname', 'guiname'))
92117

93118

94119
def _value_if_klass(val, klass):

nibabel/cifti2/cifti2_axes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ def to_cifti_brain_structure_name(name):
502502
ValueError: raised if the input name does not match a known anatomical structure in CIFTI-2
503503
"""
504504
if name in cifti2.CIFTI_BRAIN_STRUCTURES:
505-
return name
505+
return cifti2.CIFTI_BRAIN_STRUCTURES.ciftiname[name]
506506
if not isinstance(name, str):
507507
if len(name) == 1:
508508
structure = name[0]
@@ -536,7 +536,7 @@ def to_cifti_brain_structure_name(name):
536536
proposed_name = f'CIFTI_STRUCTURE_{structure.upper()}'
537537
else:
538538
proposed_name = f'CIFTI_STRUCTURE_{structure.upper()}_{orientation.upper()}'
539-
if proposed_name not in cifti2.CIFTI_BRAIN_STRUCTURES:
539+
if proposed_name not in cifti2.CIFTI_BRAIN_STRUCTURES.ciftiname:
540540
raise ValueError(f'{name} was interpreted as {proposed_name}, which is not '
541541
'a valid CIFTI brain structure')
542542
return proposed_name

0 commit comments

Comments
 (0)