123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- function[N,B,E] = isi(data,T,err,Nbins,plt)
- % Calculate the inter-spike-interval histogram
- % Usage: [N,B,E] = isi(data,T,err,Nbins,plt)
- %
- % Input:
- % Note that all times have to be consistent.
- %
- % data - structure array of spike times (required)
- % T - time interval of interest (default all)
- % err - 0 for no error bars, 1 for jackknife errors
- %
- % Nbins - number of bins in the isi
- %
- % Output:
- %
- % N - count in bins
- % B - bin centres
- % E - errorbar (this is 2 sig deviation
- % calculated using a jackknife over trials)
- if nargin < 1; error('I need data!'); end
- data=padNaN(data); % create a zero padded data matrix from input structural array
- data=data'; % transposes data to get it in a form compatible with Murray's routine
- if nargin < 2; T = [min(data(:,1)) max(max(data))]; end
- if nargin < 3; err = 0;end
- if nargin < 4; Nbins = -1; end
- if nargin < 5; plt = 'r'; end
- if isempty(T); T = [min(min(data)) max(max(data))]; end
- if isempty(err); err = 0;end
- if isempty(Nbins); Nbins = -1; end
- if isempty(plt); plt = 'r'; end
- % get the number of intervals in each trial and the indices of spike times
- % that are kept
- NT = length(data(1,:)); % number of trials
- NI=zeros(1,NT);
- index(1:NT)=struct('keep',[]);
- for n=1:NT
- indx = find(data(:,n) >= T(1) & data(:,n) <= T(2) ...
- & ~isnan(data(:,n)));
- if isempty(indx)
- NI(n) = 0;
- else
- NI(n) = length(indx)-1;
- index(n).keep=indx;
- end
- end
- % calculate intervals...
- I = zeros(NT,max(NI));
- IT = [];
- for n=1:NT
- I(n,1:NI(n)) = diff(data(index(n).keep,n));
- IT = [IT I(n,1:NI(n))];
- end
- Mx = max(IT);
- if Nbins == -1
- Nbins = floor(sum(NI)/30);
- Med = median(IT);
- Nbins = max(floor(Nbins*Mx/Med),10);
- end
- B = linspace(0,Mx,Nbins);
- N = zeros(NT,Nbins);
- for n=1:NT
- N(n,:) = hist(I(n,1:NI(n)),B);
- end
- % answer...
- if NT > 1;Ns = sum(N)/NT;else Ns = N;end
- if ~strcmp(plt,'n')
- bar(B,NT*Ns);
- end
- % Jackknife iver trials to estimate std...
- if NT > 4 && err == 1
- MN = 0;
- SN = 0;
- for n=1:NT
- JK = (NT*Ns - N(n,:))/(NT-1);
- MN = MN + JK;
- SN = SN + JK.^2;
- end
- MN = MN/NT;
- SN = SN/NT;
- E = sqrt((NT-1)*(SN - MN.^2));
- if ~strcmp(plt,'n')
- hold on
- errorbar(B,NT*Ns,NT*2*E,'r-')
- hold off
- end
- end
- N = NT*Ns;
|