-
Notifications
You must be signed in to change notification settings - Fork 296
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
ENH: Restore CIFTI-2 generation #3129
Conversation
7baefba
to
0d1be7a
Compare
Codecov ReportAttention:
Additional details and impacted files@@ Coverage Diff @@
## next #3129 +/- ##
==========================================
+ Coverage 48.20% 48.22% +0.01%
==========================================
Files 53 53
Lines 4134 4131 -3
==========================================
- Hits 1993 1992 -1
+ Misses 2141 2139 -2
☔ View full report in Codecov by Sentry. |
This is ready for review. Will move onto carpetplots building on this. |
19e9022
to
da91be4
Compare
da91be4
to
21b79e7
Compare
Tests passing. @mgxd do you have time to review? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just a question
suffix='bold', | ||
compress=False, | ||
TaskName=all_metadata[0].get('TaskName'), | ||
**prepare_timing_parameters(all_metadata[0]), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not necessarily related to this PR, but is this the only time we are outputing this metadata? seems like something we should only calculate once and then distribute to any bold outputs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, we also calculate it in the volumetric workflow:
fmriprep/fmriprep/workflows/bold/outputs.py
Lines 686 to 737 in c294028
def init_ds_volumes_wf( | |
*, | |
bids_root: str, | |
output_dir: str, | |
multiecho: bool, | |
metadata: ty.List[dict], | |
name="ds_volumes_wf", | |
) -> pe.Workflow: | |
timing_parameters = prepare_timing_parameters(metadata) | |
workflow = pe.Workflow(name=name) | |
inputnode = pe.Node( | |
niu.IdentityInterface( | |
fields=[ | |
'source_files', | |
'ref_file', | |
'bold', # Resampled into target space | |
'bold_mask', # boldref space | |
'bold_ref', # boldref space | |
't2star', # boldref space | |
# Anatomical | |
'boldref2anat_xfm', | |
# Template | |
'anat2std_xfm', | |
# Entities | |
'space', | |
'cohort', | |
'resolution', | |
] | |
), | |
name='inputnode', | |
) | |
raw_sources = pe.Node(niu.Function(function=_bids_relative), name='raw_sources') | |
raw_sources.inputs.bids_root = bids_root | |
boldref2target = pe.Node(niu.Merge(2), name='boldref2target') | |
# BOLD is pre-resampled | |
ds_bold = pe.Node( | |
DerivativesDataSink( | |
base_directory=output_dir, | |
desc='preproc', | |
compress=True, | |
SkullStripped=multiecho, | |
TaskName=metadata.get('TaskName'), | |
dismiss_entities=("echo",), | |
**timing_parameters, | |
), | |
name='ds_bold', | |
run_without_submitting=True, | |
mem_gb=DEFAULT_MEMORY_MIN_GB, | |
) |
So it gets recalculated several times. We could refactor the function to have a cacheable core (can't @lru_cache
with a dictionary argument), but I'm not sure saving <1s (estimate, not measured) at workflow build is really worth it.
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)
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)
Builds on #3126.
This one splits out the selection of the MNI template for the CIFTI-2 generation from the rest of the resampling to volumetric templates. If someone requests MNI152NLin6Asym and CIFTI, then we will resample twice in the working directory, but given that resampling is significantly faster now and does not scale files per-time point, I'm okay with that. I think it's a pretty rare case, and I suspect we'll want to resample a smaller ROI than the full brain at some point, so a separate pathway for that seems okay.