Skip to content

Commit 2e452e7

Browse files
committed
Fix BIDS label validation errors for atlas and regressor names
Apply bids_safe_label() to all BIDS entity values passed to save(), derive(), and expect() calls. Fixes ValueError when atlas names contain underscores (e.g. schaefer_200) or regressor names contain hyphens (e.g. 36-parameter), which are invalid in BIDS labels. Also fixes QC resolve using .mat extension while functional export writes .txt for bold_to_anat_matrix. Affected files: - cli/all.py: 6 save/derive sites - cli/functional.py: 2 save sites - cli/metrics.py: 5 save/derive/expect sites - cli/qc.py: 2 save sites + 1 expect site + .mat->.txt fix
1 parent 0c438f3 commit 2e452e7

4 files changed

Lines changed: 30 additions & 18 deletions

File tree

src/rbc/cli/all.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,13 @@ def main(args: AllArgs) -> int: # noqa: C901
221221
func_outputs.regressed_bold[regressor],
222222
suffix=Suffix.BOLD,
223223
desc="regressed",
224-
extra={"reg": regressor},
224+
extra={"reg": bids_safe_label(regressor)},
225225
)
226226
mni.save(
227227
func_outputs.cleaned_bold[regressor],
228228
suffix=Suffix.BOLD,
229229
desc="preproc",
230-
extra={"reg": regressor},
230+
extra={"reg": bids_safe_label(regressor)},
231231
)
232232

233233
mni.save(func_outputs.template_bold, suffix=Suffix.BOLD, desc="preproc")
@@ -248,7 +248,7 @@ def main(args: AllArgs) -> int: # noqa: C901
248248
fwhm=args.fwhm,
249249
)
250250

251-
mex = mni.derive(extra={"reg": regressor})
251+
mex = mni.derive(extra={"reg": bids_safe_label(regressor)})
252252
mex.save(metrics_outputs.alff, suffix="alff")
253253
mex.save(metrics_outputs.falff, suffix="falff")
254254
mex.save(metrics_outputs.alff_smooth, suffix="alff", desc="smooth")
@@ -266,14 +266,14 @@ def main(args: AllArgs) -> int: # noqa: C901
266266
suffix="timeseries",
267267
desc="mean",
268268
extension=".tsv",
269-
atlas=atlas,
269+
atlas=bids_safe_label(atlas),
270270
)
271271
mex.save(
272272
metrics_outputs.correlation_matrix[atlas],
273273
suffix="correlations",
274274
desc="pearson",
275275
extension=".tsv",
276-
atlas=atlas,
276+
atlas=bids_safe_label(atlas),
277277
)
278278

279279
# --- QC ---
@@ -304,7 +304,7 @@ def main(args: AllArgs) -> int: # noqa: C901
304304
suffix="quality",
305305
desc="xcp",
306306
extension=".tsv",
307-
extra={"reg": regressor},
307+
extra={"reg": bids_safe_label(regressor)},
308308
)
309309

310310
status = "PASSED" if qc_outputs.passed else "FAILED"

src/rbc/cli/functional.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,13 @@ def main(args: FunctionalArgs) -> int:
172172
outputs.regressed_bold[regressor],
173173
suffix=Suffix.BOLD,
174174
desc="regressed",
175-
extra={"reg": regressor},
175+
extra={"reg": bids_safe_label(regressor)},
176176
)
177177
mni.save(
178178
outputs.cleaned_bold[regressor],
179179
suffix=Suffix.BOLD,
180180
desc="preproc",
181-
extra={"reg": regressor},
181+
extra={"reg": bids_safe_label(regressor)},
182182
)
183183
mni.save(outputs.template_bold, suffix=Suffix.BOLD, desc="preproc")
184184
mni.save(outputs.template_brain_mask, suffix=Suffix.MASK, desc="bold")

src/rbc/cli/metrics.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@
1717
from rbc.cli import _DEFAULT_ENV_VARS, _FUNC_GROUP_ENTITIES, _SUB_SES_QUERY
1818
from rbc.cli.base import BaseArgs, _validate_atlas, _validate_positive, _validate_task
1919
from rbc.context import RunContext
20-
from rbc.core.bids import Datatype, Suffix, TemplateSpace, extract_entities
20+
from rbc.core.bids import (
21+
Datatype,
22+
Suffix,
23+
TemplateSpace,
24+
bids_safe_label,
25+
extract_entities,
26+
)
2127
from rbc.core.bids2table import load_table
2228
from rbc.core.niwrap import setup_runner
2329
from rbc.workflows.metrics import single_session_metrics
@@ -132,13 +138,13 @@ def main(args: MetricsArgs) -> int:
132138
deriv_df,
133139
suffix=Suffix.BOLD,
134140
desc="regressed",
135-
extra={"reg": regressor},
141+
extra={"reg": bids_safe_label(regressor)},
136142
)
137143
cleaned_bold = mni_q.expect(
138144
deriv_df,
139145
suffix=Suffix.BOLD,
140146
desc="preproc",
141-
extra={"reg": regressor},
147+
extra={"reg": bids_safe_label(regressor)},
142148
)
143149

144150
tr = args.tr if args.tr is not None else _read_header_tr(regressed_bold)
@@ -152,7 +158,7 @@ def main(args: MetricsArgs) -> int:
152158
fwhm=args.fwhm,
153159
)
154160

155-
mex = mni_q.derive(extra={"reg": regressor})
161+
mex = mni_q.derive(extra={"reg": bids_safe_label(regressor)})
156162
mex.save(outputs.alff, suffix="alff")
157163
mex.save(outputs.falff, suffix="falff")
158164
mex.save(outputs.alff_smooth, suffix="alff", desc="smooth")
@@ -168,14 +174,14 @@ def main(args: MetricsArgs) -> int:
168174
suffix="timeseries",
169175
desc="mean",
170176
extension=".tsv",
171-
atlas=atlas,
177+
atlas=bids_safe_label(atlas),
172178
)
173179
mex.save(
174180
outputs.correlation_matrix[atlas],
175181
suffix="correlations",
176182
desc="pearson",
177183
extension=".tsv",
178-
atlas=atlas,
184+
atlas=bids_safe_label(atlas),
179185
)
180186
pipe_ctx.ensure_dataset_description()
181187

src/rbc/cli/qc.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@
1616
from rbc.cli import _DEFAULT_ENV_VARS, _FUNC_GROUP_ENTITIES, _SUB_SES_QUERY
1717
from rbc.cli.base import BaseArgs, _validate_positive, _validate_task
1818
from rbc.context import RunContext
19-
from rbc.core.bids import Datatype, Suffix, TemplateSpace, extract_entities
19+
from rbc.core.bids import (
20+
Datatype,
21+
Suffix,
22+
TemplateSpace,
23+
bids_safe_label,
24+
extract_entities,
25+
)
2026
from rbc.core.bids2table import load_table
2127
from rbc.core.niwrap import setup_runner
2228
from rbc.workflows.qc import single_session_qc
@@ -99,7 +105,7 @@ def main(args: QCArgs) -> int:
99105
deriv_df,
100106
suffix=Suffix.BOLD,
101107
desc="preproc",
102-
extra={"reg": regressor},
108+
extra={"reg": bids_safe_label(regressor)},
103109
)
104110
for regressor in args.regressor
105111
}
@@ -123,7 +129,7 @@ def main(args: QCArgs) -> int:
123129
deriv_df,
124130
suffix="xfm",
125131
desc="linear",
126-
extension=".mat",
132+
extension=".txt",
127133
extra={"from": "bold", "to": "T1w", "mode": "image"},
128134
)
129135
template_brain_mask = func_mni.expect(
@@ -156,7 +162,7 @@ def main(args: QCArgs) -> int:
156162
suffix="quality",
157163
desc="xcp",
158164
extension=".tsv",
159-
extra={"reg": regressor},
165+
extra={"reg": bids_safe_label(regressor)},
160166
)
161167

162168
status = "PASSED" if qc_outputs.passed else "FAILED"

0 commit comments

Comments
 (0)