ATLAS Offline Software
Loading...
Searching...
No Matches
eflowCellSubtractionFacilitator Class Reference

This class deals with the removal of calorimeter cells from calorimeter clusters. More...

#include <eflowCellSubtractionFacilitator.h>

Inheritance diagram for eflowCellSubtractionFacilitator:
Collaboration diagram for eflowCellSubtractionFacilitator:

Public Member Functions

 eflowCellSubtractionFacilitator ()
double subtractCells (eflowRingSubtractionManager &ringSubtractionManager, eflowRecTrack &theTrack, xAOD::CaloCluster *tracksClus, eflowCellList &orderedCells, bool &annFlag, bool addCPData) const
double subtractCells (eflowRingSubtractionManager &ringSubtractionManager, eflowRecTrack &theTrack, std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClus, eflowCellList &orderedCells, bool &annFlag, bool addCPData) const
void setLevel (MSG::Level lvl)
 Change the current logging level.
Functions providing the same interface as AthMessaging
bool msgLvl (const MSG::Level lvl) const
 Test the output level of the object.
MsgStream & msg () const
 The standard message stream.
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream.

Private Member Functions

void subtractPartialRings (std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, CellIt beginRing, CellIt endRing, double targetRingEnergy, double eRing, eflowRecTrack &theTrack, bool addCPData) const
void subtractFullRings (std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, CellIt beginRing, CellIt endRing, eflowRecTrack &theTrack, bool addCPData) const
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, bool addCPData) const
void initMessaging () const
 Initialize our message level and MessageSvc.

Static Private Member Functions

static CaloClusterCellLink::iterator getCellIterator (xAOD::CaloCluster *thisCluster, const CaloCell *thisCell)
static void updateClusterKinematics (std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters)
static void updateClusterKinematics (xAOD::CaloCluster *)
static double getTotalEnergy (const std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters)
static double getRingsEnergy (std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, CellIt beginRing, CellIt endRing)
static bool subtractCaloCell (double &eSubtracted, const double eExpect, xAOD::CaloCluster *cluster, const CaloCell *cell, eflowRecTrack &theTrack, bool addCPData)
static void annihilateClusters (std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, bool &annFlag, eflowRecTrack &theTrack, bool addCPData)
static bool subtractReorderedCells (std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, double eSubtracted, const double eExpect, eflowCellList &orderedCells, eflowRecTrack &theTrack, bool addCPData)

Private Attributes

std::string m_nm
 Message source name.
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels).
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer.
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level.
std::atomic_flag m_initialized ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
 Messaging initialized (initMessaging).

Detailed Description

This class deals with the removal of calorimeter cells from calorimeter clusters.

The main entry points are the subtractCells methods which find out how much energy they should subtract from the eflowRingSubtractionManager. The eflowRingSubtractionManager also contains a list of calorimeter cell rings (a ring is a list of calorimeter cells, in a given calorimeter layer, between two radii r1 and r2). The cell information is stored in the eflowCellList. Rings are removed one by one in the order they are stored until the summed cell ring energy is >= to the expected energy deposit from the track in the calorimeter.

Definition at line 36 of file eflowCellSubtractionFacilitator.h.

Constructor & Destructor Documentation

◆ eflowCellSubtractionFacilitator()

eflowCellSubtractionFacilitator::eflowCellSubtractionFacilitator ( )

Definition at line 19 of file eflowCellSubtractionFacilitator.cxx.

20 : AsgMessaging("eflowCellSubtractionFacilitator")
21{}
AsgMessaging(const std::string &name)
Constructor with a name.

Member Function Documentation

◆ annihilateClusters()

void eflowCellSubtractionFacilitator::annihilateClusters ( std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClusters,
bool & annFlag,
eflowRecTrack & theTrack,
bool addCPData )
staticprivate

Definition at line 95 of file eflowCellSubtractionFacilitator.cxx.

98{
99 for (auto& thisPair : tracksClusters) {
100 xAOD::CaloCluster* thisCluster = thisPair.first;
101 CaloClusterCellLink* theCellLink = thisCluster->getOwnCellLinks();
102 CaloClusterCellLink::iterator theFirstCell = theCellLink->begin();
103 CaloClusterCellLink::iterator theLastCell = theCellLink->end();
104
105 //We don't advance the iterator, theCell, because we call removeCell. This avoids issues with
106 //invalid iterators that would otherwise occur and cause only a subset of cells to be processed.
107 //We also have to reset the lastCell iterator after each call to ensure the loop exits at the end,
108 //instead of being stuck in an infinite loop.
109 for (; theFirstCell != theLastCell;){
110 if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theFirstCell.index()),theFirstCell.weight());
111 thisCluster->removeCell(*theFirstCell);
112 theLastCell = theCellLink->end();
113 }
114 thisCluster->setCalE(0.0);
115 thisCluster->setRawE(0.0);
116 // set the subtracted status to true
117 thisPair.second = true;
118 }
119 annFlag = true;
120}
void addSubtractedCaloCell(ElementLink< CaloCellContainer > theCellLink, const double &weight)
void setRawE(flt_t)
Set Energy for signal state UNCALIBRATED.
CaloClusterCellLink * getOwnCellLinks()
Get a pointer to the owned CaloClusterCellLink object (non-const version).
void setCalE(flt_t)
Set Energy for signal state CALIBRATED.
bool removeCell(const CaloCell *ptr)
Method to remove a cell to the cluster (slow!) (Beware: Kinematics not updated!).
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.

◆ getCellIterator()

CaloClusterCellLink::iterator eflowCellSubtractionFacilitator::getCellIterator ( xAOD::CaloCluster * thisCluster,
const CaloCell * thisCell )
staticprivate

Definition at line 397 of file eflowCellSubtractionFacilitator.cxx.

400{
401
402 // SLOW! Can we move to directly work with iterators in future?
403
404 // We have to use non-const iterators so that we are allowed to modify the
405 // cell weights
406 CaloClusterCellLink* theCells = thisCluster->getOwnCellLinks();
407
408 CaloClusterCellLink::iterator itCell = theCells->begin();
409 CaloClusterCellLink::iterator endCell = theCells->end();
410 for (; itCell != endCell; ++itCell) {
411 const CaloCell* pCell = (*itCell);
412 if (pCell == thisCell) { // Pointer comparison!
413 return itCell;
414 }
415 }
416
417 // if no match is found then return end of container
418 return endCell;
419}

◆ getRingsEnergy()

double eflowCellSubtractionFacilitator::getRingsEnergy ( std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClusters,
CellIt beginRing,
CellIt endRing )
staticprivate

Definition at line 71 of file eflowCellSubtractionFacilitator.cxx.

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 (const std::pair<const CaloCell*, int>& thisPair : it->second) {
82 /* Loop over Cells */
83 xAOD::CaloCluster* clus = tracksClusters[thisPair.second].first;
84 CaloClusterCellLink::iterator theIterator =
86 double cellWeight = theIterator.weight();
87 eRing += thisPair.first->energy() * cellWeight;
88 }
89 }
90
91 return eRing;
92}
static CaloClusterCellLink::iterator getCellIterator(xAOD::CaloCluster *thisCluster, const CaloCell *thisCell)
std::map< eflowCellPosition, std::vector< std::pair< constCaloCell *, int > > >::iterator CellIt

◆ getTotalEnergy()

double eflowCellSubtractionFacilitator::getTotalEnergy ( const std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClusters)
staticprivate

Definition at line 60 of file eflowCellSubtractionFacilitator.cxx.

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}

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40{
42 // If user did not set an explicit level, set a default
43 if (m_lvl == MSG::NIL) {
44 m_lvl = m_imsg ?
45 static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
46 MSG::INFO;
47 }
48}
std::string m_nm
Message source name.
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
std::atomic< MSG::Level > m_lvl
Current logging level.
IMessageSvc * getMessageSvc(bool quiet=false)

◆ msg() [1/2]

MsgStream & asg::AsgMessaging::msg ( ) const
inherited

The standard message stream.

Returns
A reference to the default message stream of this object.

Definition at line 49 of file AsgMessaging.cxx.

49 {
50#ifndef XAOD_STANDALONE
51 return ::AthMessaging::msg();
52#else // not XAOD_STANDALONE
53 return m_msg;
54#endif // not XAOD_STANDALONE
55 }

◆ msg() [2/2]

MsgStream & asg::AsgMessaging::msg ( const MSG::Level lvl) const
inherited

The standard message stream.

Parameters
lvlThe message level to set the stream to
Returns
A reference to the default message stream, set to level "lvl"

Definition at line 57 of file AsgMessaging.cxx.

57 {
58#ifndef XAOD_STANDALONE
59 return ::AthMessaging::msg( lvl );
60#else // not XAOD_STANDALONE
61 m_msg << lvl;
62 return m_msg;
63#endif // not XAOD_STANDALONE
64 }

◆ msgLvl()

bool asg::AsgMessaging::msgLvl ( const MSG::Level lvl) const
inherited

Test the output level of the object.

Parameters
lvlThe message level to test against
Returns
boolean Indicting if messages at given level will be printed
true If messages at level "lvl" will be printed

Definition at line 41 of file AsgMessaging.cxx.

41 {
42#ifndef XAOD_STANDALONE
43 return ::AthMessaging::msgLvl( lvl );
44#else // not XAOD_STANDALONE
45 return m_msg.msgLevel( lvl );
46#endif // not XAOD_STANDALONE
47 }

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29{
30 m_lvl = lvl;
31}

◆ subtractCaloCell()

bool eflowCellSubtractionFacilitator::subtractCaloCell ( double & eSubtracted,
const double eExpect,
xAOD::CaloCluster * cluster,
const CaloCell * cell,
eflowRecTrack & theTrack,
bool addCPData )
staticprivate

Definition at line 254 of file eflowCellSubtractionFacilitator.cxx.

260{
261
262 CaloClusterCellLink::iterator theIterator =
264 double oldCellWeight = theIterator.weight();
265 double oldCellEnergy = cell->energy() * oldCellWeight;
266
267 if (oldCellEnergy != 0. && eSubtracted + oldCellEnergy > eExpect) {
268 /* Target cell energy is cell energy minus the energy that still needs to be
269 * subtracted */
270 double targetCellEnergy = oldCellEnergy - (eExpect - eSubtracted);
271
272 double energyWeight = targetCellEnergy / oldCellEnergy;
273 double newCellWeight = oldCellWeight * energyWeight;
274 theIterator.reweight(newCellWeight);
275 if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()), energyWeight*theIterator.weight());
276
277 eSubtracted = eExpect;
278
279 /* Update the cluster four-momenta having done the subtraction */
281
282 return true;
283
284 } else {
285 if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()),theIterator.weight());
286 cluster->removeCell(cell);
287 eSubtracted += oldCellEnergy;
288
289 /* Update the clusters having done the subtraction */
291 return false;
292 }
293}
static void updateClusterKinematics(std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters)

◆ subtractCells() [1/2]

double eflowCellSubtractionFacilitator::subtractCells ( eflowRingSubtractionManager & ringSubtractionManager,
eflowRecTrack & theTrack,
std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClus,
eflowCellList & orderedCells,
bool & annFlag,
bool addCPData ) const

Definition at line 331 of file eflowCellSubtractionFacilitator.cxx.

337{
338
339 const double trackEnergy = theTrack.getTrack()->e();
340 const double eExpect = cellSubtractionManager.fudgeMean() * trackEnergy;
341 const double sigmaEExpect =
342 cellSubtractionManager.fudgeStdDev() * trackEnergy;
343 ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: For track with trackEnergy "
344 << trackEnergy << " expect to subtract " << eExpect
345 << " with width of " << sigmaEExpect);
346
347 double eSubtracted = 0.0;
348
349 /*
350 * Ring subtraction
351 */
352 std::map<double, RingId>::const_iterator ringIt =
353 cellSubtractionManager.rankBegin();
354 std::map<double, RingId>::const_iterator ringEnd =
355 cellSubtractionManager.rankEnd();
356 for (; ringIt != ringEnd; ++ringIt) {
357 bool isFinished = subtractRings(cellSubtractionManager,
358 ringIt->second,
359 eSubtracted,
360 eExpect,
361 orderedCells,
362 tracksClusters,
363 annFlag,
364 theTrack,
365 addCPData);
366 if (isFinished) {
367 return sigmaEExpect;
368 }
369 }
370
371 /* Update the cluster four-momenta */
372 updateClusterKinematics(tracksClusters);
373
374 if (orderedCells.mapSize() <= 0 || eSubtracted >= eExpect) {
375 return sigmaEExpect;
376 }
377
378 /*
379 * Cell subtraction
380 */
381 /* Increasing dR (not by layer) for cell subtraction */
382 orderedCells.reorderWithoutLayers();
383
384 bool isFinished =
385 subtractReorderedCells(tracksClusters, eSubtracted, eExpect, orderedCells, theTrack, addCPData);
386 if (isFinished) {
387 return sigmaEExpect;
388 }
389
390 /* Update the cluster four-momenta */
391 updateClusterKinematics(tracksClusters);
392
393 return sigmaEExpect;
394}
#define ATH_MSG_DEBUG(x)
void reorderWithoutLayers()
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, bool addCPData) const
static bool subtractReorderedCells(std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, double eSubtracted, const double eExpect, eflowCellList &orderedCells, eflowRecTrack &theTrack, bool addCPData)
const xAOD::TrackParticle * getTrack() const
virtual double e() const override final
The total energy of the particle.

◆ subtractCells() [2/2]

double eflowCellSubtractionFacilitator::subtractCells ( eflowRingSubtractionManager & ringSubtractionManager,
eflowRecTrack & theTrack,
xAOD::CaloCluster * tracksClus,
eflowCellList & orderedCells,
bool & annFlag,
bool addCPData ) const

Definition at line 24 of file eflowCellSubtractionFacilitator.cxx.

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}
double subtractCells(eflowRingSubtractionManager &ringSubtractionManager, eflowRecTrack &theTrack, xAOD::CaloCluster *tracksClus, eflowCellList &orderedCells, bool &annFlag, bool addCPData) const

◆ subtractFullRings()

void eflowCellSubtractionFacilitator::subtractFullRings ( std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClusters,
CellIt beginRing,
CellIt endRing,
eflowRecTrack & theTrack,
bool addCPData ) const
private

Definition at line 155 of file eflowCellSubtractionFacilitator.cxx.

160{
161 /* Subtract full ring */
162
163 for (CellIt itRing = beginRing; itRing != endRing; ++itRing) {
164 /* Loop over Rings */
165 for (const std::pair<const CaloCell*, int>& thisPair : itRing->second) {
166 /* Loop over Cells */
167 xAOD::CaloCluster* cluster = tracksClusters[thisPair.second].first;
168 // flag this cluster as having had subtraction applied to it
169 tracksClusters[thisPair.second].second = true;
170 ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Cluster with e "
171 << cluster->e() << " is removing cell with e "
172 << thisPair.first->e());
173 CaloClusterCellLink::iterator theIterator = this->getCellIterator(cluster, thisPair.first);
174 if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()),theIterator.weight());
175 cluster->removeCell(thisPair.first);
176 }
177 }
178}
virtual double e() const
The total energy of the particle.

◆ subtractPartialRings()

void eflowCellSubtractionFacilitator::subtractPartialRings ( std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClusters,
CellIt beginRing,
CellIt endRing,
double targetRingEnergy,
double eRing,
eflowRecTrack & theTrack,
bool addCPData ) const
private

Definition at line 123 of file eflowCellSubtractionFacilitator.cxx.

130{
131 for (CellIt itRing = beginRing; itRing != endRing; ++itRing) {
132 /* Loop over Rings */
133 for (const std::pair<const CaloCell*, int>& thisPair : itRing->second) {
134 /* Loop over Cells */
135 xAOD::CaloCluster* cluster = tracksClusters[thisPair.second].first;
136 // flag this cluster as having had subtraction applied to it
137 tracksClusters[thisPair.second].second = true;
138 const CaloCell* cell = thisPair.first;
139 CaloClusterCellLink::iterator theIterator =
141 double oldCellWeight = theIterator.weight();
142 double ringWeight = targetRingEnergy / eRings;
143 const double newCellWeight = oldCellWeight * ringWeight;
144 ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Cluster with e "
145 << cluster->e()
146 << " is changing weight of cell with energy " << cell->e()
147 << " from " << oldCellWeight << " to " << newCellWeight);
148 theIterator.reweight(newCellWeight);
149 if (addCPData) theTrack.addSubtractedCaloCell(ElementLink<CaloCellContainer>("AllCalo",theIterator.index()),newCellWeight);
150 }
151 }
152}

◆ subtractReorderedCells()

bool eflowCellSubtractionFacilitator::subtractReorderedCells ( std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClusters,
double eSubtracted,
const double eExpect,
eflowCellList & orderedCells,
eflowRecTrack & theTrack,
bool addCPData )
staticprivate

Definition at line 296 of file eflowCellSubtractionFacilitator.cxx.

303{
304 CellIt itCellPosition = reorderedCells.begin();
305 CellIt endCellPosition = reorderedCells.end();
306 while (itCellPosition != endCellPosition) {
307 /* Loop cells */
308 std::vector<std::pair<const CaloCell*, int>>::iterator itEntry =
309 itCellPosition->second.begin();
310 std::vector<std::pair<const CaloCell*, int>>::iterator endEntry =
311 itCellPosition->second.end();
312 for (; itEntry != endEntry; ++itEntry) {
313 const std::pair<const CaloCell*, int> thisPair = *itEntry;
314 xAOD::CaloCluster* cluster = tracksClusters[thisPair.second].first;
315 // flag this cluster as having had subtraction applied to it
316 tracksClusters[thisPair.second].second = true;
317 const CaloCell* cell = thisPair.first;
318 bool isFinished = subtractCaloCell(eSubtracted, eExpect, cluster, cell, theTrack, addCPData);
319 if (isFinished)
320 return true;
321 }
322 /* Erase the CellPosition from the cell list */
323 CellIt tmp = itCellPosition;
324 ++itCellPosition;
325 reorderedCells.deleteFromList(tmp);
326 }
327 return false;
328}
const_iterator begin() const
const_iterator end() const
static bool subtractCaloCell(double &eSubtracted, const double eExpect, xAOD::CaloCluster *cluster, const CaloCell *cell, eflowRecTrack &theTrack, bool addCPData)

◆ subtractRings()

bool eflowCellSubtractionFacilitator::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,
bool addCPData ) const
private

Definition at line 181 of file eflowCellSubtractionFacilitator.cxx.

190{
191 /* Subtract energy from ring, return TRUE if the whole expected energy is
192 * subtracted */
193
194 const eflowCaloENUM subtLayer = ring.first;
195 const short ringNo = ring.second;
196
197 const double r1 = ringNo * cellSubtractionManager.ringThickness(subtLayer);
198 const double r2 =
199 (ringNo + 1) * cellSubtractionManager.ringThickness(subtLayer);
200
201 CellIt beginRing = orderedCells.getLowerBound(subtLayer, r1);
202 CellIt endRing = orderedCells.getLowerBound(subtLayer, r2);
203
204 /* Get total energy of Rings from beginRing to endRing */
205 double eRings = getRingsEnergy(tracksClusters, beginRing, endRing);
206
207 if (eSubtracted + eRings > eExpect) {
208 /* Subtract partial ring */
209
210 ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Subtracting partial ring, "
211 "eSubtracted, eRings and eExpect are "
212 << eSubtracted << ", " << eRings << ", " << eExpect);
213
214 /* Target ring energy is ring energy minus the energy that still needs to be
215 * subtracted */
216 double targetRingEnergy = eRings - (eExpect - eSubtracted);
217 ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: targetRingEnergy is "
218 << targetRingEnergy);
220 tracksClusters, beginRing, endRing, targetRingEnergy, eRings, theTrack, addCPData);
221 eSubtracted = eExpect;
222
223 /* Update the cluster four-momenta having done the subtraction */
224 updateClusterKinematics(tracksClusters);
225
226 return true;
227
228 } else {
229 /* Subtract full ring */
230
231 ATH_MSG_DEBUG("eflowCellSubtractionFacilitator: Subtracting full ring ");
232
233 subtractFullRings(tracksClusters, beginRing, endRing, theTrack, addCPData);
234 orderedCells.deleteFromList(beginRing, endRing);
235 eSubtracted += eRings;
236
237 /* If no energy left */
238 double eClustersOld = getTotalEnergy(tracksClusters);
239 if (std::fabs(eClustersOld - eSubtracted) < 1.0e-6 * eClustersOld) {
240 /* Annihilate clusters, clear orderedCells, and update subtracted cluster
241 * kinematics */
242 annihilateClusters(tracksClusters,annFlag, theTrack, addCPData);
243 orderedCells.eraseList();
244 updateClusterKinematics(tracksClusters);
245
246 return true;
247 }
248
249 return false;
250 }
251}
CellIt getLowerBound(eflowCaloENUM layer, double r)
void deleteFromList(CellIt &start, CellIt &end)
void subtractPartialRings(std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, CellIt beginRing, CellIt endRing, double targetRingEnergy, double eRing, eflowRecTrack &theTrack, bool addCPData) const
static double getRingsEnergy(std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, CellIt beginRing, CellIt endRing)
void subtractFullRings(std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, CellIt beginRing, CellIt endRing, eflowRecTrack &theTrack, bool addCPData) const
static double getTotalEnergy(const std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters)
static void annihilateClusters(std::vector< std::pair< xAOD::CaloCluster *, bool > > &tracksClusters, bool &annFlag, eflowRecTrack &theTrack, bool addCPData)
eflowCalo::LAYER eflowCaloENUM

◆ updateClusterKinematics() [1/2]

void eflowCellSubtractionFacilitator::updateClusterKinematics ( std::vector< std::pair< xAOD::CaloCluster *, bool > > & tracksClusters)
staticprivate

Definition at line 38 of file eflowCellSubtractionFacilitator.cxx.

40{
41 for (auto& thisPair : tracksClusters)
42 updateClusterKinematics(thisPair.first);
43}

◆ updateClusterKinematics() [2/2]

void eflowCellSubtractionFacilitator::updateClusterKinematics ( xAOD::CaloCluster * theCluster)
staticprivate

Definition at line 46 of file eflowCellSubtractionFacilitator.cxx.

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}
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.
void setRawEta(flt_t)
Set for signal state UNCALIBRATED.
flt_t rawE() const
void setRawPhi(flt_t)
Set for signal state UNCALIBRATED.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::atomic_flag m_initialized AthMessaging::ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
mutableprivateinherited

Messaging initialized (initMessaging).

Definition at line 141 of file AthMessaging.h.

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

138{ MSG::NIL };

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels).

Definition at line 132 of file AthMessaging.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.


The documentation for this class was generated from the following files: