% This example uses the xippmex('spike') command to retrieve spikes from
% the Ripple Grapevine processor and average them based on the units
% sorted via the Trellis Spike Scope application.
 
% Clean the world
close all; fclose('all'); clc; clear all;
 
% Initialize xippmex
status = xippmex;
if status ~= 1; error('Xippmex Did Not Initialize');  end
 
% Spike Setup
spk_ch = 1;                                 % channel to read spikes from
sort_colors = {'k','m','y','g','b'};        % unsorted (0), 1, 2, 3, 4
sorted_units = [3 4];                       % sorted units to show in plot
n_sorted = length(sorted_units);            % number of sorted units to plot
spk_samples = 52;                           % number of samples in spike segment
spk_t = 1:spk_samples;                      % spike sample vector
spk_buffer_sz = 25;                         % spikes to plot and average
spk_buffer = cell(n_sorted,1);
for i = 1:n_sorted
    spk_buffer{i} = NaN(spk_buffer_sz,spk_samples);
end
spk_average = NaN(n_sorted,spk_samples);
 
% Plot Setup
FR = 30;                                    % Hz, plot update framerate
spk_plot = figure; hold on;
for i = 1:n_sorted
    h_buffer{i} = plot(spk_t,spk_buffer{i},'color',[0.8 0.8 0.8]);
    uistack(h_buffer{i},'bottom');
    h_mu{i} = plot(spk_t,spk_average(i,:),'color',sort_colors{sorted_units(i)+1},'linewidth',2);
end
y_range = [-220 180];                       % uV
x_range = spk_t([1 end]);                   % samples
ylim(y_range); ylabel('\muV');
xlim(x_range); xlabel('Sample Index');
title(sprintf('Channel #%d, last %d spikes shown',spk_ch,spk_buffer_sz));
hold off;
 
% Clear Spike Buffera
[c,t,w,u] = xippmex('spike',spk_ch); % count, timestamps, waveforms, sorted unit
 
% Main Collection/Update Loop while figure is open
while isa(spk_plot,'handle') && isvalid(spk_plot)
 
    % grab spikes from Grapevine processor
    [c,t,w,u] = xippmex('spike',spk_ch); % count, timestamps, waveforms, sorted unit
 
    if c > 0 % update plot
 
        % loop through sorted units
        for i = 1:n_sorted
            spk_idx = find(u{1}==sorted_units(i));
            count = length(spk_idx);
            if count >= spk_buffer_sz % fill buffer with most recent spikes
                spk_buffer{i} = w{1}(spk_idx(end-spk_buffer_sz+1:end),:);
            else % replace oldest spikes with newest spikes
                spk_buffer{i} = circshift(spk_buffer{i},-count);
                spk_buffer{i}(end-count+1:end,:) = w{1}(spk_idx,:);
            end
            spk_average(i,:) = nanmean(spk_buffer{i});
            for j = 1:numel(h_buffer{i})
                set(h_buffer{i}(j),'ydata',spk_buffer{i}(j,:));
            end
            set(h_mu{i},'ydata',spk_average(i,:));
        end
        drawnow
    end
 
    % Wait until next frame update
    pause(1/FR);
 
end
disp('Exiting main loop');
 
% Close xippmex after exiting loop
disp('Closing xippmex connection');
xippmex('close');

Start typing and press Enter to search