ATLAS Offline Software
eflowCellSubtractionFacilitator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Athena Headers
7 //#include "eflowRec/eflowCellPosition.h"
8 
10 #include "CaloEvent/CaloCell.h"
11 #include "GaudiKernel/Bootstrap.h"
12 #include "GaudiKernel/IMessageSvc.h"
13 #include "GaudiKernel/ISvcLocator.h"
15 
16 // C++ Headers
17 #include <map>
18 
20  : AsgMessaging("eflowCellSubtractionFacilitator")
21 {}
22 
23 double
25  eflowRingSubtractionManager& cellSubtractionManager,
26  eflowRecTrack& theTrack,
27  xAOD::CaloCluster* tracksCluster,
28  eflowCellList& orderedCells,
29  bool& annFlag, const bool& addCPData) const
30 {
31  std::vector<std::pair<xAOD::CaloCluster*, bool>> localClusterBoolPairVec(
32  1, std::pair(tracksCluster, false));
33  return subtractCells(
34  cellSubtractionManager, theTrack, localClusterBoolPairVec, orderedCells, annFlag, addCPData);
35 }
36 
37 void
39  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters)
40 {
41  for (auto thisPair : tracksClusters)
42  updateClusterKinematics(thisPair.first);
43 }
44 
45 void
47  xAOD::CaloCluster* theCluster)
48 {
49  float oldEnergy = theCluster->e();
50  CaloClusterKineHelper::calculateKine(theCluster, true, true);
51  if (0.0 != oldEnergy) {
52  float energyAdjustment = theCluster->e() / oldEnergy;
53  theCluster->setRawE(theCluster->rawE() * energyAdjustment);
54  theCluster->setRawEta(theCluster->eta());
55  theCluster->setRawPhi(theCluster->phi());
56  }
57 }
58 
59 double
61  const std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters)
62 {
63  double eClustersOld = 0;
64  /* Summed energy of all clusters before subtraction */
65  for (auto thisPair : tracksClusters)
66  eClustersOld += (thisPair.first)->e();
67  return eClustersOld;
68 }
69 
70 double
72  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters,
73  CellIt beginRing,
74  CellIt endRing)
75 {
76  /* Get total energy of ringes from beginRing to endRing */
77 
78  double eRing(0.0);
79  for (CellIt it = beginRing; it != endRing; ++it) {
80  /* Loop over Rings */
81  for (auto thisCell : it->second) {
82  /* Loop over Cells */
83  std::pair<const CaloCell*, int> thisPair = thisCell;
84  xAOD::CaloCluster* clus = tracksClusters[thisPair.second].first;
85  CaloClusterCellLink::iterator theIterator =
87  double cellWeight = theIterator.weight();
88  eRing += thisPair.first->energy() * cellWeight;
89  }
90  }
91 
92  return eRing;
93 }
94 
95 void
97  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters, bool& annFlag,
98  eflowRecTrack& theTrack, const bool& addCPData)
99 {
100  for (auto& thisPair : tracksClusters) {
101  xAOD::CaloCluster* thisCluster = thisPair.first;
102  CaloClusterCellLink* theCellLink = thisCluster->getOwnCellLinks();
103  CaloClusterCellLink::iterator theFirstCell = theCellLink->begin();
104  CaloClusterCellLink::iterator theLastCell = theCellLink->end();
105  for (; theFirstCell != theLastCell; ++theFirstCell){
106  if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theFirstCell.index()),1.0);
107  thisCluster->removeCell(*theFirstCell);
108  }
109  thisCluster->setCalE(0.0);
110  thisCluster->setRawE(0.0);
111  // set the subtracted status to true
112  thisPair.second = true;
113  }
114  annFlag = true;
115 }
116 
117 void
119  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters,
120  CellIt beginRing,
121  CellIt endRing,
122  double targetRingEnergy,
123  double eRings, eflowRecTrack& theTrack,
124  const bool& addCPData) const
125 {
126  for (CellIt itRing = beginRing; itRing != endRing; ++itRing) {
127  /* Loop over Rings */
128  for (auto thisCell : itRing->second) {
129  /* Loop over Cells */
130  std::pair<const CaloCell*, int> thisPair = thisCell;
131  xAOD::CaloCluster* cluster = tracksClusters[thisPair.second].first;
132  // flag this cluster as having had subtraction applied to it
133  tracksClusters[thisPair.second].second = true;
134  const CaloCell* cell = thisPair.first;
135  CaloClusterCellLink::iterator theIterator =
137  double oldCellWeight = theIterator.weight();
138  double ringWeight = targetRingEnergy / eRings;
139  const double newCellWeight = oldCellWeight * ringWeight;
140  ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Cluster with e "
141  << cluster->e()
142  << " is changing weight of cell with energy " << cell->e()
143  << " from " << oldCellWeight << " to " << newCellWeight);
144  theIterator.reweight(newCellWeight);
145  if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()),ringWeight);
146  }
147  }
148 }
149 
150 void
152  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters,
153  CellIt beginRing,
154  CellIt endRing, eflowRecTrack& theTrack,
155  const bool& addCPData) const
156 {
157  /* Subtract full ring */
158 
159  for (CellIt itRing = beginRing; itRing != endRing; ++itRing) {
160  /* Loop over Rings */
161  for (auto thisCell : itRing->second) {
162  /* Loop over Cells */
163  std::pair<const CaloCell*, int> thisPair = thisCell;
164  xAOD::CaloCluster* cluster = tracksClusters[thisPair.second].first;
165  // flag this cluster as having had subtraction applied to it
166  tracksClusters[thisPair.second].second = true;
167  ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Cluster with e "
168  << cluster->e() << " is removing cell with e "
169  << thisPair.first->e());
170  CaloClusterCellLink::iterator theIterator = this->getCellIterator(cluster, thisPair.first);
171  if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()),1.0);
172  cluster->removeCell(thisPair.first);
173  }
174  }
175 }
176 
177 bool
179  eflowRingSubtractionManager& cellSubtractionManager,
180  const std::pair<eflowCaloENUM, short>& ring,
181  double& eSubtracted,
182  const double eExpect,
183  eflowCellList& orderedCells,
184  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters,
185  bool& annFlag, eflowRecTrack& theTrack,
186  const bool& addCPData ) const
187 {
188  /* Subtract energy from ring, return TRUE if the whole expected energy is
189  * subtracted */
190 
191  const eflowCaloENUM subtLayer = ring.first;
192  const short ringNo = ring.second;
193 
194  const double r1 = ringNo * cellSubtractionManager.ringThickness(subtLayer);
195  const double r2 =
196  (ringNo + 1) * cellSubtractionManager.ringThickness(subtLayer);
197 
198  CellIt beginRing = orderedCells.getLowerBound(subtLayer, r1);
199  CellIt endRing = orderedCells.getLowerBound(subtLayer, r2);
200 
201  /* Get total energy of Rings from beginRing to endRing */
202  double eRings = getRingsEnergy(tracksClusters, beginRing, endRing);
203 
204  if (eSubtracted + eRings > eExpect) {
205  /* Subtract partial ring */
206 
207  ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Subtracting partial ring, "
208  "eSubtracted, eRings and eExpect are "
209  << eSubtracted << ", " << eRings << ", " << eExpect);
210 
211  /* Target ring energy is ring energy minus the energy that still needs to be
212  * subtracted */
213  double targetRingEnergy = eRings - (eExpect - eSubtracted);
214  ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: targetRingEnergy is "
215  << targetRingEnergy);
217  tracksClusters, beginRing, endRing, targetRingEnergy, eRings, theTrack, addCPData);
218  eSubtracted = eExpect;
219 
220  /* Update the cluster four-momenta having done the subtraction */
221  updateClusterKinematics(tracksClusters);
222 
223  return true;
224 
225  } else {
226  /* Subtract full ring */
227 
228  ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Subtracting full ring ");
229 
230  subtractFullRings(tracksClusters, beginRing, endRing, theTrack, addCPData);
231  orderedCells.deleteFromList(beginRing, endRing);
232  eSubtracted += eRings;
233 
234  /* If no energy left */
235  double eClustersOld = getTotalEnergy(tracksClusters);
236  if (fabs(eClustersOld - eSubtracted) < 1.0e-6 * eClustersOld) {
237  /* Annihilate clusters, clear orderedCells, and update subtracted cluster
238  * kinematics */
239  annihilateClusters(tracksClusters,annFlag, theTrack, addCPData);
240  orderedCells.eraseList();
241  updateClusterKinematics(tracksClusters);
242 
243  return true;
244  }
245 
246  return false;
247  }
248 }
249 
250 bool
252  const double eExpect,
253  xAOD::CaloCluster* cluster,
254  const CaloCell* cell,
255  eflowRecTrack& theTrack,
256  const bool& addCPData)
257 {
258 
259  CaloClusterCellLink::iterator theIterator =
261  double oldCellWeight = theIterator.weight();
262  double oldCellEnergy = cell->energy() * oldCellWeight;
263 
264  if (oldCellEnergy != 0. && eSubtracted + oldCellEnergy > eExpect) {
265  /* Target cell energy is cell energy minus the energy that still needs to be
266  * subtracted */
267  double targetCellEnergy = oldCellEnergy - (eExpect - eSubtracted);
268 
269  double energyWeight = targetCellEnergy / oldCellEnergy;
270  double newCellWeight = oldCellWeight * energyWeight;
271  theIterator.reweight(newCellWeight);
272  if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()), energyWeight);
273 
274  eSubtracted = eExpect;
275 
276  /* Update the cluster four-momenta having done the subtraction */
277  updateClusterKinematics(cluster);
278 
279  return true;
280 
281  } else {
282  if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()),1.0);
283  cluster->removeCell(cell);
284  eSubtracted += oldCellEnergy;
285 
286  /* Update the clusters having done the subtraction */
287  updateClusterKinematics(cluster);
288  return false;
289  }
290 }
291 
292 bool
294  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters,
295  double eSubtracted,
296  const double eExpect,
297  eflowCellList& reorderedCells,
298  eflowRecTrack& theTrack,
299  const bool& addCPData)
300 {
301  CellIt itCellPosition = reorderedCells.begin();
302  CellIt endCellPosition = reorderedCells.end();
303  while (itCellPosition != endCellPosition) {
304  /* Loop cells */
305  std::vector<std::pair<const CaloCell*, int>>::iterator itEntry =
306  itCellPosition->second.begin();
307  std::vector<std::pair<const CaloCell*, int>>::iterator endEntry =
308  itCellPosition->second.end();
309  for (; itEntry != endEntry; ++itEntry) {
310  const std::pair<const CaloCell*, int> thisPair = *itEntry;
311  xAOD::CaloCluster* cluster = tracksClusters[thisPair.second].first;
312  // flag this cluster as having had subtraction applied to it
313  tracksClusters[thisPair.second].second = true;
314  const CaloCell* cell = thisPair.first;
315  bool isFinished = subtractCaloCell(eSubtracted, eExpect, cluster, cell, theTrack, addCPData);
316  if (isFinished)
317  return true;
318  }
319  /* Erase the CellPosition from the cell list */
320  CellIt tmp = itCellPosition;
321  ++itCellPosition;
322  reorderedCells.deleteFromList(tmp);
323  }
324  return false;
325 }
326 
327 double
329  eflowRingSubtractionManager& cellSubtractionManager,
330  eflowRecTrack& theTrack,
331  std::vector<std::pair<xAOD::CaloCluster*, bool>>& tracksClusters,
332  eflowCellList& orderedCells,
333  bool& annFlag, const bool& addCPData) const
334 {
335 
336  const double trackEnergy = theTrack.getTrack()->e();
337  const double eExpect = cellSubtractionManager.fudgeMean() * trackEnergy;
338  const double sigmaEExpect =
339  cellSubtractionManager.fudgeStdDev() * trackEnergy;
340  ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: For track with trackEnergy "
341  << trackEnergy << " expect to subtract " << eExpect
342  << " with width of " << sigmaEExpect);
343 
344  double eSubtracted = 0.0;
345 
346  /*
347  * Ring subtraction
348  */
349  std::map<double, RingId>::const_iterator ringIt =
350  cellSubtractionManager.rankBegin();
351  std::map<double, RingId>::const_iterator ringEnd =
352  cellSubtractionManager.rankEnd();
353  for (; ringIt != ringEnd; ++ringIt) {
354  bool isFinished = subtractRings(cellSubtractionManager,
355  ringIt->second,
356  eSubtracted,
357  eExpect,
358  orderedCells,
359  tracksClusters,
360  annFlag,
361  theTrack,
362  addCPData);
363  if (isFinished) {
364  return sigmaEExpect;
365  }
366  }
367 
368  /* Update the cluster four-momenta */
369  updateClusterKinematics(tracksClusters);
370 
371  if (orderedCells.mapSize() <= 0 || eSubtracted >= eExpect) {
372  return sigmaEExpect;
373  }
374 
375  /*
376  * Cell subtraction
377  */
378  /* Increasing dR (not by layer) for cell subtraction */
379  orderedCells.reorderWithoutLayers();
380 
381  bool isFinished =
382  subtractReorderedCells(tracksClusters, eSubtracted, eExpect, orderedCells, theTrack, addCPData);
383  if (isFinished) {
384  return sigmaEExpect;
385  }
386 
387  /* Update the cluster four-momenta */
388  updateClusterKinematics(tracksClusters);
389 
390  return sigmaEExpect;
391 }
392 
395  xAOD::CaloCluster* thisCluster,
396  const CaloCell* thisCell)
397 {
398 
399  // SLOW! Can we move to directly work with iterators in future?
400 
401  // We have to use non-const iterators so that we are allowed to modify the
402  // cell weights
403  CaloClusterCellLink* theCells = thisCluster->getOwnCellLinks();
404 
405  CaloClusterCellLink::iterator itCell = theCells->begin();
406  CaloClusterCellLink::iterator endCell = theCells->end();
407  for (; itCell != endCell; ++itCell) {
408  const CaloCell* pCell = (*itCell);
409  if (pCell == thisCell) { // Pointer comparison!
410  return itCell;
411  }
412  }
413 
414  // if no match is found then return end of container
415  return endCell;
416 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
xAOD::CaloCluster_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: CaloCluster_v1.cxx:256
eflowCellSubtractionFacilitator::getTotalEnergy
static double getTotalEnergy(const std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters)
Definition: eflowCellSubtractionFacilitator.cxx:60
CaloClusterKineHelper.h
xAOD::CaloCluster_v1::rawE
flt_t rawE() const
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
eflowCellList::reorderWithoutLayers
void reorderWithoutLayers()
Definition: eflowCellList.cxx:72
eflowCellSubtractionFacilitator::subtractRings
bool subtractRings(eflowRingSubtractionManager &ringSubtractionManager, const std::pair< eflowCaloENUM, short > &ring, double &eSubtracted, const double eExpect, eflowCellList &orderedCells, std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters, bool &annFlag, eflowRecTrack &theTrack, const bool &addCPData) const
Definition: eflowCellSubtractionFacilitator.cxx:178
eflowCellSubtractionFacilitator::subtractReorderedCells
static bool subtractReorderedCells(std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters, double eSubtracted, const double eExpect, eflowCellList &orderedCells, eflowRecTrack &theTrack, const bool &addCPData)
Definition: eflowCellSubtractionFacilitator.cxx:293
eflowCellList::deleteFromList
void deleteFromList(CellIt &start, CellIt &end)
Definition: eflowCellList.h:71
eflowCellSubtractionFacilitator::subtractCaloCell
static bool subtractCaloCell(double &eSubtracted, const double eExpect, xAOD::CaloCluster *cluster, const CaloCell *cell, eflowRecTrack &theTrack, const bool &addCPData)
Definition: eflowCellSubtractionFacilitator.cxx:251
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
PFRunESDtoAOD_TruthCheating_mc20e.addCPData
addCPData
Definition: PFRunESDtoAOD_TruthCheating_mc20e.py:15
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
eflowCellSubtractionFacilitator::subtractPartialRings
void subtractPartialRings(std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters, CellIt beginRing, CellIt endRing, double targetRingEnergy, double eRing, eflowRecTrack &theTrack, const bool &addCPData) const
Definition: eflowCellSubtractionFacilitator.cxx:118
eflowRingSubtractionManager::rankBegin
std::map< double, RingId >::const_iterator rankBegin() const
Definition: eflowRingSubtractionManager.h:44
skel.it
it
Definition: skel.GENtoEVGEN.py:396
CaloCell.h
eflowCellList::end
CellIt end()
Definition: eflowCellList.h:57
eflowRingSubtractionManager::fudgeStdDev
double fudgeStdDev() const
Definition: eflowRingSubtractionManager.h:38
eflowCellList::begin
CellIt begin()
Definition: eflowCellList.h:56
eflowCellList
Concrete class derived class from pure virtual eflowAbstractCellList.
Definition: eflowCellList.h:42
eflowRecTrack::addSubtractedCaloCell
void addSubtractedCaloCell(ElementLink< CaloCellContainer > theCellLink, const double &weight)
Definition: eflowRecTrack.h:115
eflowCellSubtractionFacilitator::annihilateClusters
static void annihilateClusters(std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters, bool &annFlag, eflowRecTrack &theTrack, const bool &addCPData)
Definition: eflowCellSubtractionFacilitator.cxx:96
eflowRecTrack
This class extends the information about a xAOD::Track.
Definition: eflowRecTrack.h:46
eflowCellSubtractionFacilitator::eflowCellSubtractionFacilitator
eflowCellSubtractionFacilitator()
Definition: eflowCellSubtractionFacilitator.cxx:19
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
xAOD::CaloCluster_v1::setRawE
void setRawE(flt_t)
Set Energy for signal state UNCALIBRATED.
Definition: CaloCluster_v1.cxx:284
xAOD::CaloCluster_v1::removeCell
bool removeCell(const CaloCell *ptr)
Method to remove a cell to the cluster (slow!) (Beware: Kinematics not updated!)
Definition: CaloCluster_v1.cxx:923
xAOD::CaloCluster_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: CaloCluster_v1.cxx:251
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
eflowCellSubtractionFacilitator::getRingsEnergy
static double getRingsEnergy(std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters, CellIt beginRing, CellIt endRing)
Definition: eflowCellSubtractionFacilitator.cxx:71
eflowRingSubtractionManager::fudgeMean
double fudgeMean() const
Definition: eflowRingSubtractionManager.h:37
xAOD::CaloCluster_v1::setRawEta
void setRawEta(flt_t)
Set for signal state UNCALIBRATED.
Definition: CaloCluster_v1.cxx:289
eflowCellList::eraseList
void eraseList()
Definition: eflowCellList.h:76
eflowCellSubtractionFacilitator::subtractCells
double subtractCells(eflowRingSubtractionManager &ringSubtractionManager, eflowRecTrack &theTrack, xAOD::CaloCluster *tracksClus, eflowCellList &orderedCells, bool &annFlag, const bool &addCPData) const
Definition: eflowCellSubtractionFacilitator.cxx:24
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
eflowRingSubtractionManager
This stores information, a rank and ring thickness, about cell rings in an ordered way.
Definition: eflowRingSubtractionManager.h:31
eflowRecTrack::getTrack
const xAOD::TrackParticle * getTrack() const
Definition: eflowRecTrack.h:54
eflowCellSubtractionFacilitator.h
eflowCellSubtractionFacilitator::updateClusterKinematics
static void updateClusterKinematics(std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters)
Definition: eflowCellSubtractionFacilitator.cxx:38
xAOD::TrackParticle_v1::e
virtual double e() const override final
The total energy of the particle.
Definition: TrackParticle_v1.cxx:109
xAOD::CaloCluster_v1::setCalE
void setCalE(flt_t)
Set Energy for signal state CALIBRATED.
Definition: CaloCluster_v1.cxx:306
eflowCellSubtractionFacilitator::subtractFullRings
void subtractFullRings(std::vector< std::pair< xAOD::CaloCluster *, bool >> &tracksClusters, CellIt beginRing, CellIt endRing, eflowRecTrack &theTrack, const bool &addCPData) const
Definition: eflowCellSubtractionFacilitator.cxx:151
CellIt
std::map< eflowCellPosition, std::vector< std::pair< const CaloCell *, int > > >::iterator CellIt
Definition: eflowAbstractCellList.h:25
eflowCellList::mapSize
int mapSize()
Definition: eflowCellList.h:70
eflowCalo::LAYER
LAYER
Definition: eflowCaloRegions.h:36
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
xAOD::CaloCluster_v1::getOwnCellLinks
CaloClusterCellLink * getOwnCellLinks()
Get a pointer to the owned CaloClusterCellLink object (non-const version)
Definition: CaloCluster_v1.h:762
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
eflowCellList::getLowerBound
CellIt getLowerBound(eflowCaloENUM layer, double r)
Definition: eflowCellList.h:59
xAOD::CaloCluster_v1::e
virtual double e() const
The total energy of the particle.
Definition: CaloCluster_v1.cxx:265
eflowRingSubtractionManager::rankEnd
std::map< double, RingId >::const_iterator rankEnd() const
Definition: eflowRingSubtractionManager.h:45
xAOD::CaloCluster_v1::setRawPhi
void setRawPhi(flt_t)
Set for signal state UNCALIBRATED.
Definition: CaloCluster_v1.cxx:294
eflowCellSubtractionFacilitator::getCellIterator
static CaloClusterCellLink::iterator getCellIterator(xAOD::CaloCluster *thisCluster, const CaloCell *thisCell)
Definition: eflowCellSubtractionFacilitator.cxx:394
eflowRingSubtractionManager::ringThickness
double ringThickness(eflowCaloENUM layer) const
Definition: eflowRingSubtractionManager.h:47