0001 function [spikes,V] = GenerateSpikeTrain(I,threshold,varargin);
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 delay = 0;
0047 Vr = 0;
0048 tau = 0.015;
0049 sigma = 0;
0050 R = 1;
0051
0052
0053 if ~isdmatrix(I,'@2'),
0054 error('Incorrect input current (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).');
0055 end
0056 if ~isdscalar(threshold),
0057 error('Incorrect spike threshold (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).');
0058 end
0059
0060
0061 for i = 1:2:length(varargin),
0062 if ~ischar(varargin{i}),
0063 error(['Optional parameter ' num2str(i) ' is not a valid property (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).']);
0064 end
0065 switch(lower(varargin{i})),
0066 case 'delay',
0067 delay = varargin{i+1};
0068 if ~isdscalar(delay,'>=0'),
0069 error('Incorrect value for property ''delay'' (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).');
0070 end
0071 case 'tau',
0072 tau = varargin{i+1};
0073 if ~isdscalar(tau,'>=0'),
0074 error('Incorrect value for property ''tau'' (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).');
0075 end
0076 case 'vr',
0077 Vr = varargin{i+1};
0078 if ~isdscalar(Vr),
0079 error('Incorrect value for property ''Vr'' (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).');
0080 end
0081 case 'sigma',
0082 sigma = varargin{i+1};
0083 if ~isdscalar(sigma,'>=0'),
0084 error('Incorrect value for property ''sigma'' (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).');
0085 end
0086 case 'r',
0087 R = varargin{i+1};
0088 if ~isdscalar(R),
0089 error('Incorrect value for property ''R'' (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).');
0090 end
0091 otherwise,
0092 error(['Unknown property ''' num2str(varargin{i}) ''' (type ''help <a href="matlab:help GenerateSpikeTrain">GenerateSpikeTrain</a>'' for details).']);
0093 end
0094 end
0095
0096
0097 Vmin = -threshold;
0098 if tau == 0,
0099 warning('The value of tau cannot be exactly 0 (division by zero) - using ''realmin'' instead');
0100 tau = realmin;
0101 end
0102 dt = median(diff(I(:,1)));
0103 m = min(I(:,1));
0104 M = max(I(:,1));
0105 t = (m:dt:M+dt/100)';
0106 delay = round(delay/dt);
0107
0108
0109 randn('seed',sum(100*clock));
0110 n = length(t);
0111 noise = sigma*sqrt(1/dt)*randn(n,1);
0112
0113
0114 I = Interpolate(I,t);
0115
0116
0117 spikes = [];
0118 V = nan(n,1);
0119 V(1) = Vr;
0120
0121 for i = 1:n-1,
0122 if V(i) > threshold,
0123 spikes = [spikes;t(i)];
0124 V(i) = Vr;
0125 elseif V(i) < Vmin,
0126 V(i) = Vmin;
0127 end
0128 if i+delay > length(I),
0129 V(i+1) = V(i) + dt*(-(V(i) - Vr)/tau);
0130 else
0131 V(i+1) = V(i) + dt*((R*I(i+delay,2)-(V(i) - Vr))/tau + noise(i+delay)/sqrt(tau));
0132 end
0133 end