#include "MDC.h" #include #include double CMdc::CalcSqrt(QVector& _data,QVector::size_type _pos) { double rData=0.0; if(_pos < _data.size()) { rData = _data[_pos]*_data[_pos]; } return rData; } double CMdc::CalcLD(QVector& _data,QVector::size_type _pos) { double rData=0.0; if(_pos < _data.size()) { rData = _data[_pos]+LD(_data[_pos]); } return rData; } bool CMdc::MDC(MDCI& _input,global::XeType& _input_Xetype,MDCO& _output) { bool bRet=false; bRet = LC(_input,_input_Xetype,_output.lcPara); if(!bRet) { return false; } bRet = MDCFromLC(_input,_input_Xetype,_output); return bRet; } bool CMdc::MDCFromLC(MDCI& _input,global::XeType _input_Xetype,MDCO& _output) { const int cts_grpnum = 3; //净计数 3数1组 // const int pos_cts = 0; //净计数偏移 // const int pos_vari = 1; //误差偏移 const int pos_0_vari = 2; //0信号误差偏移 const int factor_grpnum = 1; //感兴趣区浓度计算系数 const int min_cts = 10*cts_grpnum+pos_0_vari; const int min_factor = 10*factor_grpnum; //净计数数组大小判断 if(min_cts>=_input.ROI_netcts.size()) { return false; } //感兴趣区浓度计算系数 if(min_factor>=_input.ROI_con_counts_factor.size()) { return false; } //除数为零判断 if(_input.ROI_con_counts_factor[2*factor_grpnum]==0.0 || \ _input.ROI_con_counts_factor[3*factor_grpnum]==0.0 || \ _input.ROI_con_counts_factor[5*factor_grpnum]==0.0 || \ _input.ROI_con_counts_factor[6*factor_grpnum]==0.0 || \ _input.ROI_netcts[3*cts_grpnum+pos_0_vari]==0.0 || \ _input.ROI_netcts[7*cts_grpnum+pos_0_vari]==0.0 || \ _input.ROI_netcts[8*cts_grpnum+pos_0_vari]==0.0 || \ _input.ROI_netcts[9*cts_grpnum+pos_0_vari]==0.0 || \ _input.ROI_netcts[10*cts_grpnum+pos_0_vari]==0.0) { return false; } //Use ROIs 2 _output.mdcPara.MDC_Xe135 = _output.lcPara.LC_Xe135+global::cst_k*qSqrt(\ CalcLD(_input.ROI_netcts,2*cts_grpnum+pos_0_vari)/CalcSqrt(_input.ROI_con_counts_factor,2*factor_grpnum)\ ); if(qIsNaN(_output.mdcPara.MDC_Xe135)) { return false; } //Use ROIs 5 _output.mdcPara.MDC_Xe131m = _output.lcPara.LC_Xe131m+global::cst_k*qSqrt(\ CalcLD(_input.ROI_netcts,5*cts_grpnum+pos_0_vari)/CalcSqrt(_input.ROI_con_counts_factor,5*factor_grpnum)\ ); //Use ROIs 6 _output.mdcPara.MDC_Xe133m = _output.lcPara.LC_Xe133m+global::cst_k*qSqrt(\ CalcLD(_input.ROI_netcts,6*cts_grpnum+pos_0_vari)/CalcSqrt(_input.ROI_con_counts_factor,6*factor_grpnum)\ ); if(qIsNaN(_output.mdcPara.MDC_Xe133m)) { return false; } switch ( _input_Xetype) { case global::none: { //Use ROIs 3 4 double temp = (CalcSqrt(_input.ROI_con_counts_factor,3*factor_grpnum)*CalcLD(_input.ROI_netcts,4*cts_grpnum+pos_0_vari)+\ CalcSqrt(_input.ROI_con_counts_factor,4*factor_grpnum)*CalcLD(_input.ROI_netcts,3*cts_grpnum+pos_0_vari)); if(temp == 0.0) { return false; } _output.mdcPara.MDC_Xe133 = _output.lcPara.LC_Xe133+ global::cst_k*qSqrt(\ (CalcLD(_input.ROI_netcts,3*cts_grpnum+pos_0_vari)* CalcLD(_input.ROI_netcts,4*cts_grpnum+pos_0_vari))/ \ temp\ ); if(qIsNaN(_output.mdcPara.MDC_Xe133)) { return false; } } break; case global::_131m: { //Use ROIs 3 7 9 //Roi 3 double VD3 = CalcLD(_input.ROI_netcts,3*cts_grpnum+pos_0_vari)/CalcSqrt(_input.ROI_con_counts_factor,3*factor_grpnum); //Roi 7 9 double temp = (CalcSqrt(_input.ROI_con_counts_factor,7*factor_grpnum)*CalcLD(_input.ROI_netcts,9*cts_grpnum+pos_0_vari)+\ CalcSqrt(_input.ROI_con_counts_factor,9*factor_grpnum)*CalcLD(_input.ROI_netcts,7*cts_grpnum+pos_0_vari)); if(temp == 0.0) { return false; } double VD79 = (\ (CalcLD(_input.ROI_netcts,7*cts_grpnum+pos_0_vari)* CalcLD(_input.ROI_netcts,9*cts_grpnum+pos_0_vari))/ \ temp\ ); //Roi 3 7 9 if(0.0==VD3||0.0==VD79||0==(1/VD3+1/VD79)) { return false; } double VD379 = 1/(1/VD3+1/VD79); _output.mdcPara.MDC_Xe133 = global::cst_k/qSqrt(\ CalcSqrt(_input.ROI_con_counts_factor,3*factor_grpnum)/_input.ROI_netcts[3*cts_grpnum+pos_0_vari]+\ CalcSqrt(_input.ROI_con_counts_factor,7*factor_grpnum)/_input.ROI_netcts[7*cts_grpnum+pos_0_vari]+\ CalcSqrt(_input.ROI_con_counts_factor,9*factor_grpnum)/_input.ROI_netcts[9*cts_grpnum+pos_0_vari])+\ global::cst_k*qSqrt(VD379); if(qIsNaN(_output.mdcPara.MDC_Xe133)) { return false; } } break; case global::_133m: { //Use ROIs 3 8 10 //Roi 3 double VD3 = CalcLD(_input.ROI_netcts,3*cts_grpnum+pos_0_vari)/CalcSqrt(_input.ROI_con_counts_factor,3*factor_grpnum); //Roi 8 10 double temp = (CalcSqrt(_input.ROI_con_counts_factor,7*factor_grpnum)*CalcLD(_input.ROI_netcts,9*cts_grpnum+pos_0_vari)+\ CalcSqrt(_input.ROI_con_counts_factor,9*factor_grpnum)*CalcLD(_input.ROI_netcts,7*cts_grpnum+pos_0_vari)); if(temp == 0.0) { return false; } double VD810 =(\ (CalcLD(_input.ROI_netcts,8*cts_grpnum+pos_0_vari)* CalcLD(_input.ROI_netcts,10*cts_grpnum+pos_0_vari))/ \ temp\ ); //Roi 3 8 10 if(0.0==VD3||0.0==VD810||0==(1/VD3+1/VD810)) { return false; } double VD3810 = 1/(1/VD3+1/VD810); _output.mdcPara.MDC_Xe133 = global::cst_k/qSqrt(\ CalcSqrt(_input.ROI_con_counts_factor,3*factor_grpnum)/_input.ROI_netcts[3*cts_grpnum+pos_0_vari]+\ CalcSqrt(_input.ROI_con_counts_factor,8*factor_grpnum)/_input.ROI_netcts[8*cts_grpnum+pos_0_vari]+\ CalcSqrt(_input.ROI_con_counts_factor,10*factor_grpnum)/_input.ROI_netcts[10*cts_grpnum+pos_0_vari])+\ global::cst_k*qSqrt(VD3810); if(qIsNaN(_output.mdcPara.MDC_Xe133)) { return false; } } break; case global::both: { //Use ROIs 3 7 8 //Roi 3 double VD3 =CalcLD(_input.ROI_netcts,3*cts_grpnum+pos_0_vari)/CalcSqrt(_input.ROI_con_counts_factor,3*factor_grpnum); //Roi 8 10 //Roi 7 8 double VD78 = (\ (CalcLD(_input.ROI_netcts,7*cts_grpnum+pos_0_vari)* CalcLD(_input.ROI_netcts,8*cts_grpnum+pos_0_vari))/ \ (CalcSqrt(_input.ROI_con_counts_factor,7*factor_grpnum)*CalcLD(_input.ROI_netcts,8*cts_grpnum+pos_0_vari)+\ CalcSqrt(_input.ROI_con_counts_factor,8*factor_grpnum)*CalcLD(_input.ROI_netcts,7*cts_grpnum+pos_0_vari))\ ); //Roi 3 7 8 if(0.0==VD3||0.0==VD78||0==(1/VD3+1/VD78)) { return false; } double VD378 = 1/(1/VD3+1/VD78); _output.mdcPara.MDC_Xe133 = global::cst_k/qSqrt(\ CalcSqrt(_input.ROI_con_counts_factor,3*factor_grpnum)/_input.ROI_netcts[3*cts_grpnum+pos_0_vari]+\ CalcSqrt(_input.ROI_con_counts_factor,7*factor_grpnum)/_input.ROI_netcts[7*cts_grpnum+pos_0_vari]+\ CalcSqrt(_input.ROI_con_counts_factor,8*factor_grpnum)/_input.ROI_netcts[8*cts_grpnum+pos_0_vari])+\ global::cst_k*qSqrt(VD378); if(qIsNaN(_output.mdcPara.MDC_Xe133)) { return false; } } break; default: break; } //计算没有使用,客户需要存储数据库 for(int pos=2;pos<=10;pos++) { if((2+3*pos)<_input.ROI_netcts.size() && (pos)<_input.ROI_con_counts_factor.size()) { if((_input.ROI_con_counts_factor[pos]!=0.0) && (_input.ROI_con_counts_factor[pos]*_input.ROI_con_counts_factor[pos] != 0.0)) { double temp=global::cst_k*qSqrt(_input.ROI_netcts[2+3*pos])/_input.ROI_con_counts_factor[pos]+ global::cst_k*qSqrt((_input.ROI_netcts[2+3*pos]+LD(_input.ROI_netcts[2+3*pos]))/ (_input.ROI_con_counts_factor[pos]*_input.ROI_con_counts_factor[pos])); if(qIsNaN(temp)) { return false; } _output.mdcPara.MDC.append(temp); // double temp= global::cst_k*qSqrt(_input.ROI_netcts[2+3*pos]); // _output.mdcPara.MDC_CTS.append(temp); } } } return true; } double CMdc::LD(const double& _inputa) { return global::cst_k*global::cst_k+2*global::cst_k*qSqrt(_inputa); } bool CMdc::LC(MDCI& _input,global::XeType _input_Xetype,LCPara& _output) { const int cts_grpnum = 3; //净计数 3数1组 // const int pos_cts = 0; //净计数偏移 // const int pos_vari = 1; //误差偏移 const int pos_0_vari = 2; //0信号误差偏移 const int factor_grpnum = 1; //感兴趣区浓度计算系数 const int con_uncer_grpnum = 2; //感兴趣区浓度不平衡度 2数1组 const int pos_con = 0; //浓度偏移 // const int pos_uncer = 1; //不平衡度偏移 const int min_cts = 10*cts_grpnum+pos_0_vari; const int min_factor = 10*factor_grpnum; const int min_u = 3*con_uncer_grpnum+pos_con; //净计数数组大小判断 if(min_cts>=_input.ROI_netcts.size()) { return false; } //感兴趣区浓度计算系数 if(min_factor>=_input.ROI_con_counts_factor.size()) { return false; } //感兴趣区浓度不平衡度 if(min_u>=_input.ROI_con_uncer.size()) { return false; } //除数为零判断 if(_input.ROI_con_counts_factor[2*factor_grpnum]==0.0 ||\ _input.ROI_con_counts_factor[5*factor_grpnum]==0.0 ||\ _input.ROI_con_counts_factor[6*factor_grpnum]==0.0 ||\ _input.ROI_netcts[3*cts_grpnum+pos_0_vari]==0.0 ||\ _input.ROI_netcts[4*cts_grpnum+pos_0_vari]==0.0 ||\ _input.ROI_netcts[7*cts_grpnum+pos_0_vari]==0.0 ||\ _input.ROI_netcts[8*cts_grpnum+pos_0_vari]==0.0 ||\ _input.ROI_netcts[9*cts_grpnum+pos_0_vari]==0.0 ||\ _input.ROI_netcts[10*cts_grpnum+pos_0_vari]==0.0) { return false; } //Use ROIs 2 _output.LC_Xe135 = global::cst_k*qSqrt(_input.ROI_netcts[2*cts_grpnum+pos_0_vari])/_input.ROI_con_counts_factor[2*factor_grpnum]; if(qIsNaN( _output.LC_Xe135)) { return false; } //Use ROIs 5 _output.LC_Xe131m = global::cst_k*qSqrt(_input.ROI_netcts[5*cts_grpnum+pos_0_vari])/_input.ROI_con_counts_factor[5*factor_grpnum]; if(qIsNaN( _output.LC_Xe131m)) { return false; } //Use ROIs 6 _output.LC_Xe133m = global::cst_k*qSqrt(_input.ROI_netcts[6*cts_grpnum+pos_0_vari])/_input.ROI_con_counts_factor[6*factor_grpnum]; if(qIsNaN( _output.LC_Xe133m)) { return false; } switch (_input_Xetype) { case global::none: // Use ROIs 3 4 _output.LC_Xe133 =global::cst_k/qSqrt(\ (_input.ROI_con_counts_factor[3*factor_grpnum]*_input.ROI_con_counts_factor[3*factor_grpnum])/_input.ROI_netcts[3*cts_grpnum+pos_0_vari]+ \ ( _input.ROI_con_counts_factor[4*factor_grpnum]*_input.ROI_con_counts_factor[4*factor_grpnum])/_input.ROI_netcts[4*cts_grpnum+pos_0_vari] \ ); if(qIsNaN( _output.LC_Xe133)) { return false; } break; case global::_131m: // Use ROIs 3 7 9 _output.LC_Xe133 = global::cst_k/qSqrt(\ (_input.ROI_con_uncer[3*con_uncer_grpnum+pos_con]*_input.ROI_con_uncer[3*con_uncer_grpnum+pos_con])/_input.ROI_netcts[3*cts_grpnum+pos_0_vari]+ \ (_input.ROI_con_counts_factor[7*factor_grpnum]*_input.ROI_con_counts_factor[7*factor_grpnum])/_input.ROI_netcts[7*cts_grpnum+pos_0_vari]+ \ ( _input.ROI_con_counts_factor[9*factor_grpnum]*_input.ROI_con_counts_factor[9*factor_grpnum])/_input.ROI_netcts[9*cts_grpnum+pos_0_vari] \ ); if(qIsNaN( _output.LC_Xe133)) { return false; } break; case global::_133m: //# Use ROIs 3 8 10 _output.LC_Xe133 = global::cst_k/qSqrt(\ (_input.ROI_con_counts_factor[3*factor_grpnum]*_input.ROI_con_counts_factor[3*factor_grpnum])/_input.ROI_netcts[3*cts_grpnum+pos_0_vari]+ \ (_input.ROI_con_counts_factor[8*factor_grpnum]*_input.ROI_con_counts_factor[8*factor_grpnum])/_input.ROI_netcts[8*cts_grpnum+pos_0_vari]+ \ ( _input.ROI_con_counts_factor[10*factor_grpnum]*_input.ROI_con_counts_factor[10*factor_grpnum])/_input.ROI_netcts[10*cts_grpnum+pos_0_vari] \ ); if(qIsNaN( _output.LC_Xe133)) { return false; } break; case global::both: //# Use ROIs 3 7 8 _output.LC_Xe133 = global::cst_k/qSqrt(\ (_input.ROI_con_counts_factor[3*factor_grpnum]*_input.ROI_con_counts_factor[3*factor_grpnum])/_input.ROI_netcts[3*cts_grpnum+pos_0_vari]+ \ (_input.ROI_con_counts_factor[7*factor_grpnum]*_input.ROI_con_counts_factor[7*factor_grpnum])/_input.ROI_netcts[7*cts_grpnum+pos_0_vari]+ \ ( _input.ROI_con_counts_factor[8*factor_grpnum]*_input.ROI_con_counts_factor[8*factor_grpnum])/_input.ROI_netcts[8*cts_grpnum+pos_0_vari] \ ); if(qIsNaN( _output.LC_Xe133)) { return false; } break; default: break; } //计算没有使用,客户需要存储数据库 for(int pos=2;pos<=10;pos++) { if((2+3*pos)<_input.ROI_netcts.size() && (2*pos)<_input.ROI_con_uncer.size()) { if(_input.ROI_con_uncer[2*pos]!=0.0) { double temp = global::cst_k*qSqrt(_input.ROI_netcts[2+3*pos])/(_input.ROI_netcts[3*pos]/_input.ROI_con_uncer[2*pos]); _output.LC.append(temp); temp= global::cst_k*qSqrt(_input.ROI_netcts[2+3*pos]); if(qIsNaN(temp)) { return false; } _output.LC_CTS.append(temp); } } } return true; }