How to incorporate physiological data (cardiac/respiratory) with fMRIPrep + XCP-D pipeline?

Hi NeuroStars community,

I’m working on a project where we have resting-state fMRI data along with physiological recordings (cardiac and respiratory signals) acquired during scanning. We are planning to preprocess the fMRI data using fMRIPrep, followed by post-processing with XCP-D.

I would like to ask:

  1. Can fMRIPrep natively process or incorporate physiological data (e.g., pulse oximeter, respiratory belt recordings) to generate physiological noise regressors (e.g., RETROICOR)?
  2. If not, what is the recommended workflow for integrating physiological denoising with a fMRIPrep + XCP-D pipeline?
  3. Are there any special considerations when working with multiband data?

I’d really appreciate any guidance, especially from those who have successfully integrated physio-based denoising into this workflow.

Thanks so much in advance!
— Mahta

Hi @mahta.karimpoor and welcome to neurostars!

No, this thread may be helpful to read for information: Physiological noise model? (RETROICOR) · Issue #664 · nipreps/fmriprep · GitHub

…we decided that RETROICOR has requirements that do not mesh easily with fMRIPrep’s design. One possibility is to preprocess the BOLD file with 3dDespike, 3dTshift and RetroTS before passing to fMRIPrep. At that point it might be worth instead just using afni_proc.py.

We were looking into RapidTide #1678 and that seems like it is more compatible.

As @Steven said, fMRIPrep doesn’t process physio data. I believe the physiopy community is working on a pipeline for preprocessing physio data, but you can use other tools in the meantime.

If you want to run RETROICOR, I think you need to run it before fMRIPrep.

For RETROICOR, you need to apply it to your BOLD data before preprocessing, but for other types of physio denoising, like including physio-based regressors in your denoising GLM, you can calculate the regressors separately, organize them into a BIDS-like dataset, and pass them into XCP-D with a custom nuisance regression strategy. See here for more info on how to pass in custom confounds to XCP-D.

I’m not sure which physio regressors are most useful for denoising BOLD data, unfortunately.

I believe with RETROICOR you feed in the slice times when you generate your physio regressors. For non-voxelwise physio regressors (e.g., RV, RVT, HRV), you don’t need to do anything special for multiband data since the denoising will happen after slice timing correction. You might want to resample your physio data with the slice time reference you use for fMRIPrep, but that’s not multiband-specific.

Thank you so much for this very useful information.

Thank you, I really appreciate your detailed response.