Added exponential fit. Added divide by background to normalise intensity.
This commit is contained in:
1 parent
4ad9ccbd35
commit
8b55810fc6
1 file changed
+55
-11
+55
-11
@@ -1,4 +1,4 @@
|
||||
function DataTable = nappBackground(DataTable,varargin)
|
||||
function DataTable = nappBackground(DataTable,varargin)
|
||||
%nappBackground determines and subtracts the background from PE or XAS spectra
|
||||
%
|
||||
% FileList = nappBackground(FileList,energyStart,energyEnd);
|
||||
@@ -39,7 +39,7 @@
|
||||
defaultTableVariable = 'spectrum_countsPerSecond';
|
||||
expectedTableVariable = {'spectrum_counts','spectrum_countsPerSecond','spectrum_countsNorm'};
|
||||
defaultMode = 'mean';
|
||||
expectedMode = {'mean','linfit'};
|
||||
expectedMode = {'mean','linfit','exponential','mean, divide','linfit, divide','exponential, divide'};
|
||||
defaultTableSelection = true(size(DataTable,1),1);
|
||||
defaultShowFigures = 'on';
|
||||
expectedShowFigures = {'on','off'};
|
||||
@@ -81,16 +81,56 @@ existColumn = strcmp('logBackgroundDate',DataTable.Properties.VariableNames);
|
||||
if ~any(existColumn)
|
||||
DataTable.logBackgroundDate = cellstr(repmat(' ',size(p.Results.DataTable,1),1));
|
||||
end
|
||||
% add empty variable to table
|
||||
existColumn = strcmp('spectrum_countsNorm',DataTable.Properties.VariableNames);
|
||||
if ~any(existColumn)
|
||||
DataTable.spectrum_countsNorm = cell(size(DataTable,1),1);
|
||||
end
|
||||
|
||||
|
||||
% repeat this for all columns in input.
|
||||
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
|
||||
if contains(p.Results.energyScale,'kinetic')
|
||||
% LINEAR FIT
|
||||
if contains(p.Results.mode,'linfit')
|
||||
if startsWith(p.Results.mode,'linfit')
|
||||
disp('linfit not yet supported')
|
||||
% MEAN
|
||||
else
|
||||
% declining background
|
||||
elseif contains(p.Results.mode,'exponential')
|
||||
[xData, yData] = prepareCurveData(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii});
|
||||
|
||||
% Set up fittype and options.
|
||||
ft = fittype( 'exp2' );
|
||||
excludedPoints = excludedata( xData, yData, 'domain',[p.Results.energyStart(1) p.Results.energyEnd(1)] );
|
||||
if size(p.Results.energyStart,2) ==2 && size(p.Results.energyEnd,2) ==1
|
||||
excludedPointsEins = excludedPoints;
|
||||
clearvars excludedPoints
|
||||
excludedPointsZwei = excludedata( xData, yData, 'domain',[xData(1) p.Results.energyStart(2)] );
|
||||
excludedPoints = excludedPointsEins & excludedPointsZwei;
|
||||
end
|
||||
|
||||
opts = fitoptions( 'Method', 'NonlinearLeastSquares','Exclude', ~excludedPoints );
|
||||
opts.Display = 'Off';
|
||||
|
||||
% Fit model to data.
|
||||
[fitresult, ~] = fit( xData, yData, ft, opts );
|
||||
if contains(p.Results.showFigures,'on')
|
||||
% Plot fit with data.
|
||||
figure( 'Name', 'untitled fit 1' );
|
||||
plot( fitresult, xData, yData, excludedPoints );
|
||||
% legend( h, 'y vs. x', 'Excluded y vs. x', 'untitled fit 1', 'Location', 'NorthEast', 'Interpreter', 'none' );
|
||||
% Label axes
|
||||
xlabel( 'kinetic energy [eV]', 'Interpreter', 'none' );
|
||||
ylabel( 'PE intensity', 'Interpreter', 'none' );
|
||||
grid on
|
||||
title(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'Interpreter','none')
|
||||
end
|
||||
if endsWith(p.Results.mode,'divide')
|
||||
tmp{ii,1} = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}./fitresult(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii});
|
||||
|
||||
else
|
||||
tmp{ii,1} = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}-fitresult(p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii});
|
||||
end
|
||||
elseif startsWith(p.Results.mode,'mean')
|
||||
b_1 = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii} >= p.Results.energyStart,1);
|
||||
b_2 = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii} >= p.Results.energyEnd,1);
|
||||
|
||||
@@ -150,7 +190,7 @@ for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
|
||||
% prepare Data
|
||||
|
||||
[xData, yData] = prepareCurveData( p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}, ...
|
||||
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii});
|
||||
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii});
|
||||
% MEAN
|
||||
b_1 = find(xData >= p.Results.energyStart,1);
|
||||
b_2 = find(xData >= p.Results.energyEnd,1);
|
||||
@@ -159,7 +199,7 @@ for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
|
||||
elseif p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(1) > p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(end)
|
||||
% prepare Data
|
||||
[xData, yData] = prepareCurveData( p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}, ...
|
||||
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii});
|
||||
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii});
|
||||
% MEAN
|
||||
b_1 = find(xData <= p.Results.energyStart,1);
|
||||
b_2 = find(xData <= p.Results.energyEnd,1);
|
||||
@@ -170,18 +210,22 @@ for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
|
||||
end
|
||||
|
||||
|
||||
tmp(ii,1) = cellfun(@(x) x-b_mean,p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable)(ii),'UniformOutput',false);
|
||||
tmp(ii,1) = cellfun(@(x) x-b_mean,p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable)(ii),'UniformOutput',false);
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
% fill selected rows
|
||||
DataTable(p.Results.tableSelection,:).(p.Results.tableVariable) = tmp;
|
||||
if endsWith(p.Results.mode,'divide')
|
||||
DataTable(p.Results.tableSelection,:).spectrum_countsNorm = tmp;
|
||||
else
|
||||
DataTable(p.Results.tableSelection,:).(p.Results.tableVariable) = tmp;
|
||||
end
|
||||
% write log to table
|
||||
DataTable.logBackgroundMode(p.Results.tableSelection,:) = cellstr(repmat(p.Results.mode,size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
|
||||
DataTable.logBackgroundRange(p.Results.tableSelection,:) = repmat([p.Results.energyStart p.Results.energyEnd],size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
|
||||
DataTable.logBackgroundRange(p.Results.tableSelection,:) = repmat([p.Results.energyStart(1) p.Results.energyEnd],size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
|
||||
DataTable.logBackgroundDate(p.Results.tableSelection,:) = cellstr(repmat(datestr(now),size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
|
||||
|
||||
end
|
||||
Reference in new issue
Block a user