ET_PDToolkit/PDToolkit/@PDSession/label.m

100 lines
2.8 KiB
Matlab

function[obj] = label(obj, params)
%% extract labels from all MSG events
%% Step 1: read pattern from label_pattern (the varying part)
for p = 1:length(obj.label_patterns)
[token remainder] = strtok(obj.label_patterns{p},'%');
match{p} = strtrim(token);
if isempty(match{p})
match{p} = strtrim(strtok(remainder));
end
end
%% allocate only MSG events
msg_ind = regexp(obj.events_, 'MSG');
ind = find(~cellfun(@isempty,msg_ind));
l_ind = 1;
if (exist('match', 'var'))
for m = 1:length(match)
%% match all messages at once
s = regexp(obj.events_(ind), match{m});
m_ind = find(~cellfun(@isempty,s));
% m_ind now contains all events, that contain the match
for pe = 1:length(m_ind);
event_ind = ind(m_ind(pe));
label_timestamp= sscanf(obj.events_{event_ind},'%*s %d %*s');
pos = s{m_ind(pe)} + length(match{m});
obj.labels(l_ind).time = label_timestamp;
obj.labels(l_ind).label = strtrim(obj.events_{event_ind}(pos:end));
obj.labels(l_ind).match = match{m};
obj.labels(l_ind).type = 'normal';
obj.labels(l_ind).color = [0.4 0.4 0.4];
l_ind = l_ind + 1;
end
end
end
%% hook all matches up to stimuli
for t = 1:length(obj.trials)
trial = obj.trials(t);
%% in case no labels are defined, continue..
if (isempty(obj.labels))
continue;
end
for l = 1:length(obj.labels)
label_timestamps(l) = obj.labels(l).time(1);
end
% labels are set before or during
earlier_labels = find(label_timestamps < trial.trial_end);
later_labels = find(label_timestamps > trial.trial_start);
% variable is set during trial:
common = intersect(earlier_labels, later_labels);
if isempty(params.ForcePrecursorLabels)
params.ForcePrecursorLabels{2} = 0;
end
if (~params.ForcePrecursorLabels{2} && ~isempty(common))
trial.labels = obj.labels(common);
else
% no variables set during, perhaps a precursor variable?
if ~isempty(earlier_labels)
if t > 1
%% check later than previous trials
previous_trial = obj.trials(t-1);
later_than_previous = find(label_timestamps >= previous_trial.trial_end);
precursors = intersect(earlier_labels, later_than_previous);
trial.labels = obj.labels(precursors);
else
trial.labels = obj.labels(earlier_labels);
end
end
end
%% assign variables to trial in field 'type'
for l = 1:length(trial.labels)
varname = regexprep(trial.labels(l).match,'\s' ,'_');
trial.type.(varname) = trial.labels(l).label;
end
obj.trials(t) = trial;
end