Test script to fit some SLS data
+ +This calls all models in all varieties from the nappFitGaussXps.m function. Basically, to test that it is working. The data is random, so fitting is meaningless.
+ +Contents
+-
+
- +Random data for 2 peaks + +
- +TEST 1.1: Unconstrained kinetic Gauss linear + +
- +TEST 1.2: Unconstrained kinetic PV linear + +
- +TEST 1.3: Unconstrained kinetic Gauss Shirley + +
- +TEST 1.4: Unconstrained kinetic PV Shirley + +
- +TEST 1.5: Unconstrained binding Gauss linear + +
- +TEST 1.5.2: Unconstrained binding Gauss linear + +
- +TEST 1.6: Unconstrained binding PV linear + +
- +TEST 1.7: Unconstrained binding Gauss Shirley + +
- +TEST 1.8: Unconstrained binding PV Shirley + +
- +TEST 2.1: Position-Constrained kinetic Gaussian Linear + +
- +TEST 2.2: Position-Constrained kinetic PV Linear + +
- +TEST 2.3: Position-Constrained kinetic Gauss Shirley + +
- +TEST 2.4: Position-Constrained kinetic PV Shirley + +
- +TEST 2.5: Position binding Gauss linear + +
- +TEST 2.6: Position binding PV linear + +
- +TEST 2.7: Position binding Gauss Shirley + +
- +TEST 2.8: Position binding PV Shirley + +
- +TEST 2.9: Position kinetic PV Shirley shared + +
- +TEST 2.10: Position kinetic Gauss Shirley Shared + +
- +TEST 2.11: Position binding Gauss Shirley Shared + +
- +TEST 2.12: Position binding PV Shirley Shared + +
- +TEST 3.1: widthPosition kinetic Gauss linear + +
- +TEST 3.2: widthPosition kinetic PV linear + +
- +TEST 3.3: widthPosition kinetic Gauss Shirley + +
- +TEST 3.4: widthPosition kinetic PV Shirley + +
- +TEST 3.5: widthPosition binding Gauss linear + +
- +TEST 3.6: widthPosition binding PV linear + +
- +TEST 3.7: widthPosition binding Gauss Shirley + +
- +TEST 3.8: widthPosition binding PV Shirley + +
- +TEST 3.9: widthPosition kinetic Gauss Shirley Shared + +
- +TEST 3.10: widthPosition kinetic PV Shirley Shared + +
- +TEST 3.11: widthPosition binding Gauss Shirley Shared + +
- +TEST 3.12: widthPosition binding PV Shirley Shared + +
- +TEST 3.13: widthPosition kinetic PV Shirley & Eta Shared + +
- +TEST 3.14: widthPosition binding PV Shirley & Eta Shared + +
- +TEST 4.1: Width kinetic Gauss linear + +
- +TEST 4.2: Width kinetic PV linear + +
- +TEST 4.3: Width kinetic Gauss Shirley + +
- +TEST 4.4: Width kinetic PV Shirley + +
- +TEST 4.5: Width binding Gauss linear + +
- +TEST 4.6: Width binding PV linear + +
- +TEST 4.7: Width binding Gauss Shirley + +
- +TEST 4.8: Width binding PV Shirley + +
- +TEST 4.9: Width kinetic Gauss Shirley Shared + +
- +TEST 4.10: Width kinetic PV Shirley Shared + +
- +TEST 4.11: Width binding Gauss Shirley Shared + +
- +TEST 4.12: Width binding PV Shirley Shared + +
- +Random data for 5 peaks + +
- +Test 5.0 Custom ModelunconstrainedAndWidthPosition, kinetic, linear + +
- +Test 5.1 Custom ModelunconstrainedAndWidthPosition, binding, linear + +
- +Test 5.3 Custom widthPositionAmineAreaRatio, kinetic, linear + +
- +Test 5.4 Custom gasAndTwoAcidBasePairs, kinetic, linear + +
- +Test 5.5 Custom gasAndTwoAcidBasePairs, binding, linear + +
- +Test 5.6 Custom widthPositionAreaRatio, kinetic, linear + +
- +Test 5.7 Custom widthPositionAreaRatio, binding, linear + +
- +Random data for 4 peaks + +
- +Test 6.0 Custom TwoSpinOrbitDoublet, kinetic, linear + +
- +Test 6.1 Custom TwoSpinOrbitDoublet, binding, linear + +
- +Test 6.2 Custom TwoSpinOrbitDoublet, kinetic, Shirley + +
- +Test 6.3 Custom TwoSpinOrbitDoubletPseudoVoigtShirley, binding, Shirley + +
- +Helper Functions + +
Random data for 2 peaks
+clc +clearvars +close all + +% create data table consistent with ISS data +FitList = table; +FitList.sample = 'O1s, 120eV, m30, cps, 092022'; +FitList.name = {'random.ibw'}; +tmpDataSelection = matches(FitList.sample,'O1s, 120eV, m30, cps, 092022'); % This filters one specific spectrum by "sample name". + +% add random data on kinetic energy scale +x = linspace(105, 120, 100)'; +true_params = [99900 2 113; 29000 0.9 110.5]; +y = zeros(size(x)); +fwhm_to_sigma = @(fwhm) fwhm / (2*sqrt(2*log(2))); +for i = 1:size(true_params,1) + A = true_params(i,1); + sigma = fwhm_to_sigma(true_params(i,2)); + pos = true_params(i,3); + y = y + A * exp(-((x - pos).^2) / (2*sigma^2)); +end +y = y + (-195.*x+32980); +y = y + 1000 * randn(size(x)); % add noise +figure; +plot(x, y, 'k.'); +xlabel('Kinetic Energy'); +ylabel('Intensity'); +title('Raw Data without Shirley Tail'); +if ~ismember('scientaEkin_eV', FitList.Properties.VariableNames) + FitList.scientaEkin_eV = cell(size(FitList,1),1); +end +if ~ismember('spectrum_countsNorm', FitList.Properties.VariableNames) + FitList.spectrum_countsNorm = cell(size(FitList,1),1); +end +FitList(tmpDataSelection,:).scientaEkin_eV{:} = x; +FitList(tmpDataSelection,:).spectrum_countsNorm{:} = y; +index= find(FitList(tmpDataSelection,:).scientaEkin_eV{:}>113,1); +FitList(tmpDataSelection,:).spectrum_countsNorm{:}(1:index) = FitList(tmpDataSelection,:).spectrum_countsNorm{:}(1:index) + 1000; + +% add random data on binding energy scale +x = linspace(42, 30, 1000)'; +true_params = [800 0.4 36.2; 500 0.3 38.0]; +y = zeros(size(x)); +fwhm_to_sigma = @(fwhm) fwhm / (2*sqrt(2*log(2))); +for i = 1:size(true_params,1) + A = true_params(i,1); + sigma = fwhm_to_sigma(true_params(i,2)); + pos = true_params(i,3); + y = y + A * exp(-((x - pos).^2) / (2*sigma^2)); +end +% Simulate realistic Shirley-style background using smooth tanh transition +center = 36.5; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; +y = y + 5 * randn(size(x)); % add mild noise +figure; +plot(x, y, 'k.'); +xlabel('Binding Energy'); +ylabel('Intensity'); +title('Raw Data with Shirley Tail'); +set(gca, 'XDir', 'reverse'); grid on; +if ~ismember('bindingEnergy_eV', FitList.Properties.VariableNames) + FitList.bindingEnergy_eV = cell(size(FitList,1),1); +end +if ~ismember('spectrum_counts', FitList.Properties.VariableNames) + FitList.spectrum_counts = cell(size(FitList,1),1); +end +FitList(tmpDataSelection,:).bindingEnergy_eV{:} = x; +FitList(tmpDataSelection,:).spectrum_counts{:} = y; + +% plot +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_countsNorm','energyScale','kinetic'); +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_counts','energyScale','binding'); ++
TEST 1.1: Unconstrained kinetic Gauss linear
+Gaussian + Linear, individual area/width/position per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; % <- 2 values => 2 peaks +tmpFitParameters.peakWidth = [1.6 0.6]; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.0 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.0 1.2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; % <- selects fit range around peak1 + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','unconstrained','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition
+ ______________ ________________
+
+ {'random.ibw'} 112.99 110.5
+
+ name peakArea
+ ______________ ________________________
+
+ {'random.ibw'} 2.1226e+05 27727
+
+ name peakFWHM
+ ______________ ____________
+
+ {'random.ibw'} 2 0.88526
+
+ name peakBackground
+ ______________ __________________
+
+ {'random.ibw'} -332.34 49032
+
+
+
TEST 1.2: Unconstrained kinetic PV linear
+Pseudo-Voigt + Linear, individual area/width/eta/position per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = [1.6 0.6]; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.0 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.0 1.2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; % <- Gauss - Lorentzian ratio + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','unconstrained','backgroundMode','linear','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure... + Number of peaks detected: 2 ++
TEST 1.3: Unconstrained kinetic Gauss Shirley
+Gaussian + Shirley, individual area/width/position per peak, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = [1.6 0.6]; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.0 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.0 1.2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.001, 0.001]; % <- K controls Shirley step magnitude + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [10, 10]; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','unconstrained','backgroundMode','shirley','showFigures','off'); % <- background is now Shirley +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ ________________ ________________________ ____________ ______________
+
+ {'random.ibw'} 113.01 110.51 2.1191e+05 26111 2 0.85481 0 10088
+
+ name peakEta peakShirleyK
+ ______________ __________ ____________________
+
+ {'random.ibw'} NaN NaN 0.014409 0.010989
+
+
+
TEST 1.4: Unconstrained kinetic PV Shirley
+Pseudo-Voigt + Shirley, individual area/width/eta/position per peak, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = [1.6 0.6]; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.0 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.0 1.2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; % <- Gauss - Lorentzian ratio + tmpFitParameters.peakEtaLowerBound = [0.0 0.0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.001, 0.001]; % <- K controls Shirley step magnitude + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [10, 10]; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','unconstrained','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ ________________ ________________________ ____________ ______________
+
+ {'random.ibw'} 113.01 110.51 2.1524e+05 25896 2 0.85069 0 9897
+
+ name peakEta peakShirleyK
+ ______________ __________________ ____________________
+
+ {'random.ibw'} 0.96301 1 0.013671 0.019616
+
+
+
TEST 1.5: Unconstrained binding Gauss linear
+Gaussian + Linear, individual area/width/position per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; + +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... % <- process binding energy + 'mode','unconstrained','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition
+ ______________ ____________
+
+ {'random.ibw'} 38 36.2
+
+ name peakArea
+ ______________ ________________
+
+ {'random.ibw'} 161.41 339.54
+
+ name peakFWHM
+ ______________ __________________
+
+ {'random.ibw'} 0.30274 0.39891
+
+ name peakBackground
+ ______________ ________________
+
+ {'random.ibw'} 4.499 -66.192
+
+
+
TEST 1.5.2: Unconstrained binding Gauss linear
+Gaussian + Linear, individual area/width/position per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 1e4 100]; % <- 3 peaks +tmpFitParameters.peakWidth = [1.6 1.6 1.6]; +tmpFitParameters.peakPos = [38 37 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e2 1e2 1e2]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 37 35]; +tmpFitParameters.peakPosUpperBound = [39 37.5 37]; + +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','unconstrained','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 3
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 3 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________
+
+ {'random.ibw'} 38.002 37.5 36.198
+
+ name peakArea
+ ______________ __________________________
+
+ {'random.ibw'} 141.14 100 331.37
+
+ name peakFWHM
+ ______________ _____________________________
+
+ {'random.ibw'} 0.27818 2 0.39199
+
+ name peakBackground
+ ______________ _________________
+
+ {'random.ibw'} 3.7559 -45.397
+
+
+
TEST 1.6: Unconstrained binding PV linear
+Pseudo-Voigt + Linear, individual area/width/eta/position per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; % <- back to 2 peaks +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + LINEAR variant: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','unconstrained','backgroundMode','linear','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________ __________________________ _____________________________ _________________
+
+ {'random.ibw'} 38 36.2 NaN 166.69 339.68 NaN 0.29956 0.399 NaN 4.4343 -64.288
+
+ name peakEta peakShirleyK
+ ______________ _____________________________ _________________
+
+ {'random.ibw'} 0.89096 1 NaN NaN NaN NaN
+
+
+
TEST 1.7: Unconstrained binding Gauss Shirley
+Gaussian + Shirley, individual area/width/position per peak, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; % <- K controls Shirley step magnitude + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','unconstrained','backgroundMode','shirley','showFigures','off'); + +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+2 out of 3 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.997 36.197 NaN 158.68 344.57 NaN 0.29936 0.40291 NaN 0 80.681
+
+ name peakEta peakShirleyK
+ ______________ _________________ ________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.090928 0.060519 NaN
+
+
+
TEST 1.8: Unconstrained binding PV Shirley
+Pseudo-Voigt + Shirley, individual area/width/eta/position per peak, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; % <- K controls Shirley step magnitude + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','unconstrained','backgroundMode','shirley','showFigures','off'); + +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.997 36.198 NaN 159.35 357.04 NaN 0.30019 0.39955 NaN 0 79.747
+
+ name peakEta peakShirleyK
+ ______________ _______________________ _______________________________
+
+ {'random.ibw'} 1 0.89055 NaN 0.10961 0.052005 NaN
+
+
+
TEST 2.1: Position-Constrained kinetic Gaussian Linear
+Gaussian + Linear, first peak position free, other peaks offset fixed
+clc +clearvars tmpFitParameters; +tmpFitParameters.peakArea = [1e5 1e5]; % <- 2 peaks +tmpFitParameters.peakWidth = [2 1]; +tmpFitParameters.peakPos = [113 -2.32]; % <- pos peak #2 is relative to peak #1 +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1E4 1E4]; +tmpFitParameters.peakAreaUpperBound = [1E6 1E6]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.5 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.5 1.5]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112.5; % <- only pos 1 is fitted +tmpFitParameters.peakPosUpperBound = 113.5; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','position','backgroundMode','linear','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ ____________________________ __________________
+
+ {'random.ibw'} 112.98 110.66 NaN 2.0893e+05 27722 NaN 1.9636 0.96037 NaN -323.76 48305
+
+ name peakEta peakShirleyK
+ ______________ _________________ _________________
+
+ {'random.ibw'} NaN NaN NaN NaN NaN NaN
+
+
+
TEST 2.2: Position-Constrained kinetic PV Linear
+Pseudo-Voigt + Linear, first peak position free, other peaks offset fixed
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 1e5]; +tmpFitParameters.peakWidth = [2 1]; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1E4 1E4]; +tmpFitParameters.peakAreaUpperBound = [1E6 1E6]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.5 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.5 1.5]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112.5; +tmpFitParameters.peakPosUpperBound = 113.5; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','position','backgroundMode','linear','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ ____________________________ __________________
+
+ {'random.ibw'} 112.98 110.66 NaN 2.0881e+05 28143 NaN 1.9628 0.95856 NaN -321.99 48089
+
+ name peakEta peakShirleyK
+ ______________ _______________________ _________________
+
+ {'random.ibw'} 1 0.95559 NaN NaN NaN NaN
+
+
+
TEST 2.3: Position-Constrained kinetic Gauss Shirley
+Gaussian + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +tmpFitParameters.peakArea = [1e5 1e5]; +tmpFitParameters.peakWidth = [2 1]; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1E4 1E4]; +tmpFitParameters.peakAreaUpperBound = [1E6 1E6]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.5 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.5 1.5]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112.5; +tmpFitParameters.peakPosUpperBound = 113.5; +tmpFitParameters.backgroundRange = [12 6]; + % SHIRLEY: + tmpFitParameters.peakShirleyK = [0.01, 0.001]; + tmpFitParameters.peakShirleyKLowerBound = [0.0, 0.0]; + tmpFitParameters.peakShirleyKUpperBound = [Inf, Inf]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','position','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ ___________________________ ______________
+
+ {'random.ibw'} 112.98 110.66 NaN 2.1721e+05 27055 NaN 2.012 0.91594 NaN 0 9838.1
+
+ name peakEta peakShirleyK
+ ______________ _________________ ______________________________________
+
+ {'random.ibw'} NaN NaN NaN 1.1215e-17 0.15213 NaN
+
+
+
TEST 2.4: Position-Constrained kinetic PV Shirley
+Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 1e5]; +tmpFitParameters.peakWidth = [2 1]; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1E4 1E4]; +tmpFitParameters.peakAreaUpperBound = [1E6 1E6]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.5 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.5 1.5]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112.5; +tmpFitParameters.peakPosUpperBound = 113.5; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + % SHIRLEY: + tmpFitParameters.peakShirleyK = [0.01, 0.001]; + tmpFitParameters.peakShirleyKLowerBound = [0.0, 0.0]; + tmpFitParameters.peakShirleyKUpperBound = [Inf, Inf]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','position','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 112.97 110.65 NaN 2.2521e+05 26167 NaN 2.01 0.89985 NaN 0 9379.8
+
+ name peakEta peakShirleyK
+ ______________ _____________________________ ______________________________________
+
+ {'random.ibw'} 0.90898 1 NaN 1.1167e-17 0.16586 NaN
+
+
+
TEST 2.5: Position binding Gauss linear
+Gaussian + Linear, first peak position free, other peaks offset fixed
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','position','backgroundMode','linear','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________ __________________________ _____________________________ ________________
+
+ {'random.ibw'} 38 36.2 NaN 161.41 339.54 NaN 0.30274 0.39891 NaN 4.499 -66.193
+
+ name peakEta peakShirleyK
+ ______________ _________________ _________________
+
+ {'random.ibw'} NaN NaN NaN NaN NaN NaN
+
+
+
TEST 2.6: Position binding PV linear
+Pseudo-Voigt + Linear, first peak position free, other peaks offset fixed
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + LINEAR variant: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','position','backgroundMode','linear','showFigures','on'); +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________
+
+ {'random.ibw'} 38 36.2 NaN
+
+ name peakArea
+ ______________ _________________________
+
+ {'random.ibw'} 166.7 339.68 NaN
+
+ name peakFWHM
+ ______________ _____________________________
+
+ {'random.ibw'} 0.29956 0.39901 NaN
+
+ name peakBackground
+ ______________ _________________
+
+ {'random.ibw'} 4.4342 -64.285
+
+ name peakEta
+ ______________ _____________________________
+
+ {'random.ibw'} 0.89075 1 NaN
+
+
+
TEST 2.7: Position binding Gauss Shirley
+Gaussian + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','position','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.997 36.197 NaN 158.68 344.56 NaN 0.29935 0.4029 NaN 0 80.679
+
+ name peakEta peakShirleyK
+ ______________ _________________ ________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.090755 0.060597 NaN
+
+
+
TEST 2.8: Position binding PV Shirley
+Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; % <- 1 K for each peak + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','position','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 4 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.997 36.197 NaN 159.22 356.34 NaN 0.30002 0.39958 NaN 0 79.756
+
+ name peakEta peakShirleyK
+ ______________ _______________________ ______________________________
+
+ {'random.ibw'} 1 0.89508 NaN 0.1062 0.053513 NaN
+
+
+
TEST 2.9: Position kinetic PV Shirley shared
+Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 1e5]; +tmpFitParameters.peakWidth = [2 1]; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1E4 1E4]; +tmpFitParameters.peakAreaUpperBound = [1E6 1E6]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.5 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.5 1.5]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112.5; +tmpFitParameters.peakPosUpperBound = 113.5; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + % SHIRLEY: + tmpFitParameters.peakShirleyK = 0.01; % <- same K for all peaks + tmpFitParameters.peakShirleyKLowerBound = 0.0; + tmpFitParameters.peakShirleyKUpperBound = Inf; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','positionShirley','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 112.99 110.67 NaN 2.0881e+05 26346 NaN 1.9658 0.9424 NaN 0 10519
+
+ name peakEta peakShirleyK
+ ______________ _______________ _____________________________
+
+ {'random.ibw'} 1 1 NaN 0.01253 0.01253 NaN
+
+
+
TEST 2.10: Position kinetic Gauss Shirley Shared
+Gaussian + Shirley, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +tmpFitParameters.peakArea = [1e5 1e5]; +tmpFitParameters.peakWidth = [2 1]; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1E4 1E4]; +tmpFitParameters.peakAreaUpperBound = [1E6 1E6]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.5 0.6]; +tmpFitParameters.peakWidthUpperBound = [2.5 1.5]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112.5; +tmpFitParameters.peakPosUpperBound = 113.5; +tmpFitParameters.backgroundRange = [12 6]; + % SHIRLEY: + tmpFitParameters.peakShirleyK = 0.01; + tmpFitParameters.peakShirleyKLowerBound = 0.0; + tmpFitParameters.peakShirleyKUpperBound = Inf; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','positionShirley','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 112.99 110.67 NaN 2.0881e+05 26346 NaN 1.9658 0.9424 NaN 0 10519
+
+ name peakEta peakShirleyK
+ ______________ _________________ _____________________________
+
+ {'random.ibw'} NaN NaN NaN 0.01253 0.01253 NaN
+
+
+
TEST 2.11: Position binding Gauss Shirley Shared
+Gaussian + Shirley, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.01; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 100; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','positionShirley','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 4 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.997 36.197 NaN 158.03 343.26 NaN 0.29852 0.4019 NaN 0 80.547
+
+ name peakEta peakShirleyK
+ ______________ _________________ ________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.069475 0.069475 NaN
+
+
+
TEST 2.12: Position binding PV Shirley Shared
+Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = [1.6 1.6 ]; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [0.2 0.2]; +tmpFitParameters.peakWidthUpperBound = [2.0 2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.01; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 100; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','positionShirley','backgroundMode','shirley','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 4 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________
+
+ {'random.ibw'} 37.997 36.197 NaN
+
+ name peakArea
+ ______________ __________________________
+
+ {'random.ibw'} 158.05 348.71 NaN
+
+ name peakFWHM
+ ______________ _____________________________
+
+ {'random.ibw'} 0.29854 0.39983 NaN
+
+ name peakBackground
+ ______________ ______________
+
+ {'random.ibw'} 0 80.022
+
+ name peakEta
+ ______________ _______________________
+
+ {'random.ibw'} 1 0.94589 NaN
+
+ name peakShirleyK
+ ______________ ________________________________
+
+ {'random.ibw'} 0.069109 0.069109 NaN
+
+
+
TEST 3.1: widthPosition kinetic Gauss linear
+Gaussian + Linear, shared width, first peak position free, other peaks offset fixed
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; % <- 2 peaks +tmpFitParameters.peakWidth = 1.6; % <- one width for all peaks +tmpFitParameters.peakPos = [113 -2.32]; % <- positions relative to peak1 +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112; +tmpFitParameters.peakPosUpperBound = 114; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPosition','backgroundMode','linear','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ _______________________ __________________
+
+ {'random.ibw'} 113.04 110.72 NaN 2.0058e+05 41563 NaN 1.867 1.867 NaN -269.69 41861
+
+ name peakEta peakShirleyK
+ ______________ _________________ _________________
+
+ {'random.ibw'} NaN NaN NaN NaN NaN NaN
+
+
+
TEST 3.2: widthPosition kinetic PV linear
+Pseudo-Voigt + Linear, shared width, first peak position free, other peaks offset fixed
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112; +tmpFitParameters.peakPosUpperBound = 114; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPosition','backgroundMode','linear','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ __________________
+
+ {'random.ibw'} 113.04 110.72 NaN 1.9879e+05 53903 NaN 1.8688 1.8688 NaN -224.69 36273
+
+ name peakEta peakShirleyK
+ ______________ _______________________ _________________
+
+ {'random.ibw'} 1 0.40299 NaN NaN NaN NaN
+
+
+
TEST 3.3: widthPosition kinetic Gauss Shirley
+Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112; +tmpFitParameters.peakPosUpperBound = 114; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.001, 0.001]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [10, 10]; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPosition','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 113.04 110.72 NaN 2.0367e+05 41896 NaN 1.8806 1.8806 NaN 0 10361
+
+ name peakEta peakShirleyK
+ ______________ _________________ ___________________________
+
+ {'random.ibw'} NaN NaN NaN 0.001 0.05436 NaN
+
+
+
TEST 3.4: widthPosition kinetic PV Shirley
+Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112; +tmpFitParameters.peakPosUpperBound = 114; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0.0 0.0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.001, 0.001]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [10, 10]; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPosition','backgroundMode','shirley','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________
+
+ {'random.ibw'} 113.04 110.72 NaN
+
+ name peakArea
+ ______________ ______________________________________
+
+ {'random.ibw'} 2.0064e+05 55404 NaN
+
+ name peakFWHM
+ ______________ __________________________
+
+ {'random.ibw'} 1.8783 1.8783 NaN
+
+ name peakBackground
+ ______________ ______________
+
+ {'random.ibw'} 0 9972.6
+
+ name peakEta
+ ______________ _______________________
+
+ {'random.ibw'} 1 0.35861 NaN
+
+ name peakShirleyK
+ ______________ _____________________________
+
+ {'random.ibw'} 0.001 0.034913 NaN
+
+
+
TEST 3.5: widthPosition binding Gauss linear
+Gaussian + Linear, shared width, first peak position free, other peaks offset fixed
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPosition','backgroundMode','linear','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________ __________________________ _____________________________ _________________
+
+ {'random.ibw'} 38 36.2 NaN 178.45 329.79 NaN 0.37613 0.37613 NaN 4.2762 -58.777
+
+ name peakEta peakShirleyK
+ ______________ _________________ _________________
+
+ {'random.ibw'} NaN NaN NaN NaN NaN NaN
+
+
+
TEST 3.6: widthPosition binding PV linear
+Pseudo-Voigt + Linear, shared width, first peak position free, other peaks offset fixed
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + LINEAR variant: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPosition','backgroundMode','linear','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+1 out of 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________ __________________________ _____________________________ _________________
+
+ {'random.ibw'} 38 36.2 NaN 177.35 347.05 NaN 0.36994 0.36994 NaN 4.2705 -59.821
+
+ name peakEta peakShirleyK
+ ______________ _______________________ _________________
+
+ {'random.ibw'} 1 0.82672 NaN NaN NaN NaN
+
+
+
TEST 3.7: widthPosition binding Gauss Shirley
+Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPosition','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 11 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.998 36.198 NaN 177.53 334.34 NaN 0.37884 0.37884 NaN 0 81.607
+
+ name peakEta peakShirleyK
+ ______________ _________________ ________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.083602 0.051366 NaN
+
+
+
TEST 3.8: widthPosition binding PV Shirley
+Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPosition','backgroundMode','shirley','showFigures','off'); + +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.998 36.198 NaN 176.87 376.53 NaN 0.36743 0.36743 NaN 0 78.42
+
+ name peakEta peakShirleyK
+ ______________ _______________________ _______________________________
+
+ {'random.ibw'} 1 0.63825 NaN 0.13562 0.028569 NaN
+
+
+
TEST 3.9: widthPosition kinetic Gauss Shirley Shared
+Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112; +tmpFitParameters.peakPosUpperBound = 114; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.001; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 10; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPositionShirley','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 113.04 110.72 NaN 2.0056e+05 40339 NaN 1.8695 1.8695 NaN 0 10531
+
+ name peakEta peakShirleyK
+ ______________ _________________ ___________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.0091774 0.0091774 NaN
+
+
+
TEST 3.10: widthPosition kinetic PV Shirley Shared
+Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112; +tmpFitParameters.peakPosUpperBound = 114; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0.0 0.0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.1; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 10; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPositionShirley','backgroundMode','shirley','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________
+
+ {'random.ibw'} 113.04 110.72 NaN
+
+ name peakArea
+ ______________ ______________________________________
+
+ {'random.ibw'} 1.9813e+05 56900 NaN
+
+ name peakFWHM
+ ______________ __________________________
+
+ {'random.ibw'} 1.8704 1.8704 NaN
+
+ name peakBackground
+ ______________ ______________
+
+ {'random.ibw'} 0 10166
+
+ name peakEta
+ ______________ _______________________
+
+ {'random.ibw'} 1 0.26558 NaN
+
+ name peakShirleyK
+ ______________ ___________________________________
+
+ {'random.ibw'} 0.0060439 0.0060439 NaN
+
+
+
TEST 3.11: widthPosition binding Gauss Shirley Shared
+Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; % <- Too many parameters, + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; % Will run anyway + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; % but show a warning. + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPositionShirley','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+24 out of 25 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.998 36.198 NaN 176.65 332.86 NaN 0.37769 0.37769 NaN 0 81.436
+
+ name peakEta peakShirleyK
+ ______________ _________________ ________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.061951 0.061951 NaN
+
+
+
TEST 3.12: widthPosition binding PV Shirley Shared
+Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.01; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 100; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPositionShirley','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.998 36.198 NaN 174.65 360.94 NaN 0.36721 0.36721 NaN 0 78.743
+
+ name peakEta peakShirleyK
+ ______________ _______________________ ________________________________
+
+ {'random.ibw'} 1 0.72536 NaN 0.061437 0.061437 NaN
+
+
+
TEST 3.13: widthPosition kinetic PV Shirley & Eta Shared
+Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K, shared PV eta
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 -2.32]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 112; +tmpFitParameters.peakPosUpperBound = 114; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = 1; + tmpFitParameters.peakEtaLowerBound = 0.0; + tmpFitParameters.peakEtaUpperBound = 1.0; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.1; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 10; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPositionShirleyEta','backgroundMode','shirley','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________
+
+ {'random.ibw'} 113.04 110.72 NaN
+
+ name peakArea
+ ______________ ______________________________________
+
+ {'random.ibw'} 2.0056e+05 40339 NaN
+
+ name peakFWHM
+ ______________ __________________________
+
+ {'random.ibw'} 1.8695 1.8695 NaN
+
+ name peakBackground
+ ______________ ______________
+
+ {'random.ibw'} 0 10531
+
+ name peakEta
+ ______________ _______________
+
+ {'random.ibw'} 1 1 NaN
+
+ name peakShirleyK
+ ______________ ___________________________________
+
+ {'random.ibw'} 0.0091774 0.0091774 NaN
+
+
+
TEST 3.14: widthPosition binding PV Shirley & Eta Shared
+Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K and PV eta
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 -1.8]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 37; +tmpFitParameters.peakPosUpperBound = 39; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = 1; + tmpFitParameters.peakEtaLowerBound = 0; + tmpFitParameters.peakEtaUpperBound = 1.0; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.01; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 100; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPositionShirleyEta','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.998 36.198 NaN 181.63 341.72 NaN 0.37433 0.37433 NaN 0 80.449
+
+ name peakEta peakShirleyK
+ ______________ _____________________________ ________________________________
+
+ {'random.ibw'} 0.90968 0.90968 NaN 0.059933 0.059933 NaN
+
+
+
TEST 4.1: Width kinetic Gauss linear
+Gaussian + Linear, shared width, individual areas and positions
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','width','backgroundMode','linear','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ __________________
+
+ {'random.ibw'} 113.03 110.63 NaN 2.0228e+05 41618 NaN 1.8803 1.8803 NaN -259.91 40642
+
+ name peakEta peakShirleyK
+ ______________ _________________ _________________
+
+ {'random.ibw'} NaN NaN NaN NaN NaN NaN
+
+
+
TEST 4.2: Width kinetic PV linear
+Pseudo-Voigt + Linear, shared width, individual areas, positions, and etas
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','width','backgroundMode','linear','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ________________
+
+ {'random.ibw'} 113.04 110.61 NaN 1.9965e+05 64093 NaN 1.8879 1.8879 NaN -172.1 29768
+
+ name peakEta peakShirleyK
+ ______________ _______________________ _________________
+
+ {'random.ibw'} 1 0.08888 NaN NaN NaN NaN
+
+
+
TEST 4.3: Width kinetic Gauss Shirley
+Gaussian + Shirley, shared width, individual areas and positions, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.001, 0.001]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [10, 10]; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','width','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 113.03 110.65 NaN 2.0463e+05 42032 NaN 1.8892 1.8892 NaN 0 10381
+
+ name peakEta peakShirleyK
+ ______________ _________________ _____________________________
+
+ {'random.ibw'} NaN NaN NaN 0.001 0.049002 NaN
+
+
+
TEST 4.4: Width kinetic PV Shirley
+Pseudo-Voigt + Shirley, shared width, individual areas, positions, and etas, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0.0 0.0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.001, 0.001]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [10, 10]; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','width','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ _______________________ ______________
+
+ {'random.ibw'} 113.04 110.6 NaN 2.0006e+05 67979 NaN 1.893 1.893 NaN 0 9671.6
+
+ name peakEta peakShirleyK
+ ______________ _____________________________ _____________________________
+
+ {'random.ibw'} 1 1.7875e-12 NaN 0.001 0.016524 NaN
+
+
+
TEST 4.5: Width binding Gauss linear
+Gaussian + Linear, shared width, individual areas and positions
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','width','backgroundMode','linear','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________ __________________________ _____________________________ _________________
+
+ {'random.ibw'} 38 36.2 NaN 178.45 329.79 NaN 0.37613 0.37613 NaN 4.2763 -58.783
+
+ name peakEta peakShirleyK
+ ______________ _________________ _________________
+
+ {'random.ibw'} NaN NaN NaN NaN NaN NaN
+
+
+
TEST 4.6: Width binding PV linear
+Pseudo-Voigt + Linear, shared width, individual areas, positions, and etas
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + LINEAR variant: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','width','backgroundMode','linear','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 17 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________ __________________________ _____________________________ _________________
+
+ {'random.ibw'} 38 36.2 NaN 177.35 347.04 NaN 0.36994 0.36994 NaN 4.2706 -59.824
+
+ name peakEta peakShirleyK
+ ______________ _______________________ _________________
+
+ {'random.ibw'} 1 0.82681 NaN NaN NaN NaN
+
+
+
TEST 4.7: Width binding Gauss Shirley
+Gaussian + Shirley, shared width, individual areas and positions, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','width','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.997 36.198 NaN 177.64 334.52 NaN 0.37898 0.37898 NaN 0 81.633
+
+ name peakEta peakShirleyK
+ ______________ _________________ ________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.086202 0.050048 NaN
+
+
+
TEST 4.8: Width binding PV Shirley
+Pseudo-Voigt + Shirley, shared width, individual areas, positions, and etas, Shirley K per peak
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = [0.01, 0.01]; + tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; + tmpFitParameters.peakShirleyKUpperBound = [100, 100]; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','width','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 7 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.995 36.2 NaN 177.27 379.09 NaN 0.36755 0.36755 NaN 0 78.411
+
+ name peakEta peakShirleyK
+ ______________ _____________________ _______________________________
+
+ {'random.ibw'} 1 0.6252 NaN 0.14837 0.022886 NaN
+
+
+
TEST 4.9: Width kinetic Gauss Shirley Shared
+Gaussian + Shirley, shared width, individual areas and positions, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.001; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 10; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthShirley','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 113.04 110.64 NaN 2.0225e+05 40491 NaN 1.8825 1.8825 NaN 0 10468
+
+ name peakEta peakShirleyK
+ ______________ _________________ ___________________________________
+
+ {'random.ibw'} NaN NaN NaN 0.0086228 0.0086228 NaN
+
+
+
TEST 4.10: Width kinetic PV Shirley Shared
+Pseudo-Voigt + Shirley, shared width, individual areas, positions, and etas, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [113 110]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [1e3 1e3]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [112 109]; +tmpFitParameters.peakPosUpperBound = [114 111]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT: + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0.0 0.0]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.001; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 10; + tmpFitParameters.peakShirleyOffset = 1E4; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthShirley','backgroundMode','shirley','showFigures','off'); +quickPlotKinetic(FitList,tmpDataSelection) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ ______________________________________ __________________________ ______________
+
+ {'random.ibw'} 113.04 110.6 NaN 1.9912e+05 67333 NaN 1.8892 1.8892 NaN 0 9850.2
+
+ name peakEta peakShirleyK
+ ______________ _____________________________ ___________________________________
+
+ {'random.ibw'} 1 2.7303e-14 NaN 0.0035491 0.0035491 NaN
+
+
+
TEST 4.11: Width binding Gauss Shirley Shared
+Gaussian + Shirley, shared width, individual areas and positions, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.01; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 100; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthShirley','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 12 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.998 36.197 NaN 176.65 332.86 NaN 0.37769 0.37769 NaN 0 81.434
+
+ name peakEta peakShirleyK
+ ______________ _________________ _____________________________
+
+ {'random.ibw'} NaN NaN NaN 0.06196 0.06196 NaN
+
+
+
TEST 4.12: Width binding PV Shirley Shared
+Pseudo-Voigt + Shirley, shared width, individual areas and positions, shared Shirley K
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [1e5 100]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [38 36]; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0.01 0.01]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.2; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [37 35]; +tmpFitParameters.peakPosUpperBound = [39 37]; +tmpFitParameters.backgroundRange = [12 6]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = [1 1]; + tmpFitParameters.peakEtaLowerBound = [0 0 ]; + tmpFitParameters.peakEtaUpperBound = [1.0, 1.0]; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.01; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 100; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthShirley','backgroundMode','shirley','showFigures','off'); +quickPlotBinding(FitList,tmpDataSelection) +xlim([34,39]) ++
Validating FitParameter structure...
+ Number of peaks detected: 2
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 14 local solver runs converged with a positive local solver exit flag.
+Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ __________________________ __________________________ _____________________________ ______________
+
+ {'random.ibw'} 37.998 36.198 NaN 174.65 360.96 NaN 0.36721 0.36721 NaN 0 78.737
+
+ name peakEta peakShirleyK
+ ______________ _______________________ ________________________________
+
+ {'random.ibw'} 1 0.72518 NaN 0.061454 0.061454 NaN
+
+
+
Random data for 5 peaks
+clc +close all +% binding +x = linspace(50, 30, 1000)'; +true_params = [800 1.6 36.2; 500 1.6 38.0;1000 0.3 39.0;800 1.6 40;500 1.6 40.5]; +y = zeros(size(x)); +fwhm_to_sigma = @(fwhm) fwhm / (2*sqrt(2*log(2))); +for i = 1:size(true_params,1) + A = true_params(i,1); + sigma = fwhm_to_sigma(true_params(i,2)); + pos = true_params(i,3); + y = y + A * exp(-((x - pos).^2) / (2*sigma^2)); +end +% Simulate realistic Shirley-style background using smooth tanh transition +center = 36.2; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + +center = 38; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + +center = 40; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + +center = 40.5; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + + +y = y + 5 * randn(size(x)); % add mild noise +figure; +plot(x, y, 'k.'); +xlabel('Binding Energy'); +ylabel('Intensity'); +title('Raw Data with Shirley Tail'); +set(gca, 'XDir', 'reverse'); grid on; +hold on; +if ~ismember('bindingEnergy_eV', FitList.Properties.VariableNames) + FitList.bindingEnergy_eV = cell(size(FitList,1),1); +end +if ~ismember('spectrum_counts', FitList.Properties.VariableNames) + FitList.spectrum_counts = cell(size(FitList,1),1); +end +FitList(tmpDataSelection,:).bindingEnergy_eV{:} = x; +FitList(tmpDataSelection,:).spectrum_counts{:} = y; + +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_counts','energyScale','binding'); + + +% kinetic +x = linspace(30, 45, 1000)'; +true_params = [800 1.6 36.2; 500 1.6 38.0;1000 0.3 39.0;800 1.6 40;500 1.6 40.5]; +y = zeros(size(x)); +fwhm_to_sigma = @(fwhm) fwhm / (2*sqrt(2*log(2))); +for i = 1:size(true_params,1) + A = true_params(i,1); + sigma = fwhm_to_sigma(true_params(i,2)); + pos = true_params(i,3); + y = y + A * exp(-((x - pos).^2) / (2*sigma^2)); +end +y = y + 5 * randn(size(x)); % add mild noise +figure; +plot(x, y, 'k.'); +xlabel('Kinetic Energy'); +ylabel('Intensity'); +title('Raw Data without Shirley Tail'); +grid on; +hold on; + +FitList(tmpDataSelection,:).scientaEkin_eV{:} = x; +FitList(tmpDataSelection,:).spectrum_countsNorm{:} = y; + +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_countsNorm','energyScale','kinetic'); ++
Test 5.0 Custom ModelunconstrainedAndWidthPosition, kinetic, linear
+Custom: Gaussian + Linear, shared width for 2 peaks, individual area/position for 5 peaks (peak count must match hardcoded equation: 5 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5]; +tmpFitParameters.peakWidth = [1.6 0.6]; +tmpFitParameters.peakPos = [-1.8 38 39 41 41] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.0 0.1]; +tmpFitParameters.peakWidthUpperBound = [2.0 1.2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [-1.8 38 39 41 41]-1; +tmpFitParameters.peakPosUpperBound = [-1.8 38 39 41 41]+1; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','unconstrainedAndWidthPosition','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 5
+Found 5 valid peaks (non-NaN)
+ name peakPosition
+ ______________ ____________________________________________
+
+ {'random.ibw'} 36.2 37.997 39 40 40.507
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1359.5 853.1 321.4 1373.6 840.22
+
+ name peakFWHM
+ ______________ __________________________________________________
+
+ {'random.ibw'} 1.5961 1.5961 0.30004 1.5961 1.5961
+
+ name peakBackground
+ ______________ ______________________
+
+ {'random.ibw'} -0.031208 1.246
+
+
+
Test 5.1 Custom ModelunconstrainedAndWidthPosition, binding, linear
+Custom: Gaussian + Linear, shared width for 2 peaks, individual area/position for 5 peaks (peak count must match hardcoded equation: 5 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5]; +tmpFitParameters.peakWidth = [1.6 0.6]; +tmpFitParameters.peakPos = [-1.8 38 39 41 41] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1.0 0.1]; +tmpFitParameters.peakWidthUpperBound = [2.0 1.2]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [-1.8 38 39 41 41]-1; +tmpFitParameters.peakPosUpperBound = [-1.8 38 39 41 41]+1; +tmpFitParameters.backgroundRange = [12 12]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','unconstrainedAndWidthPosition','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 5
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+27 out of 30 local solver runs converged with a positive local solver exit flag.
+Found 5 valid peaks (non-NaN)
+ name peakPosition
+ ______________ ______________________________________________
+
+ {'random.ibw'} 36.218 38.036 39.001 40.146 41.171
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1333.6 853.51 329.61 2055.8 219.92
+
+ name peakFWHM
+ ______________ __________________________________________________
+
+ {'random.ibw'} 1.5999 1.5999 0.30481 1.5999 1.5999
+
+ name peakBackground
+ ______________ _________________
+
+ {'random.ibw'} 11.364 -54.982
+
+
+
Test 5.3 Custom widthPositionAmineAreaRatio, kinetic, linear
+Custom: Gaussian + Linear, shared width, constrained area ratios, 5 peaks with position/area constraints (peak count must match hardcoded equation: 5 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 5e5 1 5e5 5e5]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [36 1.8 2.8 3.8 5.5 6] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = 34; +tmpFitParameters.peakPosUpperBound = 36; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPositionAmineAreaRatio','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 5
+Found 5 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________________
+
+ {'random.ibw'} 36 37.8 38.8 39.8 41.5
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1716.2 592.77 592.77 2423.3 905.56
+
+ name peakFWHM
+ ______________ _____________________
+
+ {'random.ibw'} 2 2 2 2 2
+
+ name peakBackground
+ ______________ __________________
+
+ {'random.ibw'} -21.402 667.62
+
+
+
Test 5.4 Custom gasAndTwoAcidBasePairs, kinetic, linear
+Custom: Gaussian + Linear, 2 shared widths, constrained to acid-base pair model, 5 peaks (peak count must match hardcoded equation: 5 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5]; +tmpFitParameters.peakWidth = [1 0.3]; +tmpFitParameters.peakPos = [-1 36 39 -1 41] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [100 100 100 100 100]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1 0.1]; +tmpFitParameters.peakWidthUpperBound = [1.6 1]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [-1 37 39 -1 41]-1 ; +tmpFitParameters.peakPosUpperBound = [-1 37 39 -1 41]+1 ; +tmpFitParameters.backgroundRange = [12 12]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','gasAndTwoAcidBasePairs','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 5
+Found 5 valid peaks (non-NaN)
+ name peakPosition
+ ______________ ____________________________________________
+
+ {'random.ibw'} 36.2 37.997 39 39.997 40.504
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1359.3 852.88 321.29 1360.3 853.74
+
+ name peakFWHM
+ ______________ __________________________________________________
+
+ {'random.ibw'} 1.5959 1.5959 0.29999 1.5959 1.5959
+
+ name peakBackground
+ ______________ ____________________
+
+ {'random.ibw'} -0.02561 1.0647
+
+
+
Test 5.5 Custom gasAndTwoAcidBasePairs, binding, linear
+Custom: Gaussian + Linear, 2 shared widths, constrained to acid-base pair model, 5 peaks (peak count must match hardcoded equation: 5 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5]; +tmpFitParameters.peakWidth = [1 0.3]; +tmpFitParameters.peakPos = [-1 36 39 -1 41] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [100 100 100 100 100]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = [1 0.1]; +tmpFitParameters.peakWidthUpperBound = [1.6 1]; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [-1 37 39 -1 41]-1 ; +tmpFitParameters.peakPosUpperBound = [-1 37 39 -1 41]+1 ; +tmpFitParameters.backgroundRange = [12 12]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','gasAndTwoAcidBasePairs','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 5
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 5 valid peaks (non-NaN)
+ name peakPosition
+ ______________ _____________________________________________
+
+ {'random.ibw'} 36.21 38 39 40.068 40.791
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1311.7 840.6 330.9 1780.9 478.83
+
+ name peakFWHM
+ ______________ __________________________________________________
+
+ {'random.ibw'} 1.5726 1.5726 0.30548 1.5726 1.5726
+
+ name peakBackground
+ ______________ _________________
+
+ {'random.ibw'} 12.414 -90.617
+
+
+
Test 5.6 Custom widthPositionAreaRatio, kinetic, linear
+Custom: Gaussian + Linear, shared width, fixed area ratios from first peak, 5 peaks (peak count must match hardcoded equation: 5 peaks)
++% pos 2-5 of area bounds and position bounds are not used for fitting, but +% function requires during input validation that these vectors are non NaN +% and have same length as peakArea. Therefore we need a workaround: set +% values to 0. +clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 1 1 1 1]; % <- area ratio rel to peak #1 +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [36 2 3 4 5] ; % <- position relative to peak #1 +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0]; % <- workaround +tmpFitParameters.peakAreaUpperBound = [Inf 0 0 0 0];% <- workaround +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.5; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [34 0 0 0 0];% <- workaround +tmpFitParameters.peakPosUpperBound = [36 0 0 0 0];% <- workaround +tmpFitParameters.backgroundRange = [12 12]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','widthPositionAreaRatio','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 5
+Found 5 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________
+
+ {'random.ibw'} 36 38 39 40 41
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 975.33 975.33 975.33 975.33 975.33
+
+ name peakFWHM
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1.6527 1.6527 1.6527 1.6527 1.6527
+
+ name peakBackground
+ ______________ __________________
+
+ {'random.ibw'} -4.4239 157.4
+
+
+
Test 5.7 Custom widthPositionAreaRatio, binding, linear
+Custom: Gaussian + Linear, shared width, fixed area ratios from first peak, 5 peaks (peak count must match hardcoded equation: 5 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 1 1 1 1]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [36 2 3 4 5] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0]; % <- workaround +tmpFitParameters.peakAreaUpperBound = [Inf 0 0 0 0];% <- workaround +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 0.5; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [34 0 0 0 0];% <- workaround +tmpFitParameters.peakPosUpperBound = [36 0 0 0 0];% <- workaround +tmpFitParameters.backgroundRange = [12 12]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','widthPositionAreaRatio','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 5
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 5 local solver runs converged with a positive local solver exit flag.
+Found 5 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________
+
+ {'random.ibw'} 36 38 39 40 41
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 961.76 961.76 961.76 961.76 961.76
+
+ name peakFWHM
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1.6351 1.6351 1.6351 1.6351 1.6351
+
+ name peakBackground
+ ______________ _________________
+
+ {'random.ibw'} 10.816 -31.968
+
+
+
Random data for 4 peaks
+clc +close all +% binding +x = linspace(50, 30, 1000)'; +true_params = [800 1.6 36; 400 1.6 37.0;800 1.6 40;500 1.6 41]; +y = zeros(size(x)); +fwhm_to_sigma = @(fwhm) fwhm / (2*sqrt(2*log(2))); +for i = 1:size(true_params,1) + A = true_params(i,1); + sigma = fwhm_to_sigma(true_params(i,2)); + pos = true_params(i,3); + y = y + A * exp(-((x - pos).^2) / (2*sigma^2)); +end +% Simulate realistic Shirley-style background using smooth tanh transition +center = 36; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + +center = 37; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + +center = 40; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + +center = 401; width = 3; +shirley_step = 75 + 45 * (1 + tanh((x - center)/width))/2; +y = y + shirley_step; + + +y = y + 5 * randn(size(x)); % add mild noise +figure; +plot(x, y, 'k.'); +xlabel('Binding Energy'); +ylabel('Intensity'); +title('Raw Data with Shirley Tail'); +set(gca, 'XDir', 'reverse'); grid on; +hold on; +if ~ismember('bindingEnergy_eV', FitList.Properties.VariableNames) + FitList.bindingEnergy_eV = cell(size(FitList,1),1); +end +if ~ismember('spectrum_counts', FitList.Properties.VariableNames) + FitList.spectrum_counts = cell(size(FitList,1),1); +end +FitList(tmpDataSelection,:).bindingEnergy_eV{:} = x; +FitList(tmpDataSelection,:).spectrum_counts{:} = y; + +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_counts','energyScale','binding'); + + +% kinetic +x = linspace(30, 45, 1000)'; +true_params = [800 1.6 36; 400 1.6 37.0;800 1.6 40;400 1.6 41]; +y = zeros(size(x)); +fwhm_to_sigma = @(fwhm) fwhm / (2*sqrt(2*log(2))); +for i = 1:size(true_params,1) + A = true_params(i,1); + sigma = fwhm_to_sigma(true_params(i,2)); + pos = true_params(i,3); + y = y + A * exp(-((x - pos).^2) / (2*sigma^2)); +end +y = y + 5 * randn(size(x)); % add mild noise +figure; +plot(x, y, 'k.'); +xlabel('Kinetic Energy'); +ylabel('Intensity'); +title('Raw Data without Shirley Tail'); +grid on; +hold on; + +FitList(tmpDataSelection,:).scientaEkin_eV{:} = x; +FitList(tmpDataSelection,:).spectrum_countsNorm{:} = y; + +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_countsNorm','energyScale','kinetic'); ++
Test 6.0 Custom TwoSpinOrbitDoublet, kinetic, linear
+Custom: Gaussian + Linear, shared width, positions are relative, spin-orbit doublet pair model with intensity ratios, 4 peaks (peak count must match hardcoded equation: 4 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [36 1 4] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [34 NaN 3]; +tmpFitParameters.peakPosUpperBound = [36 NaN 5]; +tmpFitParameters.backgroundRange = [12 6]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','TwoSpinOrbitDoublet','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 4
+Found 4 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________________________
+
+ {'random.ibw'} 36 37 40.001 41.001 NaN
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1364.3 682.16 1365.7 682.87 NaN
+
+ name peakFWHM
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1.6027 1.6027 1.6027 1.6027 NaN
+
+ name peakBackground
+ ______________ ____________________
+
+ {'random.ibw'} -0.12453 3.7123
+
+
+
Test 6.1 Custom TwoSpinOrbitDoublet, binding, linear
+Custom: Gaussian + Linear, spin-orbit doublet pair model with intensity ratios, 4 peaks (peak count must match hardcoded equation: 4 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [36 1 4] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [34 NaN 3]; +tmpFitParameters.peakPosUpperBound = [36 NaN 5]; +tmpFitParameters.backgroundRange = [12 12]; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','TwoSpinOrbitDoublet','backgroundMode','linear','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 4
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 4 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________________________
+
+ {'random.ibw'} 36 37 40.062 41.062 NaN
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1380.1 690.03 1528.5 764.25 NaN
+
+ name peakFWHM
+ ______________ _________________________________________
+
+ {'random.ibw'} 1.661 1.661 1.661 1.661 NaN
+
+ name peakBackground
+ ______________ _________________
+
+ {'random.ibw'} 9.5173 0.47017
+
+
+
Test 6.2 Custom TwoSpinOrbitDoublet, kinetic, Shirley
+Custom: Pseudo-Voigt + Shirley, spin-orbit doublet pair model with intensity ratios, shared Shirley K, 4 peaks (peak count must match hardcoded equation: 4 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [36 1 4] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [34 NaN 3]; +tmpFitParameters.peakPosUpperBound = [36 NaN 5]; +tmpFitParameters.backgroundRange = [12 12]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = 1; + tmpFitParameters.peakEtaLowerBound = 0; + tmpFitParameters.peakEtaUpperBound = 1.0; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.0001; + tmpFitParameters.peakShirleyKLowerBound = 0; + tmpFitParameters.peakShirleyKUpperBound = 0.0001; + tmpFitParameters.peakShirleyOffset = 0; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_countsNorm','energyScale','kinetic',... + 'mode','TwoSpinOrbitDoubletPseudoVoigtShirley','backgroundMode','shirley','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 4
+Found 4 valid peaks (non-NaN)
+ name peakPosition
+ ______________ __________________________________________
+
+ {'random.ibw'} 36 37 40.001 41.001 NaN
+
+ name peakArea
+ ______________ ____________________________________________
+
+ {'random.ibw'} 1362 681.01 1362.5 681.25 NaN
+
+ name peakFWHM
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1.6001 1.6001 1.6001 1.6001 NaN
+
+ name peakBackground
+ ______________ _______________
+
+ {'random.ibw'} 0 1.9145e-08
+
+ name peakEta
+ ______________ _____________________________
+
+ {'random.ibw'} 1 1 1 1 NaN
+
+ name peakShirleyK
+ ______________ _____________________________________________________________
+
+ {'random.ibw'} 6.422e-13 6.422e-13 6.422e-13 6.422e-13 NaN
+
+
+
Test 6.3 Custom TwoSpinOrbitDoubletPseudoVoigtShirley, binding, Shirley
+Custom: Pseudo-Voigt + Shirley, spin-orbit doublet pair model with intensity ratios, shared Shirley K, 4 peaks (peak count must match hardcoded equation: 4 peaks)
+clearvars tmpFitParameters; +clc +tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5]; +tmpFitParameters.peakWidth = 1.6; +tmpFitParameters.peakPos = [36 1 4] ; +% Bounds for areas (lower and upper) +tmpFitParameters.peakAreaLowerBound = [0 0 0 0]; +tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf]; +% Bounds for widths +tmpFitParameters.peakWidthLowerBound = 1.0; +tmpFitParameters.peakWidthUpperBound = 2.0; +% Bounds for positions +tmpFitParameters.peakPosLowerBound = [34 NaN 3]; +tmpFitParameters.peakPosUpperBound = [36 NaN 5]; +tmpFitParameters.backgroundRange = [12 12]; +% PSEUDO-VOIGT + tmpFitParameters.peakEta = 1; + tmpFitParameters.peakEtaLowerBound = 0; + tmpFitParameters.peakEtaUpperBound = 1.0; +% SHIRLEY variant: + tmpFitParameters.peakShirleyK = 0.1; + tmpFitParameters.peakShirleyKLowerBound = 0.001; + tmpFitParameters.peakShirleyKUpperBound = 100; + tmpFitParameters.peakShirleyOffset = 80; + +FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,... + 'tableVariable','spectrum_counts','energyScale','binding',... + 'mode','TwoSpinOrbitDoubletPseudoVoigtShirley','backgroundMode','shirley','showFigures','on'); ++
Validating FitParameter structure...
+ Number of peaks detected: 4
+
+GlobalSearch stopped because it analyzed all the trial points.
+
+All 2 local solver runs converged with a positive local solver exit flag.
+Found 4 valid peaks (non-NaN)
+ name peakPosition
+ ______________ _____________________________________________
+
+ {'random.ibw'} 35.99 36.99 40.037 41.037 NaN
+
+ name peakArea
+ ______________ ______________________________________________
+
+ {'random.ibw'} 1397.3 698.64 1495.5 747.77 NaN
+
+ name peakFWHM
+ ______________ _________________________________________
+
+ {'random.ibw'} 1.651 1.651 1.651 1.651 NaN
+
+ name peakBackground
+ ______________ ______________
+
+ {'random.ibw'} 0 305.54
+
+ name peakEta
+ ______________ _____________________________
+
+ {'random.ibw'} 1 1 1 1 NaN
+
+ name peakShirleyK
+ ______________ ________________________________________________________
+
+ {'random.ibw'} 0.029178 0.029178 0.029178 0.029178 NaN
+
+
+
Helper Functions
++function quickPlotKinetic(FitList,tmpDataSelection) +% Plot Data +close all +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_countsNorm','energyScale','kinetic'); +ax = gca; +lines = findobj(ax, '-regexp', 'Type', 'line'); +set(lines, 'LineStyle', 'none', 'Marker', 'o', 'MarkerSize', 5); +nappAddFitToPlot(FitList,tmpDataSelection,'energyScale','kinetic') +try + disp(FitList(tmpDataSelection,["name","peakPosition","peakArea","peakFWHM","peakBackground"])) + + disp(FitList(tmpDataSelection,["name","peakEta","peakShirleyK"])) +catch + disp(FitList(tmpDataSelection,["sample","name","peakPosition","peakArea","peakFWHM"])) +end +end + +function quickPlotBinding(FitList,tmpDataSelection) +% Plot Data +close all +nappPlot(FitList,tmpDataSelection,'tableVariable','spectrum_counts','energyScale','binding'); +ax = gca; +lines = findobj(ax, '-regexp', 'Type', 'line'); +set(lines, 'LineStyle', 'none', 'Marker', 'o', 'MarkerSize', 5); +nappAddFitToPlot(FitList,tmpDataSelection,'energyScale','binding') +try + disp(FitList(tmpDataSelection,["name","peakPosition","peakArea","peakFWHM","peakBackground"])) + + disp(FitList(tmpDataSelection,["name","peakEta","peakShirleyK"])) +catch + disp(FitList(tmpDataSelection,["sample","name","peakPosition","peakArea","peakFWHM"])) +end +end ++
Found 2 valid peaks (non-NaN)
+ name peakPosition peakArea peakFWHM peakBackground
+ ______________ ____________ ________________________ ____________ __________________
+
+ {'random.ibw'} 113 110.5 2.1207e+05 29330 2 0.87332 -325.54 48185
+
+ name peakEta peakShirleyK
+ ______________ ___________ ____________
+
+ {'random.ibw'} 1 0.8266 NaN NaN
+
+
+
+