Skip to content

Commit f819c94

Browse files
authored
Merge pull request #2248 from effigies/enh/debug
ENH: Output CompCor masks if ``--debug compcor`` is passed
2 parents 01b27fc + 6b97020 commit f819c94

File tree

9 files changed

+67
-12
lines changed

9 files changed

+67
-12
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ jobs:
601601
${FASTRACK_ARG} \
602602
--fs-no-reconall --sloppy \
603603
--output-spaces MNI152NLin2009cAsym:res-2 anat func \
604-
--mem_mb 4096 --nthreads 2 -vv
604+
--mem_mb 4096 --nthreads 2 -vv --debug compcor
605605
- run:
606606
name: Checking outputs of fMRIPrep
607607
command: |

.circleci/ds054_fasttrack_outputs.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.json
1313
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.nii.gz
1414
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.json
1515
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.tsv
16+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorA_mask.nii.gz
17+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorC_mask.nii.gz
18+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorT_mask.nii.gz
19+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorW_mask.nii.gz
1620
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.json
1721
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.nii.gz
1822
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_from-scanner_to-T1w_mode-image_xfm.txt
@@ -32,6 +36,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.json
3236
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.nii.gz
3337
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.json
3438
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.tsv
39+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorA_mask.nii.gz
40+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorC_mask.nii.gz
41+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorT_mask.nii.gz
42+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorW_mask.nii.gz
3543
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.json
3644
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.nii.gz
3745
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_from-scanner_to-T1w_mode-image_xfm.txt

.circleci/ds054_outputs.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.json
3232
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.nii.gz
3333
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.json
3434
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.tsv
35+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorA_mask.nii.gz
36+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorC_mask.nii.gz
37+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorT_mask.nii.gz
38+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorW_mask.nii.gz
3539
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.json
3640
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.nii.gz
3741
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_from-scanner_to-T1w_mode-image_xfm.txt
@@ -51,6 +55,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.json
5155
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.nii.gz
5256
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.json
5357
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.tsv
58+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorA_mask.nii.gz
59+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorC_mask.nii.gz
60+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorT_mask.nii.gz
61+
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorW_mask.nii.gz
5462
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.json
5563
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.nii.gz
5664
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_from-scanner_to-T1w_mode-image_xfm.txt

fmriprep/cli/parser.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,9 +533,16 @@ def _bids_filter(value):
533533
"improve FMRIPREP and provides an indicator of real "
534534
"world usage crucial for obtaining funding.",
535535
)
536+
g_other.add_argument(
537+
"--debug",
538+
action="store",
539+
nargs="+",
540+
choices=config.DEBUG_MODES + ("all",),
541+
help="Debug mode(s) to enable. 'all' is alias for all available modes.",
542+
)
543+
536544
g_other.add_argument(
537545
"--sloppy",
538-
dest="debug",
539546
action="store_true",
540547
default=False,
541548
help="Use low-quality tools for speed - TESTING ONLY",

fmriprep/config.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@
187187
pass
188188

189189

190+
# Debug modes are names that influence the exposure of internal details to
191+
# the user, either through additional derivatives or increased verbosity
192+
DEBUG_MODES = ("compcor",)
193+
194+
190195
class _Config:
191196
"""An abstract class forbidding instantiation."""
192197

@@ -359,8 +364,10 @@ class execution(_Config):
359364
"""A dictionary of BIDS selection filters."""
360365
boilerplate_only = False
361366
"""Only generate a boilerplate."""
362-
debug = False
367+
sloppy = False
363368
"""Run in sloppy mode (meaning, suboptimal parameters that minimize run-time)."""
369+
debug = []
370+
"""Debug mode(s)."""
364371
echo_idx = None
365372
"""Select a particular echo for multi-echo EPI datasets."""
366373
fs_license_file = _fs_license
@@ -456,6 +463,9 @@ def init(cls):
456463
for k, v in filters.items()
457464
}
458465

466+
if "all" in cls.debug:
467+
cls.debug = list(DEBUG_MODES)
468+
459469

460470
# These variables are not necessary anymore
461471
del _fs_license

fmriprep/workflows/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ def init_single_subject_wf(subject_id):
237237
# Preprocessing of T1w (includes registration to MNI)
238238
anat_preproc_wf = init_anat_preproc_wf(
239239
bids_root=str(config.execution.bids_dir),
240-
debug=config.execution.debug is True,
240+
debug=config.execution.sloppy,
241241
existing_derivatives=anat_derivatives,
242242
freesurfer=config.workflow.run_reconall,
243243
hires=config.workflow.hires,

fmriprep/workflows/bold/base.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@ def init_func_preproc_wf(bold_file):
303303
('cifti_metadata', 'inputnode.cifti_metadata'),
304304
('cifti_density', 'inputnode.cifti_density'),
305305
('confounds_metadata', 'inputnode.confounds_metadata'),
306+
('acompcor_masks', 'inputnode.acompcor_masks'),
307+
('tcompcor_mask', 'inputnode.tcompcor_mask'),
306308
]),
307309
])
308310

@@ -333,7 +335,7 @@ def init_func_preproc_wf(bold_file):
333335
mem_gb=mem_gb['resampled'],
334336
name='bold_reg_wf',
335337
omp_nthreads=omp_nthreads,
336-
sloppy=config.execution.debug,
338+
sloppy=config.execution.sloppy,
337339
use_bbr=config.workflow.use_bbr,
338340
use_compression=False,
339341
)
@@ -404,7 +406,7 @@ def init_func_preproc_wf(bold_file):
404406
# SDC (SUSCEPTIBILITY DISTORTION CORRECTION) or bypass ##########################
405407
bold_sdc_wf = init_sdc_estimate_wf(fmaps, metadata,
406408
omp_nthreads=omp_nthreads,
407-
debug=config.execution.debug)
409+
debug=config.execution.sloppy)
408410

409411
# MULTI-ECHO EPI DATA #############################################
410412
if multiecho: # instantiate relevant interfaces, imports
@@ -496,9 +498,9 @@ def init_func_preproc_wf(bold_file):
496498
('outputnode.bold_mask', 'inputnode.bold_mask')]),
497499
(bold_confounds_wf, outputnode, [
498500
('outputnode.confounds_file', 'confounds'),
499-
]),
500-
(bold_confounds_wf, outputnode, [
501501
('outputnode.confounds_metadata', 'confounds_metadata'),
502+
('outputnode.acompcor_masks', 'acompcor_masks'),
503+
('outputnode.tcompcor_mask', 'tcompcor_mask'),
502504
]),
503505
# Connect bold_bold_trans_wf
504506
(bold_split, bold_bold_trans_wf, [

fmriprep/workflows/bold/confounds.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ def init_bold_confs_wf(
193193
'skip_vols', 't1w_mask', 't1w_tpms', 't1_bold_xform']),
194194
name='inputnode')
195195
outputnode = pe.Node(niu.IdentityInterface(
196-
fields=['confounds_file', 'confounds_metadata']),
196+
fields=['confounds_file', 'confounds_metadata', 'acompcor_masks', 'tcompcor_mask']),
197197
name='outputnode')
198198

199199
# DVARS
@@ -392,6 +392,8 @@ def _select_cols(table):
392392
# Set outputs
393393
(spike_regress, outputnode, [('confounds_file', 'confounds_file')]),
394394
(mrg_conf_metadata2, outputnode, [('out_dict', 'confounds_metadata')]),
395+
(tcompcor, outputnode, [("high_variance_masks", "tcompcor_mask")]),
396+
(acc_msk_bin, outputnode, [("out_file", "acompcor_masks")]),
395397
(inputnode, rois_plot, [('bold', 'in_file'),
396398
('bold_mask', 'in_mask')]),
397399
(tcompcor, mrg_compcor, [('high_variance_masks', 'in1')]),

fmriprep/workflows/bold/outputs.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from nipype.pipeline import engine as pe
55
from nipype.interfaces import utility as niu
66

7-
from ...config import DEFAULT_MEMORY_MIN_GB
8-
from ...interfaces import DerivativesDataSink
7+
from fmriprep import config
8+
from fmriprep.config import DEFAULT_MEMORY_MIN_GB
9+
from fmriprep.interfaces import DerivativesDataSink
910

1011

1112
def init_func_derivatives_wf(
@@ -62,7 +63,7 @@ def init_func_derivatives_wf(
6263
'bold_mask_native', 'cifti_variant', 'cifti_metadata', 'cifti_density',
6364
'confounds', 'confounds_metadata', 'melodic_mix', 'nonaggr_denoised_file',
6465
'source_file', 'surf_files', 'surf_refs', 'template', 'spatial_reference',
65-
'bold2anat_xfm', 'anat2bold_xfm']),
66+
'bold2anat_xfm', 'anat2bold_xfm', 'acompcor_masks', 'tcompcor_mask']),
6667
name='inputnode')
6768

6869
raw_sources = pe.Node(niu.Function(function=_bids_relative), name='raw_sources')
@@ -338,6 +339,23 @@ def init_func_derivatives_wf(
338339
(('cifti_metadata', _read_json), 'meta_dict')])
339340
])
340341

342+
if "compcor" in config.execution.debug:
343+
ds_acompcor_masks = pe.Node(
344+
DerivativesDataSink(
345+
base_directory=output_dir, desc=[f"CompCor{_}" for _ in "CWA"],
346+
suffix="mask", compress=True),
347+
name="ds_acompcor_masks", run_without_submitting=True)
348+
ds_tcompcor_mask = pe.Node(
349+
DerivativesDataSink(
350+
base_directory=output_dir, desc="CompCorT", suffix="mask", compress=True),
351+
name="ds_tcompcor_mask", run_without_submitting=True)
352+
workflow.connect([
353+
(inputnode, ds_acompcor_masks, [("acompcor_masks", "in_file"),
354+
("source_file", "source_file")]),
355+
(inputnode, ds_tcompcor_mask, [("tcompcor_mask", "in_file"),
356+
("source_file", "source_file")]),
357+
])
358+
341359
return workflow
342360

343361

0 commit comments

Comments
 (0)