Files
nappMATLAB-toolbox/beamtime/nappCombineSpectra.m
T
2023-11-28 14:36:44 +01:00

101 lines
4.5 KiB
Matlab

function combinedSpectrum = nappCombineSpectra(DataTable,varargin)
%nappCombineSpectra combines selected PE or NEXAFS spectra into one. Data
%are intrapolated along x-axis.
%
% MgO_C1s_Warm = nappCombineSpectra(FileList,'tableRow',1,...
% 'tableSelection',tmpDataSelection,'tableVariable',...
% 'spectrum_countsNorm','EnergyScale','binding','mode','average');
%
% *input*
% FileList: data table
% tableSelection (optional): logical array to filter data table
% tableVariable (optional): select source: 'nexafsSpectrum','spectrum_counts','spectrum_countsPerSecond',...
% 'spectrum_countsNorm','nexafsSpectrumPreBackground','nexafsSpectrumPreNorm',...
% 'nexafsSpectrumPreGasPhase','nexafsSpectrumPreI0','nexafsSpectrumPreAdvCarb'
% tableRow (optional): default 1. Defines the row in filtered table (to be
% processed). The x-axis of that data set will be used for interpolation.
% mode: mean (default) averages the spectra; sum adds them, subtract not
% coded yet.
% energyScale (optional): kinetic (default) or binding energy scale; only relevant
% for PE spectra, not for NEXAFS
%
%
% *output*
% a matrix with energy in column 1, counts in column2, and standard
% deviation in column 3 (only for mean).
%
expectedTableVariable = {'nexafsSpectrum','spectrum_counts','spectrum_countsPerSecond',...
'spectrum_countsNorm','nexafsSpectrumPreBackground','nexafsSpectrumPreNorm',...
'nexafsSpectrumPreGasPhase','nexafsSpectrumPreI0','nexafsSpectrumPreAdvCarb'};
defaultTableSelection = true(size(DataTable,1));
defaultTableRow = 1;
defaultMode = 'sum';
expectedMode = {'sum','average','subtract'};
defaultEnergyScale = 'kinetic';
expectedEnergyScale = {'kinetic','binding','xRay'};
% Parse input
p = inputParser;
addRequired(p,'DataTable',@istable);
addParameter(p,'tableSelection',defaultTableSelection,@islogical);
addParameter(p,'tableRow',defaultTableRow,@isnumeric);
addParameter(p,'tableVariable',...
@(x) any(validatestring(x,expectedTableVariable)));
addParameter(p,'mode',defaultMode,...
@(x) any(validatestring(x,expectedMode)));
addParameter(p,'energyScale',defaultEnergyScale,...
@(x) any(validatestring(x,expectedEnergyScale)));
parse(p,DataTable,varargin{:});
% check input (all elements of input variable need to have non-zero size)
if ~all(cell2mat(cellfun(@size,p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable),'UniformOutput',false)),'all')
disp('The table variable appears to be empty. I quit now')
error('The table variable appears to be empty.')
end
if (contains(p.Results.tableVariable,'counts')) && (contains(p.Results.energyScale,'kinetic'))
tmpX = p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV;
elseif (contains(p.Results.tableVariable,'counts')) && (contains(p.Results.energyScale,'binding'))
tmpX = p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV;
elseif contains(p.Results.tableVariable,'counts') && (contains(p.Results.energyScale,'xRay'))
tmpX = p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV;
end
if contains(p.Results.energyScale,'binding')
tmpStart = min(cellfun(@(x) x(1), tmpX));
tmpEnd = max(cellfun(@(x) x(end), tmpX));
tmpStartIndex = find(tmpX{p.Results.tableRow} <= tmpStart,1);
tmpEndIndex = find(tmpX{p.Results.tableRow} <= tmpEnd,1);
else
tmpStart = max(cellfun(@(x) x(1), tmpX));
tmpEnd = min(cellfun(@(x) x(end), tmpX));
tmpStartIndex = find(tmpX{p.Results.tableRow} >= tmpStart,1);
tmpEndIndex = find(tmpX{p.Results.tableRow} >= tmpEnd,1);
end
xq = tmpX{p.Results.tableRow}(tmpStartIndex:tmpEndIndex);
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
x = tmpX{ii};
v = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii};
vq(:,ii) = interp1(x,v,xq);
end
combinedSpectrum(:,1) = xq;
if contains(p.Results.mode,'sum')
combinedSpectrum(:,2) = sum(vq,2,'omitnan');
elseif contains(p.Results.mode,'average')
combinedSpectrum(:,2) = mean(vq,2,'omitnan');
combinedSpectrum(:,3) = std(vq,0,2,'omitnan');
elseif contains(p.Results.mode,'subtract')
disp('Not supported yet') % FIXME: subtraction is not implemented yet.
end
end