00001 //---------------------------------------------------------------------------// 00012 // 00013 #include "Trigger/EmcESum.h" 00014 #include "Trigger/TrigPara.h" 00015 #include "CLHEP/Units/PhysicalConstants.h" 00016 #include "CLHEP/Random/RandGauss.h" 00017 #include <iostream> 00018 00019 #include "Trigger/IBesGlobalTrigSvc.h" 00020 #include "Trigger/BesGlobalTrigSvc.h" 00021 #include "GaudiKernel/ISvcLocator.h" 00022 #include "GaudiKernel/Bootstrap.h" 00023 #include "GaudiKernel/IDataProviderSvc.h" 00024 00025 using namespace std; 00026 using namespace TrigConf; 00027 using namespace CLHEP; 00028 00029 EmcESum::EmcESum() 00030 { 00031 m_EmcTCFinder = EmcTCFinder::get_Emc(); 00032 } 00033 EmcESum::~EmcESum() 00034 { 00035 } 00036 void EmcESum::getESum() 00037 { 00038 //reset values 00039 _TotE = 0; 00040 _RTotE = 0; 00041 _LTotE = 0; 00042 _BTotE = 0; 00043 _ETotE = 0; 00044 _LBTotE = 0; 00045 _RBTotE = 0; 00046 _WETotE = 0; 00047 _EETotE = 0; 00048 /* 00049 double L1TC_GATE = double (m_pIBGT->getL1TC_GATE()); 00050 00051 for(int i=0;i<12;i++) BLK[i] = 0; 00052 for(int i = 0; i < 2; i++) { WEBLK[i] = 0; EEBLK[i] = 0; } 00054 //Get total energy ,energy of right part and left part divided by z=0.The energy threshold of each trigger cell is 30*MeV. 00055 for(int i=0;i<TrigConf::TCTHETANO_B;i++) 00056 for(int j=0;j<TrigConf::TCPHINO_B;j++) 00057 { 00058 double BEnergy = m_EmcTCFinder->getBTC_ADC(i,j); 00059 00060 //set each barrel trigger cell energy to service 00061 m_pIBGT->setBTCEnergy(i,j,BEnergy); 00062 00063 int blkId = m_EmcTCFinder->getBLKId(i,j); 00064 //low energy threshold of trigger cell 00065 if(m_EmcTCFinder->getBTCEnergy(i,j) < L1TC_GATE) BEnergy = 0.; 00066 00067 BLK[blkId] +=BEnergy;//Get each block energy for babar trigger 00068 } 00069 00070 for(int i =0;i<TrigConf::TCTHETANO_E;i++) 00071 for(int j =0;j<TrigConf::TCPHINO_E;j++) 00072 { 00073 double EEnergy = m_EmcTCFinder->getEETC_ADC(i,j); 00074 //set each barrel trigger cell energy to service 00075 m_pIBGT->setEETCEnergy(i,j,EEnergy); 00076 //low energy threshold of trigger cell 00077 if(m_EmcTCFinder->getEETCEnergy(i,j) < L1TC_GATE) EEnergy = 0.; 00078 00079 if(j >= 0 && j < TrigConf::TCPHINO_E/2) EEBLK[0] += EEnergy; // north energy block 00080 else EEBLK[1] += EEnergy; // south energy block 00081 00082 double WEnergy = m_EmcTCFinder->getWETC_ADC(i,j); 00083 //set each barrel trigger cell energy to service 00084 m_pIBGT->setWETCEnergy(i,j,WEnergy); 00085 //low energy threshold of trigger cell 00086 if(m_EmcTCFinder->getWETCEnergy(i,j) < L1TC_GATE) WEnergy = 0.; 00087 00088 if(j >= 0 && j < TrigConf::TCPHINO_E/2) WEBLK[0] += WEnergy; // north energy block 00089 else WEBLK[1] += WEnergy; 00090 } 00091 00092 std::vector<double> BlockE; 00093 BlockE.clear(); 00094 00095 double bmean[12] = {8.02,10.1,12.3,7.43,14.8,13.0,12.5,13.2,10.9,12.3,14.7,15.7}; 00096 double bsigma[12] = {0.88,0.52,0.9,0.72,0.7,0.82,0.64,0.78,0.72,0.76,0.54,0.64}; 00097 double bratio[12] = {3.28,3.15,3.01,3.12,3.09,3.22,2.90,2.89,2.97,3.00,3.02,3.15};//run10584 00098 00099 for(int i = 0; i < 12; i++) { 00100 //double block_E = (BLK[i]/bratio[i] - 0xa + RandGauss::shoot(bmean[i],bsigma[i]))*m_pIBGT->getEnergy_Ratio(); //mv convert to adc 00101 double block_E = (BLK[i] - 0xa); //mv convert to adc 00102 if(block_E < 0) block_E = 0; 00103 _TotE += block_E; //Total energy of emc including barrel and endcaps 00104 _BTotE += block_E;//Total energy of barrel emc 00105 00106 if(i >= 6) 00107 { 00108 _LTotE += block_E;//Total energy of left part emc(left barrel and west endcap) 00109 _LBTotE += block_E;//Total energy of left part emc (only barrel) 00110 } 00111 else 00112 { 00113 _RTotE += block_E;//Total energy of right part emc(right barrel and east endcap) 00114 _RBTotE += block_E;//Total energy of right part emc (only barrel) 00115 } 00116 //BlockE.push_back(block_E); 00117 BlockE.push_back(BLK[i]); 00118 } 00119 00120 double emean[2] = {11.8,12.4}; 00121 double esigma[2] = {0.77,0.43}; 00122 double eratio[2] = {3.19,3.19}; 00123 00124 double wmean[2] = {19.9,8.89}; 00125 double wsigma[2] = {0.63,0.51}; 00126 double wratio[2] = {3.19,3.19}; 00127 00128 for(int i = 0; i < 2; i++) { 00129 //double wblock_E = (WEBLK[i]/wratio[i] - 0xa + RandGauss::shoot(wmean[i],wsigma[i]))*m_pIBGT->getEnergy_Ratio(); 00130 double wblock_E = (WEBLK[i] - 0xa); 00131 //double wblock_E = WEBLK[i]*0.51 - 14.4 - 0xa + RandGauss::shoot(wmean[i],wsigma[i]); 00132 double eblock_E = (EEBLK[i] - 0xa); 00133 //double eblock_E = (EEBLK[i]/eratio[i] - 0xa + RandGauss::shoot(emean[i],esigma[i]))*m_pIBGT->getEnergy_Ratio(); 00134 //double eblock_E = EEBLK[i]*0.51 - 14.4 - 0xa + RandGauss::shoot(emean[i],esigma[i]); 00135 if(wblock_E < 0) wblock_E = 0; 00136 if(eblock_E < 0) eblock_E = 0; 00137 00138 _TotE += eblock_E;//Total energy of emc including barrel and endcaps 00139 _RTotE += eblock_E;//Total energy of right part emc(right barrel and east endcap) 00140 _ETotE += eblock_E;//Total energy of west and east endcaps 00141 _EETotE += eblock_E;//Total energy of east endcap 00142 //_EETotE += EEBLK[i];//Total energy of east endcap 00143 00144 _TotE += wblock_E;//Total energy of emc including barrel and endcaps 00145 _LTotE += wblock_E;//Total energy of left part emc(left barrel and west endcap) 00146 _ETotE += wblock_E;//Total energy of west and east endcaps 00147 _WETotE += wblock_E;//Total energy of west endcap 00148 //_WETotE += WEBLK[i];//Total energy of west endcap 00149 } 00150 */ 00151 00152 for(int i=0;i<12;i++) BLK[i] = 0; 00153 for(int i = 0; i < 2; i++) { WEBLK[i] = 0; EEBLK[i] = 0; } 00155 //Get total energy ,energy of right part and left part divided by z=0.The energy threshold of each trigger cell is 30*MeV. 00156 for(int i = 0; i < 12; i++) { 00157 BLK[i] = m_EmcTCFinder->getBLKE(i+2); 00158 } 00159 00160 for(int i = 0; i < 2; i++) { 00161 EEBLK[i] = m_EmcTCFinder->getBLKE(i); 00162 WEBLK[i] = m_EmcTCFinder->getBLKE(i+14); 00163 } 00164 00165 std::vector<double> BlockE; 00166 BlockE.clear(); 00167 00168 double bmean[12] = {8.02,10.1,12.3,7.43,14.8,13.0,12.5,13.2,10.9,12.3,14.7,15.7}; 00169 double bsigma[12] = {0.88,0.52,0.9,0.72,0.7,0.82,0.64,0.78,0.72,0.76,0.54,0.64}; 00170 00171 for(int i = 0; i < 12; i++) { 00172 double block_E = (BLK[i]*0.333 - 0xa + RandGauss::shoot(bmean[i],bsigma[i])); //mv convert to adc 00173 if(block_E < 0) block_E = 0; 00174 _TotE += block_E; //Total energy of emc including barrel and endcaps 00175 _BTotE += block_E;//Total energy of barrel emc 00176 00177 if(i >= 6) 00178 { 00179 _LTotE += block_E;//Total energy of left part emc(left barrel and west endcap) 00180 _LBTotE += block_E;//Total energy of left part emc (only barrel) 00181 } 00182 else 00183 { 00184 _RTotE += block_E;//Total energy of right part emc(right barrel and east endcap) 00185 _RBTotE += block_E;//Total energy of right part emc (only barrel) 00186 } 00187 BlockE.push_back(block_E); 00188 } 00189 00190 double emean[2] = {11.8,12.4}; 00191 double esigma[2] = {0.77,0.43}; 00192 00193 double wmean[2] = {19.9,8.89}; 00194 double wsigma[2] = {0.63,0.51}; 00195 00196 for(int i = 0; i < 2; i++) { 00197 double wblock_E = (WEBLK[i]*0.333 - 0xa + RandGauss::shoot(wmean[i],wsigma[i])); 00198 double eblock_E = (EEBLK[i]*0.333 - 0xa + RandGauss::shoot(emean[i],esigma[i])); 00199 if(wblock_E < 0) wblock_E = 0; 00200 if(eblock_E < 0) eblock_E = 0; 00201 00202 _TotE += eblock_E;//Total energy of emc including barrel and endcaps 00203 _RTotE += eblock_E;//Total energy of right part emc(right barrel and east endcap) 00204 _ETotE += eblock_E;//Total energy of west and east endcaps 00205 _EETotE += eblock_E;//Total energy of east endcap 00206 00207 _TotE += wblock_E;//Total energy of emc including barrel and endcaps 00208 _LTotE += wblock_E;//Total energy of left part emc(left barrel and west endcap) 00209 _ETotE += wblock_E;//Total energy of west and east endcaps 00210 _WETotE += wblock_E;//Total energy of west endcap 00211 } 00212 00213 ISvcLocator* svcLocator = Gaudi::svcLocator(); 00214 StatusCode sc = svcLocator->service("BesGlobalTrigSvc", m_tmpSvc); 00215 m_pIBGT = dynamic_cast<BesGlobalTrigSvc* >(m_tmpSvc); 00216 00217 //set energy information related to emc in service 00218 m_pIBGT->setEmcTotE(_TotE); 00219 m_pIBGT->setEmcLTotE(_LTotE); 00220 m_pIBGT->setEmcRTotE(_RTotE); 00221 m_pIBGT->setEmcBTotE(_BTotE); 00222 m_pIBGT->setEmcETotE(_ETotE); 00223 m_pIBGT->setEmcLBTotE(_LBTotE); 00224 m_pIBGT->setEmcRBTotE(_RBTotE); 00225 m_pIBGT->setEmcWETotE(_WETotE); 00226 m_pIBGT->setEmcEETotE(_EETotE); 00227 m_pIBGT->setEmcBlockE(BlockE); 00228 }