mirror of
https://github.com/c-sooyoung/fold_slice.git
synced 2026-09-17 19:39:08 +09:00
254 lines
8.8 KiB
Matlab
254 lines
8.8 KiB
Matlab
% SHOW_TOMOGRAM_CUTS show cuts through the reconstructed volume
|
||
%
|
||
% show_tomogram_cuts(tomogram, scanstomo, par, extra_string = '' )
|
||
%
|
||
% Inputs:
|
||
% **tomogram - reconstructed volume
|
||
% **scanstomo - scan numbers, only for naming
|
||
% **par - parameter structure
|
||
% **extra_string - string added to the saved name , default = ''
|
||
|
||
%*-----------------------------------------------------------------------*
|
||
%| |
|
||
%| Except where otherwise noted, this work is licensed under a |
|
||
%| Creative Commons Attribution-NonCommercial-ShareAlike 4.0 |
|
||
%| International (CC BY-NC-SA 4.0) license. |
|
||
%| |
|
||
%| Copyright (c) 2017 by Paul Scherrer Institute (http://www.psi.ch) |
|
||
%| |
|
||
%| Author: CXS group, PSI |
|
||
%*-----------------------------------------------------------------------*
|
||
% You may use this code with the following provisions:
|
||
%
|
||
% If the code is fully or partially redistributed, or rewritten in another
|
||
% computing language this notice should be included in the redistribution.
|
||
%
|
||
% If this code, or subfunctions or parts of it, is used for research in a
|
||
% publication or if it is fully or partially rewritten for another
|
||
% computing language the authors and institution should be acknowledged
|
||
% in written form in the publication: "Data processing was carried out
|
||
% using the "cSAXS matlab package" developed by the CXS group,
|
||
% Paul Scherrer Institut, Switzerland."
|
||
% Variations on the latter text can be incorporated upon discussion with
|
||
% the CXS group if needed to more specifically reflect the use of the package
|
||
% for the published work.
|
||
%
|
||
% A publication that focuses on describing features, or parameters, that
|
||
% are already existing in the code should be first discussed with the
|
||
% authors.
|
||
%
|
||
% This code and subroutines are part of a continuous development, they
|
||
% are provided "as they are" without guarantees or liability on part
|
||
% of PSI or the authors. It is the user responsibility to ensure its
|
||
% proper use and the correctness of the results.
|
||
|
||
|
||
|
||
function show_tomogram_cuts(tomogram, scanstomo, par, extra_string)
|
||
import math.*
|
||
|
||
if nargin < 4
|
||
extra_string = '';
|
||
end
|
||
|
||
|
||
if isa(tomogram, 'gpuArray')
|
||
tomogram = gather(tomogram);
|
||
end
|
||
|
||
if par.makemovie % Open movie file
|
||
movie_filename = fullfile(par.output_folder,['tomo_movie_', par.scale '_' par.scans_string '_' extra_string ...
|
||
'_movie_axis_' sprintf('%01d',par.displayaxis) '.avi']);
|
||
|
||
if exist(movie_filename,'file')
|
||
disp(['File ' movie_filename ' exists,' ])
|
||
userans = input('Do you want to overwrite (y/N)? ','s');
|
||
if strcmpi(userans,'y')
|
||
utils.verbose(0,['Saving movie to ' movie_filename]);
|
||
|
||
else
|
||
utils.verbose(0,['Did not save ' movie_filename])
|
||
return
|
||
end
|
||
else
|
||
utils.verbose(0,['Saving movie to ' movie_filename]);
|
||
end
|
||
writeobj = VideoWriter(movie_filename);
|
||
writeobj.Quality=90;
|
||
writeobj.FrameRate=5;
|
||
open(writeobj);
|
||
end
|
||
|
||
% If displayslices is empty show central slice
|
||
if isempty(par.displayslice)&&(~par.animatedslices)
|
||
utils.verbose(1,'Displaying central slice along axis %i', par.displayaxis)
|
||
par.displayslice = round(size(tomogram,par.displayaxis)/2);
|
||
end
|
||
|
||
par.displayslice = unique(max(1,min(size(tomogram,par.displayaxis),round(par.displayslice))));
|
||
|
||
% Determine range of tomogram
|
||
switch num2str(par.tomobaraxis)
|
||
case 'auto_per_frame'
|
||
autobar = true;
|
||
slices_ind = {':', ':', ':'};
|
||
slices_ind{par.displayaxis} = par.displayslice;
|
||
par.tomobaraxis = sp_quantile(tomogram(slices_ind{:}), [1e-4, 1-1e-4],5);
|
||
case 'auto'
|
||
autobar = true;
|
||
% ignore outliers
|
||
par.tomobaraxis = sp_quantile(tomogram, [1e-4, 1-1e-4],ceil(max(10, sqrt(numel(tomogram))/100)));
|
||
% full range
|
||
%par.tomobaraxis = [min(tomogram(:), max(tomogram(:))];
|
||
otherwise
|
||
autobar = false;
|
||
end
|
||
switch lower(par.scale)
|
||
case 'phase'
|
||
if autobar
|
||
par.tomobaraxis = par.tomobaraxis/par.factor;
|
||
tomogram = tomogram / par.factor;
|
||
end
|
||
strscale = 'phase';
|
||
case 'delta'
|
||
strscale = 'delta';
|
||
case 'edensity'
|
||
if autobar
|
||
par.tomobaraxis = sort(par.tomobaraxis*par.factor_edensity);
|
||
end
|
||
strscale = 'electron density [e/A^3]';
|
||
case 'amp'
|
||
strscale = 'amplitude';
|
||
case 'beta'
|
||
strscale = 'beta';
|
||
case ''
|
||
strscale = '';
|
||
otherwise
|
||
error('scale should be phase, delta, amp, beta or edensity')
|
||
end
|
||
|
||
%%% Here the option for showing animation
|
||
if par.average_slices == 1
|
||
par.animatedslices = 0;
|
||
end
|
||
if par.animatedslices
|
||
par.displayslice = [1:size(tomogram,par.displayaxis)];
|
||
end
|
||
|
||
if par.average_slices == 0
|
||
loopdisplayslice = par.displayslice;
|
||
elseif par.average_slices == 1
|
||
loopdisplayslice = 1;
|
||
end
|
||
|
||
fig = plotting.smart_figure(1);
|
||
clf()
|
||
if par.windowautopos
|
||
screensize = get( 0, 'Screensize' );
|
||
set(gcf,'Outerposition',[1 screensize(4)-650 640 665]);
|
||
par.windowautopos = false;
|
||
end
|
||
rect = get(fig,'Position');
|
||
rect(1:2) = [0 0];
|
||
|
||
for showslice = loopdisplayslice
|
||
% Determine sagital, coronal or axial slices
|
||
slice = {':',':',':'};
|
||
if loopdisplayslice==1
|
||
slice{par.displayaxis} = par.displayslice;
|
||
else
|
||
slice{par.displayaxis} = showslice;
|
||
end
|
||
if showslice > size(tomogram,par.displayaxis)
|
||
continue
|
||
end
|
||
sliceview = squeeze(mean(tomogram(slice{:}),par.displayaxis))';
|
||
if par.displayaxis == 3
|
||
sliceview = sliceview';
|
||
end
|
||
sectionstring = {'Coronal','Sagital', 'Axial'};
|
||
sectionstring = sectionstring{par.displayaxis};
|
||
|
||
|
||
switch lower(par.scale)
|
||
case 'phase'
|
||
sliceview = sliceview/par.factor;
|
||
case 'delta'
|
||
|
||
case 'edensity'
|
||
sliceview = sliceview*par.factor_edensity;
|
||
case 'amp'
|
||
case 'beta'
|
||
case ''
|
||
otherwise
|
||
error('scale should be phase, delta, amp, beta or edensity')
|
||
end
|
||
|
||
|
||
if ~par.realaxis
|
||
imagesc(sliceview)
|
||
else
|
||
xaux = ([1 size(sliceview,2)]-size(sliceview,2)/2)*par.pixel_size*1e6;
|
||
yaux = ([1 size(sliceview,1)]-size(sliceview,1)/2)*par.pixel_size*1e6;
|
||
imagesc(xaux,yaux,sliceview)
|
||
xlabel('microns')
|
||
ylabel('microns')
|
||
end
|
||
axis xy image
|
||
c = colormap(par.colormapchoice);
|
||
if par.reverse_contrast
|
||
c = flipud(c);
|
||
colormap(c);
|
||
end
|
||
caxis(sort(par.tomobaraxis))
|
||
h = colorbar;
|
||
ylabel(h, strscale)
|
||
|
||
if (~isempty(par.bar_length))&&par.realaxis %% Show scale bar
|
||
hold on
|
||
axisaux = axis;
|
||
rectangle('Position', [axisaux(1)+par.bar_start_point(1)*1e6 axisaux(3)+par.bar_start_point(2)*1e6 par.bar_length*1e6 par.bar_height*1e6], ...
|
||
'facecolor',par.bar_color,'edgecolor','none')
|
||
text(axisaux(1)+par.bar_start_point(1)*1e6,...
|
||
axisaux(3)+par.bar_start_point(2)*1e6+par.bar_height*2e6,...
|
||
[num2str(par.bar_length*1e6) ' microns'],'Color',par.bar_color,'FontSize',12);
|
||
hold off
|
||
end
|
||
if par.average_slices == 1
|
||
title(strrep(sprintf(['Tomogram ' strscale ': ' par.scans_string, ...
|
||
' ' sectionstring ' section: \n Average slices ' num2str(par.displayslice(1)) ' to ' num2str(par.displayslice(end))]),'_', '\_'))
|
||
else
|
||
title(['Tomogram ' strscale ': ' strrep(par.scans_string, '_', '\_') ...
|
||
' ' sectionstring ' section: Slice ' num2str(showslice)])
|
||
end
|
||
|
||
drawnow
|
||
if par.makemovie
|
||
currFrame = getframe(fig,rect);
|
||
writeVideo(writeobj,currFrame);
|
||
end
|
||
pause(par.pausetime)
|
||
|
||
|
||
end
|
||
|
||
|
||
if par.makemovie == 1
|
||
close(writeobj);
|
||
end
|
||
|
||
if par.writesnapshots && ~debug()
|
||
output_path = fullfile(par.output_folder,['tomo_cut_', par.scans_string '_' par.scale '_' extra_string '_' num2str(size(sliceview,1)) 'x' num2str(size(sliceview,2)) '_axis_' num2str(par.displayaxis)]);
|
||
|
||
if par.average_slices == 1
|
||
output_path = [output_path, '_average_slices_' num2str(par.displayslice(1)) '_to_' num2str(par.displayslice(end))];
|
||
else
|
||
output_path = [output_path, '_slice_' num2str(showslice)];
|
||
end
|
||
fprintf('Writting image files \n %s.png \n %s.eps\n',output_path,output_path);
|
||
print('-f1','-dpng','-r300',[output_path,'.png']);
|
||
print('-f1','-depsc2',[output_path,'.eps']);
|
||
end
|
||
|
||
end
|