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