AnalysisSystemForRadionucli.../ROIConUncer.cpp

144 lines
4.5 KiB
C++
Raw Normal View History

2024-06-04 15:27:02 +08:00
#include "ROIConUncer.h"
#include "ProcessAlgorithmGlobalVar.h"
#include <QtMath>
double CRoiConUncer::CalcCorrect(SPara& _input,double _Xe)
{
double rData;
rData = (1-qExp(-_Xe*_input.s_coll_interval_time))* \
qExp(-_Xe*_input.s_pre_time)* \
(1-qExp(-_Xe*_input.s_acquisition_real_time));
return rData;
}
bool CRoiConUncer::CalcConc(SPara& _input,double _Xe,double& _output)
{
double rData=0.0;
if(CalcCorrect(_input,_Xe)==0.0||global::cst_d_xe_air==0.0||_input.s_volume_of_Xe/global::cst_d_xe_air==0.0)
{
return false;
}
else
{
rData = 1000*_Xe*_Xe/CalcCorrect(_input,_Xe)*(_input.s_coll_interval_time/(_input.s_volume_of_Xe/global::cst_d_xe_air));
}
_output = rData;
return true;
}
bool CRoiConUncer::CalcRoiConUncer(ConUncerI& _input,ConUncerO& _output)
{
bool bRet = false;
Factor factor; //系数处理
double dData;
bRet = CalcConc(_input.SPara, global::cst_d_decay_135xeg_lam,dData);
if(!bRet)
{
return false;
}
factor.calcFactor.append(dData);
bRet = CalcConc(_input.SPara, global::cst_d_decay_133xeg_lam,dData);
if(!bRet)
{
return false;
}
factor.calcFactor.append(dData);
factor.calcFactor.append(dData);
bRet = CalcConc(_input.SPara, global::cst_d_decay_131xem_lam,dData);
if(!bRet)
{
return false;
}
factor.calcFactor.append(dData);
bRet = CalcConc(_input.SPara, global::cst_d_decay_133xem_lam,dData);
if(!bRet)
{
return false;
}
factor.calcFactor.append(dData);
bRet = CalcConc(_input.SPara, global::cst_d_decay_133xeg_lam,dData);
if(!bRet)
{
return false;
}
factor.calcFactor.append(dData);
factor.bgbrFactor.append(global::cst_d_br_135xeg);
factor.bgbrFactor.append(global::cst_d_br_133xe_80);
factor.bgbrFactor.append(global::cst_d_br_133xe_30);
factor.bgbrFactor.append(global::cst_d_br_131xem_30);
factor.bgbrFactor.append(global::cst_d_br_133xem_30);
factor.bgbrFactor.append(global::cst_d_br_133xe_30);
//通过系数和输入值计算输出值
bRet = CalcRoiConUncerByFactor(_input._netCts,_input.s_bg_efficiency,factor,_output);
if(!bRet)
{
return false;
}
return true;
}
bool CRoiConUncer::CalcRoiConUncerByFactor(QVector<double>& _netCts,QVector<double>& _s_ROI_number_eff,Factor& _factor,ConUncerO& _output)
{
QVector<double> con_uncer(4,0); //浓度和不确定度 前两组置零
QVector<double> con_counts(2,0); //不确定度系数
double dCalcFactor=0.0;
double dbgbrFactor=0.0;
const int netCtsGroupNmber = 3; //净计数一组三个数据
QVector<double>::size_type qdNetctsPos=6;
QVector<double>::size_type qdBgeffsPos=0;
const int con_uncer_grpnm = 10;
const int pos_net_cts_vari = 1;
//提取数据
for(int pos=0;pos<con_uncer_grpnm;pos++)
{
//提取系数,最后的系数保持不变 一直使用
if(pos<_factor.bgbrFactor.size())
{
dbgbrFactor = _factor.bgbrFactor[pos];
}
if(pos<_factor.calcFactor.size())
{
dCalcFactor = _factor.calcFactor[pos];
}
if(_netCts.size()<=qdNetctsPos+pos_net_cts_vari||_s_ROI_number_eff.size()<=qdBgeffsPos)
{
break;
}
double dataDCTmep=0.0;
double dataCTmep=0.0;
if(qdNetctsPos+pos_net_cts_vari<_netCts.size()&&qdBgeffsPos<_s_ROI_number_eff.size())
{
double divsion = 0.0;
divsion = (_s_ROI_number_eff[qdBgeffsPos]*dbgbrFactor);
if(divsion == 0)
{
return false;
}
dataCTmep = (_netCts[qdNetctsPos]/divsion)*dCalcFactor;
divsion = _netCts[qdNetctsPos];
if(divsion == 0 || _netCts[qdNetctsPos+pos_net_cts_vari]<0)
{
return false;
}
dataDCTmep = dataCTmep*qSqrt(_netCts[qdNetctsPos+pos_net_cts_vari])/divsion;
con_uncer.append(dataCTmep); //浓度
con_uncer.append(dataDCTmep);//不确定度
divsion = dataCTmep;
if(divsion == 0)
{
return false;
}
con_counts.append(_netCts[qdNetctsPos]/dataCTmep);//不确定度系数
qdNetctsPos+=netCtsGroupNmber;
qdBgeffsPos++;
}
else
{
return false;
}
}
_output.ROI_con_uncer = con_uncer;
_output.ROI_con_counts_factor = con_counts;
return true;
}