diff --git a/functions/CellSortLoadTrials.m b/functions/CellSortLoadTrials.m index ec7a38e..12f32e1 100644 --- a/functions/CellSortLoadTrials.m +++ b/functions/CellSortLoadTrials.m @@ -18,7 +18,6 @@ data_r{i} = readTiff(redFiles(i).name); data_g{i} = readTiff(greenFiles(i).name); end -disp('Finished Loading Trial Files..'); %put them in single arrays numFrames = 0; @@ -38,7 +37,6 @@ data_g_array(:,:,(numFrameList(i)+1):numFrameList(i+1)) = data_g{i}; data_g{i} = []; end -disp('Finished Creating Big Data Set'); %do shift correction again and assume that all trials thereself are already %corrected, so do corretion on medianprojection of complete files! @@ -46,7 +44,7 @@ %calculate medianprojection of first intervall reference = median(data_r_array(:,:,numFrameList(1)+1:numFrameList(1+1)),3); %do shift correction on complete video +disp('Performing Shift Correction On All Frames..'); [data_g_array, data_r_array] = CellSortShiftCorrection(data_g_array,data_r_array,reference, 'iter'); -disp('Finished Performing Shift Correction On All Trials..'); disp('Finished Loading Trial Files!'); end \ No newline at end of file diff --git a/functions/alternativePlot.m b/functions/alternativePlot.m index a2acf43..543d6f9 100644 --- a/functions/alternativePlot.m +++ b/functions/alternativePlot.m @@ -1,386 +1,178 @@ -function cell_sig_merged = alternativePlot(ica_segments, cluster, cell_sig, subPlotCols, sortedIdx, data_r, frames, fileNamesGreen, clusterSize, sweepDelay, sweepInterval, numberOfSweeps, sweepDuration,frameSteps) +function cell_sig_merged_array = alternativePlot(ica_segments, cluster, cell_sig, subPlotCols, sortedIdx, data_r, frames, fileNamesGreen, clusterSize, sweepDelay, sweepInterval, numberOfSweeps, sweepDuration,frameSteps) f = figure; -cm = colormap(jet); -tempImage = zeros(size(ica_segments, 2), size(ica_segments, 3), 3); - -for i = 1:subPlotCols - rgb = cm(round(64/subPlotCols * (i-1)+1),:); - for k = cluster{i} - mask = squeeze(ica_segments(sortedIdx(k),:,:)); - %transform mask to only outlines - mask = imfill(mask, 'holes'); - mask = bwboundaries(mask); - mask = mask{:}; - %create image with drawn lines between points - linemask = zeros(size(ica_segments, 2), size(ica_segments, 3)); - for l = 1:size(mask,1) - linemask(mask(l,1),mask(l,2)) = 1; - end - for rgbIdx = 1:3 - tempImage(:,:,rgbIdx) = tempImage(:,:,rgbIdx) + rgb(rgbIdx)*linemask; - end - end -end -%set pixels 0 which are smaller than 0, seems to happen in rare cases.. -for i = 1:3 - tempImage(:,:,i) = (tempImage(:,:,i) > 0).*tempImage(:,:,i); -end -tempImage = uint16(tempImage*65535); - -%calculate mean image -meanImage = mean(data_r,3); -maximum = max(meanImage(:)); -minimum = min(meanImage(:)); -meanImage = (meanImage - minimum)/(maximum-minimum); -meanImage = uint16(imadjust(meanImage, [0, 1], [0, 1], 0.4)*65535); - -%set meanImage zero in every pixel which is not equal 0 in tempImage -meanImage = meanImage.*uint16(tempImage(:,:,1) == 0); -meanImage = meanImage.*uint16(tempImage(:,:,2) == 0); -meanImage = meanImage.*uint16(tempImage(:,:,3) == 0); - -%copy meanImage in every colorchannel -for i = 1:3 - tempImage(:,:,i) = tempImage(:,:,i) + meanImage; -end - plot1 = subplot(1,2,1); -imshow(tempImage); - -%draw number in each roi -for i = 1:subPlotCols - for drawNumberCt = cluster{i} - number = sortedIdx(drawNumberCt); %get position to draw number in - mask = squeeze(ica_segments(number,:,:)); - cog = centerofgravity(mask); - text(cog(2), cog(1), num2str(i), 'Color', 'white', 'FontSize', 15) - - end -end - - - plot2 = subplot(1,2,2); -hold on -cell_sigPlot = cell_sig(sortedIdx,:); - -signal = zeros(size(cluster,2),size(cell_sig,2)); -for i = 1:size(cluster, 2) +drawEverything(1, subPlotCols, 1, size(cell_sig,2)); +for i=1:size(cluster, 2) cell_sig_merged{i} = cell_sig(sortedIdx,:); cell_sig_merged{i} = mean(cell_sig_merged{i}(cluster{i},:), 1); - for clusterIdx = cluster{i} - %subtract minimum value - minimum = min(cell_sigPlot(clusterIdx,:)); - cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) - minimum; - %norm cell signals - integral = median(cell_sigPlot(clusterIdx,:)); - cell_sigPlot(clusterIdx,:)=cell_sigPlot(clusterIdx,:)/abs(integral); - end - %mean value of all cluster signals - signal(i,:) = mean(cell_sigPlot(cluster{i},:), 1); - %add maximum position from signal from before - if i ~= 1 - %maximum = max(signal(i-1,:)); - maximum = max(max(cell_sigPlot(cluster{i-1},:))); - else - maximum = 0; - end - signal(i,:) = signal(i,:) + maximum; - rgb = cm(round(64/subPlotCols * (i-1)+1),:); - plot(signal(i,:), 'Color', rgb); - text(size(signal,2), maximum, num2str(i)) - %plot single components dotted - for clusterIdx = cluster{i} - cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) + maximum; - plot(cell_sigPlot(clusterIdx, :),':', 'Color', rgb); - end -end -xlim([0,size(signal,2)]); -%maximum = max(cell_sigPlot(:)); -ylim auto;%([0, maximum]); -%draw vertical lines -%ending of trials: -for i = 1:(size(frames,2)-1) - vline(frames(i), 'black', fileNamesGreen(i).name); - for s=1:numberOfSweeps - %draw begin of sweep - vline(frames(i)+sweepDelay+s*sweepInterval, 'b'); - %draw end of sweep - vline(frames(i)+sweepDelay+s*sweepInterval+sweepDuration, 'r'); - end end +%convert cell_sig_merged to array +cell_sig_merged_array = zeros(size(cell_sig_merged,2), size(cell_sig_merged{1},2)); +for i = 1:size(cell_sig_merged,2) + cell_sig_merged_array(i,:) = cell_sig_merged{i}; +end %% add slider %slider for selection of signals -b = uicontrol('Parent',f,'Style','slider',... +imageSlider = uicontrol('Parent',f,'Style','slider',... 'value',0, 'min',0, 'max', ceil(size(cell_sig_merged,2)/clusterSize),... 'SliderStep', [1 1]/(ceil(size(cell_sig_merged,2)/clusterSize)),'Callback', @redrawPlot,... 'units','normalized','Position',[0.1 0.01 0.3 0.03]); %slider for selection of x interval of right plot -c = uicontrol('Parent',f,'Style','slider',... +plotSlider = uicontrol('Parent',f,'Style','slider',... 'value',0, 'min',0, 'max', ceil(size(cell_sig_merged{1},2)/frameSteps),... 'SliderStep', [1 1]/(ceil(size(cell_sig_merged{1},2)/frameSteps)),'Callback', @redrawPlot,... 'units','normalized','Position',[0.6 0.01 0.3 0.03]); - function redrawPlot(source,~) - val = round(source.Value); + function redrawPlot(~,~) + val1 = round(imageSlider.Value); + val2 = round(plotSlider.Value); - if source == b - if val == 0 - %plot all - tempImage = zeros(size(ica_segments, 2), size(ica_segments, 3), 3); - - for i = 1:subPlotCols - rgb = cm(round(64/subPlotCols * (i-1)+1),:); - for k = cluster{i} - mask = squeeze(ica_segments(sortedIdx(k),:,:)); - %transform mask to only outlines - mask = imfill(mask, 'holes'); - mask = bwboundaries(mask); - mask = mask{:}; - %create image with drawn lines between points - linemask = zeros(size(ica_segments, 2), size(ica_segments, 3)); - for l = 1:size(mask,1) - linemask(mask(l,1),mask(l,2)) = 1; - end - for rgbIdx = 1:3 - tempImage(:,:,rgbIdx) = tempImage(:,:,rgbIdx) + rgb(rgbIdx)*linemask; - end - end - end - %set pixels 0 which are smaller than 0, seems to happen in rare cases.. - for i = 1:3 - tempImage(:,:,i) = (tempImage(:,:,i) > 0).*tempImage(:,:,i); - end - tempImage = uint16(tempImage*65535); - - %calculate mean image - meanImage = mean(data_r,3); - maximum = max(meanImage(:)); - minimum = min(meanImage(:)); - meanImage = (meanImage - minimum)/(maximum-minimum); - meanImage = uint16(imadjust(meanImage, [0, 1], [0, 1], 0.4)*65535); - - %set meanImage zero in every pixel which is not equal 0 in tempImage - meanImage = meanImage.*uint16(tempImage(:,:,1) == 0); - meanImage = meanImage.*uint16(tempImage(:,:,2) == 0); - meanImage = meanImage.*uint16(tempImage(:,:,3) == 0); - - %copy meanImage in every colorchannel - for i = 1:3 - tempImage(:,:,i) = tempImage(:,:,i) + meanImage; - end - - plot1 = subplot(1,2,1); - imshow(tempImage); - - %draw number in each roi - for i = 1:subPlotCols - for drawNumberCt = cluster{i} - number = sortedIdx(drawNumberCt); %get position to draw number in - mask = squeeze(ica_segments(number,:,:)); - cog = centerofgravity(mask); - text(cog(2), cog(1), num2str(i), 'Color', 'white', 'FontSize', 15) - - end - end - - - - plot2 = subplot(1,2,2); - cla reset; - hold on - cell_sigPlot = cell_sig(sortedIdx,:); - - - - signal = zeros(size(cluster,2),size(cell_sig,2)); - for i = 1:size(cluster, 2) - cell_sig_merged{i} = cell_sig(sortedIdx,:); - cell_sig_merged{i} = mean(cell_sig_merged{i}(cluster{i},:), 1); - for clusterIdx = cluster{i} - %subtract minimum value - minimum = min(cell_sigPlot(clusterIdx,:)); - cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) - minimum; - %norm cell signals - integral = median(cell_sigPlot(clusterIdx,:)); - cell_sigPlot(clusterIdx,:)=cell_sigPlot(clusterIdx,:)/abs(integral); - end - %mean value of all cluster signals - signal(i,:) = mean(cell_sigPlot(cluster{i},:), 1); - %add maximum position from signal from before - if i ~= 1 - %maximum = max(signal(i-1,:)); - maximum = max(max(cell_sigPlot(cluster{i-1},:))); - else - maximum = 0; - end - signal(i,:) = signal(i,:) + maximum; - rgb = cm(round(64/subPlotCols * (i-1)+1),:); - plot(signal(i,:), 'Color', rgb); - text(size(signal,2), maximum, num2str(i)) - %plot single components dotted - for clusterIdx = cluster{i} - cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) + maximum; - plot(cell_sigPlot(clusterIdx, :),':', 'Color', rgb); - end - end - xlim([0,size(signal,2)]); - %maximum = max(cell_sigPlot(:)); - ylim auto;%([0, maximum]); - %draw vertical lines - %ending of trials: - for i = 1:(size(frames,2)-1) - vline(frames(i), 'black', fileNamesGreen(i).name); - for s=1:numberOfSweeps - %draw begin of sweep - vline(frames(i)+sweepDelay+s*sweepInterval, 'b'); - %draw end of sweep - vline(frames(i)+sweepDelay+s*sweepInterval+sweepDuration, 'r'); - end - end - - else - - if val == ceil(size(cell_sig_merged,2)/clusterSize) - iStart = (val - 1) * clusterSize + 1; - iEnd = subPlotCols; - else - iStart = (val - 1) * clusterSize + 1; - iEnd = clusterSize * val; - end - - %plot package of clusterSize - tempImage = zeros(size(ica_segments, 2), size(ica_segments, 3), 3); - - for i = iStart:iEnd - rgb = cm(round(64/subPlotCols * (i-1)+1),:); - for k = cluster{i} - mask = squeeze(ica_segments(sortedIdx(k),:,:)); - %transform mask to only outlines - mask = imfill(mask, 'holes'); - mask = bwboundaries(mask); - mask = mask{:}; - %create image with drawn lines between points - linemask = zeros(size(ica_segments, 2), size(ica_segments, 3)); - for l = 1:size(mask,1) - linemask(mask(l,1),mask(l,2)) = 1; - end - for rgbIdx = 1:3 - tempImage(:,:,rgbIdx) = tempImage(:,:,rgbIdx) + rgb(rgbIdx)*linemask; - end - end - end - %set pixels 0 which are smaller than 0, seems to happen in rare cases.. - for i = 1:3 - tempImage(:,:,i) = (tempImage(:,:,i) > 0).*tempImage(:,:,i); - end - tempImage = uint16(tempImage*65535); - - %calculate mean image - meanImage = mean(data_r,3); - maximum = max(meanImage(:)); - minimum = min(meanImage(:)); - meanImage = (meanImage - minimum)/(maximum-minimum); - meanImage = uint16(imadjust(meanImage, [0, 1], [0, 1], 0.4)*65535); - - %set meanImage zero in every pixel which is not equal 0 in tempImage - meanImage = meanImage.*uint16(tempImage(:,:,1) == 0); - meanImage = meanImage.*uint16(tempImage(:,:,2) == 0); - meanImage = meanImage.*uint16(tempImage(:,:,3) == 0); - - %copy meanImage in every colorchannel - for i = 1:3 - tempImage(:,:,i) = tempImage(:,:,i) + meanImage; + %determine intervals for each value + if val1 == ceil(size(cell_sig_merged,2)/clusterSize) + iStart = (val1 - 1) * clusterSize + 1; + iEnd = subPlotCols; + else + iStart = (val1 - 1) * clusterSize + 1; + iEnd = clusterSize * val1; + end + if val1 == 0 + iStart = 1; + iEnd = subPlotCols; + end + + if val2 == ceil(size(cell_sig_merged{1},2)/frameSteps) + kStart = (val2 - 1) * frameSteps + 1; + kEnd = size(cell_sig_merged{1},2); + else + kStart = (val2 - 1) * frameSteps + 1; + kEnd = frameSteps * val2; + end + if val2 == 0 + kStart = 1; + kEnd = size(cell_sig_merged{1},2); + end + + drawEverything(iStart, iEnd, kStart, kEnd); + end + + function drawEverything(imageStart, imageEnd, plotStart, plotEnd) + cm = colormap(jet); + tempImage = zeros(size(ica_segments, 2), size(ica_segments, 3), 3); + + for i = imageStart:imageEnd + rgb = cm(round(64/subPlotCols * (i-1)+1),:); + for k = cluster{i} + mask = squeeze(ica_segments(sortedIdx(k),:,:)); + %transform mask to only outlines + mask = imfill(mask, 'holes'); + mask = bwboundaries(mask); + mask = mask{:}; + %create image with drawn lines between points + linemask = zeros(size(ica_segments, 2), size(ica_segments, 3)); + for l = 1:size(mask,1) + linemask(mask(l,1),mask(l,2)) = 1; end - - plot1 = subplot(1,2,1); - imshow(tempImage); - - %draw number in each roi - for i = iStart:iEnd - for drawNumberCt = cluster{i} - number = sortedIdx(drawNumberCt); %get position to draw number in - mask = squeeze(ica_segments(number,:,:)); - cog = centerofgravity(mask); - text(cog(2), cog(1), num2str(i), 'Color', 'white', 'FontSize', 15) - - end + for rgbIdx = 1:3 + tempImage(:,:,rgbIdx) = tempImage(:,:,rgbIdx) + rgb(rgbIdx)*linemask; end + end + end + %set pixels 0 which are smaller than 0, seems to happen in rare cases.. + for i = 1:3 + tempImage(:,:,i) = (tempImage(:,:,i) > 0).*tempImage(:,:,i); + end + tempImage = uint16(tempImage*65535); + + %calculate mean image + meanImage = mean(data_r,3); + maximum = max(meanImage(:)); + minimum = min(meanImage(:)); + meanImage = (meanImage - minimum)/(maximum-minimum); + meanImage = uint16(imadjust(meanImage, [0, 1], [0, 1], 0.4)*65535); + + %set meanImage zero in every pixel which is not equal 0 in tempImage + meanImage = meanImage.*uint16(tempImage(:,:,1) == 0); + meanImage = meanImage.*uint16(tempImage(:,:,2) == 0); + meanImage = meanImage.*uint16(tempImage(:,:,3) == 0); + + %copy meanImage in every colorchannel + for i = 1:3 + tempImage(:,:,i) = tempImage(:,:,i) + meanImage; + end + + axes(plot1); + cla reset + imshow(tempImage); + + %draw number in each roi + for i = imageStart:imageEnd + for drawNumberCt = cluster{i} + number = sortedIdx(drawNumberCt); %get position to draw number in + mask = squeeze(ica_segments(number,:,:)); + cog = centerofgravity(mask); + text(cog(2), cog(1), num2str(i), 'Color', 'white', 'FontSize', 15) - - - plot2 = subplot(1,2,2); - cla reset - hold on - cell_sigPlot = cell_sig(sortedIdx,:); - - - - signal = zeros(size(cluster,2),size(cell_sig,2)); - for i = iStart:iEnd - cell_sig_merged{i} = cell_sig(sortedIdx,:); - cell_sig_merged{i} = mean(cell_sig_merged{i}(cluster{i},:), 1); - for clusterIdx = cluster{i} - %subtract minimum value - minimum = min(cell_sigPlot(clusterIdx,:)); - cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) - minimum; - %norm cell signals - integral = median(cell_sigPlot(clusterIdx,:)); - cell_sigPlot(clusterIdx,:)=cell_sigPlot(clusterIdx,:)/abs(integral); - end - %mean value of all cluster signals - signal(i,:) = mean(cell_sigPlot(cluster{i},:), 1); - %add maximum position from signal from before - if i ~= 1 - %maximum = max(signal(i-1,:)); - maximum = max(max(cell_sigPlot(cluster{i-1},:))); - else - maximum = 0; - end - signal(i,:) = signal(i,:) + maximum; - rgb = cm(round(64/subPlotCols * (i-1)+1),:); - plot(signal(i,:), 'Color', rgb); - text(size(signal,2), maximum, num2str(i)) - %plot single components dotted - for clusterIdx = cluster{i} - cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) + maximum; - plot(cell_sigPlot(clusterIdx, :),':', 'Color', rgb); - end - end - xlim([0,size(signal,2)]); - %maximum = max(cell_sigPlot(:)); - ylim auto;%([0, maximum]); - %draw vertical lines - %ending of trials: - for i = 1:(size(frames,2)-1) - vline(frames(i), 'black', fileNamesGreen(i).name); - for s=1:numberOfSweeps - %draw begin of sweep - vline(frames(i)+sweepDelay+s*sweepInterval, 'b'); - %draw end of sweep - vline(frames(i)+sweepDelay+s*sweepInterval+sweepDuration, 'r'); - end - end end - else - if val == ceil(size(cell_sig_merged{1},2)/frameSteps) - iStart = (val - 1) * frameSteps + 1; - iEnd = size(cell_sig_merged{1},2); + end + + + + axes(plot2); + cla reset + + hold on + cell_sigPlot = cell_sig(sortedIdx,:); + + + + signal = zeros(size(cluster,2),size(cell_sig,2)); + for i = imageStart:imageEnd + + for clusterIdx = cluster{i} + %subtract minimum value + minimum = min(cell_sigPlot(clusterIdx,:)); + cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) - minimum; + %norm cell signals + integral = median(cell_sigPlot(clusterIdx,:)); + cell_sigPlot(clusterIdx,:)=cell_sigPlot(clusterIdx,:)/abs(integral); + end + %mean value of all cluster signals + signal(i,:) = mean(cell_sigPlot(cluster{i},:), 1); + %add maximum position from signal from before + if i ~= 1 + %maximum = max(signal(i-1,:)); + maximum = max(max(cell_sigPlot(cluster{i-1},:))); else - iStart = (val - 1) * frameSteps + 1; - iEnd = frameSteps * val; + maximum = 0; end - if val == 0 - iStart = 1; - iEnd = size(cell_sig_merged{1},2); + signal(i,:) = signal(i,:) + maximum; + rgb = cm(round(64/subPlotCols * (i-1)+1),:); + plot(signal(i,:), 'Color', rgb); + text(size(signal,2), maximum, num2str(i)) + %plot single components dotted + for clusterIdx = cluster{i} + cell_sigPlot(clusterIdx,:) = cell_sigPlot(clusterIdx,:) + maximum; + plot(cell_sigPlot(clusterIdx, :),':', 'Color', rgb); + end + end + xlim([plotStart,plotEnd]); + %maximum = max(cell_sigPlot(:)); + ylim auto;%([0, maximum]); + %draw vertical lines + %ending of trials: + for i = 1:(size(frames,2)-1) + vline(frames(i), 'black', fileNamesGreen(i).name); + for s=1:numberOfSweeps + %draw begin of sweep + vline(frames(i)+sweepDelay+s*sweepInterval, 'b'); + %draw end of sweep + vline(frames(i)+sweepDelay+s*sweepInterval+sweepDuration, 'r'); end - - axes(plot2); - xlim([iStart,iEnd]); end end end \ No newline at end of file diff --git a/main.m b/main.m index 8428114..1ace0e6 100644 --- a/main.m +++ b/main.m @@ -99,7 +99,7 @@ %% Show results %optionally, plot signals figure(2) -CellsortICAplot('series', ica_filters, ica_sig, movm, tlims, dt, 1, 2, [1:size(ica_segments,1)], spt, spc); +CellsortICAplot('series', ica_filters, ica_sig, movm, tlims, dt, 1, 2, 1:20, spt, spc); %% caluclate correlation matrix for cell_sig clusterThreshold = 0.9; [ica_segments, cluster, subPlotCols, subPlotWidth, sortedIdx] = calcCorrEff(cell_sig, ica_segments, clusterThreshold); @@ -116,7 +116,7 @@ %number of time courses to show when slide bar is used clusterSize = 10; -frameSteps = 100; +frameSteps = 20; cell_sig_merged = alternativePlot(ica_segments, cluster, cell_sig, subPlotCols, sortedIdx, data_r, frames, fileNamesGreen, clusterSize, sweepDelay, sweepInterval, numberOfSweeps, sweepDuration, frameSteps);