Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RF: Update primary bold workflow to incorporate single shot resampling #3114

Merged
merged 45 commits into from
Oct 17, 2023

Conversation

effigies
Copy link
Member

Changes proposed in this pull request

This is a pretty big one, so I'm pausing now. Things that this PR is doing:

  1. Adding single-shot reampling interfaces for fieldmaps and BOLD volumes/series.
  2. Gets rid of the old single_subject_wf and replaces it with what had been single_subject_fit_wf.
  3. Creates a new workflow in workflows.bold.base to wrap around fit and further stages.
  4. Adds an init_bold_native_wf to workflow.bold.fit, which handles slice timing correction and multi-echo, and always returns both a native-resampled file as well as something that can be resampled and the transforms/fieldmaps it should use.
    • For single-echo, the resample-able thing is the STC'd file, and you get motion transforms and fieldmap ID back.
    • For multi-echo, the resample-able thing is the optimal combination, and motion transforms and fieldmap are dropped.

@codecov
Copy link

codecov bot commented Oct 13, 2023

Codecov Report

Attention: 298 lines in your changes are missing coverage. Please review.

Comparison is base (51319bb) 47.24% compared to head (a8630f9) 46.89%.
Report is 6 commits behind head on next.

❗ Current head a8630f9 differs from pull request most recent head 8187256. Consider uploading reports for the commit 8187256 to get more accurate results

Additional details and impacted files
@@            Coverage Diff             @@
##             next    #3114      +/-   ##
==========================================
- Coverage   47.24%   46.89%   -0.35%     
==========================================
  Files          49       53       +4     
  Lines        4009     4224     +215     
==========================================
+ Hits         1894     1981      +87     
- Misses       2115     2243     +128     
Files Coverage Δ
fmriprep/workflows/bold/resampling.py 11.01% <ø> (ø)
fmriprep/workflows/tests/test_base.py 100.00% <ø> (ø)
fmriprep/workflows/bold/t2s.py 28.94% <0.00%> (ø)
fmriprep/workflows/tests/__init__.py 32.35% <50.00%> (ø)
fmriprep/utils/asynctools.py 57.14% <57.14%> (ø)
fmriprep/workflows/bold/apply.py 72.72% <72.72%> (ø)
fmriprep/utils/misc.py 27.77% <20.00%> (-9.73%) ⬇️
fmriprep/workflows/bold/outputs.py 20.68% <4.34%> (-0.45%) ⬇️
fmriprep/workflows/base.py 16.86% <30.76%> (+9.39%) ⬆️
fmriprep/utils/transforms.py 22.50% <22.50%> (ø)
... and 3 more

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@effigies
Copy link
Member Author

It works on my machine:

231013-16:58:31,771 nipype.workflow INFO:
         [Job 506] Completed (fmriprep_23_2_wf.sub_04_wf.anat_fit_wf.ds_msmsulc_wf.ds_sphere_reg_msm).
231013-16:58:33,657 nipype.workflow IMPORTANT:
         fMRIPrep finished successfully!
231013-16:58:33,657 nipype.workflow IMPORTANT:
         Works derived from this fMRIPrep execution should include the boilerplate text found in /data/testing/fmriprep-ng-3046/logs/CITATION.md.

@effigies effigies force-pushed the enh/resampler branch 2 times, most recently from 55e275e to 170bc16 Compare October 15, 2023 12:48
@effigies
Copy link
Member Author

@mgxd Could you review the structure? This builds on your initial two commits, but ends up moving most of that into fit.py, as we will need this for things like calculating the goodvoxels mask and other things like that. I'm not committed to that decision, so it could be moved back.

@oesteban @feilong, if you have time for one thing, looking over fmriprep.interfaces.resampling would be greatly appreciated. I've currently broken out fieldmap reconstruction and single-shot resampling into two separate interfaces, but they could potentially be recombined as they were in the sdcflows interface.

Copy link
Collaborator

@mgxd mgxd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with the structure, left a few comments as I was going through it

fmriprep/interfaces/resampling.py Outdated Show resolved Hide resolved
fmriprep/interfaces/resampling.py Outdated Show resolved Hide resolved
fmriprep/interfaces/resampling.py Outdated Show resolved Hide resolved
fmriprep/interfaces/resampling.py Outdated Show resolved Hide resolved
fmriprep/interfaces/resampling.py Outdated Show resolved Hide resolved
fmriprep/interfaces/resampling.py Outdated Show resolved Hide resolved
fmriprep/interfaces/resampling.py Outdated Show resolved Hide resolved
fmriprep/utils/transforms.py Outdated Show resolved Hide resolved
return nt.TransformChain([warp_transform, nt.Affine(affine)])


def parse_combined_hdf5(h5_fn, to_ras=True):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i'm confused by the assertions in this - are we just comparing with the hardcoded ants parameters? if so, are there difference if run sloppy?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have not noticed a difference in sloppy. The assertions are to make sure that we are not applying these modifications to files that they don't apply to.

Copy link
Member Author

@effigies effigies Oct 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@feilong could probably answer better than I could.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't sure if my understanding of the h5 file content format is correct. It was mainly based on my reverse engineering.

I tested the function extensively for T1 -> MNI transforms, and I am very sure it works properly in this case. I haven't tested it in other conditions.

fmriprep/workflows/bold/apply.py Outdated Show resolved Hide resolved
effigies and others added 2 commits October 17, 2023 10:49
Co-authored-by: Mathias Goncalves <goncalves.mathias@gmail.com>
Co-authored-by: Mathias Goncalves <goncalves.mathias@gmail.com>
@effigies
Copy link
Member Author

Going to merge and keep things moving. Working on T1 resampling and CIFTI next.

@effigies effigies merged commit 978ae51 into nipreps:next Oct 17, 2023
2 of 3 checks passed
@effigies effigies deleted the enh/resampler branch October 17, 2023 14:55
@feilong
Copy link
Contributor

feilong commented Oct 24, 2023

I eyeballed fmriprep.interfaces.resampling and everything looks good to me.
I'm looking forward to testing it on my datasets soon.

effigies added a commit that referenced this pull request Jan 10, 2024
23.2.0 (January 10, 2024)

New feature release in the 23.2.x series.

This release wraps up a significant refactor of fMRIPrep. The main new features
can be used with the ``--level`` and ``--derivatives`` flags.

The ``--level`` flag can take the arguments ``minimal``, ``resampling`` or
``full``. The default is ``full``, which should produce nearly the same results
as previous versions. ``minimal`` will produce only the minimum necessary to
deterministically generate the remaining derivatives. ``resampling`` will produce
some additional derivatives, intended to simplify resampling with other tools.

The ``--derivatives`` flag takes arguments of the form ``name=/path/to/dir``,
for example ``--derivatives anat=$SMRIPREP_DIR``.  If provided, fMRIPrep will
read the specified directories for pre-computed derivatives. If a derivative is
found, it will be used instead of computing it from scratch. If a derivative is
not found, fMRIPrep will compute it and proceed as usual.

Taken together, these features can allow a dataset provider to run a minimal
fMRIPrep run, targeting many output spaces, while a user can then run a
``--derivatives`` run to generate additional derivatives in only the output
spaces they need. Another use case is to provide an precomputed derivative
to override the default fMRIPrep behavior, enabling easier workarounds for
bugs or experimentation with alternatives.

Additionally, this release includes a number of bug fixes and improvements.
This release adds support for MSM-Sulc, improving the alignment of subject
surfaces to the fsLR template. This process is enabled by default, but may
be disabled with the ``--no-msm`` flag.

This release resolves a number of issues with fieldmaps inducing distortions
during correction. Phase difference and direct fieldmaps are now masked correctly,
preventing the overestimation of distortions outside the brain. Additionally,
we now implement Jacobian weighting during unwarping, which corrects for compression
and expansion effects on signal intensity. To disable Jacobian weighting, use
``--ignore fmap-jacobian``.

Finally, a new resampling method has been added, to better account for
susceptibility distortion and motion in a single shot resampling to a volumetric
target space. We anticipate extending this to surface targets in the future.

* FIX: Restore --ignore sbref functionality (#3180)
* FIX: Retrieve atlas ROIs at requested density (#3179)
* FIX: Keep minctracc executable in FreeSurfer installation (#3175)
* FIX: Exclude echo entity from optimally combined derivatives (#3166)
* FIX: Disable boldref-space outputs unless requested (#3159)
* FIX: Tag memory estimates in resamplers (#3150)
* FIX: Final revisions for next branch (#3134)
* FIX: Minor fixes to work with MSMSulc-enabled smriprep-next (#3098)
* FIX: Connect EPI-to-fieldmap transform (#3099)
* FIX: Use Py2-compatible version file template for fmriprep-docker (#3101)
* FIX: Update connections to unwarp_wf, convert ITK transforms to text (#3077)
* ENH: Allow --ignore fmap-jacobian to disable Jacobian determinant modulation during fieldmap correction (#3186)
* ENH: Exclude non-steady-state volumes from confound correlation plot (#3171)
* ENH: Pass FLAIR images to anatomical workflow builder to include in boilerplate (#3146)
* ENH: Restore carpetplot and other final adjustments (#3131)
* ENH: Restore CIFTI-2 generation (#3129)
* ENH: Restore resampling to surface GIFTIs (#3126)
* ENH: Restore confound generation (#3120)
* ENH: Restore resampling BOLD to volumetric templates (#3121)
* ENH: Restore resampling to T1w target (#3116)
* ENH: Add MSMSulc (#3085)
* ENH: Add reporting workflow for BOLD fit (#3082)
* ENH: Generate anatomical derivatives useful for resampling (#3081)
* RF: Load reportlets interfaces from nireports rather than niworkflows (#3176, #3184)
* RF: Separate goodvoxels mask creation from fsLR resampling (#3170)
* RF: Write out anatomical template derivatives (#3136)
* RF: Update primary bold workflow to incorporate single shot resampling (#3114)
* RF: Update derivative cache spec, calculate per-BOLD, reuse boldref2fmap (#3078)
* RF: Split fMRIPrep into fit and derivatives workflows (#2913)
* RPT: Rename CSF/WM confounds in fMRIPlot (#3172)
* TST: Add smoke tests for full workflow and most branching flags (#3155)
* TST: Add smoke-tests for bold_fit_wf (#3152)
* DOC: Fix documentation and description for init_bold_grayords_wf (#3051)
* DOC: Minor updates in outputs.rst (#3148)
* STY: Apply a couple refurb suggestions (#3151)
* STY: Fix flake8 warnings (#3044)
* STY: Apply pyupgrade suggestions (#3043)
* MNT: Restore mritotal subcommands to Dockerfile (#3149)
* MNT: Update smriprep to 0.13.1 (#3153)
* MNT: optimise size of PNG files (#3145)
* MNT: update vendored docs script ``github_link.py`` (#3144)
* MNT: Update tedana pin, test on Python 3.12 (#3141)
* MNT: Bump environment (#3132)
* MNT: Bump version requirements (#3107)
* MNT: http:// → https:// (#3097)
* MNT: Remove mritotal and dependencies from FreeSurfer ignore file (#3090)
* MNT: Update environment (#3073)
* MNT: Depend on newer sphinx (#3067)
* MNT: Install ANTs from conda-forge (#3061)
* MNT: Drop Python 3.8 and numpy 1.21 support (NEP29) (#3052)
* MNT: update update_zenodo.py script (#3042)
* MNT: Fix welcome message formatting and instructions (#3039)
* MNT: Python 3.11 should be supported (#3038)
* CI: Bump actions/setup-python from 4 to 5 (#3181)
* CI: Stop testing legacy layout (#3079)
* CI: Improve tag detection for docker builds (#3066)
* CI: Clean up pre-release builds (#3040)
NingAnMe added a commit to NingAnMe/fmriprep that referenced this pull request Jan 11, 2024
23.2.0 (January 10, 2024)

New feature release in the 23.2.x series.

This release wraps up a significant refactor of fMRIPrep. The main new features
can be used with the ``--level`` and ``--derivatives`` flags.

The ``--level`` flag can take the arguments ``minimal``, ``resampling`` or
``full``. The default is ``full``, which should produce nearly the same results
as previous versions. ``minimal`` will produce only the minimum necessary to
deterministically generate the remaining derivatives. ``resampling`` will produce
some additional derivatives, intended to simplify resampling with other tools.

The ``--derivatives`` flag takes arguments of the form ``name=/path/to/dir``,
for example ``--derivatives anat=$SMRIPREP_DIR``.  If provided, fMRIPrep will
read the specified directories for pre-computed derivatives. If a derivative is
found, it will be used instead of computing it from scratch. If a derivative is
not found, fMRIPrep will compute it and proceed as usual.

Taken together, these features can allow a dataset provider to run a minimal
fMRIPrep run, targeting many output spaces, while a user can then run a
``--derivatives`` run to generate additional derivatives in only the output
spaces they need. Another use case is to provide an precomputed derivative
to override the default fMRIPrep behavior, enabling easier workarounds for
bugs or experimentation with alternatives.

Additionally, this release includes a number of bug fixes and improvements.
This release adds support for MSM-Sulc, improving the alignment of subject
surfaces to the fsLR template. This process is enabled by default, but may
be disabled with the ``--no-msm`` flag.

This release resolves a number of issues with fieldmaps inducing distortions
during correction. Phase difference and direct fieldmaps are now masked correctly,
preventing the overestimation of distortions outside the brain. Additionally,
we now implement Jacobian weighting during unwarping, which corrects for compression
and expansion effects on signal intensity. To disable Jacobian weighting, use
``--ignore fmap-jacobian``.

Finally, a new resampling method has been added, to better account for
susceptibility distortion and motion in a single shot resampling to a volumetric
target space. We anticipate extending this to surface targets in the future.

* FIX: Restore --ignore sbref functionality (nipreps#3180)
* FIX: Retrieve atlas ROIs at requested density (nipreps#3179)
* FIX: Keep minctracc executable in FreeSurfer installation (nipreps#3175)
* FIX: Exclude echo entity from optimally combined derivatives (nipreps#3166)
* FIX: Disable boldref-space outputs unless requested (nipreps#3159)
* FIX: Tag memory estimates in resamplers (nipreps#3150)
* FIX: Final revisions for next branch (nipreps#3134)
* FIX: Minor fixes to work with MSMSulc-enabled smriprep-next (nipreps#3098)
* FIX: Connect EPI-to-fieldmap transform (nipreps#3099)
* FIX: Use Py2-compatible version file template for fmriprep-docker (nipreps#3101)
* FIX: Update connections to unwarp_wf, convert ITK transforms to text (nipreps#3077)
* ENH: Allow --ignore fmap-jacobian to disable Jacobian determinant modulation during fieldmap correction (nipreps#3186)
* ENH: Exclude non-steady-state volumes from confound correlation plot (nipreps#3171)
* ENH: Pass FLAIR images to anatomical workflow builder to include in boilerplate (nipreps#3146)
* ENH: Restore carpetplot and other final adjustments (nipreps#3131)
* ENH: Restore CIFTI-2 generation (nipreps#3129)
* ENH: Restore resampling to surface GIFTIs (nipreps#3126)
* ENH: Restore confound generation (nipreps#3120)
* ENH: Restore resampling BOLD to volumetric templates (nipreps#3121)
* ENH: Restore resampling to T1w target (nipreps#3116)
* ENH: Add MSMSulc (nipreps#3085)
* ENH: Add reporting workflow for BOLD fit (nipreps#3082)
* ENH: Generate anatomical derivatives useful for resampling (nipreps#3081)
* RF: Load reportlets interfaces from nireports rather than niworkflows (nipreps#3176, nipreps#3184)
* RF: Separate goodvoxels mask creation from fsLR resampling (nipreps#3170)
* RF: Write out anatomical template derivatives (nipreps#3136)
* RF: Update primary bold workflow to incorporate single shot resampling (nipreps#3114)
* RF: Update derivative cache spec, calculate per-BOLD, reuse boldref2fmap (nipreps#3078)
* RF: Split fMRIPrep into fit and derivatives workflows (nipreps#2913)
* RPT: Rename CSF/WM confounds in fMRIPlot (nipreps#3172)
* TST: Add smoke tests for full workflow and most branching flags (nipreps#3155)
* TST: Add smoke-tests for bold_fit_wf (nipreps#3152)
* DOC: Fix documentation and description for init_bold_grayords_wf (nipreps#3051)
* DOC: Minor updates in outputs.rst (nipreps#3148)
* STY: Apply a couple refurb suggestions (nipreps#3151)
* STY: Fix flake8 warnings (nipreps#3044)
* STY: Apply pyupgrade suggestions (nipreps#3043)
* MNT: Restore mritotal subcommands to Dockerfile (nipreps#3149)
* MNT: Update smriprep to 0.13.1 (nipreps#3153)
* MNT: optimise size of PNG files (nipreps#3145)
* MNT: update vendored docs script ``github_link.py`` (nipreps#3144)
* MNT: Update tedana pin, test on Python 3.12 (nipreps#3141)
* MNT: Bump environment (nipreps#3132)
* MNT: Bump version requirements (nipreps#3107)
* MNT: http:// → https:// (nipreps#3097)
* MNT: Remove mritotal and dependencies from FreeSurfer ignore file (nipreps#3090)
* MNT: Update environment (nipreps#3073)
* MNT: Depend on newer sphinx (nipreps#3067)
* MNT: Install ANTs from conda-forge (nipreps#3061)
* MNT: Drop Python 3.8 and numpy 1.21 support (NEP29) (nipreps#3052)
* MNT: update update_zenodo.py script (nipreps#3042)
* MNT: Fix welcome message formatting and instructions (nipreps#3039)
* MNT: Python 3.11 should be supported (nipreps#3038)
* CI: Bump actions/setup-python from 4 to 5 (nipreps#3181)
* CI: Stop testing legacy layout (nipreps#3079)
* CI: Improve tag detection for docker builds (nipreps#3066)
* CI: Clean up pre-release builds (nipreps#3040)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants