ATLAS Offline Software
Loading...
Searching...
No Matches
CaloLCDeadMaterialTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5#undef DEBUG_DMTHINGS
6#undef MAKE_MOMENTS
9
11
16#include "CxxUtils/prefetch.h"
17
19
20#include "CLHEP/Units/SystemOfUnits.h"
21
22using CLHEP::MeV;
24using namespace std::string_literals; //for suffix 's'
25
26#ifdef MAKE_MOMENTS
27void set_zero_moments(CaloCluster *theCluster);
28#endif
29
30/* ****************************************************************************
31
32**************************************************************************** */
34 const std::string& name,
35 const IInterface* parent)
36 : AthAlgTool(type,name,parent),
37 m_key("HadDMCoeff2"),
38 m_recoStatus(CaloRecoStatus::UNKNOWNSTATUS),
40 m_MinClusterEnergyToDeal(200.0*MeV),
45 m_interpolate(false),
46 m_absOpt(false)
47{
48 declareInterface<IClusterCellWeightTool>(this);
49 declareProperty("HadDMCoeffKey",m_key);
50 declareProperty("ClusterRecoStatus",m_recoStatus);
51 declareProperty("WeightModeDM",m_weightModeDM) ;
52 declareProperty("MinClusterEnergyToDeal", m_MinClusterEnergyToDeal);
53 declareProperty("MinLookupBinNentry", m_MinLookupBinNentry);
54 declareProperty("MinCellEnergyToDeal", m_MinCellEnergyToDeal);
55 declareProperty("MaxChangeInCellWeight", m_MaxChangeInCellWeight);
56 declareProperty("UseHadProbability",m_useHadProbability);
57 // Use Interpolation or not
58 declareProperty("Interpolate",m_interpolate);
59 // list of dimensions to interpolate trought in 3 different type of areas
60 m_interpolateDimensionNames["AREA_DMFIT"s] = {"DIMD_ETA"s, "DIMD_ENER"s};
61 m_interpolateDimensionNames["AREA_DMLOOKUP"s] = {"DIMD_ETA"s, "DIMD_ENER"s, "DIMD_LAMBDA"s};
62 m_interpolateDimensionNames["AREA_DMSMPW"s] = {"DIMD_ETA"s, "DIMD_LAMBDA"s};
63 declareProperty("InterpolateDimensionNames", m_interpolateDimensionNames);
64 declareProperty("UpdateSamplingVars",m_updateSamplingVars=false);
65 //Use weighting of negative clusters?
66 declareProperty("WeightingOfNegClusters",m_absOpt);
67}
68
69
70/* ****************************************************************************
71
72**************************************************************************** */
74= default;
75
76
77/* ****************************************************************************
78- CaloLCDeadMaterialTool::initialize
79**************************************************************************** */
81{
82 if(m_interpolate) {
83 msg(MSG::INFO) << "Interpolation is ON, dimensions: ";
84 for(std::map<std::string, std::vector<std::string> >::iterator it=m_interpolateDimensionNames.begin(); it!=m_interpolateDimensionNames.end(); ++it){
85 msg(MSG::INFO) << " " << (*it).first << " (";
86 for(std::vector<std::string >::iterator it2 = (*it).second.begin(); it2!=(*it).second.end(); ++it2) {
87 msg() << (*it2) << " ";
88 }
89 msg() << ")";
90 }
91 msg() << endmsg;
92 for(std::map<std::string, std::vector<std::string> >::iterator it=m_interpolateDimensionNames.begin(); it!=m_interpolateDimensionNames.end(); ++it){
93 std::vector<int > *vtmp=nullptr;
94 if((*it).first == "AREA_DMFIT") {
96 }else if((*it).first == "AREA_DMLOOKUP") {
98 }else if((*it).first == "AREA_DMSMPW") {
100 }else{
101 msg(MSG::WARNING) << "Unkown dead material area type '" << (*it).first << "'" << std::endl;
102 continue;
103 }
104 for(std::vector<std::string >::iterator it2 = (*it).second.begin(); it2!=(*it).second.end(); ++it2) {
107 vtmp->push_back(int(id));
108 }else{
109 ATH_MSG_WARNING( "Dimension '" << (*it2) << "' is invalid and will be excluded." );
110 }
111 }
112 }
113 } // m_interpolate
114
115 ATH_MSG_INFO( "Initializing " << name() );
116
117
118 ATH_CHECK(m_key.initialize());
119
120 return StatusCode::SUCCESS;
121}
122
123
124
125/* ****************************************************************************
126- DeadMaterialCorrectionTool2::execute
127**************************************************************************** */
128StatusCode CaloLCDeadMaterialTool::weight(CaloCluster* theCluster, const EventContext& ctx) const
129{
132
133 float wrong_dm_energy = 0.0;
134 float dm_total = 0.0;
135
136
137 double weightMom (1);
138 if (!theCluster->retrieveMoment(CaloCluster::DM_WEIGHT,weightMom)) {
139 ATH_MSG_WARNING ("Cannot find cluster moment DM_WEIGHT");
140 }
141 /* WTF?? re-setting the same moment??
142 theCluster->insertMoment(CaloClusterMoment::DM_WEIGHT,CaloClusterMoment(new_weight),true);
143 */
144
145 double eWeighted = theCluster->e();
146
147// // check desired reco status
148// float cls_em_fraction = 0.0;
149// if ( theCluster->checkRecoStatus(CaloRecoStatus::TAGGEDHAD)) {
150// cls_em_fraction = 0.25;
151// } else if( theCluster->checkRecoStatus(CaloRecoStatus::TAGGEDEM)) {
152// cls_em_fraction = 0.99;
153// }else {
154// log << MSG::DEBUG<<"Cluster was not selected for local DM calibration. Cluster reco status differs from TAGGEDHAD or TAGGEDEM."
155// << " Cluster energy " << theCluster->e() << " remains the same." << endmsg;
156// #ifdef MAKE_MOMENTS
157// set_zero_moments(theCluster);
158// #endif
159// return StatusCode::SUCCESS;
160// }
161
162 if ( theCluster->e() <= m_MinClusterEnergyToDeal) {
163 ATH_MSG_DEBUG("Cluster was not selected for local DM calibration, ecls < m_MinClusterEnergyToDeal (=" <<m_MinClusterEnergyToDeal << ").");
164#ifdef MAKE_MOMENTS
165 set_zero_moments(theCluster);
166#endif
167 return StatusCode::SUCCESS;
168 }
169
170 double pi0Prob = 0;
171 if ( m_useHadProbability) {
172 if (!theCluster->retrieveMoment(CaloCluster::EM_PROBABILITY,pi0Prob)) {
173 ATH_MSG_ERROR("Cannot retrieve EM_PROBABILITY cluster moment, "
174 << " cluster energy " << theCluster->e() << " remains the same." );
175 return StatusCode::FAILURE;
176 }
177 if ( pi0Prob < 0 ) {
178 pi0Prob = 0;
179 } else if ( pi0Prob > 1 ) {
180 pi0Prob = 1;
181 }
182 } else if (theCluster->recoStatus().checkStatus(CaloRecoStatus::TAGGEDEM)) {
183 pi0Prob = 1;
184 }
185
186 double center_lambda = 0;
187 if ( !theCluster->retrieveMoment(CaloCluster::CENTER_LAMBDA, center_lambda) ){
188 ATH_MSG_ERROR("Cannot retrieve CENTER_LAMBDA cluster moment, "
189 << " cluster energy " << theCluster->e() << " remains the same." );
190 return StatusCode::FAILURE;
191 }
192
193 const CaloLocalHadCoeff* data(nullptr);
195 data = *rch;
196 if(data==nullptr) {
197 ATH_MSG_ERROR("Unable to access conditions object");
198 return StatusCode::FAILURE;
199 }
200
201 ATH_MSG_DEBUG("Cluster is selected for local DM calibration."
202 << " Old cluster energy:" << theCluster->e()
203 << " m_weightModeDM:" << m_weightModeDM);
204
205 // calculation of specific cluster quantities for DM correction (i.e. core of procedure)
206 std::vector<Area> areas;
207 std::vector<Cell> cells;
208 float smp_energy[CaloSampling::Unknown];
209 float cls_unweighted_energy = 0;
210 StatusCode sc = prepare_for_cluster(theCluster, areas, cells,
211 smp_energy, cls_unweighted_energy, data);
212 if ( !sc.isSuccess() ) {
213#ifdef MAKE_MOMENTS
214 set_zero_moments(theCluster);
215#endif
216 ATH_MSG_ERROR( "prepare for cluster failed!" );
217 return sc;
218 }
219
220 float cls_initial_energy = theCluster->e();
221 float cls_side = (theCluster->eta()<0?-1.0:1.0);
222 float cls_eta = fabs(theCluster->eta());
223 float cls_phi = theCluster->phi();
224 float log10ener = 0.0;
225 if(cls_unweighted_energy > 0.0) {
226 log10ener = log10(cls_unweighted_energy);
227 }
228 float log10lambda;
229 if(center_lambda > 0.0) {
230 log10lambda = log10(center_lambda);
231 if(log10lambda >=4.0) log10lambda = 3.9999;
232 }else{
233 log10lambda = 0.0;
234 }
235#ifdef DEBUG_DMTHINGS
236 std::cout << " cls_initial_energy: " << cls_initial_energy << " cls_eta: " << cls_eta << std::endl;
237 std::cout << " log10ener: " << log10ener << " log10lambda: " << log10lambda << std::endl;
238 for(int i_smp=0; i_smp<CaloSampling::Unknown; i_smp++){
239 std::cout << " i_smp: " << i_smp << " smp_energy: " << smp_energy[i_smp] << std::endl;
240 }
241#endif
242
243 std::vector<float > vars;
244 vars.resize(6, 0.0);
245 vars[CaloLocalHadDefs::DIMD_EMFRAC] = pi0Prob;
246 vars[CaloLocalHadDefs::DIMD_SIDE] = cls_side;
247 vars[CaloLocalHadDefs::DIMD_ETA] = cls_eta;
248 vars[CaloLocalHadDefs::DIMD_PHI] = cls_phi;
249 vars[CaloLocalHadDefs::DIMD_ENER] = log10ener;
250 vars[CaloLocalHadDefs::DIMD_LAMBDA] = log10lambda;
251
252 size_t n_dm = data->getSizeAreaSet();
253
254 // loop over HAD/EM possibilities for mixing different correction types
255 for(int i_mix=0; i_mix<2; i_mix++){ // 0 - pure HAD case, 1-pure EM case
256 float mixWeight = (i_mix==0?(1-pi0Prob):pi0Prob);
257 if(mixWeight == 0) continue;
258
259 vars[CaloLocalHadDefs::DIMD_EMFRAC] = float(i_mix);
260
261 // loop over DM areas defined and calculation of cluster DM energy deposited in these areas
262 for(size_t i_dm=0; i_dm < n_dm; i_dm++){
263 if(areas[i_dm].eprep <= 0.0) continue; // no appropriate signal to reconstruct dm energy in this area
264
265 const CaloLocalHadCoeff::LocalHadArea *area = data->getArea(i_dm);
266 float emax = area->getDimension(CaloLocalHadDefs::DIMD_ENER)->getXmax();
267 if(log10ener > emax) log10ener = emax - 0.0001;
268 vars[CaloLocalHadDefs::DIMD_ENER] = log10ener;
269
270 const CaloLocalHadCoeff::LocalHadCoeff *pars = data->getCoeff(i_dm, vars);
271 if( !pars ) continue;
272
273 float edm = 0.0;
274 // if dm area is reconstructed using polynom fit approach
275 if(area->getType() == CaloLocalHadDefs::AREA_DMFIT) {
276 edm = (*pars)[CaloLocalHadDefs::BIN_P0] + (*pars)[CaloLocalHadDefs::BIN_P1]*areas[i_dm].eprep;
277 if(m_interpolate) {
278 bool isa = CaloLCCoeffHelper::Interpolate(data, i_dm, vars, parint, m_interpolateDimensionsFit, areas[i_dm].eprep);
279 // calculation of fitted values is done already in the interpolator
280 if(isa) edm = parint[CaloLocalHadDefs::BIN_P0];
281 }
282
283 // if dm area is reconstructed using lookup table approach
284 }else if(area->getType() == CaloLocalHadDefs::AREA_DMLOOKUP){
285 if( (*pars)[CaloLocalHadDefs::BIN_ENTRIES] > m_MinLookupBinNentry) edm = cls_unweighted_energy*((*pars)[CaloLocalHadDefs::BIN_WEIGHT] - 1.0 );
286 if(m_interpolate) {
288 if(isa && parint[CaloLocalHadDefs::BIN_ENTRIES] > m_MinLookupBinNentry) edm = cls_unweighted_energy*(parint[CaloLocalHadDefs::BIN_WEIGHT] - 1.0 );
289 }
290
291 // if dm area is reconstructed using new sampling weights
292 }else if(area->getType() == CaloLocalHadDefs::AREA_DMSMPW){
293 const int nSmp=pars->size()-1;
294 //std::cout << "size=" << nSmp << ", unkown value=" << CaloSampling::Unknown << ", minifcal=" << CaloSampling::MINIFCAL0 << std::endl;
295 double ecalonew = 0.0;
296 double ecaloold = 0.0;
297 for(int i_smp=0; i_smp<nSmp; i_smp++){
298 ecaloold += smp_energy[i_smp];
299 ecalonew += smp_energy[i_smp] * (*pars)[i_smp];
300 }
301 ecalonew += (*pars)[nSmp]; // const Used to be CaloSampling::Unknown but the value of this enum has changed to include the miniFCAL.
302 edm = ecalonew - ecaloold;
303
304// if(m_interpolate) {
305// bool isa = hp.Interpolate(data, i_dm, vars, parint, m_interpolateDimensionsSampling);
306// if(isa) {
307// ecalonew = 0.0;
308// ecaloold = 0.0;
309// for(int i_smp=0; i_smp<CaloSampling::Unknown; i_smp++){
310// ecaloold += smp_energy[i_smp];
311// ecalonew += smp_energy[i_smp] * parint[i_smp];
312// }
313// ecalonew += parint[CaloSampling::Unknown]; // const
314// edm = ecalonew - ecaloold;
315// }
316// }
317
318 } else{
319 std::cout << "CaloLCDeadMaterialTool -> Error! Unknown correction type " << area->getType()
320 << " with number of parameters " << area->getNpars() << std::endl;
321 }
322 wrong_dm_energy += areas[i_dm].edm_wrong;
323
324#ifdef DEBUG_DMTHINGS
325 std::cout << " result> edm: " << edm << " edm_wrong:" << edm_wrong << std::endl;
326#endif
327 edm -= areas[i_dm].edm_wrong;
328 if(edm > 0.0) {
329 areas[i_dm].erec = areas[i_dm].erec + edm*mixWeight;
330 dm_total += edm;
331 }
332 } // i_dm
333 } // i_mix
334
335 // giving of calculated DM energy to cluster by one of 3 methods
336 // m_weightModeDM=0 - simple setting of cluster energy to new value
337 // m_weightModeDM=1 - changing (increasing) of weights of cluster cells
338 // m_weightModeDM=2 - changing (increasing) of weights of cluster cells (which were invloved into DM calculation)
339
340#ifdef DEBUG_DMTHINGS
341 std::cout << "wc> calculation of weights" << std::endl;
342#endif
343
344 if(dm_total > 0.0) {
345 if (m_weightModeDM == 0) {
346 // method 0: setting cluster energy to new value without changing of cells weights
347 theCluster->setE(cls_initial_energy + dm_total - wrong_dm_energy);
348
349 } else if (m_weightModeDM == 1) {
350 // method1: calculation of weights of all cluster cells to treat DM energy.
351 // Weights of all cluster cells will be changed proportionally
352 float sub_ener_old = 0.0;
353 for(size_t i_c = 0; i_c < cells.size(); i_c++)
354 {
355 const Cell& cell = cells[i_c];
356 if (cell.energy <= m_MinCellEnergyToDeal) continue;
357 sub_ener_old += cell.weight*cell.energy;
358 }
359 if(sub_ener_old > 0.0) {
360 float corr = (sub_ener_old + dm_total)/sub_ener_old;
361 for(size_t i_c = 0; i_c < cells.size(); i_c++)
362 {
363 if(cells[i_c].energy <= m_MinCellEnergyToDeal) continue;
364 cells[i_c].weight *= corr;
365 }
366 }
367
368 } else if (m_weightModeDM == 2) {
369 // method2: calculation of weights of all cluster cells to treat DM energy.
370 // only weights for cells involved into DM calculation will be changed
371
372 for (size_t cell_index = 0; cell_index < cells.size(); ++cell_index)
373 {
374 const Cell& cell = cells[cell_index];
375 if (cell.energy <= m_MinCellEnergyToDeal) continue;
376 float we = cell.weight * cell.energy;
377 if (cell.dm != sDM)
378 areas[cell.dm].sub_ener_old += we;
379 areas[sDM_FCAL].sub_ener_old += we;
380 areas[sDM_LEAKAGE].sub_ener_old += we;
381 areas[sDM_UNCLASS].sub_ener_old += we;
382 }
383
384 for(size_t i_dm=0; i_dm < areas.size(); i_dm++) {
385 Area& dma = areas[i_dm];
386 float corrfac = 1;
387 if (i_dm >= n_dm || dma.eprep <= 0)
388 corrfac = 1;
389 else if (dma.sub_ener_old > 0)
390 corrfac = (dma.sub_ener_old + dma.erec) / dma.sub_ener_old;
391
392 if (i_dm < sDM_FCAL)
393 areas[sDM_FCAL].sub_ener_old += (corrfac-1)*dma.sub_ener_old;
394 if (i_dm < sDM_LEAKAGE)
395 areas[sDM_LEAKAGE].sub_ener_old += (corrfac-1)*dma.sub_ener_old;
396 if (i_dm < sDM_UNCLASS)
397 areas[sDM_UNCLASS].sub_ener_old += (corrfac-1)*dma.sub_ener_old;
398
399 dma.corr = corrfac;
400 }
401
402 float gblfac = areas[sDM_FCAL].corr * areas[sDM_LEAKAGE].corr * areas[sDM_UNCLASS].corr;
403 for (size_t cell_index = 0; cell_index < cells.size(); ++cell_index)
404 {
405 Cell& cell = cells[cell_index];
406 if (cell.energy <= m_MinCellEnergyToDeal) continue;
407 if (cell.dm != sDM)
408 cell.weight *= areas[cell.dm].corr;
409 cell.weight *= gblfac;
410 }
411 } else {
412 ATH_MSG_ERROR( "Unknown m_weightModeDM " << m_weightModeDM );
413 }
414
415 // setting of calculated weights to the cluster cells
416 if (m_weightModeDM == 1 || m_weightModeDM == 2){
417 int cell_index = 0;
418 CaloCluster::cell_iterator itrCell = theCluster->cell_begin();
419 CaloCluster::cell_iterator itrCellEnd = theCluster->cell_end();
420 for (;itrCell!=itrCellEnd; ++itrCell) {
421 //CaloPrefetch::nextDDE(itrCell, itrCellEnd); no DDE info needed
422 const float old_weight = itrCell.weight();
423 float new_weight = cells[cell_index].weight;
424 if( new_weight < m_MaxChangeInCellWeight*old_weight ){
425 theCluster->reweightCell(itrCell, new_weight);
426 }else{
427 new_weight = old_weight; //Why that? Just for the printout below?
428 }
429#ifdef DEBUG_DMTHINGS
430 std::cout << " cells> " << cell_index << " ener: " << cells[cell_index].energy << " old_w: " << old_weight << " new_w:" << new_weight << std::endl;
431 if( new_weight > 100) std::cout << "DeadMaterialCorrectionTool2 -> Panic! Too large weight" << std::endl;
432#endif
433 cell_index++;
434 }//end loop over cells
436 }//end if method 1 or 2
437
438 } // dm_total > 0.0
439
440 ATH_MSG_DEBUG("cls_initial_energy: " << cls_initial_energy
441 << " (contains wrongly estimated DM energy: " << wrong_dm_energy << ")"
442 << " calculated DM energy (to be added):" << dm_total
443 << " new cluster energy:" << theCluster->e());
444
445#ifdef MAKE_MOMENTS
446 // to save reconstructed energy in different DM areas as cluster moments
448 double xmom;
449 bool result = theCluster->retrieveMoment(xtype, xmom, false);
450
451 if(result) {
452 double x;
453 bool useLink = true;
454
455 x = (double)smp_energy[CaloSampling::PreSamplerB];
456 theCluster->insertMoment(CaloCluster::ENG_RECO_EMB0, x);
457
458 x = (double)smp_energy[CaloSampling::PreSamplerE];
459 theCluster->insertMoment(CaloCluster::ENG_RECO_EME0, x);
460
461 x = (double)smp_energy[CaloSampling::TileGap3];
462 theCluster->insertMoment(CaloCluster::ENG_RECO_TILEG3, x);
463
464 x = (double)(dm_total+wrong_dm_energy);
465 theCluster->insertMoment(CaloCluster::ENG_RECO_DEAD_TOT, x);
466
467 for(size_t i_dm=0; i_dm < areas.size(); i_dm++) {
468 Area& dma = areas[i_dm];
469 CaloCluster::MomentType m_type = (CaloCluster::MomentType) (int(CaloCluster::ENG_RECO_DEAD_EMB0)+i_dm);
470 x = (double)dma.erec;
471 if(i_dm == sDM_EMB0_EMB1 && smp_energy[CaloSampling::PreSamplerB]>0.0) x+= smp_energy[CaloSampling::PreSamplerB];
472 if(i_dm == sDM_EME0_EME12 && smp_energy[CaloSampling::PreSamplerE] > 0.0) x+= smp_energy[CaloSampling::PreSamplerE];
473 if(i_dm == sDM_SCN && smp_energy[CaloSampling::TileGap3] > 0.0) x+= smp_energy[CaloSampling::TileGap3];
474 theCluster->insertMoment(m_type, CaloClusterMoment(x));
475 }
476 }
477
478#endif
479
480 // assume that the weighting could be called more than once. In that
481 // case eWeighted is the result of the previous step and the current
482 // e/eWeighted ratio should be multiplied with the existing
483 // DM_WEIGHT moment
484
485 if ( eWeighted > 0 || eWeighted < 0 ) {
486 weightMom *= theCluster->e()/eWeighted;
487 }
488 theCluster->insertMoment(CaloCluster::DM_WEIGHT,weightMom);
489
490 return StatusCode::SUCCESS;
491}
492
493
494#ifdef MAKE_MOMENTS
495void set_zero_moments(CaloCluster *theCluster) {
497 double xmom;
498 bool result = theCluster->retrieveMoment(xtype, xmom);
499 if(result) {
500 theCluster->insertMoment(CaloCluster::ENG_RECO_EMB0, 0.0);
501 theCluster->insertMoment(CaloCluster::ENG_RECO_EME0, 0.0);
502 theCluster->insertMoment(CaloCluster::ENG_RECO_TILEG3, 0.0);
503 theCluster->insertMoment(CaloCluster::ENG_RECO_DEAD_TOT, 0.0);
504 for(size_t i_dm=0; i_dm < DeadMaterialCorrectionTool2::sDM; i_dm++) {
505 CaloCluster::MomentType m_type = (CaloCluster::MomentType) (int(CaloCluster::ENG_RECO_DEAD_EMB0)+i_dm);
506 theCluster->insertMoment(m_type, 0.0);
507 }
508 }
509}
510#endif
511
512
513
514/* ****************************************************************************
515- Finding energy and noise in different "areas" of cluster. Some of these areas
516 correspond to CaloSamplings, others are special.
517- Filling array m_eprep[sDM], it will be used later for reconstruction of DM
518 energy in different zones as m_dmrec[i] = fun(m_eprep[i]);
519**************************************************************************** */
520StatusCode
522 (const CaloCluster* theCluster,
523 std::vector<Area>& areas,
524 std::vector<Cell>& cells,
525 float* smp_energy,
526 float& cls_unweighted_energy, const CaloLocalHadCoeff* data) const
527{
528 areas.resize(data->getSizeAreaSet());
529 cells.reserve (theCluster->size());
530
531 bzero(smp_energy, CaloSampling::Unknown*sizeof(float));
532
533 // Finding of energy and noise in different "areas" of cluster. Some of these
534 // areas correspond to CaloSamplings, others are special.
535 CaloCluster::const_cell_iterator itrCell = theCluster->cell_begin();
536 CaloCluster::const_cell_iterator itrCellEnd = theCluster->cell_end();
537 cls_unweighted_energy = 0;
538 for (;itrCell!=itrCellEnd; ++itrCell) {
539 CxxUtils::prefetchNext(itrCell, itrCellEnd);
540 const CaloCell* thisCell = *itrCell;
541 //Identifier id = thisCell->ID();
542 CaloSampling::CaloSample nsmp=thisCell->caloDDE()->getSampling();
543 //CaloSampling::CaloSample nsmp = CaloSampling::CaloSample(m_calo_id->calo_sample(id));
544
545 float energy = thisCell->e();
546 float weight = itrCell.weight();
547 cls_unweighted_energy += energy;
548
549 Cell cell{};
550 cell.weight = weight;
551 cell.energy = energy;
552 cell.dm = sDM;
553
554 smp_energy[nsmp] += energy; // unweighted energy in samplings for given cluster
555
556 if(energy > m_MinCellEnergyToDeal) {
557
558 if ( nsmp == CaloSampling::PreSamplerB || nsmp == CaloSampling::EMB1) {
559 cell.dm = sDM_EMB0_EMB1;
560
561 } else if( nsmp == CaloSampling::TileGap3 ) {
562 cell.dm = sDM_SCN;
563
564 } else if ( nsmp == CaloSampling::PreSamplerE || nsmp == CaloSampling::EME1 ) {
565 cell.dm = sDM_EME0_EME12;
566
567 } else if (nsmp == CaloSampling::EME3) {
568 cell.dm = sDM_EME3_HEC0;
569
570 } else if (nsmp == CaloSampling::HEC0) {
571 cell.dm = sDM_EME3_HEC0;
572
573 } else if (nsmp == CaloSampling::EMB3) {
574 cell.dm = sDM_EMB3_TILE0;
575
576 } else if (nsmp == CaloSampling::TileBar0) {
577 cell.dm = sDM_EMB3_TILE0;
578 }
579
580 } // cell_ener > cell_min_energy
581 cells.push_back (cell);
582 } // itrCell
583
584// Realculate sampling energy as the abs value of the original cluster, if you summed up energies, fluctuations wouldn't cancel and sample energy would be huge
585 if(m_absOpt){
586
587 for(unsigned int i=0; i != CaloSampling::Unknown; ++ i) smp_energy[i] = fabs(theCluster->eSample((CaloSampling::CaloSample)i));
588
589 }
590
591
592 // calculation of 'signal' which will be used for DM energy estimation
593 float x(0), y(0);
594
595 // sDM_EMB0_EMB1: energy before EMB0 and between EMB0 and EMB1
596 x = smp_energy[CaloSampling::PreSamplerB];
597 if ( x > 0.) {
598 areas[sDM_EMB0_EMB1].eprep = x;
599 areas[sDM_EMB0_EMB1].edm_wrong = x;
600 }
601
602 // sDM_EMB3_TILE0: to correct energy between barrel and tile
603 x = smp_energy[CaloSampling::EMB3];
604 y = smp_energy[CaloSampling::TileBar0];
605 if ( x > 0. && y>0.) areas[sDM_EMB3_TILE0].eprep = sqrt(x*y);
606
607 // sDM_SCN: to correct energy before scintillator
608 x = smp_energy[CaloSampling::TileGap3];
609 if ( x > 0.) {
610 areas[sDM_SCN].eprep = x;
611 areas[sDM_SCN].edm_wrong = x;
612 }
613
614 // sDM_EME0_EME12: sum of energy before EME0 and between EME0 and EME1
615 x = smp_energy[CaloSampling::PreSamplerE];
616 if ( x > 0.) {
617 areas[sDM_EME0_EME12].eprep = x;
618 areas[sDM_EME0_EME12].edm_wrong = x;
619 }
620
621 // sDM_EME3_HEC0: to correct energy between EMEC and HEC
622 x = smp_energy[CaloSampling::EME3];
623 y = smp_energy[CaloSampling::HEC0];
624 if ( x > 0. && y>0.) areas[sDM_EME3_HEC0].eprep = sqrt(x*y);
625
626 areas[sDM_FCAL].eprep = cls_unweighted_energy;
627 areas[sDM_LEAKAGE].eprep = cls_unweighted_energy;
628 areas[sDM_UNCLASS].eprep = cls_unweighted_energy;
629
630 return StatusCode::SUCCESS;
631}
632
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double area(double R)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t sc
#define y
#define x
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
MsgStream & msg() const
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
virtual double e() const override final
get energy (data member) (synonym to method energy()
Definition CaloCell.h:333
const CaloDetDescrElement * caloDDE() const
get pointer to CaloDetDescrElement (data member)
Definition CaloCell.h:321
static void calculateKine(xAOD::CaloCluster *clu, const bool useweight=true, const bool updateLayers=true, const bool useGPUCriteria=false)
Helper class to calculate cluster kinematics based on cells.
defines enums and data types for different moments of CaloCluster
Principal data class for CaloCell clusters.
double eSample(sampling_type sampling) const
Retrieve energy in a given sampling.
bool retrieveMoment(const moment_type &momType, moment_value &momValue, bool useLink=true) const
Retrieve individual moment.
virtual double e() const
Retrieve energy independent of signal state.
void insertMoment(const moment_type &momType, const moment_value &momValue, bool useLink=true)
Set individual moment.
virtual double eta() const
Retrieve eta independent of signal state.
virtual double phi() const
Retrieve phi independent of signal state.
virtual void setE(double e)
Set energy.
cell_iterator cell_end() const
Retrieve a STL-type end() iterator for the cell store.
void reweightCell(const CaloCell *pCell, double weight)
Reweight a cell with kinematic update.
cell_iterator cell_begin() const
Retrieve a STL-type begin() iterator for the cell store.
CaloCell_ID::CaloSample getSampling() const
cell sampling
static bool Interpolate(const CaloLocalHadCoeff *m_data, const unsigned int n_area, std::vector< float > &x, CaloLocalHadCoeff::LocalHadCoeff &pars, const std::vector< int > &dim, double xfit=0.)
static CaloLocalHadDefs::LocalHadDimensionId getDimensionId(const std::string &dimensionName)
virtual StatusCode weight(xAOD::CaloCluster *theCluster, const EventContext &ctx) const override
method to weight the cells in a cluster
int m_recoStatus
Required Reco Status for the clusters in order to be calibrated.
std::vector< int > m_interpolateDimensionsFit
actual set of dimension id's to interpolate (in the DM areas corrected with TProfile approach)
bool m_absOpt
In Abs Option case, DM calculation has to be handled in a slightly different way.
bool m_useHadProbability
calculate DM energy using em-probability moment
std::vector< int > m_interpolateDimensionsSampling
actual set of dimension id's to interpolate (in the DM areas corrected with sampling weight approach)
bool m_updateSamplingVars
update also sampling variables
StatusCode prepare_for_cluster(const xAOD::CaloCluster *theCluster, std::vector< Area > &areas, std::vector< Cell > &cells, float *smp_energy, float &cls_unweighted_energy, const CaloLocalHadCoeff *data) const
std::vector< int > m_interpolateDimensionsLookup
actual set of dimension id's to interpolate (in the DM areas corrected with lookup approach)
virtual StatusCode initialize() override
SG::ReadCondHandleKey< CaloLocalHadCoeff > m_key
name of the key for DM cell weights
float m_MaxChangeInCellWeight
maximum allowed change in cell weights
int m_MinLookupBinNentry
minimum number of events in one lookup bin to use
float m_MinClusterEnergyToDeal
Minimum energy of clusters to apply correction.
std::map< std::string, std::vector< std::string > > m_interpolateDimensionNames
vector of names of dimensions to interpolate (for different correction types different set of dimensi...
int m_weightModeDM
method of assignment of DM energy to cluster
virtual ~CaloLCDeadMaterialTool() override
float m_MinCellEnergyToDeal
minimum cell energy to deal
CaloLCDeadMaterialTool(const std::string &type, const std::string &name, const IInterface *parent)
bool m_interpolate
interpolate correction coefficients
Definition of correction area.
Hold binned correction data for local hadronic calibration procedure.
std::vector< float > LocalHadCoeff
Correction parameters for one general bin.
reconstruction status indicator
CaloClusterCellLink::iterator cell_iterator
Iterator of the underlying CaloClusterCellLink (non-const version)
CaloClusterCellLink::const_iterator const_cell_iterator
Iterator of the underlying CaloClusterCellLink (explicitly const version)
MomentType
Enums to identify different moments.
@ EM_PROBABILITY
Classification probability to be em-like.
@ DM_WEIGHT
Dead-material weight (E_dm/E_ooc)
@ CENTER_LAMBDA
Shower depth at Cluster Centroid.
@ ENG_CALIB_DEAD_TOT
Attached Calibration Hit energy in dead material.
void prefetchNext(Iter iter, Iter endIter)
Prefetch next object in sequence.
Definition prefetch.h:130
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Functions to prefetch blocks of memory.
LocalHadDimensionId
enums to identify user dimensions id number DIMC_* - classification, DIMW_*-weighting,...