Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,7 @@ jobs:
${FASTRACK_ARG} \
--fs-no-reconall --sloppy \
--output-spaces MNI152NLin2009cAsym:res-2 anat func \
--mem_mb 4096 --nthreads 2 -vv
--mem_mb 4096 --nthreads 2 -vv --debug compcor
- run:
name: Checking outputs of fMRIPrep
command: |
Expand Down
8 changes: 8 additions & 0 deletions .circleci/ds054_fasttrack_outputs.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.tsv
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorA_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorC_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorT_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorW_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_from-scanner_to-T1w_mode-image_xfm.txt
Expand All @@ -32,6 +36,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.tsv
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorA_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorC_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorT_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorW_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_from-scanner_to-T1w_mode-image_xfm.txt
Expand Down
8 changes: 8 additions & 0 deletions .circleci/ds054_outputs.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-brain_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-confounds_timeseries.tsv
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorA_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorC_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorT_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-CompCorW_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_desc-preproc_bold.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-1_from-scanner_to-T1w_mode-image_xfm.txt
Expand All @@ -51,6 +55,10 @@ fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-brain_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-confounds_timeseries.tsv
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorA_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorC_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorT_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-CompCorW_mask.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.json
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_desc-preproc_bold.nii.gz
fmriprep/sub-100185/func/sub-100185_task-machinegame_run-2_from-scanner_to-T1w_mode-image_xfm.txt
Expand Down
9 changes: 8 additions & 1 deletion fmriprep/cli/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -533,9 +533,16 @@ def _bids_filter(value):
"improve FMRIPREP and provides an indicator of real "
"world usage crucial for obtaining funding.",
)
g_other.add_argument(
"--debug",
action="store",
nargs="+",
choices=config.DEBUG_MODES + ("all",),
help="Debug mode(s) to enable. 'all' is alias for all available modes.",
)

g_other.add_argument(
"--sloppy",
dest="debug",
action="store_true",
default=False,
help="Use low-quality tools for speed - TESTING ONLY",
Expand Down
12 changes: 11 additions & 1 deletion fmriprep/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,11 @@
pass


# Debug modes are names that influence the exposure of internal details to
# the user, either through additional derivatives or increased verbosity
DEBUG_MODES = ("compcor",)


class _Config:
"""An abstract class forbidding instantiation."""

Expand Down Expand Up @@ -359,8 +364,10 @@ class execution(_Config):
"""A dictionary of BIDS selection filters."""
boilerplate_only = False
"""Only generate a boilerplate."""
debug = False
sloppy = False
"""Run in sloppy mode (meaning, suboptimal parameters that minimize run-time)."""
debug = []
"""Debug mode(s)."""
echo_idx = None
"""Select a particular echo for multi-echo EPI datasets."""
fs_license_file = _fs_license
Expand Down Expand Up @@ -456,6 +463,9 @@ def init(cls):
for k, v in filters.items()
}

if "all" in cls.debug:
cls.debug = list(DEBUG_MODES)


# These variables are not necessary anymore
del _fs_license
Expand Down
2 changes: 1 addition & 1 deletion fmriprep/workflows/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ def init_single_subject_wf(subject_id):
# Preprocessing of T1w (includes registration to MNI)
anat_preproc_wf = init_anat_preproc_wf(
bids_root=str(config.execution.bids_dir),
debug=config.execution.debug is True,
debug=config.execution.sloppy,
existing_derivatives=anat_derivatives,
freesurfer=config.workflow.run_reconall,
hires=config.workflow.hires,
Expand Down
10 changes: 6 additions & 4 deletions fmriprep/workflows/bold/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,8 @@ def init_func_preproc_wf(bold_file):
('cifti_metadata', 'inputnode.cifti_metadata'),
('cifti_density', 'inputnode.cifti_density'),
('confounds_metadata', 'inputnode.confounds_metadata'),
('acompcor_masks', 'inputnode.acompcor_masks'),
('tcompcor_mask', 'inputnode.tcompcor_mask'),
]),
])

Expand Down Expand Up @@ -333,7 +335,7 @@ def init_func_preproc_wf(bold_file):
mem_gb=mem_gb['resampled'],
name='bold_reg_wf',
omp_nthreads=omp_nthreads,
sloppy=config.execution.debug,
sloppy=config.execution.sloppy,
use_bbr=config.workflow.use_bbr,
use_compression=False,
)
Expand Down Expand Up @@ -404,7 +406,7 @@ def init_func_preproc_wf(bold_file):
# SDC (SUSCEPTIBILITY DISTORTION CORRECTION) or bypass ##########################
bold_sdc_wf = init_sdc_estimate_wf(fmaps, metadata,
omp_nthreads=omp_nthreads,
debug=config.execution.debug)
debug=config.execution.sloppy)

# MULTI-ECHO EPI DATA #############################################
if multiecho: # instantiate relevant interfaces, imports
Expand Down Expand Up @@ -496,9 +498,9 @@ def init_func_preproc_wf(bold_file):
('outputnode.bold_mask', 'inputnode.bold_mask')]),
(bold_confounds_wf, outputnode, [
('outputnode.confounds_file', 'confounds'),
]),
(bold_confounds_wf, outputnode, [
('outputnode.confounds_metadata', 'confounds_metadata'),
('outputnode.acompcor_masks', 'acompcor_masks'),
('outputnode.tcompcor_mask', 'tcompcor_mask'),
]),
# Connect bold_bold_trans_wf
(bold_split, bold_bold_trans_wf, [
Expand Down
4 changes: 3 additions & 1 deletion fmriprep/workflows/bold/confounds.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ def init_bold_confs_wf(
'skip_vols', 't1w_mask', 't1w_tpms', 't1_bold_xform']),
name='inputnode')
outputnode = pe.Node(niu.IdentityInterface(
fields=['confounds_file', 'confounds_metadata']),
fields=['confounds_file', 'confounds_metadata', 'acompcor_masks', 'tcompcor_mask']),
name='outputnode')

# DVARS
Expand Down Expand Up @@ -392,6 +392,8 @@ def _select_cols(table):
# Set outputs
(spike_regress, outputnode, [('confounds_file', 'confounds_file')]),
(mrg_conf_metadata2, outputnode, [('out_dict', 'confounds_metadata')]),
(tcompcor, outputnode, [("high_variance_masks", "tcompcor_mask")]),
(acc_msk_bin, outputnode, [("out_file", "acompcor_masks")]),
(inputnode, rois_plot, [('bold', 'in_file'),
('bold_mask', 'in_mask')]),
(tcompcor, mrg_compcor, [('high_variance_masks', 'in1')]),
Expand Down
24 changes: 21 additions & 3 deletions fmriprep/workflows/bold/outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
from nipype.pipeline import engine as pe
from nipype.interfaces import utility as niu

from ...config import DEFAULT_MEMORY_MIN_GB
from ...interfaces import DerivativesDataSink
from fmriprep import config
from fmriprep.config import DEFAULT_MEMORY_MIN_GB
from fmriprep.interfaces import DerivativesDataSink


def init_func_derivatives_wf(
Expand Down Expand Up @@ -62,7 +63,7 @@ def init_func_derivatives_wf(
'bold_mask_native', 'cifti_variant', 'cifti_metadata', 'cifti_density',
'confounds', 'confounds_metadata', 'melodic_mix', 'nonaggr_denoised_file',
'source_file', 'surf_files', 'surf_refs', 'template', 'spatial_reference',
'bold2anat_xfm', 'anat2bold_xfm']),
'bold2anat_xfm', 'anat2bold_xfm', 'acompcor_masks', 'tcompcor_mask']),
name='inputnode')

raw_sources = pe.Node(niu.Function(function=_bids_relative), name='raw_sources')
Expand Down Expand Up @@ -338,6 +339,23 @@ def init_func_derivatives_wf(
(('cifti_metadata', _read_json), 'meta_dict')])
])

if "compcor" in config.execution.debug:
ds_acompcor_masks = pe.Node(
DerivativesDataSink(
base_directory=output_dir, desc=[f"CompCor{_}" for _ in "CWA"],
suffix="mask", compress=True),
name="ds_acompcor_masks", run_without_submitting=True)
ds_tcompcor_mask = pe.Node(
DerivativesDataSink(
base_directory=output_dir, desc="CompCorT", suffix="mask", compress=True),
name="ds_tcompcor_mask", run_without_submitting=True)
workflow.connect([
(inputnode, ds_acompcor_masks, [("acompcor_masks", "in_file"),
("source_file", "source_file")]),
(inputnode, ds_tcompcor_mask, [("tcompcor_mask", "in_file"),
("source_file", "source_file")]),
])

return workflow


Expand Down