26#include "CaloDetDescr/CaloDetDescrElement.h"
46 ATH_MSG_FATAL(
"Wrong eta range configuration. Size must be equal or more than two." );
58 ATH_MSG_FATAL(
"Could not initialize base tool IReAlgToolCalo." );
59 return StatusCode::FAILURE;
63 return StatusCode::FAILURE;
78 ATH_MSG_DEBUG(
"Ringer algorithm initialization completed successfully." );
88 return StatusCode::SUCCESS;
96 const EventContext& context)
const{
111 vec_rs.push_back( obj );
114 std::vector<const CaloCell*> vec_tile_cells;
116 std::vector<const TileCell*>
sel;
117 std::vector<const TileCell*>::const_iterator it, itBegin, itEnd;
119 if(
m_dataSvc->loadCollections( context, roi,
sel ).isFailure() ){
121 return StatusCode::FAILURE;
124 itBegin =
sel.begin();
126 for(it = itBegin; it != itEnd; ++it)
129 vec_tile_cells.push_back(
static_cast<const CaloCell *
>(*it));
133 for(
auto&
rs : vec_rs ){
138 for (
auto det :
rs.detectors() ){
141 int sampling = det.second;
143 if( det_id ==
TILE ){
145 for (std::vector<const CaloCell *>::const_iterator it = vec_tile_cells.begin(); it != vec_tile_cells.end(); ++it)
147 if( !
rs.isValid(*it) )
continue;
162 if(
m_dataSvc->loadCollections( context, roi, det_id, sampling,
sel ).isFailure() )
164 ATH_MSG_ERROR(
"Failure while trying to retrieve cell information for the "<< det_id <<
" calorimeter." );
165 return StatusCode::FAILURE;
168 itBegin =
sel.begin();
173 for(it = itBegin; it != itEnd; ++it)
180 if( !
rs.isValid( it_tmp ) )
continue;
181 rs.push_back(it_tmp);
202 return StatusCode::SUCCESS;
211 const EventContext& context)
const
224 ATH_CHECK( ringsCollection.
record( std::make_unique<xAOD::TrigRingerRingsContainer>(),
225 std::make_unique<xAOD::TrigRingerRingsAuxContainer>() ) );
231 for(
unsigned i=0; i<
m_etaBins.size();i+=2){
238 ringsCollection->push_back( dummyRinger );
239 return StatusCode::SUCCESS;
243 std::vector<RingerReFex::RingSet> vec_rs;
244 load_cells_time.start();
246 load_cells_time.stop();
248 std::vector<float> ref_rings;
249 for (std::vector<RingerReFex::RingSet>::iterator it=vec_rs.begin(); it!=vec_rs.end(); ++it)
251 auto rings = it->rings();
252 ref_rings.insert(ref_rings.end(), rings.begin(), rings.end());
256 ringsCollection->push_back( ptrigRingerRings );
257 ptrigRingerRings->setRings(ref_rings);
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;
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);
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);
289 if (
m_doQuarter[0]) asym_rings_sumDec(*ptrigRingerRings) = std::move(rings_sum);
290 else rings_sumDec(*ptrigRingerRings) = std::move(rings_sum);
294 ptrigRingerRings->setEmClusterLink( clusLink );
301 return StatusCode::SUCCESS;
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());
316 cells_size.push_back(
m_cells.size());
318 for (
auto ring :
m_rings) sum+=ring;
319 rings_sum.push_back(sum);
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;
340 if (phi_use > phimin && phi_use < phimax){
341 if (cell->energy() > energy) {
342 energy = cell->energy();
356 ATH_MSG_INFO(
"--------------- Cluster Information (2) ----------------");
359 ATH_MSG_INFO(
"et = "<< cl.et() <<
" eta = " << cl.eta() <<
" roiword = " << cl.RoIword());
362 for(
unsigned rs=0;
rs<vec_rs.size(); ++
rs){
366 ATH_MSG_INFO(
"Pattern has size equal than: " << vec_rs.at(
rs).rings().size());
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.");
375 ATH_MSG_INFO(
"---------------- End of information -----------------");
385 const std::vector<int> &samplings,
386 const std::vector<int> &samples,
388 bool doEtaAxesDivision,
389 bool doPhiAxesDivision
402 if(doEtaAxesDivision && doPhiAxesDivision){
403 m_rings.resize( (maxRings-1)*4 + 1 );
405 m_rings.resize( (maxRings-1)*2 + 2 );
418 std::vector< std::pair<int,int> >
vec;
428 for (std::vector<int>::const_iterator it=
m_samples.begin(); it!=
m_samples.end(); ++it)
462 const double cosh_eta = std::cosh(eta_center);
469 for (std::vector<const CaloCell*>::const_iterator it=
m_cells.begin(); it!=
m_cells.end(); ++it) {
474 double phi_use = (*it)->phi();
479 const double deltaEta = ((*it)->eta() - eta_center)/
m_deltaEta;
486 const double deltaGreater = std::max(std::abs(deltaEta), std::abs(
deltaPhi));
487 i =
static_cast<unsigned int>( std::floor (deltaGreater) );
489 if ( (deltaGreater - (
double) i) > 0.5) ++i;
492 bool etaPositive = ( deltaEta > 0 )?
true:
false;
493 bool phiPositive = (
deltaPhi > 0)?
true:
false;
505 else if (etaPositive){
513 i = (etaPositive)?(i * 2):((i * 2) - 1);
516 i = (phiPositive)?(i * 2):((i * 2) - 1);
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;
529 m_rings[i] += (*it)->energy() / cosh_eta;
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
ElementLink()
Default constructor.
std::vector< size_t > vec
#define CHECK(...)
Evaluate an expression and check for errors.
Helper class to provide type-safe access to aux data.
Header file to be included by clients of the Monitored infrastructure.
DETID
An enum to define subdetector names.
size_t size() const
Number of registered mappings.
bool msgLvl(const MSG::Level lvl) const
Data object for each calorimeter readout cell.
virtual double phi() const override final
get phi (through CaloDetDescrElement)
virtual double eta() const override final
get eta (through CaloDetDescrElement)
This class groups all DetDescr information related to a CaloCell.
float getNoise(const IdentifierHash h, const int gain) const
Accessor by IdentifierHash and gain.
Describes the API of the Region of Ineterest geometry.
Group of local monitoring quantities and retain correlation when filling histograms
void push_back(const CaloCell *)
=================================================================================
const std::vector< double > & rings() const
=================================================================================
std::vector< double > m_rings
std::vector< int > m_samples
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
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
std::vector< int > m_samplings
Gaudi::Property< std::vector< float > > m_deltaEta
SG::ReadHandleKey< xAOD::TrigEMClusterContainer > m_clusterContainerKey
Gaudi::Property< double > m_phiSearchWindowSize
Gaudi::Property< std::vector< bool > > m_doQuarter
Gaudi::Property< bool > m_dumpCells
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
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
Gaudi::Property< std::vector< float > > m_deltaPhi
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
SG::WriteHandleKey< xAOD::TrigRingerRingsContainer > m_ringerContainerKey
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
Gaudi::Property< double > m_etaSearchWindowSize
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.
double fix_wrap_around(const double phi_value, const bool reverse_wrap)
Helper function to fix wrap around cases.
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
TrigRingerRings_v2 TrigRingerRings
Define the latest version of the TrigRingerRings class.
TrigEMCluster_v1 TrigEMCluster
Define the latest version of the trigger EM cluster class.