Skip to content

Online Raster PSTH Example

Import snippet and epoc data into MATLAB using SynapseLive while the experiment is running
Generate peri-event raster and histogram plots over all trials
Good for stim-response experiments, such as optogenetic or electrical stimulation, where you need immediate visual feedback

Download M File

Download Experiment File

Housekeeping

Clear workspace and close existing figures. Add SDK directories to MATLAB path.

close all; clc;
[MAINEXAMPLEPATH,name,ext] = fileparts(cd); % \TDTMatlabSDK\Examples
[SDKPATH,name,ext] = fileparts(MAINEXAMPLEPATH); % \TDTMatlabSDK
addpath(genpath(SDKPATH));

Setup

Setup the variables for the data you want to extract. We will extract channel 1 from the eNe1 snippet data store, created by the PCA Sorting gizmo, and use the Tick as our stimulus onset.

REF_EPOC = 'Tick';
EVENT = 'eNe1';
CHANNEL = 1;
SORTCODE = 0; % set to 0 to use all sorts
TRANGE = [-0.3, 0.8]; % start time, duration
DO_RASTER = 1; % set to 0 to only see histogram

Setup SynapseLive

t = SynapseLive('MODE', 'Preview', 'EXPERIMENT', 'RasterPSTHdemo'); % we will default to 'Preview' mode
t.NEWONLY = 0;  % read all available events in the block on every iteration
t.TIMESTAMPSONLY = 1;  % we don't care what the snippets look like, just their timestamps
t.TYPE = {'snips', 'epocs', 'scalars'}; % we only care about these types of events
t.VERBOSE = false;
Connected to TANK: F:\Tanks\RasterPSTHdemo-220120-082308, BLOCK: TempBlk
Waiting for initial data.............done

The Main Loop

% Set figure size base on number of plots
if DO_RASTER
    h = figure('Position',[100, 100, 500, 800]);
else
    h = figure('Position',[100, 100, 500, 400]);
end
while 1

    % slow it down a little
    pause(1)

    % get the most recent data, exit loop if the block has stopped.
    if isempty(t.update)
        break
    end

    % read the snippet and event timestamp data.
    r = t.get_data(EVENT);
    if isstruct(r)
        if ~isnan(r.ts)

            % do our timestamp filtering
            if DO_RASTER
                data = TDTfilter(t.data, REF_EPOC, 'TIME', TRANGE);
            else
                data = TDTfilter(t.data, REF_EPOC, 'TIME', TRANGE, 'TIMEREF', 1);
            end

            % do our channel and sort code filtering
            if SORTCODE ~= 0
                i = find(data.snips.(EVENT).chan == CHANNEL & data.snips.(EVENT).sortcode == SORTCODE);
            else
                i = find(data.snips.(EVENT).chan == CHANNEL);
            end

            % grab only the relevant timestamps
            try
                TS = data.snips.(EVENT).ts(i);
                if isempty(TS)
                    continue
                end
            catch
                continue
            end

            % that's it for the data extraction, now we plot
            num_trials = size(data.time_ranges, 2);
            if DO_RASTER
                % match timestamp to its trial
                all_TS = cell(num_trials, 1);
                all_Y = cell(num_trials, 1);
                for trial = 1:num_trials
                    trial_TS = TS(TS >= data.time_ranges(1, trial) & TS < data.time_ranges(2, trial));
                    all_TS{trial} = trial_TS - data.time_ranges(1, trial) + TRANGE(1);
                    all_Y{trial} = trial * ones(numel(trial_TS), 1);
                end
                all_X = cat(1, all_TS{:});
                all_Y = cat(1, all_Y{:});

                % plot raster
                subplot(2,1,1)
                hold on;
                plot(all_X, all_Y, '.', 'MarkerEdgeColor','k', 'MarkerSize',10)
                line([0 0], [1, trial], 'Color','r', 'LineStyle','-', 'LineWidth',3)
                axis tight; axis square;
                set(gca, 'XLim', [TRANGE(1), TRANGE(1)+TRANGE(2)]);
                ylabel('trial number')
                xlabel('time, s')
                title(sprintf('Raster ch=%d sort=%d, %d trials', CHANNEL, SORTCODE, num_trials))
                hold off;
                TS = all_X;
                subplot(2,1,2)
            end

            % plot PSTH
            NBINS = 20;
            if NBINS > 0
                hist(TS, NBINS);
                hold on;
                N = hist(TS, NBINS);
                line([0 0], [0, max(N)*1.1], 'Color','r', 'LineStyle','-', 'LineWidth',3);
                hold off;
                axis tight; axis square;
                set(gca, 'XLim', [TRANGE(1), TRANGE(1)+TRANGE(2)]);
                ylabel('number of occurrences')
                xlabel('time, s')
                title(sprintf('Histogram ch=%d sort=%d, %d trials', CHANNEL, SORTCODE, num_trials))
            end

            % force the plots to update
            try
                snapnow
            catch
                drawnow
            end

            % for publishing, end early
            if num_trials > 30
                t.SYN.setModeStr('Idle'); % set to idle mode
                break
            end
        end
    end
end

Runtime Output