From c95c85401e894f59313bddb8034c6a6df02c57ea Mon Sep 17 00:00:00 2001 From: Stephen Nneji Date: Wed, 13 May 2026 15:41:18 +0100 Subject: [PATCH 1/3] Check fitted parameter range and remove if too small --- API/checkRange.m | 36 ++++++++++++++++++++++++++++++++++++ API/parseClassToStructs.m | 3 +++ API/parseOutToProjectClass.m | 14 +++++++------- 3 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 API/checkRange.m diff --git a/API/checkRange.m b/API/checkRange.m new file mode 100644 index 000000000..5ffce380f --- /dev/null +++ b/API/checkRange.m @@ -0,0 +1,36 @@ +function problemStruct = checkRange(problemStruct, limits) + % Check the range of fitted parameters, remove parameter from fit if range is too small. + % + % Parameters + % ---------- + % problemStruct : struct + % The project struct. + % limits : struct + % The limits for each parameter. + % + % Returns + % ------- + % problemStruct : struct + % The project struct with fit information. + fields = {"params", "backgroundParams", "scalefactors", "bulkIns",... + "bulkOuts", "resolutionParams", "domainRatios"}; + titles = {"Parameter", "Background parameter", "Scalefactor", "Bulk in",... + "Bulk out", "Resolution parameter", "Domain ratio"}; + + for i = 1:length(fields) + fitIndices = find(problemStruct.checks.(fields{i})); + + for j = 1:length(fitIndices) + lower = limits.(fields{i})(fitIndices(j),1); + upper = limits.(fields{i})(fitIndices(j),2); + + if (upper - lower) < 1e-10 + paramName = problemStruct.names.(fields{i}){fitIndices(j)}; + warning('%s "%s" was removed from the fit because its range is too small (< 1e-10).', titles{i}, paramName); + problemStruct.checks.(fields{i})(fitIndices(j)) = 0; + end + end + end + +end + diff --git a/API/parseClassToStructs.m b/API/parseClassToStructs.m index 553571b1e..ff58997d2 100644 --- a/API/parseClassToStructs.m +++ b/API/parseClassToStructs.m @@ -290,6 +290,9 @@ problemStruct.checks.domainRatios = ones(1,0); end +if ~strcmpi(inputControls.procedure, procedures.Calculate.value) + problemStruct = checkRange(problemStruct, limits); +end % Make sure the indices cannot lie outside of the arrays checkIndices(problemStruct, inputStruct.files); diff --git a/API/parseOutToProjectClass.m b/API/parseOutToProjectClass.m index 6b157a409..3e6f80b0c 100644 --- a/API/parseOutToProjectClass.m +++ b/API/parseOutToProjectClass.m @@ -6,43 +6,43 @@ %(1) Parameters params = problemStruct.params; for i = 1:length(params) - project.setParameter(i, 'value', params(i)); + project.setParameter(i, 'value', params(i), 'fit', logical(problemStruct.checks.params(i))); end %(2) Backgrounds backgroundParams = problemStruct.backgroundParams; for i = 1:length(backgroundParams) - project.setBackgroundParam(i, 'value', backgroundParams(i)); + project.setBackgroundParam(i, 'value', backgroundParams(i), 'fit', logical(problemStruct.checks.backgroundParams(i))); end %(3) Scalefactors scalefactors = problemStruct.scalefactors; for i = 1:length(scalefactors) - project.setScalefactor(i,'value',scalefactors(i)); + project.setScalefactor(i,'value',scalefactors(i), 'fit', logical(problemStruct.checks.scalefactors(i))); end %(4) Bulk In bulkIns = problemStruct.bulkIns; for i = 1:length(bulkIns) - project.setBulkIn(i,'value',bulkIns(i)); + project.setBulkIn(i,'value',bulkIns(i), 'fit', logical(problemStruct.checks.bulkIns(i))); end %(5) Bulk Out bulkOuts = problemStruct.bulkOuts; for i = 1:length(bulkOuts) - project.setBulkOut(i,'value',bulkOuts(i)); + project.setBulkOut(i,'value',bulkOuts(i), 'fit', logical(problemStruct.checks.bulkOuts(i))); end %(6) Resolutions resolutionParams = problemStruct.resolutionParams; for i = 1:length(resolutionParams) - project.setResolutionParam(i,'value',resolutionParams(i)); + project.setResolutionParam(i,'value',resolutionParams(i), 'fit', logical(problemStruct.checks.resolutionParams(i))); end % (7) Domain ratio if strcmpi(problemStruct.TF, calculationTypes.Domains.value) domainRatios = problemStruct.domainRatios; for i = 1:length(domainRatios) - project.setDomainRatio(i,'value',domainRatios(i)); + project.setDomainRatio(i,'value',domainRatios(i), 'fit', logical(problemStruct.checks.domainRatios(i))); end end From 60cdb0e292308d6169a86f8c13193ab91bf4b2b5 Mon Sep 17 00:00:00 2001 From: Stephen Nneji Date: Tue, 4 Aug 2026 15:57:01 +0100 Subject: [PATCH 2/3] Changed range heuristics --- API/checkRange.m | 10 +++++++--- .../standardLayers/standardLayersDSPCScript.m | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/API/checkRange.m b/API/checkRange.m index 5ffce380f..ecdd8b4f0 100644 --- a/API/checkRange.m +++ b/API/checkRange.m @@ -23,10 +23,14 @@ for j = 1:length(fitIndices) lower = limits.(fields{i})(fitIndices(j),1); upper = limits.(fields{i})(fitIndices(j),2); - - if (upper - lower) < 1e-10 + minRange = abs(problemStruct.(fields{i})(fitIndices(j))) * 1e-6; + if minRange == 0 + minRange = 1e-6; + end + + if (upper - lower) < minRange paramName = problemStruct.names.(fields{i}){fitIndices(j)}; - warning('%s "%s" was removed from the fit because its range is too small (< 1e-10).', titles{i}, paramName); + warning('%s "%s" was removed from the fit because its range is too small (< %g).', titles{i}, paramName, minRange); problemStruct.checks.(fields{i})(fitIndices(j)) = 0; end end diff --git a/examples/normalReflectivity/standardLayers/standardLayersDSPCScript.m b/examples/normalReflectivity/standardLayers/standardLayersDSPCScript.m index 7a660f9d8..4cb0880e6 100644 --- a/examples/normalReflectivity/standardLayers/standardLayersDSPCScript.m +++ b/examples/normalReflectivity/standardLayers/standardLayersDSPCScript.m @@ -15,7 +15,7 @@ {'Sam tails hydration', 1, 5.253, 50, true, 'uniform', 0, Inf}; {'Sam rough', 1, 5.64, 15, true, 'uniform', 0, Inf}; {'cw thick', 10, 17.12, 28, true, 'uniform', 0, Inf}; - {'cw SLD', 0, 0, 1e-09, false, 'uniform', 0, Inf}; + {'cw SLD', 0, 0, 0, false, 'uniform', 0, Inf}; {'SAM head thick', 5, 8.56, 17, true, 'gaussian', 10, 2}; {'SAM head SLD', 1e-07, 1.75e-06, 2e-06, false, 'uniform', 0, Inf}; {'SAM head hydration', 10, 45.45, 50, true, 'uniform', 0, Inf}; From b88ef67e0efe9223f133787fb4412ed983630bdf Mon Sep 17 00:00:00 2001 From: Stephen Nneji Date: Wed, 12 Aug 2026 10:13:23 +0100 Subject: [PATCH 3/3] update live script --- .../standardLayersDSPCSheet.mlx | Bin 60474 -> 60471 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/normalReflectivity/standardLayers/standardLayersDSPCSheet.mlx b/examples/normalReflectivity/standardLayers/standardLayersDSPCSheet.mlx index 5ac6d586aae2329007fb8f2b3c8030078b53e47f..fd444c815d12efdd3f760cb0209713023d20dbd7 100644 GIT binary patch delta 3140 zcmV-K47>BX*aNrN1F-G`1z=53>eG|+16qG-MJkSOvETh>NJ^FzIZ55B?FDHpiz4Se z^BYqA<=5LNBsVOTT*N24eYdwuSnLU($BUEQe_y@aKid8E`7g_-zVNb$#frf5v3$Bb z*$tFRo*o=XFJKXsu1Hu6V{?&4RKeGDaj+DrpQOTLQo?dkcrfVoCI=Da@h&bo6aIe+ zKNJ1uBGn&LwF((oKE0vg$*$rmWV;7A@Q0V*4B1@ay@O(s{-d5x6^(tG`s58=fk5Om zrr}C*NyMB`az4E{BQHZi74SlS;~_qTizvNRY8HHeA9kxA&CctXr~s&g7OrK$nCg-x zti;2Rcr;B{L}ZH47=Fua&T|fDhC_cMX_Np58LAM*9hpn1howUz;j_>sZHjUgu$&K1 z#K5a6E7fw^B?5#Y628TZOi$n9_bCs#hxa9!i!c;R>EchD%(k+&mq{g}|3IuPpR$l) zB%JK>h%VS}W!OATl}h2km_`iZgz-h7cJs9d<0C_^^3am|DkwcOX?O;rRB?ZghNmH4 z#Kp5SDp|;5)-ZvF>I$XHA8mLfWg)m5*fikDYrl9heeL(H0xF`FzkhSXO$7!BO&M7T zbao|3%vkQ|;6EvOf6IN=)y}0T52d*b81>;2;sPR$kyrTj;0njlOYxQscb9ws0->}E z0|D*MK7?7Y@>8vee2UCw5lep;@R;@Qhn-e3PhF%X(Z02U6ipSGtw=<#O*Vk+`Ueo* zBBUV2v*z&m$H%kt)2q{uPsm$(&9p8onH~6?f%B6S;-!o#c46*!v@ba#jm;SLk9@*+eIWN%|y2E3(-50;vVKMS?%_C(oq@gh3R$WyR@h}Uc1O8f+xwWUxp%a7m}i)t zdzjl}dyQ47l(aT3G&VXkit4-Ltu>ZYsmDz2y%PxiJYcqumz+vHm*q=Cyc`wrGWa%B z)+#IIu}QyYuD5@Wmns!>w5pGREJcd>Ha^xwWjJyB8$G$|V?#4MY|b#XNHIUh$L_JV zPj8)L^6M|xn5mVo?hwk?9t^=QUs;jiMh=Vsqg>?hM8ky68Zj7P1r01b#5E|^NQI$9 z@Bugm+EtCCr#VU^mlzr`wEAQTjvJUKmUJayr2+>*5W;`52p*+DmK1wJKtd^v7tBC! zoCug(gW5HWW2)e`)9*SFy>+_%-d@{iuFbXIi6z29kH%!7ahld}88q_P=sjNS~j6J~2dS(~cjrhIu1Bb7XE7})?HnhO3#MmCg(M=-MXlTB5*sg6F#NUa)H7^&uF z9Z@DPo8bEKsjltq4a|o=LwDpV&?$}GCM@N+*#>`ibzYQu3r9E4P$W=$T<_S}eMY+p zv=rnwt653*$@$>DzCV5Yp@qD7$s%#XEWcdp&0C+%X%;Fn=c!brgIQi=p-=wE;A_fo zzl3n5neqZ%`d~T~N+6ms*+q$9LMj<%*S*3oQcVg)dmVTBdliSVcO9z<@GsjS4BXz~ zFu#8+_t?71BLMCiy;7O*HYg0~!W`V|Uy$>yO>zBXc!zN9F>d%7)os z7nt48c^ufQk$Zexp8KQy|0~vh!>`$rTg)Rp3J+3G;ieS2z>Ip=hyY?=wpP8TOx-2E zPcq<1#7u9lG77K_Tn9>mR5b^fuBX+Vpgd>fl)jKY7`5m2#`qTjdCwg*xxvQygYx`w zbw0$(-E>jYW8H^~QH><;_;PL7!5gv!U9FF^eUt^f)W+0d-j5T~A;m-6+mxNpxV6^>?UHxZ$m6tgu)$2)L6f3n+ieZ@~=Hi?h$5Ul)dIIz9(ZI!?Z2 z{@K@FW>-P0%V@c2K~VF<3&MO@(5~`x8096N5`- y-f7)J1l~(iK1}D4oz_6m1U{ z@;o7Jb#VBwy}*UNYiwMKMg=oR6TEL6v4FKUQp44?(Hhvr0^Bs*O!V$(i+d-r7UBgu4JB#6H_Kdn5`S1 z%i=rMqME8o^GY>QBl}tr+eig~g z`-omHPp@>rG%aO*d<=~y2l!4+nG~TUvru@~tvE_S;-sK<7E&oYd*9(m-Dfx0QA2;j zy~2YmKiT#S45*iF#pXUTty76ulR~AHHyvYZP<`8qIqLzJ7fq zCP^ri4o3XPW3D)qa*6L=pc^DY>Mij$H2l#0V(C2&*v-!P=uO%ag%3$ z5f`sNwCAmE;U}O>=lq59Y^NCVZRUl6Ibu?WkSF9SOL0qSP7;>xa{zGWwV*74n!+@* zEi3k&P`FV5X+IWAec%GnKLr1eRrzoLTlTtQ!SKi{O%g`Ycga~UDsG$MNyC47y9qjf zs?2#yA^>s|KG!cOBAE_z7cN<=P$V{(ru@IC$8nD^oh~u*L6}Cgoq-Y`z+<$kl0sT8I|q-hv*3aPkD_Eem$t;a z5G*Ie%N=Opv)C{(+;mQh5RYzuORSLZVhbdvbU`!((TE_(5lrnQ;uG1(iL@WC9e_p> zXhDMsp0JFOpRQKnVBzY-7@oBQIPI^Nhh%E*y_#Bm-)H@7=*9ap^7?T9G(0s`=J;0< zaFrlboOCW7hyV?W2LHa>n7qtx@9H(Ka+=RlmZy}}jPg0-`TVUQzveF;OdVIWQU9Tf zlrE!N(;LnrnxCN~5LZe5?6OL}0JA9O5CjEaO;GC7lRfHI0r-=Y>OKKdlhf)W8z)W0 zDI5U+02u-R02=@R00000009610002IlM(Ak1107FlVRr?lPl{KlZxva13~8ilVRs4 elg{fZ14HNllVRr?lYQt9lO*gA24Cp_0001b_!uYv delta 3172 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 K0AlF?0000uKMW55