mirror of
https://github.com/c-sooyoung/fold_slice.git
synced 2026-09-17 17:29:09 +09:00
194 lines
6.2 KiB
Matlab
194 lines
6.2 KiB
Matlab
% 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
|
||
|