% savedSpikesTimes# = cell array with cell arrays with spike times % runIdx# = index into first cell array, which runs to use % cellIdx# = index into second cell array, which two cells to use % maxTime = length in seconds of each run % nBins = number of bins (eg 200) function [numSCCC, numDiffs, edges] = ... makeSCCCplot(savedSpikeTimes1, runIdx1, cellIdx1, ... savedSpikeTimes2, runIdx2,cellIdx2, ... maxTime, nBins, figNum) if(length(runIdx1) ~= length(runIdx2)) sprintf('runIdx1 = %d\nrunIdx2 = %d\nLengths do not match!', ... runIdx1, runIdx2) keyboard end nRuns = length(runIdx1); % Extract the relevant spike information for i=1:nRuns spikeTimesA{i} = savedSpikeTimes1{runIdx1(i)}{cellIdx1}; spikeTimesB{i} = savedSpikeTimes2{runIdx2(i)}{cellIdx2}; end % Make Shuffle Corrected Cross Correlogram (SCCC) tDiffs = []; ctDiffs = []; for i=1:nRuns nA = length(spikeTimesA{i}); nB = length(spikeTimesB{i}); timeDiffs = repmat(spikeTimesA{i}, 1, nB) ... - repmat(spikeTimesB{i}',nA,1); % Matlab is a bit too clever, if input is a row, find will return % a row, but if the matrix has more than two rows, it will return % a column, so we need to make sure the first case also returns a % column... if(size(timeDiffs,1) == 1) timeDiffs = timeDiffs'; end % To reduce size of timeDiffs, just keep spike pairs that are % within 250 of one another, this still keeps waaay too many pairs tDiffs = [tDiffs; timeDiffs(find(abs(timeDiffs) < 250e-3))]; % Generate shuffle correction timediffs to remove bias % the idea is that by shifting one spike trace n periods % any short time correlations are broken offsets = 0.5:0.5:(maxTime-0.5); nOfs = length(offsets); for ofs = offsets corrTimeDiffs = repmat(spikeTimesA{i}, 1, nB) ... - repmat(spikeTimesB{i}',nA,1) + ofs; addCtDiffs = corrTimeDiffs(find(abs(corrTimeDiffs) < 250e-3)); if(size(addCtDiffs,1) == 1) addCtDiffs = addCtDiffs'; end ctDiffs = [ctDiffs; addCtDiffs]; end end % Generate the plot % nBins = 200; edges = linspace(-0.25,0.25,nBins); numDiffs = histc(tDiffs, edges); % spike diff historgram numDiffsC = histc(ctDiffs, edges); % correction % keyboard [rn,cn] = size(numDiffs); if(rn < cn) numDiffs = numDiffs'; end [rn,cn] = size(numDiffsC); if(rn < cn) numDiffsC = numDiffsC'; end if(~isempty(numDiffs) & ~isempty(numDiffsC)) numSCCC = numDiffs - numDiffsC/nOfs; else disp('numDiffs and/or numDiffsC is empty') numSCCC = zeros(size(edges)); end if(isempty(numDiffs)) numDiffs = zeros(size(edges)); end if(isempty(numDiffsC)) numDiffsC = zeros(size(edges)); end if(figNum > 0) figure(figNum), clf subplot(2,1,1) bar(edges, numDiffs, 'histc') title('Raw spike difference') subplot(2,1,2) bar(edges, numSCCC, 'histc') end