Skip to content

Commit a66814f

Browse files
authored
Merge pull request #1467 from jdkent/no_error_aroma
[FIX] Do not crash if all aroma components are classified as noise
2 parents 1b05730 + faee8fe commit a66814f

File tree

10 files changed

+76
-54
lines changed

10 files changed

+76
-54
lines changed

.circleci/config.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ jobs:
412412
--config $PWD/nipype.cfg -w /tmp/ds005/work \
413413
/tmp/data/ds005 /tmp/ds005/derivatives participant \
414414
--sloppy --write-graph --use-syn-sdc --mem_mb 4096 \
415-
--ignore-aroma-denoising-errors --use-aroma \
415+
--use-aroma \
416416
--output-space T1w template fsaverage5 fsnative \
417417
--template-resampling-grid native \
418418
--use-plugin /home/circleci/src/fmriprep/.circleci/legacy.yml \
@@ -423,6 +423,7 @@ jobs:
423423
mkdir -p /tmp/ds005/derivatives_partial
424424
sudo mv /tmp/ds005/derivatives/freesurfer /tmp/ds005/derivatives_partial
425425
sudo cp -a /tmp/ds005/work /tmp/ds005/work_partial
426+
sudo rm -rf /tmp/ds005/work_partial/fmriprep_wf/single_subject_01_wf/func_preproc_task_mixedgamblestask_run_02_wf/ica_aroma_wf
426427
- run:
427428
name: Checking outputs of full fMRIPrep run
428429
command: |
@@ -434,14 +435,14 @@ jobs:
434435
name: Re-run fMRIPrep on single run of task data
435436
no_output_timeout: 2h
436437
command: |
437-
rm /tmp/data/ds005/sub-01/func/*_run-02_*
438+
rm /tmp/data/ds005/sub-01/func/*_run-01_*
438439
fmriprep-docker -i poldracklab/fmriprep:latest \
439440
-e FMRIPREP_DEV 1 \
440-
--config $PWD/nipype.cfg -w /tmp/ds005/work \
441+
--config $PWD/nipype.cfg -w /tmp/ds005/work_partial \
441442
/tmp/data/ds005 /tmp/ds005/derivatives_partial participant \
442443
--sloppy --write-graph --use-syn-sdc --mem_mb 4096 \
443444
--output-space T1w template fsaverage5 fsnative \
444-
--ignore-aroma-denoising-errors --use-aroma \
445+
--aroma-melodic-dimensionality 2 --use-aroma \
445446
--template-resampling-grid native \
446447
--nthreads 2 --cifti-output -vv
447448
- run:

.circleci/ds005_partial_outputs.txt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,25 @@ fmriprep/sub-01/anat/sub-01_space-MNI152NLin2009cAsym_label-CSF_probseg.nii.gz
3434
fmriprep/sub-01/anat/sub-01_space-MNI152NLin2009cAsym_label-GM_probseg.nii.gz
3535
fmriprep/sub-01/anat/sub-01_space-MNI152NLin2009cAsym_label-WM_probseg.nii.gz
3636
fmriprep/sub-01/func
37-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_AROMAnoiseICs.csv
38-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_bold.dtseries.json
39-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_bold.dtseries.nii
40-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-confounds_regressors.tsv
41-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-MELODIC_mixing.tsv
42-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsaverage5_hemi-L.func.gii
43-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsaverage5_hemi-R.func.gii
44-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsnative_hemi-L.func.gii
45-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsnative_hemi-R.func.gii
46-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_boldref.nii.gz
47-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-aparcaseg_dseg.nii.gz
48-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-aseg_dseg.nii.gz
49-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
50-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
51-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_desc-smoothAROMAnonaggr_bold.nii.gz
52-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_boldref.nii.gz
53-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-aparcaseg_dseg.nii.gz
54-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-aseg_dseg.nii.gz
55-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-brain_mask.nii.gz
56-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_desc-preproc_bold.nii.gz
37+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_AROMAnoiseICs.csv
38+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_bold.dtseries.json
39+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_bold.dtseries.nii
40+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_desc-confounds_regressors.tsv
41+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_desc-MELODIC_mixing.tsv
42+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-fsaverage5_hemi-L.func.gii
43+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-fsaverage5_hemi-R.func.gii
44+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-fsnative_hemi-L.func.gii
45+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-fsnative_hemi-R.func.gii
46+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_boldref.nii.gz
47+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-aparcaseg_dseg.nii.gz
48+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-aseg_dseg.nii.gz
49+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz
50+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
51+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_desc-smoothAROMAnonaggr_bold.nii.gz
52+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_boldref.nii.gz
53+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-aparcaseg_dseg.nii.gz
54+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-aseg_dseg.nii.gz
55+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-brain_mask.nii.gz
56+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-T1w_desc-preproc_bold.nii.gz
5757
fmriprep/sub-01.html
5858
/tmp/ds005/derivatives_partial

docs/workflows.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ is presented below:
5353
template_out_grid='native',
5454
use_aroma=False,
5555
aroma_melodic_dim=-200,
56-
ignore_aroma_err=False,
56+
err_on_aroma_warn=False,
5757
)
5858

5959

@@ -275,7 +275,7 @@ BOLD preprocessing
275275
template_out_grid='native',
276276
use_aroma=False,
277277
aroma_melodic_dim=-200,
278-
ignore_aroma_err=False,
278+
err_on_aroma_warn=False,
279279
)
280280

281281
Preprocessing of :abbr:`BOLD (blood-oxygen level-dependent)` files is

fmriprep/__about__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
'nilearn',
9090
'nipype>=1.1.6',
9191
'nitime',
92-
'niworkflows>=0.7.0,<0.8.0a0',
92+
'niworkflows',
9393
'numpy',
9494
'pandas',
9595
'psutil>=5.4',
@@ -104,6 +104,8 @@
104104

105105

106106
LINKS_REQUIRES = [
107+
'git+https://github.com/poldracklab/niworkflows.git@'
108+
'b97787ee2f1b93cafb104664b60fa0c4fd81253a#egg=niworkflows-0.7.1',
107109
]
108110

109111
TESTS_REQUIRES = [

fmriprep/cli/run.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,13 @@ def get_parser():
104104
help='generate boilerplate only')
105105
g_perfm.add_argument('--ignore-aroma-denoising-errors', action='store_true',
106106
default=False,
107-
help='ignores the errors ICA_AROMA returns when there '
108-
'are no components classified as either noise or '
109-
'signal')
107+
help='DEPRECATED (now does nothing, see --error-on-aroma-warnings) '
108+
'- ignores the errors ICA_AROMA returns when there are no '
109+
'components classified as either noise or signal')
110+
g_perfm.add_argument('--error-on-aroma-warnings', action='store_true',
111+
default=False,
112+
help='Raise an error if ICA_AROMA does not produce sensible output '
113+
'(e.g. if all the components are classified as signal or noise)')
110114
g_perfm.add_argument("-v", "--verbose", dest="verbose_count", action="count", default=0,
111115
help="increases log verbosity for each occurence, debug level is -vvv")
112116
g_perfm.add_argument('--debug', action='store_true', default=False,
@@ -748,7 +752,7 @@ def build_workflow(opts, retval):
748752
force_syn=opts.force_syn,
749753
use_aroma=opts.use_aroma,
750754
aroma_melodic_dim=opts.aroma_melodic_dimensionality,
751-
ignore_aroma_err=opts.ignore_aroma_denoising_errors,
755+
err_on_aroma_warn=opts.error_on_aroma_warnings,
752756
)
753757
retval['return_code'] = 0
754758

fmriprep/interfaces/confounds.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,13 @@ def _run_interface(self, runtime):
9898
class ICAConfoundsInputSpec(BaseInterfaceInputSpec):
9999
in_directory = Directory(mandatory=True, desc='directory where ICA derivatives are found')
100100
skip_vols = traits.Int(desc='number of non steady state volumes identified')
101-
ignore_aroma_err = traits.Bool(False, usedefault=True, desc='ignore ICA-AROMA errors')
101+
err_on_aroma_warn = traits.Bool(False, usedefault=True, desc='raise error if aroma fails')
102102

103103

104104
class ICAConfoundsOutputSpec(TraitedSpec):
105-
aroma_confounds = File(exists=True, desc='output confounds file extracted from ICA-AROMA')
105+
aroma_confounds = traits.Either(
106+
None,
107+
File(exists=True, desc='output confounds file extracted from ICA-AROMA'))
106108
aroma_noise_ics = File(exists=True, desc='ICA-AROMA noise components')
107109
melodic_mix = File(exists=True, desc='melodic mix file')
108110

@@ -117,11 +119,11 @@ def _run_interface(self, runtime):
117119
aroma_confounds, motion_ics_out, melodic_mix_out = _get_ica_confounds(
118120
self.inputs.in_directory, self.inputs.skip_vols, newpath=runtime.cwd)
119121

120-
if aroma_confounds is not None:
121-
self._results['aroma_confounds'] = aroma_confounds
122-
elif not self.inputs.ignore_aroma_err:
122+
if self.inputs.err_on_aroma_warn and aroma_confounds is None:
123123
raise RuntimeError('ICA-AROMA failed')
124124

125+
aroma_confounds = self._results['aroma_confounds'] = aroma_confounds
126+
125127
self._results['aroma_noise_ics'] = motion_ics_out
126128
self._results['melodic_mix'] = melodic_mix_out
127129
return runtime

fmriprep/workflows/base.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def init_fmriprep_wf(layout, subject_list, task_id, echo_idx, run_uuid, work_dir
3838
omp_nthreads, skull_strip_template, skull_strip_fixed_seed,
3939
freesurfer, output_spaces, template, medial_surface_nan, cifti_output, hires,
4040
use_bbr, bold2t1w_dof, fmap_bspline, fmap_demean, use_syn, force_syn,
41-
use_aroma, ignore_aroma_err, aroma_melodic_dim, template_out_grid):
41+
use_aroma, err_on_aroma_warn, aroma_melodic_dim, template_out_grid):
4242
"""
4343
This workflow organizes the execution of FMRIPREP, with a sub-workflow for
4444
each subject.
@@ -85,7 +85,7 @@ def init_fmriprep_wf(layout, subject_list, task_id, echo_idx, run_uuid, work_dir
8585
use_syn=True,
8686
force_syn=True,
8787
use_aroma=False,
88-
ignore_aroma_err=False,
88+
err_on_aroma_warn=False,
8989
aroma_melodic_dim=-200,
9090
template_out_grid='native')
9191
@@ -163,7 +163,7 @@ def init_fmriprep_wf(layout, subject_list, task_id, echo_idx, run_uuid, work_dir
163163
**Temporary**: Always run SyN-based SDC
164164
use_aroma : bool
165165
Perform ICA-AROMA on MNI-resampled functional series
166-
ignore_aroma_err : bool
166+
err_on_aroma_warn : bool
167167
Do not fail on ICA-AROMA errors
168168
template_out_grid : str
169169
Keyword ('native', '1mm' or '2mm') or path of custom reference
@@ -215,7 +215,7 @@ def init_fmriprep_wf(layout, subject_list, task_id, echo_idx, run_uuid, work_dir
215215
template_out_grid=template_out_grid,
216216
use_aroma=use_aroma,
217217
aroma_melodic_dim=aroma_melodic_dim,
218-
ignore_aroma_err=ignore_aroma_err,
218+
err_on_aroma_warn=err_on_aroma_warn,
219219
)
220220

221221
single_subject_wf.config['execution']['crashdump_dir'] = (
@@ -238,7 +238,7 @@ def init_single_subject_wf(layout, subject_id, task_id, echo_idx, name, reportle
238238
freesurfer, output_spaces, template, medial_surface_nan,
239239
cifti_output, hires, use_bbr, bold2t1w_dof, fmap_bspline, fmap_demean,
240240
use_syn, force_syn, template_out_grid,
241-
use_aroma, aroma_melodic_dim, ignore_aroma_err):
241+
use_aroma, aroma_melodic_dim, err_on_aroma_warn):
242242
"""
243243
This workflow organizes the preprocessing pipeline for a single subject.
244244
It collects and reports information about the subject, and prepares
@@ -288,7 +288,7 @@ def init_single_subject_wf(layout, subject_id, task_id, echo_idx, name, reportle
288288
template_out_grid='native',
289289
use_aroma=False,
290290
aroma_melodic_dim=-200,
291-
ignore_aroma_err=False)
291+
err_on_aroma_warn=False)
292292
293293
Parameters
294294
@@ -366,7 +366,7 @@ def init_single_subject_wf(layout, subject_id, task_id, echo_idx, name, reportle
366366
image for normalization
367367
use_aroma : bool
368368
Perform ICA-AROMA on MNI-resampled functional series
369-
ignore_aroma_err : bool
369+
err_on_aroma_warn : bool
370370
Do not fail on ICA-AROMA errors
371371
372372
Inputs
@@ -512,7 +512,7 @@ def init_single_subject_wf(layout, subject_id, task_id, echo_idx, name, reportle
512512
template_out_grid=template_out_grid,
513513
use_aroma=use_aroma,
514514
aroma_melodic_dim=aroma_melodic_dim,
515-
ignore_aroma_err=ignore_aroma_err,
515+
err_on_aroma_warn=err_on_aroma_warn,
516516
num_bold=len(subject_data['bold']))
517517

518518
workflow.connect([

fmriprep/workflows/bold/base.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def init_func_preproc_wf(bold_file, ignore, freesurfer,
4949
use_bbr, t2s_coreg, bold2t1w_dof, reportlets_dir,
5050
output_spaces, template, output_dir, omp_nthreads,
5151
fmap_bspline, fmap_demean, use_syn, force_syn,
52-
use_aroma, ignore_aroma_err, aroma_melodic_dim,
52+
use_aroma, err_on_aroma_warn, aroma_melodic_dim,
5353
medial_surface_nan, cifti_output,
5454
debug, low_mem, template_out_grid,
5555
layout=None, num_bold=1):
@@ -83,7 +83,7 @@ def init_func_preproc_wf(bold_file, ignore, freesurfer,
8383
medial_surface_nan=False,
8484
cifti_output=False,
8585
use_aroma=False,
86-
ignore_aroma_err=False,
86+
err_on_aroma_warn=False,
8787
aroma_melodic_dim=-200,
8888
num_bold=1)
8989
@@ -134,7 +134,7 @@ def init_func_preproc_wf(bold_file, ignore, freesurfer,
134134
**Temporary**: Always run SyN-based SDC
135135
use_aroma : bool
136136
Perform ICA-AROMA on MNI-resampled functional series
137-
ignore_aroma_err : bool
137+
err_on_aroma_warn : bool
138138
Do not fail on ICA-AROMA errors
139139
medial_surface_nan : bool
140140
Replace medial wall values with NaNs on functional GIFTI files
@@ -731,19 +731,20 @@ def init_func_preproc_wf(bold_file, ignore, freesurfer,
731731
# ICA-AROMA workflow
732732
# Internally resamples to MNI152 Linear (2006)
733733
from .confounds import init_ica_aroma_wf
734-
from niworkflows.interfaces.utils import JoinTSVColumns
735734

736735
ica_aroma_wf = init_ica_aroma_wf(
737736
template=template,
738737
metadata=metadata,
739738
mem_gb=mem_gb['resampled'],
740739
omp_nthreads=omp_nthreads,
741740
use_fieldwarp=fmaps is not None,
742-
ignore_aroma_err=ignore_aroma_err,
741+
err_on_aroma_warn=err_on_aroma_warn,
743742
aroma_melodic_dim=aroma_melodic_dim,
744743
name='ica_aroma_wf')
745744

746-
join = pe.Node(JoinTSVColumns(), name='aroma_confounds')
745+
join = pe.Node(niu.Function(output_names=["out_file"],
746+
function=_to_join),
747+
name='aroma_confounds')
747748

748749
workflow.disconnect([
749750
(bold_confounds_wf, outputnode, [
@@ -1064,3 +1065,15 @@ def _get_wf_name(bold_fname):
10641065
".", "_").replace(" ", "").replace("-", "_").replace("_bold", "_wf")
10651066

10661067
return name
1068+
1069+
1070+
def _to_join(in_file, join_file):
1071+
"""
1072+
Joins two tsv files if the join_file is not None
1073+
"""
1074+
from niworkflows.interfaces.utils import JoinTSVColumns
1075+
if join_file is None:
1076+
return in_file
1077+
else:
1078+
res = JoinTSVColumns(in_file=in_file, join_file=join_file).run()
1079+
return res.outputs.out_file

fmriprep/workflows/bold/confounds.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ def init_carpetplot_wf(mem_gb, metadata, name="bold_carpet_wf"):
401401
def init_ica_aroma_wf(template, metadata, mem_gb, omp_nthreads,
402402
name='ica_aroma_wf',
403403
susan_fwhm=6.0,
404-
ignore_aroma_err=False,
404+
err_on_aroma_warn=False,
405405
aroma_melodic_dim=-200,
406406
use_fieldwarp=True):
407407
"""
@@ -459,7 +459,7 @@ def init_ica_aroma_wf(template, metadata, mem_gb, omp_nthreads,
459459
FSL ``susan`` (default: 6.0mm)
460460
use_fieldwarp : bool
461461
Include SDC warp in single-shot transform from BOLD to MNI
462-
ignore_aroma_err : bool
462+
err_on_aroma_warn : bool
463463
Do not fail on ICA-AROMA errors
464464
aroma_melodic_dim: int
465465
Set the dimensionality of the MELODIC ICA decomposition.
@@ -572,7 +572,7 @@ def _getusans_func(image, thresh):
572572
name='add_nonsteady')
573573

574574
# extract the confound ICs from the results
575-
ica_aroma_confound_extraction = pe.Node(ICAConfounds(ignore_aroma_err=ignore_aroma_err),
575+
ica_aroma_confound_extraction = pe.Node(ICAConfounds(err_on_aroma_warn=err_on_aroma_warn),
576576
name='ica_aroma_confound_extraction')
577577

578578
ds_report_ica_aroma = pe.Node(

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
pybids>=0.7.0,<0.8.0a0
2-
niworkflows>=0.7.0,<0.8.0a0
2+
git+https://github.com/poldracklab/niworkflows.git@b97787ee2f1b93cafb104664b60fa0c4fd81253a#egg=niworkflows-0.7.1
33
smriprep>=0.0.5,<0.1.0a0
44
templateflow>=0.0.4

0 commit comments

Comments
 (0)