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