ATLAS Offline Software
Loading...
Searching...
No Matches
CaloStripsRingsBuilder.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
9#include "CaloGeoHelpers/CaloSampling.h"
11#include "xAODBase/IParticle.h"
18#include <algorithm>
19#include <cfloat>
20#include <cmath>
21#include <sstream>
22
23namespace Ringer {
24
25// =================================================================================
27 const std::string& name,
28 const ::IInterface* parent)
29 : CaloRingsBuilder(type,name,parent)
30{
31
32 declareInterface<ICaloRingsBuilder>(this);
33 declareProperty("Axis", m_axis=0, "Which axis to use when building the strips");
34 declareProperty("doEtaAxesDivision", m_doEtaAxesDivision = false, "Eta Axes can be divide in two.");
35 declareProperty("doPhiAxesDivision", m_doPhiAxesDivision = false, "Phi Axes can be divide in two.");
36}
37
38// =====================================================================================
40
41// =====================================================================================
43{
44 ATH_MSG_WARNING("Initializing " << name() );
45 m_nRingSets = m_nRings.size();
46 auto itr = m_layers.begin();
47
48 for (size_t rsConfIdx = 0; rsConfIdx < m_nRingSets; ++rsConfIdx) {
49
50 const auto rsNLayers = m_nLayers[rsConfIdx];
51 auto end_itr = itr + rsNLayers;
52
53 const auto& caloSampleItr = reinterpret_cast< std::vector<CaloSampling::CaloSample>::iterator& >(itr);
54 const auto& caloSampleEndItr = reinterpret_cast< std::vector<CaloSampling::CaloSample>::iterator& >(end_itr);
55
56 std::vector<CaloSampling::CaloSample> rsLayers( caloSampleItr , caloSampleEndItr);
57 itr += rsNLayers;
58
60 m_nRings[rsConfIdx],
61 rsLayers,
62 m_etaWidth[rsConfIdx], m_phiWidth[rsConfIdx],
66 );
67 m_rsRawConfCol.push_back(std::move(rawConf));
68 }
69
70 try {
72 } catch ( const std::runtime_error &e) {
73 ATH_MSG_ERROR("Could not add collection bounderies due to: " << e.what() );
74 ATH_MSG_ERROR("RawConfCollection is: ");
75 std::ostringstream str;
77 ATH_MSG_ERROR(str.str());
78 return StatusCode::FAILURE;
79 }
80
81 ATH_CHECK( m_crContName.initialize() );
82 ATH_CHECK( m_rsContName.initialize() );
83 ATH_CHECK( m_cellsContName.initialize() );
84 ATH_CHECK( m_caloMgrKey.initialize() );
85 return StatusCode::SUCCESS;
86}
87
88// =====================================================================================
90{
91 return StatusCode::SUCCESS;
92}
93// =================================================================================
94
97 const AtlasGeoPoint &seed,
99{
100 const auto nStrips = rawConf.nRings;
101 int midPoint = nStrips/2;
102
104 if(!cellsCont.isValid()) {
105 ATH_MSG_FATAL("Failed to retrieve "<< m_cellsContName.key());
106 return StatusCode::FAILURE;
107 }
108
110 const CaloDetDescrManager* caloMgr=*caloMgrHandle;
111 CaloCellList cells(caloMgr, cellsCont.ptr() );
112
113 std::function<double(const CaloCell*)> calcDelta;
114 if (m_axis){
115 calcDelta = [&rawConf, &seed](const CaloCell* cell){
116 return CaloPhiRange::diff(seed.phi(), cell->phi())/rawConf.phiWidth;
117 };
118 } else {
119 calcDelta = [&rawConf, &seed](const CaloCell* cell){
120 return (seed.eta() - cell->eta())/rawConf.etaWidth;
121 };
122 }
123 // loop over cells
124 for ( const int layer : rawConf.layers) {
125 cells.select(seed.eta(), seed.phi(), m_cellMaxDEtaDist, m_cellMaxDPhiDist, layer );
126 for ( const CaloCell *cell : cells ) {
127 float deltaPhi = CaloPhiRange::diff(cell->phi(), seed.phi());
128 bool phiPositive = deltaPhi > 0;
129 const auto delta = calcDelta( cell );
130 int idx =copysign(static_cast<int>(std::floor( delta + .5)),delta);
131 unsigned int stripIdx(0);
132
133 if(!phiPositive){
134 stripIdx = midPoint - (idx*2);
135 if (stripIdx>100000){stripIdx = 0;}
136 }else{
137 stripIdx = midPoint - (idx*2 + 1);
138 if (stripIdx>100000){stripIdx = 0;}
139 }
140 if ( stripIdx < nStrips ){
142 rs->at(stripIdx) += cell->energy()/std::cosh(cell->eta());
143 }else{
144 rs->at(stripIdx) += cell->energy();
145 }
146 }
147 }
148 }
149 return StatusCode::SUCCESS;
150}
151
152}
153
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_WARNING(x)
Helpers for checking error return status codes and reporting errors.
static Double_t rs
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
This class provides the client interface for accessing the detector description information common to...
static double diff(double phi1, double phi2)
simple phi1 - phi2 calculation, but result is fixed to respect range.
CaloRingsBuilder(const std::string &type, const std::string &name, const IInterface *parent)
Default constructor.
SG::WriteHandleKey< xAOD::RingSetContainer > m_rsContName
Name of RingSetContainer on Event StoreGate.
const xAOD::RingSetConf::RawConfCollection & rawConf() override
Extra methods:
xAOD::RingSetConf::RawConfCollection m_rsRawConfCol
holds each RingSet configuration (filled at initialize)
SG::WriteHandleKey< xAOD::CaloRingsContainer > m_crContName
Fill RingSet seed for IParticle.
size_t m_nRingSets
hold the number of RingSets we are building for each CaloRings
Gaudi::Property< std::vector< float > > m_etaWidth
Width of the ring in eta.
Gaudi::Property< std::vector< unsigned int > > m_nLayers
Number of calorimeter layers in each ringset.
Gaudi::Property< float > m_cellMaxDEtaDist
Maximum cell distance in eta to seed.
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
Gaudi::Property< std::vector< float > > m_phiWidth
Width of the ring in phi.
Gaudi::Property< std::vector< int > > m_layers
Calorimeter layers in each ringset.
SG::ReadHandleKey< CaloCellContainer > m_cellsContName
Name of CaloCellContainer.
Gaudi::Property< std::vector< unsigned int > > m_nRings
Number of rings in a ringset.
Gaudi::Property< float > m_cellMaxDPhiDist
Maximum cell distance in phi to seed.
bool m_doPhiAxesDivision
This can be set True to divide in two the phi axes.
std::size_t m_axis
Tool props (python configurables):
virtual StatusCode finalize() override
finalize method
bool m_doEtaAxesDivision
This can be set True to divide in two the eta axes.
virtual StatusCode buildRingSet(const xAOD::RingSetConf::RawConf &rawConf, const AtlasGeoPoint &seed, xAOD::RingSet *rs) override
main method where the strips are build
CaloStripsRingsBuilder(const std::string &type, const std::string &name, const IInterface *parent)
Default constructor.
virtual StatusCode initialize() override
Tool main methods:
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
static Ringer::CalJointLayer whichLayer(const std::vector< CaloSampling::CaloSample > &layers)
static void print(const RawConf &raw, std::ostream &stream)
Prints rawConf.
static Ringer::CalJointSection whichSection(const std::vector< CaloSampling::CaloSample > &layers)
static void addRawConfColBounderies(RawConfCollection &clRingsConf)
Add to RawConfCollection its JointLayer/JointSection bounderies.
Namespace dedicated for Ringer utilities.
RingSet_v1 RingSet
Definition of the current "RingSet version".
Definition RingSet.h:15