Skip to content

Commit 61e70a0

Browse files
committed
FIX: remove dummy scans
1 parent bacc323 commit 61e70a0

File tree

7 files changed

+19
-142
lines changed

7 files changed

+19
-142
lines changed

fmriprep/cli/parser.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -387,14 +387,6 @@ def _reference_frame(value, parser):
387387
action=DeprecatedAction,
388388
help='Deprecated - use `--force no-bbr` instead.',
389389
)
390-
g_conf.add_argument(
391-
'--dummy-scans',
392-
required=False,
393-
action='store',
394-
default=None,
395-
type=int,
396-
help='Number of nonsteady-state volumes. Overrides automatic detection.',
397-
)
398390
g_conf.add_argument(
399391
'--reference-frame',
400392
action='store',

fmriprep/config.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,6 @@ class workflow(_Config):
556556
"""Initial transform for PET-to-anatomical registration."""
557557
cifti_output = None
558558
"""Generate HCP Grayordinates, accepts either ``'91k'`` (default) or ``'170k'``."""
559-
dummy_scans = None
560-
"""Set a number of initial scans to be considered nonsteady states."""
561559
hires = None
562560
"""Run FreeSurfer ``recon-all`` with the ``-hires`` flag."""
563561
fs_no_resume = None

fmriprep/workflows/pet/base.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,6 @@ def init_pet_wf(
543543
('outputnode.petref', 'inputnode.petref'),
544544
('outputnode.motion_xfm', 'inputnode.motion_xfm'),
545545
('outputnode.petref2anat_xfm', 'inputnode.petref2anat_xfm'),
546-
('outputnode.dummy_scans', 'inputnode.skip_vols'),
547546
]),
548547
(pet_native_wf, pet_confounds_wf, [
549548
('outputnode.pet_native', 'inputnode.pet'),
@@ -575,7 +574,6 @@ def _last(inlist):
575574
('mni2009c2anat_xfm', 'inputnode.std2anat_xfm'),
576575
]),
577576
(pet_fit_wf, carpetplot_wf, [
578-
('outputnode.dummy_scans', 'inputnode.dummy_scans'),
579577
('outputnode.pet_mask', 'inputnode.pet_mask'),
580578
('outputnode.petref2anat_xfm', 'inputnode.petref2anat_xfm'),
581579
]),

fmriprep/workflows/pet/confounds.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ def init_pet_confs_wf(
121121
PET series mask
122122
motion_xfm
123123
ITK-formatted head motion transforms
124-
skip_vols
125-
number of non steady state volumes
126124
t1w_mask
127125
Mask of the skull-stripped template image
128126
t1w_tpms
@@ -214,7 +212,6 @@ def init_pet_confs_wf(
214212
'pet_mask',
215213
'petref',
216214
'motion_xfm',
217-
'skip_vols',
218215
't1w_mask',
219216
't1w_tpms',
220217
'petref2anat_xfm',
@@ -398,7 +395,6 @@ def _select_cols(table):
398395
# Set outputs
399396
(spike_regress, outputnode, [('confounds_file', 'confounds_file')]),
400397
(mrg_conf_metadata2, outputnode, [('out_dict', 'confounds_metadata')]),
401-
(inputnode, conf_corr_plot, [('skip_vols', 'ignore_initial_volumes')]),
402398
(concat, conf_corr_plot, [('confounds_file', 'confounds_file'),
403399
(('confounds_file', _select_cols), 'columns')]),
404400
(conf_corr_plot, ds_report_conf_corr, [('out_file', 'in_file')]),
@@ -445,8 +441,6 @@ def init_carpetplot_wf(
445441
PET image in CIFTI format, to be used in place of volumetric PET
446442
crown_mask
447443
Mask of brain edge voxels
448-
dummy_scans
449-
Number of nonsteady states to be dropped at the beginning of the timeseries.
450444
451445
Outputs
452446
-------
@@ -467,7 +461,6 @@ def init_carpetplot_wf(
467461
'std2anat_xfm',
468462
'cifti_pet',
469463
'crown_mask',
470-
'dummy_scans',
471464
]
472465
),
473466
name='inputnode',
@@ -546,7 +539,6 @@ def init_carpetplot_wf(
546539
(inputnode, conf_plot, [
547540
('pet', 'in_nifti'),
548541
('confounds_file', 'confounds_file'),
549-
('dummy_scans', 'drop_trs'),
550542
]),
551543
(mrg_xfms, resample_parc, [('out', 'transforms')]),
552544
(resample_parc, parcels, [('output_image', 'segmentation')]),

fmriprep/workflows/pet/fit.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
init_func_fit_reports_wf,
4242
prepare_timing_parameters,
4343
)
44-
from .reference import init_raw_petref_wf, init_validation_and_dummies_wf
44+
from .reference import init_raw_petref_wf
4545
from .registration import init_pet_reg_wf
4646

4747

@@ -107,8 +107,6 @@ def init_pet_fit_wf(
107107
petref2anat_xfm
108108
Affine transform mapping from PET reference space to the anatomical
109109
space.
110-
dummy_scans
111-
The number of dummy scans declared or detected at the beginning of the series.
112110
113111
See Also
114112
--------
@@ -165,7 +163,6 @@ def init_pet_fit_wf(
165163
outputnode = pe.Node(
166164
niu.IdentityInterface(
167165
fields=[
168-
'dummy_scans',
169166
'petref',
170167
'pet_mask',
171168
'motion_xfm',
@@ -255,6 +252,7 @@ def init_pet_fit_wf(
255252
pet_file=pet_file,
256253
reference_frame=config.workflow.reference_frame,
257254
)
255+
petref_wf.inputs.inputnode.dummy_scans = config.workflow.dummy_scans
258256

259257
ds_petref_wf = init_ds_petref_wf(
260258
bids_root=layout.root,
@@ -268,7 +266,6 @@ def init_pet_fit_wf(
268266
(petref_wf, petref_buffer, [
269267
('outputnode.pet_file', 'pet_file'),
270268
('outputnode.petref', 'petref'),
271-
('outputnode.skip_vols', 'dummy_scans'),
272269
]),
273270
(petref_buffer, ds_petref_wf, [('petref', 'inputnode.petref')]),
274271
(petref_wf, func_fit_reports_wf, [
@@ -281,18 +278,14 @@ def init_pet_fit_wf(
281278
else:
282279
config.loggers.workflow.info('Found HMC petref - skipping Stage 1')
283280

284-
validation_and_dummies_wf = init_validation_and_dummies_wf(pet_file=pet_file)
281+
val_pet = pe.Node(ValidateImage(), name='val_pet')
285282

286283
workflow.connect([
287-
(validation_and_dummies_wf, petref_buffer, [
288-
('outputnode.pet_file', 'pet_file'),
289-
('outputnode.skip_vols', 'dummy_scans'),
290-
]),
291-
(validation_and_dummies_wf, func_fit_reports_wf, [
292-
('outputnode.validation_report', 'inputnode.validation_report'),
293-
]),
284+
(val_pet, petref_buffer, [('out_file', 'pet_file')]),
285+
(val_pet, func_fit_reports_wf, [('out_report', 'inputnode.validation_report')]),
294286
(petref_buffer, petref_source_buffer, [('petref', 'in_file')]),
295287
]) # fmt:skip
288+
val_pet.inputs.in_file = pet_file
296289

297290
# Stage 2: Estimate head motion
298291
if not hmc_xforms:
@@ -415,8 +408,6 @@ def init_pet_native_wf(
415408

416409
_, mem_gb = estimate_pet_mem_usage(pet_file)
417410

418-
run_stc = bool(metadata.get('SliceTiming')) and 'slicetiming' not in config.workflow.ignore
419-
420411
workflow = pe.Workflow(name=name)
421412

422413
inputnode = pe.Node(
@@ -426,7 +417,6 @@ def init_pet_native_wf(
426417
'petref',
427418
'pet_mask',
428419
'motion_xfm',
429-
'dummy_scans',
430420
],
431421
),
432422
name='inputnode',

fmriprep/workflows/pet/reference.py

Lines changed: 13 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
from nipype.pipeline import engine as pe
2525
from niworkflows.engine.workflows import LiterateWorkflow as Workflow
2626
from niworkflows.interfaces.header import ValidateImage
27-
from niworkflows.utils.misc import pass_dummy_scans
2827
from nipype.interfaces import fsl
2928

3029
DEFAULT_MEMORY_MIN_GB = 0.01
@@ -67,20 +66,13 @@ def init_raw_petref_wf(
6766
------
6867
pet_file : str
6968
PET series NIfTI file
70-
dummy_scans : int or None
71-
Number of non-steady-state volumes specified by user at beginning of ``pet_file``
7269
7370
Outputs
7471
-------
7572
pet_file : str
7673
Validated PET series NIfTI file
7774
petref : str
7875
Reference image to which PET series is motion corrected
79-
skip_vols : int
80-
Number of non-steady-state volumes selected at beginning of ``pet_file``
81-
algo_dummy_scans : int
82-
Number of non-steady-state volumes agorithmically detected at
83-
beginning of ``pet_file``
8476
8577
"""
8678
from niworkflows.interfaces.images import RobustAverage
@@ -92,16 +84,14 @@ def init_raw_petref_wf(
9284
"""
9385

9486
inputnode = pe.Node(
95-
niu.IdentityInterface(fields=['pet_file', 'dummy_scans']),
87+
niu.IdentityInterface(fields=['pet_file']),
9688
name='inputnode',
9789
)
9890
outputnode = pe.Node(
9991
niu.IdentityInterface(
10092
fields=[
10193
'pet_file',
10294
'petref',
103-
'skip_vols',
104-
'algo_dummy_scans',
10595
'validation_report',
10696
]
10797
),
@@ -112,7 +102,7 @@ def init_raw_petref_wf(
112102
if pet_file is not None:
113103
inputnode.inputs.pet_file = pet_file
114104

115-
validation_and_dummies_wf = init_validation_and_dummies_wf()
105+
val_pet = pe.Node(ValidateImage(), name='val_pet', mem_gb=DEFAULT_MEMORY_MIN_GB)
116106

117107
gen_avg = pe.Node(RobustAverage(), name='gen_avg', mem_gb=1)
118108
extract_roi = pe.Node(
@@ -123,34 +113,26 @@ def init_raw_petref_wf(
123113

124114
workflow.connect(
125115
[
126-
(inputnode, validation_and_dummies_wf, [
127-
('pet_file', 'inputnode.pet_file'),
128-
('dummy_scans', 'inputnode.dummy_scans'),
129-
]),
130-
(validation_and_dummies_wf, outputnode, [
131-
('outputnode.pet_file', 'pet_file'),
132-
('outputnode.skip_vols', 'skip_vols'),
133-
('outputnode.algo_dummy_scans', 'algo_dummy_scans'),
134-
('outputnode.validation_report', 'validation_report'),
116+
(inputnode, val_pet, [('pet_file', 'in_file')]),
117+
(val_pet, outputnode, [
118+
('out_file', 'pet_file'),
119+
('out_report', 'validation_report'),
135120
]),
136121
]
137122
) # fmt:skip
138123

139124
if reference_frame in (None, 'average'):
140125
workflow.connect(
141126
[
142-
(validation_and_dummies_wf, gen_avg, [
143-
('outputnode.pet_file', 'in_file'),
144-
('outputnode.t_mask', 't_mask'),
145-
]),
127+
(val_pet, gen_avg, [('out_file', 'in_file')]),
146128
(gen_avg, outputnode, [('out_file', 'petref')]),
147129
]
148130
) # fmt:skip
149131
else:
150132
extract_roi.inputs.t_min = int(reference_frame)
151133
workflow.connect(
152134
[
153-
(validation_and_dummies_wf, extract_roi, [('outputnode.pet_file', 'in_file')]),
135+
(val_pet, extract_roi, [('out_file', 'in_file')]),
154136
(extract_roi, outputnode, [('roi_file', 'petref')]),
155137
]
156138
) # fmt:skip
@@ -160,96 +142,27 @@ def init_validation_and_dummies_wf(
160142
pet_file=None,
161143
name='validation_and_dummies_wf',
162144
):
163-
"""
164-
Build a workflow that validates a PET image and detects non-steady-state volumes.
165-
166-
Workflow Graph
167-
.. workflow::
168-
:graph2use: orig
169-
:simple_form: yes
170-
171-
from fmriprep.workflows.pet.reference import init_validation_and_dummies_wf
172-
wf = init_validation_and_dummies_wf()
173-
174-
Parameters
175-
----------
176-
pet_file : :obj:`str`
177-
PET series NIfTI file
178-
name : :obj:`str`
179-
Name of workflow (default: ``validation_and_dummies_wf``)
180-
181-
Inputs
182-
------
183-
pet_file : str
184-
PET series NIfTI file
185-
dummy_scans : int or None
186-
Number of non-steady-state volumes specified by user at beginning of ``pet_file``
187-
188-
Outputs
189-
-------
190-
pet_file : str
191-
Validated PET series NIfTI file
192-
skip_vols : int
193-
Number of non-steady-state volumes selected at beginning of ``pet_file``
194-
algo_dummy_scans : int
195-
Number of non-steady-state volumes agorithmically detected at
196-
beginning of ``pet_file``
197-
198-
"""
199-
from niworkflows.interfaces.bold import NonsteadyStatesDetector
145+
"""Build a workflow that validates a PET image."""
200146

201147
workflow = Workflow(name=name)
202148

203-
inputnode = pe.Node(
204-
niu.IdentityInterface(fields=['pet_file', 'dummy_scans']),
205-
name='inputnode',
206-
)
149+
inputnode = pe.Node(niu.IdentityInterface(fields=['pet_file']), name='inputnode')
207150
outputnode = pe.Node(
208-
niu.IdentityInterface(
209-
fields=[
210-
'pet_file',
211-
'skip_vols',
212-
'algo_dummy_scans',
213-
't_mask',
214-
'validation_report',
215-
]
216-
),
151+
niu.IdentityInterface(fields=['pet_file', 'validation_report']),
217152
name='outputnode',
218153
)
219154

220-
# Simplify manually setting input image
221155
if pet_file is not None:
222156
inputnode.inputs.pet_file = pet_file
223157

224-
val_pet = pe.Node(
225-
ValidateImage(),
226-
name='val_pet',
227-
mem_gb=DEFAULT_MEMORY_MIN_GB,
228-
)
229-
230-
get_dummy = pe.Node(NonsteadyStatesDetector(), name='get_dummy')
231-
232-
calc_dummy_scans = pe.Node(
233-
niu.Function(function=pass_dummy_scans, output_names=['skip_vols_num']),
234-
name='calc_dummy_scans',
235-
run_without_submitting=True,
236-
mem_gb=DEFAULT_MEMORY_MIN_GB,
237-
)
158+
val_pet = pe.Node(ValidateImage(), name='val_pet', mem_gb=DEFAULT_MEMORY_MIN_GB)
238159

239160
workflow.connect([
240161
(inputnode, val_pet, [('pet_file', 'in_file')]),
241162
(val_pet, outputnode, [
242163
('out_file', 'pet_file'),
243164
('out_report', 'validation_report'),
244165
]),
245-
(inputnode, get_dummy, [('pet_file', 'in_file')]),
246-
(inputnode, calc_dummy_scans, [('dummy_scans', 'dummy_scans')]),
247-
(get_dummy, calc_dummy_scans, [('n_dummy', 'algo_dummy_scans')]),
248-
(get_dummy, outputnode, [
249-
('n_dummy', 'algo_dummy_scans'),
250-
('t_mask', 't_mask'),
251-
]),
252-
(calc_dummy_scans, outputnode, [('skip_vols_num', 'skip_vols')]),
253-
]) # fmt:skip
166+
])
254167

255168
return workflow

0 commit comments

Comments
 (0)