Multi-Session fmriprep breaking summary _func.html outputs

Summary of what happened:

Hi all,
We’re trying to put some intensively sampled data through fmriprep, 4 subjects ~ 10 sessions each on our HPC. The data are multi-echo with 4 or 5 runs of functional data, depending on the session. Like in some other posts I’ve read, we’re trying to avoid using the longitudinal flag and instead process each session separately. To do that, I’ve created a script that generates a subject-session-specific bids config file and fmriprep command that I can submit one-by-one. I’ve also created session-specific derivative and scratch directories to avoid issues there.

It looks like things mostly worked, but something weird is going on with the summary .html outputs that is breaking ses-0x into one _ses-0_func.html file and another ses-x_func.html file (see screenshot below). Both of these files are 2KB and have nothing when I open them (presumably because no outputs match ses-0 or ses-x?).

As far as we can tell so far, the rest of the outputs look correct. fmriprep indeed said it ran succesfully. If this is just a syntax error for the output summary, I suppose we can move forward, but I would like to confirm nothing deeper is going on here.

I’ve now replicated this with ses-01 twice as well as ses-02 for our first subject.

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

This script generates our bids config files and fmriprep commands:

#!/bin/bash

# ensure paths are correct
projectname=night-owls 
maindir=/gpfs/scratch/tug87422/smithlab-shared/$projectname
scriptdir=$maindir/code
bidsdir=$maindir/bids
logdir=$maindir/logs
mkdir -p $logdir

#Keep scratch and derivatives dirs separate by sessions
for ses in {01..12}; do
  if [ ! -d "$maindir/scratch/ses-$ses" ]; then
    mkdir -p "$maindir/scratch/ses-$ses"
  fi
   if [ ! -d "$maindir/derivatives/ses-$ses" ]; then
    mkdir -p "$maindir/derivatives/ses-$ses"
  fi
done

# Generate configs and PBS scripts

subjects=(sub-101) 

for sub in ${subjects[@]}; do
	
    ## for sessions that have a functional image..
    sessions=( $(
        find "$bidsdir/$sub" \
            -type f \
            -path "*/ses-[0-9][0-9]/func/*.nii.gz" \
            2>/dev/null \
        | sed -n 's|.*/\(ses-[0-9][0-9]\)/.*|\1|p' \
        | sort -u
    ) )


  for ses in "${sessions[@]}"; do
    sesid=${ses#ses-}
		
    ## Create subject/session-specific BIDS filter file
    configfile=$maindir/code/fmriprep/fmriprep_config_${sub}_${ses}.json
    cat <<EOF > "$configfile"
{
  "t1w": {"datatype": "anat", "suffix": "T1w", "session": "$sesid"},
  "sbref": {"datatype": "func", "suffix": "sbref", "part": [null, "mag"], "session": "$sesid"},
  "bold": {"datatype": "func", "suffix": "bold", "part": [null, "mag"], "session": "$sesid"}
}
EOF

    # Generate subject/session-specific PBS script
    scriptfile=$maindir/code/fmriprep/fmriprep_${sub}_${ses}.sh

    cat <<EOF > "$scriptfile"
#!/bin/bash
#PBS -l walltime=8:00:00
#PBS -N fmriprep-${sub}-${ses}
#PBS -q normal
#PBS -l nodes=1:ppn=14

# load modules and go to workdir
module load fsl/6.0.2
source \$FSLDIR/etc/fslconf/fsl.sh
module load singularity
cd \$PBS_O_WORKDIR

# ensure paths are correct
projectname=night-owls 
maindir=/gpfs/scratch/tug87422/smithlab-shared/\$projectname
scriptdir=\$maindir/code
bidsdir=\$maindir/bids
logdir=\$maindir/logs
mkdir -p \$logdir

TEMPLATEFLOW_DIR=/gpfs/scratch/tug87422/smithlab-shared/tools/templateflow
MPLCONFIGDIR_DIR=/gpfs/scratch/tug87422/smithlab-shared/tools/mplconfigdir
export SINGULARITYENV_TEMPLATEFLOW_HOME=/opt/templateflow
export SINGULARITYENV_MPLCONFIGDIR=/opt/mplconfigdir

singularity run --cleanenv \\
	-B \${TEMPLATEFLOW_DIR}:/opt/templateflow \\
	-B \${MPLCONFIGDIR_DIR}:/opt/mplconfigdir \\
	-B \$maindir:/base \\
	-B /gpfs/scratch/tug87422/smithlab-shared/tools/licenses:/opts \\
	-B \$maindir/scratch/$ses:/scratch \\
	/gpfs/scratch/tug87422/smithlab-shared/tools/fmriprep-24.1.1.simg \\
	/base/bids /base/derivatives/$ses \\
	participant --participant_label $sub \\
	--stop-on-first-crash \\
	--skip-bids-validation \\
	--nthreads 14 \\
	--me-output-echos \\
	--output-spaces MNI152NLin6Asym \\
	--bids-filter-file /base/code/fmriprep/fmriprep_config_${sub}_${ses}.json \\
	--fs-no-reconall --fs-license-file /opts/fs_license.txt \\
	-w /scratch
EOF

    chmod +x "$scriptfile"

  done
done

Here is an example of what the config file and fmriprep script look like for sub-101, which was submitted as qsub fmriprep_sub-101_ses-01.sh

Config:

{
  "t1w": {"datatype": "anat", "suffix": "T1w", "session": "01"},
  "sbref": {"datatype": "func", "suffix": "sbref", "part": [null, "mag"], "session": "01"},
  "bold": {"datatype": "func", "suffix": "bold", "part": [null, "mag"], "session": "01"}
}

Call:

#PBS -l walltime=8:00:00
#PBS -N fmriprep-sub-101-ses-01
#PBS -q normal
#PBS -l nodes=1:ppn=14

# load modules and go to workdir
module load fsl/6.0.2
source $FSLDIR/etc/fslconf/fsl.sh
module load singularity
cd $PBS_O_WORKDIR

# ensure paths are correct
projectname=night-owls
maindir=/gpfs/scratch/tug87422/smithlab-shared/$projectname
scriptdir=$maindir/code
bidsdir=$maindir/bids
logdir=$maindir/logs
mkdir -p $logdir

TEMPLATEFLOW_DIR=/gpfs/scratch/tug87422/smithlab-shared/tools/templateflow
MPLCONFIGDIR_DIR=/gpfs/scratch/tug87422/smithlab-shared/tools/mplconfigdir
export SINGULARITYENV_TEMPLATEFLOW_HOME=/opt/templateflow
export SINGULARITYENV_MPLCONFIGDIR=/opt/mplconfigdir

singularity run --cleanenv \
        -B ${TEMPLATEFLOW_DIR}:/opt/templateflow \
        -B ${MPLCONFIGDIR_DIR}:/opt/mplconfigdir \
        -B $maindir:/base \
        -B /gpfs/scratch/tug87422/smithlab-shared/tools/licenses:/opts \
        -B $maindir/scratch/ses-01:/scratch \
        /gpfs/scratch/tug87422/smithlab-shared/tools/fmriprep-24.1.1.simg \
        /base/bids /base/derivatives/ses-01 \
        participant --participant_label sub-101 \
        --stop-on-first-crash \
        --skip-bids-validation \
        --nthreads 14 \
        --me-output-echos \
        --output-spaces MNI152NLin6Asym \
        --bids-filter-file /base/code/fmriprep/fmriprep_config_sub-101_ses-01.json \
        --fs-no-reconall --fs-license-file /opts/fs_license.txt \
        -w /scratch

Version:

24.1.1

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

Here is the /func output, which looks normal as far as we can tell.

sub-101_ses-01_task-mid_run-1_echo-1_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-1_echo-1_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-1_echo-2_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-1_echo-2_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-1_echo-3_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-1_echo-3_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-1_echo-4_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-1_echo-4_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-1_from-boldref_to-T1w_mode-image_desc-coreg_xfm.json
sub-101_ses-01_task-mid_run-1_from-boldref_to-T1w_mode-image_desc-coreg_xfm.txt
sub-101_ses-01_task-mid_run-1_from-orig_to-boldref_mode-image_desc-hmc_xfm.json
sub-101_ses-01_task-mid_run-1_from-orig_to-boldref_mode-image_desc-hmc_xfm.txt
sub-101_ses-01_task-mid_run-1_part-mag_desc-brain_mask.json
sub-101_ses-01_task-mid_run-1_part-mag_desc-brain_mask.nii.gz
sub-101_ses-01_task-mid_run-1_part-mag_desc-confounds_timeseries.json
sub-101_ses-01_task-mid_run-1_part-mag_desc-confounds_timeseries.tsv
sub-101_ses-01_task-mid_run-1_part-mag_desc-coreg_boldref.json
sub-101_ses-01_task-mid_run-1_part-mag_desc-coreg_boldref.nii.gz
sub-101_ses-01_task-mid_run-1_part-mag_desc-hmc_boldref.json
sub-101_ses-01_task-mid_run-1_part-mag_desc-hmc_boldref.nii.gz
sub-101_ses-01_task-mid_run-1_part-mag_space-MNI152NLin6Asym_boldref.json
sub-101_ses-01_task-mid_run-1_part-mag_space-MNI152NLin6Asym_boldref.nii.gz
sub-101_ses-01_task-mid_run-1_part-mag_space-MNI152NLin6Asym_desc-brain_mask.json
sub-101_ses-01_task-mid_run-1_part-mag_space-MNI152NLin6Asym_desc-brain_mask.nii.gz
sub-101_ses-01_task-mid_run-1_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-1_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-1_space-MNI152NLin6Asym_T2starmap.json
sub-101_ses-01_task-mid_run-1_space-MNI152NLin6Asym_T2starmap.nii.gz
sub-101_ses-01_task-mid_run-2_echo-1_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-2_echo-1_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-2_echo-2_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-2_echo-2_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-2_echo-3_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-2_echo-3_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-2_echo-4_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-2_echo-4_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-2_from-boldref_to-T1w_mode-image_desc-coreg_xfm.json
sub-101_ses-01_task-mid_run-2_from-boldref_to-T1w_mode-image_desc-coreg_xfm.txt
sub-101_ses-01_task-mid_run-2_from-orig_to-boldref_mode-image_desc-hmc_xfm.json
sub-101_ses-01_task-mid_run-2_from-orig_to-boldref_mode-image_desc-hmc_xfm.txt
sub-101_ses-01_task-mid_run-2_part-mag_desc-brain_mask.json
sub-101_ses-01_task-mid_run-2_part-mag_desc-brain_mask.nii.gz
sub-101_ses-01_task-mid_run-2_part-mag_desc-confounds_timeseries.json
sub-101_ses-01_task-mid_run-2_part-mag_desc-confounds_timeseries.tsv
sub-101_ses-01_task-mid_run-2_part-mag_desc-coreg_boldref.json
sub-101_ses-01_task-mid_run-2_part-mag_desc-coreg_boldref.nii.gz
sub-101_ses-01_task-mid_run-2_part-mag_desc-hmc_boldref.json
sub-101_ses-01_task-mid_run-2_part-mag_desc-hmc_boldref.nii.gz
sub-101_ses-01_task-mid_run-2_part-mag_space-MNI152NLin6Asym_boldref.json
sub-101_ses-01_task-mid_run-2_part-mag_space-MNI152NLin6Asym_boldref.nii.gz
sub-101_ses-01_task-mid_run-2_part-mag_space-MNI152NLin6Asym_desc-brain_mask.json
sub-101_ses-01_task-mid_run-2_part-mag_space-MNI152NLin6Asym_desc-brain_mask.nii.gz
sub-101_ses-01_task-mid_run-2_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.json
sub-101_ses-01_task-mid_run-2_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.nii.gz
sub-101_ses-01_task-mid_run-2_space-MNI152NLin6Asym_T2starmap.json
sub-101_ses-01_task-mid_run-2_space-MNI152NLin6Asym_T2starmap.nii.gz
sub-101_ses-01_task-rest_run-1_echo-1_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-rest_run-1_echo-1_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-rest_run-1_echo-2_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-rest_run-1_echo-2_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-rest_run-1_echo-3_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-rest_run-1_echo-3_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-rest_run-1_echo-4_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-rest_run-1_echo-4_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-rest_run-1_from-boldref_to-T1w_mode-image_desc-coreg_xfm.json
sub-101_ses-01_task-rest_run-1_from-boldref_to-T1w_mode-image_desc-coreg_xfm.txt
sub-101_ses-01_task-rest_run-1_from-orig_to-boldref_mode-image_desc-hmc_xfm.json
sub-101_ses-01_task-rest_run-1_from-orig_to-boldref_mode-image_desc-hmc_xfm.txt
sub-101_ses-01_task-rest_run-1_part-mag_desc-brain_mask.json
sub-101_ses-01_task-rest_run-1_part-mag_desc-brain_mask.nii.gz
sub-101_ses-01_task-rest_run-1_part-mag_desc-confounds_timeseries.json
sub-101_ses-01_task-rest_run-1_part-mag_desc-confounds_timeseries.tsv
sub-101_ses-01_task-rest_run-1_part-mag_desc-coreg_boldref.json
sub-101_ses-01_task-rest_run-1_part-mag_desc-coreg_boldref.nii.gz
sub-101_ses-01_task-rest_run-1_part-mag_desc-hmc_boldref.json
sub-101_ses-01_task-rest_run-1_part-mag_desc-hmc_boldref.nii.gz
sub-101_ses-01_task-rest_run-1_part-mag_space-MNI152NLin6Asym_boldref.json
sub-101_ses-01_task-rest_run-1_part-mag_space-MNI152NLin6Asym_boldref.nii.gz
sub-101_ses-01_task-rest_run-1_part-mag_space-MNI152NLin6Asym_desc-brain_mask.json
sub-101_ses-01_task-rest_run-1_part-mag_space-MNI152NLin6Asym_desc-brain_mask.nii.gz
sub-101_ses-01_task-rest_run-1_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.json
sub-101_ses-01_task-rest_run-1_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.nii.gz
sub-101_ses-01_task-rest_run-1_space-MNI152NLin6Asym_T2starmap.json
sub-101_ses-01_task-rest_run-1_space-MNI152NLin6Asym_T2starmap.nii.gz
sub-101_ses-01_task-sharedreward_run-1_echo-1_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-1_echo-1_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-1_echo-2_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-1_echo-2_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-1_echo-3_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-1_echo-3_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-1_echo-4_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-1_echo-4_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-1_from-boldref_to-T1w_mode-image_desc-coreg_xfm.json
sub-101_ses-01_task-sharedreward_run-1_from-boldref_to-T1w_mode-image_desc-coreg_xfm.txt
sub-101_ses-01_task-sharedreward_run-1_from-orig_to-boldref_mode-image_desc-hmc_xfm.json
sub-101_ses-01_task-sharedreward_run-1_from-orig_to-boldref_mode-image_desc-hmc_xfm.txt
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-brain_mask.json
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-brain_mask.nii.gz
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-confounds_timeseries.json
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-confounds_timeseries.tsv
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-coreg_boldref.json
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-coreg_boldref.nii.gz
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-hmc_boldref.json
sub-101_ses-01_task-sharedreward_run-1_part-mag_desc-hmc_boldref.nii.gz
sub-101_ses-01_task-sharedreward_run-1_part-mag_space-MNI152NLin6Asym_boldref.json
sub-101_ses-01_task-sharedreward_run-1_part-mag_space-MNI152NLin6Asym_boldref.nii.gz
sub-101_ses-01_task-sharedreward_run-1_part-mag_space-MNI152NLin6Asym_desc-brain_mask.json
sub-101_ses-01_task-sharedreward_run-1_part-mag_space-MNI152NLin6Asym_desc-brain_mask.nii.gz
sub-101_ses-01_task-sharedreward_run-1_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-1_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-1_space-MNI152NLin6Asym_T2starmap.json
sub-101_ses-01_task-sharedreward_run-1_space-MNI152NLin6Asym_T2starmap.nii.gz
sub-101_ses-01_task-sharedreward_run-2_echo-1_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-2_echo-1_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-2_echo-2_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-2_echo-2_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-2_echo-3_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-2_echo-3_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-2_echo-4_part-mag_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-2_echo-4_part-mag_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-2_from-boldref_to-T1w_mode-image_desc-coreg_xfm.json
sub-101_ses-01_task-sharedreward_run-2_from-boldref_to-T1w_mode-image_desc-coreg_xfm.txt
sub-101_ses-01_task-sharedreward_run-2_from-orig_to-boldref_mode-image_desc-hmc_xfm.json
sub-101_ses-01_task-sharedreward_run-2_from-orig_to-boldref_mode-image_desc-hmc_xfm.txt
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-brain_mask.json
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-brain_mask.nii.gz
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-confounds_timeseries.json
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-confounds_timeseries.tsv
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-coreg_boldref.json
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-coreg_boldref.nii.gz
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-hmc_boldref.json
sub-101_ses-01_task-sharedreward_run-2_part-mag_desc-hmc_boldref.nii.gz
sub-101_ses-01_task-sharedreward_run-2_part-mag_space-MNI152NLin6Asym_boldref.json
sub-101_ses-01_task-sharedreward_run-2_part-mag_space-MNI152NLin6Asym_boldref.nii.gz
sub-101_ses-01_task-sharedreward_run-2_part-mag_space-MNI152NLin6Asym_desc-brain_mask.json
sub-101_ses-01_task-sharedreward_run-2_part-mag_space-MNI152NLin6Asym_desc-brain_mask.nii.gz
sub-101_ses-01_task-sharedreward_run-2_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.json
sub-101_ses-01_task-sharedreward_run-2_part-mag_space-MNI152NLin6Asym_desc-preproc_bold.nii.gz
sub-101_ses-01_task-sharedreward_run-2_space-MNI152NLin6Asym_T2starmap.json
sub-101_ses-01_task-sharedreward_run-2_space-MNI152NLin6Asym_T2starmap.nii.gz

Screenshots / relevant information: