ATLAS Offline Software
Loading...
Searching...
No Matches
RingerReFex.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5/*******************************************************
6 * Author: Denis Damazio
7 * Revision
8 * Joao Victor Pinto, jodafons@cern.ch
9 * werner freund, wsfreund@cern.ch
10 *
11 * Implements the RingerReFex (3nd revision).
12 *******************************************************/
13
14#include <vector>
15#include <map>
16#include <cmath>
17#include <numeric>
26#include "CaloDetDescr/CaloDetDescrElement.h"
30using namespace Monitored;
31
32
33
34
36
37RingerReFex::RingerReFex(const std::string& type, const std::string& name, const IInterface* parent)
38 : IReAlgToolCalo(type, name, parent)
39{}
40
42
44
45 if((m_etaBins.size() < 2) || (m_etaBins.size()%2 != 0)){
46 ATH_MSG_FATAL( "Wrong eta range configuration. Size must be equal or more than two." );
47 return true;
48 }
49 return false;
50}
51
53
55{
56
57 if (IReAlgToolCalo::initialize().isFailure()) {
58 ATH_MSG_FATAL( "Could not initialize base tool IReAlgToolCalo." );
59 return StatusCode::FAILURE;
60 }
61
63 return StatusCode::FAILURE;
64 }
65
66 ATH_CHECK( m_ringerContainerKey.initialize() );
67 ATH_CHECK( m_clusterContainerKey.initialize() );
68 ATH_CHECK( m_noiseCDOKey.initialize() );
69
70 if (!m_monTool.empty()){
71 ATH_MSG_DEBUG("Retrieving monTool");
72 CHECK(m_monTool.retrieve());
73 }else{
74 ATH_MSG_INFO("No monTool configured. NO MONITORING");
75 }
76
77
78 ATH_MSG_DEBUG( "Ringer algorithm initialization completed successfully." );
79 ATH_MSG_DEBUG( "User parameters are: " );
80 ATH_MSG_DEBUG( "Using Global Center : " << m_globalCenter );
81 ATH_MSG_DEBUG( "Using Tile cells : " << m_useTile );
82 ATH_MSG_DEBUG( "Search Window in Eta : " << m_etaSearchWindowSize );
83 ATH_MSG_DEBUG( "Search Window in Phi : " << m_phiSearchWindowSize );
84 ATH_MSG_DEBUG( "Dumping cells info : " << m_dumpCells );
85 ATH_MSG_DEBUG( "Building Rings with noise factor : " << m_doNoiseThrRings );
86 ATH_MSG_DEBUG( "Building Rings with Noise Factor Constant: " << m_noiseFactor );
87
88 return StatusCode::SUCCESS;
89}
90
91
92
93StatusCode RingerReFex::prepareRinger(std::vector<RingerReFex::RingSet>& vec_rs,
94 const xAOD::TrigEMCluster& emCluster,
95 const IRoiDescriptor& roi,
96 const EventContext& context) const{
97
99 const CaloNoise* noiseCDO=*noiseHdl;
100 for (unsigned rs = 0; rs < m_nRings.size(); ++rs) {
101
102 auto obj = RingerReFex::RingSet( m_nRings[rs],
103 m_deltaEta[rs],
104 m_deltaPhi[rs],
107 m_samples[rs],
111 vec_rs.push_back( obj );
112 }
113
114 std::vector<const CaloCell*> vec_tile_cells;
115 // Get all cells for the Tile calorimeter
116 std::vector<const TileCell*> sel;
117 std::vector<const TileCell*>::const_iterator it, itBegin, itEnd;
118
119 if( m_dataSvc->loadCollections( context, roi, sel ).isFailure() ){
120 ATH_MSG_ERROR( "Error retrieving TileCalorimeter cells!" );
121 return StatusCode::FAILURE;
122 }
123
124 itBegin = sel.begin();
125 itEnd = sel.end();
126 for(it = itBegin; it != itEnd; ++it)
127 {
128 if(!*it) continue;
129 vec_tile_cells.push_back(static_cast<const CaloCell *>(*it));
130 }
131
132 // This is the main loop
133 for( auto& rs : vec_rs ){
134
135 const CaloCell* hotCell = nullptr;
136 double ehot=-999e30;
137
138 for ( auto det : rs.detectors() ){
139
140 DETID det_id= static_cast<DETID>(det.first);
141 int sampling = det.second;
142
143 if( det_id == TILE ){
144
145 for (std::vector<const CaloCell *>::const_iterator it = vec_tile_cells.begin(); it != vec_tile_cells.end(); ++it)
146 {
147 if( !rs.isValid(*it) ) continue;
148
149 rs.push_back(*it);
150 if( !m_globalCenter ){
151 if( maxCell( *it, ehot, emCluster.eta(), emCluster.phi() ) )
152 hotCell=*it;
153 }
154 }
155
156
157 }else{// TTEM, TTHEC, FCALEM and FCALHAD
158
159 // Load all cells
162 if( m_dataSvc->loadCollections( context, roi, det_id, sampling, sel ).isFailure() )
163 {
164 ATH_MSG_ERROR( "Failure while trying to retrieve cell information for the "<< det_id <<" calorimeter." );
165 return StatusCode::FAILURE;
166 }
167
168 itBegin = sel.begin();
169 itEnd = sel.end();
170
171 // Loop over all LAr cells
172 // Append all valid cells and search the hottest cell
173 for(it = itBegin; it != itEnd; ++it)
174 {
175 if(!*it) continue;
176 // LAr object to CaloCell
177 const CaloCell *it_tmp = static_cast<const CaloCell*>(*it);
178
179 // Check if the current cells is allow into this rs
180 if( !rs.isValid( it_tmp ) ) continue;
181 rs.push_back(it_tmp);
182
183 if( !m_globalCenter ){
184 if( maxCell( *it, ehot, emCluster.eta(), emCluster.phi() ) )
185 hotCell=*it;
186 }
187 }
188
189 }// Is TILE?
190
191 }// Loop over all det configs
192
193
194 // Use all Tile cells in cache
195 if (m_globalCenter || !hotCell) {
196 rs.buildRings( emCluster.eta(), emCluster.phi(),noiseCDO,m_noiseFactor,m_doNoiseThrRings);
197 }else {
198 rs.buildRings( hotCell->eta(), hotCell->phi(),noiseCDO,m_noiseFactor,m_doNoiseThrRings);
199 }
200
201 }// Loop over all ringer sets
202 return StatusCode::SUCCESS;
203
204}
205
207
209 const IRoiDescriptor& roi,
210 const CaloDetDescrElement*& ,
211 const EventContext& context) const
212{
213
214
215 auto total_time = Monitored::Timer("TIME_total");
216 auto load_cells_time = Monitored::Timer("TIME_load_cells");
217 auto mon = Monitored::Group(m_monTool, total_time, load_cells_time);
218
219 total_time.start();
220
223
224 ATH_CHECK( ringsCollection.record( std::make_unique<xAOD::TrigRingerRingsContainer>(),
225 std::make_unique<xAOD::TrigRingerRingsAuxContainer>() ) );
226
227
228
229 // Check if the cluster is in the Eta region
230 bool accept=false;
231 for(unsigned i=0; i<m_etaBins.size();i+=2){
232 if((std::abs(emCluster.eta()) > m_etaBins[i]) && (std::abs(emCluster.eta()) <= m_etaBins[i+1])) accept=true;
233 }
234
235
236 if(!accept){
237 auto dummyRinger = new xAOD::TrigRingerRings();
238 ringsCollection->push_back( dummyRinger );
239 return StatusCode::SUCCESS;
240 }
241
242
243 std::vector<RingerReFex::RingSet> vec_rs;
244 load_cells_time.start();
245 ATH_CHECK(prepareRinger(vec_rs,emCluster,roi,context));
246 load_cells_time.stop();
247
248 std::vector<float> ref_rings;
249 for (std::vector<RingerReFex::RingSet>::iterator it=vec_rs.begin(); it!=vec_rs.end(); ++it)
250 {
251 auto rings = it->rings();
252 ref_rings.insert(ref_rings.end(), rings.begin(), rings.end());
253 }
254
255 auto ptrigRingerRings= new xAOD::TrigRingerRings();
256 ringsCollection->push_back( ptrigRingerRings );
257 ptrigRingerRings->setRings(ref_rings);
258 //ptrigRingerRings->auxdecor<int>("type") = 1;
259 if (m_dumpCells){
260 std::vector<float> cells_eta;
261 std::vector<float> cells_et;
262 std::vector<float> cells_phi;
263 std::vector<int> cells_sampling;
264 std::vector<int> cells_size;
265 std::vector<double> rings_sum;
266 std::vector<int> cells_id;
267 std::vector<float> cells_gain;
268
269 for( auto& rs : vec_rs )
270 rs.fill_cells_info(cells_eta, cells_phi, cells_et, cells_sampling, cells_size, rings_sum, cells_id, cells_gain);
271
272 static const SG::Decorator< std::vector<float> > cells_etaDec("cells_eta");
273 static const SG::Decorator< std::vector<float> > cells_etDec("cells_et");
274 static const SG::Decorator< std::vector<float> > cells_phiDec("cells_phi");
275 static const SG::Decorator< std::vector<int> > cells_samplingDec("cells_sampling");
276 static const SG::Decorator< std::vector<int> > cells_sizeDec("cells_size");
277 static const SG::Decorator< std::vector<int> > cells_idDec("cells_id");
278 static const SG::Decorator< std::vector<float> > cells_gainDec("cells_gain");
279 static const SG::Decorator< std::vector<double> > asym_rings_sumDec("asym_rings_sum");
280 static const SG::Decorator< std::vector<double> > rings_sumDec("rings_sum");
281 cells_etaDec(*ptrigRingerRings) = std::move(cells_eta);
282 cells_etDec(*ptrigRingerRings) = std::move(cells_et);
283 cells_phiDec(*ptrigRingerRings) = std::move(cells_phi);
284 cells_samplingDec(*ptrigRingerRings) = std::move(cells_sampling);
285 cells_sizeDec(*ptrigRingerRings) = std::move(cells_size);
286 cells_idDec(*ptrigRingerRings) = std::move(cells_id);
287 cells_gainDec(*ptrigRingerRings) = std::move(cells_gain);
288
289 if (m_doQuarter[0]) asym_rings_sumDec(*ptrigRingerRings) = std::move(rings_sum);
290 else rings_sumDec(*ptrigRingerRings) = std::move(rings_sum);
291 }
292
294 ptrigRingerRings->setEmClusterLink( clusLink );
295
296
297 if(msgLvl(MSG::DEBUG))
298 printRings(vec_rs, emCluster);
299
300 total_time.stop();
301 return StatusCode::SUCCESS;
302}
303
304
306void RingerReFex::RingSet::fill_cells_info(std::vector<float> &cells_eta, std::vector<float> &cells_phi, std::vector<float> &cells_et, std::vector<int> &cells_sampling, std::vector<int> &cells_size, std::vector<double> &rings_sum, std::vector<int> &cells_id, std::vector<float> &cells_gain ){
307 for (std::vector<const CaloCell*>::const_iterator it=m_cells.begin(); it!=m_cells.end(); ++it) {
308 cells_eta.push_back((*it)->eta());
309 cells_phi.push_back((*it)->phi());
310 cells_et.push_back((*it)->energy());
311 auto sampling = (*it)->caloDDE()->getSampling();
312 cells_sampling.push_back((int) sampling);
313 cells_id.push_back((*it)->ID().get_identifier32().get_compact());
314 cells_gain.push_back((*it)->gain());
315 }
316 cells_size.push_back(m_cells.size());
317 double sum = 0;
318 for (auto ring : m_rings) sum+=ring;
319 rings_sum.push_back(sum);
320}
321
322inline bool RingerReFex::maxCell ( const CaloCell* cell, double &energy, const double eta_ref, const double phi_ref ) const
323{
324 const double etamin = eta_ref - (0.5 * m_etaSearchWindowSize);
325 const double etamax = eta_ref + (0.5 * m_etaSearchWindowSize);
326 const double phimin = phi_ref - (0.5 * m_phiSearchWindowSize);
327 const double phimax = phi_ref + (0.5 * m_phiSearchWindowSize);
328
329 //are we, possibly at the wrap-around region for phi?
330 bool wrap = Ringer::check_wrap_around(phi_ref, false);
331 bool reverse_wrap = Ringer::check_wrap_around(phi_ref, true);
332
333 if(!cell) return false;
334 double this_eta = cell->eta();
335 double this_phi = cell->phi();
336 if (this_eta > etamin && this_eta < etamax){
337 double phi_use = this_phi; //use this value for phi (wrap protection)
338 if (wrap) phi_use = Ringer::fix_wrap_around(phi_use, false);
339 if (reverse_wrap) phi_use = Ringer::fix_wrap_around(phi_use, true);
340 if (phi_use > phimin && phi_use < phimax){
341 if (cell->energy() > energy) {
342 energy = cell->energy();
343 return true;
344 }
345 }
346 }
347 return false;
348}
349
350
352
353
354void RingerReFex::printRings( std::vector<RingSet> &vec_rs, const xAOD::TrigEMCluster &cl ) const
355{
356 ATH_MSG_INFO("--------------- Cluster Information (2) ----------------");
357
358 //auto cl = ring->emCluster();
359 ATH_MSG_INFO("et = "<< cl.et() << " eta = " << cl.eta() << " roiword = " << cl.RoIword());
360
361
362 for(unsigned rs=0; rs<vec_rs.size(); ++rs){
363 ATH_MSG_INFO("RingSet number is: " << rs);
364 ATH_MSG_INFO("search eta window: " << m_etaSearchWindowSize << " search phi window: " << m_phiSearchWindowSize);
365 ATH_MSG_INFO("deta: " << m_deltaEta[rs] << " dphi: " << m_deltaPhi[rs]);
366 ATH_MSG_INFO("Pattern has size equal than: " << vec_rs.at(rs).rings().size());
367
368 double tot=0;
369 for(unsigned i=0;i<vec_rs.at(rs).rings().size();++i){
370 tot+=vec_rs.at(rs).rings()[i];
371 ATH_MSG_INFO(" Ring " << i << " energy: " << vec_rs.at(rs).rings()[i] << " MeVs.");
372 }
373 ATH_MSG_INFO( "RingSet = " << rs << " Total energy = " << tot );
374 }// Loop over ringSets
375 ATH_MSG_INFO("---------------- End of information -----------------");
376
377}
378
381
382
383RingerReFex::RingSet::RingSet ( unsigned int maxRings, double deta, double dphi,
384 const std::vector<int> &detectors,
385 const std::vector<int> &samplings,
386 const std::vector<int> &samples,
387 bool doQuarter,
388 bool doEtaAxesDivision,
389 bool doPhiAxesDivision
390 )
391 : m_deltaEta(deta),
392 m_deltaPhi(dphi),
394 m_samplings(samplings),
395 m_samples(samples),
396 m_doQuarter(doQuarter),
397 m_doEtaAxesDivision(doEtaAxesDivision),
398 m_doPhiAxesDivision(doPhiAxesDivision)
399{
400
401 if(doQuarter){
402 if(doEtaAxesDivision && doPhiAxesDivision){
403 m_rings.resize( (maxRings-1)*4 + 1 );
404 }else{
405 m_rings.resize( (maxRings-1)*2 + 2 );
406 }
407 }else{
408 m_rings.resize( maxRings );
409 }
410
411
412}
413
415
416const std::vector< std::pair< int, int > > RingerReFex::RingSet::detectors() const
417{
418 std::vector< std::pair<int,int> > vec;
419 for ( unsigned i=0; i<m_detectors.size(); ++i )
420 vec.push_back( std::make_pair( m_detectors[i], m_samplings[i] ) );
421 return vec;
422}
423
425
427{
428 for (std::vector<int>::const_iterator it=m_samples.begin(); it!=m_samples.end(); ++it)
429 {
430 if ( cell->caloDDE()->getSampling() == static_cast<CaloSampling::CaloSample>(*it) )
431 return true;
432
433 }
434 return false;
435}
436
438
439const std::vector<double>& RingerReFex::RingSet::rings() const
440{
441 return m_rings;
442}
443
445
447 m_cells.push_back(cell);
448}
449
451
453 m_rings.clear();
454 m_cells.clear();
455}
456
458
459void RingerReFex::RingSet::buildRings( const double eta_center, const double phi_center,const CaloNoise* noiseCDO, const double noiseFactor, const bool doNoiseThrRings)
460{
461 // cache cosh eta value
462 const double cosh_eta = std::cosh(eta_center);
463
464 //are we, possibly at the wrap-around region for phi?
465 const bool wrap = Ringer::check_wrap_around(phi_center, false);
466 const bool reverse_wrap = Ringer::check_wrap_around(phi_center, true);
467
468 // Loop over all cells
469 for (std::vector<const CaloCell*>::const_iterator it=m_cells.begin(); it!=m_cells.end(); ++it) {
470
471 if( !(*it) )
472 continue;
473
474 double phi_use = (*it)->phi(); //use this value for phi (wrap protection)
475 if (wrap) phi_use = Ringer::fix_wrap_around(phi_use, false);
476 else if (reverse_wrap) phi_use = Ringer::fix_wrap_around(phi_use, true);
477
478 // Measure delta eta and delta phi to find out on which ring we are
479 const double deltaEta = ((*it)->eta() - eta_center)/m_deltaEta;
480 const double deltaPhi = (phi_use - phi_center)/m_deltaPhi;
481
482 // ring index
483 unsigned int i = 0;
484
485
486 const double deltaGreater = std::max(std::abs(deltaEta), std::abs(deltaPhi));
487 i = static_cast<unsigned int>( std::floor (deltaGreater) );
488 // Certain compilers have problems with round(), so let's do it ourselves
489 if ( (deltaGreater - (double) i) > 0.5) ++i;
490
491 if(m_doQuarter){ // only for i>0, the central ring is not divided
492 bool etaPositive = ( deltaEta > 0 )?true:false;
493 bool phiPositive = ( deltaPhi > 0)?true:false;
494 // i > 0 (not central ring)
495 // Correct position in which we shall fill the ring:
497 if (phiPositive){
498 if (etaPositive){
499 i = (i * 4) - 3;
500 }
501 else{
502 i = (i * 4) - 2;
503 }
504 }
505 else if (etaPositive){
506 i = (i * 4) - 1;
507 }
508 else{
509 i = (i * 4);
510 }
511 } else if ((m_doEtaAxesDivision || m_doPhiAxesDivision) && i){
513 i = (etaPositive)?(i * 2):((i * 2) - 1);
514 }
515 else {
516 i = (phiPositive)?(i * 2):((i * 2) - 1);
517 }
518 }
519 }// Do quarter?
520
521 // Fill
522 if (i < m_rings.size()) {
523 if (doNoiseThrRings){
524 float noiseSigma = noiseCDO->getNoise((*it)->ID(),(*it)->gain());
525 if ( (*it)->energy() > noiseSigma*noiseFactor){
526 m_rings[i] += (*it)->energy() / cosh_eta;
527 }
528 }else{ // Building Rings with sigmaNoise constraint? / in the constructor , rings already resized with your respect rings quantities
529 m_rings[i] += (*it)->energy() / cosh_eta;
530 }
531 }
532 }// Loop over each
533
534}
535
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
std::vector< size_t > vec
#define CHECK(...)
Evaluate an expression and check for errors.
Helper class to provide type-safe access to aux data.
static Double_t rs
Header file to be included by clients of the Monitored infrastructure.
DETID
An enum to define subdetector names.
Definition RegSelEnums.h:23
@ TILE
Definition RegSelEnums.h:30
size_t size() const
Number of registered mappings.
#define maxCell
bool msgLvl(const MSG::Level lvl) const
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
virtual double phi() const override final
get phi (through CaloDetDescrElement)
Definition CaloCell.h:375
virtual double eta() const override final
get eta (through CaloDetDescrElement)
Definition CaloCell.h:382
This class groups all DetDescr information related to a CaloCell.
float getNoise(const IdentifierHash h, const int gain) const
Accessor by IdentifierHash and gain.
Definition CaloNoise.h:35
IReAlgToolCalo(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
ServiceHandle< ITrigCaloDataAccessSvc > m_dataSvc
virtual StatusCode initialize() override
Describes the API of the Region of Ineterest geometry.
Group of local monitoring quantities and retain correlation when filling histograms
A monitored timer.
void push_back(const CaloCell *)
=================================================================================
const std::vector< double > & rings() const
=================================================================================
std::vector< double > m_rings
Definition RingerReFex.h:55
std::vector< int > m_samples
Definition RingerReFex.h:51
void buildRings(const double eta_hot, const double phi_hot, const CaloNoise *noiseCDO, const double m_noiseFactor, const bool m_doNoiseThrRings)
=================================================================================
void clear()
=================================================================================
std::vector< int > m_detectors
Definition RingerReFex.h:51
const std::vector< std::pair< int, int > > detectors() const
=================================================================================
bool isValid(const CaloCell *) const
=================================================================================
RingSet(unsigned int maxRings, double deta, double dphi, const std::vector< int > &detectors, const std::vector< int > &samplings, const std::vector< int > &samples, bool doQuarter, bool doEtaAxesDivision, bool doPhiAxesDivision)
void fill_cells_info(std::vector< float > &cells_eta, std::vector< float > &cells_phi, std::vector< float > &cells_et, std::vector< int > &cells_sampling, std::vector< int > &cells_size, std::vector< double > &rings_sum, std::vector< int > &cells_id, std::vector< float > &cells_gain)
=================================================================================
std::vector< const CaloCell * > m_cells
Definition RingerReFex.h:54
std::vector< int > m_samplings
Definition RingerReFex.h:51
Gaudi::Property< std::vector< float > > m_deltaEta
Definition RingerReFex.h:96
SG::ReadHandleKey< xAOD::TrigEMClusterContainer > m_clusterContainerKey
Definition RingerReFex.h:91
Gaudi::Property< double > m_phiSearchWindowSize
Definition RingerReFex.h:95
Gaudi::Property< std::vector< bool > > m_doQuarter
Gaudi::Property< bool > m_dumpCells
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
Definition RingerReFex.h:92
bool configurationInvalid()
=================================================================================
virtual StatusCode initialize() override
=================================================================================
Gaudi::Property< bool > m_useTile
RingerReFex(const std::string &type, const std::string &name, const IInterface *parent)
=================================================================================
ToolHandle< GenericMonitoringTool > m_monTool
Definition RingerReFex.h:89
Gaudi::Property< std::vector< float > > m_deltaPhi
Definition RingerReFex.h:97
Gaudi::Property< bool > m_globalCenter
Gaudi::Property< std::vector< bool > > m_doEtaAxesDivision
Gaudi::Property< std::vector< std::vector< int > > > m_samplings
StatusCode prepareRinger(std::vector< RingerReFex::RingSet > &vec_rs, const xAOD::TrigEMCluster &emCluster, const IRoiDescriptor &roi, const EventContext &context) const
Gaudi::Property< double > m_noiseFactor
bool maxCell(const CaloCell *cell, double &energy, const double eta_ref, const double phi_ref) const
Gaudi::Property< std::vector< bool > > m_doPhiAxesDivision
Gaudi::Property< std::vector< float > > m_etaBins
Definition RingerReFex.h:99
SG::WriteHandleKey< xAOD::TrigRingerRingsContainer > m_ringerContainerKey
Definition RingerReFex.h:90
void printRings(std::vector< RingSet > &, const xAOD::TrigEMCluster &) const
=================================================================================
Gaudi::Property< bool > m_doNoiseThrRings
Gaudi::Property< std::vector< std::vector< int > > > m_detectors
Gaudi::Property< std::vector< unsigned int > > m_nRings
Definition RingerReFex.h:98
Gaudi::Property< double > m_etaSearchWindowSize
Definition RingerReFex.h:94
Gaudi::Property< std::vector< std::vector< int > > > m_samples
virtual StatusCode execute(xAOD::TrigEMCluster &emCluster, const IRoiDescriptor &roi, const CaloDetDescrElement *&, const EventContext &context) const override
=================================================================================
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
float eta() const
get Eta (calibrated)
float phi() const
get Phi (calibrated)
Generic monitoring tool for athena components.
bool check_wrap_around(const double phi_center, const bool reverse_wrap)
Helper function to identify wrap around cases.
Definition PhiComps.h:17
double fix_wrap_around(const double phi_value, const bool reverse_wrap)
Helper function to fix wrap around cases.
Definition PhiComps.h:26
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
Definition AuxElement.h:576
TrigRingerRings_v2 TrigRingerRings
Define the latest version of the TrigRingerRings class.
TrigEMCluster_v1 TrigEMCluster
Define the latest version of the trigger EM cluster class.