initial commit

This commit is contained in:
2026-08-07 15:56:42 +09:00
commit 91ad25aca9
1012 changed files with 159314 additions and 0 deletions
+224
View File
@@ -0,0 +1,224 @@
% [mask_coord,bmask_ind] = choose_beamstop_mask(filename,varargin)
%*-----------------------------------------------------------------------*
%|                                                                       |
%|  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 [mask_coord,bmask_ind] = choose_beamstop_mask(filename,varargin)
import beamline.beamstop_mask
import plotting.image_show
% set default values for the variable input arguments:
% File with mask coordinates
filename_coord = '~/Data10/analysis/data/mask_coordinates.mat';
% border size
border = 3;
% save coordinates
save_coord = 1;
% select corrdinates
select_points = 1;
% do not read prevously saved coordinates
read_coord = 1;
% start with an empty set of coordinates
mask_coord = [];
bmask_ind = [];
% figure number for display
fig_no_sel = 555 ;
% run 'beamstop_mask' at the end
create_mask = 1;
% Arguments to be passed to imageshow
imageshow_args = {};
% check minimum number of input arguments
if (nargin < 1)
fprintf('\n');
fprintf('Usage:\n');
fprintf('%s(filename,[[<name>,<value>],...]);\n',mfilename);
fprintf('\n');
fprintf('The optional <name>,<value> pairs are:\n');
fprintf('''Border'', size of the ''sticky'' edge border, default is %d, 0 to disable\n',border);
fprintf('''SaveCoord'',<0-no,1-yes> 1 for saving the coordinates, default is %d\n',save_coord);
fprintf('''FilenameCoord'',<path and filename> Matlab file with the mask coordinates,\n');
fprintf(' default is %s\n',filename_coord);
fprintf('''SelectPoints'',<0-no,1-yes> 1 for selecting the points in the image, default is %d\n',select_points);
fprintf(' if 0, points should be either read from the file or \n');
fprintf(' supplied as options for ''beamstop_mask'' function\n');
fprintf('''ReadCoord'',<0-no,1-yes> 1 for reading the coordinates from the file, default is %d\n',read_coord);
fprintf('''CreateMask'',<0-no,1-yes> 1 for running ''beamstop_mask'', default is %d\n',create_mask);
fprintf('''FigNoSel'',<integer> number of the figure in which the coordinates are selected, default is %d\n',...
fig_no_sel);
fprintf('''ImageShowArgs'', cell additional parameters to be passed to image_show, default is an empty cell {} \n');
fprintf('\n');
fprintf('Additional <name>,<value> pairs recognized by ''beamstop_mask'' can be specified.\n');
error('At least the filename has to be specified as input parameter.');
end
% accept cell array with name/value pairs as well
no_of_in_arg = nargin;
if (nargin == 2)
if (isempty(varargin))
% ignore empty cell array
no_of_in_arg = no_of_in_arg -1;
else
if (iscell(varargin{1}))
% use a filled one given as first and only variable parameter
varargin = varargin{1};
no_of_in_arg = 1 + length(varargin);
end
end
end
% check number of input arguments
if (rem(no_of_in_arg,2) ~= 1)
display_help(filename_coord,save_coord,create_mask,select_points,border,read_coord,fig_no_sel);
error('The optional parameters have to be specified as ''name'',''value'' pairs');
end
% parse the variable input arguments
vararg_remain = cell(0,0);
for ind = 1:2:length(varargin)
name = varargin{ind};
value = varargin{ind+1};
switch name
case 'SaveCoord'
save_coord = value;
case 'Border'
border = value;
case 'SelectPoints'
select_points = value;
case 'ReadCoord'
read_coord = value;
case 'FilenameCoord'
filename_coord = value;
case 'FigNoSel'
fig_no_sel = value;
case 'xyCoord'
mask_coord = value;
case 'CreateMask'
create_mask = value;
case 'ImageShowArgs'
imageshow_args = value;
otherwise
vararg_remain{end+1} = name;
vararg_remain{end+1} = value;
end
end
% Read the coordinates from the file
if (read_coord == 1)
if (exist(filename_coord,'file'))
load(filename_coord);
% don't use if there are less than two points in the mask
% makes it impossible to add new points
if size(mask_coord,1) < 2
mask_coord = [];
end
else
fprintf('Mask coordinates file %s was not found.\n',filename_coord);
fprintf('Continuing with no starting mask.\n');
end
end
% select/change the mask coordinates in the image
if (select_points == 1)
[qq] = image_show(filename,'FigNo',fig_no_sel, imageshow_args{:});
% h=impoly(gca,mask_coord);
% mask_coord=getPosition(h);
% addNewPositionCallback(h,@(pos)eval('mask_coord=pos;'));
% % wait for the changes while the image is open
% waitfor(fig_no_sel)
msgbox({'Instructions:', '1) Create a closed polygon around the beamstop (don''t double-click when you finish)'...
, '2) Adjust the corners of polygon if needed',...
'3) Double-click on polygon to finish'},'Choose beamstop mask');
h = impoly(gca,mask_coord);
mask_coord = wait(h);
% move points to the edge
if border
im_dim(1) = size(qq.data,2);
im_dim(2) = size(qq.data,1);
for jj = 1:size(mask_coord,1)
for kk = 1:2
if mask_coord(jj,kk) < border
mask_coord(jj,kk) = 0;
end
if abs(mask_coord(jj,kk) - im_dim(kk)) < border
mask_coord(jj,kk) = im_dim(kk);
end
end
end
end
% mask coordinates should be integers
mask_coord = round(mask_coord);
end
% save the mask coordinates file, if specified
if save_coord
% create a backup of the mask coordinates file
if (exist(filename_coord,'file'))
filename_coord_backup = [ filename_coord '.bak' ];
fprintf('Copying the current mask coordinates file %s to %s\n',filename_coord,...
filename_coord_backup);
copyfile(filename_coord,filename_coord_backup);
end
fprintf('saving updated mask coordinates file %s\n',filename_coord);
save(filename_coord,'mask_coord');
end
% run the beamstop_mask function, if specified
if create_mask
vararg_remain{end+1} = 'xyCoord';
vararg_remain{end+1} = mask_coord;
bmask_ind = beamstop_mask(filename,vararg_remain{:},imageshow_args{:});
end