0001 function[s,t,E] = sta(data_spk,data_lfp,smp,plt,w,T,D,err)
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 if nargin < 3;error('Require spike, lfp and lfp times');end
0029 if isstruct(data_spk)
0030 [data_spk]=padNaN(data_spk);
0031 sz=size(data_spk);
0032 if sz(1)>sz(2); data_spk=data_spk'; end;
0033 else
0034 if sz(1)>sz(2); data_spk=data_spk'; end;
0035 end
0036 sz=size(data_lfp);
0037 if sz(1)>sz(2); data_lfp=data_lfp'; end;
0038 verbose = 1;
0039 t = smp;
0040 if nargin < 4; plt = 'r'; end
0041 if nargin < 5; w = 0; end
0042 if nargin < 6; T = [min(t) max(t)]; end
0043 if nargin < 7; D = 0.25*[-1 1]; end
0044 if nargin < 8; err = 1;end
0045
0046 if isempty(plt); plt = 'r'; end
0047 if isempty(w); w = 0; end
0048 if isempty(T); T = [min(t) max(t)]; end
0049 if isempty(D); D = 0.25*[-1 1]; end
0050 if isempty(err); err = 1;end
0051
0052 if w > (T(2)-T(1))/2
0053 disp('Smoothing > data segment : should be in seconds : turn off smoothing')
0054 w = 0;
0055 end
0056
0057 sz = size(data_spk);
0058 NT = sz(1);
0059 mlfp = 0;
0060 slfp = 0;
0061 Nspk = 0;
0062 smp = t(2)-t(1);
0063 if D(1) <= 0 && D(2) >= 0
0064 t1 = [D(1):smp:(-smp+eps) 0:smp:D(2)+eps];
0065 else
0066 t1 = (round(D(1)/smp)*smp):smp:D(2);
0067 end
0068
0069
0070
0071 if err
0072 for n=1:NT
0073 indx = find(t>T(1)&t<T(2));
0074
0075 spk = data_spk(n,data_spk(n,:)>T(1) && data_spk(n,:)<T(2) && data_spk(n,:)~=0);
0076 tt = t(indx);
0077 if ~isempty(spk) > 0
0078 ND = length(spk);
0079 for s=1:ND
0080 spktime = spk(s);
0081 t0 = tt-spktime + eps;
0082 if min(t0)>(D(1)-smp) || max(t0)<(D(2)+smp); break;end
0083 Nspk = Nspk + 1;
0084 end
0085 end
0086 end
0087 Err = zeros(Nspk,length(t1));
0088 Nspk = 0;
0089 end
0090
0091 for n=1:NT
0092 indx = find(t>T(1)&t<T(2));
0093 lfp = data_lfp(n,indx);
0094 spk = data_spk(n,data_spk(n,:)>T(1) && data_spk(n,:)<T(2) && data_spk(n,:)~=0);
0095 tt = t(indx);
0096 if ~isempty(spk) > 0
0097 ND = length(spk);
0098 for s=1:ND
0099 spktime = spk(s);
0100 t0 = tt-spktime + eps;
0101 if min(t0) < (D(1)-smp) && max(t0) > (D(2)+smp);
0102 indx = find(t0<D(1));
0103 indx = indx(length(indx));
0104 offset = (t0(indx)-D(1))/smp;
0105 indx = indx:(indx+length(t1)-1);
0106 lfp_t1 = lfp(indx) + (lfp(indx+1)-lfp(indx))*offset;
0107 Nspk = Nspk + 1;
0108 mlfp = mlfp + lfp_t1;
0109 slfp = slfp + lfp_t1.^2;
0110 Err(Nspk,:) = lfp_t1;
0111 end
0112 end
0113 end
0114 end
0115 if Nspk == 0
0116 if verbose;disp('No spikes in interval');end
0117 t = t1;
0118 s = zeros(length(t),1);
0119 E = zeros(length(t),1);
0120 return
0121 end
0122 mlfp = mlfp/Nspk;
0123 slfp = slfp/Nspk;
0124 stdlfp = sqrt((slfp - mlfp.^2)/Nspk);
0125
0126
0127
0128 N = fix(w/smp);
0129 if N > 5
0130 mlfp = locsmooth(mlfp,N,fix(N/2));
0131 end
0132
0133
0134
0135 if err == 1;
0136 Nboot = 20;
0137 blfp = 0;
0138 slfp = 0;
0139 for n = 1:Nboot
0140 indx = floor(Nspk*rand(1,Nspk)) + 1;
0141 lfptmp = mean(Err(indx,:));
0142 if N > 5
0143 lfptmp = locsmooth(lfptmp,N,fix(N/2));
0144 end
0145 blfp = blfp + lfptmp;
0146 slfp = slfp + lfptmp.^2;
0147 end
0148 stdlfp = sqrt((slfp/Nboot - blfp.^2/Nboot^2));
0149 end
0150
0151 s = mlfp-mean(mlfp);
0152 E = stdlfp;
0153 t = t1;
0154
0155
0156 if plt == 'n';return;end
0157 plot(t1,s,plt)
0158 xax = get(gca,'xlim');
0159
0160 if err == 1
0161 me = real(2*mean(stdlfp));
0162 line(xax,me*[1 1],'color','b')
0163 line(xax,-me*[1 1],'color','b')
0164 line(xax,0*[1 1],'color','k')
0165
0166
0167
0168 end
0169
0170 title(['spike triggered average : ' ...
0171 num2str(Nspk) ' used : ' ...
0172 ' Errorbars are two std err']);
0173
0174 line([0 0],get(gca,'ylim'),'color','k')
0175 hold off
0176
0177
0178
0179
0180
0181
0182
0183