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