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
+214
View File
@@ -0,0 +1,214 @@
%% TEMPLATE FOR AUTOMATIC TOMOGRAPHY CODE TESTS
% perform tests on measured dataset stored in /das/work/p16/p16812/
cd(fullfile( fileparts(mfilename('fullpath')), '..'))
addpath('tests')
addpath('utils')
addpath('./')
addpath(find_base_package)
clearvars -except par0 tested_templates scratch_path GPU_id base_path test_simulated_data test_real_data base_path
%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Edit this section %%%
%%%%%%%%%%%%%%%%%%%%%%%%%
datasets = 1:5; % 1-nature chip, 2-FFC particle, 3-retina, 4-local tomo, 5-lamni chip
verbose_level = -1; % -1 = keep very quiet the reconstructions
scratch_path = '/das/work/p16/p16812/'; % path to the cSAXS scratch p-folder where are saved the test datasets
if ~exist('GPU_id', 'var'); GPU_id = [1]; end
if ~exist('base_path', 'var'); base_path = '../'; end
%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
utils.verbose(verbose_level)
setenv('TMP',[base_path,'/tmp']) % TEMP for matlab scripts
utils.verbose(-1, '=== Searching for data in %s ====', scratch_path)
for dataset = datasets
par0 = struct();
par0.GPU_list = GPU_id;
switch dataset
case 1
%% Nature chip 2016
% test: large projections, phase residua/errors from sharp transitions
tested_templates ={'template_tomo_recons'} ;
par0.tomo_id = [];
par0.scanstomo = [2718:3925];
par0.fileprefix='online_'; % string at the beginning of the filename, related to reconstruction name
par0.filesuffix = '_600x600_wrap_1_c'; % string searched at the end of the data filenames, No need to add _c or _recons, it will look for it
par0.file_extension = 'mat';
par0.analysis_path = fullfile(scratch_path, 'data/e16622_tomo_nature_chip_2016/analysis/');
par0.surface_calib_file = [];
par0.omnyposfile = fullfile(scratch_path, 'data/e16622_tomo_nature_chip_2016/specES1/scan_positions/scan_%05d.dat'); %Filename pattern for Orchestra interferometer position files
par0.OMNY_angle_file = fullfile(scratch_path, 'data/e16622_tomo_nature_chip_2016/specES1/dat-files/tomography_scannumbers.txt'); % Filename with angles
par0.max_residua_limit = inf; % limit used to determine which projection have failed
case 2
%% johanness FCC catalyst
% test: large projections, low freq. errors, periodic artefacts, vertically asymmetric sample
tested_templates ={'template_tomo_recons'} ;
par0.tomo_id = [];
par0.scanstomo = [500:1349];
par0.fileprefix='offline_'; % string at the beginning of the filename, related to reconstruction name
par0.filesuffix = '500x500_run_1_recons'; % string searched at the end of the data filenames, No need to add _c or _recons, it will look for it
par0.file_extension = 'mat';
par0.analysis_path = fullfile(scratch_path, 'data/e16410_tomo_FCC_particle/analysis/');
par0.surface_calib_file = [];
par0.omnyposfile = fullfile(scratch_path, 'data/e16410_tomo_FCC_particle/specES1/scan_positions/scan_%05d.dat'); %Filename pattern for Orchestra interferometer position files
par0.OMNY_angle_file = fullfile(scratch_path, 'data/e16410_tomo_FCC_particle/specES1/dat-files/tomography_scannumbers.txt'); % Filename with angles
% solve in lower resolution
par0.downsample_projections = 1;
case 3
%% retina from OMNY
% test: large projections, low freq. errors, huge phase jumps
tested_templates ={'template_tomo_recons'} ;
par0.tomo_id = [];
par0.scanstomo = [1925:2384];
par0.fileprefix='online_wrap_'; % string at the beginning of the filename, related to reconstruction name
par0.filesuffix = '_452x452_run_1_c'; % string searched at the end of the data filenames, No need to add _c or _recons, it will look for it
par0.file_extension = 'mat';
par0.analysis_path = fullfile(scratch_path, 'data/e15634_retina_2015_OMNY/analysis/');
par0.surface_calib_file = [];
par0.omnyposfile = fullfile(scratch_path, 'data/e15634_retina_2015_OMNY/specES1/omny_recontruct/scan_%05d.dat'); %Filename pattern for Orchestra interferometer position files
par0.OMNY_angle_file = fullfile(scratch_path, 'data/e15634_retina_2015_OMNY/specES1/dat-files/omny_scannumbers.txt'); % Filename with angles
par0.downsample_projections = 1; % downsample projections by factor of 2^x, set 0 to do nothing and 1,2,.. for different levels of projection binning
par0.auto_alignment = false;
par0.get_auto_calibration = false;
case 4
%% local tomo dataset !! THIS TEST TAKES ~1 HOUR and requires 200GB of RAM !!
tested_templates ={'template_tomo_interior'} ;
par0.tomo_id = []; % [68:74]; % Either scan numbers or tomo_id can be given, but not both, if not provided leave tomo_id=[]
par0.scanstomo = 1700:7690;
par0.lowres_tomo_path =fullfile(scratch_path, 'data/e17312_localtomo_FCC_particle/tomogram_delta_S00089_to_S01525_ram-lak_freqscl_1.00.mat');
% IO loading
par0.fileprefix=''; % string at the beginning of the filename, related to reconstruction name
par0.filesuffix = '_recons'; % string searched at the end of the data filenames, No need to add _c or _recons, it will look for it
par0.file_extension = 'h5';
par0.downsample_projections = 0; % downsample projections by factor of 2^x, set 0 to do nothing and 1,2,.. for different levels of projection binning
par0.analysis_path = fullfile(scratch_path, 'data/e17312_localtomo_FCC_particle/analysis/');
par0.clip_amplitude_quantile = 0.95; % clip amplitudes in the loaded projections that are exceeding given quantile, if par0.clip_amplitude_quantile == 1, do nothing
par0.max_residua_limit = 100; % limit used to determine which projection have failed
par0.surface_calib_file = [];
par0.omnyposfile = fullfile(scratch_path, 'data/e17312_localtomo_FCC_particle/specES1/scan_positions/scan_%05d.dat'); %Filename pattern for Orchestra interferometer position files
par0.OMNY_angle_file = fullfile(scratch_path, 'data/e17312_localtomo_FCC_particle/specES1/dat-files/tomography_scannumbers.txt'); % Filename with angles
% Other
par0.save_memory = false; % try to limit use of RAM
par0.inplace_processing = par0.save_memory; % process object_stack using inplace operations to save memory
par0.fp16_precision = true; % use 16-bit precision to store the complex-valued projections
par0.cache_stack_object = par0.save_memory; % store stack_object to disk when no needed
case 5
%% lamni chip dataset !! THIS TEST TAKES SEVERAL HOURS and requires full RAM !!
tested_templates ={'template_tomo_recons_lamino'} ;
% par0.scanstomo = [984:1850]; %2326]; % smaller angular range
par0.scanstomo = [984:3717]; % full angular range
par0.tomo_id = []; % Either scan numbers or tomo_id can be given, but not both, if not provided leave tomo_id=[]
% IO loading
par0.fileprefix=''; % string at the beginning of the filename, related to reconstruction name
par0.filesuffix = 'test_1'; %% string searched at the end of the data filenames, No need to add _c or _recons, it will look for it
par0.file_extension = 'h5';
par0.downsample_projections = 0; % downsample projections by factor of 2^x, set 0 to do nothing and 1,2,.. for different levels of projection binning
par0.analysis_path = fullfile(scratch_path, 'data/e17299_lamni_chip_dataset_2018/analysis/');
par0.clip_amplitude_quantile = 0.95; % clip amplitudes in the loaded projections that are exceeding given quantile, if par0.clip_amplitude_quantile == 1, do nothing
par0.max_residua_limit = 100; % limit used to determine which projection have failed
par0.surface_calib_file = [];
par0.omnyposfile = fullfile(scratch_path, 'data/e17299_lamni_chip_dataset_2018/specES1/scan_positions/scan_%05d.dat'); %Filename pattern for Orchestra interferometer position files
par0.OMNY_angle_file = fullfile(scratch_path, 'data/e17299_lamni_chip_dataset_2018/specES1/dat-files/tomography_scannumbers.txt'); % Filename with angles
% Other
par0.save_memory = true; % try to limit use of RAM
par0.inplace_processing = par0.save_memory; % process object_stack using inplace operations to save memory
par0.fp16_precision = par0.save_memory; % use 16-bit precision to store the complex-valued projections
par0.cache_stack_object = par0.save_memory; % store stack_object to disk when no needed
otherwise
error('Missing dataset')
end
for tested_template = tested_templates
clearvars -except par0 tested_template tested_templates scratch_path GPU_id base_path test_simulated_data test_real_data base_path
utils.verbose(struct('prefix', 'init'))
%% test stage 0: load basic configuration parameters
utils.verbose(-1,'====================================================')
utils.verbose(-1,'===== Testing template "%s" ============', tested_template{1})
utils.verbose(-1,'====================================================')
% set debugging info level and marks
debug(1)
warning('off', 'MATLAB:mpath:nameNonexistentOrNotADirectory')
warning('off', 'MATLAB:dispatcher:pathWarning')
run(tested_template{1})
for item = fieldnames(par0)'
par.(item{1}) = par0.(item{1});
end
%% test stage 1: load test data and continue with the remplate
utils.verbose(-1,'Running template')
debug(3)
utils.verbose(struct('prefix', 'template'))
run(tested_template{1})
end
end
%*-----------------------------------------------------------------------*
%|                                                                       |
%|  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.