Skip to content

Commit 7300e95

Browse files
committed
RF: Use a Recoder to handle forms of brain structure names
1 parent 324d5d4 commit 7300e95

File tree

2 files changed

+61
-35
lines changed

2 files changed

+61
-35
lines changed

nibabel/cifti2/cifti2.py

Lines changed: 59 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
from ..nifti2 import Nifti2Image, Nifti2Header
3131
from ..arrayproxy import reshape_dataobj
3232
from ..caret import CaretMetaData
33-
from ..volumeutils import make_dt_codes
33+
from ..volumeutils import make_dt_codes, Recoder
34+
from ..volumeutils import Recoder
35+
from warnings import warn
3436

3537

3638
def _float_01(val):
@@ -77,38 +79,62 @@ class Cifti2HeaderError(Exception):
7779
'METER',
7880
'RADIAN')
7981

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

113139

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