-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrun_experiment.m
155 lines (136 loc) · 5.26 KB
/
run_experiment.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
function run_experiment()
addpath(genpath('scripts/experiment'))
% Constants
SAVE_PATH = fullfile('data', 'raw');
METADATA_PATH = 'metadata';
TEST_FILE = 'Test';
stimuli_splits = [5 5 5 5];
splits_per_session = 2;
load(fullfile(METADATA_PATH, 'stimuli_config.mat'));
load(fullfile(METADATA_PATH, 'stimuli_questions.mat'));
[subjname, reading_level, sleep_time, wakeup_time, use_eyetracker] = initial_questions();
if isempty(subjname); return; end
SAVE_PATH = fullfile(SAVE_PATH, subjname);
if exist(SAVE_PATH, 'dir') ~= 7
mkdir(SAVE_PATH)
end
subjfile = fullfile(SAVE_PATH, 'metadata.mat');
loaded_metadata = false;
if exist(subjfile, 'file') > 0
opts.Interpreter = 'tex';
opts.Default = 'Yes';
load_metadata = questdlg('\fontsize{15} Se encontro informacion previa del participante. Cargar el archivo?', 'Experimento previo', opts);
if strcmp(load_metadata, 'Yes')
load(subjfile)
loaded_metadata = true;
snd_date = char(datetime('now','TimeZone','local','Format','dd-MM-y HH:mm'));
snd_sleeptime = sleep_time;
snd_wakeuptime = wakeup_time;
save(subjfile, 'snd_sleeptime', 'snd_wakeuptime', 'snd_date', '-append')
elseif strcmp(load_metadata, 'Cancel')
return
end
end
if ~loaded_metadata
load(fullfile(METADATA_PATH, 'stimuli_order.mat'));
ordered_stimuli = {stimuli_order(:).title}';
% Sanity check
if length(ordered_stimuli) ~= sum(stimuli_splits)
disp('ERROR: la suma de los bloques no condice con la cantidad de textos')
return
end
shuffled_stimuli = shuffle_in_blocks(stimuli_splits, ordered_stimuli);
shuffled_stimuli = cat(1, TEST_FILE, shuffled_stimuli);
stimuli_index = 1;
fst_date = char(datetime('now','TimeZone','local','Format','dd-MM-y HH:mm'));
fst_sleeptime = sleep_time;
fst_wakeuptime = wakeup_time;
save(subjfile, 'subjname', 'reading_level', ...
'fst_wakeuptime', 'fst_sleeptime', 'fst_date', ...
'shuffled_stimuli', 'stimuli_index', 'use_eyetracker')
end
laststimuli_index = stimuli_index;
first_session_trials = sum(stimuli_splits(1:splits_per_session));
for i = laststimuli_index:length(shuffled_stimuli)
if i == 1
% Test trial
use_eyetracker_in_trial = 0;
else
use_eyetracker_in_trial = use_eyetracker;
end
exit_status = run_trial(subjname, i, shuffled_stimuli, stimuli_questions, config, SAVE_PATH, use_eyetracker_in_trial);
aborted = exit_status == 1;
if ~aborted
stimuli_index = stimuli_index + 1;
save(subjfile, 'stimuli_index', '-append')
end
if i == first_session_trials + 1 || aborted
break
end
end
opts.Interpreter = 'tex';
opts.WindowStyle = 'modal';
if stimuli_index > length(shuffled_stimuli)
uiwait(msgbox('\fontsize{13} Experimento terminado!', 'Fin del experimento', opts))
else
uiwait(msgbox('\fontsize{13} Experimento interrumpido. Se guardo el estado de la/el participante', 'Fin del experimento', opts))
end
exit();
end
function shuffled_elems = shuffle_in_blocks(blocks_size, elems)
shuffled_elems = {};
block_startindex = 1;
rng('shuffle');
for split_index = 1:length(blocks_size)
block_finishindex = block_startindex + blocks_size(split_index) - 1;
current_block = elems(block_startindex:block_finishindex);
shuffled_elems = cat(1, shuffled_elems, current_block(randperm(blocks_size(split_index))));
block_startindex = block_finishindex + 1;
end
end
function [initials, reading_level, sleep_time, wakeup_time, use_eyetracker] = initial_questions()
initials = '';
reading_level = '';
sleep_time = '';
wakeup_time = '';
use_eyetracker = 0;
prompt = {'\fontsize{13} Ingrese sus iniciales (incluya segundo nombre):', ...
'\fontsize{13} Del 1 al 10, que tan frecuentemente lee? (10 = mas de una hora al dia)', ...
'\fontsize{13} A que hora te fuiste a dormir ayer?', ...
'\fontsize{13} Y a que hora te despertaste hoy?', ...
'\fontsize{13} Usar el eyetracker? (Y/N)'};
dlgtitle = 'Metadata';
dims = [1 70];
definput = {'', '', '', '', 'Y'};
opts.Interpreter = 'tex';
answer = inputdlg(prompt, dlgtitle, dims, definput, opts);
if isempty(answer)
return
else
initials = upper(answer{1});
if ~isempty(answer{2})
reading_level = answer{2};
else
reading_level = 'N/C';
end
if ~isempty(answer{3})
sleep_time = answer{3};
else
sleep_time = 'N/C';
end
if ~isempty(answer{4})
wakeup_time = answer{4};
else
wakeup_time = 'N/C';
end
if isempty(answer{5})
use_eyetracker = 0;
else
if strcmp(upper(answer{5}), 'Y')
use_eyetracker = 1;
else
use_eyetracker = 0;
end
end
end
end