EnergySpectrumAnalyer/src/DataCalcProcess
2026-05-07 10:23:23 +08:00
..
armadillo
AdaptiveSimpsonIntegrate.h Merge branch 'dev' of http://git.hivekion.com:3000/xuhai_cpp/EnergySpectrumAnalyer into dev_xuh 2026-04-21 10:04:35 +08:00
CoincidenceSpectrumProcess.cpp 添加测量设备参数管理交互实现 2026-05-07 10:23:23 +08:00
CoincidenceSpectrumProcess.h
DataCalcProcess.pri 添加测量设备参数管理交互实现 2026-05-07 10:23:23 +08:00
DataCalcProcess.pro
EnergyEfficiencyFit.cpp
EnergyEfficiencyFit.h
FindPeaksBySvd.cpp 新增弹框选择拟合参数,修改bug 2026-04-20 18:02:41 +08:00
FindPeaksBySvd.h
GaussPolyCoe.cpp
GaussPolyCoe.h
main.cpp
MathModelDefine.cpp
MathModelDefine.h
NolinearLeastSquaresCurveFit.cpp
NolinearLeastSquaresCurveFit.h
Poly2FindPeaks.cpp
Poly2FindPeaks.h
README.txt
SimpleFindPeaks.h
SnipRemoveBackground.cpp
SnipRemoveBackground.h
TestCase.cpp
TestCase.h

This file contains ambiguous Unicode characters

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

1、寻峰
在寻峰前先进行sinp去除本底处理再寻峰
使用SnipRemoveBackground::Snip去除本底处理,
有能量刻度和分辨率刻度参数时示例参考TestCase中的TestSnipRemoveBackground1。
没有能量刻度和分辨率刻度参数时示例参考TestCase中的TestSnipRemoveBackground2。
使用SnipRemoveBackground::Snip得到谱本底数据用谱数据减去本底数据为为寻峰谱数据。
使用FindPeaksBySvd寻峰
// 峰值结构体,存储峰值特征
typedef struct {
    int left = 0.0f;        // 峰所在数据区域的左边位置
    int width = 0.0f;       // 峰所在数据区域的宽度
    double height = 0.0f;   // 峰所在数据区域的高度
    int pos = 0.0f;         // 峰所在位置
} PeakInfo;
成员函数FindPeaks进行寻峰入参const arma::vec spec_data是数据的y值。
示例参考TestCase中的TestFindPeaksBySvd。

2、高斯多项式拟合
使用GaussPolyCoe多项式拟合
适用于能量刻度,一次拟合和二次拟合,同时支持三次拟合;
在下式中:
x为通道地址道数y为刻度能量
一次拟合: GaussPolyCoe::PolynomialFit(x, y, 1);
二次拟合: GaussPolyCoe::PolynomialFit(x, y, 2);
拟合结果返回系数 [a0, a1, ..., an] 表示 y = a0 + a1*x + ... + an*x^n;
根据拟合结果返回的参数带入相应的数学模型中可将道地址道数转为能量(如下):
一次拟合后转换函数MathModelDefine中的一次函数LinearFunction(x为道址结果为能量)
二次拟合后转换函数MathModelDefine中的一次函数QuadraticPolynomial(x为道址结果为能量)
示例参考TestCase中的TestGaussPolyCoe。

3、分辨率/半高宽拟合
使用NolinearLeastSquaresCurveFit::Lsqcurvefit
初始猜测系数使用如下参数:
vec p0 = { 1.0, 1.0 }; // 初始猜测a≈1, b≈1
在下式中x为能量y为半高宽FWHM
NolinearLeastSquaresCurveFit::Lsqcurvefit(FwhmModel, x, y, p0);
拟合结果返回系数[k, c]
示例参考TestCase中的TestLsqcurvefit_FwhmModel。

4、光子峰模型
使用NolinearLeastSquaresCurveFit::Lsqcurvefit
初始猜测系数使用如下函数计算:
EstimatePhotonPeakModelInitialParams(x, y);
还可使用客户提供的初始参数:待定
在下式中x为峰数据区域能量数据y为粒子计数
NolinearLeastSquaresCurveFit::Lsqcurvefit(PhotonPeakModel, x, y, p0);
拟合结果返回系数[A, delt, H, W, C, P]其中参数意义如下:
A为峰高P为峰位delt*2.355为半高宽FWHM
示例参考TestCase中的TestLsqcurvefit_PhotonPeakModel。

5、粒子数据符合
使用ConformitySpectrum::EventFilter符合事件筛选处理;
在下式中raw_spec_data为原始粒子谱数据conformity_event_time_win符合时间窗默认50ns
ConformitySpectrum::EventFilter(raw_spec_data, conformity_event_time_win)
示例参考TestCase中的TestConformitySpectrumEventFilter。

6、效率刻度
使用EnergyEfficiencyFit::SemiEmpiricalFit
在下式中E 能量数据keVeps 效率数据(需>0拟合结果系数coeff为a0~...a_order
vec coeff = EnergyEfficiencyFit::SemiEmpiricalFit(E, eps, order);
拟合结果返回系数[a0, a1, a2, ...]对应:
ln(ε) = a0 + a1*lnE + a2*(lnE)^2 + a3*(lnE)^3 + ... + ai*(lnE)^i
示例参考TestCase中的TestEnergyEfficiencyFit。
在实际使用时注意数据要求一次拟合需至少2个标准源数据点二次拟合需至少3个标准源数据点数据点数必须大于多项式阶数
数据点越多拟合越稳定效率值需通过实验计算ε=N/(A*P*t)即确保准确性N为净峰计数A为活度P为分支比t为测量时间

7、2-9次能谱符合处理
CoincidenceSpectrum::F2t9Order::ProcessCoincidence
示例参考TestCase中的TesCoincidenceSpectrumF2t9Order。

8、峰面积积分计算
AdaptiveSimpsonIntegrate::integrate
示例参考TestCase中的TestAdaptiveSimpsonIntegrate
将光子峰拟合结果返回系数[A, delt, H, W, C, P]灌入AdaptiveSimpsonIntegrate::integrate参入
积分范围下限是P - 3 * delt上限是P + 3 * delt;