mirror of
https://github.com/c-sooyoung/fold_slice.git
synced 2026-09-17 17:29:09 +09:00
155 lines
5.2 KiB
Matlab
155 lines
5.2 KiB
Matlab
% GET_REF_INDEX returns refractive index for the specified chemical formula at a given energy (range)
|
||
% formula... chemical formula
|
||
% energy... single value in keV or energy range in keV
|
||
% (optional) dens... density, negative number for default value
|
||
% (optional) npts... number of points
|
||
% (optional) plot... set to 1 for plotting the refractive index
|
||
%
|
||
% returns
|
||
% ref... (energy in keV, delta, beta)
|
||
% req_density... density in g/cm^3
|
||
%
|
||
% examples:
|
||
% get_ref_index('Au', 8.7)
|
||
% get_ref_index('Pb', [11.2 24], -1, 100)
|
||
%
|
||
% 03/2017
|
||
|
||
%*-----------------------------------------------------------------------*
|
||
%| |
|
||
%| 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 [ ref, req_density ] = get_ref_index( formula, energy, varargin )
|
||
|
||
% check density
|
||
if nargin < 3
|
||
dens = -1;
|
||
else
|
||
dens = varargin{1};
|
||
end
|
||
|
||
% check specified number of points
|
||
if nargin < 4
|
||
npts = 99;
|
||
else
|
||
npts = varargin{2}-1;
|
||
end
|
||
|
||
% check if plotting is requested
|
||
if nargin < 5
|
||
plot_ref = false;
|
||
else
|
||
plot_ref = varargin{3};
|
||
end
|
||
|
||
% convert to keV
|
||
energy = energy * 1000;
|
||
|
||
if size(energy) ==1
|
||
emin = energy;
|
||
emax = energy;
|
||
npts = 1;
|
||
req_range = false;
|
||
elseif size(energy,2) == 2
|
||
emin = energy(1);
|
||
emax = energy(2);
|
||
req_range = true;
|
||
else
|
||
error('Only one specific energy or an energy range is supported.')
|
||
|
||
end
|
||
|
||
% check the energy range
|
||
if emin < 30 || emax > 30000
|
||
error('Energies must be in the range 0.03 keV to 30 keV.')
|
||
end
|
||
|
||
|
||
% request the data
|
||
server = 'http://henke.lbl.gov/';
|
||
req = sprintf('Material=Enter+Formula&Formula=%s&Density=%f&Scan=Energy&Min=%d&Max=%d&Npts=%d&Output=Text+File', formula, dens, emin, emax, npts);
|
||
data_req = webwrite([server 'cgi-bin/getdb.pl'], req);
|
||
%keyboard
|
||
% find and read dat file
|
||
f_pos = strfind(data_req, '/tmp');
|
||
data_req = strsplit(data_req(f_pos(1):end), '.');
|
||
data = webread([server data_req{1} '.dat']);
|
||
|
||
% split data by line breaks
|
||
data = strsplit(data, '\n');
|
||
|
||
% extract density
|
||
req_density = data{1};
|
||
req_density = strsplit(req_density, '=');
|
||
req_density = str2double(req_density{2});
|
||
|
||
|
||
% output
|
||
if npts==1 && ~req_range
|
||
ref = zeros(1,3);
|
||
req_ref = data{3};
|
||
req_ref = strsplit(req_ref,' ');
|
||
ref(1,1) = str2double(req_ref{2})/1000;
|
||
ref(1,2) = str2double(req_ref{3});
|
||
ref(1,3) = str2double(req_ref{4});
|
||
else
|
||
ref = zeros(npts+1,3);
|
||
for i=1:npts+1
|
||
req_ref = data{i+2};
|
||
req_ref = strsplit(req_ref,' ');
|
||
ref(i,1) = str2double(req_ref{2})/1000;
|
||
ref(i,2) = str2double(req_ref{3});
|
||
ref(i,3) = str2double(req_ref{4});
|
||
end
|
||
end
|
||
|
||
% plot refractive index
|
||
if plot_ref
|
||
if ~req_range
|
||
fprintf('Requested plot for a single point.')
|
||
end
|
||
figure(76);
|
||
hold on;
|
||
plot(ref(:,1), ref(:,2))
|
||
plot(ref(:,1), ref(:,3))
|
||
ylabel('refractive index')
|
||
xlabel('energy in keV')
|
||
legend('delta', 'beta')
|
||
grid on;
|
||
hold off;
|
||
|
||
end
|
||
|
||
end
|
||
|