diff --git a/beamtime/nappBackground.m b/beamtime/nappBackground.m index 77434f6..012fcab 100644 --- a/beamtime/nappBackground.m +++ b/beamtime/nappBackground.m @@ -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 \ No newline at end of file