Files
2026-08-07 15:56:42 +09:00

110 lines
3.5 KiB
Matlab

%view_probe_variation.m
close all
clear
addpath(strcat(pwd,'/utils/'))
% load a .mat reconstruction file w. probe variation correction
%% calculate probes at each scan positions
Np_p = [size(probe,1),size(probe,2)];
probes = reshape(probe(:,:,1,:),prod(Np_p),[]);
probes = reshape(probes * outputs.probe_evolution', Np_p(1), Np_p(2), []);
%% generate a movie to show scan positions and probes
disp('Generating movie frames')
figure1 = figure('Color',[1 1 1],'OuterPosition',[100 100 1800 600]);
clear M
object_roi = object(p.object_ROI{:},:);
N_sample = 1;
N_frames = 120;
%N_frames = floor(size(outputs.probe_positions(:,1),1)/N_sample);
%scale = p.dx_spec*1e6; % x-ray
%unit_label = '\mum'; % x-ray
scale = p.dx_spec; % electron
unit_label = 'A';
for i=1:N_frames
clf()
subplot(1,2,1)
aobject = angle(object);
range = sp_quantile(angle(object_roi), [1e-3, 1-1e-3],10);
aobject = (aobject - range(1)) / (range(2) - range(1));
Np_o = size(object);
grids = {(-ceil(Np_o(2)/2):ceil(Np_o(2)/2)-1)*scale(2), ...
(-ceil(Np_o(1)/2):ceil(Np_o(1)/2)-1)*scale(1)};
imagesc(grids{:}, aobject, [-2, 1]); % reduce contrast
colormap bone
axis xy
hold on
pos = outputs.probe_positions;
pos_0 = outputs.probe_positions_0;
pos_scales = pos .* scale([2,1]);
pos_scales_0 = pos_0 .* scale([2,1]);
scatter( pos_scales(:,1), pos_scales(:,2),'.r')
scatter( pos_scales_0(:,1), pos_scales_0(:,2),10, '.','MarkerEdgeColor','b')
scatter( pos_scales(1+(i-1)*N_sample,1), pos_scales(1+(i-1)*N_sample,2),50,'ok','filled')
axis equal xy tight
range = [min(pos_scales(:,1)), max(pos_scales(:,1)), min(pos_scales(:,2)), max(pos_scales(:,2))];
axis(range)
title(['\fontsize{12}{\color{blue}initial positions, '...
'\color{red}refined positions, \color{black}current probe position}'])
ylabel(['Position [', unit_label, ']'])
subplot(1,2,2)
imagesc_hsv(probes(:,:,1+(i-1)*N_sample),'stabilize_phase',false)
axis off
title('primary probe mode')
drawnow;
M(i) = getframe(gcf);
end
disp('Done')
%% save movie
disp('Saving movie...')
movieName = strcat('probes_selected.avi');
v= VideoWriter(movieName);
v.FrameRate= 5;
open(v)
writeVideo(v,M);
close(v)
disp('Done')
%% plot OPR modes (U)
N_vp = size(probe,4)-1;
figure
ax(1)=subplot(2,1+N_vp,1);
imagesc_hsv(probe(:,:,1,1),'stabilize_phase',false)
axis xy off
title('Constant mode')
for ii = 2:N_vp+1
ax(ii)=subplot(2,1+N_vp,ii);
imagesc_hsv(probe(:,:,1,ii),'stabilize_phase',false)
axis xy off
title(sprintf('Variable mode %i', ii-1))
end
for ii = 1:N_vp+1
ax(ii+1+N_vp)=subplot(2,1+N_vp,1+N_vp+ii);
scatter(outputs.probe_positions(:,1)*p.dx_spec(1),outputs.probe_positions(:,2)*p.dx_spec(1),[],outputs.probe_evolution(:,ii));
%axis xy off
title(strcat('Average weights:', num2str(mean(outputs.probe_evolution(:,ii)))))
%title(strcat(num2str(mean(outputs.probe_evolution(:,ii)))))
end
%% save probes as a tiff stack
Np_p = [size(probe,1),size(probe,2)];
probes = reshape(probe(:,:,1,:),prod(Np_p),[]);
probes = reshape(probes * outputs.probe_evolution', Np_p(1), Np_p(2), []);
resampleFactor = round(size(probes,3)/200); %only save ~100 images
probes_temp = probes(:,:,1:resampleFactor:end);
saveName = strcat(reconDir,'probes_Niter',num2str(Niter),'.tiff');
imwrite(convert_to_rgb(probes_temp(:,:,1)), saveName,'tiff')
for i=2:size(probes_temp,3)
imwrite(convert_to_rgb(probes_temp(:,:,i)), saveName,'tiff', 'WriteMode','append')
end