-
Notifications
You must be signed in to change notification settings - Fork 0
/
Parser_PupilEXT.m
94 lines (74 loc) · 3.31 KB
/
Parser_PupilEXT.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
function [timestamp, pupdil, conf, outlineConf, uniq_tr, ts_abs, b_start, b_end, s_start, s_end, s_startX, s_startY, s_endX, s_endY, s_magnitude] = Parser_PupilEXT(directory, participantName, PXorMM)
% DEV
s_startX = NaN;
s_startY = NaN;
s_endX = NaN;
s_endY = NaN;
s_magnitude = NaN;
filename = strcat(directory, '/', participantName,'.csv');
delimiter = Parser_PupilEXT_determineDelimiter(filename);
% TODO: mm?
colNamesToGet = {'timestamp', 'trial', 'diameter_px', 'confidence', 'outlineConfidence'};
[coli_ts, coli_tr, coli_p, coli_c, coli_oc, startRow] = Parser_PupilEXT_getHeaderColNrs(filename, colNamesToGet, delimiter);
coli = [coli_ts coli_tr coli_p coli_c coli_oc];
% TODO: make the formatSpec parameter for textscan() automatically
formatSpec = num2str(zeros(1, max(coli)+1), '%i');
formatSpec(coli) = '1';
formatSpec = strrep(formatSpec, '1', '%f');
formatSpec = strrep(formatSpec, '0', '%*s');
formatSpec = strcat(formatSpec, '%[^\n\r]');
%TODO: find the column indices(of textscan output) that correspond to the requested columns(of textscan input)
newcoli_ts = 1; %coli(coli==coli_ts)
newcoli_tr = 5; %coli(coli==coli_tr)
newcoli_p = 2; %coli(coli==coli_p)
newcoli_c = 3;
newcoli_oc = 4;
% --------------------------------------------------
% SAMPLES
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'EmptyValue' ,NaN,'HeaderLines' ,startRow-1, 'ReturnOnError', true);
fclose(fileID);
% sometimes columns have different length, check for that
lengths = [length(dataArray{newcoli_ts}) length(dataArray{newcoli_tr}) length(dataArray{newcoli_p})];
timestamp = dataArray{newcoli_ts}(1:min(lengths));
tr = dataArray{newcoli_tr}(1:min(lengths));
pupdil = dataArray{newcoli_p}(1:min(lengths));
conf = dataArray{newcoli_c}(1:min(lengths));
outlineConf = dataArray{newcoli_oc}(1:min(lengths));
% NOTE: TIMESTAMP VALUES are in ms in case of PupilEXT, as instead SMI
% has it in microsec, so we artificially increase temporal resolution
% by multiplying PupilEXT values by 1000
timestamp = timestamp.*1000;
% --------------------------------------------------
% TRIALS BASED ON SAMPLES
% TODO: READ EVENTS XML
uniq_tr = unique(tr);
ts_abs = zeros(length(uniq_tr), 1);
if length(timestamp) < 10
log_e('The length of this recording is less than 10 samples. Please check your data')
end
ts_abs(1) = timestamp(1);
tr_prev = tr(1);
changeC = 2;
iterC = 1;
while(iterC < length(timestamp)) %% && changeC < 10)
tr_curr = tr(iterC);
if tr_curr < tr_prev && tr_curr > tr(1)
log_e(['Trial numbering restarted during recording. Please fix the data file and try again']);
end
if tr_curr > tr_prev
ts_abs(changeC) = timestamp(iterC);
changeC = changeC + 1;
end
iterC = iterC + 1;
tr_prev = tr_curr;
end
% DUMMY VARIABLES: reserved for future
b_start = NaN;
b_end = NaN;
s_start = NaN;
s_end = NaN;
% DEV
% timestamp(1:20)
% pupdil(1:20)
end