193 lines
9.6 KiB
Matlab
193 lines
9.6 KiB
Matlab
function DataTable = nappScale(DataTable,varargin)
|
|
%nappScale can be used to normalise XPS spectra to the peak area. The peak
|
|
%of the same region or of a different region with identical SES file
|
|
%number can be used for XPS data. NEXAFS spectra can be normed to their
|
|
%area or to the intensity at an energy range of choice.
|
|
%
|
|
% FileList = nappScale(FileList,tmpDataSelection,'regionOld','C1s','regionNew','O1s');
|
|
%
|
|
% *input*
|
|
% FileList: data table
|
|
% tableSelection (optional): logical array to filter data table. These
|
|
% spectra will be normalised.
|
|
% regionOld: C1s (default) or O1s, N1s - region spectra that will be
|
|
% normalised. Needs to be identical to the table selection (filter).
|
|
% regionNew: O1s (default) or C1s, N1s - peak area that will be used to normalise
|
|
% peakNumber: Number of the feature that should be used for fitting
|
|
% (nappFitGaussXps gives results for 4 features, default is 1)
|
|
%
|
|
% The region in tableSelection and regionOld MUST be identical.
|
|
%
|
|
%
|
|
% *output*
|
|
% table variable spectrum_countsNorm
|
|
|
|
% Define conditions and defaults of input
|
|
defaultTableVariable = 'spectrum_countsPerSecond';
|
|
expectedTableVariable = {'spectrum_counts','spectrum_countsPerSecond','spectrum_countsNorm'};
|
|
defaultMode = 'area';
|
|
expectedMode = {'intensity','area'};
|
|
defaultRegionOld = 'C1s';
|
|
expectedRegionOld = {'O1s','C1s','N1s','Cl2p'};
|
|
defaultRegionNew = 'O1s';
|
|
expectedRegionNew = {'O1s','C1s','N1s'};
|
|
defaultPeakNumber = 1;
|
|
defaultTableSelection = true(size(DataTable,1));
|
|
|
|
|
|
% Parse input
|
|
p = inputParser;
|
|
addRequired(p,'DataTable',@istable);
|
|
addOptional(p,'tableSelection',defaultTableSelection,@islogical);
|
|
addOptional(p,'energyStart',@isnumeric)
|
|
addOptional(p,'energyEnd',@isnumeric)
|
|
addParameter(p,'tableVariable',defaultTableVariable,...
|
|
@(x) any(validatestring(x,expectedTableVariable)));
|
|
addParameter(p,'regionOld',defaultRegionOld,...
|
|
@(x) any(validatestring(x,expectedRegionOld)));
|
|
addParameter(p,'regionNew',defaultRegionNew,...
|
|
@(x) any(validatestring(x,expectedRegionNew)));
|
|
addParameter(p,'peakNumber',defaultPeakNumber);
|
|
addParameter(p,'mode',defaultMode,...
|
|
@(x) any(validatestring(x,expectedMode)));
|
|
parse(p,DataTable,varargin{:});
|
|
|
|
% add empty variable to table
|
|
existColumn = strcmp('spectrum_countsNorm',DataTable.Properties.VariableNames);
|
|
if ~any(existColumn)
|
|
DataTable.spectrum_countsNorm = cell(size(DataTable,1),1);
|
|
end
|
|
|
|
existColumn = strcmp('logScaleRange',DataTable.Properties.VariableNames);
|
|
if ~any(existColumn)
|
|
DataTable.logBackgroundRange = NaN(size(DataTable,1),2);
|
|
end
|
|
existColumn = strcmp('logScaleMode',DataTable.Properties.VariableNames);
|
|
if ~any(existColumn)
|
|
DataTable.logBackgroundMode = cellstr(repmat(' ',size(p.Results.DataTable,1),1));
|
|
end
|
|
existColumn = strcmp('logScaleDate',DataTable.Properties.VariableNames);
|
|
if ~any(existColumn)
|
|
DataTable.logBackgroundDate = 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
|
|
|
|
|
|
% 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},'ibw')
|
|
% get name and date of input file and replace old region with new
|
|
% region. This will be the files where the peak area is taken from.
|
|
tmpName = replace(p.Results.DataTable(p.Results.tableSelection,:).name{ii}, ...
|
|
p.Results.regionOld,p.Results.regionNew);
|
|
tmpDate = p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatenum(ii);
|
|
% select spectra based on the new names and dates of original file
|
|
tmpDataSelection = contains(p.Results.DataTable.name,tmpName)...
|
|
& ismember(year(p.Results.DataTable.lastModifiedDatenum),year(tmpDate))...
|
|
& ismember(month(p.Results.DataTable.lastModifiedDatenum),month(tmpDate))...
|
|
& ismember(day(p.Results.DataTable.lastModifiedDatenum),day(tmpDate))...
|
|
& ismember(hour(p.Results.DataTable.lastModifiedDatenum),hour(tmpDate))...
|
|
& ismember(minute(p.Results.DataTable.lastModifiedDatenum),minute(tmpDate));
|
|
% check peak area
|
|
existColumn = strcmp('peakArea',DataTable.Properties.VariableNames);
|
|
if any(existColumn)
|
|
if isnan(DataTable( tmpDataSelection,:).peakArea(p.Results.peakNumber))
|
|
disp('The peak area appears to be empty. I quit now')
|
|
disp(DataTable( tmpDataSelection,:).name{ii})
|
|
error('The peak area appears to be empty.')
|
|
end
|
|
else
|
|
disp('The data table appear to have not peak area column. I quit now')
|
|
error('No peak area column')
|
|
end
|
|
% do the norming
|
|
if contains(p.Results.mode,'area')
|
|
DataTable(p.Results.tableSelection,:).spectrum_countsNorm{ii} = ...
|
|
DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}...
|
|
./ DataTable( tmpDataSelection,:).peakArea(p.Results.peakNumber);
|
|
elseif contains(p.Results.mode,'intensity')
|
|
disp('Intensity mode not yet programmed for XPS data')
|
|
end
|
|
|
|
elseif endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5')
|
|
% if ~exist(p.Results.energyStart) | ~exist(p.Results.energyEnd)
|
|
% disp('The energy region used for normalisation appears to be empty. I quit now')
|
|
% error('The energy region used to normalise appears to be empty.')
|
|
% end
|
|
if contains(p.Results.mode,'intensity')
|
|
if 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});
|
|
% MEAN
|
|
b_1 = find(xData >= p.Results.energyStart,1);
|
|
b_2 = find(xData >= p.Results.energyEnd,1);
|
|
|
|
b_mean = mean(yData(b_1:b_2));
|
|
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});
|
|
% MEAN
|
|
b_1 = find(xData <= p.Results.energyStart,1);
|
|
b_2 = find(xData <= p.Results.energyEnd,1);
|
|
|
|
b_mean = mean(yData(b_2:b_1));
|
|
else
|
|
disp('Warning: Issue with NEXAFS_col_scaling')
|
|
end
|
|
|
|
tmp_3(:,1) = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}...
|
|
./b_mean;
|
|
|
|
DataTable(p.Results.tableSelection,:).spectrum_countsNorm{ii} = tmp_3;
|
|
clearvars tmp_3
|
|
elseif contains(p.Results.mode,'area')
|
|
if 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});
|
|
% Area
|
|
b_1 = find(xData >= p.Results.energyStart,1);
|
|
b_2 = find(xData >= p.Results.energyEnd,1);
|
|
|
|
b_area = trapz(xData(b_1:b_2),yData(b_1:b_2));
|
|
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});
|
|
% MEAN
|
|
b_1 = find(xData <= p.Results.energyStart,1);
|
|
b_2 = find(xData <= p.Results.energyEnd,1);
|
|
|
|
b_area = trapz(xData(b_2:b_1),yData(b_2:b_1));
|
|
else
|
|
disp('Warning: Issue with NEXAFS_col_scaling')
|
|
end
|
|
|
|
tmp_3(:,1) = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}...
|
|
./b_area;
|
|
|
|
DataTable(p.Results.tableSelection,:).spectrum_countsNorm{ii} = tmp_3;
|
|
clearvars tmp_3
|
|
|
|
end
|
|
end
|
|
end
|
|
% write log to table
|
|
DataTable.logScaleMode(p.Results.tableSelection,:) = cellstr(repmat(p.Results.mode,size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
|
|
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5')
|
|
DataTable.logScaleRange(p.Results.tableSelection,:) = repmat([p.Results.energyStart p.Results.energyEnd],size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
|
|
end
|
|
DataTable.logScaleDate(p.Results.tableSelection,:) = cellstr(repmat(datestr(now),size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
|
|
|
|
end |