Home > chronux_1_1 > hybrid > sta.m

sta

PURPOSE ^

Spike Triggered Average

SYNOPSIS ^

function[s,t,E] = sta(data_spk,data_lfp,smp,plt,w,T,D,err)

DESCRIPTION ^

 Spike Triggered Average                            
     Usage: [s,t,E] = sta(data_spk,data_lfp,smp,plt,w,T,D,err)
     
 Inputs                                              
                                                    
 Note that all times have to be consistent. If data_spk
 is in seconds, so must be sig and t. If data_spk is in 
 samples, so must sig and t. The default is seconds.

 data_spk    - strucuture array of spike times data 
               or NaN padded matrix
 data_lfp    - array of lfp data(samples x trials)         
                                                    
 Optional...                                        
 plt 'n'|'r' etc                                    
 width kernel smoothing in s                        
 T = [-0.1 0.1] - extract this range about each spk 
 D = plot spike triggered average out to [D1 D2]    
 err = calcluate error bars (bootstrap)             
                                                    
 Outputs:                                             
                                                    
 s  spike triggered average                         
 t  times                                           
 E  bootstrap standard err

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function[s,t,E] = sta(data_spk,data_lfp,smp,plt,w,T,D,err)
0002 % Spike Triggered Average
0003 %     Usage: [s,t,E] = sta(data_spk,data_lfp,smp,plt,w,T,D,err)
0004 %
0005 % Inputs
0006 %
0007 % Note that all times have to be consistent. If data_spk
0008 % is in seconds, so must be sig and t. If data_spk is in
0009 % samples, so must sig and t. The default is seconds.
0010 %
0011 % data_spk    - strucuture array of spike times data
0012 %               or NaN padded matrix
0013 % data_lfp    - array of lfp data(samples x trials)
0014 %
0015 % Optional...
0016 % plt 'n'|'r' etc
0017 % width kernel smoothing in s
0018 % T = [-0.1 0.1] - extract this range about each spk
0019 % D = plot spike triggered average out to [D1 D2]
0020 % err = calcluate error bars (bootstrap)
0021 %
0022 % Outputs:
0023 %
0024 % s  spike triggered average
0025 % t  times
0026 % E  bootstrap standard err
0027 
0028 if nargin < 3;error('Require spike, lfp and lfp times');end
0029 if isstruct(data_spk)
0030    [data_spk]=padNaN(data_spk); % create a zero padded data matrix from input structural array
0031    sz=size(data_spk); 
0032    if sz(1)>sz(2); data_spk=data_spk'; end;% transpose data to get in form compatible with Murray's routine
0033 else
0034    if sz(1)>sz(2); data_spk=data_spk'; end;% transpose data to get in form compatible with Murray's routine
0035 end
0036 sz=size(data_lfp);
0037 if sz(1)>sz(2); data_lfp=data_lfp'; end;% transpose data to get in form compatible with Murray's routine
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 % count up the spikes...
0070 
0071 if err
0072   for n=1:NT
0073     indx = find(t>T(1)&t<T(2));
0074 %     lfp = data_lfp(n,indx);
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 % local smoother...
0127 
0128 N = fix(w/smp);
0129 if N > 5
0130   mlfp = locsmooth(mlfp,N,fix(N/2)); 
0131 end
0132 
0133 % bootstrap errorbars...
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 %cols = 'krbgycm';
0156 if plt == 'n';return;end
0157 plot(t1,s,plt)
0158 xax = get(gca,'xlim');
0159 %yax = get(gca,'ylim');
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 %  errorbar(0.1*xax(2)+0.9*xax(1),0.1*yax(2)+0.9*yax(1), ...
0166 %         mean(stdlfp),'k')
0167 %plot(0.1*xax(2)+0.9*xax(1),0.1*yax(2)+0.9*yax(1),'k.')
0168 end
0169      
0170 title(['spike triggered average : ' ...
0171       num2str(Nspk) ' used : '     ...
0172       ' Errorbars are two std err']);
0173 %line(get(gca,'xlim'),mean(mlfp)*[1 1],'color','k')
0174 line([0 0],get(gca,'ylim'),'color','k')
0175 hold off
0176 
0177 
0178 
0179 
0180 
0181 
0182 
0183

Generated on Sun 13-Aug-2006 11:49:44 by m2html © 2003