1721 lines
49 KiB
C
1721 lines
49 KiB
C
|
#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
|
|||
|
}
|