Skip to content

Commit 693c6be

Browse files
committed
finish first pass at generated functional metadata
- [x] Propagate "RepetitionTime" to ``desc-preproc_bold`` outputs. - [x] Update sMRIPrep to PR were writing metadata is implemented. - [x] Remove leftovers referrencing the old anatomical skullstripping workflow. Close #1190 Close #1384
1 parent adee4bf commit 693c6be

File tree

9 files changed

+82
-35
lines changed

9 files changed

+82
-35
lines changed

.circleci/ds005_outputs.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,15 @@ fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAs
5454
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-aseg_dseg.nii.gz
5555
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-brain_mask.json
5656
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
57+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-preproc_bold.json
5758
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
5859
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-smoothAROMAnonaggr_bold.nii.gz
5960
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_boldref.nii.gz
6061
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-aparcaseg_dseg.nii.gz
6162
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-aseg_dseg.nii.gz
6263
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-brain_mask.json
6364
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-brain_mask.nii.gz
65+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-preproc_bold.json
6466
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-preproc_bold.nii.gz
6567
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_AROMAnoiseICs.csv
6668
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_bold.dtseries.json
@@ -76,13 +78,15 @@ fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAs
7678
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-aseg_dseg.nii.gz
7779
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-brain_mask.json
7880
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
81+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-preproc_bold.json
7982
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
8083
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-smoothAROMAnonaggr_bold.nii.gz
8184
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_boldref.nii.gz
8285
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-aparcaseg_dseg.nii.gz
8386
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-aseg_dseg.nii.gz
8487
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-brain_mask.json
8588
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-brain_mask.nii.gz
89+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-preproc_bold.json
8690
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-preproc_bold.nii.gz
8791
fmriprep/sub-01.html
8892
/tmp/ds005/derivatives

.circleci/ds005_partial_outputs.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,15 @@ fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAs
5454
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-aseg_dseg.nii.gz
5555
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-brain_mask.json
5656
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
57+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-preproc_bold.json
5758
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
5859
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-smoothAROMAnonaggr_bold.nii.gz
5960
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_boldref.nii.gz
6061
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-aparcaseg_dseg.nii.gz
6162
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-aseg_dseg.nii.gz
6263
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-brain_mask.json
6364
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-brain_mask.nii.gz
65+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-preproc_bold.json
6466
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-preproc_bold.nii.gz
6567
fmriprep/sub-01.html
6668
/tmp/ds005/derivatives_partial

.circleci/ds054_outputs.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
fmriprep
22
fmriprep/dataset_description.json
3+
fmriprep/desc-aparcaseg_dseg.tsv
4+
fmriprep/desc-aseg_dseg.tsv
35
fmriprep/logs
46
fmriprep/logs/CITATION.bib
57
fmriprep/logs/CITATION.html
@@ -31,19 +33,23 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_desc-confounds_regre
3133
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-MNI152NLin2009cAsym_boldref.nii.gz
3234
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-MNI152NLin2009cAsym_desc-brain_mask.json
3335
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
36+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-MNI152NLin2009cAsym_desc-preproc_bold.json
3437
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
3538
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-T1w_boldref.nii.gz
3639
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-T1w_desc-brain_mask.json
3740
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-T1w_desc-brain_mask.nii.gz
41+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-T1w_desc-preproc_bold.json
3842
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-01_space-T1w_desc-preproc_bold.nii.gz
3943
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_desc-confounds_regressors.tsv
4044
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-MNI152NLin2009cAsym_boldref.nii.gz
4145
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-MNI152NLin2009cAsym_desc-brain_mask.json
4246
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
47+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-MNI152NLin2009cAsym_desc-preproc_bold.json
4348
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
4449
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-T1w_boldref.nii.gz
4550
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-T1w_desc-brain_mask.json
4651
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-T1w_desc-brain_mask.nii.gz
52+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-T1w_desc-preproc_bold.json
4753
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-02_space-T1w_desc-preproc_bold.nii.gz
4854
fmriprep/sub-100185.html
4955
/tmp/ds054/derivatives

.circleci/ds210_outputs.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
fmriprep
22
fmriprep/dataset_description.json
3+
fmriprep/desc-aparcaseg_dseg.tsv
4+
fmriprep/desc-aseg_dseg.tsv
35
fmriprep/logs
46
fmriprep/logs/CITATION.bib
57
fmriprep/logs/CITATION.html
@@ -31,6 +33,7 @@ fmriprep/sub-02/func/sub-02_task-cuedSGT_run-01_desc-confounds_regressors.tsv
3133
fmriprep/sub-02/func/sub-02_task-cuedSGT_run-01_space-MNI152NLin2009cAsym_boldref.nii.gz
3234
fmriprep/sub-02/func/sub-02_task-cuedSGT_run-01_space-MNI152NLin2009cAsym_desc-brain_mask.json
3335
fmriprep/sub-02/func/sub-02_task-cuedSGT_run-01_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
36+
fmriprep/sub-02/func/sub-02_task-cuedSGT_run-01_space-MNI152NLin2009cAsym_desc-preproc_bold.json
3437
fmriprep/sub-02/func/sub-02_task-cuedSGT_run-01_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
3538
fmriprep/sub-02.html
3639
/tmp/ds210/derivatives

docs/workflows.rst

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,22 @@ T1w/T2w preprocessing
6666
:simple_form: yes
6767

6868
from fmriprep.workflows.anatomical import init_anat_preproc_wf
69-
wf = init_anat_preproc_wf(omp_nthreads=1,
70-
reportlets_dir='.',
71-
output_dir='.',
72-
template='MNI152NLin2009cAsym',
73-
fs_spaces=['T1w', 'fsnative',
74-
'template', 'fsaverage5'],
75-
skull_strip_template='OASIS30ANTs',
76-
skull_strip_fixed_seed=False,
77-
freesurfer=True,
78-
longitudinal=False,
79-
debug=False,
80-
hires=True,
81-
num_t1w=1)
69+
wf = init_anat_preproc_wf(
70+
bids_root='.',
71+
debug=False,
72+
freesurfer=True,
73+
fs_spaces=['T1w', 'fsnative',
74+
'template', 'fsaverage5'],
75+
hires=True,
76+
longitudinal=False,
77+
num_t1w=1,
78+
omp_nthreads=1,
79+
output_dir='.',
80+
reportlets_dir='.',
81+
skull_strip_template='MNI152NLin2009cAsym',
82+
skull_strip_fixed_seed=False,
83+
template='MNI152NLin2009cAsym',
84+
)
8285

8386
The anatomical sub-workflow begins by constructing an average image by
8487
conforming all found T1w images to RAS orientation and

fmriprep/cli/run.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def get_parser():
185185
# ANTs options
186186
g_ants = parser.add_argument_group('Specific options for ANTs registrations')
187187
g_ants.add_argument('--skull-strip-template', action='store', default='OASIS30ANTs',
188-
choices=['OASIS30ANTs', 'NKI'],
188+
choices=['OASIS30ANTs', 'NKI', 'MNI152NLin2009cAsym'],
189189
help='select ANTs skull-stripping template (default: OASIS30ANTs))')
190190
g_ants.add_argument('--skull-strip-fixed-seed', action='store_true',
191191
help='do not use a random seed for skull-stripping - will ensure '
@@ -439,6 +439,15 @@ def before_send(event, hints):
439439
if "Workflow did not execute cleanly" not in str(e):
440440
sentry_sdk.capture_exception(e)
441441
raise
442+
else:
443+
from templateflow import api
444+
from niworkflows.utils.misc import _copy_any
445+
dseg_tsv = str(api.get('fsaverage', suffix='dseg', extensions=['.tsv']))
446+
_copy_any(dseg_tsv,
447+
str(Path(output_dir) / 'fmriprep' / 'desc-aseg_dseg.tsv'))
448+
_copy_any(dseg_tsv,
449+
str(Path(output_dir) / 'fmriprep' / 'desc-aparcaseg_dseg.tsv'))
450+
logger.log(25, 'fMRIPrep finished without errors')
442451
finally:
443452
# Generate reports phase
444453
errno += generate_reports(subject_list, output_dir, work_dir, run_uuid,

fmriprep/workflows/anatomical.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
77
88
.. autofunction:: init_anat_preproc_wf
9-
.. autofunction:: init_skullstrip_ants_wf
109
1110
Surface preprocessing
1211
+++++++++++++++++++++
@@ -21,7 +20,6 @@
2120
"""
2221
from smriprep.workflows.anatomical import (
2322
init_anat_preproc_wf,
24-
init_skullstrip_ants_wf,
2523
)
2624
from smriprep.workflows.surfaces import (
2725
init_surface_recon_wf,
@@ -31,7 +29,6 @@
3129

3230
__all__ = [
3331
'init_anat_preproc_wf',
34-
'init_skullstrip_ants_wf',
3532
'init_surface_recon_wf',
3633
'init_autorecon_resume_wf',
3734
'init_gifti_surface_wf',

fmriprep/workflows/base.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -446,19 +446,20 @@ def init_single_subject_wf(layout, subject_id, task_id, echo_idx, name, reportle
446446

447447
# Preprocessing of T1w (includes registration to MNI)
448448
anat_preproc_wf = init_anat_preproc_wf(
449-
skull_strip_template=skull_strip_template,
450-
fs_spaces=output_spaces,
451-
template=template,
449+
bids_root=layout.root,
452450
debug=debug,
453451
freesurfer=freesurfer,
452+
fs_spaces=output_spaces,
453+
hires=hires,
454454
longitudinal=longitudinal,
455+
name="anat_preproc_wf",
456+
num_t1w=len(subject_data['t1w']),
455457
omp_nthreads=omp_nthreads,
456-
hires=hires,
457-
reportlets_dir=reportlets_dir,
458458
output_dir=output_dir,
459-
num_t1w=len(subject_data['t1w']),
459+
reportlets_dir=reportlets_dir,
460460
skull_strip_fixed_seed=skull_strip_fixed_seed,
461-
name="anat_preproc_wf",
461+
skull_strip_template=skull_strip_template,
462+
template=template,
462463
)
463464

464465
workflow.connect([
@@ -517,7 +518,7 @@ def init_single_subject_wf(layout, subject_id, task_id, echo_idx, name, reportle
517518

518519
workflow.connect([
519520
(anat_preproc_wf, func_preproc_wf,
520-
[('outputnode.t1_preproc', 'inputnode.t1_preproc'),
521+
[(('outputnode.t1_preproc', _pop), 'inputnode.t1_preproc'),
521522
('outputnode.t1_brain', 'inputnode.t1_brain'),
522523
('outputnode.t1_mask', 'inputnode.t1_mask'),
523524
('outputnode.t1_seg', 'inputnode.t1_seg'),
@@ -542,3 +543,9 @@ def _prefix(subid):
542543
if subid.startswith('sub-'):
543544
return subid
544545
return '-'.join(('sub', subid))
546+
547+
548+
def _pop(inlist):
549+
if isinstance(inlist, (list, tuple)):
550+
return inlist[0]
551+
return inlist

fmriprep/workflows/bold/base.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -368,12 +368,16 @@ def init_func_preproc_wf(bold_file, ignore, freesurfer,
368368
# CIfTI output: currently, we only support fsaverage{5,6}
369369
cifti_spaces = [s for s in output_spaces if s in ('fsaverage5', 'fsaverage6')]
370370
cifti_output = cifti_output and cifti_spaces
371-
func_derivatives_wf = init_func_derivatives_wf(output_dir=output_dir,
372-
output_spaces=output_spaces,
373-
template=template,
374-
freesurfer=freesurfer,
375-
use_aroma=use_aroma,
376-
cifti_output=cifti_output)
371+
func_derivatives_wf = init_func_derivatives_wf(
372+
bids_root=layout.root,
373+
cifti_output=cifti_output,
374+
freesurfer=freesurfer,
375+
metadata=metadata,
376+
output_dir=output_dir,
377+
output_spaces=output_spaces,
378+
template=template,
379+
use_aroma=use_aroma,
380+
)
377381

378382
workflow.connect([
379383
(outputnode, func_derivatives_wf, [
@@ -848,11 +852,15 @@ def init_func_preproc_wf(bold_file, ignore, freesurfer,
848852
return workflow
849853

850854

851-
def init_func_derivatives_wf(output_dir, output_spaces, template, freesurfer,
852-
use_aroma, cifti_output, name='func_derivatives_wf'):
855+
def init_func_derivatives_wf(bids_root, cifti_output, freesurfer,
856+
metadata, output_dir, output_spaces,
857+
template, use_aroma,
858+
name='func_derivatives_wf'):
853859
"""
854860
Set up a battery of datasinks to store derivatives in the right location
855861
"""
862+
from niworkflows.interfaces.bids import ReadSidecarJSON
863+
from smriprep.workflows.outputs import _bids_relative
856864
workflow = Workflow(name=name)
857865

858866
inputnode = pe.Node(
@@ -866,11 +874,15 @@ def init_func_derivatives_wf(output_dir, output_spaces, template, freesurfer,
866874
'nonaggr_denoised_file', 'bold_cifti', 'cifti_variant']),
867875
name='inputnode')
868876

877+
raw_sources = pe.Node(niu.Function(function=_bids_relative), name='raw_sources')
878+
raw_sources.inputs.bids_root = bids_root
879+
869880
ds_confounds = pe.Node(DerivativesDataSink(
870881
base_directory=output_dir, desc='confounds', suffix='regressors'),
871882
name="ds_confounds", run_without_submitting=True,
872883
mem_gb=DEFAULT_MEMORY_MIN_GB)
873884
workflow.connect([
885+
(inputnode, raw_sources, [('source_file', 'in_file')]),
874886
(inputnode, ds_confounds, [('source_file', 'source_file'),
875887
('confounds', 'in_file')]),
876888
])
@@ -879,7 +891,8 @@ def init_func_derivatives_wf(output_dir, output_spaces, template, freesurfer,
879891
if 'T1w' in output_spaces:
880892
ds_bold_t1 = pe.Node(
881893
DerivativesDataSink(base_directory=output_dir, space='T1w', desc='preproc',
882-
keep_dtype=True, compress=True, SkullStripped=False),
894+
keep_dtype=True, compress=True, SkullStripped=False,
895+
RepetitionTime=metadata.get('RepetitionTime')),
883896
name='ds_bold_t1', run_without_submitting=True,
884897
mem_gb=DEFAULT_MEMORY_MIN_GB)
885898
ds_bold_t1_ref = pe.Node(
@@ -899,6 +912,7 @@ def init_func_derivatives_wf(output_dir, output_spaces, template, freesurfer,
899912
('bold_t1_ref', 'in_file')]),
900913
(inputnode, ds_bold_mask_t1, [('source_file', 'source_file'),
901914
('bold_mask_t1', 'in_file')]),
915+
(raw_sources, ds_bold_mask_t1, [('out', 'RawSources')]),
902916
])
903917
if freesurfer:
904918
ds_bold_aseg_t1 = pe.Node(DerivativesDataSink(
@@ -920,7 +934,8 @@ def init_func_derivatives_wf(output_dir, output_spaces, template, freesurfer,
920934
if 'template' in output_spaces:
921935
ds_bold_mni = pe.Node(
922936
DerivativesDataSink(base_directory=output_dir, space=template, desc='preproc',
923-
keep_dtype=True, compress=True, SkullStripped=False),
937+
keep_dtype=True, compress=True, SkullStripped=False,
938+
RepetitionTime=metadata.get('RepetitionTime')),
924939
name='ds_bold_mni', run_without_submitting=True,
925940
mem_gb=DEFAULT_MEMORY_MIN_GB)
926941
ds_bold_mni_ref = pe.Node(
@@ -940,6 +955,7 @@ def init_func_derivatives_wf(output_dir, output_spaces, template, freesurfer,
940955
('bold_mni_ref', 'in_file')]),
941956
(inputnode, ds_bold_mask_mni, [('source_file', 'source_file'),
942957
('bold_mask_mni', 'in_file')]),
958+
(raw_sources, ds_bold_mask_mni, [('out', 'RawSources')]),
943959
])
944960

945961
if freesurfer:

0 commit comments

Comments
 (0)