MLspike and autocalibration demo

This script demonstrates on simulated data how to use the MLspike and autocalibration algorithms. To see how to run the algorithms, go directly to section 'Spike estimation'.

Contents

Generate spikes

We first generate some simulated data. Spike trains are generated using spk_gentrain function (the data consists of 6 trials of 30s).

Note the usefull function spk_display to display both spikes and calcium time courses.

% parameters
ntrial = 6;
T = 30;
rate = 1;

% generate spikes
spikes = spk_gentrain(rate,T,'bursty','repeat',ntrial);

% display
figure(1)
spk_display([],spikes,[])

Random A and tau, and random level of noise

We draw randomly the parameters governing the calcium dynamics A (DF/F amplitude for one spike) and tau (decay time constant), as well as the level of noise in the data, sigma.

amin = .04;
amax = .1;
a = amin * exp(rand(1)*log(amax/amin)) % log-uniform distribution

taumin = .4;
taumax = 1.6;
tau = taumin * exp(rand(1)*log(taumax/taumin))

sigmamin = .005;
sigmamax = .05;
sigma = sigmamin * exp(rand(1)*log(sigmamax/sigmamin))
a =

    0.0907


tau =

    0.5398


sigma =

    0.0257

Generate calcium

We generate calcium signals corresponding to the above spike trains using these parameters. Note that some additional parameters (OGB dye saturation and drift parameter) are fixed.

% parameters
dt = .02; % 50Hz acquisition
pcal = spk_calcium('par');
pcal.dt = dt;
pcal.a = a;
pcal.tau = tau;
pcal.saturation = .1; % saturation level is fixed
pcal.sigma = sigma; % noise level
pcal.drift.parameter = [5 .015]; % drift level (#harmonics and amplitude of them)

% generate calcium
calcium = spk_calcium(spikes,pcal);

% display
figure(1)
spk_display(dt,spikes,calcium)
drawnow

Spike estimation (using naive parameters)

We first apply the MLspike algorithm using some fixed parameters. To run the algorithm on other data, set variable 'calcium' as a vector time courses of the calcium signal if there is only one trial, or to a cell array of such time courses if there are many trials.

% parameters
% (get the default parameters)
par = tps_mlspikes('par');
% (indicate the frame duration of the data)
par.dt = dt;
% (set physiological parameters)
par.a = 0.07; % DF/F for one spike
par.tau = 1; % decay time constant (second)
par.saturation = 0.1; % OGB dye saturation
% (set noise parameters)
par.finetune.sigma = .02; % a priori level of noise (if par.finetune.sigma
                          % is left empty, MLspike has a low-level routine
                          % to try estimating it from the data
par.drift.parameter = .01; % if par.drift parameter is not set, the
                           % algorithm assumes that the baseline remains
                           % flat; it is also possible to tell the
                           % algorithm the value of the baseline by setting
                           % par.F0
% (do not display graph summary)
par.dographsummary = false;

% spike estimation
[spikest fit drift] = spk_est(calcium,par);

% display
figure(1)
spk_display(dt,{spikes spikest},{calcium fit drift})
set(1,'numbertitle','off','name','MLspike alone')
tps_mlspike 6/6

The above graphs compare spikes estimated using autocalibration followed by MLspike (in black) with the original spikes (in red), as well as the estimated drift (dashed black) and fit to data. Because the parameters A, tau and sigma used for the estimation might not be appropriate, the estimation might not be very successful.

Auto-calibration

Now we want to estimate the original spikes from the calcium signals rather than using fixed parameter. First we run the autocalibration algorithm to attempt estimating, from the calcium signals directly, the values of parameters A, tau and sigma.

% parameters
% (get default parameters and set frame duration)
pax = spk_autocalibration('par');
pax.dt = dt;
% (set limits for A and tau)
pax.amin = amin;
pax.amax = amax;
pax.taumin = taumin;
pax.taumax = taumax;
% (set saturation parameter)
pax.saturation = 0.1;
% (give real values to the algorithm for display purposes - they obviously won't be used in the estimation!)
pax.realspikes = spikes;
pax.reala = a;
pax.realtau = tau;
% (when running MLspike from spk_autocalibratio, do not display graph summary)
pax.mlspikepar.dographsummary = false;

% perform auto-calibration
[tauest aest sigmaest] = spk_autocalibration(calcium,pax)
estimated sigma: 0.029
detect events: no nonlinearity here!
sub-select events
estimate tau - no nonlinearity here!
line was modified since gcamp6s estimations!
histogram and assign number of spikes to events
re-estimate A and tau

tauest =

    0.6603


aest =

    0.0789


sigmaest =

    0.0285

The above graphs illustrate some steps of the performed autocalibration. As can be seen, estimated values for A and tau are pretty close to the real values used for the simulation. The estimated value for sigma is generally lower that the original sigma: this is normal, as the MLspike generally performs best when it uses a value for sigma slightly lower than the real one (using the real one tends to generate more misses).

Spike estimation (using autocalibrated parameters)

After this autocalibration we can apply the MLspike algorithm by using the autocalibrated parameters.

% parameters
par = tps_mlspikes('par');
par.dt = dt;
% (use autocalibrated parameters)
par.a = aest;
par.tau = tauest;
par.finetune.sigma = sigmaest;
% (the OGB saturation and drift parameters are fixed)
par.saturation = 0.1;
par.drift.parameter = .01;
% (do not display graph summary)
par.dographsummary = false;

% spike estimation
[spikest fit drift] = spk_est(calcium,par);

% display
figure(2)
spk_display(dt,{spikes spikest},{calcium fit drift})
set(2,'numbertitle','off','name','Auto-calibration + MLspike')
tps_mlspike 6/6

Spikes estimated in such a way now match the original spikes with a lower error rate.