Issue with running xcp-d with nifti file format

Summary of what happened:

Hi all (attn: @tsalo),
I am trying to run the XCP-D pipeline on fmriprep-preprocessed data with nifti as file format. However, I’m running into an error saying that no cifti extension found in file /usr/local/miniconda/lib/python3.10/site-packages/xcp-d/data/atlases/atlas-Glasser_space-MNI152NLin6Asym_res-01_desg.nii.gz when executing the wb_command (see log below). To my understanding, this error is a consequence of the resample_atlas_to_cortical_thickness0 command just before that fails to produce the <label>_space-fsLR_den-91k_thickness.dscalar.nii.gz Am I missing something during the configuration? I am writing below the singularity command (generated with BABS) and part of the log file reporting the error. The pipeline was run on an internetless HPC. Thanks!

Command used (and if a helper script was used, a link to the helper script or the command generated):

stripped_id=${subid#sub-}
sesid="$2"
FMRIPREP_ZIP="$3"


wd=${PWD}
cd inputs/data/fmriprep
7z x `basename ${FMRIPREP_ZIP}`
cd $wd

mkdir -p ${PWD}/.git/tmp/wkdir
singularity run --cleanenv \
	-B ${PWD} \
	-B /home/gabridele/backup/templateflow:/SGLR/TEMPLATEFLOW_HOME \
	-B /home/gabridele/license.txt:/SGLR/FREESURFER_HOME/license.txt \
	--env TEMPLATEFLOW_HOME=/SGLR/TEMPLATEFLOW_HOME \
	containers/.datalad/environments/xcp-d-0-10-1/image \
	inputs/data/fmriprep/fmriprep \
	outputs/xcp_d \
	participant \
	-w ${PWD}/.git/tmp/wkdir \
	--mode nichart \
	--nthreads 48 \
	--omp-nthreads 8 \
	--motion-filter-type none \
	--nuisance-regressors 36P \
	--abcc-qc y \
	--output-type interpolated \
	--lower-bpf 0.01 \
	--upper-bpf 0.08 \
	--combine-runs n \
	--stop-on-first-crash \
	--fs-license-file /SGLR/FREESURFER_HOME/license.txt \
	-vvv \
	--notrack \
	--participant-label "${stripped_id}"

Version:

XCP-D version: 0.10.1 (as of logs), same issue encountered with version 0.10.5
fMRI-prep version: 24.1.1
BABS version: 0.0.8

Environment (Docker, Singularity / Apptainer, custom installation):

Singularity

Data formatted according to a validatable standard? Please provide the output of the validator:

PASTE VALIDATOR OUTPUT HERE

Relevant log outputs (up to 20 lines):

2025-02-06 16:22:25,936 [    INFO] [Job 21] Completed (xcp_d_0_10_wf.sub_01_wf.postprocess_0_wf.execsummary_functional_plots_wf.plot_boldref).
2025-02-06 16:22:25,937 [   DEBUG] Clearing 135 from queue
2025-02-06 16:22:25,937 [   DEBUG] Loading pkl: /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/parcellate_surfaces_wf/resample_atlas_to_cortical_thickness/mapflow/_resample_atlas_to_cortical_thickness0/result__resample_atlas_to_cortical_thickness0.pklz
2025-02-06 16:22:25,937 [   ERROR] Node _resample_atlas_to_cortical_thickness0 failed to run on host sn26.
2025-02-06 16:22:25,938 [   ERROR] Saving crash info to /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/outputs/xcp_d/sub-01/log/20250206-162140_ef7be74c-9287-4e92-b8d4-ce50aa909816/crash-20250206-162225-gabridele-_resample_atlas_to_cortical_thickness0-7cc047da-7bff-4187-8153-ec8bac7c6b2e.txt
Traceback (most recent call last):
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/plugins/multiproc.py", line 67, in run_node
    result["result"] = node.run(updatehash=updatehash)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 527, in run
    result = self._run_interface(execute=True)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 645, in _run_interface
    return self._run_command(execute)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 771, in _run_command
    raise NodeExecutionError(msg)
nipype.pipeline.engine.nodes.NodeExecutionError: Exception raised while executing Node _resample_atlas_to_cortical_thickness0.

Cmdline:
	wb_command -cifti-create-dense-from-template /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/inputs/data/fmriprep/fmriprep/sub-01/ses-1/anat/sub-01_ses-1_space-fsLR_den-91k_thickness.dscalar.nii resampled_atlas.dlabel.nii -cifti /usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz
Stdout:

Stderr:

	While running:
	wb_command -cifti-create-dense-from-template /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/inputs/data/fmriprep/fmriprep/sub-01/ses-1/anat/sub-01_ses-1_space-fsLR_den-91k_thickness.dscalar.nii resampled_atlas.dlabel.nii -cifti /usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz

	ERROR: no cifti extension found in file '/usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz'

Traceback:
	Traceback (most recent call last):
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 453, in aggregate_outputs
	    setattr(outputs, key, val)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/traits_extension.py", line 330, in validate
	    value = super(File, self).validate(objekt, name, value, return_pathlike=True)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/traits_extension.py", line 135, in validate
	    self.error(objekt, name, str(value))
	  File "/usr/local/miniconda/lib/python3.10/site-packages/traits/base_trait_handler.py", line 74, in error
	    raise TraitError(
	traits.trait_errors.TraitError: The 'out_file' trait of a _CiftiCreateDenseFromTemplateOutputSpec instance must be a pathlike object or string representing an existing file, but a value of '/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/parcellate_surfaces_wf/resample_atlas_to_cortical_thickness/mapflow/_resample_atlas_to_cortical_thickness0/resampled_atlas.dlabel.nii' <class 'str'> was specified.

	During handling of the above exception, another exception occurred:

	Traceback (most recent call last):
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 400, in run
	    outputs = self.aggregate_outputs(runtime)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 460, in aggregate_outputs
	    raise FileNotFoundError(msg)
	FileNotFoundError: No such file or directory '/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/parcellate_surfaces_wf/resample_atlas_to_cortical_thickness/mapflow/_resample_atlas_to_cortical_thickness0/resampled_atlas.dlabel.nii' for output 'out_file' of a CiftiCreateDenseFromTemplate interface


2025-02-06 16:22:25,938 [CRITICAL] XCP-D failed: Traceback (most recent call last):
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/plugins/multiproc.py", line 67, in run_node
    result["result"] = node.run(updatehash=updatehash)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 527, in run
    result = self._run_interface(execute=True)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 645, in _run_interface
    return self._run_command(execute)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 771, in _run_command
    raise NodeExecutionError(msg)
nipype.pipeline.engine.nodes.NodeExecutionError: Exception raised while executing Node _resample_atlas_to_cortical_thickness0.

Cmdline:
	wb_command -cifti-create-dense-from-template /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/inputs/data/fmriprep/fmriprep/sub-01/ses-1/anat/sub-01_ses-1_space-fsLR_den-91k_thickness.dscalar.nii resampled_atlas.dlabel.nii -cifti /usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz
Stdout:

Stderr:

	While running:
	wb_command -cifti-create-dense-from-template /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/inputs/data/fmriprep/fmriprep/sub-01/ses-1/anat/sub-01_ses-1_space-fsLR_den-91k_thickness.dscalar.nii resampled_atlas.dlabel.nii -cifti /usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz

	ERROR: no cifti extension found in file '/usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz'

Traceback:
	Traceback (most recent call last):
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 453, in aggregate_outputs
	    setattr(outputs, key, val)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/traits_extension.py", line 330, in validate
	    value = super(File, self).validate(objekt, name, value, return_pathlike=True)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/traits_extension.py", line 135, in validate
	    self.error(objekt, name, str(value))
	  File "/usr/local/miniconda/lib/python3.10/site-packages/traits/base_trait_handler.py", line 74, in error
	    raise TraitError(
	traits.trait_errors.TraitError: The 'out_file' trait of a _CiftiCreateDenseFromTemplateOutputSpec instance must be a pathlike object or string representing an existing file, but a value of '/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/parcellate_surfaces_wf/resample_atlas_to_cortical_thickness/mapflow/_resample_atlas_to_cortical_thickness0/resampled_atlas.dlabel.nii' <class 'str'> was specified.

	During handling of the above exception, another exception occurred:

	Traceback (most recent call last):
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 400, in run
	    outputs = self.aggregate_outputs(runtime)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 460, in aggregate_outputs
	    raise FileNotFoundError(msg)
	FileNotFoundError: No such file or directory '/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/parcellate_surfaces_wf/resample_atlas_to_cortical_thickness/mapflow/_resample_atlas_to_cortical_thickness0/resampled_atlas.dlabel.nii' for output 'out_file' of a CiftiCreateDenseFromTemplate interface


2025-02-06 16:22:26,137 [   DEBUG] open file: /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/outputs/xcp_d/dataset_description.json
2025-02-06 16:22:26,358 [    INFO] Generating executive summary.
2025-02-06 16:22:26,385 [   DEBUG] open file: /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/outputs/xcp_d/dataset_description.json
2025-02-06 16:22:26,387 [    INFO] [Node] Setting-up "xcp_d_0_10_wf.sub_01_wf.postprocess_0_wf.prepare_confounds_wf.censor_report" in "/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/postprocess_0_wf/prepare_confounds_wf/censor_report".
2025-02-06 16:22:26,390 [    INFO] [Node] Executing "censor_report" <xcp_d.interfaces.plotting.CensoringPlot>
2025-02-06 16:22:26,403 [    INFO] [Node] Executing "plot_design_matrix" <nipype.interfaces.utility.wrappers.Function>
2025-02-06 16:22:26,447 [   DEBUG] open file: /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/outputs/xcp_d/sub-01/ses-1/func/sub-01_ses-1_task-rest_motion.json
2025-02-06 16:22:26,489 [    INFO] [Node] Finished "censor_report", elapsed time 0.096543s.
Traceback (most recent call last):
  File "/usr/local/miniconda/lib/python3.10/site-packages/xcp_d/cli/run.py", line 113, in main
    xcpd_wf.run(**config.nipype.get_plugin())
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/workflows.py", line 638, in run
    runner.run(execgraph, updatehash=updatehash, config=self.config)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/plugins/base.py", line 178, in run
    self._clean_queue(jobid, graph, result=result)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/plugins/base.py", line 256, in _clean_queue
    raise RuntimeError("".join(result["traceback"]))
RuntimeError: Traceback (most recent call last):
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/plugins/multiproc.py", line 67, in run_node
    result["result"] = node.run(updatehash=updatehash)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 527, in run
    result = self._run_interface(execute=True)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 645, in _run_interface
    return self._run_command(execute)
  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/pipeline/engine/nodes.py", line 771, in _run_command
    raise NodeExecutionError(msg)
nipype.pipeline.engine.nodes.NodeExecutionError: Exception raised while executing Node _resample_atlas_to_cortical_thickness0.

Cmdline:
	wb_command -cifti-create-dense-from-template /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/inputs/data/fmriprep/fmriprep/sub-01/ses-1/anat/sub-01_ses-1_space-fsLR_den-91k_thickness.dscalar.nii resampled_atlas.dlabel.nii -cifti /usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz
Stdout:

Stderr:

	While running:
	wb_command -cifti-create-dense-from-template /local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/inputs/data/fmriprep/fmriprep/sub-01/ses-1/anat/sub-01_ses-1_space-fsLR_den-91k_thickness.dscalar.nii resampled_atlas.dlabel.nii -cifti /usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz

	ERROR: no cifti extension found in file '/usr/local/miniconda/lib/python3.10/site-packages/xcp_d/data/atlases/atlas-Glasser/atlas-Glasser_space-MNI152NLin6Asym_res-01_dseg.nii.gz'

Traceback:
	Traceback (most recent call last):
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 453, in aggregate_outputs
	    setattr(outputs, key, val)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/traits_extension.py", line 330, in validate
	    value = super(File, self).validate(objekt, name, value, return_pathlike=True)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/traits_extension.py", line 135, in validate
	    self.error(objekt, name, str(value))
	  File "/usr/local/miniconda/lib/python3.10/site-packages/traits/base_trait_handler.py", line 74, in error
	    raise TraitError(
	traits.trait_errors.TraitError: The 'out_file' trait of a _CiftiCreateDenseFromTemplateOutputSpec instance must be a pathlike object or string representing an existing file, but a value of '/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/parcellate_surfaces_wf/resample_atlas_to_cortical_thickness/mapflow/_resample_atlas_to_cortical_thickness0/resampled_atlas.dlabel.nii' <class 'str'> was specified.

	During handling of the above exception, another exception occurred:

	Traceback (most recent call last):
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 400, in run
	    outputs = self.aggregate_outputs(runtime)
	  File "/usr/local/miniconda/lib/python3.10/site-packages/nipype/interfaces/base/core.py", line 460, in aggregate_outputs
	    raise FileNotFoundError(msg)
	FileNotFoundError: No such file or directory '/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/parcellate_surfaces_wf/resample_atlas_to_cortical_thickness/mapflow/_resample_atlas_to_cortical_thickness0/resampled_atlas.dlabel.nii' for output 'out_file' of a CiftiCreateDenseFromTemplate interface



During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/miniconda/bin/xcp_d", line 8, in <module>
    sys.exit(main())
  File "/usr/local/miniconda/lib/python3.10/site-packages/xcp_d/cli/run.py", line 177, in main
    failed_reports = generate_reports(
  File "/usr/local/miniconda/lib/python3.10/site-packages/xcp_d/reports/core.py", line 164, in generate_reports
    exsumm.collect_inputs()
  File "/usr/local/miniconda/lib/python3.10/site-packages/xcp_d/interfaces/execsummary.py", line 210, in collect_inputs
    mask_not_nan = (task_entity_sets['task'] == 'rest') & task_entity_sets[
  File "/usr/local/miniconda/lib/python3.10/site-packages/pandas/core/frame.py", line 4102, in __getitem__
    indexer = self.columns.get_loc(key)
  File "/usr/local/miniconda/lib/python3.10/site-packages/pandas/core/indexes/range.py", line 417, in get_loc
    raise KeyError(key)
KeyError: 'task'
2025-02-06 16:22:26,771 [    INFO] [Node] Finished "plot_design_matrix", elapsed time 0.364152s.
2025-02-06 16:22:26,797 [    INFO] [Node] Setting-up "xcp_d_0_10_wf.sub_01_wf.postprocess_0_wf.qc_report_wf.make_abcc_qc" in "/local/slurmtmp.168095/job-168095-sub-01-ses-1/ds/.git/tmp/wkdir/xcp_d_0_10_wf/sub_01_wf/postprocess_0_wf/qc_report_wf/make_abcc_qc".
2025-02-06 16:22:26,799 [    INFO] [Node] Executing "make_abcc_qc" <xcp_d.interfaces.utils.ABCCQC>
2025-02-06 16:22:26,916 [    INFO] [Node] Finished "make_abcc_qc", elapsed time 0.116304s.
2025-02-06 16:22:28,407 [    INFO] [Node] Finished "grab_first_volume", elapsed time 5.325977s.
2025-02-06 16:22:30,544 [    INFO] [Node] Finished "warp_t1w_to_template", elapsed time 7.609694s.
2025-02-06 16:22:34,730 [    INFO] [Node] Finished "calculate_mean_bold", elapsed time 11.588698s.
2025-02-06 16:23:31,535 [    INFO] [Node] Finished "despike3d", elapsed time 66.067952s.
[INFO] == Command exit (modification check follows) =====

Screenshots / relevant information:


I think I see what’s going wrong. It looks like the workflow that parcellates the surface files is using NIfTI atlases instead of CIFTI ones.

This might be due to the combination of --abcc-qc y and --file-format nifti (which is part of nichart mode). I don’t think we’ve been testing that combination. For a quick workaround, I’d recommend setting --abcc-qc n, but I’ll try fixing this bug in XCP-D as well.

Thanks a lot Taylor, it works now!

1 Like