Code covered by the BSD License  

Highlights from
Data Browser

image thumbnail
from Data Browser by Phil Larimer
A utility to browse data files that involve one or more channels of data over time.

eventTriggeredAverage(events, postTrace, window, timePerPoint, showAllTraces)
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

Contact us at files@mathworks.com