QSIrecon error: AttributeError: 'NoneType' object has no attribute 'outputs'

Summary of what happened:

I am trying to run NODDI reconstruction using QSIrecon v0.23.1. It appears that the error (upstream_outputnode is ‘NoneType’ instead of the correct object) occurs in initializing the workflow, but I don’t understand what is causing the error. Any help with troubleshooting this would be much appreciated.

As far as I know, I am mounting the necessary directories correctly. The output says QSIRecon is able to locate the QSIPrep outputs (QSIPrep-preprocessed T1w image and mask as well as high-res anatomical data in preprocessed inputs). The mounting lines have been used to successfully run recon with QSIprep v0.19.1 and preprocessing with QSIprep v0.21.4.

Thank you in advance!

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

docker run --rm -it \
	-v ~/Documents/license.txt:/opt/freesurfer/license.txt:ro \
	-v ~/Documents/ADNI_Multishell_SCD_2024/ADNI_bids/bidsconvertr/derivatives/qsiprep:/data:ro \
	-v ~/Documents/Docker_Commands/amico_noddi_cortex.json:/sngl/spec/spec.json:ro \
	-v ~/Documents/ADNI_Multishell_SCD_2024/ADNI_bids/bidsconvertr/derivatives/qsirecon:/out \
	-v ~/Documents/ADNI_Multishell_SCD_2024/ADNI_bids/bidsconvertr/derivatives/work/qsirecon_wf:/scratch \
	pennlinc/qsirecon:0.23.1 /data /out participant \
	--recon-spec /sngl/spec/spec.json \
	--participant_label 941S6333 \
	--output-resolution 1 \
	--nthreads 24 \
	-w /scratch

Version:

QSIRecon 0.23.1

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

Docker

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

Using bids-validator v1.14.14, I get 0 errors and 2 types of warning:

1: [WARN] Not all subjects contain the same files. Each subject should contain the same number of files with the same naming unless some files are known to be missing. (code: 38 - INCONSISTENT_SUBJECTS)

2: [WARN] Not all subjects/sessions/runs have the same scanning parameters. (code: 39 - INCONSISTENT_PARAMETERS)

Relevant log outputs (up to 20 lines):


241022-18:59:57,611 nipype.workflow INFO:
	 Anatomical (T1w) available for recon: {'has_qsiprep_5tt_hsvs': False, 'has_freesurfer_5tt_hsvs': False, 'has_freesurfer': False, 'has_qsiprep_t1w': True, 'has_qsiprep_t1w_transforms': True}
[{'bids_dwi_file': '/data/sub-941S6333/ses-01/dwi/sub-941S6333_ses-01_space-T1w_desc-preproc_dwi.nii.gz'}]
{'has_qsiprep_5tt_hsvs': False, 'has_freesurfer_5tt_hsvs': False, 'has_freesurfer': False, 'has_qsiprep_t1w': True, 'has_qsiprep_t1w_transforms': True}
241022-18:59:57,614 nipype.workflow INFO:
	 Transforming ODF ROIs into DWI space for visual report.
Process Process-2:
Traceback (most recent call last):
  File "/opt/conda/envs/qsiprep/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap
    self.run()
  File "/opt/conda/envs/qsiprep/lib/python3.10/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/conda/envs/qsiprep/lib/python3.10/site-packages/qsirecon/cli/workflow.py", line 139, in build_workflow
    retval["workflow"] = init_qsirecon_wf()
  File "/opt/conda/envs/qsiprep/lib/python3.10/site-packages/qsirecon/workflows/base.py", line 43, in init_qsirecon_wf
    single_subject_wf = init_single_subject_recon_wf(subject_id=subject_id)
  File "/opt/conda/envs/qsiprep/lib/python3.10/site-packages/qsirecon/workflows/base.py", line 193, in init_single_subject_recon_wf
    dwi_recon_wfs[dwi_file] = init_dwi_recon_workflow(
  File "/opt/conda/envs/qsiprep/lib/python3.10/site-packages/qsirecon/workflows/recon/build_workflow.py", line 118, in init_dwi_recon_workflow
    upstream_outputs = set(upstream_outputnode.outputs.get().keys())
AttributeError: 'NoneType' object has no attribute 'outputs'


Hi @tylercall, and welcome to neurostars!

QSIRecon now uses YAMLs for defining recon specs, therefore your JSON may not work. So, perhaps you can make a custom spec YAML based on what you see here: qsirecon/qsirecon/data/pipelines at main · PennLINC/qsirecon · GitHub

Best,
Steven

@Steven changing the JSON file to YAML worked. Thanks!