Skip to content

Commit 6acbcfa

Browse files
committed
RF: Switch from DerivativesDataSinks to Prep/Save nodes
1 parent 730cf16 commit 6acbcfa

File tree

6 files changed

+418
-204
lines changed

6 files changed

+418
-204
lines changed

fmriprep/interfaces/__init__.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +0,0 @@
1-
# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
2-
# vi: set ft=python sts=4 ts=4 sw=4 et:
3-
from niworkflows.interfaces.bids import DerivativesDataSink as _DDSink
4-
5-
6-
class DerivativesDataSink(_DDSink):
7-
out_path_base = ''
8-
9-
10-
__all__ = ('DerivativesDataSink',)

fmriprep/workflows/base.py

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@
3737
import bids
3838
from nipype.interfaces import utility as niu
3939
from nipype.pipeline import engine as pe
40+
from niworkflows.interfaces.bids import PrepareDerivative, SaveDerivative
4041
from niworkflows.utils.connections import listify
4142
from packaging.version import Version
4243

4344
from .. import config
44-
from ..interfaces import DerivativesDataSink
4545
from ..interfaces.reports import AboutSummary, SubjectSummary
4646
from ..utils.bids import dismiss_echo
4747

@@ -287,24 +287,34 @@ def init_single_subject_wf(subject_id: str):
287287
run_without_submitting=True,
288288
)
289289

290-
ds_report_summary = pe.Node(
291-
DerivativesDataSink(
292-
base_directory=config.execution.fmriprep_dir,
290+
prep_report_summary = pe.Node(
291+
PrepareDerivative(
293292
desc='summary',
294293
datatype='figures',
295294
dismiss_entities=dismiss_echo(),
296295
),
296+
name='prep_report_summary',
297+
run_without_submitting=True,
298+
)
299+
300+
ds_report_summary = pe.Node(
301+
SaveDerivative(base_directory=config.execution.fmriprep_dir),
297302
name='ds_report_summary',
298303
run_without_submitting=True,
299304
)
300305

301-
ds_report_about = pe.Node(
302-
DerivativesDataSink(
303-
base_directory=config.execution.fmriprep_dir,
306+
prep_report_about = pe.Node(
307+
PrepareDerivative(
304308
desc='about',
305309
datatype='figures',
306310
dismiss_entities=dismiss_echo(),
307311
),
312+
name='prep_report_about',
313+
run_without_submitting=True,
314+
)
315+
316+
ds_report_about = pe.Node(
317+
SaveDerivative(base_directory=config.execution.fmriprep_dir),
308318
name='ds_report_about',
309319
run_without_submitting=True,
310320
)
@@ -339,15 +349,15 @@ def init_single_subject_wf(subject_id: str):
339349
workflow.connect([
340350
(bidssrc, bids_info, [(('bold', fix_multi_T1w_source_name), 'in_file')]),
341351
(anat_fit_wf, summary, [('outputnode.t1w_preproc', 't1w')]),
342-
(anat_fit_wf, ds_report_summary, [('outputnode.t1w_preproc', 'source_file')]),
343-
(anat_fit_wf, ds_report_about, [('outputnode.t1w_preproc', 'source_file')]),
352+
(anat_fit_wf, prep_report_summary, [('outputnode.t1w_preproc', 'source_file')]),
353+
(anat_fit_wf, prep_report_about, [('outputnode.t1w_preproc', 'source_file')]),
344354
]) # fmt:skip
345355
else:
346356
workflow.connect([
347357
(bidssrc, bids_info, [(('t1w', fix_multi_T1w_source_name), 'in_file')]),
348358
(bidssrc, summary, [('t1w', 't1w')]),
349-
(bidssrc, ds_report_summary, [(('t1w', fix_multi_T1w_source_name), 'source_file')]),
350-
(bidssrc, ds_report_about, [(('t1w', fix_multi_T1w_source_name), 'source_file')]),
359+
(bidssrc, prep_report_summary, [(('t1w', fix_multi_T1w_source_name), 'source_file')]),
360+
(bidssrc, prep_report_about, [(('t1w', fix_multi_T1w_source_name), 'source_file')]),
351361
]) # fmt:skip
352362

353363
workflow.connect([
@@ -363,8 +373,16 @@ def init_single_subject_wf(subject_id: str):
363373
(inputnode, summary, [('subjects_dir', 'subjects_dir')]),
364374
(bidssrc, summary, [('t2w', 't2w'), ('bold', 'bold')]),
365375
(bids_info, summary, [('subject', 'subject_id')]),
366-
(summary, ds_report_summary, [('out_report', 'in_file')]),
367-
(about, ds_report_about, [('out_report', 'in_file')]),
376+
(summary, prep_report_summary, [('out_report', 'in_file')]),
377+
(about, prep_report_about, [('out_report', 'in_file')]),
378+
(prep_report_summary, ds_report_summary, [
379+
('out_file', 'in_file'),
380+
('out_path', 'relative_path'),
381+
]),
382+
(prep_report_about, ds_report_about, [
383+
('out_file', 'in_file'),
384+
('out_path', 'relative_path'),
385+
]),
368386
]) # fmt:skip
369387

370388
# Set up the template iterator once, if used

fmriprep/workflows/bold/base.py

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232

3333
from nipype.interfaces import utility as niu
3434
from nipype.pipeline import engine as pe
35+
from niworkflows.interfaces.bids import PrepareDerivative, SaveDerivative
3536
from niworkflows.utils.connections import listify
3637

3738
from ... import config
38-
from ...interfaces import DerivativesDataSink
3939
from ...utils.bids import dismiss_echo
4040
from ...utils.misc import estimate_bold_mem_usage
4141

@@ -336,22 +336,34 @@ def init_bold_wf(
336336
if multiecho:
337337
t2s_reporting_wf = init_t2s_reporting_wf()
338338

339-
ds_report_t2scomp = pe.Node(
340-
DerivativesDataSink(
339+
prep_report_t2scomp = pe.Node(
340+
PrepareDerivative(
341341
desc='t2scomp',
342342
datatype='figures',
343343
dismiss_entities=dismiss_echo(),
344344
),
345+
name='prep_report_t2scomp',
346+
run_without_submitting=True,
347+
)
348+
349+
ds_report_t2scomp = pe.Node(
350+
SaveDerivative(),
345351
name='ds_report_t2scomp',
346352
run_without_submitting=True,
347353
)
348354

349-
ds_report_t2star_hist = pe.Node(
350-
DerivativesDataSink(
355+
prep_report_t2star_hist = pe.Node(
356+
PrepareDerivative(
351357
desc='t2starhist',
352358
datatype='figures',
353359
dismiss_entities=dismiss_echo(),
354360
),
361+
name='prep_report_t2star_hist',
362+
run_without_submitting=True,
363+
)
364+
365+
ds_report_t2star_hist = pe.Node(
366+
SaveDerivative(),
355367
name='ds_report_t2star_hist',
356368
run_without_submitting=True,
357369
)
@@ -365,15 +377,24 @@ def init_bold_wf(
365377
(bold_native_wf, t2s_reporting_wf, [
366378
('outputnode.t2star_map', 'inputnode.t2star_file'),
367379
]),
368-
(t2s_reporting_wf, ds_report_t2scomp, [('outputnode.t2s_comp_report', 'in_file')]),
369-
(t2s_reporting_wf, ds_report_t2star_hist, [('outputnode.t2star_hist', 'in_file')]),
380+
(t2s_reporting_wf, prep_report_t2scomp, [('outputnode.t2s_comp_report', 'in_file')]),
381+
(t2s_reporting_wf, prep_report_t2star_hist, [('outputnode.t2star_hist', 'in_file')]),
382+
(prep_report_t2scomp, ds_report_t2scomp, [
383+
('out_file', 'in_file'),
384+
('out_path', 'relative_path'),
385+
]),
386+
(prep_report_t2star_hist, ds_report_t2star_hist, [
387+
('out_file', 'in_file'),
388+
('out_path', 'relative_path'),
389+
]),
370390
]) # fmt:skip
371391

372392
if config.workflow.level == 'resampling':
373393
# Fill-in datasinks of reportlets seen so far
374394
for node in workflow.list_node_names():
375395
if node.split('.')[-1].startswith('ds_report'):
376396
workflow.get_node(node).inputs.base_directory = fmriprep_dir
397+
if node.split('.')[-1].startswith('prep_report'):
377398
workflow.get_node(node).inputs.source_file = bold_file
378399
return workflow
379400

@@ -584,9 +605,8 @@ def init_bold_wf(
584605
repetition_time=all_metadata[0]['RepetitionTime'],
585606
)
586607

587-
ds_bold_cifti = pe.Node(
588-
DerivativesDataSink(
589-
base_directory=fmriprep_dir,
608+
prep_bold_cifti = pe.Node(
609+
PrepareDerivative(
590610
dismiss_entities=dismiss_echo(),
591611
space='fsLR',
592612
density=config.workflow.cifti_output,
@@ -595,10 +615,15 @@ def init_bold_wf(
595615
TaskName=all_metadata[0].get('TaskName'),
596616
**prepare_timing_parameters(all_metadata[0]),
597617
),
618+
name='prep_bold_cifti',
619+
)
620+
prep_bold_cifti.inputs.source_file = bold_file
621+
622+
ds_bold_cifti = pe.Node(
623+
SaveDerivative(base_directory=fmriprep_dir),
598624
name='ds_bold_cifti',
599625
run_without_submitting=True,
600626
)
601-
ds_bold_cifti.inputs.source_file = bold_file
602627

603628
workflow.connect([
604629
# Resample BOLD to MNI152NLin6Asym, may duplicate bold_std_wf above
@@ -637,9 +662,14 @@ def init_bold_wf(
637662
(bold_fsLR_resampling_wf, bold_grayords_wf, [
638663
('outputnode.bold_fsLR', 'inputnode.bold_fsLR'),
639664
]),
640-
(bold_grayords_wf, ds_bold_cifti, [
665+
(bold_grayords_wf, prep_bold_cifti, [
641666
('outputnode.cifti_bold', 'in_file'),
642-
(('outputnode.cifti_metadata', _read_json), 'meta_dict'),
667+
('outputnode.cifti_metadata', 'meta_dict'),
668+
]),
669+
(prep_bold_cifti, ds_bold_cifti, [
670+
('out_file', 'in_file'),
671+
('out_path', 'relative_path'),
672+
('out_meta', 'metadata'),
643673
]),
644674
]) # fmt:skip
645675

@@ -653,18 +683,21 @@ def init_bold_wf(
653683
name='bold_confounds_wf',
654684
)
655685

656-
ds_confounds = pe.Node(
657-
DerivativesDataSink(
658-
base_directory=fmriprep_dir,
686+
prepare_confounds = pe.Node(
687+
PrepareDerivative(
659688
desc='confounds',
660689
suffix='timeseries',
661690
dismiss_entities=dismiss_echo(),
662691
),
692+
name='prepare_confounds',
693+
run_without_submitting=True,
694+
)
695+
ds_confounds = pe.Node(
696+
SaveDerivative(base_directory=fmriprep_dir),
663697
name='ds_confounds',
664698
run_without_submitting=True,
665-
mem_gb=config.DEFAULT_MEMORY_MIN_GB,
666699
)
667-
ds_confounds.inputs.source_file = bold_file
700+
prepare_confounds.inputs.source_file = bold_file
668701

669702
workflow.connect([
670703
(inputnode, bold_confounds_wf, [
@@ -681,10 +714,15 @@ def init_bold_wf(
681714
(bold_native_wf, bold_confounds_wf, [
682715
('outputnode.bold_native', 'inputnode.bold'),
683716
]),
684-
(bold_confounds_wf, ds_confounds, [
717+
(bold_confounds_wf, prepare_confounds, [
685718
('outputnode.confounds_file', 'in_file'),
686719
('outputnode.confounds_metadata', 'meta_dict'),
687720
]),
721+
(prepare_confounds, ds_confounds, [
722+
('out_file', 'in_file'),
723+
('out_path', 'relative_path'),
724+
('out_meta', 'metadata'),
725+
]),
688726
]) # fmt:skip
689727

690728
if spaces.get_spaces(nonstandard=False, dim=(3,)):
@@ -726,6 +764,7 @@ def _last(inlist):
726764
for node in workflow.list_node_names():
727765
if node.split('.')[-1].startswith('ds_report'):
728766
workflow.get_node(node).inputs.base_directory = fmriprep_dir
767+
if node.split('.')[-1].startswith('prep_report'):
729768
workflow.get_node(node).inputs.source_file = bold_file
730769

731770
return workflow

0 commit comments

Comments
 (0)