ATLAS Offline Software
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 
13 #include "CaloEvent/CaloPrefetch.h"
16 #include "CxxUtils/prefetch.h"
17 
19 
20 #include "CLHEP/Units/SystemOfUnits.h"
21 
22 using CLHEP::MeV;
23 using xAOD::CaloCluster;
24 using namespace std::string_literals; //for suffix 's'
25 
26 #ifdef MAKE_MOMENTS
27 void set_zero_moments(CaloCluster *theCluster);
28 #endif
29 
30 /* ****************************************************************************
31 
32 **************************************************************************** */
34  const std::string& name,
35  const IInterface* parent)
37  m_key("HadDMCoeff2"),
38  m_recoStatus(CaloRecoStatus::UNKNOWNSTATUS),
39  m_weightModeDM(1),
40  m_MinClusterEnergyToDeal(200.0*MeV),
41  m_MinLookupBinNentry(40),
42  m_MinCellEnergyToDeal(0.0),
43  m_MaxChangeInCellWeight(30.0),
44  m_useHadProbability(false),
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 
119 
120  return StatusCode::SUCCESS;
121 }
122 
123 
124 
125 /* ****************************************************************************
126 - DeadMaterialCorrectionTool2::execute
127 **************************************************************************** */
128 StatusCode 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) {
287  bool isa = CaloLCCoeffHelper::Interpolate(data, i_dm, vars, parint, m_interpolateDimensionsLookup);
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
447  CaloCluster::MomentType xtype = CaloCluster::ENG_CALIB_DEAD_TOT;
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
495 void set_zero_moments(CaloCluster *theCluster) {
496  CaloCluster::MomentType xtype = CaloCluster::ENG_CALIB_DEAD_TOT;
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 **************************************************************************** */
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 
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 
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
CaloLocalHadDefs::BIN_P1
@ BIN_P1
Definition: CaloLocalHadDefs.h:32
CaloClusterKineHelper.h
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:281
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
CaloClusterMoment::MomentType
MomentType
enums to identify different moments
Definition: CaloClusterMoment.h:38
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
CaloLCDeadMaterialTool::m_useHadProbability
bool m_useHadProbability
calculate DM energy using em-probability moment
Definition: CaloLCDeadMaterialTool.h:134
TauGNNUtils::Variables::Cluster::CENTER_LAMBDA
bool CENTER_LAMBDA(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:851
CaloPrefetch.h
CaloCluster::eSample
double eSample(sampling_type sampling) const
Retrieve energy in a given sampling.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:975
CaloCompositeCellBase::reweightCell
void reweightCell(const CaloCell *pCell, double weight)
Reweight a cell with kinematic update.
CaloLCDeadMaterialTool::sDM
@ sDM
Definition: CaloLCDeadMaterialTool.h:57
CaloLCDeadMaterialTool::m_MinCellEnergyToDeal
float m_MinCellEnergyToDeal
minimum cell energy to deal
Definition: CaloLCDeadMaterialTool.h:121
get_generator_info.result
result
Definition: get_generator_info.py:21
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloLocalHadDefs::DIMD_ETA
@ DIMD_ETA
Definition: CaloLocalHadDefs.h:68
TauGNNUtils::Variables::Cluster::EM_PROBABILITY
bool EM_PROBABILITY(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:920
CaloLCDeadMaterialTool::weight
virtual StatusCode weight(xAOD::CaloCluster *theCluster, const EventContext &ctx) const override
method to weight the cells in a cluster
Definition: CaloLCDeadMaterialTool.cxx:128
CaloLocalHadDefs.h
CaloLocalHadDefs::DIMD_EMFRAC
@ DIMD_EMFRAC
Definition: CaloLocalHadDefs.h:66
CaloLocalHadDefs::DIMU_UNKNOWN
@ DIMU_UNKNOWN
Definition: CaloLocalHadDefs.h:73
CaloLCDeadMaterialTool::m_updateSamplingVars
bool m_updateSamplingVars
update also sampling variables
Definition: CaloLCDeadMaterialTool.h:142
CaloLCDeadMaterialTool::sDM_EMB3_TILE0
@ sDM_EMB3_TILE0
Definition: CaloLCDeadMaterialTool.h:50
CaloLocalHadDefs::AREA_DMFIT
@ AREA_DMFIT
Definition: CaloLocalHadDefs.h:21
skel.it
it
Definition: skel.GENtoEVGEN.py:407
CaloLCCoeffHelper::getDimensionId
static CaloLocalHadDefs::LocalHadDimensionId getDimensionId(const std::string &dimensionName)
Definition: CaloLCCoeffHelper.h:32
CaloLCDeadMaterialTool::m_MaxChangeInCellWeight
float m_MaxChangeInCellWeight
maximum allowed change in cell weights
Definition: CaloLCDeadMaterialTool.h:125
CaloCell::e
virtual double e() const override final
get energy (data member) (synonym to method energy()
Definition: CaloCell.h:327
CaloLocalHadDefs::AREA_DMSMPW
@ AREA_DMSMPW
Definition: CaloLocalHadDefs.h:23
CaloLCDeadMaterialTool::sDM_EMB0_EMB1
@ sDM_EMB0_EMB1
Definition: CaloLCDeadMaterialTool.h:49
CaloCompositeCellBase::cell_end
cell_iterator cell_end() const
Retrieve a STL-type end() iterator for the cell store.
CaloLCDeadMaterialTool::m_absOpt
bool m_absOpt
In Abs Option case, DM calculation has to be handled in a slightly different way.
Definition: CaloLCDeadMaterialTool.h:160
x
#define x
CaloCell_ID_FCS::TileGap3
@ TileGap3
Definition: FastCaloSim_CaloCell_ID.h:36
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
CaloLocalHadDefs::LocalHadDimensionId
LocalHadDimensionId
enums to identify user dimensions id number DIMC_* - classification, DIMW_*-weighting,...
Definition: CaloLocalHadDefs.h:45
xAOD::CaloCluster
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloCluster.h:19
CaloLCDeadMaterialTool::m_recoStatus
int m_recoStatus
Required Reco Status for the clusters in order to be calibrated.
Definition: CaloLCDeadMaterialTool.h:101
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
CaloLCDeadMaterialTool::sDM_EME3_HEC0
@ sDM_EME3_HEC0
Definition: CaloLCDeadMaterialTool.h:53
CaloCell_ID.h
python.SystemOfUnits.MeV
float MeV
Definition: SystemOfUnits.py:172
CaloLCDeadMaterialTool::Cell
Definition: CaloLCDeadMaterialTool.h:72
CaloLocalHadCoeff::LocalHadCoeff
std::vector< float > LocalHadCoeff
Correction parameters for one general bin.
Definition: CaloLocalHadCoeff.h:220
m_type
TokenType m_type
the type
Definition: TProperty.cxx:44
CaloLocalHadDefs::BIN_ENTRIES
@ BIN_ENTRIES
Definition: CaloLocalHadDefs.h:29
CaloLCDeadMaterialTool::Area
Definition: CaloLCDeadMaterialTool.h:80
CaloCluster::cell_iterator
CaloCompositeCellBase< CaloClusterNavigable >::cell_iterator cell_iterator
Iterator on CaloCell s.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:115
CaloLCDeadMaterialTool::m_key
SG::ReadCondHandleKey< CaloLocalHadCoeff > m_key
name of the key for DM cell weights
Definition: CaloLCDeadMaterialTool.h:97
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ParticleGun_FastCalo_ChargeFlip_Config.energy
energy
Definition: ParticleGun_FastCalo_ChargeFlip_Config.py:78
lumiFormat.i
int i
Definition: lumiFormat.py:85
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
CaloCluster.h
CaloCell_ID_FCS::TileBar0
@ TileBar0
Definition: FastCaloSim_CaloCell_ID.h:31
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Definition: AthCommonDataStore.h:145
CaloLocalHadCoeff
Hold binned correction data for local hadronic calibration procedure.
Definition: CaloLocalHadCoeff.h:41
CaloCell::caloDDE
const CaloDetDescrElement * caloDDE() const
get pointer to CaloDetDescrElement (data member)
Definition: CaloCell.h:315
CaloLCDeadMaterialTool::~CaloLCDeadMaterialTool
virtual ~CaloLCDeadMaterialTool() override
CaloLCDeadMaterialTool::Area::erec
float erec
Definition: CaloLCDeadMaterialTool.h:83
CaloCluster::insertMoment
void insertMoment(const moment_type &momType, const moment_value &momValue, bool useLink=true)
Set individual moment.
Definition: CaloCluster.cxx:1247
test_pyathena.parent
parent
Definition: test_pyathena.py:15
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
CaloCluster
Principal data class for CaloCell clusters.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:79
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CaloLCDeadMaterialTool::m_interpolateDimensionsLookup
std::vector< int > m_interpolateDimensionsLookup
actual set of dimension id's to interpolate (in the DM areas corrected with lookup approach)
Definition: CaloLCDeadMaterialTool.h:153
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
CaloLCDeadMaterialTool::sDM_UNCLASS
@ sDM_UNCLASS
Definition: CaloLCDeadMaterialTool.h:56
CaloLCCoeffHelper
Definition: CaloLCCoeffHelper.h:15
CaloCluster::MomentType
moment_type MomentType
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:141
CaloLocalHadDefs::DIMD_ENER
@ DIMD_ENER
Definition: CaloLocalHadDefs.h:70
CxxUtils::prefetchNext
void prefetchNext(Iter iter, Iter endIter)
Prefetch next object in sequence.
Definition: prefetch.h:130
CaloLCCoeffHelper.h
CaloLCCoeffHelper::Interpolate
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.)
Definition: CaloLCCoeffHelper.cxx:230
CaloLCDeadMaterialTool::m_interpolate
bool m_interpolate
interpolate correction coefficients
Definition: CaloLCDeadMaterialTool.h:138
CaloRecoStatus.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
CaloCompositeCellBase::cell_begin
cell_iterator cell_begin() const
Retrieve a STL-type begin() iterator for the cell store.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
CaloLCDeadMaterialTool.h
CaloRecoStatus::TAGGEDEM
@ TAGGEDEM
Definition: CaloRecoStatus.h:38
CaloCell_ID_FCS::HEC0
@ HEC0
Definition: FastCaloSim_CaloCell_ID.h:27
CaloCluster::setE
virtual void setE(double e)
Set energy.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:767
CaloLCDeadMaterialTool::Area::corr
float corr
Definition: CaloLCDeadMaterialTool.h:85
y
#define y
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloDetDescrElement::getSampling
CaloCell_ID::CaloSample getSampling() const
cell sampling
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:395
CaloLocalHadDefs::DIMD_PHI
@ DIMD_PHI
Definition: CaloLocalHadDefs.h:69
CaloLCDeadMaterialTool::m_interpolateDimensionsFit
std::vector< int > m_interpolateDimensionsFit
actual set of dimension id's to interpolate (in the DM areas corrected with TProfile approach)
Definition: CaloLCDeadMaterialTool.h:150
CaloCluster::eta
virtual double eta() const
Retrieve eta independent of signal state.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:755
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.Constants.INFO
int INFO
Definition: Control/AthenaCommon/python/Constants.py:15
CaloCell_ID_FCS::PreSamplerE
@ PreSamplerE
Definition: FastCaloSim_CaloCell_ID.h:23
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
CaloClusterMoment
defines enums and data types for different moments of CaloCluster
Definition: CaloClusterMoment.h:29
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
CaloLCDeadMaterialTool::sDM_LEAKAGE
@ sDM_LEAKAGE
Definition: CaloLCDeadMaterialTool.h:55
CaloLocalHadDefs::BIN_P0
@ BIN_P0
Definition: CaloLocalHadDefs.h:31
CaloCluster::e
virtual double e() const
Retrieve energy independent of signal state.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:753
beamspotnt.xtype
string xtype
Definition: bin/beamspotnt.py:1508
CaloLocalHadCoeff::LocalHadArea
Definition of correction area.
Definition: CaloLocalHadCoeff.h:145
python.SystemOfUnits.s
float s
Definition: SystemOfUnits.py:147
CaloClusterKineHelper::calculateKine
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.
Definition: CaloClusterKineHelper.cxx:223
CaloLCDeadMaterialTool::sDM_FCAL
@ sDM_FCAL
Definition: CaloLCDeadMaterialTool.h:54
CaloLCDeadMaterialTool::CaloLCDeadMaterialTool
CaloLCDeadMaterialTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: CaloLCDeadMaterialTool.cxx:33
CaloLCDeadMaterialTool::sDM_SCN
@ sDM_SCN
Definition: CaloLCDeadMaterialTool.h:51
CaloLCDeadMaterialTool::m_weightModeDM
int m_weightModeDM
method of assignment of DM energy to cluster
Definition: CaloLCDeadMaterialTool.h:109
CaloLCDeadMaterialTool::m_MinLookupBinNentry
int m_MinLookupBinNentry
minimum number of events in one lookup bin to use
Definition: CaloLCDeadMaterialTool.h:117
CaloLCDeadMaterialTool::m_interpolateDimensionNames
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...
Definition: CaloLCDeadMaterialTool.h:146
CaloLocalHadDefs::DIMD_SIDE
@ DIMD_SIDE
Definition: CaloLocalHadDefs.h:67
CaloLocalHadDefs::BIN_WEIGHT
@ BIN_WEIGHT
Definition: CaloLocalHadDefs.h:28
CaloLCDeadMaterialTool::m_MinClusterEnergyToDeal
float m_MinClusterEnergyToDeal
Minimum energy of clusters to apply correction.
Definition: CaloLCDeadMaterialTool.h:113
area
double area(double R)
Definition: ConvertStaveServices.cxx:42
CaloCluster::retrieveMoment
bool retrieveMoment(const moment_type &momType, moment_value &momValue, bool useLink=true) const
Retrieve individual moment.
Definition: CaloCluster.cxx:1266
AthAlgTool
Definition: AthAlgTool.h:26
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
CaloLocalHadDefs::DIMD_LAMBDA
@ DIMD_LAMBDA
Definition: CaloLocalHadDefs.h:71
CaloRecoStatus
reconstruction status indicator
Definition: CaloRecoStatus.h:12
CaloLCDeadMaterialTool::prepare_for_cluster
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
Definition: CaloLCDeadMaterialTool.cxx:522
CaloLCDeadMaterialTool::Area::eprep
float eprep
Definition: CaloLCDeadMaterialTool.h:82
prefetch.h
Functions to prefetch blocks of memory.
CaloLCDeadMaterialTool::sDM_EME0_EME12
@ sDM_EME0_EME12
Definition: CaloLCDeadMaterialTool.h:52
CaloLCDeadMaterialTool::initialize
virtual StatusCode initialize() override
Definition: CaloLCDeadMaterialTool.cxx:80
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65
CaloLCDeadMaterialTool::Area::sub_ener_old
float sub_ener_old
Definition: CaloLCDeadMaterialTool.h:84
CaloCluster::phi
virtual double phi() const
Retrieve phi independent of signal state.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:759
CaloLCDeadMaterialTool::m_interpolateDimensionsSampling
std::vector< int > m_interpolateDimensionsSampling
actual set of dimension id's to interpolate (in the DM areas corrected with sampling weight approach)
Definition: CaloLCDeadMaterialTool.h:156
CaloLocalHadDefs::AREA_DMLOOKUP
@ AREA_DMLOOKUP
Definition: CaloLocalHadDefs.h:22