Skip to content

Raster Peristimulus Time Histogram (PSTH) Example

Import snippet and epoc data into MATLAB using TDTbin2mat
Generate peristimulus raster and histogram plots over all trials
Good for stim-response experiments, such as optogenetic or electrical
stimulation

Download M File

Housekeeping

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

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

Importing the Data

This example assumes you downloaded our example data sets and extracted it into the \TDTMatlabSDK\Examples directory. To import your own data, replace 'BLOCKPATH' with the path to your own data block.

In Synapse, you can find the block path in the database. Go to Menu → History. Find your block, then Right-Click → Copy path to clipboard.

BLOCKPATH = fullfile(DATAPATH,'Algernon-180308-130351');

Set up 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 our PulseGen epoc event ('PC0/') as our stimulus onset.

REF_EPOC = 'PC0/';
SNIP_STORE = 'eNe1';
SORTID = 'TankSort';
CHANNEL = 3;
SORTCODE = 0; % set to 0 to use all sorts
TRANGE = [-0.3, 0.8]; % window size [start time relative to epoc onset, window duration]

Now read the specified data from our block into a MATLAB structure. The 'NODATA' flag means that we are only interested in the snippet timestamps, not the actual snippet waveforms in this example.

data = TDTbin2mat(BLOCKPATH, 'TYPE', {'epocs', 'snips', 'scalars'}, 'SORTNAME', SORTID, 'CHANNEL', CHANNEL, 'NODATA', 1);
read from t=0.00s to t=61.23s

Use TDTfilter to extract data around our epoc event

Using the 'TIME' parameter extracts data only from the time range around our epoc event.

raster_data = TDTfilter(data, REF_EPOC, 'TIME', TRANGE);

Adding the 'TIMEREF' flag makes all of the timestamps relative to the epoc event, which is ideal for generating histograms.

hist_data = TDTfilter(data, REF_EPOC, 'TIME', TRANGE, 'TIMEREF', 1);

And that's it! Your data is now in MATLAB. The rest of the code is a simple plotting example. First, we'll find matching timestamps for our selected sort code (unit).

TS = raster_data.snips.(SNIP_STORE).ts;
if SORTCODE ~= 0
    i = find(raster_data.snips.(SNIP_STORE).sortcode == SORTCODE);
    TS = TS(i);
end
if isempty(TS)
    error('no matching timestamps found')
end

num_trials = size(raster_data.time_ranges, 2);

Make the histogram plot

figure('Position',[100, 100, 500, 800]);

hist_TS = hist_data.snips.(SNIP_STORE).ts;
subplot(2,1,1);
NBINS = floor(numel(hist_TS)/10);
hist(hist_TS, NBINS);
N = hist(hist_TS, NBINS); hold on;

axis tight; axis square;
set(gca, 'XLim', [TRANGE(1), TRANGE(1)+TRANGE(2)]);
ylabel('Count','FontSize',16);
title({'Peristimulus', sprintf('Channel %d, n = %d trials', CHANNEL, num_trials)});

% Draw a vertical line at t=0.
line([0 0], [0, max(N)], 'Color','r', 'LineStyle','-', 'LineWidth', 3);

% Creating the Raster Plot
% For the raster plot, make a cell array of timestamps for each trial.
all_TS = cell(num_trials, 1);
all_Y = cell(num_trials, 1);
for trial = 1:num_trials
    trial_on = raster_data.time_ranges(1, trial);
    trial_off = raster_data.time_ranges(2, trial);
    trial_TS = TS(TS >= trial_on & TS < trial_off);
    all_TS{trial} = trial_TS - trial_on + TRANGE(1);
    all_Y{trial} = trial * ones(numel(trial_TS), 1);
end
all_X = cat(1, all_TS{:});
all_Y = cat(1, all_Y{:});

% Make the raster plot.
subplot(2,1,2);
plot(all_X, all_Y, '.', 'MarkerEdgeColor','k', 'MarkerSize',15); hold on;
axis tight; axis square;
set(gca, 'XLim', [TRANGE(1), TRANGE(1)+TRANGE(2)]);
xlabel('Trial Window, s','FontSize',16);
ylabel('Trial Number','FontSize',16);
title({'Raster', sprintf('Channel %d, n = %d trials', CHANNEL, num_trials)});

% Draw a vertical line at t=0.
line([0 0], [0, trial+1], 'Color','r', 'LineStyle','-', 'LineWidth', 3);