101 lines
4.5 KiB
Matlab
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);
|
|
elseif contains(p.Results.mode,'average')
|
|
combinedSpectrum(:,2) = mean(vq,2);
|
|
combinedSpectrum(:,3) = std(vq,0,2);
|
|
elseif contains(p.Results.mode,'subtract')
|
|
disp('Not supported yet') % FIXME: subtraction is not implemented yet.
|
|
end
|
|
end
|