A self-adapting approach for the detection of bursts and network bursts in neuronal cultures

Valentina Pasquale1, Sergio Martinoia2,1, Michela Chiappalone1.

1 Neuroscience and Brain Technologies Department, Italian Institute of Technology, Via Morego 30, 16163 Genova, ITALY

2 Neuroengineering and Bio-nanoTechnology Laboratory, Department of Biophysical and Electronic Engineering, University of Genova, Via all’Opera Pia 11A, 16145 Genova, ITALY

Supplementary material

Notations for the pseudo-code are those used in the Materials and methods section. The corresponding MATLAB 7.0 code is available upon request ().

A pseudo-code illustrates here the proposed algorithm to identify the separating threshold ISIth from the logISIH of a single recording channel.

xx à bins of the current logISIH

yy à logISIH

Smooth yy by operating a local regression using weighted linear least squares and a 1st degree polynomial model (e.g. using smooth function in MATLAB Curve Fitting Toolbox, method ‘lowess’)

Identify local maxima in the logISIH (e.g. using findpeaks function in MATLAB Signal Processing Toolbox, parameter ‘minpeakdistance’ set at 2)

if there is at least one peak

Look for peaks within 10^2 ms

If there is more than one peak within 10^2 ms

Consider the biggest one and save the first peak's x- and y-coordinates

else if there is no peak identified below 10^2 ms

return; // the channel is not analyzed

end

end

if there is only one peak

return; // no ISIth can be determined if there is only one peak

else // there is more than one peak

for each pair of peaks constituted by the first and one of the following

Compute the void parameter: the void parameter is a measure of the degree of separation between the two peaks through the minimum

end

Look for local minima whose void parameter satisfies a threshold (e.g. 0.7)

if there is no minimum that satisfies the threshold

return; // no ISIth can be determined

else

Save the corresponding ISI value as ISIth

end

end

A pseudo-code illustrates here the proposed algorithm for burst detection (newBD algorithm) provided in the associated paper.

Compute ISIth from the logISIH of this channel (see above)

Fix a minimum number of spikes per burst: minNumSpikes

Load the timestamps (sample number) of each spike in the train in an array: timestamp

if ISIth > 100 ms

maxISI1 = 100 ms;

maxISI2 = ISIth;

extendFlag = 1;

else

maxISI1 = ISIth;

extendFlag = 0;

end

Detect the edges of burst cores using maxISI1: identify time intervals in which ISIs < maxISI1

if there is at least one burst core

Compute the numSpikesInBurst for each burst

Identify the validBursts //bursts whose number of spikes is higher than minNumSpikes

if there is at least one valid burst core

if extendFlag //case1: ISIth > 100 ms

if two burst cores are separated by less than maxISI2, they are joined end

Detect the edges of burst boundaries using maxISI2: identify time intervals in which ISIs < maxISI2

Build a matrix allEdgeSort (size: [n x 3], n = number of edges) containing all edges obtained with two different thresholds (i.e. maxISI1 & maxISI2) sorted in temporal order

allEdgeSort = [ timestamp type of edge threshold used

...... ]

where: timestamp: timestamp of edge

type of edge: 1 rising, -1 falling

threshold used: 1 maxISI1, 2 maxISI2

Identify burstBegin as rising edges of maxISI2 burst train //first spikes of bursts

for ii = 1:length(burstBegin) // for each element of burstBegin, i.e. for each putative burst

if the following edge is a falling edge of maxISI2 train

continue; // no burst is detected

else

Look for next falling edge of maxISI2 train and save it in thisBurstEnd

Look for rising/falling edge pair of maxISI1 train inside the window [burstBegin(ii),thisBurstEnd]

if there's more than one burst core inside current window

Split the putative burst into sub-bursts according to the maxISI1 train: each burst core should correspond to a separate burst

Save in burstTrain the features of each sub-burst

else

Save in burstTrain the features of current burst

end

end

end

else //case2: ISIth < 100 ms

Save in burstTrain the features of detected bursts

end

else // there is no valid burst, i.e. no burst core is composed of more than minNumSpikes

burstTrain = [];

end

else // there is no burst core

burstTrain = [];

end