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
4 changes: 4 additions & 0 deletions checkCFG.m
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
% check that we have all the fields that we need in the experiment
% parameters

if ~isfield(expParameters, 'verbose') || isempty(expParameters.verbose)
expParameters.verbose = 0;
end

if ~isfield(expParameters, 'outputDir')
expParameters.outputDir = fullfile(...
fileparts(mfilename('fullpath')), ...
Expand Down
20 changes: 20 additions & 0 deletions createFilename.m
Original file line number Diff line number Diff line change
Expand Up @@ -122,5 +122,25 @@

end

if expParameters.verbose

fprintf(1,'\nData will be saved in this directory:\n\t%s\n', ...
fullfile(expParameters.outputDir, modality));

fprintf(1,'\nData will be saved in this file:\n\t%s\n', ...
expParameters.fileName.events);

if cfg.eyeTracker

fprintf(1,'\nEyetracking data will be saved in this directory:\n\t%s\n', ...
fullfile(expParameters.outputDir, 'eyetracker'));

fprintf(1,'\nEyetracking data will be saved in this file:\n\t%s\n', ...
expParameters.fileName.eyetracker);

end

end


end
132 changes: 132 additions & 0 deletions createFilename.m~
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
function expParameters = createFilename(expParameters, cfg)
% create the BIDS compliant directories and filenames for the behavioral output for this subject /
% session / run.
% Will also create the right filename for the eyetracking data file.
%
% For the moment the date of acquisition is appreneded to the filename
%
% can work for behavioral experiment if cfg.device is set to 'PC'
% can work for fMRI experiment if cfg.device is set to 'scanner'
% can work for simple eyetracking data if cfg.eyeTracker is set to 1
%
% BOLD
% sub-<label>[_ses-<label>]_task-<label>[_acq-<label>][_ce-<label>][_dir-<label>][_rec-<label>][_run-<index>][_echo-<index>]_<contrast_label>.nii[.gz]
%
% iEEG
% sub-<label>[_ses-<label>]_task-<task_label>[_run-<index>]_ieeg.json
%
% EEG
% sub-<label>[_ses-<label>]_task-<label>[_run-<index>]_eeg.<manufacturer_specific_extension>
%
% EYETRACKER
% sub-<participant_label>[_ses-<label>][_acq-<label>]_task-<task_label>_eyetrack.<manufacturer_specific_extension>

zeroPadding = 3;
pattern = ['%0' num2str(zeroPadding) '.0f'];

dateFormat = 'yyyymmdd_HHMM';

% Setting some defaults: no need to change things here
expParameters = checkCFG(expParameters);

% extract input
subjectGrp = expParameters.subjectGrp;
subjectNb = expParameters.subjectNb;
sessionNb = expParameters.sessionNb;
runNb = expParameters.runNb;

expParameters.date = datestr(now, dateFormat);

% output dir
expParameters.outputDir = fullfile (...
expParameters.outputDir, ...
'source', ...
['sub-' subjectGrp, sprintf(pattern, subjectNb)], ...
['ses-', sprintf(pattern, sessionNb)]);

% create base filename
expParameters.fileName.base = ...
['sub-', subjectGrp, sprintf(pattern, subjectNb), ...
'_ses-', sprintf(pattern, sessionNb) , ...
'_task-', expParameters.task];

runSuffix = ['_run-' sprintf(pattern, runNb)];


switch lower(cfg.device)
case 'pc'
modality = 'beh';
case 'scanner'
modality = 'func';
otherwise
modality = 'beh';
end

expParameters.modality = modality;


% set values for the suffixes for the different fields in the BIDS name
fields2Check = { ...
'ce', ...
'dir', ... % For BIDS file naming: phase encoding direction of acquisition for fMRI
'rec', ... % For BIDS file naming: reconstruction of fMRI images
'echo', ... % For BIDS file naming: echo fMRI images
'acq' % For BIDS file naming: acquisition of fMRI images
};

for iField = 1:numel(fields2Check)
if isempty (getfield(expParameters, fields2Check{iField}) ) %#ok<*GFLD>
expParameters = setfield(expParameters, [fields2Check{iField} 'Suffix'], ...
''); %#ok<*SFLD>
else
expParameters = setfield(expParameters, [fields2Check{iField} 'Suffix'], ...
['_' fields2Check{iField} '-' getfield(expParameters, fields2Check{iField})]);
end
end


%% create directories
[~, ~, ~] = mkdir(expParameters.outputDir);
[~, ~, ~] = mkdir(fullfile(expParameters.outputDir, modality));

if cfg.eyeTracker
[~, ~, ~] = mkdir(fullfile(expParameters.outputDir, 'eyetracker'));
end


%% create filenames

switch modality

case 'beh'

expParameters.fileName.events = ...
[expParameters.fileName.base, runSuffix, '_events_date-' expParameters.date '.tsv'];

case 'func'

expParameters.fileName.events = ...
[expParameters.fileName.base, ...
expParameters.acqSuffix, expParameters.ceSuffix, ...
expParameters.dirSuffix, expParameters.recSuffix, ...
runSuffix, expParameters.echoSuffix, ...
'_events_date-' expParameters.date '.tsv'];

end

if cfg.eyeTracker

expParameters.fileName.eyetracker = ...
[expParameters.fileName.base, expParameters.acqSuffix, ...
runSuffix, '_eyetrack_date-' expParameters.date '.edf'];

end

if expParameters.verbose
fprintf(1,'\nData will be saved in this directory:\n\n%s\')
expParameters.outputDir
expParameters.fileName
end


end
9 changes: 9 additions & 0 deletions saveEventsFile.m
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,13 @@
% close txt log file
fclose(logFile(1).eventLogFile);

if expParameters.verbose
fprintf(1,'\nData were saved in this file:\n\n%s\n\n', ...
fullfile(...
expParameters.outputDir, ...
expParameters.modality, ...
expParameters.fileName.events));

end

end
79 changes: 79 additions & 0 deletions saveEventsFile.m~
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
function [ logFile ] = saveEventsFile(input, expParameters, logFile, varargin)

if nargin<3 || isempty(logFile)
logFile = struct();
end

switch input

case 'open'

logFile = struct();

% Initialize txt logfiles and empty fields for the standard BIDS
% event file
logFile.eventLogFile = fopen(...
fullfile(expParameters.outputDir, expParameters.modality, expParameters.fileName.events), ...
'w');

% print the basic BIDS columns
fprintf(logFile.eventLogFile, '%s\t%s\t%s\t', 'onset', 'trial_type', 'duration');

% print any extra column specified by the user
% also prepare an empty field in the structure to collect data
% for those
for iExtraColumn = 1:numel(varargin)
fprintf(logFile.eventLogFile,'%s\t', lower(varargin{iExtraColumn}));
end

% next line so we start printing at the right place
fprintf(logFile.eventLogFile, '\n');


case 'save'

% appends to the logfile all the data stored in the structure
% first with the standard BIDS data and then any extra things
for iEvent = 1:size(logFile,1)

fprintf(logFile(1).eventLogFile,'%f\t%s\t%f\t',...
logFile(iEvent).onset, ...
logFile(iEvent).trial_type, ...
logFile(iEvent).duration);

for iExtraColumn = 1:numel(varargin)

% if the field we are looking for does not exist or is empty in the
% input logFile structure we will write a NaN otherwise we
% write its content

if ~isfield(logFile, varargin{iExtraColumn})
data = [];
else
data = getfield(logFile(iEvent), varargin{iExtraColumn});
end

if isempty(data)
data = NaN;
end

if ischar(data)
fprintf(logFile(1).eventLogFile, '%s\t', data);
else
fprintf(logFile(1).eventLogFile, '%f\t', data);
end

end

fprintf(logFile(1).eventLogFile, '\n');
end

case 'close'

% close txt log file
fclose(logFile(1).eventLogFile);

if expParameters.verbose
fullfile(expParameters.outputDir, expParameters.modality, expParameters.fileName.events)

end
1 change: 1 addition & 0 deletions tests/test_createFilename.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ function test_createFilename()
expParameters.sessionNb = 1;
expParameters.runNb = 1;
expParameters.task = 'testtask';
expParameters.verbose = 1;

cfg.eyeTracker = true;
cfg.device = 'PC';
Expand Down
3 changes: 2 additions & 1 deletion tests/test_saveEventsFile.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ function test_saveEventsFile()
expParameters.sessionNb = 1;
expParameters.runNb = 1;
expParameters.task = 'testtask';
expParameters.verbose = 1;

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

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