mirror of
https://github.com/c-sooyoung/fold_slice.git
synced 2026-09-17 18:29:08 +09:00
352 lines
9.7 KiB
Matlab
352 lines
9.7 KiB
Matlab
%INITIAL_CHECKS set default values for the most common variables
|
|
%
|
|
% ** p p structure
|
|
%
|
|
% returns:
|
|
% ++ p p structure
|
|
%
|
|
% see also: core.initialize_ptycho
|
|
%
|
|
|
|
function [p] = initial_checks(p)
|
|
|
|
|
|
import utils.*
|
|
import io.*
|
|
|
|
%%%%%%%%%%%%%
|
|
%% General %%
|
|
%%%%%%%%%%%%%
|
|
|
|
% check matlab version
|
|
check_matlab_version('9.3');
|
|
|
|
if ~isfield(p, 'use_display') || isempty(p.use_display)
|
|
if verbose > 1
|
|
p.use_display = true;
|
|
else
|
|
p.use_display = false;
|
|
end
|
|
end
|
|
|
|
if ~usejava('desktop')
|
|
% test if matlab was called with -nodisplay option, if yes then
|
|
% use_display should be false
|
|
p.use_display = false;
|
|
end
|
|
|
|
% check if fourier ptycho recon is needed
|
|
if ~isfield(p, 'fourier_ptycho')
|
|
p.fourier_ptycho = false;
|
|
end
|
|
|
|
if ~isfield(p, 'sample_rotation_angles')
|
|
p.sample_rotation_angles = [0,0,0]; % 3x1 vector rotation around [X,Y,beam] axes in degrees , apply a correction accounting for tilted plane oR the sample and ewald sphere curvature (high NA correction)
|
|
end
|
|
|
|
|
|
%%% Derived quantities %%%
|
|
assert(~isempty(p.energy), 'Provide p.energy or source of metadata p.src_metadata')
|
|
|
|
% modified by YJ for electron pty
|
|
if isfield(p,'beam_source') && strcmp(p.beam_source, 'electron')
|
|
%use relativistic corrected formula for electron pty
|
|
p.lambda = 12.3986/sqrt((2*511.0+p.energy).*p.energy); %angstrom
|
|
else
|
|
p.lambda = 1.23984193e-9/p.energy; % wavelength
|
|
end
|
|
if isscalar(p.asize); p.asize = [p.asize p.asize]; end
|
|
|
|
%%%%%%%%%%%%%%%%%%%%
|
|
%% Scan meta data %%
|
|
%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% calculate fourier ptycho geometry
|
|
if p.fourier_ptycho
|
|
if ~isfield(p, 'FP_focal_distance')
|
|
error('For running Fourier Ptychography, please specify the focal length of your objective lens (p.FP_focal_distance)');
|
|
end
|
|
if ~get_option(p, 'z_lens')
|
|
p.z_lens = 1/(1/(p.FP_focal_distance)-1/(p.z));
|
|
end
|
|
end
|
|
|
|
%%%%%%%%%%%%%%%%
|
|
%% Scan queue %%
|
|
%%%%%%%%%%%%%%%%
|
|
|
|
% number of attempts to reconstruct the given dataset
|
|
if ~isfield(p.queue, 'max_attempts')
|
|
p.queue.max_attempts = 5;
|
|
end
|
|
|
|
% lock files
|
|
if ~isfield(p.queue, 'lockfile') || isempty(p.queue.lockfile)
|
|
if verbose > 2
|
|
p.queue.lockfile = false;
|
|
else
|
|
p.queue.lockfile = true;
|
|
end
|
|
end
|
|
|
|
if ~isfield(p.queue, 'file_queue_timeout')
|
|
p.queue.file_queue_timeout = 10; % time to wait for a new dataset in queue
|
|
end
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%
|
|
%% Data preparation %%
|
|
%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% data prefix
|
|
if isempty(p.detector.data_prefix)
|
|
import beamline.identify_eaccount %% not included in the ptychoshelves package
|
|
eaccount = identify_eaccount;
|
|
if ~isempty(eaccount) && eaccount(1) == 'e'
|
|
% default setting for cSAXS beamline
|
|
p.detector.data_prefix = [eaccount '_1_'];
|
|
else
|
|
verbose(3,'p.detector.data_prefix is not defined')
|
|
end
|
|
end
|
|
|
|
% suffix for prepared data file
|
|
if ~isfield(p.prepare, 'prep_data_suffix')
|
|
p.prepare.prep_data_suffix = '';
|
|
end
|
|
|
|
if p.asize(1) ~= p.asize(2) && (~isfield(p.prepare, 'data_preparator') || any(strcmpi(p.prepare.data_preparator, {'python', 'libDetXR','json'})))
|
|
p.prepare.data_preparator = 'matlab_ps';
|
|
verbose(1, 'Python preparator does not support asymmetric probe dimensions, switching to matlab_ps')
|
|
end
|
|
|
|
if p.asize(1) ~= p.asize(2) && p.prepare.force_preparation_data == false
|
|
verbose(1, 'Loading prepared data is not supported for asymmetric p.asize, enforce load from raw data ')
|
|
p.prepare.force_preparation_data = true;
|
|
end
|
|
|
|
|
|
% data preparator
|
|
if ~isfield(p.prepare, 'data_preparator') || any(strcmpi(p.prepare.data_preparator, {'python', 'libDetXR','json'}))
|
|
p.prepare.data_preparator = 'libDetXR';
|
|
verbose(3, 'Using python data preparator.')
|
|
elseif any(strcmpi(p.prepare.data_preparator, {'matlab', 'matlab_ps','mex'}))
|
|
p.prepare.data_preparator = 'matlab_ps';
|
|
verbose(3, 'Using matlab data preparator.')
|
|
elseif any(strcmpi(p.prepare.data_preparator, {'matlab_aps'})) %% adde by YJ
|
|
p.prepare.data_preparator = 'matlab_aps';
|
|
verbose(3, 'Using matlab APS data preparator.')
|
|
elseif any(strcmpi(p.prepare.data_preparator, {'matlab_aps_lynx'})) %% adde by YJ
|
|
p.prepare.data_preparator = 'matlab_aps_lynx';
|
|
verbose(3, 'Using matlab APS-LYNX data preparator.')
|
|
|
|
else
|
|
error('Unknown data preparator %s', p.prepare.data_preparator);
|
|
end
|
|
|
|
|
|
if ~isfield(p.prepare,'data_preparator') || isempty(p.prepare.data_preparator)
|
|
error(' p.prepare.data_preparator is not set')
|
|
end
|
|
|
|
if strcmpi(p.prepare.data_preparator, 'matlab')
|
|
p.prepare.data_preparator = 'matlab_ps';
|
|
elseif strcmpi(p.prepare.data_preparator, 'python')
|
|
p.prepare.data_preparator = 'libDetXR';
|
|
end
|
|
|
|
% binning is only supported by Matlab data preparation
|
|
if isfield(p.detector,'binning')&& p.detector.binning
|
|
p.prepare.data_preparator = 'matlab_ps';
|
|
verbose(1, 'Using binning %ix%i, switching to matlab data loading', 2^p.detector.binning, 2^p.detector.binning)
|
|
else
|
|
p.detector.binning = false;
|
|
end
|
|
|
|
% binning is only supported by Matlab data preparation
|
|
if isfield(p.detector,'upsampling') && p.detector.upsampling
|
|
if strcmp(p.prepare.data_preparator,'matlab_ps')
|
|
%p.prepare.data_preparator = 'matlab_ps';
|
|
p.prepare.data_preparator = 'matlab_aps'; %modified by YJ for APS data
|
|
end
|
|
verbose(1, 'Using data upsampling %ix%i, switching to matlab data loading', 2^p.detector.upsampling, 2^p.detector.upsampling)
|
|
else
|
|
p.detector.upsampling = false;
|
|
end
|
|
|
|
% prealignment for Fourier Ptychography
|
|
if check_option(p, 'FP_focal_distance')
|
|
p. fourier_ptycho = true; % set to true for Fourier Ptychography
|
|
else
|
|
p. fourier_ptycho = false;
|
|
end
|
|
|
|
if ~isfield(p, 'prealign_FP')
|
|
p.prealign_FP = false;
|
|
end
|
|
|
|
% Fourier Ptycho is only supported by Matlab data preparation
|
|
if p.fourier_ptycho
|
|
p.prepare.data_preparator = 'matlab_ps';
|
|
verbose(1, 'Switching to matlab data loading for Fourier Ptycho.')
|
|
|
|
% set prealign_data to true if not distortion correction is available
|
|
if p.prealign_FP && ~p.prealign.prealign_data && isempty(p.prealign.distortion_corr)
|
|
p.prealign.prealign_data = true;
|
|
end
|
|
end
|
|
|
|
% set defaults for matlab_ps
|
|
if strcmpi(p.prepare.data_preparator, 'matlab_ps')
|
|
if ~isfield(p.io, 'data_precision')
|
|
p.io.data_precision = 'single';
|
|
end
|
|
if ~isfield(p.io, 'data_nthreads')
|
|
p.io.data_nthreads = 2;
|
|
end
|
|
end
|
|
|
|
if isfield(p, 'prop_regime') && ~ismember(p.prop_regime, {'nearfield', 'farfield'})
|
|
error(['Nonexistent propagation regime ', p.prop_regime ])
|
|
end
|
|
|
|
% store prepared data
|
|
if ~isfield(p.prepare, 'store_prepared_data')
|
|
p.prepare.store_prepared_data = true;
|
|
end
|
|
|
|
%%%%%%%%%%%%%%%%%%%%
|
|
%% Scan positions %%
|
|
%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% load positions from prepared file
|
|
if ~isfield(p.io, 'load_prep_pos')
|
|
p.io.load_prep_pos = false;
|
|
end
|
|
|
|
%%%%%%%%%
|
|
%% I/O %%
|
|
%%%%%%%%%
|
|
|
|
% file compression
|
|
if ~isfield(p.io, 'file_compression')
|
|
p.io.file_compression = 0;
|
|
end
|
|
if ~isfield(p.io, 'data_compression')
|
|
p.io.data_compression = 3;
|
|
end
|
|
|
|
|
|
% run name
|
|
if ~check_option(p, 'run_name')
|
|
% check if prefix is defined
|
|
if isempty(p.prefix)
|
|
if iscell(p.scan_str)
|
|
p.prefix = p.scan_str{1};
|
|
else
|
|
p.prefix = p.scan_str;
|
|
end
|
|
end
|
|
p.run_name = sprintf('%s_%s', p.prefix, datestr(now, 'yyyy_mm_dd'));
|
|
end
|
|
verbose(3, 'run_name = %s', p.run_name);
|
|
|
|
%%%%%%%%%%%%%%%%%%%%
|
|
%% Reconstruction %%
|
|
%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% backward compatibilty for initial_iterate
|
|
if isfield(p, 'initial_iterate') && ~isfield(p, 'initial_iterate_object')
|
|
p.initial_iterate_object = p.initial_iterate;
|
|
p = rmfield(p, 'initial_iterate');
|
|
end
|
|
if isfield(p, 'initial_iterate_file') && ~isfield(p, 'initial_iterate_object_file')
|
|
p.initial_iterate_object_file = p.initial_iterate_file;
|
|
p = rmfield(p, 'initial_iterate_file');
|
|
end
|
|
|
|
% model probe
|
|
if ~isfield(p.model, 'probe_central_stop')
|
|
p.model.probe_central_stop = false;
|
|
end
|
|
|
|
if ~isfield(p.model, 'probe_central_stop_diameter') && p.model.probe_central_stop
|
|
p.model.probe_central_stop_diameter = 50e-6;
|
|
end
|
|
|
|
%%%%%%%%%%%%%%%%%%%
|
|
%% Plot and save %%
|
|
%%%%%%%%%%%%%%%%%%%
|
|
|
|
% plot prepared data
|
|
if ~isfield(p.plot, 'prepared_data') || (isfield(p.plot, 'prepared_data')&& isempty(p.plot.prepared_data))
|
|
if p.verbose_level > 2
|
|
p.plot.prepared_data = true;
|
|
else
|
|
p.plot.prepared_data = false;
|
|
end
|
|
end
|
|
|
|
% plotting
|
|
if ~isfield(p.plot, 'interval') || isempty(p.plot.interval)
|
|
if verbose > 2
|
|
p.plot.interval = 10;
|
|
else
|
|
p.plot.interval = 200;
|
|
end
|
|
end
|
|
|
|
% external call to save figures
|
|
if ~isfield(p.save, 'external')
|
|
p.save.external = false;
|
|
end
|
|
|
|
% propagation and apodization
|
|
if ~isfield(p.plot, 'obj_apod')
|
|
p.plot.obj_apod = false;
|
|
end
|
|
if ~isfield(p.plot, 'prop_obj')
|
|
p.plot.prop_obj = 0;
|
|
end
|
|
|
|
% calculate FSC
|
|
if ~isfield(p.plot, 'calc_FSC')
|
|
p.plot.calc_FSC = false;
|
|
end
|
|
if ~isfield(p.plot, 'show_FSC')
|
|
p.plot.show_FSC = utils.verbose>2;
|
|
end
|
|
if ~isfield(p.plot, 'probe_spectrum')|| isempty(p.plot.probe_spectrum)
|
|
p.plot.probe_spectrum = utils.verbose>2;
|
|
end
|
|
if ~isfield(p.plot, 'object_spectrum')|| isempty(p.plot.object_spectrum)
|
|
p.plot.object_spectrum = utils.verbose>2;
|
|
end
|
|
if ~isfield(p.save, 'store_images_ids' )|| isempty(p.save.store_images_ids)
|
|
p.save.store_images_ids = 1:4;
|
|
end
|
|
|
|
|
|
%%%%%%%%%%%%%
|
|
%% Engines %%
|
|
%%%%%%%%%%%%%
|
|
|
|
% at least one engine has to be specified
|
|
if ~isfield(p, 'engines')
|
|
error('At least one reconstruction engine has to be selected. Please check your template.')
|
|
end
|
|
|
|
|
|
|
|
% first engine is external
|
|
p.external_engine0 = strcmpi(p.engines{1}.name, 'c_solver') || ...
|
|
(isfield(p.engines{1}, 'external') && p.engines{1}.external);
|
|
|
|
if ~isfield(p,'remove_scaling_ambiguity')
|
|
% if true. try to keep norm(probe) constant during the reconstruction
|
|
p.remove_scaling_ambiguity = true;
|
|
end
|
|
|
|
|
|
end
|
|
|