Skip to content

Commit 4e7ad07

Browse files
authored
Merge pull request #1256 from effigies/enh/cifti-constants
ENH: Expand CIFTI2 constants to use a synonym recoder
2 parents 590b226 + 20bffc3 commit 4e7ad07

File tree

2 files changed

+63
-38
lines changed

2 files changed

+63
-38
lines changed

nibabel/cifti2/cifti2.py

+59-34
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from ..filebasedimages import FileBasedHeader, SerializableImage
3131
from ..nifti1 import Nifti1Extensions
3232
from ..nifti2 import Nifti2Header, Nifti2Image
33-
from ..volumeutils import make_dt_codes
33+
from ..volumeutils import Recoder, make_dt_codes
3434

3535

3636
def _float_01(val):
@@ -80,39 +80,64 @@ class Cifti2HeaderError(Exception):
8080
'RADIAN',
8181
)
8282

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

118143

nibabel/cifti2/cifti2_axes.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ def to_cifti_brain_structure_name(name):
520520
ValueError: raised if the input name does not match a known anatomical structure in CIFTI-2
521521
"""
522522
if name in cifti2.CIFTI_BRAIN_STRUCTURES:
523-
return name
523+
return cifti2.CIFTI_BRAIN_STRUCTURES.ciftiname[name]
524524
if not isinstance(name, str):
525525
if len(name) == 1:
526526
structure = name[0]
@@ -554,10 +554,10 @@ def to_cifti_brain_structure_name(name):
554554
proposed_name = f'CIFTI_STRUCTURE_{structure.upper()}'
555555
else:
556556
proposed_name = f'CIFTI_STRUCTURE_{structure.upper()}_{orientation.upper()}'
557-
if proposed_name not in cifti2.CIFTI_BRAIN_STRUCTURES:
557+
if proposed_name not in cifti2.CIFTI_BRAIN_STRUCTURES.ciftiname:
558558
raise ValueError(
559-
f'{name} was interpreted as {proposed_name}, which is not '
560-
'a valid CIFTI brain structure'
559+
f'{name} was interpreted as {proposed_name}, '
560+
'which is not a valid CIFTI brain structure'
561561
)
562562
return proposed_name
563563

0 commit comments

Comments
 (0)