#ifndef GAMMAANALYALGLIB_H #define GAMMAANALYALGLIB_H #include #include #include "RadionuclideMessage.h" #include #if defined(GAMMAANALYALG_LIBRARY) #define GAMMAANALYALGSHARED_EXPORT Q_DECL_EXPORT #else #define GAMMAANALYALGSHARED_EXPORT Q_DECL_IMPORT #endif //#ifdef Q_OS_WIN // #define gNaN (_nan()) //#else #define gNaN (qQNaN()) //#endif #ifdef Q_OS_WIN #define LINE_END QLatin1String("\r\n") #else #define LINE_END QLatin1String("\n") #endif // QC 检查项的名称,与配置文件 SystemManager.xml 对应 #define QC_COL_TIME QLatin1String("col_time") #define QC_ACQ_TIME QLatin1String("acq_time") #define QC_DECAY_TIME QLatin1String("decay_time") #define QC_SAMP_VOL QLatin1String("samp_vol") #define QC_AIR_FLOW QLatin1String("airFlow") #define QC_Be7_FWHM QLatin1String("Be7-FWHM") #define QC_Ba140_MDC QLatin1String("Ba140-MDC") #define QC_Xe133_MDC QLatin1String("Xe133-MDC") #define NUCL_IDENT_VALUE1 0.8 // 核素识别中核素被认证标准值1 sum_found/sum_total>0.8 直接被认证 #define NUCL_IDENT_VALUE2 0.5 // 核素识别中核素被认证标准值2 0.5 stdvec; typedef std::vector< std::vector > stdvec2; enum AnalyseState { AS_Null, AS_CalibFitted, AS_PeakSearched, AS_BaseImproved, AS_NetAreaFitted }; enum PeakInsertMethod { Ins_Manual, Ins_H0Test, Ins_MultFit, Ins_SumPeakModel }; enum PeakIndex { i_Centroid = 0, i_CentroidErr,//无效 i_Energy, i_EnergyErr,//无效 i_FWHM_Ch, i_FWHM, // = 5 i_FWHMErr,//无效 i_StepRatioErr,//无效 i_StepRatio, i_Tail, i_TailErr, // = 10 无效 i_NetArea, i_AreaError, i_MeanBackCount, i_Sensitivity, i_Significance, // = 15 i_SignificanceErr,//无效 i_Multiplet, i_Efficiency, i_EfficiencyErr, i_BWWidth, // = 20 i_BWWidthErr,//无效 i_EmissionRate, i_EmissionRateErr,//无效 i_CCF, i_CCFErr, // = 25 i_LineEnergy, i_LineEnergyErr,//无效 i_Yield, i_YieldErr, i_ReferenceID, // = 30 i_RefPointer, i_BranchingRatio, i_LC, i_LD, i_SignedResidual, // = 35 i_UnsignedResidual, i_ResidualUpToDate, i_SumPeakArea, i_SumPeakAreaErr,//无效 i_BackgroundArea, // = 40 i_RefEfficiencyErr, i_TailAlpha, i_UpperTail, i_UpperTailAlpha, i_RecoilBeta, // = 45 i_RecoilDeltaE // = 46 }; enum SpecBaseIdx { s_Spectrum = 0, // 0: channel contents s_BaseLine, // 1: fitted baseline s_AnalysisRange, // 2: Analysis Range (first and last valid channel) s_AnalysisRangeSave, // 3: Save Analysis range, i.e. if empty will be [1,NCh] s_XControl, // 4: baseline control points x-data s_YControl, // 5: baseline control points y-data s_YSlope, // 6: slope at breakpoints, NaN at normal control points s_Residual, // 7: residual (Spectrum-BaseLine-Peaks) s_Stripped, // 8: stripped spectrum (gaussian peaks substracted) s_Steps, // 9: non-spline baseline components s_ROISmooth, // 10: stripped spectrum minus Steps, with smoothened ROIs s_SmoothStripped, // 11: smoothened stripped spectrum s_Approximation, // 12: spectrum approximation (baseline + peaks) s_ChiSquare, // 13: mean weighted residual and number of channels with zero counts ( [ChiSquare, nzero] ) s_ArtXControl, // 14: artificial baseline control points x-data s_ArtYControl, // 15: artificial baseline control points y-data s_ArtYSlope, // 16: slope of artificial baseline control points s_ArtificialBase, // 17: Artificial baseline (if not empty) s_BaseFittingWeights, // 18: Weight function used in baseline fitting s_PSS, // 19: value of peak search sensitivity in each channel s_FwhmcAll, s_Energy, s_Lc, s_Scac }; enum PeakSearchType { search_full, search_residual }; enum CalibrationType { Cal_Energy = 0, Cal_Resolution, Cal_Efficiency, Cal_Tot_efficiency, Cal_Tail = 4, Cal_Tail_alpha = 5, Cal_Tail_right = 6, Cal_Tail_right_alpha = 7, Cal_Step_ratio = 8, Cal_HalflifeAnalysis = 9, Cal_Default }; struct NuclideLines { QStringList fullNames; // 核素全名 stdvec vEnergy; // 核素的所有γ射线能量 stdvec vUncertE; stdvec vYield; // 核素γ射线分支比 stdvec vUncertY; double halflife;// 单位:秒 int key_flag; // 记录主射线下标 int maxYeildIdx; NuclideLines() { maxYeildIdx = -1; key_flag = -1; halflife = 0; } ~NuclideLines() { fullNames.clear(); vEnergy.clear(); vUncertE.clear(); vYield.clear(); vUncertY.clear(); } }; struct QcCheckItem { QString standard; double value; bool bPass; QcCheckItem() { bPass = false; value = 0; } }; struct NuclideActMda { bool bCalculateMDA; int calculateIdx; int key_flag; // 第 key_flag 条射线是主射线,从 0 开始编号, key_flag < 0 表示无主射线 double halflife; double activity; double act_err; double mda; double mdc; double efficiency; double effi_err; double concentration; QStringList fullNames; stdvec vEnergy; // 匹配的γ射线能量 stdvec vUncertE; stdvec vYield; // 匹配的γ射线分支比 stdvec vUncertY; QVector vPeakIdx; // 匹配的峰序号, 从 1 开始 NuclideActMda() { bCalculateMDA = false; calculateIdx = -1; key_flag = -1; halflife = 0; activity = 0; act_err = 0; mda = 0; mdc = 0; efficiency = 0; effi_err = 0; concentration = 0; } ~NuclideActMda() { fullNames.clear(); vEnergy.clear(); vUncertE.clear(); vYield.clear(); vUncertY.clear(); vPeakIdx.clear(); } }; struct BaseCtrlStack { stdvec cx; stdvec cy; stdvec cdy; ~BaseCtrlStack() { cx.clear(); cy.clear(); cdy.clear(); } }; struct BaseControls { bool ReplotUsed; bool ReplotNeeded; int rg_low; //分析范围的最小值 int rg_high; //分析范围的最大值 stdvec XCtrl; stdvec YCtrl; stdvec YSlope; stdvec Baseline; stdvec StepCounts; QVector BaseStack; //stdvec SlopeHandle; BaseControls() { rg_low = 1; rg_high = qInf(); ReplotUsed = false; ReplotNeeded = false; } ~BaseControls() { XCtrl.clear(); YCtrl.clear(); YSlope.clear(); Baseline.clear(); StepCounts.clear(); BaseStack.clear(); } }; struct SpecSetup { /*int SChan; // Begin Channel int EChan; // End Channel int Sensity; // Peak Searching Sensitivity int Level; // Uncertainty Confidence Level int EDS; // EDS pretreatment int PDA; // Peak Detection Algorithm int Method; // peak area compute method int Iter; // Iterations float Width; // Energy Window Width QString MDAType; // MDA Type QString date; // Activity Reference Time QString time; // Activity Reference Time*/ //QString CalibrationLinesFile; double ECutAnalysis_Low; double ECutAnalysis_High; double EnergyTolerance; double CalibrationPSS_high; double CalibrationPSS_low; double BaseImprovePSS; double PSS_low; double k_back; double k_alpha; double k_beta; double RiskLevelK; bool bUpdateCal; bool KeepCalPeakSearchPeaks; QDateTime refTime_act; //活度参考时间,默认是AcqStartTime QDateTime refTime_conc; //默认是CollectStartTime SpecSetup() { //ECutAnalysis_Low = 35;//SystemType = "P" ECutAnalysis_Low = 12.0; //SystemType = "G" ECutAnalysis_High = qInf(); EnergyTolerance = 0.5; CalibrationPSS_high = 10.0; CalibrationPSS_low = 5.0; BaseImprovePSS = 10.0; PSS_low = 2.7; k_back = 1.25; k_alpha = 2.576; k_beta = 1.645; RiskLevelK = 4.264890; bUpdateCal = false; //SystemType = "G" //bUpdateCal = true;//SystemType = "P" KeepCalPeakSearchPeaks = false; //CalibrationLinesFile = "/setup/ene_cal_update.txt"; } }; struct PeakInfo { int index; //峰序号 int multiIndex; //重峰序号 int left; //峰的左边界 int right; //峰的右边界 double peakCentroid; //峰拟合后加权峰中心道 double energy; double fwhmc; //半高宽 double fwhm; //以keV为单位的半高宽 double area; //净面积 double areaErr; // double efficiency; double lc; double ld; double meanBackCount; double backgroundArea; double significance; double sensitivity; double stepRatio; double tail; double tailAlpha; double upperTail; double upperTailAlpha; double BWWidthChan; double recoilBetaChan; double recoilDeltaChan; QString comments; QStringList nuclides; /*int num_peaks; //重峰个数 int no_peaks; //重峰中的序号 double Peaklocation;//加权峰中心道(matlab算法得到) double fwhmc_temp;//峰的半高宽估计值 double p[5]; double v[8];//v[6] i0; v[3] l; v[4] h; v[7] w; v[5] H0 double baseline_left;//峰的左端基线值(计数) double baseline_right;//峰的右端基线值(计数) double area_base;//基底面积 double detectability;//峰可探测度 double PeakAreaErr; double unCern; int isFit; //拟合标识 int PeakLeft;//峰左边界(matlab算法得到) int PeakRight;//峰右边界(matlab算法得到) int peakChannel;//峰的道数 PeakCoeff coeff;*/ }; struct ParameterInfo { stdvec p; stdvec perr; ~ParameterInfo() { p.clear(); perr.clear(); } }; class PHDFile { public: PHDFile() { bAnalyed = false; isValid = true; filename = ""; filepath = ""; totalCmt = ""; id_sample = ""; id_analysis = ""; status = ""; category = ""; process.sample_volume_of_Xe = -1; sampleBlock.dimension_1 = 0; sampleBlock.dimension_2 = 0; newEner = CalPHD; newReso = CalPHD; newEffi = CalPHD; newTotE = CalPHD; stdvec t_vec(4, 0.0); t_vec[0] = 99; para_tail.p = t_vec; stdvec t_vec2(2, 98.0); t_vec2[1] = 1; para_tailAlpha.p = t_vec2; para_tailRightAlpha.p = t_vec2; t_vec2[1] = 0.35; para_tailRight.p = t_vec2; t_vec2[1] = 0; para_stepRatio.p = t_vec2; } ~PHDFile() { vPeak.clear(); vEnergy.clear(); vBase.clear(); vLc.clear(); vScac.clear(); mapEnerKD.clear(); mapResoKD.clear(); mapEffiKD.clear(); mapTotEKD.clear(); mapEnerPara.clear(); mapResoPara.clear(); mapEffiPara.clear(); mapTotEPara.clear(); QcItems.clear(); mapNucActMda.clear(); } bool isValid; // 是否有效谱 bool bAnalyed; // 记录是否被分析 QString analy_start_time; QString filename; // 谱文件名称 QString filepath; // 谱文件路径 QString log_path; QString report_path; QString baseline_path; QString lc_path; QString scac_path; QString totalCmt; // 谱文件总注释 QString oriTotalCmt;// 原始谱总注释 SpecSetup usedSetting; // 当前使用的分析设置 SpecSetup setting; // 新修改的分析设置 // 分析结果 std::vector vPeak; stdvec vEnergy; stdvec vBase; stdvec vLc; stdvec vScac; //stdvec vFwhm; //stdvec vFwhmc; BaseControls baseCtrls; // 当前修改的刻度名称 QString newEner; QString newReso; QString newEffi; QString newTotE; // 当前寻峰结果所用的刻度名称 QString usedEner; QString usedReso; QString usedEffi; QString usedTotE; // 当前寻峰结果所用的刻度数据 G_EnergyBlock usedEnerKD; G_ResolutionBlock usedResoKD; G_EfficiencyBlock usedEffiKD; TotaleffBlock usedTotEKD; // 存储所有的刻度数据 QMap mapEnerKD; // 能量刻度 QMap mapResoKD; // 分辨率刻度 QMap mapEffiKD; // 效率刻度 QMap nMapEffiKD; // 效率刻度 QMap mapTotEKD; // 总效率刻度 //bate刻度数据 QMap mapbgEffiKD; // 效率刻度 QMap nMapbgEffiKD; // 效率刻度 // 当前寻峰结果所用的刻度参数 ParameterInfo usedEnerPara; ParameterInfo usedResoPara; ParameterInfo usedEffiPara; ParameterInfo usedTotEPara; // 存储所有的刻度参数 QMap mapEnerPara; QMap mapResoPara; QMap mapEffiPara; QMap mapTotEPara; // 其他参数,目前存储的是默认值 ParameterInfo para_stepRatio; ParameterInfo para_tail; ParameterInfo para_tailAlpha; ParameterInfo para_tailRight; ParameterInfo para_tailRightAlpha; //自衰减 BSelfAttenuationBlock bSelfAttenuation; // 谱基本信息 QString id_sample; QString id_analysis; QString status; QString category; HeaderBlock header; MessageInfo msgInfo; G_SpectrumBlock Spec; AcquisitionBlock acq; CollectionBlock collect; ProcessingBlock process; CalibrationBlock calibration; SampleBlock sampleBlock; CertificateBlock certificate; // QC Check QMap QcItems; // 核素活度浓度 QMap mapNucActMda; }; #endif // GAMMAANALYALGLIB_H