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
+193
View File
@@ -0,0 +1,193 @@
% function [ out ] = focus_series_fit( scans, p )
% Receives scan numbers and parameters as a structure p
% Input:
% scans
% For SPEC variables
% p.motor_name From SPEC
% p.counter From SPEC
% For sgalil position file
% p.position_file Example '~/Data10/sgalil/S%05d.dat'
% p.fast_axis_index (= 1 or 2) for x or y scan respectively
% For mcs counter
% p.mcs_file Example sprintf('~/Data10/mcs/S%02d000-%02d999/S%%05d/%s_%%05d.dat',floor(scans(ii)/1000),floor(scans(ii)/1000),beamline.identify_eaccount);
% p.mcs_channel Channel number, e.g. = 3
%
% Optional
% p.motor_units
% p.plot
% p.title_str
% p.coarse_motor
%
% Output
% out.fitout Parameters of quadratic fit
% out.coarse_motor Coarse motor name is passed back
% out.fwhm A vector with the fwhm for each scan
% out.vertex The position of coarse motor with minimum fwhm from the quadratic fit
%*-----------------------------------------------------------------------*
%|                                                                       |
%|  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) 2018 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 [ out ] = focus_series_fit( scans, p )
out = struct;
if isempty(scans)
error('Scans input seems to be empty')
end
if ~isfield(p,'plot')
p.plot = true;
end
if ~isfield(p,'title_str')
p.title_str = '';
end
if ~isfield(p,'motor_units')
p.motor_units = '';
end
if ~isfield(p,'coarse_motor')
p.motor_units = '';
end
if ~isfield(p,'pausetime')
p.pausetime = 0;
end
% mcs
if ~isfield(p,'mcs_file')
p.mcs_file = [];
end
if ~isfield(p,'mcs_channel')
p.mcs_channel = [];
end
% sgalil
if ~isfield(p,'position_file')
p.position_file = [];
end
if ~isfield(p,'fast_axis_index')
p.fast_axis_index = 1;
end
S_all=io.spec_read('~/Data10/','ScanNr',scans);
width = scans*0;
coarse_motor = scans*0;
for ii=1:length(scans)
if numel(S_all) == 1
S{1} = S_all;
else
S = S_all;
end
if isempty(p.mcs_file)
y = getfield(S{ii},p.counter); %#ok<GFLD>
y(1:end-1)=diff(y);
y(end) = 0;
y(end)=y(end-1);
else
data = io.image_read(sprintf(p.mcs_file,scans(ii),scans(ii)));
y = squeeze(data.data(p.mcs_channel,1,:));
y(1:end-1)=diff(y);
y([end end+1]) = 0;
end
if isempty(p.position_file)
x = getfield(S{ii},p.motor_name); %#ok<GFLD>
else
data = io.image_read(sprintf(p.position_file,scans(ii)));
x = data.data(p.fast_axis_index,:).';
end
% General model Gauss1:
% f(x) = a1*exp(-((x-b1)/c1)^2)
% Coefficients (with 95% confidence bounds):
% a1 = -2754 (-2839, -2669)
% b1 = -84.29 (-84.29, -84.28)
% c1 = 0.002197 (0.002118, 0.002276)
[yabsmax, ind_absmax] = max(abs(y));
% p0.a1 = y(ind_absmax);
% p0.b1 = x(ind_absmax);
% p0.c1 = 1e-9;
p0 = [y(ind_absmax) x(ind_absmax) 1e-3];
% f = fit(x,y,'gauss1');
f = fit(x,y,'gauss1', 'StartPoint', p0 );
if p.plot
figure(4)
plot(f,x,y,'.-');
title(p.title_str)
xlabel(sprintf('%s %s',p.motor_name,p.motor_units))
ylabel(p.counter)
drawnow
pause(p.pausetime)
end
width(ii)=f.c1*2*sqrt(2*log(2))/sqrt(2);
fprintf('S%05d, FWHM = %.2e %s\n',scans(ii),width(ii),p.motor_units)
coarse_motor(ii)=getfield(S{ii},p.coarse_motor); %#ok<GFLD>
end
figure(5)
plot(coarse_motor,width,'-bo')
title(p.title_str)
xlabel(p.coarse_motor)
ylabel(sprintf('FWHM %s',p.motor_units))
if numel(scans)>2
h = fit(coarse_motor.',width.','poly2');
figure(6)
plot(h,coarse_motor,width);
title(p.title_str)
xlabel(p.coarse_motor)
ylabel(sprintf('FWHM %s',p.motor_units))
vertex = -h.p2/(2*h.p1);
fprintf('\n\nThe vertex of the parabola is at %s = %f\n\n',p.coarse_motor,vertex)
fprintf('Average FWHM = %.2e %s\n',mean(width),p.motor_units)
fprintf('Minimum FWHM = %.2e %s\n',min(width),p.motor_units)
fprintf('Maximum FWHM = %.2e %s\n',max(width),p.motor_units)
out.fitout = h;
out.coarse_motor = coarse_motor;
out.fwhm = width;
out.vertex = vertex;
end
end