-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent2Trace.m
59 lines (48 loc) · 1.8 KB
/
event2Trace.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
function trace = event2Trace(taxis, eventTimes, marginDur)
% trace = event2Trace(taxis, eventTimes)
%converts times of event into a single trace of 0/1
%
% trace = event2Trace(taxis, eventTimes, marginDur)
% imposes margin before and after each event
%
% eventTimes: [events x 1] or [events x 2]
% if latter, first and 2nd columns represent start and end of an event
% 14/2/22 made faster
if nargin < 3
marginDur = 0;
end
%assert(size(eventTimes,1) >= size(eventTimes,2));
if size(eventTimes,2)==2
assert(isempty(find(eventTimes(:,2)-eventTimes(:,1)<=0)));
end
if isempty(eventTimes)
trace = false(length(taxis),1);
return;
end
%% implementation 1: SLOW
% trace = zeros(length(taxis),1);
% for itr = 1:length(eventTimes)
% evStartT = max(taxis(1), eventTimes(itr,1) - 0.5*marginDur);
%
% evEndT = min(taxis(end), eventTimes(itr,end) + 0.5*marginDur);
%
% theseTimes = intersect(find(taxis>=evStartT), find(taxis<=evEndT));
%
% trace(theseTimes) = 1;
% end
%% implementation 2
%[~, evStartTidx] = arrayfun(@(x)(min(abs(taxis - x))), eventTimes(:,1) - 0.5*marginDur);
%evStartTidx(evStartTidx<1) = 1;
evStartTidx=interp1(taxis, 1:length(taxis), eventTimes(:,1) - 0.5*marginDur, 'nearest','extrap');%this is it!
% [~, evEndTidx] = arrayfun(@(x)(min(abs(taxis - x))), eventTimes(:,end) + 0.5*marginDur);
% evEndTidx(evEndTidx>length(taxis)) = length(taxis);
evEndTidx=interp1(taxis, 1:length(taxis), eventTimes(:,end) + 0.5*marginDur, 'nearest','extrap');%this is it!
[sameTime] = find(evStartTidx == evEndTidx);
evEndTidx(sameTime) = evEndTidx(sameTime)+1;
evEndTidx(evEndTidx>length(taxis)) = length(taxis);
onTrace = zeros(length(taxis),1);
onTrace(evStartTidx)=1;
offTrace = zeros(length(taxis),1);
offTrace(evEndTidx)=1;
trace = cumsum(onTrace) - cumsum(offTrace);
trace = (trace>0);