Recon-spec custom amico noddi, not outputting to output dir

Summary of what happened:

Hi there,

I am trying to run a custom set up of the amico noddi spec, primarily adjusting the dPar values. I created a JSON to pass to the recon-spec argument, and it did work successfully.

However, the files are not being moved from the working dir to the output dir. I have been trying to find some resources regarding JSON formats in case I’m missing a node.

Please let me know if I’m missing something! Thank you very much!

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

JSON

{
  "description": "Custom AMICO NODDI",
  "name": "amico_noddi_custom",
  "space": "T1w",
  "nodes": [
    {
      "name": "fit_noddi",
      "action": "fit_noddi",
      "input": "qsiprep",
      "software": "AMICO",
      "output_suffix": "NODDI",
      "parameters": {
        "dIso": 3.0E-3,
        "dPar": 1.1E-3,
        "isExvivo": false
      }
    }
  ],
  "output_nodes": {
    "fit_noddi": {
      "type": "NODDI",
      "space": "T1w",
      "outputs": [
        {
          "suffix": "ICVF",
          "map_type": "scalar",
          "filename": "FIT_ICVF.nii.gz"
        },
        {
          "suffix": "OD",
          "map_type": "scalar",
          "filename": "FIT_OD.nii.gz"
        },
        {
          "suffix": "ISOVF",
          "map_type": "scalar",
          "filename": "FIT_ISOVF.nii.gz"
        }
      ]
    }
  }
}

Slurm script:

#!/bin/bash -l

#SBATCH --partition=high-moby
#SBATCH --array=7
#SBATCH --nodes=1
#SBATCH --cpus-per-task=6
#SBATCH --mem-per-cpu=4096
#SBATCH --time=18:00:00
#SBATCH --job-name noddi_SPINR
#SBATCH --output=/*********/%x_%A_%a.out
#SBATCH --error=******/%x_%A_%a.err


STUDY="*****"

sublist="/******/subject_list.txt"
index() {
   head -n $SLURM_ARRAY_TASK_ID $sublist \
   | tail -n 1
}


BIDS_DIR=/****/data/bids
QSI_OUT=/****/QSIPREP/output/qsiprep
OUT_DIR=/****/QSIPREP/output/custom_noddi
TMP_DIR=/****/QSIPREP/output/tmp
WORK_DIR=${TMP_DIR}/${STUDY}/qsirecon_custom
FS_LICENSE=/*****freesurfer/.license
CODE_DIR=/*****/QSIPREP/code

SING_CONTAINER="/*****/containers/qsiprep-0.22.0.sif"

mkdir -p $BIDS_DIR $OUT_DIR $TMP_DIR $WORK_DIR

# Get the current participant label
PARTICIPANT_LABEL=$(index)



singularity run \
  -H ${TMP_DIR} \
  -B ${BIDS_DIR}:/bids \
  -B ${QSI_OUT}:/qsiprep \
  -B ${OUT_DIR}:/out \
  -B ${CODE_DIR}:/code \
  -B ${WORK_DIR}:/work \
  -B ${FS_LICENSE}:/li \
  ${SING_CONTAINER} \
  /bids /out participant \
  --skip-bids-validation \
  --participant_label $PARTICIPANT_LABEL \
  --n_cpus 4 --omp-nthreads 2 \
  --recon-only \
  --recon-input /qsiprep \
  --recon-spec /code/amico_noddi_custom.json \
  --output-resolution 1.7 \
  --fs-license-file /li \
  -w /work \
  --notrack

Version:

0.22,0

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):

250707-05:58:36,540 nipype.workflow INFO:
	 Running recon-only mode: --recon-input was used.
250707-05:58:36,542 nipype.workflow WARNING:
	 Argument --recon-only is not needed if --recon-input is specified.
250707-05:58:36,543 nipype.workflow IMPORTANT:
	 Running QSIRecon version 0.22.1.dev0+gd9279db.d20240719

         License NOTICE ##################################################
         QSIPrep 0.22.1.dev0+gd9279db.d20240719
         Copyright The PennLINC Developers.
         
         This product includes software developed by
         the NiPreps Community (https://nipreps.org/).
         
         Portions of this software were developed at the Department of
         Psychology at Stanford University, Stanford, CA, US.
         
         This software is also distributed as a Docker container image.
         The bootstrapping file for the image ("Dockerfile") is licensed
         under the MIT License.
         
         This software may be distributed through an add-on package called
         "Docker Wrapper" that is under the BSD 3-clause License.
         #################################################################
250707-05:58:36,807 nipype.workflow IMPORTANT:
	 Building QSIRecon's workflow:
           * BIDS dataset path: /bids.
           * Participant list: ['CMH050001'].
           * Run identifier: 20250707-055812_670c4c20-5b68-4778-857c-393cd8f3139c.
250707-05:58:40,451 nipype.workflow INFO:
	 found ['/qsiprep/sub-CMH050001/ses-01/dwi/sub-CMH050001_ses-01_space-T1w_desc-preproc_dwi.nii.gz'] in /qsiprep
250707-05:58:40,453 nipype.workflow INFO:
	 CHECKING /qsiprep/sub-CMH050001/anat/sub-CMH050001_desc-brain_mask.nii.gz: True
250707-05:58:40,454 nipype.workflow INFO:
	 CHECKING /qsiprep/sub-CMH050001/anat/sub-CMH050001_desc-preproc_T1w.nii.gz: True
250707-05:58:40,454 nipype.workflow INFO:
	 Found usable QSIPrep-preprocessed T1w image and mask.
250707-05:58:40,455 nipype.workflow INFO:
	 CHECKING /qsiprep/sub-CMH050001/anat/sub-CMH050001_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5: True
250707-05:58:40,456 nipype.workflow INFO:
	 CHECKING /qsiprep/sub-CMH050001/anat/sub-CMH050001_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5: True
250707-05:58:40,456 nipype.workflow INFO:
	 Found high-res anatomical data in preprocessed inputs for CMH050001.
250707-05:58:40,457 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': '/qsiprep/sub-CMH050001/ses-01/dwi/sub-CMH050001_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}
250707-05:58:40,465 nipype.workflow INFO:
	 Transforming ODF ROIs into DWI space for visual report.
250707-05:58:44,322 nipype.workflow INFO:
	 QSIRecon workflow graph with 25 nodes built successfully.
250707-05:59:00,946 nipype.workflow IMPORTANT:
	 QSIRecon started!
250707-05:59:06,757 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_ingressed_dwi_data" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_ingressed_dwi_data".
250707-05:59:06,797 nipype.workflow INFO:
	 [Node] Executing "sub_CMH050001_ses_01_space_T1w_desc_preproc_ingressed_dwi_data" <qsiprep.interfaces.ingress.QsiReconDWIIngress>
250707-05:59:06,809 nipype.workflow INFO:
	 [Node] Finished "sub_CMH050001_ses_01_space_T1w_desc_preproc_ingressed_dwi_data", elapsed time 0.006643s.
250707-05:59:06,855 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.recon_anatomical_wf.qsiprep_anat_ingress" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/recon_anatomical_wf/qsiprep_anat_ingress".
250707-05:59:06,897 nipype.workflow INFO:
	 [Node] Executing "qsiprep_anat_ingress" <qsiprep.interfaces.anatomical.QsiprepAnatomicalIngress>
250707-05:59:06,912 nipype.workflow INFO:
	 [Node] Finished "qsiprep_anat_ingress", elapsed time 0.009539s.
250707-05:59:07,306 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf.resample_mask" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf/resample_mask".
250707-05:59:07,314 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf.output_grid_wf.voxel_size_chooser" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf/output_grid_wf/voxel_size_chooser".
250707-05:59:07,368 nipype.workflow INFO:
	 [Node] Executing "voxel_size_chooser" <qsiprep.interfaces.anatomical.VoxelSizeChooser>
250707-05:59:07,372 nipype.workflow INFO:
	 [Node] Finished "voxel_size_chooser", elapsed time 0.000763s.
250707-05:59:07,375 nipype.workflow INFO:
	 [Node] Executing "resample_mask" <nipype.interfaces.ants.resampling.ApplyTransforms>
250707-05:59:07,400 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf.odf_rois" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf/odf_rois".
250707-05:59:07,443 nipype.workflow INFO:
	 [Node] Executing "odf_rois" <nipype.interfaces.ants.resampling.ApplyTransforms>
250707-05:59:08,425 nipype.workflow INFO:
	 [Node] Finished "resample_mask", elapsed time 0.772619s.
250707-05:59:08,487 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf.output_grid_wf.autobox_template" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf/output_grid_wf/autobox_template".
250707-05:59:08,598 nipype.workflow INFO:
	 [Node] Executing "autobox_template" <nipype.interfaces.afni.utils.Autobox>
250707-05:59:10,512 nipype.workflow INFO:
	 [Node] Finished "autobox_template", elapsed time 1.91147s.
250707-05:59:11,272 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf.output_grid_wf.deoblique_autobox" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf/output_grid_wf/deoblique_autobox".
250707-05:59:11,318 nipype.workflow INFO:
	 [Node] Executing "deoblique_autobox" <nipype.interfaces.afni.preprocess.Warp>
250707-05:59:12,541 nipype.workflow INFO:
	 [Node] Finished "deoblique_autobox", elapsed time 1.221979s.
250707-05:59:13,362 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf.output_grid_wf.resample_to_voxel_size" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_dwi_specific_anat_wf/output_grid_wf/resample_to_voxel_size".
250707-05:59:15,991 nipype.workflow INFO:
	 [Node] Executing "resample_to_voxel_size" <nipype.interfaces.afni.utils.Resample>
250707-05:59:16,584 nipype.workflow INFO:
	 [Node] Finished "resample_to_voxel_size", elapsed time 0.588333s.
250707-05:59:22,526 nipype.workflow INFO:
	 [Node] Finished "odf_rois", elapsed time 14.760302s.
250707-05:59:25,905 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_inputs" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_inputs".
250707-05:59:25,972 nipype.workflow INFO:
	 [Node] Executing "sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_inputs" <qsiprep.interfaces.interchange.ReconWorkflowInputs>
250707-05:59:25,984 nipype.workflow INFO:
	 [Node] Finished "sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_inputs", elapsed time 0.001708s.
250707-05:59:27,319 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf.fit_noddi.recon_noddi" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf/fit_noddi/recon_noddi".
250707-05:59:27,381 nipype.workflow INFO:
	 [Node] Executing "recon_noddi" <qsiprep.interfaces.amico.NODDI>
-> Rounding b-values to nearest multiple of 50.0
-> Writing scheme file to [ /work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf/fit_noddi/recon_noddi/study/subject/sub-CMH050001_ses-01_space-T1w_desc-preproc_dwi.scheme ]
e[0;32m
-> Loading data:e[0m
	* DWI signal
		- dim    = 95 x 116 x 101 x 104
		- pixdim = 1.700 x 1.700 x 1.700
	* Acquisition scheme
		- 104 samples, 4 shells
		- 8 @ b=0 , 60 @ b=3000.0 , 15 @ b=2000.0 , 15 @ b=1000.0 , 6 @ b=500.0 
	* Binary mask
		- dim    = 95 x 116 x 101
		- pixdim = 1.700 x 1.700 x 1.700
		- voxels = 294966
e[0;32m   [ 3.3 seconds ]e[0m
e[0;32m
-> Preprocessing:e[0m
	* Normalizing to b0... [ min=0.00,  mean=0.43, max=262.38 ]
	* Keeping all b0 volume(s)
e[0;32m   [ 1.1 seconds ]e[0m
250707-05:59:31,898 nipype.interface INFO:
	 Fitting NODDI Model.
e[0;32m
-> Creating LUT for "NODDI" model:e[0m
e[0;32m   [ 347.1 seconds ]e[0m
e[0;32m
-> Resampling LUT for subject "subject":e[0m
e[0;32m   [ 82.9 seconds ]e[0m
e[0;32m
-> Fitting "NODDI" model to 294966 voxels (using 2 jobs):e[0m
e[0;32m   [ 00h 13m 12s ]e[0m
e[0;32m
-> Saving output to "AMICO/NODDI/*":e[0m
	- configuration  [OK]
	- FIT_dir.nii.gz  [OK]
	- FIT_ICVF.nii.gz  [OK]
	- FIT_OD.nii.gz  [OK]
	- FIT_ISOVF.nii.gz  [OK]
e[0;32m   [ DONE ]e[0m
250707-06:19:56,405 nipype.workflow INFO:
	 [Node] Finished "recon_noddi", elapsed time 1229.02102s.
250707-06:20:00,989 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf.fit_noddi.convert_to_fibgz" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf/fit_noddi/convert_to_fibgz".
250707-06:20:01,71 nipype.workflow INFO:
	 [Node] Executing "convert_to_fibgz" <qsiprep.interfaces.converters.NODDItoFIBGZ>
250707-06:20:01,693 nipype.workflow INFO:
	 Detecting Peaks
250707-06:20:02,678 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf.scalar_gatherer" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf/scalar_gatherer".
250707-06:20:02,733 nipype.workflow INFO:
	 [Node] Executing "scalar_gatherer" <nipype.interfaces.utility.base.Merge>
250707-06:20:02,737 nipype.workflow INFO:
	 [Node] Finished "scalar_gatherer", elapsed time 0.00096s.
250707-06:20:04,340 nipype.workflow INFO:
	 [Node] Finished "convert_to_fibgz", elapsed time 3.266878s.
250707-06:20:04,681 nipype.workflow INFO:
	 [Node] Setting-up "qsirecon_0_22_wf.sub-CMH050001_amico_noddi_custom.sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf.fit_noddi.plot_peaks" in "/work/qsirecon_0_22_wf/sub-CMH050001_amico_noddi_custom/sub_CMH050001_ses_01_space_T1w_desc_preproc_recon_wf/fit_noddi/plot_peaks".
250707-06:20:04,767 nipype.workflow INFO:
	 [Node] Executing "plot_peaks" <qsiprep.interfaces.reports.CLIReconPeaksReport>
250707-06:20:51,286 nipype.workflow INFO:
	 [Node] Finished "plot_peaks", elapsed time 46.405633s.
250707-06:24:55,39 nipype.workflow IMPORTANT:
	 QSIPrep finished successfully!

Screenshots / relevant information:


Hi @hassanabdulr and welcome to neurostars!

In the future please use the software support post category and template. You can see I have edited your post for your this time.

May you please try with the most recent version of Qsirecon? Keep in mind Qsirecon is now a standalone software that’s uses yamls instead of jsons.

I also do not know what your output_nodes are. Keep in mind this is the original noddi recon spec (qsiprep/qsiprep/data/pipelines/amico_noddi.json at 0.22.0 · PennLINC/qsiprep · GitHub):

{ "description": "Runs the AMICO implementation of NODDI",
  "space": "T1w",
  "name": "amico_noddi",
  "atlases": [],
  "nodes": [
    {
      "name": "fit_noddi",
      "action": "fit_noddi",
      "software": "AMICO",
      "input": "qsiprep",
      "qsirecon_suffix": "NODDI",
      "parameters": {
        "isExvivo": false,
        "dPar": 1.7E-3,
        "dIso": 3.0E-3
      }
    }
  ]
}

I imagine yours isn’t working because you are not using same argument names (especially qsirecon_suffix is missing from yours).

Best,
Steven

Hi Steven,

Thank you for helping with this. Your suggestion was very helpful. I pulled the latest version of qsirecon, and adapted the amico noddi yaml to fit my custom parameter and that seemed to work just fine.

Thank you!

1 Like