function outData = eventTriggeredAverage(events, postTrace, window, timePerPoint, showAllTraces)
% calculate the event-triggered average in postTrace using preTrace's spikes
% outData = eventTriggeredAverage(events, postTraces, [startTime endTime], timePerPoint, showAllTraces);
% outData = eventTriggeredAverage(tracePaths, [preCell postCell1 postCell 2], [startTime endTime], timePerPoint, showAllTraces);
% defaults:
% window = [-10 100] ms
% timePerPoint = 0.2 ms
% showAllTraces = false
if nargin < 3
window = [-10 100];
end
if nargin < 4
timePerPoint = 0.2;
end
if nargin < 5
showAllTraces = false;
end
window = window / timePerPoint;
if ischar(events)
% outData = eventTriggeredAverage(tracePath, [preCell postCell],...)
events = {events}; % make it a cell
end
if iscell(events)
% preallocate space
outData = zeros(length(postTrace) - 1, 10 * numel(events), diff(window) + 1);
dataIndex = 0;
for traceIndex = 1:numel(events)
zData = readTrace(events{traceIndex});
% detect events
switch zData.protocol.channelNames{postTrace(1)}(end)
case 'V'
% choices here are extracellular MUA, APs
if numel(zData.protocol.channelNames{postTrace(1)}) > 4 && strcmp(zData.protocol.channelNames{postTrace(1)}, 'Field')
% extracellular MUA
tempEvents = MTEO(zData.traceData(:, whichChannel(zData.protocol, postTrace(1), 'V')), 14, -1);
else
% whole cell action potentials
tempEvents = detectSpikes(zData.traceData(:, whichChannel(zData.protocol, postTrace(1), 'V')));
end
case 'I'
% cell-attached spikes
tempEvents = MTEO(zData.traceData(:, whichChannel(zData.protocol, postTrace(1), 'I')), 14, -10);
end
% send off for the post responses
if numel(tempEvents)
sentData = zeros(size(zData.traceData, 1), length(postTrace) - 1);
% tempData(:, 1) = zData.traceData(:, 3);
% eventTriggeredAverage(tempEvents, sentData, window, timePerPoint, true);
for ampIndex = 2:length(postTrace)
tempData(:, ampIndex - 1) = zData.traceData(:, whichChannel(zData.protocol, ampIndex));
eventTriggeredAverage(tempEvents, sentData, window, timePerPoint, true);
end
% add the responses to our collection
outData(:, dataIndex + (1:size(tempData, 1)), :) = tempData;
end
end
if ~showAllTraces
outData = sum(outData, 2)./sum(~isnan(outData), 2);
end
if nargout == 0
for i = 1:size(outData, 1)
sendData{i} = squeeze(outData(i, :, :));
end
newScope(sendData, (window(1):window(2))'*timePerPoint);
set(gcf, 'name', 'Event-Triggered Average');
end
return
end
events = events(events > -window(1) & events < size(postTrace, 2) - window(2));
outData = zeros(size(postTrace, 1), numel(events), diff(window) + 1);
xData = window(1):window(2);
for i = 1:numel(events)
for j = 1:size(postTrace, 1)
outData(j, i, :) = postTrace(j, int32(events(i) + xData));
end
end
if ~showAllTraces
outData = sum(outData, 2)./sum(~isnan(outData), 2);
end
if nargout == 0
for i = 1:size(outData, 1)
sendData{i} = squeeze(outData(i,:,:))';
end
newScope(sendData, xData'*timePerPoint);
set(gcf, 'name', 'Event-Triggered Average');
end