Files
nappMATLAB-toolbox/beamtime/nappGenerateSpectra.m
T
2023-08-10 09:19:49 +02:00

126 lines
6.1 KiB
Matlab

function DataTable = nappGenerateSpectra(DataTable,varargin)
%nappGenerateSpectra reduces the dimension of images to generate spectra
%
% nappGenerateSpectra(FileList,tmpDataSelection)
%
% *input*
% FileList: data table
% tableSelection (optional): logical array to filter data table
% tableVariable (optional): select source: image(default),'imageRoh'
% mode: mean (default) averages the sequence iterations; sum adds them
%
% *output*
% with mode mean the spectrum will be saved in the table variable spectrum_countsPerSecond
% with mode sum the spectrum will be saved in the table variable spectrum_counts
%
% FIXME: spectrum_counts is not implemented yet.
% Define conditions and defaults of input
defaultTableVariable = 'image';
expectedTableVariable = {'image','imageRoh'};
defaultMode = 'mean';
expectedMode = {'mean','sum','trapz'};
defaultEkinStart = 0;
defaultEkinEnd = 0;
defaultTableSelection = true(size(DataTable,1));
% Parse input
p = inputParser;
addRequired(p,'DataTable',@istable);
addOptional(p,'tableSelection',defaultTableSelection,@islogical);
addParameter(p,'tableVariable',defaultTableVariable,...
@(x) any(validatestring(x,expectedTableVariable)));
addParameter(p,'mode',defaultMode,...
@(x) any(validatestring(x,expectedMode)));
addParameter(p,'iterationRange',[0:0]);
addParameter(p,'eKinStart',defaultEkinStart,@isnumeric)
addParameter(p,'eKinEnd',defaultEkinEnd,@isnumeric)
parse(p,DataTable,varargin{:});
% add empty variable to table
existColumn = strcmp('spectrum_countsPerSecond',p.Results.DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.spectrum_countsPerSecond = cell(size(p.Results.DataTable,1),1);
end
existColumn = strcmp('spectrum_counts',p.Results.DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.spectrum_counts = cell(size(p.Results.DataTable,1),1);
end
existColumn = strcmp('logGenerateRange',p.Results.DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.logGenerateRange = NaN(size(p.Results.DataTable,1),2);
end
existColumn = strcmp('logGenerateDate',p.Results.DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.logGenerateDate = cellstr(repmat(' ',size(p.Results.DataTable,1),1));
end
existColumn = strcmp('logGenerateMode',p.Results.DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.logGenerateDate = cellstr(repmat(' ',size(p.Results.DataTable,1),1));
end
% 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
% create empty variables
tmp_3 = cell(size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
tmp_6 = cell(size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
tmp_4 = NaN(size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
tmp_5 = NaN(size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5') % let's do NEXAFS first.
% Get index of EkinStart and EkinEnd
if (p.Results.eKinStart) == 0
tmp_1 = 1;
else
tmp_1 = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii} >= p.Results.eKinStart,1);
end
if (p.Results.eKinEnd) == 0
tmp_2 = length(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii});
else
tmp_2 = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii} >= p.Results.eKinEnd,1);
end
if contains(p.Results.mode,'trapz')
tmp_3(ii,1)= {trapz(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(tmp_1:tmp_2),...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(tmp_1:tmp_2,:))'};
elseif (contains(p.Results.mode,'sum') | contains(p.Results.mode,'mean'))
tmp_3(ii,1) = {sum(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(tmp_1:tmp_2,:),1)'}; %#ok<*AGROW>
end
% log
tmp_4(ii,1) = p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(tmp_1);
tmp_5(ii,1) = p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(tmp_2);
elseif endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw') % then do Igorfiles
if p.Results.iterationRange(1) == 0
startRange = 1;
endRange = size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2);
else
startRange = p.Results.iterationRange(1);
endRange = p.Results.iterationRange(2);
end
if (contains(p.Results.mode,'mean') | contains(p.Results.mode,'trapz'))
tmp_6(ii,1)= {mean(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(:,startRange:endRange),2)};
elseif contains(p.Results.mode,'sum')
tmp_3(ii,1) = {sum(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(:,startRange:endRange),2)}; %#ok<*AGROW>
end
% log
tmp_4(ii,1) = startRange;
tmp_5(ii,1) = endRange;
end
end
% write results to table
DataTable.spectrum_counts(p.Results.tableSelection) = tmp_3;
DataTable.spectrum_countsPerSecond(p.Results.tableSelection) = tmp_6;
% write log to table
DataTable.logGenerateMode(p.Results.tableSelection,:) = cellstr(repmat(p.Results.mode,size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
DataTable.logGenerateRange(p.Results.tableSelection,:) = [tmp_4 tmp_5];
DataTable.logGenerateDate(p.Results.tableSelection,:) = cellstr(repmat(datestr(now),size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
end