From fa1323b96d1a31f7fe164bc4e0b32832455d2652 Mon Sep 17 00:00:00 2001 From: ThorBarRa Date: Thu, 27 Feb 2025 08:59:53 +0100 Subject: [PATCH] Added peak area ratio as fitting constrain. Additional small bug fixes (not sure what I did) --- beamtime/addPhotonEnergy.m | 2 +- beamtime/addSampleNotes.m | 6 +- beamtime/nappDetermineShiftXps.m | 16 +- beamtime/nappFitGaussXps.m | 270 ++++++++++++++++++++----------- import/nappFileList.m | 12 +- 5 files changed, 202 insertions(+), 104 deletions(-) diff --git a/beamtime/addPhotonEnergy.m b/beamtime/addPhotonEnergy.m index c4fd443..6cf282a 100644 --- a/beamtime/addPhotonEnergy.m +++ b/beamtime/addPhotonEnergy.m @@ -11,7 +11,7 @@ function FileList = addPhotonEnergy(FileList,fileNumber,notesToAdd,dataMonth,dat % * the month and the year that the data was acquired for ii = 1:length(fileNumber) - tmpMatch = (startsWith(FileList.name, sprintf('%04.0f',fileNumber(ii)))) & ... + tmpMatch = (startsWith(FileList.name, sprintf('%04.0f',fileNumber(ii))) | startsWith(FileList.name, sprintf('NAPP%04.0f',fileNumber(ii)))) & ... (month(FileList.lastModifiedDatenum) == dataMonth) &... (year(FileList.lastModifiedDatenum) == dataYear) &... (endsWith(FileList.name, '.ibw')); diff --git a/beamtime/addSampleNotes.m b/beamtime/addSampleNotes.m index 9c069d2..3f8c601 100644 --- a/beamtime/addSampleNotes.m +++ b/beamtime/addSampleNotes.m @@ -27,11 +27,13 @@ for ii = 1:length(fileNumber) else if matches(tableSelection,'XPS') % select the data - tmpMatch = (startsWith(DataTable.name, sprintf('%04.0f',fileNumber(ii)))) & ... + + tmpMatch = (startsWith(DataTable.name, sprintf('%04.0f',fileNumber(ii))) | startsWith(DataTable.name, sprintf('NAPP%04.0f',fileNumber(ii)))) & ... (month(DataTable.lastModifiedDatenum) == dataMonth) &... (year(DataTable.lastModifiedDatenum) == dataYear) &... (endsWith(DataTable.name, '.ibw')); - elseif matches(tableSelection,'NEXAFS') + + elseif (matches(tableSelection,'NEXAFS') | matches(tableSelection,'.h5')) % select the data tmpMatch = (startsWith(DataTable.name, sprintf('%04.0f',fileNumber(ii)))) & ... (month(DataTable.lastModifiedDatenum) == dataMonth) &... diff --git a/beamtime/nappDetermineShiftXps.m b/beamtime/nappDetermineShiftXps.m index 03929ae..3098866 100644 --- a/beamtime/nappDetermineShiftXps.m +++ b/beamtime/nappDetermineShiftXps.m @@ -22,7 +22,7 @@ function DataTable = nappDetermineShiftXps(DataTable, varargin) % kinEnReference: Sequence iteration to which the image should be % aligned, default is 1. % refPeak: Peak number the position of which will be used to compute the -% BE shift. Only for Gauss fit. Default 1. +% BE shift. Only for Gauss fit. Default 1. % minPeakWidth: findpeak parameter, default 0.1 % minPeakHeight: findpeak parameter, default 0.1 % movMeanWindow: findpeak parameter, default 1 @@ -329,23 +329,23 @@ else tmp_1(ii,1) = p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}-locs(I)-p.Results.binEnReference; clearvars tmp_2 end - DataTable.bindingEnergyShift(p.Results.tableSelection) = tmp_1; + DataTable.bindingEnergyShift(p.Results.tableSelection) = tmp_1; elseif matches(p.Results.mode,'gaussFit') tmpFitResults = nappFitGaussXps(DataTable,p.Results.FitParameter,p.Results.tableSelection,... 'energyScale','kinetic','mode',p.Results.FitParameter.fitMode,'showFigures','on','tableVariable',p.Results.tableVariable); - - DataTable.bindingEnergyShift(p.Results.tableSelection) = tmpFitResults(p.Results.tableSelection,:).xRayEkinRange_eV(:,1) - tmpFitResults(p.Results.tableSelection,:).peakPosition(:,p.Results.FitParameter.refPeak) - repmat(p.Results.binEnReference,size(DataTable.bindingEnergyShift(p.Results.tableSelection))); - DataTable.peakPosition(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakPosition; - DataTable.peakArea(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakArea; - DataTable.peakFWHM(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakFWHM; + + DataTable.bindingEnergyShift(p.Results.tableSelection) = tmpFitResults(p.Results.tableSelection,:).xRayEkinRange_eV(:,1) - tmpFitResults(p.Results.tableSelection,:).peakPosition(:,p.Results.FitParameter.refPeak) - repmat(p.Results.binEnReference,size(DataTable.bindingEnergyShift(p.Results.tableSelection))); + DataTable.peakPosition(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakPosition; + DataTable.peakArea(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakArea; + DataTable.peakFWHM(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakFWHM; %% end - + end try fh = findobj( 'Type', 'Figure', 'Name', 'Gauss Multi Fit '); diff --git a/beamtime/nappFitGaussXps.m b/beamtime/nappFitGaussXps.m index 75ef4c9..3631523 100644 --- a/beamtime/nappFitGaussXps.m +++ b/beamtime/nappFitGaussXps.m @@ -9,8 +9,8 @@ function DataTable = nappFitGaussXps(DataTable,varargin) % FileList: data table tmpFitParameters: You can give settings for the 4 % peaks (5 in some cases), use small (negligible) values if you are % interested in less than 4 peaks. -% -% % „position“ mode +% +% % „position“ mode % tmpFitParameters.peakArea = [abs#1 abs#2 abs#3 abs#4]; % tmpFitParameters.peakWidth = [abs#1 abs#2 abs#3 abs#4]; % tmpFitParameters.peakPos = [abs#1 rel#2 rel#3 rel#4]; @@ -24,11 +24,11 @@ function DataTable = nappFitGaussXps(DataTable,varargin) % spectrum range % tmpFitParameters.backgroundRange = [5 5]; % -% % „unconstrained“ mode +% % „unconstrained“ mode % tmpFitParameters.peakArea = [abs#1 abs#2 abs#3 abs#4]; % tmpFitParameters.peakWidth = [abs#1 abs#2 abs#3 abs#4]; % tmpFitParameters.peakPos = [abs#1 abs#2 abs#3 abs#4]; -% +% % tmpFitParameters.peakAreaUpperBond = [#1 #2 #3 #4]; % tmpFitParameters.peakWidthUpperBond = [#1 #2 #3 #4]; % tmpFitParameters.peakPosUpperBond = [#1 #2 #3 #4]; @@ -38,7 +38,7 @@ function DataTable = nappFitGaussXps(DataTable,varargin) % spectrum range % tmpFitParameters.backgroundRange = [5 5]; % -% % „ widthPosition“ mode +% % „widthPosition“ mode % tmpFitParameters.peakArea = [abs#1 abs#2 abs#3 abs#4 abs#5]; % tmpFitParameters.peakWidth = [abs#1-#5]; % tmpFitParameters.peakPos = [abs#1 rel#2 rel#3 rel#4 rel#5]; @@ -52,7 +52,7 @@ function DataTable = nappFitGaussXps(DataTable,varargin) % % spectrum range % tmpFitParameters.backgroundRange = [5 5]; % -% % „ width“ mode +% % „ width“ mode % tmpFitParameters.peakArea = [abs#1 abs#2 abs#3 abs#4]; % tmpFitParameters.peakWidth = [abs#1-#4]; % tmpFitParameters.peakPos = [abs#1 abs#2 abs#3 abs#4]; @@ -65,7 +65,7 @@ function DataTable = nappFitGaussXps(DataTable,varargin) % tmpFitParameters.peakPosLowerBond = [#1 #2 #3 #4]; % spectrum range % tmpFitParameters.backgroundRange = [5 5]; -% +% % % „unconstrainedAndWidthPosition" mode (novel: rel distance fit parameter) % tmpFitParameters.peakArea = [abs#1 abs#2 abs#3 abs#4 abs#5]; % tmpFitParameters.peakWidth = [abs#1,2,4,5 abs#3]; @@ -123,7 +123,7 @@ function DataTable = nappFitGaussXps(DataTable,varargin) defaultTableVariable = 'spectrum_countsPerSecond'; expectedTableVariable = {'spectrum_counts','spectrum_countsPerSecond','spectrum_countsNorm'}; defaultMode = 'widthPosition'; -expectedMode = {'unconstrained','widthPosition','position','width','unconstrainedAndWidthPosition','gasAndTwoAcidBasePairs'}; +expectedMode = {'unconstrained','widthPosition','position','width','unconstrainedAndWidthPosition','gasAndTwoAcidBasePairs','widthPositionAreaRatio','widthPositionAmineAreaRatio'}; defaultTableSelection = true(size(DataTable,1),1); defaultShowFigures = 'on'; expectedShowFigures = {'on','off'}; @@ -252,7 +252,7 @@ elseif matches(p.Results.mode,'widthPosition') lb = [p.Results.FitParameter.peakAreaLowerBond(1,1) p.Results.FitParameter.peakWidthLowerBond(1,1) p.Results.FitParameter.peakPosLowerBond(1,1) ... % Gauss peak 1 p.Results.FitParameter.peakAreaLowerBond(1,2) ... % Gauss peak 2 p.Results.FitParameter.peakAreaLowerBond(1,3) ... % Gauss peak 3 - p.Results.FitParameter.peakAreaLowerBond(1,4) ... + p.Results.FitParameter.peakAreaLowerBond(1,4) ... p.Results.FitParameter.peakAreaLowerBond(1,5) ... % Gauss peak 5 -Inf -Inf]; % linear background % upper bond @@ -301,7 +301,7 @@ elseif matches(p.Results.mode,'unconstrainedAndWidthPosition') % Novum, also the % initial value B0= [p.Results.FitParameter.peakArea(1,1) p.Results.FitParameter.peakWidth(1,1) p.Results.FitParameter.peakPos(1,2)... % Gauss peak 1 p.Results.FitParameter.peakArea(1,2) ... % Gauss peak 2 - p.Results.FitParameter.peakArea(1,3) p.Results.FitParameter.peakWidth(1,2) p.Results.FitParameter.peakPos(1,3)... % Gauss peak 3 + p.Results.FitParameter.peakArea(1,3) p.Results.FitParameter.peakWidth(1,2) p.Results.FitParameter.peakPos(1,3)... % Gauss peak 3 p.Results.FitParameter.peakArea(1,4) p.Results.FitParameter.peakPos(1,4)... % Gauss peak 4 p.Results.FitParameter.peakArea(1,5) p.Results.FitParameter.peakPos(1,5)... % Gauss peak 5 1 0 ... % linear background @@ -324,8 +324,8 @@ elseif matches(p.Results.mode,'unconstrainedAndWidthPosition') % Novum, also the Inf Inf ... % linear background p.Results.FitParameter.peakPosUpperBond(1,1)]; % shift upper bond - elseif matches(p.Results.mode,'gasAndTwoAcidBasePairs') % Novum, also the distance between peaks is a fit parameter. - % [Gauss = area/(width*sqrt(pi/2)) * exp(-2*(x-position)^2/width^2)] +elseif matches(p.Results.mode,'gasAndTwoAcidBasePairs') % Novum, also the distance between peaks is a fit parameter. + % [Gauss = area/(width*sqrt(pi/2)) * exp(-2*(x-position)^2/width^2)] yfcn1 = @(tmpB,x)... tmpB(1)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1) - (tmpB(3)+tmpB(14))).^2/tmpB(2).^2)) ... % Gauss peak 1: width and position + tmpB(4)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1) - tmpB(3)).^2/tmpB(2).^2))... % Gauss peak 2: width and position @@ -337,7 +337,7 @@ elseif matches(p.Results.mode,'unconstrainedAndWidthPosition') % Novum, also the % initial value B0= [p.Results.FitParameter.peakArea(1,1) p.Results.FitParameter.peakWidth(1,1) p.Results.FitParameter.peakPos(1,2)... % Gauss peak 1 p.Results.FitParameter.peakArea(1,2) ... % Gauss peak 2 - p.Results.FitParameter.peakArea(1,3) p.Results.FitParameter.peakWidth(1,2) p.Results.FitParameter.peakPos(1,3)... % Gauss peak 3 + p.Results.FitParameter.peakArea(1,3) p.Results.FitParameter.peakWidth(1,2) p.Results.FitParameter.peakPos(1,3)... % Gauss peak 3 p.Results.FitParameter.peakArea(1,4) p.Results.FitParameter.peakPos(1,4)... % Gauss peak 4 p.Results.FitParameter.peakArea(1,5) p.Results.FitParameter.peakPos(1,5)... % Gauss peak 5 1 0 ... % linear background @@ -359,6 +359,53 @@ elseif matches(p.Results.mode,'unconstrainedAndWidthPosition') % Novum, also the p.Results.FitParameter.peakAreaUpperBond(1,5) p.Results.FitParameter.peakPosUpperBond(1,5) ... % Gauss peak 4 Inf Inf ... % linear background p.Results.FitParameter.peakPosUpperBond(1,1)]; % shift upper bond + +elseif matches(p.Results.mode,'widthPositionAreaRatio') + yfcn1 = @(tmpB,x)... + tmpB(1)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1) - tmpB(3)).^2/tmpB(2).^2)) ... % Gauss peak 1 + + tmpB(1)*p.Results.FitParameter.peakArea(1,2)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,2))).^2/tmpB(2).^2))... % Gauss peak 2 + + tmpB(1)*p.Results.FitParameter.peakArea(1,3)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,3))).^2/tmpB(2).^2))... % Gauss peak 3 + + tmpB(1)*p.Results.FitParameter.peakArea(1,4)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,4))).^2/tmpB(2).^2))... % Gauss peak 4 + + tmpB(1)*p.Results.FitParameter.peakArea(1,5)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,5))).^2/tmpB(2).^2))... % Gauss peak 4 + +tmpB(4).*x(:,1)+tmpB(5); % linear background + + % initial value + B0= [p.Results.FitParameter.peakArea(1,1) p.Results.FitParameter.peakWidth(1,1) p.Results.FitParameter.peakPos(1,1)... % Gauss peak 1 + 1 0]; % linear background + % lower bonds + lb = [p.Results.FitParameter.peakAreaLowerBond(1,1) p.Results.FitParameter.peakWidthLowerBond(1,1) p.Results.FitParameter.peakPosLowerBond(1,1) ... % Gauss peak 1 + -Inf -Inf]; % linear background + % upper bond + ub = [p.Results.FitParameter.peakAreaUpperBond(1,1) p.Results.FitParameter.peakWidthUpperBond(1,1) p.Results.FitParameter.peakPosUpperBond(1,1) ... % Gauss peak 1 + Inf Inf]; % linear background + +elseif matches(p.Results.mode,'widthPositionAmineAreaRatio') + yfcn1 = @(tmpB,x)... + tmpB(1)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1) - tmpB(3)).^2/tmpB(2).^2)) ... % Gauss peak 1 + + tmpB(4)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,2))).^2/tmpB(2).^2))... % Gauss peak 2 + + tmpB(4)*p.Results.FitParameter.peakArea(1,3)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,3))).^2/tmpB(2).^2))... % Gauss peak 3 + + tmpB(5)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,4))).^2/tmpB(2).^2))... % Gauss peak 4 + + tmpB(6)/(tmpB(2)*sqrt(pi/2))*exp(-2.*((x(:,1)- (tmpB(3)+p.Results.FitParameter.peakPos(1,5))).^2/tmpB(2).^2))... % Gauss peak 4 + +tmpB(7).*x(:,1)+tmpB(8); % linear background + + % initial value + B0= [p.Results.FitParameter.peakArea(1,1) p.Results.FitParameter.peakWidth(1,1) p.Results.FitParameter.peakPos(1,1)... % Gauss peak 1 + p.Results.FitParameter.peakArea(1,2) ... % Gauss peak 3 + p.Results.FitParameter.peakArea(1,4)... + p.Results.FitParameter.peakArea(1,5)...% Gauss peak 5 + 1 0]; % linear background + % lower bonds + lb = [p.Results.FitParameter.peakAreaLowerBond(1,1) p.Results.FitParameter.peakWidthLowerBond(1,1) p.Results.FitParameter.peakPosLowerBond(1,1) ... % Gauss peak 1 + p.Results.FitParameter.peakAreaLowerBond(1,2) ... % Gauss peak 3 + p.Results.FitParameter.peakAreaLowerBond(1,4) ... + p.Results.FitParameter.peakAreaLowerBond(1,5) ... % Gauss peak 5 + -Inf -Inf]; % linear background + % upper bond + ub = [p.Results.FitParameter.peakAreaUpperBond(1,1) p.Results.FitParameter.peakWidthUpperBond(1,1) p.Results.FitParameter.peakPosUpperBond(1,1) ... % Gauss peak 1 + p.Results.FitParameter.peakAreaUpperBond(1,2) ... % Gauss peak 3 + p.Results.FitParameter.peakAreaUpperBond(1,4) ... + p.Results.FitParameter.peakAreaUpperBond(1,5) ...% Gauss peak 5 + Inf Inf]; % linear background end for ii = 1:size(DataTable(p.Results.tableSelection,:),1) @@ -435,8 +482,7 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1) tmpB(5) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,3)... tmpB(6) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,4)... tmpB(8) tmpB(9)... - tmpB(7) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,5)... - NaN NaN NaN]; + tmpB(7) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,5)]; elseif matches(p.Results.mode,'width') B = [tmpB(1) tmpB(2) tmpB(3)... tmpB(4) tmpB(2) tmpB(5)... @@ -458,6 +504,20 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1) tmpB(8) tmpB(2) tmpB(11)+tmpB(9)... tmpB(12) tmpB(13) ... tmpB(10) tmpB(2) tmpB(11)]; + elseif matches(p.Results.mode,'widthPositionAreaRatio') + B = [tmpB(1) tmpB(2) tmpB(3)... + tmpB(1)*p.Results.FitParameter.peakArea(1,2) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,2)... + tmpB(1)*p.Results.FitParameter.peakArea(1,3) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,3)... + tmpB(1)*p.Results.FitParameter.peakArea(1,4) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,4)... + tmpB(4) tmpB(5)... + tmpB(1)*p.Results.FitParameter.peakArea(1,5) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,5)]; + elseif matches(p.Results.mode,'widthPositionAmineAreaRatio') + B = [tmpB(1) tmpB(2) tmpB(3)... + tmpB(4) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,2)... + tmpB(4)*p.Results.FitParameter.peakArea(1,3) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,3)... + tmpB(5) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,4)... + tmpB(7) tmpB(8)... + tmpB(6) tmpB(2) tmpB(3)+p.Results.FitParameter.peakPos(1,5)]; end % print out result table and result plots based on B. Because B has the @@ -472,51 +532,51 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1) disp(DataTable(p.Results.tableSelection,:).name{ii}); disp(' ' ); if (B(1) <= 1 || B(4) <= 1) - disp(cell2table({sprintf('%.1f',B(3)),... - sprintf('%.1f',B(2)*sqrt(log(4))),... - sprintf('%.1f',B(2)),... - sprintf('%.3f',B(1));... - sprintf('%.1f',B(6)),... - sprintf('%.1f',B(5)*sqrt(log(4))),... - sprintf('%.1f',B(5)),... - sprintf('%.3f',B(4));... - sprintf('%.1f',B(9)),... - sprintf('%.1f',B(8)*sqrt(log(4))),... - sprintf('%.1f',B(8)),... - sprintf('%.3f',B(7));... - sprintf('%.1f',B(12)),... - sprintf('%.1f',B(11)*sqrt(log(4))),... - sprintf('%.1f',B(11)),... - sprintf('%.3f',B(10)); ... - sprintf('%.1f',B(17)),... - sprintf('%.1f',B(16)*sqrt(log(4))),... - sprintf('%.1f',B(16)),... - sprintf('%.3f',B(15))},... - 'VariableNames',{'position';'FWHW';'width';'area'},... - 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); % 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); + disp(cell2table({sprintf('%.1f',B(3)),... + sprintf('%.1f',B(2)*sqrt(log(4))),... + sprintf('%.1f',B(2)),... + sprintf('%.3f',B(1));... + sprintf('%.1f',B(6)),... + sprintf('%.1f',B(5)*sqrt(log(4))),... + sprintf('%.1f',B(5)),... + sprintf('%.3f',B(4));... + sprintf('%.1f',B(9)),... + sprintf('%.1f',B(8)*sqrt(log(4))),... + sprintf('%.1f',B(8)),... + sprintf('%.3f',B(7));... + sprintf('%.1f',B(12)),... + sprintf('%.1f',B(11)*sqrt(log(4))),... + sprintf('%.1f',B(11)),... + sprintf('%.3f',B(10)); ... + sprintf('%.1f',B(17)),... + sprintf('%.1f',B(16)*sqrt(log(4))),... + sprintf('%.1f',B(16)),... + sprintf('%.3f',B(15))},... + 'VariableNames',{'position';'FWHW';'width';'area'},... + 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); % 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); else - disp(cell2table({sprintf('%.1f',B(3)),... - sprintf('%.1f',B(2)*sqrt(log(4))),... - sprintf('%.1f',B(2)),... - sprintf('%7.0f',B(1));... - sprintf('%.1f',B(6)),... - sprintf('%.1f',B(5)*sqrt(log(4))),... - sprintf('%.1f',B(5)),... - sprintf('%7.0f',B(4));... - sprintf('%.1f',B(9)),... - sprintf('%.1f',B(8)*sqrt(log(4))),... - sprintf('%.1f',B(8)),... - sprintf('%7.0f',B(7));... - sprintf('%.1f',B(12)),... - sprintf('%.1f',B(11)*sqrt(log(4))),... - sprintf('%.1f',B(11)),... - sprintf('%7.0f',B(10)); ... - sprintf('%.1f',B(17)),... - sprintf('%.1f',B(16)*sqrt(log(4))),... - sprintf('%.1f',B(16)),... - sprintf('%7.0f',B(15))},... - 'VariableNames',{'position';'FWHW';'width';'area'},... - 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); % 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); + disp(cell2table({sprintf('%.1f',B(3)),... + sprintf('%.1f',B(2)*sqrt(log(4))),... + sprintf('%.1f',B(2)),... + sprintf('%7.0f',B(1));... + sprintf('%.1f',B(6)),... + sprintf('%.1f',B(5)*sqrt(log(4))),... + sprintf('%.1f',B(5)),... + sprintf('%7.0f',B(4));... + sprintf('%.1f',B(9)),... + sprintf('%.1f',B(8)*sqrt(log(4))),... + sprintf('%.1f',B(8)),... + sprintf('%7.0f',B(7));... + sprintf('%.1f',B(12)),... + sprintf('%.1f',B(11)*sqrt(log(4))),... + sprintf('%.1f',B(11)),... + sprintf('%7.0f',B(10)); ... + sprintf('%.1f',B(17)),... + sprintf('%.1f',B(16)*sqrt(log(4))),... + sprintf('%.1f',B(16)),... + sprintf('%7.0f',B(15))},... + 'VariableNames',{'position';'FWHW';'width';'area'},... + 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); % 'RowNames',{'peak1','peak2','peak3','peak4','peak5'})); end % plot result % eliminate NaN in B @@ -541,8 +601,8 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1) yData_pk4= Gauss(xGaussPlot ,B(10), B(12), B(11)); yData_pk5= Gauss(xGaussPlot ,B(15), B(17), B(16)); bkgrd = linear(xGaussPlot,B(13),B(14)); - - + + % plot fit h = plot(xGaussPlot,yData_pk1+yData_pk2+yData_pk3+yData_pk4+yData_pk5+bkgrd); hold on @@ -565,24 +625,24 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1) h.LineWidth=1.5; h.Color = PsiFarbe.gelb; plot(xGaussPlot, bkgrd); - if x1(1)<= x1(end) + if x1(1)<= x1(end) xlabel('Kinetic Energy [eV]'); - else - set(ax(1),'Xdir','reverse'); - xlabel('Binding Energy [eV]'); - end + else + set(ax(1),'Xdir','reverse'); + xlabel('Binding Energy [eV]'); + end % plot data plot(x1,y1,'o',"MarkerFaceColor","white") legend OFF if matches(p.Results.tableVariable,'spectrum_countsPerSecond') - ylabel('PE Intensity [counts per second]'); + ylabel('PE Intensity [counts per second]'); else - ylabel('PE intensity [-]'); + ylabel('PE intensity [-]'); end grid on end % Write results to List, we need all fitting results - resultsPeakPos(ii,:) = [B(3), B(6), B(9), B(12), B(16)] ; %#ok<*AGROW> + resultsPeakPos(ii,:) = [B(3), B(6), B(9), B(12), B(16)] ; %#ok<*AGROW> resultsPeakFWHW(ii,:) = [B(2).*sqrt(log(4)), B(5).*sqrt(log(4)), B(8).*sqrt(log(4)), B(11).*sqrt(log(4)), B(17).*sqrt(log(4))] ; resultsPeakArea(ii,:) = [B(1), B(4), B(7), B(10) B(15)] ; resultsBkgrd(ii,:) = [B(13), B(14)] ; @@ -611,34 +671,62 @@ try DataTable.peakBackground = NaN(size(DataTable,1),size(resultsBkgrd,2)); end %if contains(p.Results.energyScale,'binding') - DataTable(p.Results.tableSelection,:).peakPosition = resultsPeakPos(:,:); + DataTable(p.Results.tableSelection,:).peakPosition = resultsPeakPos(:,:); %end DataTable(p.Results.tableSelection,:).peakFWHM = resultsPeakFWHW(:,:); DataTable(p.Results.tableSelection,:).peakArea = resultsPeakArea(:,:); DataTable(p.Results.tableSelection,:).peakBackground = resultsBkgrd(:,:); catch - disp('Could not write results to table. Writing only 4 entries') - existColumn = strcmp('peakPosition',DataTable.Properties.VariableNames); - if ~any(existColumn) - DataTable.peakPosition = NaN(size(DataTable,1),size(resultsPeakPos,2)); - end - existColumn = strcmp('peakArea',DataTable.Properties.VariableNames); - if ~any(existColumn) - DataTable.peakArea = NaN(size(DataTable,1),size(resultsPeakArea,2)); - end - existColumn = strcmp('peakFWHM',DataTable.Properties.VariableNames); - if ~any(existColumn) - DataTable.peakFWHM = NaN(size(DataTable,1),size(resultsPeakFWHW,2)); - end - existColumn = strcmp('peakBackground',DataTable.Properties.VariableNames); - if ~any(existColumn) - DataTable.peakBackground = NaN(size(DataTable,1),size(resultsPeakFWHW,2)); - end - %if contains(p.Results.energyScale,'binding') + try + disp('Could not write results to table. Writing only 4 entries') + existColumn = strcmp('peakPosition',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakPosition = NaN(size(DataTable,1),size(resultsPeakPos,2)); + end + existColumn = strcmp('peakArea',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakArea = NaN(size(DataTable,1),size(resultsPeakArea,2)); + end + existColumn = strcmp('peakFWHM',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakFWHM = NaN(size(DataTable,1),size(resultsPeakFWHW,2)); + end + existColumn = strcmp('peakBackground',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakBackground = NaN(size(DataTable,1),size(resultsPeakFWHW,2)); + end + %if contains(p.Results.energyScale,'binding') DataTable(p.Results.tableSelection,:).peakPosition = resultsPeakPos(:,1:4); - %end - DataTable(p.Results.tableSelection,:).peakFWHM = resultsPeakFWHW(:,1:4); - DataTable(p.Results.tableSelection,:).peakArea = resultsPeakArea(:,1:4); + %end + DataTable(p.Results.tableSelection,:).peakFWHM = resultsPeakFWHW(:,1:4); + DataTable(p.Results.tableSelection,:).peakArea = resultsPeakArea(:,1:4); + DataTable(p.Results.tableSelection,:).peakBackground = resultsBkgrd(:,:); + catch + + disp('Could not write results to table. Writing only 2 entries') + existColumn = strcmp('peakPosition',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakPosition = NaN(size(DataTable,1),size(resultsPeakPos,2)); + end + existColumn = strcmp('peakArea',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakArea = NaN(size(DataTable,1),size(resultsPeakArea,2)); + end + existColumn = strcmp('peakFWHM',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakFWHM = NaN(size(DataTable,1),size(resultsPeakFWHW,2)); + end + existColumn = strcmp('peakBackground',DataTable.Properties.VariableNames); + if ~any(existColumn) + DataTable.peakBackground = NaN(size(DataTable,1),size(resultsPeakFWHW,2)); + end + %if contains(p.Results.energyScale,'binding') + DataTable(p.Results.tableSelection,:).peakPosition = resultsPeakPos(:,1:2); + %end + DataTable(p.Results.tableSelection,:).peakFWHM = resultsPeakFWHW(:,1:2); + DataTable(p.Results.tableSelection,:).peakArea = resultsPeakArea(:,1:2); + DataTable(p.Results.tableSelection,:).peakBackground = resultsBkgrd(:,1:2); + end end diff --git a/import/nappFileList.m b/import/nappFileList.m index 36d3718..5d27cf1 100755 --- a/import/nappFileList.m +++ b/import/nappFileList.m @@ -508,7 +508,10 @@ for ii = 1:size(TmpFileList{2},1) % do this for each list element catch tmp = h5read([TmpFileList{2}(ii).folder filesep TmpFileList{2}(ii).name],'/entry/instrument/NDAttributes/CenterEnergy'); % in eV end - TmpFileList{2}(ii).scientaEkinRange_eV = [tmp(1)-TmpFileList{2}(ii).scientaPassEnergy_eV/20 tmp(1)+TmpFileList{2}(ii).scientaPassEnergy_eV/20]; + + TmpFileList{2}(ii).scientaEkinRange_eV = [double(tmp(1))-TmpFileList{2}(ii).scientaPassEnergy_eV/20 double(tmp(1))+TmpFileList{2}(ii).scientaPassEnergy_eV/20]; + + TmpFileList{2}(ii).scientaEkinStep_eV = NaN; TmpFileList{2}(ii).scientaEkin_eV = linspace(TmpFileList{2}(ii).scientaEkinRange_eV(:,1)... ,TmpFileList{2}(ii).scientaEkinRange_eV(:,2),size(TmpFileList{2}(ii).image,1))'; @@ -531,6 +534,7 @@ for ii = 1:size(TmpFileList{2},1) % do this for each list element end TmpFileList{2}(ii).scientaEkin_eV = [TmpFileList{2}(ii).scientaEkinRange_eV(:,1):TmpFileList{2}(ii).scientaEkinStep_eV(1):TmpFileList{2}(ii).scientaEkinRange_eV(:,2)]'; end + clearvars tmp % read I_0 try @@ -563,8 +567,12 @@ for ii = 1:size(TmpFileList{2},1) % do this for each list element try TmpFileList{2}(ii).scientaRegionIterations = h5read([TmpFileList{2}(ii).folder filesep TmpFileList{2}(ii).name],'/scan 1/attrs/NumIterations'); catch + try tmp = h5read([TmpFileList{2}(ii).folder filesep TmpFileList{2}(ii).name],'/entry/instrument/NDAttributes/NumIterations'); - TmpFileList{2}(ii).scientaRegionIterations = tmp(1); + TmpFileList{2}(ii).scientaRegionIterations = double(tmp(1)); + catch + TmpFileList{2}(ii).scientaRegionIterations = 1; + end end TmpFileList{2}(ii).scientaSequenceIterations = 1;