# Algorithms for Calculation of Distances Between Spike Trains

## Toolkit

Download the Spike Train Analysis Toolkit, a user-friendly implementation from the Laboratory of Neuroinformatics that includes algorithms for information estimation via the direct method, the binless method, and the metric space method, open-source, written in c.

This was developed by David H. Goldberg of the Laboratory of Neuroinformatics, Jonathan D. Victor, and Daniel Gardner, with funding provided by the Human Brain Project-Neuroinformatics initiative via MH068012 from NIMH, NINDS, NIA, NIBIB, and NSF with additional support from MH/NS057153 from NIMH and NINDS.

The algorithms below differ substantially in memory requirements and overhead. You are encouraged to try different variants on pilot data to determine relative performance, and feedback to Jonathan D. Victor is welcome.

## Single-neuron spike time metric

### Basic algorithm

Fortran code for spike time metric Dspike[q] and spike interval metric Dinterval[q]
Matlab code for spike time metric Dspike[q] courtesy of Daniel Reich
Matlab code for normalized spike time metric Dspike[q] courtesy of Laureline Logiaco
c/MEX code for spike time metric Dspike[q] courtesy of Daniel Reich

### Vectorization

This implementations improve on the basic algorithm through the use of vectorized Matlab code. Abstractly, the algorithm is the same as the basic algorithm above. For a moderate number of values of q, this is faster than "algorithmic parallelization." The breakeven point will depend on the efficiency with which hardware makes use of Matlab vectorization.
Vectorized Matlab code for spike time metric Dspike[q] courtesy of Thomas Kreuz

### Algorithmic parallelization

This approach makes use of the fact that the metric distance is a piecewise linear function of q, and effectively calculates the cutpoints. Once this intermediate calculation is done, then the values of the metric distances can be rapidly read out for any value of q. It is thus the most efficient algorithm when the number of values of q is very large.
Matlab code for spike time metric Dspike[q] parallel in q

## Multi-neuron (labeled) spike time metric

### Basic algorithm

Legacy: Matlab code for multineuronal spike time metric Dspike[q,k]. This has an error concerning whether to swap the spike trains, and is not recommended.
For comparison purposes: Matlab code for multineuronal spike time metric Dspike[q,k] courtesy of Thomas Kreuz. This fixes an error concerning whether to swap the spike trains, but does not include any of the improvements below.
Matlab code for multineuronal spike time metric Dspike[q,k] courtesy of Thomas Kreuz. This fixes an error concerning whether to swap the spike trains, and also has an improved main calculation loop.

### Vectorization

These implementations improve on the basic algorithm through the use of vectorized Matlab code. See above comments regarding vectorization.
Vectorized Matlab code for multineuronal spike time metric Dspike[q,k], courtesy of Thomas Kreuz.
Vectorized Matlab code for multineuronal spike time metric Dspike[q,k], courtesy of Thomas Kreuz. This is algorithmically the same as the above routine, but has improved memory management, allowing calculations for larger spike trains.

### Algorithmic parallelization

abstract and download of paper describing the algorithm for calculations parallel in q and k
Legacy: Matlab code for multineuronal spike time metric Dspike[q,k], parallel in q and k.
Matlab code for multineuronal spike time metric Dspike[q,k], parallel in q and k, optimized by John Zollweg, Cornell Theory Center.

## Single-neuron spike interval metric

### Basic algorithm

Matlab code for spike interval metric Dinterval[q] courtesy of Christina Behrend
Matlab code for spike interval metric Dinterval[q], optimized, courtesy of Christina Behrend and Jim Hokanson

#### original developers

Jonathan D. Victor: jdvicto@med.cornell.edu
Keith P. Purpura: kpurpura@med.cornell.edu
Dmitriy Aronov: aronov@mit.edu