Using sbrefs for multiple functional runs in fmriprep

Hi all,
I’m running fmriprep on a dataset that has several functional tasks, which have each in turn 2-4 runs. I collect a single sbref acquisition, and my understanding is that it can be used as a reference for all of the functional acquisitions. My problem is that fmriprep takes that sbref and applies it only to the first functional acquisition, and I get for example "Using single-band reference file(s) sub-1_ses-1_task-myTask_run-1_sbref.nii.gz and then “No single-band-reference found for sub-1_ses-1_task-myTask_run-2_bold.nii.gz.”.
The workaround I found was to duplicate the sbref acquisition nifti and json files, and rename each copy to be compatible with a single functional run (sub-1_ses-1_task-xxx_run-1_sbref, sub-1_ses-1_task-xxx_run-2_sbref, sub-1_ses-1_task-yyy_run-1_sbref… etc), and this seems to work- fmriprep gets that sbref and uses it as a reference for each of them, which is the behavior I want. But I would like to avoid duplicating the same data over and over again - is there a better way to point fmriprep to use that single sbref for all the functional scans? or a list of functional scans? Is there something similar to the IntendedFor field that’s used to point fieldmaps to their corresponding data?
Thanks!
Maya

1 Like

My initial guess is that if a ‘run’ entity is specified in the sbref filename then fmriprep will only attempt to use it for that run. Might try renaming the sbref file to:
sub-1_ses-1_task-myTask_sbref.nii.gz

and rerunning if it’s convenient. (would also need to rename sbref.json accordingly.)

Thanks! I had tried that, but then fmriprep just doesn’t recognize the sbref at all and doesn’t use it for any of my runs. It seems like the sbref filename has to match the functional scan (only with the _sbref suffix instead of _bold), but then I don’t understand how to use the same sbref for multiple functionals…

Hi Maya, your guess is right, there is no way right now to tell fmriprep to use the same bref file for several functional runs, except by creating fake sbrefs by renaming the same one to match the name of the other tasks/runs.
This aspect is detailed here as well:

1 Like

Also as you must now, when you use a multi band sequence, there is a sbref collected for each run that you could save to have a specific sbref image for each run that will be automatically used by fmriprep.

Thanks for the response and for pointing me to that thread! I’m not sure I understand the second point though about there being a sbref collected for each run- when I collected the data, I only collected a single sbref acquisition before collecting the different multiband task runs… so my protocol includes a fieldmap, a sbref, and then the functional task runs (which are multiband). So seems like my best option is to keep duplicating that first sbref and renaming it to fit my different runs?

From which MRI system do you get your images? From what I know from Siemens systems, with the CMRR multiband sequence, you can get a SBref image for each functional run (if there is a multiband factor > 1).
But in your case, on the images you already got you can either:

  • duplicate the sbref image you have to have a match for each task/run.
  • remove the sbref image. fmriprep will then use for each task/run its internal heuristic to create a new reference image (for example average the non-steady state volumes that have a better contrast) that will be used as a target for the realignment and to calculate the linear transformation from the bold space to the anat space.

Both approaches are valid and should produce very close results.

I can also add that, from my personal experience, on subjects with very low motion, the approach without sbref images produces more reliable results.I posted an issue on this topic on the fmriprep GitHub:

The problem lies somewhere with the mcflirt function, I also reported the issue on FSL forum but no solution was found yet.

We are using a GE 3T Signa scanner and the protocol has multiband factor=3, I’m not aware of an option to get the sbref for each run without explicitly running it as a separate acquisition… We are scanning children so unfortunately motion is a big issue in our data, so seems like our best bet is to stick with the duplicate sbref solution. Thanks so much for laying out these options, this is very helpful!

Interesting. I don’t know at all about GE implementation of the multiband sequence. I just saw this from the CNI Center at Stanford where there are using a GE scanner: " CNI sequences generally acquire calibration data at the beginning of the BOLD acquisitions while GE uses a fast separate calibration sequence to acquire this data. " https://cni.stanford.edu/hyperband-transition) . From what I understand you may be in the second case where the calibration data is only acquire once in a separate scan. Here is another discussion about using SBref scans or dummy scans for preprocessing your data:
Single band reference scan settings

Good luck with your study!

Hello,

Just following up about whether it’s possible to use a single SBREF image for several functional runs. We recently upgraded to a new Siemens software (XA30), and the SBREFs are not automatically generated per functional run as they were before.
Instead an SBREF is explicitly created as a sequence and applied to all functional runs in the scan session. This SBREF sequence is essentially the same sequence as the functional run without multiband factor, and only as a volume.
After BIDS conversion, we have something like this in our func folder:

sub-xx_task-xx_run-01_sbref.nii.gz
sub-xx_task-xx_run-01_bold.nii.giz
sub-xx_task-xx_run-02_bold.nii.giz
sub-xx_task-xx_run-03_bold.nii.giz
sub-xx_task-xx_run-01_sbref.json
sub-xx_task-xx_run-01_bold.json
sub-xx_task-xx_run-02_bold.json
sub-xx_task-xx_run-03_bold.json

I think fMRIprep will only use the sbref for bold run-01 (since the names match). Our current work around is to copy the sbref and rename it to correspond to each bold run.

Would it be possible to assign all functional runs to a specific SBREF by perhaps listing the func runs in the “intended for” field in json (as done for the fmaps)?

Thanks