Skip to content

Note Filter Example

Import streaming EEG data into MATLAB using TDTbin2mat
Filter around behavioral events that were timestamped by the user
using the Run-time Notes feature in Synapse
Plot each occurrence in a subplot organized by Note type
Good for sleep scoring and behavioral discrimination

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,'Subject1-180426-120951');

Set up the variables for the data you want to extract. We will extract channel 1 from the EEG1 stream store.

STORE = 'EEG1';
CHANNEL = 1;
ONSET = -3; % relative onset, in seconds, from the note timestamp

Now read the specified data from our block into a MATLAB structure.

data = TDTbin2mat(BLOCKPATH, 'CHANNEL', CHANNEL);
Found Synapse note file: C:\TDT\TDTMatlabSDK\Examples\ExampleData\Subject1-180426-120951\Notes.txt
read from t=0.00s to t=31.81s

All notes are stored in a special epoc event called 'Note'

% find all the unique note values
notes = unique(data.epocs.Note.notes);

% find the highest number of occurrences (to inform our plot)
maxOccur = max(cell2mat(cellfun(@(x) sum(ismember(data.epocs.Note.notes,x)),notes,'un',0)));

Loop through the notes for plotting

h = figure;
for i = 1:numel(notes)

    fprintf('Reading note: %s\n', notes{i})

    % look at only the data around this note type
    filtered = TDTfilter(data, 'Note', 'VALUES', notes{i}, 'TIME', ONSET);

    % for each note occurrence, plot the data from the note onset to the next note onset
    n = numel(filtered.streams.(STORE).filtered);
    for j = 1:n
        plotInd = (j-1)*numel(notes)+i;
        subplot(maxOccur,numel(notes),plotInd);

        % x-axis is the valid time ranges, in seconds
        ts = filtered.time_ranges(1,j) + double(1:size(filtered.streams.(STORE).filtered{j},2))/filtered.streams.(STORE).fs;

        % plot the snippet, in microvolts
        plot(ts, 1e6*filtered.streams.(STORE).filtered{j}'); hold on;

        % if we specified an ONSET, draw the vertical line at the note onset.
        if ONSET ~= 0
            line((ts(1)-ONSET)*[1 1], [min(1e6*filtered.streams.(STORE).filtered{j}') max(1e6*filtered.streams.(STORE).filtered{j}')], 'Color',[.7 .7 .7], 'LineStyle','-', 'LineWidth', 3);
        end

        % plot labels
        if j == 1
            title(notes{i},'FontSize',14)
        elseif j == n
            if i == 1
                ylabel('\muV','FontSize',12)
                xlabel('time, s','FontSize',12)
            end
        end
        axis tight;
    end
end

set(gcf, 'Position',[100, 100, 1000, 500])
Reading note: grooming
Reading note: moving
Reading note: sleep