AnalysisSystemForRadionucli.../baseinit.h
2024-06-04 15:25:02 +08:00

1721 lines
49 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef BASEINIT
#define BASEINIT
#endif // BASEINIT
#include "GammaAnalyAlgLib.h"
#include <armadillo>
#include "fitfunc.h"
#include <QVector>
SpecBaseInfo specInfo;
PAT pat;
void findROI(urowvec& l, urowvec& h, rowvec& roiMask,
vec fLo = vec("2"), uvec idx = uvec(0), vec fHi = vec(0))
{
if(fHi.is_empty()) fHi = fLo;
colvec C = pat.Peaks.col(i_Centroid);
colvec FWHM_CH = pat.Peaks.col(i_FWHM_Ch);
rowvec rg = specInfo.AnalysisRange;
int NChan = specInfo.Spectrum.size();
if(idx.is_empty()) idx = RangeVec(0, C.size()-1);
colvec temp_FWHM = IdxMat(FWHM_CH, idx);
colvec temp_C = IdxMat(C, idx);
colvec tempL = fLo % temp_FWHM;
colvec tempH = fHi % temp_FWHM;
colvec pkLo = max(rg[0], floor(temp_C - tempL));
colvec pkHi = min(rg[1], ceil(temp_C + tempH));
roiMask = zeros<rowvec>(NChan);
for(size_t i=0; i!=pkLo.size(); ++i)
{
roiMask(span(pkLo[i]-1, pkHi[i]-1)) = 1;
}
roiMask[0] = 0;
roiMask[roiMask.size()-1] = 0;
rowvec db = diff(roiMask);
l = find(db == 1) + 1;
h = find(db == -1);
}
void lGetData(rowvec& data, rowvec& step, rowvec& rg, rowvec& roiMask, uvec& L, uvec& H,
double PSSBreak, double PSSfwhm)
{
double maxFWHMfact = 5;
// same as matlab [stripped, step, rg] = dmspec(sn, 'Stripped', 'Steps', 'AnalysisRange');
rowvec stripped = specInfo.Stripped;
step = specInfo.Steps;
rg = specInfo.AnalysisRange;
// same as matlab [pC, pPSS, pFC] = dmps(sn, 'Centroid', 'Sensitivity', 'FWHM_Ch');
colvec pC = pat.Peaks.col(i_Centroid);
colvec pPSS = pat.Peaks.col(i_Sensitivity);
colvec pFC = pat.Peaks.col(i_FWHM_Ch);
data = stripped - step;
// get peak ranges
colvec factFWHM = 1 + (maxFWHMfact -1)*pPSS/PSSfwhm;
factFWHM = min(maxFWHMfact,factFWHM); // if factFWHM's members bigger then maxFWHMfact set them equal maxFWHMfact
factFWHM = NaNto1(factFWHM); //factFWHM(isnan(factFWHM)) = 1;
urowvec l;
urowvec h;
findROI(l, h, roiMask, factFWHM); // l,h,roiMask are out params
// get borders of ranges containing big peaks
rowvec isbig = zeros(size(l));
uvec idx;
for(size_t i=0; i<l.size(); ++i)
{
idx = find(pC > l[i] && pC < h[i]);
if(any(pPSS(idx) > PSSBreak)) isbig[i] = 1;
}
rowvec Lr = partVec(l, isbig); // row
rowvec Hr = partVec(h, isbig); // row
// remove ROIs that end to near lower cutoff
idx = find(Hr <= (rg(0) + 2));
if(any(idx))
{
for(size_t i=0; i!=idx.size(); ++i)
{
Lr.shed_col(idx(i));
Hr.shed_col(idx(i));
}
}
// shift ROI limit if first ROI goes beyond lower cutoff
if((!Lr.is_empty()) && (Lr[0] <= rg[0]))
{
Lr[0] = rg[0] + 1;
}
// add lower cutoff as a ROI
urowvec V(1);
V[0] = 1;
Lr.insert_cols(0,V);
V[0] = rg[0];
Hr.insert_cols(0, V);
L = vectorise(Lr);
H = vectorise(Hr);
}
rowvec restpolyfit(vec& r, vec x, vec y, vec p0, vec w = vec(0u))
{
if( x.size() != y.size() )
{
qDebug() << "X and Y vectors must be the same size."; // messagebox
}
if(w.is_empty())
{
w = ones<vec>(x.size());
}
else {
y = y % w;
}
int n = p0.size()-1;
// Construct 'weighted' Vandermonde matrix.
mat V = zeros<mat>(w.size(),n+1);
V.col(n) = w;
for(int i=n-1; i>=0; --i)
{
V.col(i) = x % V.col(i+1);
}
// get free and fixed component
uvec freeIdx = find_nonfinite(p0);
uvec fixIdx = find_finite(p0);
rowvec p;
if(fixIdx.size() == 1)
{
vec yfix = V.col( fixIdx(0) ) * p0( fixIdx(0) );
vec yfree = y - yfix;
mat Q, R;
qr_econ(Q, R, MatCols(V, freeIdx));
p = solve(R, trans(Q) * yfree); // 待测试P应为行向量
colvec yhat = yfix + MatCols(V, freeIdx) * p;
r = y - yhat;
p0(freeIdx) = p;
p = p0.t();
}
else {
qDebug() << "In function restpolyfit, the finite number of p0 must be 1";
}
return p;
}
void lNorm(rowvec yy, rowvec mask, double xc, double xh, double yh, double np,
double& nrm, double& lbda, double& yc, double& dyc, double& xl, double& yh, double& dyh)
{
// check argument, get polynomial mask
rowvec p;
if(np == 4)
{
p.resize(4);
p << gNaN << gNaN << gNaN << yh;
}
else if(np == 2)
{
p.resize(2);
p << gNaN << yh;
}
else qDebug() << "invalid np";
// get whole fitting interval
double k = xh - xc;
xl = qMax(1, xh-2*k);
rowvec xx = RangeVec2(xl-1,xh-1);
// remove flagged points
uvec idx = find( IdxMat(mask,xx) == true );
for(int i=idx.size()-1; i>=0; --i)
{
xx.shed_col(i);
}
if(xx.size()<5)
{
nrm = 0;
lbda = 1;
yc = yy(xc);
dyc = 0;
yh = yy(xh);
dyh = 0;
return;
}
// limit to actual points
rowvec y = IdxMat(yy,xx);
rowvec x = xx - xh;
// perform fit
colvec r;
p = restpolyfit(r, x, y, p);
// polyder.m
rowvec dp, t_null;
Matlab::polyder(dp, t_null, 1, p);
nrm = accu(r % r);
lbda = max(1, mean(sqrt(abs(y))));
rowvec yval, dyval;
rowvec rg(2);
rg(0) = -k;
rg(1) = 0;
yval = Matlab::polyval(p, rg);
dyval = Matlab::polyval(dp, rg);
yc = yval(0);
yh = yval(1);
dyc = dyval(0);
dyh = dyval(1);
}
void lSelectNext(double x, double y, rowvec data, double xb, rowvec imask, double np,
double& xn, double& yn, double& dyn, bool& hit, double& y1, double& dy1)
{
// selection algorithm parameters:
// lambda multiplier for norm threshold
double NMax = 4000;
// minimum interval length
double MinDist = 10;
// get next step
double hi = qMax(1, x - MinDist);
xn = qMax(1, hi - 1);
// binary search
// get norms for initial new x
double norm, lambda, x0, y0, dy0;
lNorm(data, imask, xn, x, y, np, norm, lambda, yn, dyn, x0, y0, dy0);
while(hi != xn)
{
if(norm < NMax * lambda)
{
double tmp = xn;
xn = max(1, 3*xn - 2*hi);
hi = tmp;
}
else
{
xn = hi - floor((hi-xn)/2);
}
lNorm(data, imask, xn, x, y, np, norm, lambda, yn, dyn, x0, y1, dy1);
}
if(xn < xb)
{
xn = xb;
lNorm(data, imask, xn, x, y, np, norm, lambda, yn, dyn, x0, y0, dy0);
}
hit = (x0 <= xb);
}
void lFitRange(double x0, double y0, double x1, rowvec xv, rowvec data, rowvec mask, int npara,
rowvec& yv, rowvec& dyv)
{
rowvec xx = RangeVec2(min(x0, x1), max(x0,x1));
//xx(mask(xx)==true) = [];
uvec idx = find( mask(xx) == true );
for(int i=idx.size()-1; i>=0; ++i)
{
xx.shed_col(idx(i));
}
if(xx.size()<5)
{
qDebug() << QString("Warning: only %1 points between %2 and %3")
.arg(xx.size()).arg(min(x0,x1)).arg(max(x0,x1));
yv = IdxMat(data, xv);
dyv = zeros( size(xv) );
return;
}
// fit linear or cubic polynomial
rowvec p0;
switch(npara)
{
case 2: p0 << gNaN << y0; break;
case 4: p0 << gNaN << gNaN << gNaN << y0; break;
default: qDebug() << "Bug: invalid npara value"; break;
}
// fit polynomial
rowvec yy = IdxMat(data, xx);
xx = xx - x0;
colvec r;
rowvec p = restpolyfit(r, xx, yy, p0);
// evaluate
yv = Matlab::polyval(p, xv - x0);
mat a, b;
Matlab::polyder(a, b, 1, p);
dyv = Matlab::polyval(a, xv - x0);
}
void lInitBase(const rowvec& data, const rowvec& step, const rowvec& rg,
const rowvec& roiMask, const uvec& L, const uvec& H,
double N1, double N2, double N3,
rowvec& cx, rowvec& cy, rowvec& cdy)
{
size_t roiIdx = L.size();
double xb = H[roiIdx-1];
cx.set_size(0);
cy.set_size(0);
cdy.set_size(0);
double x = rg[1];
double y = gNaN;
double dy = gNaN;
bool pingold = true;
double nP = 0;
while(x > rg[0])
{
// get next controlpoints
if(pingold) nP = 2;
else nP = 4;
double xn, yn, dyn, yo, dyo;
bool pingNew = false;
lSelectNext(x, y, data, xb, roiMask, nP, xn, yn, dyn, pingNew, yo, dyo);
if(pingold)
{
// starting left of a ROI
if(pingNew)
{
// delta = x - xb + 1;
double delta = accu( roiMask.cols(xb,x) == false );
if(delta < N2)
{
if(cx.is_empty())
{
// highest controlpoint, must be introduced
lFitRange(x, gNaN, xb, x, data, roiMask, 2, cy, cdy);
cx << x;
}
else if(roiIdx == 1)
{
// lowest controlpoint, must be introduced
lFitRange(xb, gNaN, x, xb, data, roiMask, 2, yn, dyn);
rowvec tmp;
tmp << xb;
cx = join_horiz(tmp, cx);
tmp << yn;
cy = join_horiz(tmp, cy);
tmp << dyn;
cdy = join_horiz(tmp, cdy);
}
else
{
if(delta < N1)
{
// no control point introduced
}
else
{
// introducing only one control point
double xc = round((x + xb)/2);
lFitRange(xb,gNaN,x, xc, data, roiMask, 2, yn, dyn);
rowvec tmp;
tmp << xc;
cx = join_horiz(tmp, cx);
tmp << yn;
cy = join_horiz(tmp, cy);
tmp << dyn;
cdy = join_horiz(tmp, cdy);
}
}
}
else if(delta < N3)
{
rowvec tmp; tmp << xb << x;
lFitRange(x, y, xb, tmp, data, roiMask, 2, yn, dyn);
cx = join_horiz(tmp, cx); //cx = [xb, x, cx];
tmp << yn;
cy = join_horiz(tmp, cy); //cy = [yn, cy];
tmp << gNaN << gNaN;
cdy = join_horiz(tmp, cdy); //cdy = [NaN, NaN, cdy];
}
else
{
// introducing three control points
double xc = round((x + xb)/2);
rowvec tmp;
tmp << xb << xc << x;
lFitRange(xb, gNaN, x, tmp, data, roiMask, 4, yn, dyn);
cx = join_horiz(tmp, cx); //cx = [xb,xc,x,cx];
tmp << yn;
cy = join_horiz(tmp, cy); //cy = [yn, cy];
tmp << dyn(0) << gNaN << gNaN;
cdy = join_horiz(tmp, cdy); //cdy = [dyn(1), NaN, NaN, cdy];
}
if(roiIdx == 1)
{
break;
}
x = L(roiIdx -1);
y = gNaN;
dy = gNaN;
roiIdx = roiIdx -1;
xb = H(roiIdx -1);
}
else {
// normal algorithm left of ROI
rowvec tmp; tmp << x;
cx = join_horiz(tmp, cx); //cx = [x, cx];
tmp << yo;
cy = join_horiz(tmp, cy); //cy = [yo, cy];
tmp << dyo;
cdy = join_horiz(tmp, cdy); //cdy = [dyo, cdy];
// continue from here
x = xn;
y = yn;
dy = dyn;
}
}
else
{
// starting from normal CP
if(pingNew)
{
// hitting a ROI
if(roiIdx == 1)
{
// hitting lower analysis range
if(xn == xb)
{
// next control point at end
lFitRange(x, y, xb, xb, data, roiMask, 2, yn, dyn);
rowvec tmp;
tmp << xb; cx = join_horiz(tmp, cx); //cx = [xb, cx];
tmp << yn; cy = join_horiz(tmp, cy); //cy = [yn, cy];
tmp << dyn; cdy = join_horiz(tmp, cdy); //cdy = [dyn, cdy];
}
else
{
double xm = round((x+xb)/2);
rowvec tmp; tmp << xb << xm;
lFitRange(x, y, xb, tmp, data, roiMask, 4, yn, dyn);
cx = join_horiz(tmp, cx); //cx = [xb, xm, cx];
tmp << yn;
cy = join_horiz(tmp, cy); //cy = [yn, cy];
tmp << dyn(0) << gNaN;
cdy = join_horiz(tmp, cdy); //cdy = [dyn(1), NaN, cdy];
}
break;
}
else if(xn == xb)
{
// hitting ROI completely
rowvec tmp;
tmp << xn; cx = join_horiz(tmp, cx); //cx = [xn, cx];
tmp << yn; cy = join_horiz(tmp, cy); //cy = [yn, cy];
tmp << dyn; cdy = join_horiz(tmp, cdy); //cdy = [dyn, cdy];
}
else {
double xc = ceil((x+xb)/2);
rowvec tmp; tmp << xb << xc;
lFitRange(x, y, xb, tmp, data, roiMask, 4, yn, dyn);
//add righthand CP, with fixed dy;
cx = join_horiz(tmp, cx); //cx = [xb, xc, cx];
tmp << yn;
cy = join_horiz(tmp, cy); //cy = [yn, cy];
tmp << dyn(0) << gNaN;
cdy = join_horiz(tmp, cdy); //cdy = [dyn(1), NaN, cdy];
}
// continue on lefthand, starting with free slope
x = L(roiIdx-1);
y = gNaN;
dy = gNaN;
roiIdx = roiIdx - 1;
xb = H(roiIdx-1);
}
else
{
// normal procedure
rowvec tmp;
tmp << xn; cx = join_horiz(tmp, cx); //cx = [xn, cx];
tmp << yn; cy = join_horiz(tmp, cy); //cy = [yn, cy];
tmp << gNaN; cdy = join_horiz(tmp, cdy); //cdy = [NaN, cdy];
// continue from here
x = xn;
y = yn;
dy = dyn;
}
}
pingold = pingNew;
}
if( qIsNaN( cdy(0) ) )
{
cdy(0) = 0;
}
if( qIsNaN( cdy( cdy.size()-1 ) ) )
{
cdy( cdy.size()-1 ) = 0;
}
if(cx.size() == 1)
{
cx = rg;
double tmp = cy(0);
cy << tmp << tmp;
cdy << 0 << 0;
qDebug() << "Whole baseline was fitted at once";
}
cy = cy + IdxMat(step, cx-1);
}
void tmpbase(rowvec& cx,rowvec& cy,rowvec& cdy)
{
}
void baseInit(rowvec& cx, rowvec& cy, rowvec& cdy,
double PSSBreak = 100, double PSSfwhm = 100)
{
//% least number of data points to be fitted for 1 CP
double NMin = 5;
//% absolute minimum distance of CPs
double NCritical = 10;
//% minimum number of data points between ROIs to use 3 CPs
double NTwo = 50; //% should come from data condition
rowvec data;
rowvec step;
rowvec rg;
rowvec roiMask;
uvec L;
uvec H;
lGetData(data, step, rg, roiMask, L, H, PSSBreak, PSSfwhm);
lInitBase(data, step, rg, roiMask, L, H, NMin, NCritical, NTwo, cx, cy, cdy);
tmpbase(cx,cy,cdy);
return;
}
void dmps()
{
% some default values
myNaN=NaN;
myDummy={'-'};
% get PAT tables depending on source
[s, msg, patEntry, isValidName] = getPATByName(sn, varargin{1});
patName = patEntry{1};
pstab = patEntry{2};
flags = patEntry{3};
nuclist = patEntry{4};
calNames = patEntry{5};
nucIdxStruc = patEntry{6};
if isValidName
varargin(1) = [];
end
% number of PAT entries
NPeaks=size(pstab,1);
%flags which vars are required
Centroid_n = 1;
FWHM_Ch_n = 2;
NetArea_n = 3;
AreaError_n = 4;
Step_n = 5;
Multiplet_n = 6;
MeanBackCount_n = 7;
Sensitivity_n = 8;
Source_n = 9;
FitFlags_n = 10;
Spurious_n = 11;
Reviewed_n = 12;
Nuclide_n = 13;
Energy_n = 14;
FWHM_n = 15;
Efficiency_n = 16;
AreaErrorP_n = 17;
MultipletStr_n = 18;
LineDeviation_n = 19;
dE_n = 20;
Res_n = 21;
Res_Ch_n = 22;
SignificancePAT_n = 23;
SignificanceFlag_n = 24;
Index_n = 25;
ManualTail_n = 26;
Tail_n = 27;
TailFlag_n = 28;
TailChanged_n = 29;
FWHMIsFitted_n = 30;
CentroidErr_n = 31;
EnergyPAT_n = 32;
FWHM_ChPAT_n = 33;
FWHMPAT_n = 34;
FWHMErr_n = 35;
BWWidthPAT_n = 36;
BWWidth_n = 37;
StepRatioPAT_n = 38;
StepErr_n = 39;
TailErr_n = 40;
AreaErrorPAT_n = 41;
EmissionRatePAT_n = 42;
EmissionRate_n = 43;
EmissionRateErr_n = 44;
CCFPAT_n = 45;
CCF_n = 46;
CCFErrPAT_n = 47;
SignificanceErr_n = 48;
MultipletPAT_n = 49;
EfficiencyPAT_n = 50;
EfficiencyErrPAT_n = 51;
EnergyErr_n = 52;
BWWidthErr_n = 53;
ResChanged_n = 54;
Step_n = 55;
StepRatio_n = 56;
StepRatioErr_n = 57;
TailAlpha_n = 58;
UpperTail_n = 59;
UpperTailAlpha_n = 60;
BWWidthChan_n = 61;
NetAreaFree_n = 62;
NetAreaFlag_n = 63;
LineEnergy_n = 64;
FWHMFitted_n = 65;
CountsPerSecond_n = 66;
appERate_n = 67;
Yield_n = 68;
YieldErr_n = 69;
ReferenceID_n = 70;
RefPointer_n = 71;
BranchingRatio_n = 72;
NuclideHard_n = 73;
NuclideSoft_n = 74;
NetAreaCalculated_n = 75;
LineEnergyErr_n = 76;
ReferencePN_n = 77;
LC_n = 78;
LD_n = 79;
SignedResidual_n = 80;
UnsignedResidual_n = 81;
CCFErr_n = 82;
SumPeakArea_n = 83;
SumPeakAreaErrP_n = 84;
PeakShare_n = 85;
NuclideInternal_n = 86;
NACalcMin_n = 87;
NetAreaMin_n = 88;
PeakIdentified_n = 89;
HalfLife_n = 90;
HalfLifeStr_n = 91;
Activity_n = 92;
DecayCorrection_n = 93;
EfficiencyErr_n = 94;
BackgroundArea_n = 95;
Significance_n = 96;
NetAreaCalcError_n = 97;
NetAreaCalcUTest_n = 98;
RefEfficiencyErrPAT_n = 99;
RefEfficiencyErr_n = 100;
UpperTailBeta_n = 101;
RecoilBeta_n = 102;
RecoilBetaChan_n = 103;
RecoilDeltaE_n = 104;
RecoilDeltaChan_n = 105;
TailAlphaPAT_n = 106;
UpperTailPAT_n = 107;
UpperTailAlphaPAT_n = 108;
EffectiveHalflife_n = 109;
EffectiveHalflifeStr_n = 110;
HalfLifeError_n = 111;
EffectiveHalflifeError_n = 112;
SigmaCh_n = 113;
Sigma_n = 114;
VAR_NUMBER = 114;
depend = cell(VAR_NUMBER, 1);
% dependencies
depend{Centroid_n} = Centroid_n;
depend{CentroidErr_n} = CentroidErr_n;
depend{EnergyPAT_n} = EnergyPAT_n;
depend{FWHM_ChPAT_n} = FWHM_ChPAT_n;
depend{FWHM_Ch_n} = [FWHM_Ch_n, FWHM_ChPAT_n, Res_Ch_n, dE_n];
depend{NetArea_n} = NetArea_n;
depend{AreaErrorPAT_n} = AreaErrorPAT_n;
depend{AreaError_n} = [AreaErrorPAT_n, AreaError_n, NetArea_n, LC_n, ...
BackgroundArea_n];
depend{StepRatioPAT_n} = StepRatioPAT_n;
depend{Step_n} = [Step_n, StepRatio_n, NetArea_n];
depend{StepRatio_n} = [StepRatio_n, StepRatioPAT_n, Energy_n];
depend{StepRatioErr_n} = StepRatioErr_n;
depend{StepErr_n} = [StepErr_n, StepRatioErr_n, NetArea_n];
depend{TailErr_n} = TailErr_n;
depend{EmissionRatePAT_n} = EmissionRatePAT_n;
depend{EmissionRateErr_n} = EmissionRateErr_n;
depend{CCFPAT_n} = CCFPAT_n;
depend{CCFErrPAT_n} = CCFErrPAT_n;
depend{Yield_n} = Yield_n;
depend{YieldErr_n} = YieldErr_n;
depend{ReferenceID_n} = ReferenceID_n;
depend{EfficiencyErrPAT_n} = EfficiencyErrPAT_n;
depend{EfficiencyErr_n} = [EfficiencyErr_n, EfficiencyErrPAT_n, Energy_n];
depend{RefEfficiencyErr_n} = [RefEfficiencyErr_n, RefEfficiencyErrPAT_n, ...
EfficiencyErr_n, ReferencePN_n];
depend{EnergyErr_n} = EnergyErr_n;
depend{BWWidthErr_n} = BWWidthErr_n;
depend{MultipletPAT_n} = Multiplet_n;
depend{Multiplet_n} = [MultipletPAT_n, Multiplet_n, Centroid_n, FWHM_Ch_n, NetArea_n];
depend{MeanBackCount_n} = MeanBackCount_n;
depend{Sensitivity_n} = Sensitivity_n;
depend{SignificancePAT_n} = SignificancePAT_n;
depend{SignificanceErr_n}= SignificanceErr_n;
depend{LineEnergy_n} = LineEnergy_n;
depend{LineEnergyErr_n} = LineEnergyErr_n;
depend{LC_n} = LC_n;
depend{LD_n} = LD_n;
depend{SignedResidual_n} = SignedResidual_n;
depend{UnsignedResidual_n} = UnsignedResidual_n;
depend{SumPeakArea_n} = SumPeakArea_n;
depend{SumPeakAreaErrP_n} = SumPeakAreaErrP_n;
depend{Source_n} = Source_n;
depend{FitFlags_n} = FitFlags_n;
depend{Spurious_n} = Spurious_n;
depend{Reviewed_n} = Reviewed_n;
depend{NuclideHard_n} = NuclideHard_n;
depend{NuclideSoft_n} = NuclideSoft_n;
depend{Nuclide_n} = Nuclide_n;
depend{ManualTail_n} = ManualTail_n;
depend{TailChanged_n} = TailChanged_n;
depend{ResChanged_n} = ResChanged_n;
depend{BackgroundArea_n} = BackgroundArea_n;
depend{RefEfficiencyErrPAT_n} = RefEfficiencyErrPAT_n;
depend{Energy_n} = [EnergyPAT_n, Energy_n, Centroid_n];
depend{FWHM_n} = [FWHM_n, FWHMPAT_n, FWHM_Ch_n, dE_n];
depend{SigmaCh_n} = [SigmaCh_n, FWHM_Ch_n];
depend{Sigma_n} = [Sigma_n, FWHM_n];
depend{EfficiencyPAT_n} = EfficiencyPAT_n;
depend{Efficiency_n} = [Efficiency_n, EfficiencyPAT_n, Energy_n];
depend{AreaErrorP_n} = [AreaErrorP_n, NetArea_n, AreaError_n, LC_n];
depend{MultipletStr_n} = [MultipletStr_n, Multiplet_n];
depend{LineDeviation_n} = [LineDeviation_n, Energy_n, LineEnergy_n];
depend{dE_n} = [dE_n, Centroid_n];
depend{Res_n} = [Res_n, Energy_n];
depend{Res_Ch_n} = [Res_Ch_n, Res_n, dE_n];
depend{Significance_n} = [Significance_n, SignificancePAT_n, NetArea_n, ...
LC_n, Source_n];
depend{SignificanceFlag_n} = [SignificanceFlag_n, Significance_n];
depend{Index_n} = Index_n;
depend{Tail_n} = [Tail_n, ManualTail_n, Energy_n];
depend{TailFlag_n} = [TailFlag_n, ManualTail_n];
depend{FWHMIsFitted_n} = [FWHMIsFitted_n, FitFlags_n];
depend{FWHMFitted_n} = [FWHMFitted_n, FWHMIsFitted_n, FWHM_n];
depend{FWHMPAT_n} = FWHMPAT_n;
depend{FWHMErr_n} = FWHMErr_n;
depend{BWWidthPAT_n} = BWWidthPAT_n;
depend{BWWidth_n} = [BWWidth_n, BWWidthPAT_n];
depend{BWWidthChan_n} = [BWWidthChan_n, BWWidth_n, dE_n];
depend{EmissionRate_n} = [EmissionRate_n, EmissionRatePAT_n, NetArea_n, ...
Efficiency_n];
depend{CCF_n} = [CCF_n, CCFPAT_n];
depend{CCFErr_n} = [CCFErr_n, CCFErrPAT_n, CCF_n];
depend{TailAlphaPAT_n} = TailAlphaPAT_n;
depend{TailAlpha_n} = [TailAlpha_n, TailAlphaPAT_n, Energy_n];
depend{UpperTailPAT_n} = [UpperTailPAT_n];
depend{UpperTail_n} = [UpperTail_n, UpperTailPAT_n, Energy_n];
depend{UpperTailAlphaPAT_n} = [UpperTailAlphaPAT_n];
depend{UpperTailAlpha_n} = [UpperTailAlpha_n, UpperTailAlphaPAT_n, Energy_n];
depend{NetAreaFlag_n} = [NetAreaFlag_n];
depend{NetAreaFree_n} = [NetAreaFree_n, Source_n, NetAreaFlag_n];
depend{CountsPerSecond_n} = [CountsPerSecond_n, NetArea_n];
depend{appERate_n} = [appERate_n, CountsPerSecond_n, Efficiency_n];
depend{Nuclide_n} = [Nuclide_n, NuclideHard_n, NuclideSoft_n];
depend{ReferencePN_n} = [ReferencePN_n, ReferenceID_n, RefPointer_n];
depend{NuclideInternal_n} = [NuclideInternal_n, NuclideHard_n];
depend{PeakIdentified_n} = [PeakIdentified_n, NuclideHard_n];
depend{RefPointer_n} = [RefPointer_n, NuclideInternal_n];
depend{BranchingRatio_n} = [BranchingRatio_n, NuclideInternal_n, ReferencePN_n];
depend{NetAreaCalculated_n} = [NetAreaCalculated_n, Yield_n, ReferencePN_n, ...
BranchingRatio_n, CCF_n, NetArea_n, Efficiency_n];
depend{NetAreaCalcError_n} = [NetAreaCalcError_n, ReferencePN_n, ...
YieldErr_n, AreaErrorP_n, CCFErr_n, RefEfficiencyErr_n];
depend{NetAreaCalcUTest_n} = [NetAreaCalcUTest_n, NetArea_n, AreaError_n, ...
NetAreaCalculated_n, NACalcMin_n, NetAreaCalcError_n];
depend{NACalcMin_n} = [NACalcMin_n, Yield_n, ReferencePN_n, ...
BranchingRatio_n, CCF_n, NetAreaMin_n, Efficiency_n];
depend{NetAreaMin_n} = [NetAreaMin_n, NetArea_n, LC_n];
depend{PeakShare_n} = [PeakShare_n, SumPeakArea_n, ...
NetAreaCalculated_n, NetArea_n];
depend{HalfLife_n} = [HalfLife_n, NuclideInternal_n];
depend{HalfLifeError_n} = [HalfLifeError_n, NuclideInternal_n];
depend{HalfLifeStr_n} = [HalfLifeStr_n, NuclideInternal_n];
depend{EffectiveHalflife_n} = [EffectiveHalflife_n, NuclideInternal_n];
depend{EffectiveHalflifeError_n} = [EffectiveHalflifeError_n,NuclideInternal_n];
depend{EffectiveHalflifeStr_n} = [EffectiveHalflife_n, EffectiveHalflifeStr_n];
depend{DecayCorrection_n} = [DecayCorrection_n, HalfLife_n];
depend{Activity_n} = [Activity_n, NetArea_n, CCF_n, Efficiency_n, Yield_n, ...
DecayCorrection_n];
depend{UpperTailBeta_n} = [UpperTailBeta_n, UpperTail_n, UpperTailAlpha_n, ...
SigmaCh_n, dE_n];
depend{RecoilBeta_n} = RecoilBeta_n;
depend{RecoilBetaChan_n} = [RecoilBetaChan_n, RecoilBeta_n, dE_n];
depend{RecoilDeltaE_n} = RecoilDeltaE_n;
depend{RecoilDeltaChan_n} = [RecoilDeltaChan_n, RecoilDeltaE_n, dE_n];
% which variables are needed
needed = zeros(VAR_NUMBER, 1);
% parse descriptors and remember needed variables
for i = 1 : length(varargin)
desc = varargin{i};
switch desc
case 'Activity'
needed(depend{Activity_n}) = 1;
case 'appERate'
needed(depend{appERate_n}) = 1;
case 'AreaError'
needed(depend{AreaError_n}) = 1;
case 'AreaErrorP'
needed(depend{AreaErrorP_n}) = 1;
case 'AreaErrorPAT'
needed(depend{AreaErrorPAT_n}) = 1;
case 'BackgroundArea'
needed(depend{BackgroundArea_n}) = 1;
case 'BranchingRatio'
needed(depend{BranchingRatio_n}) = 1;
case 'BWWidth'
needed(depend{BWWidth_n}) = 1;
case 'BWWidthChan'
needed(depend{BWWidthChan_n}) = 1;
case 'BWWidthErr'
needed(depend{BWWidthErr_n}) = 1;
case 'BWWidthPAT'
needed(depend{BWWidthPAT_n}) = 1;
case 'Centroid'
needed(depend{Centroid_n}) = 1;
case 'CentroidErr'
needed(depend{CentroidErr_n}) = 1;
case 'CCF'
needed(depend{CCF_n}) = 1;
case 'CCFPAT'
needed(depend{CCFPAT_n}) = 1;
case 'CCFErr'
needed(depend{CCFErr_n}) = 1;
case 'CountsPerSecond'
needed(depend{CountsPerSecond_n}) = 1;
case 'dE'
needed(depend{dE_n}) = 1;
case 'EffectiveHalflife'
needed(depend{EffectiveHalflife_n}) = 1;
case 'EffectiveHalflifeError'
needed(depend{EffectiveHalflifeError_n}) = 1;
case 'EffectiveHalflifeStr'
needed(depend{EffectiveHalflifeStr_n}) = 1;
case 'Efficiency'
needed(depend{Efficiency_n}) = 1;
case 'EfficiencyErr'
needed(depend{EfficiencyErr_n}) = 1;
case 'EfficiencyPAT'
needed(depend{EfficiencyPAT_n}) = 1;
case 'EmissionRate'
needed(depend{EmissionRate_n}) = 1;
case 'EmissionRateErr'
needed(depend{EmissionRateErr_n}) = 1;
case 'EmissionRatePAT'
needed(depend{EmissionRatePAT_n}) = 1;
case 'Energy'
needed(depend{Energy_n}) = 1;
case 'EnergyErr'
needed(depend{EnergyErr_n}) = 1;
case 'EnergyPAT'
needed(depend{EnergyPAT_n}) = 1;
case 'FitFlags'
needed(depend{FitFlags_n}) = 1;
case 'FWHM'
needed(depend{FWHM_n}) = 1;
case 'FWHM_Ch'
needed(depend{FWHM_Ch_n}) = 1;
case 'FWHM_ChPAT'
needed(depend{FWHM_ChPAT_n}) = 1;
case 'FWHMErr'
needed(depend{FWHMErr_n}) = 1;
case 'FWHMFitted'
needed(depend{FWHMFitted_n}) = 1;
case 'FWHMIsFitted'
needed(depend{FWHMIsFitted_n}) = 1;
case 'FWHMPAT'
needed(depend{FWHMPAT_n}) = 1;
case 'HalfLife'
needed(depend{HalfLife_n}) = 1;
case 'HalfLifeError'
needed(depend{HalfLifeError_n}) = 1;
case 'HalfLifeStr'
needed(depend{HalfLifeStr_n}) = 1;
case 'Index'
needed(depend{Index_n}) = 1;
case 'LC'
needed(depend{LC_n}) = 1;
case 'LD'
needed(depend{LD_n}) = 1;
case 'LineDeviation'
needed(depend{LineDeviation_n}) = 1;
case 'LineEnergy'
needed(depend{LineEnergy_n}) = 1;
case 'LineEnergyErr'
needed(depend{LineEnergyErr_n}) = 1;
case 'ManualTail'
needed(depend{ManualTail_n}) = 1;
case 'MeanBackCount'
needed(depend{MeanBackCount_n}) = 1;
case 'Multiplet'
needed(depend{Multiplet_n}) = 1;
case 'MultipletPAT'
needed(depend{MultipletPAT_n}) = 1;
case 'MultipletStr'
needed(depend{MultipletStr_n}) = 1;
case 'NACalcMin'
needed(depend{NACalcMin_n}) = 1;
case 'NetArea'
needed(depend{NetArea_n}) = 1;
case 'NetAreaCalculated'
needed(depend{NetAreaCalculated_n}) = 1;
case 'NetAreaCalcError'
needed(depend{NetAreaCalcError_n}) = 1;
case 'NetAreaCalcUTest'
needed(depend{NetAreaCalcUTest_n}) = 1;
case 'NetAreaFlag'
needed(depend{NetAreaFlag_n}) = 1;
case 'NetAreaFree'
needed(depend{NetAreaFree_n}) = 1;
case 'Nuclide'
needed(depend{Nuclide_n}) = 1;
case 'NuclideHard'
needed(depend{NuclideHard_n}) = 1;
case 'NuclideInternal'
needed(depend{NuclideInternal_n}) = 1;
case 'NuclideSoft'
needed(depend{NuclideSoft_n}) = 1;
case 'PeakIdentified'
needed(depend{PeakIdentified_n}) = 1;
case 'PeakShare'
needed(depend{PeakShare_n}) = 1;
case 'RecoilBeta'
needed(depend{RecoilBeta_n}) = 1;
case 'RecoilBetaChan'
needed(depend{RecoilBetaChan_n}) = 1;
case 'RecoilDeltaE'
needed(depend{RecoilDeltaE_n}) = 1;
case 'RecoilDeltaChan'
needed(depend{RecoilDeltaChan_n}) = 1;
case 'RefEfficiencyErr'
needed(depend{RefEfficiencyErr_n}) = 1;
case 'ReferenceID'
needed(depend{ReferenceID_n}) = 1;
case 'ReferencePN'
needed(depend{ReferencePN_n}) = 1;
case 'RefPointer'
needed(depend{RefPointer_n}) = 1;
case 'Res'
needed(depend{Res_n}) = 1;
case 'Res_Ch'
needed(depend{Res_Ch_n}) = 1;
case 'ResChanged'
needed(depend{ResChanged_n}) = 1;
case 'Reviewed'
needed(depend{Reviewed_n}) = 1;
case 'Sensitivity'
needed(depend{Sensitivity_n}) = 1;
case 'Sigma'
needed(depend{Sigma_n}) = 1;
case 'SigmaCh'
needed(depend{SigmaCh_n}) = 1;
case 'SignedResidual'
needed(depend{SignedResidual_n}) = 1;
case 'Significance'
needed(depend{Significance_n}) = 1;
case 'SignificanceErr'
needed(depend{SignificanceErr_n}) = 1;
case 'SignificanceFlag'
needed(depend{SignificanceFlag_n}) = 1;
case 'Source'
needed(depend{Source_n}) = 1;
case 'Spurious'
needed(depend{Spurious_n}) = 1;
case 'Step'
needed(depend{Step_n}) = 1;
case 'StepErr'
needed(depend{StepErr_n}) = 1;
case 'StepRatio'
needed(depend{StepRatio_n}) = 1;
case 'StepRatioErr'
needed(depend{StepRatioErr_n}) = 1;
case 'StepRatioPAT'
needed(depend{StepRatioPAT_n}) = 1;
case 'SumPeakArea'
needed(depend{SumPeakArea_n}) = 1;
case 'SumPeakAreaErrP'
needed(depend{SumPeakAreaErrP_n}) = 1;
case 'Tail'
needed(depend{Tail_n}) = 1;
case 'TailAlpha'
needed(depend{TailAlpha_n}) = 1;
case 'TailAlphaPAT'
needed(depend{TailAlphaPAT_n}) = 1;
case 'TailChanged'
needed(depend{TailChanged_n}) = 1;
case 'TailErr'
needed(depend{TailErr_n}) = 1;
case 'TailFlag'
needed(depend{TailFlag_n}) = 1;
case 'UnsignedResidual'
needed(depend{UnsignedResidual_n}) = 1;
case 'UpperTail'
needed(depend{UpperTail_n}) = 1;
case 'UpperTailPAT'
needed(depend{UpperTailPAT_n}) = 1;
case 'UpperTailAlpha'
needed(depend{UpperTailAlpha_n}) = 1;
case 'UpperTailAlphaPAT'
needed(depend{UpperTailAlphaPAT_n}) = 1;
case 'UpperTailBeta'
needed(depend{UpperTailBeta_n}) = 1;
case 'Yield'
needed(depend{Yield_n}) = 1;
case 'YieldErr'
needed(depend{YieldErr_n}) = 1;
otherwise
disp(desc)
error('invalid descriptor')
end
end
% resolve dependencies
oldNeeded = zeros(VAR_NUMBER, 1);
% while any new requests added
while any(needed - oldNeeded)
oldNeeded = needed;
for i = 1 : VAR_NUMBER
% if we need i'th variable
if needed(i)
% also request all variables, on which i depends
needed(depend{i}) = 1;
end
end
end
% extract and calculate the actual values
if needed(Centroid_n)
Centroid = pstab(:,1);
end
if needed(CentroidErr_n)
CentroidErr = pstab(:,2);
end
if needed(EnergyPAT_n)
EnergyPAT = pstab(:,3);
end
if needed(EnergyErr_n)
EnergyErr = pstab(:,4);
end
if needed(FWHM_ChPAT_n)
FWHM_ChPAT = pstab(:,5);
end
if needed(FWHMPAT_n)
FWHMPAT = pstab(:,6);
end
if needed(FWHMErr_n)
FWHMErr = pstab(:,7);
end
if needed(StepRatioPAT_n)
StepRatioPAT = pstab(:,8);
end
if needed(StepRatioErr_n)
StepRatioErr = pstab(:,9);
end
if needed(ManualTail_n)
ManualTail = pstab(:,10);
end
if needed(TailErr_n)
TailErr = pstab(:,11);
end
if needed(NetArea_n)
NetArea = pstab(:,12);
end
if needed(AreaErrorPAT_n)
AreaErrorPAT = pstab(:,13);
end
if needed(MeanBackCount_n)
MeanBackCount = pstab(:,14);
end
if needed(Sensitivity_n)
Sensitivity = pstab(:,15);
end
if needed(SignificancePAT_n)
SignificancePAT = pstab(:,16);
end
if needed(SignificanceErr_n)
SignificanceErr = pstab(:,17);
end
if needed(MultipletPAT_n)
MultipletPAT = pstab(:,18);
end
if needed(EfficiencyPAT_n)
EfficiencyPAT = pstab(:,19);
end
if needed(EfficiencyErrPAT_n)
EfficiencyErrPAT = pstab(:,20);
end
if needed(BWWidthPAT_n)
BWWidthPAT = pstab(:,21);
end
if needed(BWWidthErr_n)
BWWidthErr = pstab(:,22);
end
if needed(EmissionRatePAT_n)
EmissionRatePAT = pstab(:,23);
end
if needed(EmissionRateErr_n)
EmissionRateErr = pstab(:,24);
end
if needed(CCFPAT_n)
CCFPAT = pstab(:,25);
end
if needed(CCFErrPAT_n)
CCFErrPAT = pstab(:,26);
end
if needed(LineEnergy_n)
LineEnergy = pstab(:,27);
end
if needed(LineEnergyErr_n)
LineEnergyErr = pstab(:, 28);
end
if needed(Yield_n)
Yield = pstab(:, 29);
end
if needed(YieldErr_n)
YieldErr = pstab(:, 30);
end
if needed(ReferenceID_n)
ReferenceID = pstab(:, 31);
end
if needed(LC_n)
LC = pstab(:, 34);
end
if needed(LD_n)
LD = pstab(:, 35);
end
if any(needed([SignedResidual_n, UnsignedResidual_n]))
% updated only when requested
ResidualUpToDate = pstab(:, 38);
if any(ResidualUpToDate ~= 1)
[SignedResidual, UnsignedResidual] = patBaseVar(sn, 'all', patName, 1);
else
% variables are up to date
if needed(SignedResidual_n)
SignedResidual = pstab(:, 36);
end
if needed(UnsignedResidual_n)
UnsignedResidual = pstab(:, 37);
end
end
end
if needed(SumPeakArea_n)
SumPeakArea = pstab(:, 39);
end
if needed(SumPeakAreaErrP_n)
SumPeakAreaErrP = pstab(:, 40);
end
if needed(BackgroundArea_n)
BackgroundArea = pstab(:, 41);
end
if needed(RefEfficiencyErrPAT_n)
RefEfficiencyErrPAT = pstab(:, 42);
end
if needed(RecoilBeta_n)
RecoilBeta = pstab(:, 46);
end
if needed(RecoilDeltaE_n)
RecoilDeltaE = pstab(:, 47);
end
if needed(Source_n)
Source = flags(:, 1);
end
if needed(FitFlags_n)
% old: FitFlags = flags(:, 6 : 17);
FitFlags = flags(:, [8, 9, 12, 13, 16, 17]);
end
if needed(NetAreaFlag_n)
NetAreaFlag = flags(:, 12);
end
if needed(Spurious_n)
Spurious = flags(:, 26);
end
if needed(Reviewed_n)
Reviewed = flags(:, 27);
end
if needed(TailChanged_n)
TailChanged = flags(:, 28);
end
if needed(ResChanged_n)
ResChanged = flags(:, 29);
end
if needed(NuclideSoft_n)
NuclideSoft = nuclist(:, 1);
for i = 1 : NPeaks
if ~isstr(NuclideSoft{i})
NuclideSoft{i} = '';
end
end
end
if needed(NuclideHard_n)
NuclideHard = nuclist(:, 2);
for i = 1 : NPeaks
if ~isstr(NuclideHard{i})
NuclideHard{i} = '';
end
end
end
if any(needed([NuclideInternal_n, PeakIdentified_n]))
[PeakIdentified, NuclideInternal] = libInternalName(NuclideHard);
end
if needed(RefPointer_n)
[unuc, i, j] = unique(NuclideInternal);
refptr = repmat(NaN, size(unuc));
for k = 1 : length(unuc);
if isempty(unuc{k})
% skip
elseif isfield(nucIdxStruc, unuc{k})
refptr(k) = nucIdxStruc.(unuc{k}).ReferenceID;
else
% skip
end
end
RefPointer = refptr(j);
end
if needed(Nuclide_n)
Nuclide = NuclideHard;
for i = 1 : NPeaks
if isempty(NuclideHard{i})
Nuclide{i} = NuclideSoft{i};
end
end
end
if needed(Energy_n)
Energy = EnergyPAT;
bool = isnan(Energy);
if any(bool)
Energy(bool) = calValuesByName(sn, 'Energy', calNames{1}, Centroid(bool));
end
end
if needed(dE_n)
dE = calDerivativeByName(sn, 'Energy', calNames{1}, Centroid);
end
if needed(Res_n)
Res = calValuesByName(sn, 'Resolution', calNames{2}, Energy);
end
if needed(Res_Ch_n)
Res_Ch=Res./dE;
end
if needed(FWHM_Ch_n)
FWHM_Ch = FWHM_ChPAT;
bool = isnan(FWHM_Ch);
if any(bool)
FWHM_Ch(bool) = Res_Ch(bool);
end
end
if needed(FWHM_n)
FWHM = FWHMPAT;
bool = isnan(FWHM);
if any(bool)
FWHM(bool) = FWHM_Ch(bool).*dE(bool);
end
end
if needed(SigmaCh_n)
SigmaCh = FWHM_Ch/sqrt(8*log(2));
end
if needed(Sigma_n)
Sigma = FWHM/sqrt(8*log(2));
end
if needed(Efficiency_n)
Efficiency = EfficiencyPAT;
bool = isnan(Efficiency);
if any(bool)
Efficiency(bool) = calValuesByName(sn, 'Efficiency', calNames{3}, ...
Energy(bool));
end
end
if needed(EfficiencyErr_n)
EfficiencyErr = EfficiencyErrPAT;
bool = isnan(EfficiencyErr);
if any(bool)
[s, msg, p, perr] = calGetPATPara(sn, 'Efficiency', patName);
if s
% relative error in percent
EfficiencyErr(bool) = 100 * calErrorEval(Energy(bool), p, perr);
end
end
end
if needed(Tail_n)
Tail = ManualTail;
bool = isnan(Tail);
if any(bool)
Tail(bool) = calValuesByName(sn, 'Tail', calNames{5}, Energy(bool));
end
end
if needed(TailAlphaPAT_n)
TailAlphaPAT = pstab(:, 43);
end
if needed(TailAlpha_n)
TailAlpha = TailAlphaPAT;
bool = isnan(TailAlpha);
if any(bool)
TailAlpha(bool) = calValuesByName(sn, 'Tail_alpha', calNames{6}, ...
Energy(bool));
end
end
if needed(UpperTailPAT_n)
UpperTailPAT = pstab(:, 44);
end
if needed(UpperTail_n)
UpperTail = UpperTailPAT;
bool = isnan(UpperTail);
if any(bool)
UpperTail(bool) = calValuesByName(sn, 'Tail_right', calNames{7}, ...
Energy(bool));
end
end
if needed(UpperTailAlphaPAT_n)
UpperTailAlphaPAT = pstab(:, 45);
end
if needed(UpperTailAlpha_n)
UpperTailAlpha = UpperTailAlphaPAT;
bool = isnan(UpperTailAlpha);
if any(bool)
UpperTailAlpha(bool) = calValuesByName(sn, 'Tail_right_alpha', ...
calNames{8}, Energy(bool));
end
end
if needed(UpperTailBeta_n)
bool = (UpperTail > 0 & UpperTailAlpha == 1);
SigmaCh = FWHM_Ch/sqrt(8*log(2));
Beta = 1 ./ (UpperTail(bool) .* SigmaCh(bool));
UpperTailBeta = repmat(NaN, size(dE));
UpperTailBeta(bool) = Beta./dE(bool);
end
if needed(StepRatio_n)
StepRatio = StepRatioPAT;
bool = isnan(StepRatio);
if any(bool)
StepRatio(bool) = calValuesByName(sn, 'Step_ratio', calNames{9}, ...
Energy(bool));
end
end
if needed(Step_n)
Step = NetArea .* StepRatio;
end
if needed(StepErr_n)
StepErr = NetArea .* StepRatioErr;
end
if needed(Significance_n)
Significance = lCalcSignificance(SignificancePAT, NetArea, LC);
% Do not report significance for neutron lumps
Significance(Source == 'G') = NaN;
end
if needed(AreaError_n)
AreaError = lCalcAreaError(AreaErrorPAT, NetArea, BackgroundArea, LC);
end
if needed(AreaErrorP_n)
AreaErrorP = 100 * AreaError ./ max(NetArea, LC);
end
% use original multiplet flag, where they are finite
if needed(Multiplet_n)
Multiplet = MultipletPAT;
bool = isnan(Multiplet);
if any(bool)
% where the PAT entry is NaN, set calculated flag; for calculation,
% all peaks are needed !!
tmpMultiplet = peakFindMultiplets(Centroid, NetArea, FWHM_Ch, 2);
Multiplet(bool) = tmpMultiplet(bool);
end
end
if needed(MultipletStr_n)
MultipletStr=cell(size(Multiplet));
MultipletStr(find(Multiplet==0))={'.'};
MultipletStr(find(Multiplet==1))={'M'};
MultipletStr(find(Multiplet~=0&Multiplet~=1))={'U'};
end
if needed(LineDeviation_n)
LineDeviation = LineEnergy-Energy;
end
if needed(SignificanceFlag_n)
SignificanceFlag=sigflag(Significance);
end
if needed(Index_n)
Index = [1 : NPeaks]';
end
if needed(TailFlag_n)
% flag manual tails with 'T', others with '.'
dot = '.';
TailFlag = dot(ones(size(ManualTail)));
TailFlag(isfinite(ManualTail)) = 'T';
end
if needed(FWHMIsFitted_n)
FWHMFlag = FitFlags(:, 5);
FWHMIsFitted = (FWHMFlag == 'Q' | FWHMFlag == 'F');
end
if needed(FWHMFitted_n)
FWHMFitted = FWHM;
if ~all(FWHMIsFitted)
FWHMFitted(~FWHMIsFitted) = NaN;
end
end
if needed(BWWidth_n)
BWWidth = BWWidthPAT;
bool = isnan(BWWidth);
if any(bool)
BWWidth(bool) = 0;
end
end
if needed(BWWidthChan_n)
BWWidthChan = BWWidth ./ dE;
end
if needed(EmissionRate_n)
EmissionRate = EmissionRatePAT;
bool = isnan(EmissionRate);
tLive = dminfo(sn, 'AcquisitionLive');
if any(bool)
EmissionRate(bool) = NetArea ./ (tLive*Efficiency);
end
end
if needed(CCF_n)
CCF = CCFPAT;
bool = isnan(CCF);
if any(bool)
CCF(bool) = 1;
end
end
if needed(CCFErr_n)
CCFErr = CCFErrPAT;
bool = find(~isfinite(CCFErr));
if any(bool)
CCFErr(bool) = 10 * abs(CCF(bool) - 1);
end
end
if needed(CountsPerSecond_n)
lt = dminfo(sn, 'AcquisitionLive');
if lt > 0
CountsPerSecond = NetArea/lt;
else
CountsPerSecond = repmat(NaN, size(NetArea));
end
end
if needed(appERate_n)
appERate = CountsPerSecond ./ Efficiency;
end
if needed(NetAreaFree_n);
% net area not calculated or background
NetAreaFree = logical(NetAreaFlag ~= 'C' & Source ~= 'B' & Source ~= 'G');
end
if needed(ReferencePN_n)
ReferencePN = resolveDependency(ReferenceID, RefPointer);
end
if needed(BranchingRatio_n)
[unuc, i, j] = unique(NuclideInternal);
bratio = repmat(NaN, size(unuc));
for k = 1 : length(unuc);
if isempty(unuc{k})
% skip
elseif isfinite(ReferencePN(i(k)))
onuc = NuclideInternal{ReferencePN(i(k))};
if strcmp(unuc{k}, onuc)
bratio(k) = 1;
else
[s,t] = libBranchEquilib(sn, unuc{k}, onuc);
if s
bratio(k) = t;
else
% backwards compability
if isfield(nucIdxStruc, unuc{k})
bratio(k) = nucIdxStruc.(unuc{k}).BranchingRatio;
end
end
end
else
% skip
end
end
BranchingRatio = bratio(j);
end
if needed(NetAreaCalculated_n)
NetAreaCalculated = calcNetArea(ReferencePN, NetArea, ...
BranchingRatio, Yield, Efficiency, CCF);
end
if needed(RefEfficiencyErr_n)
RefEfficiencyErr = lCalcRefEfficiencyErr(RefEfficiencyErrPAT, ...
EfficiencyErr, ReferencePN);
end
if needed(NetAreaCalcError_n)
NetAreaCalcError = lCalcNetAreaCalcError(ReferencePN, AreaErrorP, ...
YieldErr, RefEfficiencyErr, CCFErr);
end
if needed(NetAreaMin_n)
NetAreaMin = max(max(NetArea, LC), 1);
end
if needed(NACalcMin_n)
NACalcMin = calcNetArea(ReferencePN, NetAreaMin, ...
BranchingRatio, Yield, Efficiency, CCF);
end
if needed(NetAreaCalcUTest_n)
NetAreaCalcUTest = abs(NetAreaCalculated - NetArea) ./ ...
sqrt((NACalcMin .* NetAreaCalcError/100) .^ 2 + AreaError.^2);
end
if needed(PeakShare_n)
myNACalc = NetAreaCalculated;
bool = isnan(myNACalc);
if any(bool)
myNACalc(bool) = SumPeakArea(bool);
end
PeakShare = 100 * myNACalc ./ NetArea;
end
if any(needed([ HalfLife_n, HalfLifeStr_n, ...
EffectiveHalflife_n, EffectiveHalflifeStr_n]))
[unuc, i, j] = unique(NuclideInternal);
[hl, hlunc, hle] = libHalfLife('Full', unuc);
HalfLife = hl(j);
HalfLifeError = hle(j);
if needed(HalfLifeStr_n)
hlstr = repmat({''}, size(unuc));
for k = 1 : length(hl)
if isfinite(hl(k))
hlstr{k} = halfLifeStr(hl(k));
end
end
HalfLifeStr = hlstr(j);
end
if any(needed([ EffectiveHalflife_n, EffectiveHalflifeStr_n]))
lookup = getEquilibData(sn, 'EffectiveHalflifes');
for k = 1 : length(hl)
if isfield(lookup, unuc{k})
hl(k) = lookup.(unuc{k});
hle(k) = NaN;
end
end
EffectiveHalflife = hl(j);
EffectiveHalflifeError = hle(j);
if needed(EffectiveHalflifeStr_n)
hlstr = repmat({''}, size(unuc));
for k = 1 : length(hl)
if isfinite(hl(k))
hlstr{k} = halfLifeStr(hl(k));
end
end
EffectiveHalflifeStr = hlstr(j);
end
end
end
if needed(DecayCorrection_n)
% decay correction just for acquisition
t_real = dminfo(sn, 'AcquisitionReal')/(24*3600);
f_real = log(2)*t_real ./ HalfLife;
DecayCorrection = (1 - exp(-f_real)) ./ f_real;
end
if needed(Activity_n)
t_live = dminfo(sn, 'AcquisitionLive');
Activity = CCF .* NetArea ./ ( ...
Efficiency .* (Yield/100) .* DecayCorrection * t_live);
end
if needed(RecoilBetaChan_n)
RecoilBetaChan = RecoilBeta .* dE;
end
if needed(RecoilDeltaChan_n)
RecoilDeltaChan = RecoilDeltaE ./ dE;
end
for i=1:length(varargin)
try
varargout{i}=eval(varargin{i},'error(''foobar'')');
catch
logWrite('Descriptor [%s] not properly assigned', varargin{i});
varargout{i} = repmat(NaN, [NPeaks, 1]);
end
end
}