Summary of what happened:
When running XCP-D v. 0.10.5
(then reproduced with v. 0.11.1
), various nodes (plot_design_matrix
and censor report
) fail with the following message:
Traceback (most recent call last):
File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/plugins/linear.py", line 45, in run
node.run(updatehash=updatehash)
File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 525, in run
result = self._run_interface(execute=True)
File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 643, in _run_interface
return self._run_command(execute)
File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 769, in _run_command
raise NodeExecutionError(msg)
nipype.pipeline.engine.nodes.NodeExecutionError: Exception raised while executing Node plot_design_matrix.
Traceback:
Traceback (most recent call last):
File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 401, in run
runtime = self._run_interface(runtime)
File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/utility/wrappers.py", line 139, in _run_interface
out = function_handle(**args)
File "<string>", line 43, in plot_design_matrix
File "/usr/local/miniconda/lib/python3.10/site-packages/nilearn/_utils/helpers.py", line 108, in wrapper
return func(*args, **kwargs)
File "/usr/local/miniconda/lib/python3.10/site-packages/nilearn/plotting/matrix/matrix_plotting.py", line 400, in plot_design_matrix
return save_figure_if_needed(axes, output_file)
File "/usr/local/miniconda/lib/python3.10/site-packages/nilearn/plotting/_utils.py", line 50, in save_figure_if_needed
fig.savefig(output_file)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/figure.py", line 3490, in savefig
self.canvas.print_figure(fname, **kwargs)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/backend_bases.py", line 2155, in print_figure
self.figure.draw(renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/artist.py", line 94, in draw_wrapper
result = draw(artist, renderer, *args, **kwargs)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/artist.py", line 71, in draw_wrapper
return draw(artist, renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/figure.py", line 3257, in draw
mimage._draw_list_compositing_images(
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/image.py", line 134, in _draw_list_compositing_images
a.draw(renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/artist.py", line 71, in draw_wrapper
return draw(artist, renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/axes/_base.py", line 3181, in draw
mimage._draw_list_compositing_images(
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/image.py", line 159, in _draw_list_compositing_images
a.draw(renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/artist.py", line 71, in draw_wrapper
return draw(artist, renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/axis.py", line 1416, in draw
tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/axis.py", line 1345, in _get_ticklabel_bboxes
[tick.label2.get_window_extent(renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/axis.py", line 1345, in <listcomp>
[tick.label2.get_window_extent(renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/text.py", line 969, in get_window_extent
bbox, info, descent = self._get_layout(self._renderer)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/text.py", line 373, in _get_layout
_, lp_h, lp_d = _get_text_metrics_with_cache(
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/text.py", line 69, in _get_text_metrics_with_cache
return _get_text_metrics_with_cache_impl(
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/text.py", line 77, in _get_text_metrics_with_cache_impl
return renderer_ref().get_text_width_height_descent(text, fontprop, ismath)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/backends/backend_svg.py", line 1299, in get_text_width_height_descent
return self._text2path.get_text_width_height_descent(s, prop, ismath)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/textpath.py", line 63, in get_text_width_height_descent
font = self._get_font(prop)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/textpath.py", line 34, in _get_font
filenames = _fontManager._find_fonts_by_props(prop)
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/font_manager.py", line 1441, in _find_fonts_by_props
self.findfont(
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/font_manager.py", line 1352, in findfont
ret = self._findfont_cached(
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/font_manager.py", line 1503, in _findfont_cached
return self.findfont(default_prop, fontext, directory,
File "/usr/local/miniconda/lib/python3.10/site-packages/matplotlib/font_manager.py", line 1356, in findfont
raise ret.to_exception()
ValueError: Failed to find font DejaVu Sans:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0, and fallback to the default font was disabled
Command used (and if a helper script was used, a link to the helper script or the command generated):
apptainer run \
-B ${fmri_dir}:/fmri_dir/:ro \
-B ${output_dir}:/output/ \
-B "${wkdir}":/wkdir/ \
-B /tmp:/scrth \
${xcpd} \
/fmri_dir/ /output/ participant \
--work-dir "/wkdir/" \
--clean-workdir \
--participant-label "${sub}" \
--session-id 01 \
--task-id rest \
--mode none \
--file-format nifti \
--input-type fmriprep \
--nuisance-regressors '27P' \
--motion-filter-type lp \
--band-stop-min 6 \
--despike y \
--fd-thresh 0.2 \
--min-coverage 0.5 \
--min-time 60 \
--combine-runs y \
--output-type censored \
--warp-surfaces-native2std n \
--atlases Glasser Gordon \
--smoothing 6 \
--abcc-qc n --linc-qc n \
--nprocs 27 \
--debug all -vvv --write-graph | \
tee -a "${logfile}"
Version:
0.10.5 and 0.11.1
Environment (Docker, Singularity / Apptainer, custom installation):
Apptainer
Data formatted according to a validatable standard? Please provide the output of the validator:
Input is fMRIPREP v. 25.0.0 output.
Relevant log outputs (up to 20 lines):
250820-14:14:24,174 nipype.workflow DEBUG:
Resolving paths in outputs loaded from results file.
250820-14:14:24,174 nipype.workflow DEBUG:
output: denoised_interpolated_bold
250820-14:14:24,174 nipype.workflow DEBUG:
[Node] censor_interpolated_data - setting input in_file = /wkdir/xcp_d_0_0_wf/sub_CLB00005_wf/postprocess_0_wf/denoise_bold_wf/regress_and_filter_bold/filtered_denoised.nii.gz
250820-14:14:24,174 nipype.utils DEBUG:
Loading pkl: /wkdir/xcp_d_0_0_wf/sub_CLB00005_wf/postprocess_0_wf/prepare_confounds_wf/process_motion/result_process_motion.pklz
250820-14:14:24,195 nipype.workflow DEBUG:
Resolving paths in outputs loaded from results file.
250820-14:14:24,196 nipype.workflow DEBUG:
output: temporal_mask
250820-14:14:24,196 nipype.workflow DEBUG:
[Node] censor_interpolated_data - setting input temporal_mask = /wkdir/xcp_d_0_0_wf/sub_CLB00005_wf/postprocess_0_wf/prepare_confounds_wf/process_motion/desc-fd_outliers.tsv
250820-14:14:24,197 nipype.utils DEBUG:
Removing contents of /wkdir/xcp_d_0_0_wf/sub_CLB00005_wf/postprocess_0_wf/denoise_bold_wf/censor_interpolated_data
250820-14:14:24,200 nipype.workflow DEBUG:
[Node] Writing pre-exec report to "/wkdir/xcp_d_0_0_wf/sub_CLB00005_wf/postprocess_0_wf/denoise_bold_wf/censor_interpolated_data/_report/report.rst"
250820-14:14:24,202 nipype.workflow INFO:
[Node] Executing "censor_interpolated_data" <xcp_d.interfaces.censoring.Censor>
I have verified that DejaVu Sans
does seem to be installed on the computer (Ubuntu 22.04.5 LTS).
I have not tried binding host font directories to the container.