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