Files
nappMATLAB-toolbox/beamtime/documentedExampleScripts/html/TestAndDevelopShirley.html
T

5269 lines
261 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--
This HTML was auto-generated from MATLAB code.
To make changes, update the MATLAB code and republish this document.
-->
<title>Test script to fit some SLS data</title>
<meta name="generator" content="MATLAB 25.2">
<link rel="schema.DC" href="http://purl.org/dc/elements/1.1/">
<meta name="DC.date" content="2026-05-08">
<meta name="DC.source" content="TestAndDevelopShirley.m">
<style type="text/css">
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}:focus{outine:0}ins{text-decoration:none}del{text-decoration:line-through}table{border-collapse:collapse;border-spacing:0}
html { min-height:100%; margin-bottom:1px; }
html body { height:100%; margin:0px; font-family:Arial, Helvetica, sans-serif; font-size:10px; color:#000; line-height:140%; background:#fff none; overflow-y:scroll; }
html body td { vertical-align:top; text-align:left; }
h1 { padding:0px; margin:0px 0px 25px; font-family:Arial, Helvetica, sans-serif; font-size:1.5em; color:#d55000; line-height:100%; font-weight:normal; }
h2 { padding:0px; margin:0px 0px 8px; font-family:Arial, Helvetica, sans-serif; font-size:1.2em; color:#000; font-weight:bold; line-height:140%; border-bottom:1px solid #d6d4d4; display:block; }
h3 { padding:0px; margin:0px 0px 5px; font-family:Arial, Helvetica, sans-serif; font-size:1.1em; color:#000; font-weight:bold; line-height:140%; }
a { color:#005fce; text-decoration:none; }
a:hover { color:#005fce; text-decoration:underline; }
a:visited { color:#004aa0; text-decoration:none; }
p { padding:0px; margin:0px 0px 20px; }
img { padding:0px; margin:0px 0px 20px; border:none; }
p img, pre img, tt img, li img, h1 img, h2 img { margin-bottom:0px; }
ul { padding:0px; margin:0px 0px 20px 23px; list-style:square; }
ul li { padding:0px; margin:0px 0px 7px 0px; }
ul li ul { padding:5px 0px 0px; margin:0px 0px 7px 23px; }
ul li ol li { list-style:decimal; }
ol { padding:0px; margin:0px 0px 20px 0px; list-style:decimal; }
ol li { padding:0px; margin:0px 0px 7px 23px; list-style-type:decimal; }
ol li ol { padding:5px 0px 0px; margin:0px 0px 7px 0px; }
ol li ol li { list-style-type:lower-alpha; }
ol li ul { padding-top:7px; }
ol li ul li { list-style:square; }
.content { font-size:1.2em; line-height:140%; padding: 20px; }
pre, code { font-size:12px; }
tt { font-size: 1.2em; }
pre { margin:0px 0px 20px; }
pre.codeinput { padding:10px; border:1px solid #d3d3d3; background:#f7f7f7; }
pre.codeoutput { padding:10px 11px; margin:0px 0px 20px; color:#4c4c4c; }
pre.error { color:red; }
@media print { pre.codeinput, pre.codeoutput { word-wrap:break-word; width:100%; } }
span.keyword { color:#0000FF }
span.comment { color:#228B22 }
span.string { color:#A020F0 }
span.untermstring { color:#B20000 }
span.syscmd { color:#B28C00 }
span.typesection { color:#A0522D }
.footer { width:auto; padding:10px 0px; margin:25px 0px 0px; border-top:1px dotted #878787; font-size:0.8em; line-height:140%; font-style:italic; color:#878787; text-align:left; float:none; }
.footer p { margin:0px; }
.footer a { color:#878787; }
.footer a:hover { color:#878787; text-decoration:underline; }
.footer a:visited { color:#878787; }
table th { padding:7px 5px; text-align:left; vertical-align:middle; border: 1px solid #d6d4d4; font-weight:bold; }
table td { padding:7px 5px; text-align:left; vertical-align:top; border:1px solid #d6d4d4; }
</style>
</head>
<body>
<div class="content">
<h1>Test script to fit some SLS data</h1>
<!--introduction-->
<p>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.</p>
<!--/introduction-->
<h2>Contents</h2>
<div>
<ul>
<li>
<a href="#1">Random data for 2 peaks</a>
</li>
<li>
<a href="#2">TEST 1.1: Unconstrained kinetic Gauss linear</a>
</li>
<li>
<a href="#3">TEST 1.2: Unconstrained kinetic PV linear</a>
</li>
<li>
<a href="#4">TEST 1.3: Unconstrained kinetic Gauss Shirley</a>
</li>
<li>
<a href="#5">TEST 1.4: Unconstrained kinetic PV Shirley</a>
</li>
<li>
<a href="#6">TEST 1.5: Unconstrained binding Gauss linear</a>
</li>
<li>
<a href="#7">TEST 1.5.2: Unconstrained binding Gauss linear</a>
</li>
<li>
<a href="#8">TEST 1.6: Unconstrained binding PV linear</a>
</li>
<li>
<a href="#9">TEST 1.7: Unconstrained binding Gauss Shirley</a>
</li>
<li>
<a href="#10">TEST 1.8: Unconstrained binding PV Shirley</a>
</li>
<li>
<a href="#11">TEST 2.1: Position-Constrained kinetic Gaussian Linear</a>
</li>
<li>
<a href="#12">TEST 2.2: Position-Constrained kinetic PV Linear</a>
</li>
<li>
<a href="#13">TEST 2.3: Position-Constrained kinetic Gauss Shirley</a>
</li>
<li>
<a href="#14">TEST 2.4: Position-Constrained kinetic PV Shirley</a>
</li>
<li>
<a href="#15">TEST 2.5: Position binding Gauss linear</a>
</li>
<li>
<a href="#16">TEST 2.6: Position binding PV linear</a>
</li>
<li>
<a href="#17">TEST 2.7: Position binding Gauss Shirley</a>
</li>
<li>
<a href="#18">TEST 2.8: Position binding PV Shirley</a>
</li>
<li>
<a href="#19">TEST 2.9: Position kinetic PV Shirley shared</a>
</li>
<li>
<a href="#20">TEST 2.10: Position kinetic Gauss Shirley Shared</a>
</li>
<li>
<a href="#21">TEST 2.11: Position binding Gauss Shirley Shared</a>
</li>
<li>
<a href="#22">TEST 2.12: Position binding PV Shirley Shared</a>
</li>
<li>
<a href="#23">TEST 3.1: widthPosition kinetic Gauss linear</a>
</li>
<li>
<a href="#24">TEST 3.2: widthPosition kinetic PV linear</a>
</li>
<li>
<a href="#25">TEST 3.3: widthPosition kinetic Gauss Shirley</a>
</li>
<li>
<a href="#26">TEST 3.4: widthPosition kinetic PV Shirley</a>
</li>
<li>
<a href="#27">TEST 3.5: widthPosition binding Gauss linear</a>
</li>
<li>
<a href="#28">TEST 3.6: widthPosition binding PV linear</a>
</li>
<li>
<a href="#29">TEST 3.7: widthPosition binding Gauss Shirley</a>
</li>
<li>
<a href="#30">TEST 3.8: widthPosition binding PV Shirley</a>
</li>
<li>
<a href="#31">TEST 3.9: widthPosition kinetic Gauss Shirley Shared</a>
</li>
<li>
<a href="#32">TEST 3.10: widthPosition kinetic PV Shirley Shared</a>
</li>
<li>
<a href="#33">TEST 3.11: widthPosition binding Gauss Shirley Shared</a>
</li>
<li>
<a href="#34">TEST 3.12: widthPosition binding PV Shirley Shared</a>
</li>
<li>
<a href="#35">TEST 3.13: widthPosition kinetic PV Shirley &amp; Eta Shared</a>
</li>
<li>
<a href="#36">TEST 3.14: widthPosition binding PV Shirley &amp; Eta Shared</a>
</li>
<li>
<a href="#37">TEST 4.1: Width kinetic Gauss linear</a>
</li>
<li>
<a href="#38">TEST 4.2: Width kinetic PV linear</a>
</li>
<li>
<a href="#39">TEST 4.3: Width kinetic Gauss Shirley</a>
</li>
<li>
<a href="#40">TEST 4.4: Width kinetic PV Shirley</a>
</li>
<li>
<a href="#41">TEST 4.5: Width binding Gauss linear</a>
</li>
<li>
<a href="#42">TEST 4.6: Width binding PV linear</a>
</li>
<li>
<a href="#43">TEST 4.7: Width binding Gauss Shirley</a>
</li>
<li>
<a href="#44">TEST 4.8: Width binding PV Shirley</a>
</li>
<li>
<a href="#45">TEST 4.9: Width kinetic Gauss Shirley Shared</a>
</li>
<li>
<a href="#46">TEST 4.10: Width kinetic PV Shirley Shared</a>
</li>
<li>
<a href="#47">TEST 4.11: Width binding Gauss Shirley Shared</a>
</li>
<li>
<a href="#48">TEST 4.12: Width binding PV Shirley Shared</a>
</li>
<li>
<a href="#49">Random data for 5 peaks</a>
</li>
<li>
<a href="#50">Test 5.0 Custom ModelunconstrainedAndWidthPosition, kinetic, linear</a>
</li>
<li>
<a href="#51">Test 5.1 Custom ModelunconstrainedAndWidthPosition, binding, linear</a>
</li>
<li>
<a href="#52">Test 5.3 Custom widthPositionAmineAreaRatio, kinetic, linear</a>
</li>
<li>
<a href="#53">Test 5.4 Custom gasAndTwoAcidBasePairs, kinetic, linear</a>
</li>
<li>
<a href="#54">Test 5.5 Custom gasAndTwoAcidBasePairs, binding, linear</a>
</li>
<li>
<a href="#55">Test 5.6 Custom widthPositionAreaRatio, kinetic, linear</a>
</li>
<li>
<a href="#56">Test 5.7 Custom widthPositionAreaRatio, binding, linear</a>
</li>
<li>
<a href="#57">Random data for 4 peaks</a>
</li>
<li>
<a href="#58">Test 6.0 Custom TwoSpinOrbitDoublet, kinetic, linear</a>
</li>
<li>
<a href="#59">Test 6.1 Custom TwoSpinOrbitDoublet, binding, linear</a>
</li>
<li>
<a href="#60">Test 6.2 Custom TwoSpinOrbitDoublet, kinetic, Shirley</a>
</li>
<li>
<a href="#61">Test 6.3 Custom TwoSpinOrbitDoubletPseudoVoigtShirley, binding, Shirley</a>
</li>
<li>
<a href="#62">Helper Functions</a>
</li>
</ul>
</div>
<h2 id="1">Random data for 2 peaks</h2>
<pre class="codeinput">clc
clearvars
close <span class="string">all</span>
<span class="comment">% create data table consistent with ISS data</span>
FitList = table;
FitList.sample = <span class="string">'O1s, 120eV, m30, cps, 092022'</span>;
FitList.name = {<span class="string">'random.ibw'</span>};
tmpDataSelection = matches(FitList.sample,<span class="string">'O1s, 120eV, m30, cps, 092022'</span>); <span class="comment">% This filters one specific spectrum by "sample name".</span>
<span class="comment">% add random data on kinetic energy scale</span>
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)));
<span class="keyword">for</span> 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));
<span class="keyword">end</span>
y = y + (-195.*x+32980);
y = y + 1000 * randn(size(x)); <span class="comment">% add noise</span>
figure;
plot(x, y, <span class="string">'k.'</span>);
xlabel(<span class="string">'Kinetic Energy'</span>);
ylabel(<span class="string">'Intensity'</span>);
title(<span class="string">'Raw Data without Shirley Tail'</span>);
<span class="keyword">if</span> ~ismember(<span class="string">'scientaEkin_eV'</span>, FitList.Properties.VariableNames)
FitList.scientaEkin_eV = cell(size(FitList,1),1);
<span class="keyword">end</span>
<span class="keyword">if</span> ~ismember(<span class="string">'spectrum_countsNorm'</span>, FitList.Properties.VariableNames)
FitList.spectrum_countsNorm = cell(size(FitList,1),1);
<span class="keyword">end</span>
FitList(tmpDataSelection,:).scientaEkin_eV{:} = x;
FitList(tmpDataSelection,:).spectrum_countsNorm{:} = y;
index= find(FitList(tmpDataSelection,:).scientaEkin_eV{:}&gt;113,1);
FitList(tmpDataSelection,:).spectrum_countsNorm{:}(1:index) = FitList(tmpDataSelection,:).spectrum_countsNorm{:}(1:index) + 1000;
<span class="comment">% add random data on binding energy scale</span>
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)));
<span class="keyword">for</span> 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));
<span class="keyword">end</span>
<span class="comment">% Simulate realistic Shirley-style background using smooth tanh transition</span>
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)); <span class="comment">% add mild noise</span>
figure;
plot(x, y, <span class="string">'k.'</span>);
xlabel(<span class="string">'Binding Energy'</span>);
ylabel(<span class="string">'Intensity'</span>);
title(<span class="string">'Raw Data with Shirley Tail'</span>);
set(gca, <span class="string">'XDir'</span>, <span class="string">'reverse'</span>); grid <span class="string">on</span>;
<span class="keyword">if</span> ~ismember(<span class="string">'bindingEnergy_eV'</span>, FitList.Properties.VariableNames)
FitList.bindingEnergy_eV = cell(size(FitList,1),1);
<span class="keyword">end</span>
<span class="keyword">if</span> ~ismember(<span class="string">'spectrum_counts'</span>, FitList.Properties.VariableNames)
FitList.spectrum_counts = cell(size(FitList,1),1);
<span class="keyword">end</span>
FitList(tmpDataSelection,:).bindingEnergy_eV{:} = x;
FitList(tmpDataSelection,:).spectrum_counts{:} = y;
<span class="comment">% plot</span>
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>);
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>);
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_01.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_02.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_03.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_04.png" alt=""> <h2 id="2">TEST 1.1: Unconstrained kinetic Gauss linear</h2>
<p>Gaussian + Linear, individual area/width/position per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100]; <span class="comment">% &lt;- 2 values =&gt; 2 peaks</span>
tmpFitParameters.peakWidth = [1.6 0.6];
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.0 0.6];
tmpFitParameters.peakWidthUpperBound = [2.0 1.2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6]; <span class="comment">% &lt;- selects fit range around peak1</span>
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_05.png" alt=""> <h2 id="3">TEST 1.2: Unconstrained kinetic PV linear</h2>
<p>Pseudo-Voigt + Linear, individual area/width/eta/position per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = [1.6 0.6];
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.0 0.6];
tmpFitParameters.peakWidthUpperBound = [2.0 1.2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1]; <span class="comment">% &lt;- Gauss - Lorentzian ratio</span>
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">Validating FitParameter structure...
Number of peaks detected: 2
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_06.png" alt=""> <h2 id="4">TEST 1.3: Unconstrained kinetic Gauss Shirley</h2>
<p>Gaussian + Shirley, individual area/width/position per peak, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = [1.6 0.6];
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.0 0.6];
tmpFitParameters.peakWidthUpperBound = [2.0 1.2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.001, 0.001]; <span class="comment">% &lt;- K controls Shirley step magnitude</span>
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [10, 10];
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>); <span class="comment">% &lt;- background is now Shirley</span>
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_07.png" alt=""> <h2 id="5">TEST 1.4: Unconstrained kinetic PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, individual area/width/eta/position per peak, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = [1.6 0.6];
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.0 0.6];
tmpFitParameters.peakWidthUpperBound = [2.0 1.2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1]; <span class="comment">% &lt;- Gauss - Lorentzian ratio</span>
tmpFitParameters.peakEtaLowerBound = [0.0 0.0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.001, 0.001]; <span class="comment">% &lt;- K controls Shirley step magnitude</span>
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [10, 10];
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_08.png" alt=""> <h2 id="6">TEST 1.5: Unconstrained binding Gauss linear</h2>
<p>Gaussian + Linear, individual area/width/position per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span><span class="comment"> % &lt;- process binding energy</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_09.png" alt=""> <h2 id="7">TEST 1.5.2: Unconstrained binding Gauss linear</h2>
<p>Gaussian + Linear, individual area/width/position per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 1e4 100]; <span class="comment">% &lt;- 3 peaks</span>
tmpFitParameters.peakWidth = [1.6 1.6 1.6];
tmpFitParameters.peakPos = [38 37 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e2 1e2 1e2];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 37 35];
tmpFitParameters.peakPosUpperBound = [39 37.5 37];
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_10.png" alt=""> <h2 id="8">TEST 1.6: Unconstrained binding PV linear</h2>
<p>Pseudo-Voigt + Linear, individual area/width/eta/position per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100]; <span class="comment">% &lt;- back to 2 peaks</span>
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT + LINEAR variant:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_11.png" alt=""> <h2 id="9">TEST 1.7: Unconstrained binding Gauss Shirley</h2>
<p>Gaussian + Shirley, individual area/width/position per peak, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01]; <span class="comment">% &lt;- K controls Shirley step magnitude</span>
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_12.png" alt=""> <h2 id="10">TEST 1.8: Unconstrained binding PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, individual area/width/eta/position per peak, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01]; <span class="comment">% &lt;- K controls Shirley step magnitude</span>
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrained'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_13.png" alt=""> <h2 id="11">TEST 2.1: Position-Constrained kinetic Gaussian Linear</h2>
<p>Gaussian + Linear, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clc
clearvars <span class="string">tmpFitParameters</span>;
tmpFitParameters.peakArea = [1e5 1e5]; <span class="comment">% &lt;- 2 peaks</span>
tmpFitParameters.peakWidth = [2 1];
tmpFitParameters.peakPos = [113 -2.32]; <span class="comment">% &lt;- pos peak #2 is relative to peak #1</span>
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1E4 1E4];
tmpFitParameters.peakAreaUpperBound = [1E6 1E6];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.5 0.6];
tmpFitParameters.peakWidthUpperBound = [2.5 1.5];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112.5; <span class="comment">% &lt;- only pos 1 is fitted</span>
tmpFitParameters.peakPosUpperBound = 113.5;
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_14.png" alt=""> <h2 id="12">TEST 2.2: Position-Constrained kinetic PV Linear</h2>
<p>Pseudo-Voigt + Linear, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 1e5];
tmpFitParameters.peakWidth = [2 1];
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1E4 1E4];
tmpFitParameters.peakAreaUpperBound = [1E6 1E6];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.5 0.6];
tmpFitParameters.peakWidthUpperBound = [2.5 1.5];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112.5;
tmpFitParameters.peakPosUpperBound = 113.5;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_15.png" alt=""> <h2 id="13">TEST 2.3: Position-Constrained kinetic Gauss Shirley</h2>
<p>Gaussian + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
tmpFitParameters.peakArea = [1e5 1e5];
tmpFitParameters.peakWidth = [2 1];
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1E4 1E4];
tmpFitParameters.peakAreaUpperBound = [1E6 1E6];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.5 0.6];
tmpFitParameters.peakWidthUpperBound = [2.5 1.5];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112.5;
tmpFitParameters.peakPosUpperBound = 113.5;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.001];
tmpFitParameters.peakShirleyKLowerBound = [0.0, 0.0];
tmpFitParameters.peakShirleyKUpperBound = [Inf, Inf];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_16.png" alt=""> <h2 id="14">TEST 2.4: Position-Constrained kinetic PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 1e5];
tmpFitParameters.peakWidth = [2 1];
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1E4 1E4];
tmpFitParameters.peakAreaUpperBound = [1E6 1E6];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.5 0.6];
tmpFitParameters.peakWidthUpperBound = [2.5 1.5];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112.5;
tmpFitParameters.peakPosUpperBound = 113.5;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.001];
tmpFitParameters.peakShirleyKLowerBound = [0.0, 0.0];
tmpFitParameters.peakShirleyKUpperBound = [Inf, Inf];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_17.png" alt=""> <h2 id="15">TEST 2.5: Position binding Gauss linear</h2>
<p>Gaussian + Linear, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_18.png" alt=""> <h2 id="16">TEST 2.6: Position binding PV linear</h2>
<p>Pseudo-Voigt + Linear, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT + LINEAR variant:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_19.png" alt=""> <h2 id="17">TEST 2.7: Position binding Gauss Shirley</h2>
<p>Gaussian + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_20.png" alt=""> <h2 id="18">TEST 2.8: Position binding PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01]; <span class="comment">% &lt;- 1 K for each peak</span>
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'position'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_21.png" alt=""> <h2 id="19">TEST 2.9: Position kinetic PV Shirley shared</h2>
<p>Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 1e5];
tmpFitParameters.peakWidth = [2 1];
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1E4 1E4];
tmpFitParameters.peakAreaUpperBound = [1E6 1E6];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.5 0.6];
tmpFitParameters.peakWidthUpperBound = [2.5 1.5];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112.5;
tmpFitParameters.peakPosUpperBound = 113.5;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY:</span>
tmpFitParameters.peakShirleyK = 0.01; <span class="comment">% &lt;- same K for all peaks</span>
tmpFitParameters.peakShirleyKLowerBound = 0.0;
tmpFitParameters.peakShirleyKUpperBound = Inf;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'positionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_22.png" alt=""> <h2 id="20">TEST 2.10: Position kinetic Gauss Shirley Shared</h2>
<p>Gaussian + Shirley, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
tmpFitParameters.peakArea = [1e5 1e5];
tmpFitParameters.peakWidth = [2 1];
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1E4 1E4];
tmpFitParameters.peakAreaUpperBound = [1E6 1E6];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.5 0.6];
tmpFitParameters.peakWidthUpperBound = [2.5 1.5];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112.5;
tmpFitParameters.peakPosUpperBound = 113.5;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY:</span>
tmpFitParameters.peakShirleyK = 0.01;
tmpFitParameters.peakShirleyKLowerBound = 0.0;
tmpFitParameters.peakShirleyKUpperBound = Inf;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'positionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_23.png" alt=""> <h2 id="21">TEST 2.11: Position binding Gauss Shirley Shared</h2>
<p>Gaussian + Shirley, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.01;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 100;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'positionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_24.png" alt=""> <h2 id="22">TEST 2.12: Position binding PV Shirley Shared</h2>
<p>Pseudo-Voigt + Shirley, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = [1.6 1.6 ];
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [0.2 0.2];
tmpFitParameters.peakWidthUpperBound = [2.0 2];
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.01;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 100;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'positionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_25.png" alt=""> <h2 id="23">TEST 3.1: widthPosition kinetic Gauss linear</h2>
<p>Gaussian + Linear, shared width, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100]; <span class="comment">% &lt;- 2 peaks</span>
tmpFitParameters.peakWidth = 1.6; <span class="comment">% &lt;- one width for all peaks</span>
tmpFitParameters.peakPos = [113 -2.32]; <span class="comment">% &lt;- positions relative to peak1</span>
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112;
tmpFitParameters.peakPosUpperBound = 114;
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_26.png" alt=""> <h2 id="24">TEST 3.2: widthPosition kinetic PV linear</h2>
<p>Pseudo-Voigt + Linear, shared width, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112;
tmpFitParameters.peakPosUpperBound = 114;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_27.png" alt=""> <h2 id="25">TEST 3.3: widthPosition kinetic Gauss Shirley</h2>
<p>Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112;
tmpFitParameters.peakPosUpperBound = 114;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.001, 0.001];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [10, 10];
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_28.png" alt=""> <h2 id="26">TEST 3.4: widthPosition kinetic PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112;
tmpFitParameters.peakPosUpperBound = 114;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0.0 0.0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.001, 0.001];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [10, 10];
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_29.png" alt=""> <h2 id="27">TEST 3.5: widthPosition binding Gauss linear</h2>
<p>Gaussian + Linear, shared width, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_30.png" alt=""> <h2 id="28">TEST 3.6: widthPosition binding PV linear</h2>
<p>Pseudo-Voigt + Linear, shared width, first peak position free, other peaks offset fixed</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT + LINEAR variant:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_31.png" alt=""> <h2 id="29">TEST 3.7: widthPosition binding Gauss Shirley</h2>
<p>Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_32.png" alt=""> <h2 id="30">TEST 3.8: widthPosition binding PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_33.png" alt=""> <h2 id="31">TEST 3.9: widthPosition kinetic Gauss Shirley Shared</h2>
<p>Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112;
tmpFitParameters.peakPosUpperBound = 114;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.001;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 10;
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_34.png" alt=""> <h2 id="32">TEST 3.10: widthPosition kinetic PV Shirley Shared</h2>
<p>Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112;
tmpFitParameters.peakPosUpperBound = 114;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0.0 0.0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.1;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 10;
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_35.png" alt=""> <h2 id="33">TEST 3.11: widthPosition binding Gauss Shirley Shared</h2>
<p>Gaussian + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01]; <span class="comment">% &lt;- Too many parameters,</span>
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001]; <span class="comment">% Will run anyway</span>
tmpFitParameters.peakShirleyKUpperBound = [100, 100]; <span class="comment">% but show a warning.</span>
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_36.png" alt=""> <h2 id="34">TEST 3.12: widthPosition binding PV Shirley Shared</h2>
<p>Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.01;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 100;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_37.png" alt=""> <h2 id="35">TEST 3.13: widthPosition kinetic PV Shirley &amp; Eta Shared</h2>
<p>Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K, shared PV eta</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 -2.32];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 112;
tmpFitParameters.peakPosUpperBound = 114;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = 1;
tmpFitParameters.peakEtaLowerBound = 0.0;
tmpFitParameters.peakEtaUpperBound = 1.0;
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.1;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 10;
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionShirleyEta'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_38.png" alt=""> <h2 id="36">TEST 3.14: widthPosition binding PV Shirley &amp; Eta Shared</h2>
<p>Pseudo-Voigt + Shirley, shared width, first peak position free, other peaks offset fixed, shared Shirley K and PV eta</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 -1.8];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 37;
tmpFitParameters.peakPosUpperBound = 39;
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = 1;
tmpFitParameters.peakEtaLowerBound = 0;
tmpFitParameters.peakEtaUpperBound = 1.0;
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.01;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 100;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionShirleyEta'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_39.png" alt=""> <h2 id="37">TEST 4.1: Width kinetic Gauss linear</h2>
<p>Gaussian + Linear, shared width, individual areas and positions</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_40.png" alt=""> <h2 id="38">TEST 4.2: Width kinetic PV linear</h2>
<p>Pseudo-Voigt + Linear, shared width, individual areas, positions, and etas</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_41.png" alt=""> <h2 id="39">TEST 4.3: Width kinetic Gauss Shirley</h2>
<p>Gaussian + Shirley, shared width, individual areas and positions, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.001, 0.001];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [10, 10];
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_42.png" alt=""> <h2 id="40">TEST 4.4: Width kinetic PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, shared width, individual areas, positions, and etas, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0.0 0.0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.001, 0.001];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [10, 10];
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_43.png" alt=""> <h2 id="41">TEST 4.5: Width binding Gauss linear</h2>
<p>Gaussian + Linear, shared width, individual areas and positions</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_44.png" alt=""> <h2 id="42">TEST 4.6: Width binding PV linear</h2>
<p>Pseudo-Voigt + Linear, shared width, individual areas, positions, and etas</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT + LINEAR variant:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_45.png" alt=""> <h2 id="43">TEST 4.7: Width binding Gauss Shirley</h2>
<p>Gaussian + Shirley, shared width, individual areas and positions, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_46.png" alt=""> <h2 id="44">TEST 4.8: Width binding PV Shirley</h2>
<p>Pseudo-Voigt + Shirley, shared width, individual areas, positions, and etas, Shirley K per peak</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = [0.01, 0.01];
tmpFitParameters.peakShirleyKLowerBound = [0.001, 0.001];
tmpFitParameters.peakShirleyKUpperBound = [100, 100];
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'width'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_47.png" alt=""> <h2 id="45">TEST 4.9: Width kinetic Gauss Shirley Shared</h2>
<p>Gaussian + Shirley, shared width, individual areas and positions, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.001;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 10;
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_48.png" alt=""> <h2 id="46">TEST 4.10: Width kinetic PV Shirley Shared</h2>
<p>Pseudo-Voigt + Shirley, shared width, individual areas, positions, and etas, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [113 110];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [1e3 1e3];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [112 109];
tmpFitParameters.peakPosUpperBound = [114 111];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT:</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0.0 0.0];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.001;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 10;
tmpFitParameters.peakShirleyOffset = 1E4;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotKinetic(FitList,tmpDataSelection)
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_49.png" alt=""> <h2 id="47">TEST 4.11: Width binding Gauss Shirley Shared</h2>
<p>Gaussian + Shirley, shared width, individual areas and positions, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.01;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 100;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_50.png" alt=""> <h2 id="48">TEST 4.12: Width binding PV Shirley Shared</h2>
<p>Pseudo-Voigt + Shirley, shared width, individual areas and positions, shared Shirley K</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [1e5 100];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [38 36];
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0.01 0.01];
tmpFitParameters.peakAreaUpperBound = [Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.2;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [37 35];
tmpFitParameters.peakPosUpperBound = [39 37];
tmpFitParameters.backgroundRange = [12 6];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = [1 1];
tmpFitParameters.peakEtaLowerBound = [0 0 ];
tmpFitParameters.peakEtaUpperBound = [1.0, 1.0];
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.01;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 100;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'off'</span>);
quickPlotBinding(FitList,tmpDataSelection)
xlim([34,39])
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_51.png" alt=""> <h2 id="49">Random data for 5 peaks</h2>
<pre class="codeinput">clc
close <span class="string">all</span>
<span class="comment">% binding</span>
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)));
<span class="keyword">for</span> 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));
<span class="keyword">end</span>
<span class="comment">% Simulate realistic Shirley-style background using smooth tanh transition</span>
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)); <span class="comment">% add mild noise</span>
figure;
plot(x, y, <span class="string">'k.'</span>);
xlabel(<span class="string">'Binding Energy'</span>);
ylabel(<span class="string">'Intensity'</span>);
title(<span class="string">'Raw Data with Shirley Tail'</span>);
set(gca, <span class="string">'XDir'</span>, <span class="string">'reverse'</span>); grid <span class="string">on</span>;
hold <span class="string">on</span>;
<span class="keyword">if</span> ~ismember(<span class="string">'bindingEnergy_eV'</span>, FitList.Properties.VariableNames)
FitList.bindingEnergy_eV = cell(size(FitList,1),1);
<span class="keyword">end</span>
<span class="keyword">if</span> ~ismember(<span class="string">'spectrum_counts'</span>, FitList.Properties.VariableNames)
FitList.spectrum_counts = cell(size(FitList,1),1);
<span class="keyword">end</span>
FitList(tmpDataSelection,:).bindingEnergy_eV{:} = x;
FitList(tmpDataSelection,:).spectrum_counts{:} = y;
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>);
<span class="comment">% kinetic</span>
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)));
<span class="keyword">for</span> 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));
<span class="keyword">end</span>
y = y + 5 * randn(size(x)); <span class="comment">% add mild noise</span>
figure;
plot(x, y, <span class="string">'k.'</span>);
xlabel(<span class="string">'Kinetic Energy'</span>);
ylabel(<span class="string">'Intensity'</span>);
title(<span class="string">'Raw Data without Shirley Tail'</span>);
grid <span class="string">on</span>;
hold <span class="string">on</span>;
FitList(tmpDataSelection,:).scientaEkin_eV{:} = x;
FitList(tmpDataSelection,:).spectrum_countsNorm{:} = y;
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>);
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_52.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_53.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_54.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_55.png" alt=""> <h2 id="50">Test 5.0 Custom ModelunconstrainedAndWidthPosition, kinetic, linear</h2>
<p>Custom: Gaussian + Linear, shared width for 2 peaks, individual area/position for 5 peaks (peak count must match hardcoded equation: 5 peaks)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5];
tmpFitParameters.peakWidth = [1.6 0.6];
tmpFitParameters.peakPos = [-1.8 38 39 41 41] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.0 0.1];
tmpFitParameters.peakWidthUpperBound = [2.0 1.2];
<span class="comment">% Bounds for positions</span>
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,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrainedAndWidthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_56.png" alt=""> <h2 id="51">Test 5.1 Custom ModelunconstrainedAndWidthPosition, binding, linear</h2>
<p>Custom: Gaussian + Linear, shared width for 2 peaks, individual area/position for 5 peaks (peak count must match hardcoded equation: 5 peaks)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5];
tmpFitParameters.peakWidth = [1.6 0.6];
tmpFitParameters.peakPos = [-1.8 38 39 41 41] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1.0 0.1];
tmpFitParameters.peakWidthUpperBound = [2.0 1.2];
<span class="comment">% Bounds for positions</span>
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,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'unconstrainedAndWidthPosition'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_57.png" alt=""> <h2 id="52">Test 5.3 Custom widthPositionAmineAreaRatio, kinetic, linear</h2>
<p>Custom: Gaussian + Linear, shared width, constrained area ratios, 5 peaks with position/area constraints (peak count must match hardcoded equation: 5 peaks)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 5e5 1 5e5 5e5];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [36 1.8 2.8 3.8 5.5 6] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = 34;
tmpFitParameters.peakPosUpperBound = 36;
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionAmineAreaRatio'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_58.png" alt=""> <h2 id="53">Test 5.4 Custom gasAndTwoAcidBasePairs, kinetic, linear</h2>
<p>Custom: Gaussian + Linear, 2 shared widths, constrained to acid-base pair model, 5 peaks (peak count must match hardcoded equation: 5 peaks)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5];
tmpFitParameters.peakWidth = [1 0.3];
tmpFitParameters.peakPos = [-1 36 39 -1 41] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [100 100 100 100 100];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1 0.1];
tmpFitParameters.peakWidthUpperBound = [1.6 1];
<span class="comment">% Bounds for positions</span>
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,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'gasAndTwoAcidBasePairs'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_59.png" alt=""> <h2 id="54">Test 5.5 Custom gasAndTwoAcidBasePairs, binding, linear</h2>
<p>Custom: Gaussian + Linear, 2 shared widths, constrained to acid-base pair model, 5 peaks (peak count must match hardcoded equation: 5 peaks)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 5e5 5e5 5e5 5e5];
tmpFitParameters.peakWidth = [1 0.3];
tmpFitParameters.peakPos = [-1 36 39 -1 41] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [100 100 100 100 100];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = [1 0.1];
tmpFitParameters.peakWidthUpperBound = [1.6 1];
<span class="comment">% Bounds for positions</span>
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,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'gasAndTwoAcidBasePairs'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_60.png" alt=""> <h2 id="55">Test 5.6 Custom widthPositionAreaRatio, kinetic, linear</h2>
<p>Custom: Gaussian + Linear, shared width, fixed area ratios from first peak, 5 peaks (peak count must match hardcoded equation: 5 peaks)</p>
<pre class="codeinput">
<span class="comment">% pos 2-5 of area bounds and position bounds are not used for fitting, but</span>
<span class="comment">% function requires during input validation that these vectors are non NaN</span>
<span class="comment">% and have same length as peakArea. Therefore we need a workaround: set</span>
<span class="comment">% values to 0.</span>
clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 1 1 1 1]; <span class="comment">% &lt;- area ratio rel to peak #1</span>
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [36 2 3 4 5] ; <span class="comment">% &lt;- position relative to peak #1</span>
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0]; <span class="comment">% &lt;- workaround</span>
tmpFitParameters.peakAreaUpperBound = [Inf 0 0 0 0];<span class="comment">% &lt;- workaround</span>
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.5;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [34 0 0 0 0];<span class="comment">% &lt;- workaround</span>
tmpFitParameters.peakPosUpperBound = [36 0 0 0 0];<span class="comment">% &lt;- workaround</span>
tmpFitParameters.backgroundRange = [12 12];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionAreaRatio'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_61.png" alt=""> <h2 id="56">Test 5.7 Custom widthPositionAreaRatio, binding, linear</h2>
<p>Custom: Gaussian + Linear, shared width, fixed area ratios from first peak, 5 peaks (peak count must match hardcoded equation: 5 peaks)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 1 1 1 1];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [36 2 3 4 5] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0 0]; <span class="comment">% &lt;- workaround</span>
tmpFitParameters.peakAreaUpperBound = [Inf 0 0 0 0];<span class="comment">% &lt;- workaround</span>
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 0.5;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [34 0 0 0 0];<span class="comment">% &lt;- workaround</span>
tmpFitParameters.peakPosUpperBound = [36 0 0 0 0];<span class="comment">% &lt;- workaround</span>
tmpFitParameters.backgroundRange = [12 12];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'widthPositionAreaRatio'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_62.png" alt=""> <h2 id="57">Random data for 4 peaks</h2>
<pre class="codeinput">clc
close <span class="string">all</span>
<span class="comment">% binding</span>
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)));
<span class="keyword">for</span> 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));
<span class="keyword">end</span>
<span class="comment">% Simulate realistic Shirley-style background using smooth tanh transition</span>
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)); <span class="comment">% add mild noise</span>
figure;
plot(x, y, <span class="string">'k.'</span>);
xlabel(<span class="string">'Binding Energy'</span>);
ylabel(<span class="string">'Intensity'</span>);
title(<span class="string">'Raw Data with Shirley Tail'</span>);
set(gca, <span class="string">'XDir'</span>, <span class="string">'reverse'</span>); grid <span class="string">on</span>;
hold <span class="string">on</span>;
<span class="keyword">if</span> ~ismember(<span class="string">'bindingEnergy_eV'</span>, FitList.Properties.VariableNames)
FitList.bindingEnergy_eV = cell(size(FitList,1),1);
<span class="keyword">end</span>
<span class="keyword">if</span> ~ismember(<span class="string">'spectrum_counts'</span>, FitList.Properties.VariableNames)
FitList.spectrum_counts = cell(size(FitList,1),1);
<span class="keyword">end</span>
FitList(tmpDataSelection,:).bindingEnergy_eV{:} = x;
FitList(tmpDataSelection,:).spectrum_counts{:} = y;
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>);
<span class="comment">% kinetic</span>
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)));
<span class="keyword">for</span> 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));
<span class="keyword">end</span>
y = y + 5 * randn(size(x)); <span class="comment">% add mild noise</span>
figure;
plot(x, y, <span class="string">'k.'</span>);
xlabel(<span class="string">'Kinetic Energy'</span>);
ylabel(<span class="string">'Intensity'</span>);
title(<span class="string">'Raw Data without Shirley Tail'</span>);
grid <span class="string">on</span>;
hold <span class="string">on</span>;
FitList(tmpDataSelection,:).scientaEkin_eV{:} = x;
FitList(tmpDataSelection,:).spectrum_countsNorm{:} = y;
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>);
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_63.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_64.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_65.png" alt=""> <img vspace="5" hspace="5" src="TestAndDevelopShirley_66.png" alt=""> <h2 id="58">Test 6.0 Custom TwoSpinOrbitDoublet, kinetic, linear</h2>
<p>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)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [36 1 4] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [34 NaN 3];
tmpFitParameters.peakPosUpperBound = [36 NaN 5];
tmpFitParameters.backgroundRange = [12 6];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'TwoSpinOrbitDoublet'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_67.png" alt=""> <h2 id="59">Test 6.1 Custom TwoSpinOrbitDoublet, binding, linear</h2>
<p>Custom: Gaussian + Linear, spin-orbit doublet pair model with intensity ratios, 4 peaks (peak count must match hardcoded equation: 4 peaks)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [36 1 4] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [34 NaN 3];
tmpFitParameters.peakPosUpperBound = [36 NaN 5];
tmpFitParameters.backgroundRange = [12 12];
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'TwoSpinOrbitDoublet'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'linear'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_68.png" alt=""> <h2 id="60">Test 6.2 Custom TwoSpinOrbitDoublet, kinetic, Shirley</h2>
<p>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)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [36 1 4] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [34 NaN 3];
tmpFitParameters.peakPosUpperBound = [36 NaN 5];
tmpFitParameters.backgroundRange = [12 12];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = 1;
tmpFitParameters.peakEtaLowerBound = 0;
tmpFitParameters.peakEtaUpperBound = 1.0;
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.0001;
tmpFitParameters.peakShirleyKLowerBound = 0;
tmpFitParameters.peakShirleyKUpperBound = 0.0001;
tmpFitParameters.peakShirleyOffset = 0;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'TwoSpinOrbitDoubletPseudoVoigtShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_69.png" alt=""> <h2 id="61">Test 6.3 Custom TwoSpinOrbitDoubletPseudoVoigtShirley, binding, Shirley</h2>
<p>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)</p>
<pre class="codeinput">clearvars <span class="string">tmpFitParameters</span>;
clc
tmpFitParameters.peakArea = [5e5 0.5 5e5 0.5];
tmpFitParameters.peakWidth = 1.6;
tmpFitParameters.peakPos = [36 1 4] ;
<span class="comment">% Bounds for areas (lower and upper)</span>
tmpFitParameters.peakAreaLowerBound = [0 0 0 0];
tmpFitParameters.peakAreaUpperBound = [Inf Inf Inf Inf];
<span class="comment">% Bounds for widths</span>
tmpFitParameters.peakWidthLowerBound = 1.0;
tmpFitParameters.peakWidthUpperBound = 2.0;
<span class="comment">% Bounds for positions</span>
tmpFitParameters.peakPosLowerBound = [34 NaN 3];
tmpFitParameters.peakPosUpperBound = [36 NaN 5];
tmpFitParameters.backgroundRange = [12 12];
<span class="comment">% PSEUDO-VOIGT</span>
tmpFitParameters.peakEta = 1;
tmpFitParameters.peakEtaLowerBound = 0;
tmpFitParameters.peakEtaUpperBound = 1.0;
<span class="comment">% SHIRLEY variant:</span>
tmpFitParameters.peakShirleyK = 0.1;
tmpFitParameters.peakShirleyKLowerBound = 0.001;
tmpFitParameters.peakShirleyKUpperBound = 100;
tmpFitParameters.peakShirleyOffset = 80;
FitList = nappFitGaussXps(FitList,tmpFitParameters,tmpDataSelection,<span class="keyword">...</span>
<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>,<span class="keyword">...</span>
<span class="string">'mode'</span>,<span class="string">'TwoSpinOrbitDoubletPseudoVoigtShirley'</span>,<span class="string">'backgroundMode'</span>,<span class="string">'shirley'</span>,<span class="string">'showFigures'</span>,<span class="string">'on'</span>);
</pre>
<pre class="codeoutput">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
</pre>
<img vspace="5" hspace="5" src="TestAndDevelopShirley_70.png" alt=""> <h2 id="62">Helper Functions</h2>
<pre class="codeinput">
<span class="keyword">function</span> quickPlotKinetic(FitList,tmpDataSelection)
<span class="comment">% Plot Data</span>
close <span class="string">all</span>
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_countsNorm'</span>,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>);
ax = gca;
lines = findobj(ax, <span class="string">'-regexp'</span>, <span class="string">'Type'</span>, <span class="string">'line'</span>);
set(lines, <span class="string">'LineStyle'</span>, <span class="string">'none'</span>, <span class="string">'Marker'</span>, <span class="string">'o'</span>, <span class="string">'MarkerSize'</span>, 5);
nappAddFitToPlot(FitList,tmpDataSelection,<span class="string">'energyScale'</span>,<span class="string">'kinetic'</span>)
<span class="keyword">try</span>
disp(FitList(tmpDataSelection,[<span class="string">"name"</span>,<span class="string">"peakPosition"</span>,<span class="string">"peakArea"</span>,<span class="string">"peakFWHM"</span>,<span class="string">"peakBackground"</span>]))
disp(FitList(tmpDataSelection,[<span class="string">"name"</span>,<span class="string">"peakEta"</span>,<span class="string">"peakShirleyK"</span>]))
<span class="keyword">catch</span>
disp(FitList(tmpDataSelection,[<span class="string">"sample"</span>,<span class="string">"name"</span>,<span class="string">"peakPosition"</span>,<span class="string">"peakArea"</span>,<span class="string">"peakFWHM"</span>]))
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">function</span> quickPlotBinding(FitList,tmpDataSelection)
<span class="comment">% Plot Data</span>
close <span class="string">all</span>
nappPlot(FitList,tmpDataSelection,<span class="string">'tableVariable'</span>,<span class="string">'spectrum_counts'</span>,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>);
ax = gca;
lines = findobj(ax, <span class="string">'-regexp'</span>, <span class="string">'Type'</span>, <span class="string">'line'</span>);
set(lines, <span class="string">'LineStyle'</span>, <span class="string">'none'</span>, <span class="string">'Marker'</span>, <span class="string">'o'</span>, <span class="string">'MarkerSize'</span>, 5);
nappAddFitToPlot(FitList,tmpDataSelection,<span class="string">'energyScale'</span>,<span class="string">'binding'</span>)
<span class="keyword">try</span>
disp(FitList(tmpDataSelection,[<span class="string">"name"</span>,<span class="string">"peakPosition"</span>,<span class="string">"peakArea"</span>,<span class="string">"peakFWHM"</span>,<span class="string">"peakBackground"</span>]))
disp(FitList(tmpDataSelection,[<span class="string">"name"</span>,<span class="string">"peakEta"</span>,<span class="string">"peakShirleyK"</span>]))
<span class="keyword">catch</span>
disp(FitList(tmpDataSelection,[<span class="string">"sample"</span>,<span class="string">"name"</span>,<span class="string">"peakPosition"</span>,<span class="string">"peakArea"</span>,<span class="string">"peakFWHM"</span>]))
<span class="keyword">end</span>
<span class="keyword">end</span>
</pre>
<pre class="codeoutput">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
</pre>
<p class="footer">
<br>
<a href="https://www.mathworks.com/products/matlab/">Published with MATLAB&reg; R2025b</a>
<br>
</p>
</div>
<!--
##### SOURCE BEGIN #####
%% 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.
%% 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');
%% 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)
%% 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)
%% 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)
%% 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');
%% 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');
%% 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])
%% 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])
%% 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])
%% 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)
%% 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)
%% 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)
%% 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)
%% 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])
%% 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])
%% 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])
%% 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])
%% 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)
%% 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)
%% 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])
%% 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');
%% 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)
%% 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)
%% 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)
%% 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');
%% 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])
%% 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])
%% 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])
%% 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])
%% 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)
%% 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');
%% 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])
%% 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])
%% 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');
%% 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])
%% 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)
%% 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)
%% 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)
%% 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)
%% 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])
%% 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])
%% 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])
%% 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])
%% 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)
%% 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)
%% 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])
%% 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])
%% 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');
%% 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');
%% 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');
%% 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');
%% 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');
%% 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');
%% 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');
%% 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');
%% 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');
%% 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');
%% 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');
%% 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
##### SOURCE END #####
-->
</body>
</html>