0001 function [templates,correlations,eigenvalues,eigenvectors] = ActivityTemplates(spikes,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 bins = [];
0042 defaultBinSize = 0.050;
0043 binSize = [];
0044 overlap = [];
0045
0046
0047 if nargin < 1,
0048 error('Incorrect number of parameters (type ''help <a href="matlab:help ActivityTemplates">ActivityTemplates</a>'' for details).');
0049 end
0050
0051 if ~isdmatrix(spikes,'@2'),
0052 error('Parameter ''spikes'' is not a Nx2 matrix (type ''help <a href="matlab:help ActivityTemplates">ActivityTemplates</a>'' for details).');
0053 end
0054
0055 for i = 1:2:length(varargin),
0056 if ~ischar(varargin{i}),
0057 error(['Parameter ' num2str(i+2) ' is not a property (type ''help <a href="matlab:help ActivityTemplates">ActivityTemplates</a>'' for details).']);
0058 end
0059 switch(lower(varargin{i})),
0060 case 'binsize',
0061 binSize = varargin{i+1};
0062 if ~isdscalar(binSize,'>0'),
0063 error('Incorrect value for property ''binSize'' (type ''help <a href="matlab:help ActivityTemplates">ActivityTemplates</a>'' for details).');
0064 end
0065 case 'bins',
0066 bins = varargin{i+1};
0067 if ~isdmatrix(bins,'@2'),
0068 error('Incorrect value for property ''bins'' (type ''help <a href="matlab:help ActivityTemplates">ActivityTemplates</a>'' for details).');
0069 end
0070 otherwise,
0071 error(['Unknown property ''' num2str(varargin{i}) ''' (type ''help <a href="matlab:help ActivityTemplates">ActivityTemplates</a>'' for details).']);
0072 end
0073 end
0074
0075
0076 if ~isempty(binSize) && ~isempty(bins),
0077 error('Parameters ''binSize'' and ''bins'' are incompatible (type ''help <a href="matlab:help ActivityTemplates">ActivityTemplates</a>'' for details).');
0078 end
0079 if isempty(binSize) && isempty(bins),
0080 binSize = defaultBinSize;
0081 end
0082
0083 templates = NaN;
0084 correlations = NaN;
0085 eigenvalues = NaN;
0086
0087 nUnits = max(spikes(:,2));
0088 if isempty(nUnits), return; end
0089
0090
0091 spikes = sortrows(spikes,1);
0092 id = spikes(:,2);
0093
0094
0095 if isempty(bins),
0096 spikes(:,1) = spikes(:,1) - spikes(1,1);
0097 bins = (0:binSize:(spikes(end,1)-binSize))';
0098 bins(:,2) = bins+binSize;
0099 else
0100 m = min([min(spikes(:,1)) min(bins(:))]);
0101 spikes(:,1) = spikes(:,1) - m;
0102 bins = bins - m;
0103 end
0104
0105
0106 nBins = size(bins,1);
0107 if isempty(nBins), return; end
0108 n = zeros(nBins,nUnits);
0109 for unit = 1:nUnits,
0110 n(:,unit) = CountInIntervals(spikes(id==unit,1),bins);
0111 end
0112
0113
0114 n = zscore(n);
0115 correlations = (1/(nBins-1))*n'*n;
0116
0117
0118 [eigenvectors,eigenvalues] = eig(correlations);
0119 [eigenvalues,i] = sort(diag(eigenvalues),'descend');
0120 eigenvectors = eigenvectors(:,i);
0121
0122
0123
0124 q = nBins/nUnits;
0125 if q < 1,
0126 warning('Not enough time bins to determine significant templates');
0127 eigenvalues = NaN;
0128 end
0129 lambdaMax = (1+sqrt(1/q))^2;
0130 significant = eigenvalues>lambdaMax;
0131 eigenvectors = eigenvectors(:,significant);
0132 templates = zeros(nUnits,nUnits,sum(significant));
0133 for i = 1:sum(significant),
0134 templates(:,:,i) = eigenvectors(:,i)*eigenvectors(:,i)';
0135 templates(:,:,i) = templates(:,:,i) - diag(diag(templates(:,:,i)));
0136 end