Skip to content

Commit 1f82f84

Browse files
authored
Merge pull request #715 from Remi-Gau/warning_masks
[FIX] improve warning selecting too many masks
2 parents f116282 + 1027293 commit 1f82f84

File tree

6 files changed

+101
-5
lines changed

6 files changed

+101
-5
lines changed

src/bids_model/getInclusiveMask.m

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,11 @@
3939
file = file{1};
4040

4141
elseif numel(file) > 1
42-
msg = sprintf('More than 1 mask image found for %s.\n Taking the first one.', ...
43-
createUnorderedList(mask));
42+
msg = sprintf(['More than 1 mask image found for %s.\n\n' ...
43+
'Taking the first one:\n\t%s\n\nfrom:%s\n\n'], ...
44+
createUnorderedList(mask), ...
45+
file{1}, ...
46+
createUnorderedList(file));
4447
id = 'tooManyMasks';
4548
errorHandling(mfilename(), id, msg, true, opt.verbosity);
4649
file = file{1};

src/utils/checkMaskOrUnderlay.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
function image = checkMaskOrUnderlay(image, opt, type)
22
%
3+
% USAGE::
4+
%
5+
% image = checkMaskOrUnderlay(image, opt, type)
6+
%
7+
% :param image:
8+
% :type image: path
9+
%
10+
% :param type: any of ``{'underlay', 'background', 'mask'}``
11+
% :type type: char
312
%
413
%
514
% (C) Copyright 2022 CPP_SPM developers

tests/createDummyDataSet.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ for subject in ${subject_list}; do
240240
done
241241
touch ${this_dir}/${basename}_run-${run}_space-individual_desc-stc${suffix}.nii
242242

243+
touch ${this_dir}/${basename}_run-${run}_space-IXI549Space_label-brain_mask.nii
244+
243245
done
244246

245247
if [ ${ses} = '01' ]; then
@@ -264,6 +266,7 @@ for subject in ${subject_list}; do
264266
for desc in ${desc_label_list}; do
265267
touch ${this_dir}/sub-${subject}_ses-${ses}_task-${task_name}_space-individual_desc-${desc}${suffix}.nii
266268
touch ${this_dir}/sub-${subject}_ses-${ses}_task-${task_name}_space-IXI549Space_desc-${desc}${suffix}.nii
269+
touch ${this_dir}/sub-${subject}_ses-${ses}_task-${task_name}_space-IXI549Space_label-brain_mask.nii
267270
done
268271

269272
if [ ${ses} = '01' ]; then

tests/dummyData/models/model-vismotion_smdl.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,15 @@
3737
"Model": "spm"
3838
},
3939
"Options": {
40-
"HighPassFilterCutoffHz": 0.008
40+
"HighPassFilterCutoffHz": 0.008,
41+
"Mask": {
42+
"suffix": [
43+
"mask"
44+
],
45+
"desc": [
46+
"brain"
47+
]
48+
}
4149
},
4250
"Software": {
4351
"SPM": {

tests/tests_batches/stats/test_setBatchSubjectLevelGLMSpec.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ function test_setBatchSubjectLevelGLMSpec_brain_mask()
4646

4747
opt = setOptions('vislocalizer', subLabel, 'pipelineType', 'stats');
4848

49-
opt.model.bm.Nodes{1}.Model.Options.Mask = struct('label', 'brain', 'suffix', 'mask');
49+
opt.model.bm.Nodes{1}.Model.Options.Mask = struct('desc', 'brain', 'suffix', 'mask');
5050

5151
BIDS = getLayout(opt);
5252

@@ -56,7 +56,7 @@ function test_setBatchSubjectLevelGLMSpec_brain_mask()
5656

5757
%% THEN
5858
assertEqual(spm_file(matlabbatch{1}.spm.stats.fmri_spec.mask, 'filename'), ...
59-
{'sub-01_ses-02_task-rest_space-IXI549Space_label-brain_mask.nii'});
59+
{'sub-01_ses-01_space-IXI549Space_desc-brain_mask.nii'});
6060

6161
cleanUp(fullfile(pwd, 'derivatives'));
6262

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
function test_suite = test_getInclusiveMask %#ok<*STOUT>
2+
% (C) Copyright 2020 CPP_SPM developers
3+
try % assignment of 'localfunctions' is necessary in Matlab >= 2016
4+
test_functions = localfunctions(); %#ok<*NASGU>
5+
catch % no problem; early Matlab versions can use initTestSuite fine
6+
end
7+
initTestSuite;
8+
end
9+
10+
function test_getInclusiveMask_too_many()
11+
12+
subLabel = '01';
13+
nodeName = 'run_level';
14+
15+
opt = setOptions('vismotion', '01');
16+
17+
opt.verbosity = 2;
18+
19+
opt.model.bm = BidsModel('file', opt.model.file);
20+
21+
opt.model.bm.Nodes{1}.Model.Options.Mask.label{1} = 'brain';
22+
opt.model.bm.Nodes{1}.Model.Options.Mask.desc{1} = '';
23+
24+
opt.space = opt.model.bm.Input.space;
25+
26+
BIDS = getLayout(opt);
27+
28+
assertWarning(@()getInclusiveMask(opt, nodeName, BIDS, subLabel), ...
29+
'getInclusiveMask:tooManyMasks');
30+
31+
end
32+
33+
function test_getInclusiveMask_basic()
34+
35+
subLabel = '01';
36+
nodeName = 'run_level';
37+
38+
opt = setOptions('vismotion', '01');
39+
40+
opt.model.bm = BidsModel('file', opt.model.file);
41+
42+
opt.space = opt.model.bm.Input.space;
43+
44+
BIDS = getLayout(opt);
45+
46+
mask = getInclusiveMask(opt, nodeName, BIDS, subLabel);
47+
48+
assertEqual(size(mask, 1), 1);
49+
assertEqual(spm_file(mask, 'filename'), 'sub-01_ses-01_space-IXI549Space_desc-brain_mask.nii');
50+
51+
end
52+
53+
function test_getInclusiveMask_no_image()
54+
55+
subLabel = '01';
56+
nodeName = 'run_level';
57+
58+
opt = setOptions('vismotion', '01');
59+
60+
opt.verbosity = 2;
61+
62+
opt.model.bm = BidsModel('file', opt.model.file);
63+
64+
opt.model.bm.Nodes{1}.Model.Options.Mask.desc{1} = 'foo';
65+
66+
opt.space = opt.model.bm.Input.space;
67+
68+
BIDS = getLayout(opt);
69+
70+
assertWarning(@()getInclusiveMask(opt, nodeName, BIDS, subLabel), ...
71+
'checkMaskOrUnderlay:missingMaskOrUnderlay');
72+
73+
end

0 commit comments

Comments
 (0)