15 printf(
"In myEcalShowerPlus::myEcalShowerPlus\n");
24 printf(
"In myEcalShowerPlus::~myEcalShowerPlus\n");
33 if (ilay>17) printf(
"EdepUpToLayer(%d): ECAL has only 18 layers (0-17)...\n", ilay);
35 float _EdepUpToLayer=0;
37 for (
int ii=0; ii<=ilay; ii++) {
38 _EdepUpToLayer+=Elayer[ii];
41 return _EdepUpToLayer;
45 return EdepUpToLayer((islay*2)+1);
50 printf(
"In myEcalShowerPlus::Clear\n");
55 fill_n(Elayer, 18, 0.);
56 fill_n(Elayer_corr, 18, 0.);
58 fill_n(Energy3C, 3, 0.);
62 fill_n(EcalAxis_chi2_2, 18, -99.);
63 fill_n(EcalAxis_chi2_8, 18, -99.);
74 BDTChi2_v2 = -9999999;
78 ESEv3Efficiency = -9999999;
79 ESEv3Rejection = -9999999;
86 printf(
"In myEcalShowerPlus::init\n");
98 if (TMVAClassifier==0) {
99 if (EnergyFlag==0)
return BDT;
100 else if (EnergyFlag==1)
return BDTE;
102 else if (TMVAClassifier==1) {
103 if (EnergyFlag==0)
return BDTs;
104 else if (EnergyFlag==1)
return BDTEs;
107 else if (iBDTVERSION==4) {
108 if (TMVAClassifier==0 && EnergyFlag==0)
return BDT_v4;
111 printf(
"BDT(%u, %d, %d) not stored, sorry...\n", iBDTVERSION, TMVAClassifier, EnergyFlag);
119 if (iBDTVERSION==3) {
120 if (TMVAClassifier==0) {
121 if (EnergyFlag==0)
return BDTChi2;
122 else if (EnergyFlag==1)
return BDTChi2E;
124 else if (TMVAClassifier==1) {
125 if (EnergyFlag==0)
return BDTChi2s;
126 else if (EnergyFlag==1)
return BDTChi2Es;
129 else if (iBDTVERSION==2) {
130 if (TMVAClassifier==0 && EnergyFlag==0)
return BDTChi2_v2;
133 printf(
"BDTCHI2(%u, %d, %d) not stored, sorry...\n", iBDTVERSION, TMVAClassifier, EnergyFlag);
138 static std::map<short int, ecalhit>::iterator it;
139 short int ittp = ComputeIndex(Cell, Plane);
140 it = _ecalhitmap.find(ittp);
141 if (it!=_ecalhitmap.end())
return (
float)(it->second.ADC[component]);
146 static std::map<short int, ecalhit>::iterator it;
147 short int ittp = ComputeIndex(Cell, Plane);
148 it = _ecalhitmap.find(ittp);
149 if (it!=_ecalhitmap.end())
return (
float)(it->second.Edep);
154 static std::map<short int, ecalhit>::iterator it;
155 short int ittp = ComputeIndex(Cell, Plane);
156 it = _ecalhitmap.find(ittp);
157 if (it!=_ecalhitmap.end())
return (
unsigned int)(it->second.Status);
162 void myEcalShowerPlus::sync()
164 exportCell( edep, EDEP );
165 exportCell( adc_highgain, ADC_HIGHGAIN );
166 exportCell( adc_lowgain, ADC_LOWGAIN );
167 exportCell( adc_dynodeC, ADC_DYNODE );
168 exportPMTADCDynode( adc_dynode );
169 exportCellStatus( cell_status );
187 case EDEP:
for(
int i=0; i<18; ++i)
for(
int j=0; j<72; ++j) cell_arr[i][j] = GetEcalHitEdep(j, i);
break;
188 case ADC_HIGHGAIN:
for(
int i=0; i<18; ++i)
for(
int j=0; j<72; ++j) cell_arr[i][j] = GetEcalHitADC(j, i, 0);
break;
189 case ADC_LOWGAIN:
for(
int i=0; i<18; ++i)
for(
int j=0; j<72; ++j) cell_arr[i][j] = GetEcalHitADC(j, i, 1);
break;
190 case ADC_DYNODE:
for(
int i=0; i<18; ++i)
for(
int j=0; j<72; ++j) cell_arr[i][j] = GetEcalHitADC(j, i, 2);
break;
195 for(
int i=0; i<9; ++i)
for(
int j=0; j<36; ++j) pmt_dy[i][j] = GetEcalHitADC(j*2, i*2, 2);
199 for(
int i=0; i<18; ++i)
for(
int j=0; j<72; ++j) cell_st[i][j] = GetEcalHitStatus(j, i);
208 const unsigned int nLAYERs = 18;
209 const unsigned int nCELLs = 72;
210 const Float_t ecalZEntry = -142.792;
211 const Float_t ecalZExit = -158.457;
212 const Float_t EneDepThreshold = 2.;
214 float MapEneDep[nLAYERs][nCELLs];
215 float ClusterEnergy[nLAYERs];
216 float LayerEneDep[nLAYERs];
218 float LayerEnergy = 0.;
223 float ClusterEnergyXY[2];
225 float LayerMean[nLAYERs];
226 float LayerSigma[nLAYERs];
227 float LayerEneFrac[nLAYERs];
228 float LayerS1S3[nLAYERs];
229 float LayerS3Frac[nLAYERs];
231 float ShowerMean = 0.;
232 float ShowerSigma = 0.;
236 float R3cmFrac = Energy3C[0];
237 float ShowerFootprintX = 0.;
238 float ShowerFootprintY = 0.;
239 float NEcalHits = 0.;
241 float ShowerMeanXY[2];
247 float F2SLEneDep = 0.;
250 for (
unsigned int iproj = 0; iproj < 2; ++iproj) {
251 EneDepXY[iproj] = 0.;
252 ClusterEnergyXY[iproj] = 0.;
253 ShowerMeanXY[iproj] = 0.;
255 sigmaXYZ[iproj] = 0.;
259 for (
unsigned int ilayer = 0; ilayer < nLAYERs; ++ilayer) {
260 ClusterEnergy[ilayer] = 0.;
261 LayerEneDep[ilayer] = 0.;
262 LayerEneFrac[ilayer] = 0.;
264 LayerMean[ilayer] = 0.;
265 LayerSigma[ilayer] = 0.;
267 LayerS1S3[ilayer] = 1.;
268 LayerS3Frac[ilayer] = 1.;
270 for (
unsigned int icell = 0; icell < nCELLs; ++icell)
271 MapEneDep[ilayer][icell] = 0.;
276 std::map<short int, ecalhit>::iterator it;
277 for (it=_ecalhitmap.begin(); it!=_ecalhitmap.end(); ++it) {
279 short int index = it->first;
280 ClusterEnergy[GetPlane(index)] += hit.
Edep;
281 MapEneDep[GetPlane(index)][GetCell(index)] = hit.
Edep;
285 for (
unsigned int ilayer = 0; ilayer < nLAYERs; ++ilayer)
287 if (ClusterEnergy[ilayer] == 0.)
continue;
289 UChar_t proj = !((ilayer/2) % 2);
291 ClusterEnergyXY[proj] += ClusterEnergy[ilayer];
292 LayerEnergy += ClusterEnergy[ilayer];
294 ShowerMean += (ilayer + 1)*ClusterEnergy[ilayer];
297 float maxcellene = 0.;
299 for (
unsigned int icell = 0; icell < nCELLs; ++icell)
301 if (MapEneDep[ilayer][icell] <= EneDepThreshold )
continue;
303 LayerEneDep[ilayer] += MapEneDep[ilayer][icell];
307 if (MapEneDep[ilayer][icell] >= maxcellene)
309 maxcellene = MapEneDep[ilayer][icell];
313 LayerMean[ilayer] += (icell + 1)*MapEneDep[ilayer][icell];
314 ShowerMeanXY[proj] += (icell + 1)*MapEneDep[ilayer][icell];
320 float LatLeak[10]={0.};
325 while(MapEneDep[ilayer][imaxcell+iLatLeak]>0.&&iLatLeak<10)
327 LatLeak[iLatLeak-1] = MapEneDep[ilayer][imaxcell+iLatLeak];
336 float LatRatio = MapEneDep[ilayer][imaxcell-1]/MapEneDep[ilayer][imaxcell+1] ;
338 while(MapEneDep[ilayer][imaxcell+iLatLeak]>0.&&iLatLeak<10)
340 if ((
int)imaxcell-iLatLeak < 0) LatLeak[iLatLeak-imaxcell-1] = LatRatio*MapEneDep[ilayer][imaxcell+iLatLeak];
348 while(MapEneDep[ilayer][imaxcell-iLatLeak]>0.&&iLatLeak<10)
350 LatLeak[iLatLeak-1] = MapEneDep[ilayer][imaxcell-iLatLeak];
356 else if (imaxcell>62)
359 float LatRatio = MapEneDep[ilayer][imaxcell+1]/MapEneDep[ilayer][imaxcell-1] ;
361 while(MapEneDep[ilayer][imaxcell-iLatLeak]>0.&&iLatLeak<10)
363 if ((
int)imaxcell-iLatLeak < 0) LatLeak[iLatLeak-imaxcell-1] = LatRatio*MapEneDep[ilayer][imaxcell-iLatLeak];
368 for(
int i=0;i<10;i++) LayerEneDep[ilayer] += LatLeak[i];
372 EneDep += LayerEneDep[ilayer];
373 EneDepXY[proj] += LayerEneDep[ilayer];
375 float S1 = MapEneDep[ilayer][imaxcell];
377 if (imaxcell==0 || imaxcell==71) S3 += LatLeak[0];
378 if (imaxcell > 0) S3 += MapEneDep[ilayer][imaxcell - 1];
379 if (imaxcell < (
int)(nCELLs - 1)) S3 += MapEneDep[ilayer][imaxcell + 1];
381 if (!proj) S3totx += S3;
384 if (S1*S3 > 0.) LayerS1S3[ilayer] = S1/S3;
386 if (LayerEneDep[ilayer] > 0.)
388 LayerS3Frac[ilayer] = S3/LayerEneDep[ilayer];
389 LayerMean[ilayer] = LayerMean[ilayer]/LayerEneDep[ilayer];
393 LayerMean[ilayer] = -1.;
397 if (EneDep <= 0. || LayerEnergy <= 0. || EneDepXY[0] <= 0. || EneDepXY[1] <= 0.)
return -0.999;
399 ShowerMeanXY[0] /= EneDepXY[0];
400 ShowerMeanXY[1] /= EneDepXY[1];
401 ShowerMean /= LayerEnergy;
403 F2SLEneDep = (LayerEneDep[0] + LayerEneDep[1] + LayerEneDep[2] + LayerEneDep[3])/1000.;
404 L2LFrac = (LayerEneDep[16] + LayerEneDep[17])/EneDep;
406 S3totx /= EneDepXY[0];
407 S3toty /= EneDepXY[1];
409 for (
unsigned int ilayer = 0; ilayer < nLAYERs; ++ilayer)
411 if (ClusterEnergy[ilayer] == 0.)
continue;
413 UChar_t proj = !((ilayer/2) % 2);
415 LayerEneFrac[ilayer] = LayerEneDep[ilayer]/EneDep;
417 ShowerSigma += TMath::Power(ilayer + 1 - ShowerMean, 2)*ClusterEnergy[ilayer];
419 for (
unsigned int icell = 0; icell < nCELLs; ++icell)
421 if (MapEneDep[ilayer][icell] <= EneDepThreshold)
continue;
423 LayerSigma[ilayer] += TMath::Power(icell + 1 - LayerMean[ilayer], 2)*MapEneDep[ilayer][icell];
425 sigmaXY[proj] += TMath::Power(icell + 1 - ShowerMeanXY[proj], 2)*MapEneDep[ilayer][icell];
426 sigmaXYZ[proj] += (icell + 1 - ShowerMeanXY[proj])*(ilayer + 1 - ShowerMean)*MapEneDep[ilayer][icell];
427 sigmaZ[proj] += TMath::Power(ilayer + 1 - ShowerMean, 2)*MapEneDep[ilayer][icell];
430 if (LayerEneDep[ilayer] > 0.)
431 LayerSigma[ilayer] = TMath::Sqrt(LayerSigma[ilayer]/LayerEneDep[ilayer]);
432 else LayerSigma[ilayer] = -1.;
435 ShowerSigma = TMath::Sqrt(ShowerSigma/LayerEnergy);
436 ShowerMean = ShowerMean - 1.;
438 for (
unsigned int iproj = 0; iproj < 2; ++iproj)
440 sigmaXY[iproj] /= EneDepXY[iproj];
441 sigmaXYZ[iproj] /= EneDepXY[iproj];
442 sigmaZ[iproj] /= EneDepXY[iproj];
445 ShowerFootprintX = TMath::Sqrt(TMath::Abs(sigmaXY[0]*sigmaZ[0] - TMath::Power(sigmaXYZ[0], 2)));
446 ShowerFootprintY = TMath::Sqrt(TMath::Abs(sigmaXY[1]*sigmaZ[1] - TMath::Power(sigmaXYZ[1], 2)));
459 myEcalShowerPlusFiller::myEcalShowerPlusFiller(){
461 printf(
"In myEcalShowerPlusFiller::myEcalShowerPlusFiller\n");
468 myEcalShowerPlusFiller::~myEcalShowerPlusFiller(){
470 printf(
"In myEcalShowerPlusFiller::~myEcalShowerPlusFiller\n");
477 void myEcalShowerPlusFiller::Clear(Option_t* option){
479 printf(
"In myEcalShowerPlusFiller::Clear\n");
487 void myEcalShowerPlusFiller::init(){
489 printf(
"In myEcalShowerPlusFiller::init\n");
496 void myEcalShowerPlusFiller::Fill(EcalShowerR* _shower,
bool kShort){
498 printf(
"In myEcalShowerPlusFiller::Fill\n");
504 AMSEventR *evt= AMSEventR::Head();
510 copy_n(shower->Elayer_corr, 18, Elayer_corr);
515 for(
int i=0;i<(int)(evt->NEcalHit());i++){
516 if(evt->pEcalHit(i)->Edep!=evt->pEcalHit(i)->Edep)
517 evt->pEcalHit(i)->Edep=0;
523 copy_n(shower->Energy3C, 3, Energy3C);
529 BDT = shower->GetEcalBDT(5, 0, 0);
530 BDTs = shower->GetEcalBDT(5, 1, 0);
531 BDTE = shower->GetEcalBDT(5, 0, 1);
532 BDTEs = shower->GetEcalBDT(5, 1, 1);
534 BDT_v4 = shower->GetEcalBDT(4);
541 static EcalAxis ecalaxis;
549 ecalaxis.process(shower,8);
550 for(
int ilayer=0; ilayer<18; ilayer++) EcalAxis_chi2_8[ilayer] = ecalaxis.ecalchi2->get_chi2(ilayer,0);
556 BDTChi2 = shower->GetEcalBDTCHI2(3, 0, 0);
557 BDTChi2s = shower->GetEcalBDTCHI2(3, 1, 0);
558 BDTChi2E = shower->GetEcalBDTCHI2(3, 0, 1);
559 BDTChi2Es = shower->GetEcalBDTCHI2(3, 1, 1);
567 ecalaxis.process(shower,2);
568 for(
int ilayer=0; ilayer<18; ilayer++) EcalAxis_chi2_2[ilayer] = ecalaxis.ecalchi2->get_chi2(ilayer,0);
574 BDTChi2_v2 = shower->GetEcalBDTCHI2(2);
580 ESEV2 = shower->EcalStandaloneEstimatorV2();
581 ESEV3 = shower->EcalStandaloneEstimatorV3();
582 ESEv3Efficiency = shower->GetESEv3Efficiency();
583 ESEv3Rejection = shower->GetESEv3Rejection();
629 for(
int i2dcl=0; i2dcl<shower->NEcal2DCluster(); i2dcl++) {
630 Ecal2DClusterR *ecal2dcl = shower->pEcal2DCluster(i2dcl);
632 for(
int i1dcl=0; i1dcl<ecal2dcl->NEcalCluster(); i1dcl++) {
633 EcalClusterR *ecal1dcl = ecal2dcl->pEcalCluster(i1dcl);
635 if( ecal1dcl->Plane >= 0 and ecal1dcl->Plane < 18 )
636 Elayer[ecal1dcl->Plane] += ecal1dcl->Edep;
637 for(
int ihit=0; ihit<ecal1dcl->NEcalHit(); ihit++){
638 EcalHitR *hit = ecal1dcl->pEcalHit(ihit);
644 if ((hit->Status & 32) && hit->ADC[0] > 4) {
668 BDT = shower->GetEcalBDT(5, 0, 0);
678 void myEcalShowerPlusFiller::AddResults(EcalHitR* hit) {
682 adct.
Edep = hit->Edep;
683 adct.
Status = hit->Status;
685 std::copy(hit->ADC, hit->ADC+3, adct.
ADC);
686 _ecalhitmap.insert(std::pair<short int, ecalhit>(ComputeIndex(hit->Cell, hit->Plane), adct));
692 #endif //#ifdef _WITHGBATCH_