#ifndef BASEINIT #define BASEINIT #endif // BASEINIT #include "GammaAnalyAlgLib.h" #include #include "fitfunc.h" #include 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(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[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(x.size()); } else { y = y % w; } int n = p0.size()-1; // Construct 'weighted' Vandermonde matrix. mat V = zeros(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 }