I have a task and resting multi-echo datasets. Very nice to see that fmriprep now has a multiecho pipeline. However, as far as I can see, fmriprep does not yet apply multiecho ICA denoising. For this, I would still be required to use tedana. My query is regarding the optimal pipeline for processing my multiecho datasets with me-ica denoising.
Does the following approach sound sensible:
- Use fmriprep to perform slice-timing correction on multiecho dataset.
- Use tedana to optimally combine multiecho-data and perform ICA denoising, removing motion, physiology, etc… non-bold components.
- Feed optimally combined and denoised multiecho data to fmriprep for normalisation and distortion correction using field map.
Please let me know if this sounds like a sensible approach, or whether there is an imminent release of fmriprep with me-ica denoising.
Thank you in advance for your help.
I know that @emdupre is working on integrating multi-echo denoising (in addition to optimal combination) with tedana into fMRIPrep, but that’s a little ways out.
I agree that, in the mean time, it makes sense to use fMRIPrep and tedana separately, but within the same overall pipeline. However, I’m not sure about the details of your approach. Specifically, I don’t think you can break fMRIPrep into separate parts like that.
The approach we’re planning to take in a tedana analysis is to run fMRIPrep and then to grab native-space partially preprocessed data (i.e., post STC and HMC) from the fMRIPrep working directory. We’ll then feed those data through tedana and finally apply fMRIPrep’s calculated transforms for coregistration and normalization. We haven’t completed the code to do this yet, but I believe that it’s all doable. The overall pipeline is the same as yours, but doesn’t require stopping and restarting fMRIPrep.
Thank you for the helpful reply. It is good to know that integration of multi-echo denoising and fmriprep is on its way. Do you know what the timeline for this might be?
In the mean time, I wonder whether we might not just be able to obtain some partially processed images from fmriprep. For example, echo1_bold_hmc_stc, echo2_bold_hmc_stc, echo3_bold_hmc_stc and feed these files into tedana.
I take it tedana would then output a combined file of denoised optimally combined echos. Could I then feed this one file into fmriprep, to complete the SDC, normalisation etc…?
Just as a note, I am new to tedana and fmriprep so I may be naive to certain aspects of the workflow/pipeline.
The first files that you should be able to access (which will be stored in the working directory, I think) should be the data in native space, after slice timing correction, motion correction, and distortion correction. You can take those, run tedana on them, and then use coregistration and normalization warp files, saved by fMRIPrep, to transform the denoised data into standard space. I don’t think that you can submit partially processed data into fMRIPrep without it re-running the entire pipeline.
So the only difference from your proposed approach is that you would apply the final transforms, originally estimated by fMRIPrep, yourself instead of re-submitting the denoised data to fMRIPrep to have it do them. That said, I think SDC will have to be performed before tedana, although I could be wrong.
Thank you. This sounds like a sensible solution until ME-ICA is fully integrated with fmriprep.
Thanks for giving your time.
Dear @tsalo @emdupre ,
Thank you thus far for your help setting up a pipeline using fmriprep. I have managed to get fmriprep to run, though I have a few things that are still not working correctly. I was wondering whether you had any thoughts.
BIDS directory: This was setup using heudiconv for BIDS directory. I a customised heuristic file to, largely, set up my directory as required. Ie., my multiecho files were individual list in /func folder. However, my sbref images were labeled with rec_magnitude for each echo image. I relabeled these to align with the labels for echo images. I have attached my heuristic file as well as an image for reference.
fmriprep: I then used this BIDS directory in the fmriprep analysis pipeline (code used is attached). I managed for this to run successfully on our cluster using singularity. However, it seems as though only echo 1 was processed–I see no optimically combined image and cannot locate the minimally preprocessed echo images in my working directory that I would like to feed into tedana. Moreover, fmriprep is not recognising the I have a fieldmap in /fmap folder and sbref images for each echo. Any ideas why fmriprep is skipping these images?
Please let me know if you would like for me to attach anything else, please let me know.
Kind regards, convert_dicom_gut2.txt
Gershon.fmriprep_launch_v3.txt (455 Bytes)
I don’t believe that fMRIPrep labels the output preprocessed file as “optimally combined,” but it shouldn’t have
echo-1 in the filename. Is that the case?
Currently, fMRIPrep doesn’t output the echo-specific images, which is why we recommend collecting the relevant files from fMRIPrep’s working directory and moving them into the output directory. We have some provisional code available here, although it’s currently just a notebook tailored to our project. We plan to convert it into a more general function soon, but you can almost certainly adapt it yourself to work with your own data structure. We have tested the code (and it looks good), but haven’t checked too deeply against fMRIPrep’s code, so we’re not 100% sure we’re grabbing the right files.
Regarding the field maps, it looks like you’re using
--force-syn. That would force fMRIPrep to use field map-less distortion correction. I’m not sure about the sbref files. Are you sure it’s not using them? Can you share the captured stdout?
Thanks for the reply Taylor,
In the html report, the figure all point to figure labels with ‘echo-1’. For example, sub-018/figures/sub-018_ses-001_task-faces_echo-1_rois.svg
Moreover in my working directory I only find the following files:
Does this indicate that only echo_1 is analysed?
However, when I go to the output directory the files are not labeled with ‘echo…’. For example, fmriprep/sub-018/ses-001/func/sub-018_ses-001_task-faces_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
Does this mean that the html report and working file label is indicating the echo-1 is being used as some reference, but actually the correct, optimally combined, images can be found in the output folder?
ie., the following image is the optimally combined image: sub-018_ses-001_task-faces_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
I will examine your code and try to omit --force-syn.
I believe that the
echo-1 is probably just an oversight in the naming. Even after the data are optimally combined across echoes, the working directory may store the files in folders with
echo-1 in the name. The
desc-preproc file in the output directory should definitely be the optimally combined, preprocessed data.
Hi @tsalo and @emdupre,
My apologies for tagging you two again, but you seem to be the resident experts regarding combining fmriprep and tedana.
I have processed my data with the latest version of fmriprep 1.4, chosing MNI152NLin6Asym as an output space using --output-spaces.
I have managed to use the script (https://github.com/ME-ICA/tedana-reliability-analysis/blob/master/collect_fmriprep.ipynb) provided by @tsalo to obtain the minimally preprocessed images for use in tedana. However, I am having some difficulty extracting the required files for subsequent warp transformation from native BOLD space to MNI152NLin6Asym.
For example, the script points to the folder in the wf called ‘bold_to_mni_trans_wf’, which does not seem to exist. I wonder if this has changed in subsequent version of fmriprep. I think I may have found the correct files in ‘op.join(task_dir, ‘bold_mni_trans_wf’,‘bold_to_mni_transform/_inputs.pklz’)’, but not entirely sure.
Using these files, I create two files:
I then tried to use the following to files using ApplyTransform to warp my BOLD image in native space to MNI152NLin6Asym (as a sanity check prior to running tedana), but this did not work (ie, the command ran but not image was displayed).
at = ApplyTransforms()
at.inputs.dimension = 3
at.inputs.interpolation = ‘NearestNeighbor’
at.inputs.float = False
at.inputs.transforms = op.join(sub_func_dir,‘sub-002_ses-002_task-faces_from-native_to-reference_mode-image_xfm.txt’)
at.inputs.input_image = op.join(sub_func_dir,‘sub-002_ses-002_task-faces_echo-1_space-native_desc-partialPreproc_bold.nii’)
at.inputs.reference_image = op.join(sub_func_dir,‘sub-002_ses-002_task-faces_space-MNI152NLin6Asym_desc-preproc_bold.nii.gz’)
at.inputs.output_image = ‘/home/fs0/gspitz/scratch/gut_study/data/fmriprep_output/fmriprep_derivative/test.nii.gz’
I was hoping you might have an easy fix to this. I am sure the files are there, but having difficulty locating the correct ones.
Hi @gspitz !
I haven’t had a chance to look into your question yet, but I just wanted to let you know it’s on our radar ! Hoping to have time next week to check-in. In the mean time, not sure if some fmriprep folks (maybe @effigies or @oesteban ?) would know about fmriprep updates in saving transforms as of v1.4.
Sorry for the delay,
Thank you for the reply @emdupre --much appreciated.
I’ll look forward to any helpful replies.
It’s unclear what files exactly you found and are trying to use, but a
.txt file is not going to perform the warps needed to get you to the template space. We save the transform from T1w to template in the
anat/ subdirectory, which should look something like:
It looks like you’re also using a BOLD image that hasn’t been resampled in T1w space, so you’ll probably need to dig up the affine transform from BOLD to T1w, which should be in something like:
You need to pass your transforms as a list, with the T1w-template first, and your BOLD-T1w second. If you are also using SDC, that should go third.
Thank you for the reply.
I have the first two transforms you mentioned. I’ll hunt dow the SDC transform and also apply this.
Good news–I am able to transform my tedana-processed denoised epi to standard space using the t1_2_standard and bold_2_t1 transforms.
However, because I apply pepolar sdc, I would also like to apply this to my tedana-processed image. I can see that fmriprep uses the _warpfieldQwap_PLUS_WARP_fixhdr.nii.gz
However, opening this image just provide an empty image–just a rectangle with all ‘0’. Is this correct? Including this to my transform has no effect on the image. ie., no SDC correction applied.
Is this the correct transform file?
I’m not positive of the filename used, but you should be able to find it in the
ApplyTransform transforms list, so if that’s what you’re seeing, then that’s probably right.
Are you sure that it’s all zeros? e.g.,
import nibabel as nb
img = nb.load(fname)
print("Zeros: ", np.allclose(img.get_fdata(), 0))
If so, I would inspect your input fieldmaps to make sure that they look sensible. All zeros suggests to me that you have the exact same data in your reverse-PE fieldmap, but this is just an intuition. I’m not as versed in the fieldmap components of the workflow as most of the rest.
Thanks for the quick reply @effigies
I used the Apply Transform to hunt down the correct transforms:
For SDC it is: single_subject_002_wf/func_preproc_ses_001_task_fmritask_echo_1_wf/sdc_wf/pepolar_unwarp_wf/cphdr_warp/_warpfieldQwarp_PLUS_WARP_fixhdr.nii.gz’
Using this file I return ‘False’ using the command you provided above.
I am using the following command for apply transform:
[‘antsApplyTransforms’, ‘–default-value’, ‘0’, ‘–input-image-type’, ‘3’, ‘–dimensionality’, ‘3’, ‘–float’, ‘1’, ‘–input’, ‘/home/fs0/gspitz/scratch/study/data/tedana_output/sub-002-ses-001/dn_ts_OC.nii’, ‘–interpolation’, ‘LanczosWindowedSinc’, ‘–output’, ‘/home/fs0/gspitz/scratch/study/data/fmriprep_output/fmriprep/sub-002/ses-001/func/sub-002_ses-001_task-fmritask_space-MNI152NLin6Asym_desc-dn_ts_OC_bold_test2.nii.gz’, ‘–reference-image’, ‘/home/fs0/gspitz/scratch/study/data/template/tpl-MNI152NLin6Asym_res-02_T1w.nii.gz’, ‘–transform’, ‘/home/fs0/gspitz/scratch/study/data/fmriprep_output/fmriprep/sub-002/anat/sub-002_from-T1w_to-MNI152NLin6Asym_mode-image_xfm.h5’, ‘–transform’, ‘/home/fs0/gspitz/scratch/study/data/fmriprep_output/fmriprep/sub-002/ses-001/func/sub-002_ses-001_task-fmritask_from-reference_to-T1w_mode-image_xfm.txt’, ‘–transform’, ‘/vols/Scratch/gspitz/study/data/fmriprep_output/fmriprep_wf/single_subject_002_wf/func_preproc_ses_001_task_fmritask_echo_1_wf/sdc_wf/pepolar_unwarp_wf/cphdr_warp/_warpfieldQwarp_PLUS_WARP_fixhdr.nii.gz’]
I have also inspected the phase-reverse epi for this participant. It looks sensible to me.
Sorry, to be clear, are you saying that this is working for you? It sounds like your reverse-PE EPI looks good, you have a non-zero fieldmap estimate, and are able to apply the transforms. If you need further assistance, please clarify.
Looking at the images again, I seem to be able to ‘recover’ to original preprocessed image from fmriprep. There are some differences, which I suspect are due to a different mask being applied in tedana. Ie., voxels are in same place in both images, but some voxels, o the outside of the brain are missing. Ie., looks like at some point tedana applies a tighter mask.
So it looks like things are working well.
Thank you for the help!
Hi Taylor and @emdupre,
I was reading through this string as I have ME data and am currently preprocessing with fMRIPrep (thanks for all of your work on the pipeline!). I’m wondering - since this post was back in March '19 - how close is fMRIPrep with integrating multi-echo denoising? Just trying to figure out if it’s worth waiting until it’s integrated, or using fMRIPrep and tedana separately, but within the same pipeline as suggested here. Thanks so much for any thoughts and suggestions!