fix: 修改自建台站能谱 算法中求面积的业务逻辑;解决修改能量刻度更新之后分析之后能量不对的问题

This commit is contained in:
xiaoguangbin 2025-02-11 11:48:53 +08:00
parent 6d74757be3
commit 42f94fbe76
3 changed files with 58 additions and 32 deletions

View File

@ -272,7 +272,6 @@ public class Sample_C_Analysis {
finalReportPath.append(spectrumPathProperties.getRootPath());
// finalReportPath.append(File.separator);
finalReportPath.append(spectrumPathProperties.getSaveFilePath());
finalReportPath.append(File.separator);
finalReportPath.append(spectrumPathProperties.getArrPath());
finalReportPath.append(File.separator);
finalReportPath.append(this.spectrumFileRelativePath);

View File

@ -863,37 +863,58 @@ public class SelfBaseUtil extends AbstractLogOrReport {
}
// 没有峰信息 核素=未识别 不计算活度浓度
if (!nuclideParam.containsKey("area")) {
double left = 0, right = 0;
double left = 0, right = 0, energy = 0, fwhm = 0;
List<Long> counts = null;
PHDFile phd = null;
// 固定能量范围,半高宽
switch (nuclideName) {
case "Xe131M":
left = 29.7 - (0.737 * 1.25);
right = 29.7 + (0.737 * 1.25);
counts = phdFiles[0].getSpec().getCounts();
phd = phdFiles[0];
// fwhm = getFwhm(phd.getMapResoPara().get(phd.getUsedReso()),
// nuclideMap.get(nuclideName).getEnergy()) * 1.25;
// left = 29.7 - fwhm;
// right = 29.7 + fwhm;
break;
case "Xe133M":
left = 29.7 - (0.737 * 1.25);
right = 29.7 + (0.737 * 1.25);
counts = phdFiles[1].getSpec().getCounts();
phd = phdFiles[1];
// fwhm = getFwhm(phd.getMapResoPara().get(phd.getUsedReso()), nuclideMap.get(nuclideName).getEnergy());
// left = 29.7 - fwhm;
// right = 29.7 + fwhm;
break;
case "Xe133":
left = 81 - (0.781 * 1.25);
right = 81 + (0.781 * 1.25);
counts = phdFiles[2].getSpec().getCounts();
phd = phdFiles[2];
// fwhm = getFwhm(phd.getMapResoPara().get(phd.getUsedReso()), nuclideMap.get(nuclideName).getEnergy());
// left = 81 - fwhm;
// right = 81 + fwhm;
break;
case "Xe135":
left = 249.8 - (0.916 * 1.25);
right = 249.8 + (0.916 * 1.25);
counts = phdFiles[3].getSpec().getCounts();
phd = phdFiles[3];
// left = 249.8 - fwhm;
// right = 249.8 + fwhm;
break;
}
energy = nuclideMap.get(nuclideName).getEnergy();
counts = phd.getSpec().getCounts();
fwhm = getFwhm(phd.getMapResoPara().get(phd.getUsedReso()), energy) * 1.25;
// 能量转化为道址
// 能量转化道址公式参数
List<Double> userEnerParaP = phd.getUsedEnerPara().getP();
// 使用gamma公式将能量转换为道址
List<Double> energyList = Lists.newLinkedList();
energyList.add(energy - fwhm);
CalValuesOut etc = CalValuesHandler.energyToChannel(energyList, userEnerParaP);
long lc = Math.round(etc.counts.get(0));
energyList = Lists.newLinkedList();
energyList.add(energy + fwhm);
etc = CalValuesHandler.energyToChannel(energyList, userEnerParaP);
long rc = Math.round(etc.counts.get(0));
// 通过道址将这个范围的计数求和
List<Double> gFittingPara = EnergySpectrumHandler.GetFileFittingPara(phdFiles[0].getUsedEnerKD().getG_energy(),
/*List<Double> gFittingPara = EnergySpectrumHandler.GetFileFittingPara(phdFiles[0].getUsedEnerKD().getG_energy(),
phdFiles[0].getUsedEnerKD().getCentroid_channel());
double lc = gFittingPara.get(0) + gFittingPara.get(1) * left + gFittingPara.get(2) * Math.sqrt(left);
double rc = gFittingPara.get(0) + gFittingPara.get(1) * right + gFittingPara.get(2) * Math.sqrt(right);
double rc = gFittingPara.get(0) + gFittingPara.get(1) * right + gFittingPara.get(2) * Math.sqrt(right);*/
// 面积=计数总和通过能量卡一个范围将范围内的计数加和
int area = 0;
for (int i = (int)lc; i <= (int) rc; i++) {
@ -918,31 +939,23 @@ public class SelfBaseUtil extends AbstractLogOrReport {
public static double getBetaAnalyseBaseLineCount(PHDFile phd, String nuclideName, Double energy) {
double baseLineCount = 0;
// 得到baseline count范围
double fwhm = 0;
List<Double> vBase = phd.getVBase();
// fwhm公式参数
ParameterInfo m_curParam = phd.getMapResoPara().get(phd.getUsedEner());
// 能量转化道址公式参数
List<Double> userEnerParaP = phd.getUsedEnerPara().getP();
// 公式参数
int p_size = m_curParam.getP().size()-1;
if(p_size >= 2 && m_curParam.getP().get(1) > 0 && m_curParam.getP().get(2) > 0) {
fwhm = m_curParam.getP().get(1) + energy * m_curParam.getP().get(2);
for(int i=3; i<=p_size; i++) {
fwhm += (Math.pow(energy, (i-1)) * m_curParam.getP().get(i));
}
fwhm = Math.pow(fwhm, 0.5);
}
// 计算半高宽
// fwhm公式参数
ParameterInfo m_curParam = phd.getMapResoPara().get(phd.getUsedReso());
double fwhm = getFwhm(m_curParam, energy);
// 通过energy带入到FHWM公式中将结果energy转化channel加减1.25之后取这个范围之内的baseline进行加和
List<Double> energyList = Lists.newLinkedList();
energyList.add(energy - (fwhm - Math.pow(fwhm, 1.25)));
energyList.add(energy - (fwhm * 1.25));
// 使用gamma公式将能量转换为道址
CalValuesOut energyToChannel = CalValuesHandler.energyToChannel(energyList, userEnerParaP);
long begin = Math.round(energyToChannel.counts.get(0));
Console.log("nuclide:{},energy:{},fwhmL:{},beginChannel:{}",nuclideName, energy, (fwhm - Math.pow(fwhm, 1.25)), begin);
energyList = Lists.newLinkedList();
energyList.add(energy + (fwhm + Math.pow(fwhm, 1.25)));
energyList.add(energy + (fwhm * 1.25));
energyToChannel = CalValuesHandler.energyToChannel(energyList, userEnerParaP);
long end = Math.round(energyToChannel.counts.get(0));
Console.log("nuclide:{},energy:{},fwhmR:{},endChannel:{}",nuclideName, energy, (fwhm + Math.pow(fwhm, 1.25)), end);
@ -954,6 +967,20 @@ public class SelfBaseUtil extends AbstractLogOrReport {
return baseLineCount;
}
public static Double getFwhm(ParameterInfo m_curParam, Double energy) {
Double fwhm = 0.0;
// 公式参数
int p_size = m_curParam.getP().size()-1;
if(p_size >= 2 && m_curParam.getP().get(1) > 0 && m_curParam.getP().get(2) > 0) {
fwhm = m_curParam.getP().get(1) + energy * m_curParam.getP().get(2);
for(int i=3; i<=p_size; i++) {
fwhm += (Math.pow(energy, (i-1)) * m_curParam.getP().get(i));
}
fwhm = Math.pow(fwhm, 0.5);
}
return fwhm;
}
static StringBuilder reportContent = null;
protected static EnergySpectrumStruct sampleStruct = null;
protected static EnergySpectrumStruct qcStruct = null;

View File

@ -1,8 +1,8 @@
<config>
<nuclide>
<item nuclide_name="Xe131M" energy="29.7" yield="44.362" half_life="11.934" />
<item nuclide_name="Xe133" energy="29.7" yield="38.0" half_life="5.243" />
<item nuclide_name="Xe133M" energy="81.0" yield="46.049" half_life="2.19" />
<item nuclide_name="Xe133M" energy="29.7" yield="46.049" half_life="2.19" />
<item nuclide_name="Xe133" energy="81.0" yield="38.0" half_life="5.243" />
<item nuclide_name="Xe135" energy="249.8" yield="90.0" half_life="0.380832" />
</nuclide>
</config>