Skip to content

Commit 3ccbe22

Browse files
authored
Merge pull request #11 from Remi-Gau/remi-talk_to_me
make functions more verbose
2 parents accb67c + e05df07 commit 3ccbe22

File tree

7 files changed

+247
-1
lines changed

7 files changed

+247
-1
lines changed

checkCFG.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
% check that we have all the fields that we need in the experiment
33
% parameters
44

5+
if ~isfield(expParameters, 'verbose') || isempty(expParameters.verbose)
6+
expParameters.verbose = 0;
7+
end
8+
59
if ~isfield(expParameters, 'outputDir')
610
expParameters.outputDir = fullfile(...
711
fileparts(mfilename('fullpath')), ...

createFilename.m

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,5 +122,25 @@
122122

123123
end
124124

125+
if expParameters.verbose
126+
127+
fprintf(1,'\nData will be saved in this directory:\n\t%s\n', ...
128+
fullfile(expParameters.outputDir, modality));
129+
130+
fprintf(1,'\nData will be saved in this file:\n\t%s\n', ...
131+
expParameters.fileName.events);
132+
133+
if cfg.eyeTracker
134+
135+
fprintf(1,'\nEyetracking data will be saved in this directory:\n\t%s\n', ...
136+
fullfile(expParameters.outputDir, 'eyetracker'));
137+
138+
fprintf(1,'\nEyetracking data will be saved in this file:\n\t%s\n', ...
139+
expParameters.fileName.eyetracker);
140+
141+
end
142+
143+
end
144+
125145

126146
end

createFilename.m~

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
function expParameters = createFilename(expParameters, cfg)
2+
% create the BIDS compliant directories and filenames for the behavioral output for this subject /
3+
% session / run.
4+
% Will also create the right filename for the eyetracking data file.
5+
%
6+
% For the moment the date of acquisition is appreneded to the filename
7+
%
8+
% can work for behavioral experiment if cfg.device is set to 'PC'
9+
% can work for fMRI experiment if cfg.device is set to 'scanner'
10+
% can work for simple eyetracking data if cfg.eyeTracker is set to 1
11+
%
12+
% BOLD
13+
% sub-<label>[_ses-<label>]_task-<label>[_acq-<label>][_ce-<label>][_dir-<label>][_rec-<label>][_run-<index>][_echo-<index>]_<contrast_label>.nii[.gz]
14+
%
15+
% iEEG
16+
% sub-<label>[_ses-<label>]_task-<task_label>[_run-<index>]_ieeg.json
17+
%
18+
% EEG
19+
% sub-<label>[_ses-<label>]_task-<label>[_run-<index>]_eeg.<manufacturer_specific_extension>
20+
%
21+
% EYETRACKER
22+
% sub-<participant_label>[_ses-<label>][_acq-<label>]_task-<task_label>_eyetrack.<manufacturer_specific_extension>
23+
24+
zeroPadding = 3;
25+
pattern = ['%0' num2str(zeroPadding) '.0f'];
26+
27+
dateFormat = 'yyyymmdd_HHMM';
28+
29+
% Setting some defaults: no need to change things here
30+
expParameters = checkCFG(expParameters);
31+
32+
% extract input
33+
subjectGrp = expParameters.subjectGrp;
34+
subjectNb = expParameters.subjectNb;
35+
sessionNb = expParameters.sessionNb;
36+
runNb = expParameters.runNb;
37+
38+
expParameters.date = datestr(now, dateFormat);
39+
40+
% output dir
41+
expParameters.outputDir = fullfile (...
42+
expParameters.outputDir, ...
43+
'source', ...
44+
['sub-' subjectGrp, sprintf(pattern, subjectNb)], ...
45+
['ses-', sprintf(pattern, sessionNb)]);
46+
47+
% create base filename
48+
expParameters.fileName.base = ...
49+
['sub-', subjectGrp, sprintf(pattern, subjectNb), ...
50+
'_ses-', sprintf(pattern, sessionNb) , ...
51+
'_task-', expParameters.task];
52+
53+
runSuffix = ['_run-' sprintf(pattern, runNb)];
54+
55+
56+
switch lower(cfg.device)
57+
case 'pc'
58+
modality = 'beh';
59+
case 'scanner'
60+
modality = 'func';
61+
otherwise
62+
modality = 'beh';
63+
end
64+
65+
expParameters.modality = modality;
66+
67+
68+
% set values for the suffixes for the different fields in the BIDS name
69+
fields2Check = { ...
70+
'ce', ...
71+
'dir', ... % For BIDS file naming: phase encoding direction of acquisition for fMRI
72+
'rec', ... % For BIDS file naming: reconstruction of fMRI images
73+
'echo', ... % For BIDS file naming: echo fMRI images
74+
'acq' % For BIDS file naming: acquisition of fMRI images
75+
};
76+
77+
for iField = 1:numel(fields2Check)
78+
if isempty (getfield(expParameters, fields2Check{iField}) ) %#ok<*GFLD>
79+
expParameters = setfield(expParameters, [fields2Check{iField} 'Suffix'], ...
80+
''); %#ok<*SFLD>
81+
else
82+
expParameters = setfield(expParameters, [fields2Check{iField} 'Suffix'], ...
83+
['_' fields2Check{iField} '-' getfield(expParameters, fields2Check{iField})]);
84+
end
85+
end
86+
87+
88+
%% create directories
89+
[~, ~, ~] = mkdir(expParameters.outputDir);
90+
[~, ~, ~] = mkdir(fullfile(expParameters.outputDir, modality));
91+
92+
if cfg.eyeTracker
93+
[~, ~, ~] = mkdir(fullfile(expParameters.outputDir, 'eyetracker'));
94+
end
95+
96+
97+
%% create filenames
98+
99+
switch modality
100+
101+
case 'beh'
102+
103+
expParameters.fileName.events = ...
104+
[expParameters.fileName.base, runSuffix, '_events_date-' expParameters.date '.tsv'];
105+
106+
case 'func'
107+
108+
expParameters.fileName.events = ...
109+
[expParameters.fileName.base, ...
110+
expParameters.acqSuffix, expParameters.ceSuffix, ...
111+
expParameters.dirSuffix, expParameters.recSuffix, ...
112+
runSuffix, expParameters.echoSuffix, ...
113+
'_events_date-' expParameters.date '.tsv'];
114+
115+
end
116+
117+
if cfg.eyeTracker
118+
119+
expParameters.fileName.eyetracker = ...
120+
[expParameters.fileName.base, expParameters.acqSuffix, ...
121+
runSuffix, '_eyetrack_date-' expParameters.date '.edf'];
122+
123+
end
124+
125+
if expParameters.verbose
126+
fprintf(1,'\nData will be saved in this directory:\n\n%s\')
127+
expParameters.outputDir
128+
expParameters.fileName
129+
end
130+
131+
132+
end

saveEventsFile.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,13 @@
7373
% close txt log file
7474
fclose(logFile(1).eventLogFile);
7575

76+
if expParameters.verbose
77+
fprintf(1,'\nData were saved in this file:\n\n%s\n\n', ...
78+
fullfile(...
79+
expParameters.outputDir, ...
80+
expParameters.modality, ...
81+
expParameters.fileName.events));
82+
83+
end
84+
7685
end

saveEventsFile.m~

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
function [ logFile ] = saveEventsFile(input, expParameters, logFile, varargin)
2+
3+
if nargin<3 || isempty(logFile)
4+
logFile = struct();
5+
end
6+
7+
switch input
8+
9+
case 'open'
10+
11+
logFile = struct();
12+
13+
% Initialize txt logfiles and empty fields for the standard BIDS
14+
% event file
15+
logFile.eventLogFile = fopen(...
16+
fullfile(expParameters.outputDir, expParameters.modality, expParameters.fileName.events), ...
17+
'w');
18+
19+
% print the basic BIDS columns
20+
fprintf(logFile.eventLogFile, '%s\t%s\t%s\t', 'onset', 'trial_type', 'duration');
21+
22+
% print any extra column specified by the user
23+
% also prepare an empty field in the structure to collect data
24+
% for those
25+
for iExtraColumn = 1:numel(varargin)
26+
fprintf(logFile.eventLogFile,'%s\t', lower(varargin{iExtraColumn}));
27+
end
28+
29+
% next line so we start printing at the right place
30+
fprintf(logFile.eventLogFile, '\n');
31+
32+
33+
case 'save'
34+
35+
% appends to the logfile all the data stored in the structure
36+
% first with the standard BIDS data and then any extra things
37+
for iEvent = 1:size(logFile,1)
38+
39+
fprintf(logFile(1).eventLogFile,'%f\t%s\t%f\t',...
40+
logFile(iEvent).onset, ...
41+
logFile(iEvent).trial_type, ...
42+
logFile(iEvent).duration);
43+
44+
for iExtraColumn = 1:numel(varargin)
45+
46+
% if the field we are looking for does not exist or is empty in the
47+
% input logFile structure we will write a NaN otherwise we
48+
% write its content
49+
50+
if ~isfield(logFile, varargin{iExtraColumn})
51+
data = [];
52+
else
53+
data = getfield(logFile(iEvent), varargin{iExtraColumn});
54+
end
55+
56+
if isempty(data)
57+
data = NaN;
58+
end
59+
60+
if ischar(data)
61+
fprintf(logFile(1).eventLogFile, '%s\t', data);
62+
else
63+
fprintf(logFile(1).eventLogFile, '%f\t', data);
64+
end
65+
66+
end
67+
68+
fprintf(logFile(1).eventLogFile, '\n');
69+
end
70+
71+
case 'close'
72+
73+
% close txt log file
74+
fclose(logFile(1).eventLogFile);
75+
76+
if expParameters.verbose
77+
fullfile(expParameters.outputDir, expParameters.modality, expParameters.fileName.events)
78+
79+
end

tests/test_createFilename.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ function test_createFilename()
99
expParameters.sessionNb = 1;
1010
expParameters.runNb = 1;
1111
expParameters.task = 'testtask';
12+
expParameters.verbose = 1;
1213

1314
cfg.eyeTracker = true;
1415
cfg.device = 'PC';

tests/test_saveEventsFile.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ function test_saveEventsFile()
88
expParameters.sessionNb = 1;
99
expParameters.runNb = 1;
1010
expParameters.task = 'testtask';
11+
expParameters.verbose = 1;
1112

1213
cfg.eyeTracker = false;
1314
cfg.device = 'scanner';
@@ -72,4 +73,4 @@ function test_saveEventsFile()
7273
assert(isequal(C{4}{2}, 'NaN')); % check that empty values are entered as NaN
7374
assert(isequal(C{4}{4}, 'NaN')); % check that missing fields are entered as NaN
7475

75-
assert(isequal(str2num(C{5}{4}), 3)); % check values entered properly
76+
assert(isequal(str2double(C{5}{4}), 3)); % check values entered properly

0 commit comments

Comments
 (0)