ATLAS Offline Software
Loading...
Searching...
No Matches
jTowerBuilder.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
8#include "jTowerBuilder.h"
10
11// TOWER IS A COLLECTION OF SUPER CELLS
12// IT SHOULD HAVE A UNIQUE ID
13// IT SHOULD BE ABLE TO RETURN LIST OF SUPER CELLS BELONGING TO IT
14
15// THIS IS A CLASS DESIGNED TO BUILD AN JTOWER USING THE JTOWER CLASS AND THEN PRINT THE RELEVANT INFORMATION TO THE SCREEN USING FUNCTION CALLS FROM THE JTOWER CLASS
16
17namespace LVL1 {
18
19jTowerBuilder::jTowerBuilder(const std::string& type,const std::string& name,const IInterface* parent): AthAlgTool(type,name,parent) {
20 declareInterface<IjTowerBuilder>(this);
21}
22
24{
25 ATH_CHECK( m_BDToolKey.initialize() );
26
27 return StatusCode::SUCCESS;
28}
29
30
31
32void jTowerBuilder::init(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
33
34 execute(jTowerContainerRaw);
35
36 jTowerContainerRaw->clearContainerMap();
37 jTowerContainerRaw->fillContainerMap();
38
39}
40
41
42void jTowerBuilder::execute(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
43 BuildAllTowers(jTowerContainerRaw);
44}
45
46 // TOWER IDs FOR CLARITY
47 // Left Barrel IETower = 100000 + X
48 // Right Barrel IETower = 200000 + X
49 // Left Transition ID Tower = 300000 + X;
50 // Right Transition ID Tower = 400000 + X;
51 // Left Endcap ID Tower = 500000 + X
52 // Right Endcap ID Tower = 600000 + X
53 // Left Hadronic Endcap ID Tower = 11100000 + X --> These are just Layer 5 of Endcap Towers. They will never be generated as standalone jTowers.
54 // Right Haronic Endcap ID Tower = 22200000 + X --> These are just Layer 5 of Endcap Towers. They will never be generated as standalone jTowers.
55
56void jTowerBuilder::BuildEMBjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
57 // Regions 0 only. Region 1 is 'transition region'.
58 for (int ieta = 0; ieta < 14; ++ieta) { // loop over 14 eta steps (ignoring last step as it is transition region)
59 float centre_eta = (0.1*ieta) + (0.05) ;
60 for (int iphi = 0; iphi < 64; ++iphi) { // loop over 64 phi steps
61 int key_eta = ieta;
62 float centre_phi = (m_TT_Size_phi*iphi) + (m_TT_Size_phi/2);
63 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 100000, -1, -1*centre_eta, centre_phi);
64 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 200000, 1, centre_eta, centre_phi);
65 }
66 }
67
68}
69
70void jTowerBuilder::BuildTRANSjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
71 int TRANS_MODIFIER = 14;
72 int tmpVal = TRANS_MODIFIER;
73
74 for (int ieta = tmpVal; ieta < tmpVal + 1; ieta++) { // loop over eta steps
75 float centre_eta = (0.1*ieta) + (0.05);
76 for (int iphi = 0; iphi < 64; ++iphi) { // loop over 64 phi steps
77 int key_eta = ieta;
78 float centre_phi = (m_TT_Size_phi*iphi) + (m_TT_Size_phi/2);
79 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 300000, -1,-1*centre_eta, centre_phi);
80 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 400000, 1, centre_eta, centre_phi);
81 }
82 }
83
84}
85
86void jTowerBuilder::BuildEMEjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
87 // Region 1
88 int EME_MODIFIER = 15;
89 int tmpVal = EME_MODIFIER;
90
91 for (int ieta = tmpVal; ieta < tmpVal + 3; ++ieta) { // loop over eta steps
92 float centre_eta =(0.1*ieta) + (0.05) ;
93 for (int iphi = 0; iphi < 64; ++iphi) { // loop over 64 phi steps
94 int key_eta = ieta;
95 float centre_phi = (m_TT_Size_phi*iphi) + (m_TT_Size_phi/2);
96 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 500000, -1, -1*centre_eta, centre_phi);
97 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 600000, 1, centre_eta, centre_phi);
98 }
99 EME_MODIFIER++;
100 }
101
102 // Region 2
103 tmpVal = EME_MODIFIER;
104 for (int ieta = tmpVal; ieta < tmpVal + 2; ++ieta) { // loop over eta steps
105 float centre_eta = (0.1*ieta) + (0.05);
106 for (int iphi = 0; iphi < 64; ++iphi) { // loop over 64 phi steps
107 int key_eta = ieta;
108 float centre_phi = (m_TT_Size_phi*iphi) + (m_TT_Size_phi/2);
109 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 500000, -1,-1*centre_eta, centre_phi);
110 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 600000, 1, centre_eta, centre_phi);
111 }
112 EME_MODIFIER++;
113 }
114
115 // Region 3
116 tmpVal = EME_MODIFIER;
117 for (int ieta = tmpVal; ieta < tmpVal + 4; ++ieta) { // loop over eta steps
118 float centre_eta= (0.1*ieta) + (0.05) ;
119 for (int iphi = 0; iphi < 64; ++iphi) { // loop over 64 phi steps
120 int key_eta = ieta;
121 float centre_phi = (m_TT_Size_phi*iphi) + (m_TT_Size_phi/2);
122 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 500000, -1,-1*centre_eta, centre_phi);
123 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 600000, 1, centre_eta, centre_phi);
124 }
125 EME_MODIFIER++;
126 }
127
128 // Region 4
129 tmpVal = EME_MODIFIER;
130 for (int ieta = tmpVal; ieta < tmpVal + 1; ++ieta) { // loop over eta steps
131 float centre_eta = (0.1*ieta) + (0.05);
132 for (int iphi = 0; iphi < 64; ++iphi) { // loop over 64 phi steps
133 int key_eta = ieta;
134 //float centre_phi =(TT_Size*iphi) + (0.5*TT_Size) ;
135 float centre_phi = (m_TT_Size_phi*iphi) + (m_TT_Size_phi/2);
136 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 500000, -1, -1*centre_eta, centre_phi);
137 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 600000, 1, centre_eta, centre_phi);
138 }
139 EME_MODIFIER++;
140 }
141
142
143}
144
145 // EMIE = Electromagnetic Inner ECAL - i.e. the forward ECAL region at high eta
146void jTowerBuilder::BuildEMIEjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
147 int EMIE_MODIFIER = 25;
148 int tmpVal = EMIE_MODIFIER;
149 int cellCountEta = 0;
150
151 for (int ieta = tmpVal; ieta < tmpVal + 3; ++ieta) { // loop over eta steps (there are 3 here, 2.5-2.7, 2.7-2.9, 2.9-3.1)
152 cellCountEta++;
153 float centre_eta =(0.1*ieta) + (0.1*cellCountEta) ;
154 for (int iphi = 0; iphi < 32; ++iphi) { // loop over 32 phi steps
155 int key_eta = ieta;
156 float centre_phi = (2*m_TT_Size_phi*iphi) + m_TT_Size_phi;
157 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, /*7*/500000, -1, -1*centre_eta, centre_phi);
158 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, /*8*/600000, 1, centre_eta, centre_phi);
159 }
160 EMIE_MODIFIER++;
161 }
162
163 tmpVal = EMIE_MODIFIER;
164 for (int ieta = tmpVal; ieta < tmpVal + 1; ++ieta) { // loop over eta steps (there are 1 here, 3.1-3.2)
165 float centre_eta = (0.1*ieta + 0.3) + (0.05);
166 for (int iphi = 0; iphi < 32; ++iphi) { // loop over 32 phi steps
167 int key_eta = ieta;
168 float centre_phi = (2*m_TT_Size_phi*iphi) + m_TT_Size_phi;
169 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, /*7*/500000, -1, -1*centre_eta, centre_phi);
170 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, /*8*/600000, 1, centre_eta, centre_phi);
171 }
172 EMIE_MODIFIER++;
173 }
174
175}
176
177void jTowerBuilder::BuildFCALjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
178 int FCAL_MODIFIER = 29; // there's 0.1 overlap with EMIE here in eta, but in counting we pretend it's the next one along.
179 int tmpVal = FCAL_MODIFIER;
180
181 //These jTowers split between all of the layers as well (FCAL0,1,2) but we treat them as though they are a single flat layer of 24 supercells and also pretend that they do not overlap - when they definitely do...
182 //This means that from a tower numbering perspective we start with FCAL0 and work upwards (in numbers?), but real ordering in eta is different and this has to be built into the jTower internal properties
183 //Right now we are unfortunately using hard-coded eta and phi positions to do this, but maybe these should be drawn from a database someday
184
185 // THIS REGION DEFINES 1 jTOWER PER SUPERCELL! AS SUCH THE jTOWER AND SUPERCELL POSITIONS IN ETA-PHI SPACE WILL MATCH EXACTY
186 // (That's good right? Supposed to make life easier?)
187
188 // 21/01/21 IN THE MC:
189 // FCAL 0 Region [NOT SPECIFIED IN MC] has 12 supercells in 3.2 < eta < 4.88, and 16 supercells in phi. Supercells are 0.14 x 0.4. posneg +-2
190 // FCAL 1 Region [NOT SPECIFIED IN MC] has 8 supercells in 3.2 < eta < 4.48, and 16 supercells in phi. Supercells are 0.16 x 0.4. posneg +-2
191 // FCAL 2 Region [NOT SPECIFIED IN MC] has 4 supercells in 3.2 < eta < 4.48, and 16 supercells in phi. Supercells are 0.32 x 0.4. posneg +-2
192
193 //FCAL0
194 float eta_width = 1.4;
195 int cellCountEta = 0;
196 int FCAL0_INITIAL = FCAL_MODIFIER;
197 std::vector<int> TT_etapos{31,33,34,36,37,39,40,42,43,45,46,48}; // Eta position of each supercell, need to be change for the real coords. Future MR
198 for (int ieta = tmpVal; ieta < tmpVal + 12; ++ieta) { // loop over eta steps (there are 12 here in varying positions for FCAL0)
199 int key_eta = ieta - FCAL0_INITIAL;
200 float centre_eta = (TT_etapos[cellCountEta]+eta_width/2)/10.0;
201 cellCountEta++;
202
203 for (int iphi = 0; iphi < 16; ++iphi) { // loop over 16 phi steps
204 float centre_phi = (2*m_TT_Size_phi_FCAL*iphi) + m_TT_Size_phi_FCAL;
205 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 700000, -1, -1*centre_eta, centre_phi, 0);
206 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 800000, 1, centre_eta, centre_phi, 0);
207 }
208 FCAL_MODIFIER++;
209 }
210
211 //FCAL1
212 eta_width = 1.6;
213 cellCountEta = 0;
214 tmpVal = FCAL_MODIFIER;
215 TT_etapos = {31,33,35,37,39,41,43,44};// Eta position of each supercell, need to be change for the real coords. Future MR
216 int FCAL1_INITIAL = FCAL_MODIFIER;
217 for (int ieta = tmpVal; ieta < tmpVal + 8; ++ieta) { // loop over eta steps (there are 8 here in varying positions for FCAL1)
218 int key_eta = ieta - FCAL1_INITIAL;
219 float centre_eta = (TT_etapos[cellCountEta]+eta_width/2)/10.0;
220 cellCountEta++;
221 for (int iphi = 0; iphi < 16; ++iphi) { // loop over 16 phi steps
222 float centre_phi = (2*m_TT_Size_phi_FCAL*iphi) + m_TT_Size_phi_FCAL;
223 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 900000, -1, -1*centre_eta, centre_phi, 1);
224 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 1000000, 1, centre_eta, centre_phi, 1);
225 }
226 FCAL_MODIFIER++;
227 }
228
229
230 //FCAL2
231 eta_width = 3.2;
232 cellCountEta = 0;
233 tmpVal = FCAL_MODIFIER;
234 TT_etapos = {31,34,37,41};// Eta position of each supercell, need to be change for the real coords. Future MR
235 int FCAL2_INITIAL = FCAL_MODIFIER;
236 for (int ieta = tmpVal; ieta < tmpVal + 4; ++ieta) { // loop over eta steps (there are 4 here in varying positions for FCAL2)
237 int key_eta = ieta - FCAL2_INITIAL;
238 float centre_eta = (TT_etapos[cellCountEta]+eta_width/2)/10.0;
239 cellCountEta++;
240 for (int iphi = 0; iphi < 16; ++iphi) { // loop over 16 phi steps
241 float centre_phi = (2*m_TT_Size_phi_FCAL*iphi) + m_TT_Size_phi_FCAL;
242 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 1100000, -1, -1*centre_eta, centre_phi, 2);
243 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 1200000, 1, centre_eta, centre_phi, 2);
244 }
245 FCAL_MODIFIER++;
246 }
247
248
249}
250
251
252
253 void jTowerBuilder::BuildHECjTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
254 // Region 0
255 int HEC_MODIFIER = 29;
256 int tmpVal = HEC_MODIFIER;
257 for (int ieta = tmpVal; ieta < tmpVal + 10; ++ieta){ // loop over eta steps
258 for (int iphi = 0; iphi < 64; ++iphi){ // loop over 64 phi steps
259 int key_eta = ieta;
260 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 11100000, -1, ieta, iphi);
261 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 22200000, 1, ieta, iphi);
262 }
263 HEC_MODIFIER++;
264 }
265
266 // Region 1
267 tmpVal = HEC_MODIFIER;
268 for (int ieta = tmpVal; ieta < tmpVal + 4; ++ieta){ // loop over eta steps
269 for (int iphi = 0; iphi < 32; ++iphi){ // loop over 64 phi steps
270 int key_eta = ieta;
271 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 11100000, -1, ieta, iphi);
272 BuildSingleTower(jTowerContainerRaw, ieta, iphi, key_eta, 22200000, 1, ieta, iphi);
273 }
274 HEC_MODIFIER++;
275 }
276
277}
278//=================================================================================================================================================================
279
280void jTowerBuilder::BuildSingleTower(std::unique_ptr<jTowerContainer> & jTowerContainerRaw,float eta, float phi, int key_eta, float keybase, int posneg, float centre_eta, float centre_phi, int fcal_layer) const {
281 int towerID = keybase + phi + (64 * key_eta);
282 jTowerContainerRaw->push_back(eta, phi, towerID, posneg, centre_eta, centre_phi, fcal_layer);
283
284}
285
286
287
288StatusCode jTowerBuilder::AssignPileupAndNoiseValues(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const{
289
291 if (!myDBTool.isValid()){
292 ATH_MSG_ERROR("Not able to read " << m_BDToolKey );
293 return StatusCode::FAILURE;
294 }
295
296 for(LVL1::jTower* jtower : *jTowerContainerRaw) {
297
298 auto [CutJetEM, CutJetHad, CutMetEM, CutMetHad] = myDBTool->get_NoiseCuts( jtower->OnlineID() );
299 auto [PileUpWeightEM, PileUpWeightHad, InverseWeightEM, InverseWeightHad] = myDBTool->get_PileUpValues( jtower->OnlineID() );
300
301 //Simulation used MeV not counts, those
302 int LSBscale_EM = 25; // cf LATOME
303 int LSBscale_HAD = 25; // cf LATOME
304
305 //TREX uses another conversion factor
306 if(std::abs(jtower->centreEta()) < 1.5){
307 LSBscale_HAD = 500;// cf TREX
308 }
309
310 //Since the COOL DB for FCAL individual towers are sharing the same OnlideID ( to save space)
311 //but in reality they are different towers. we need to set the parameters to 0
312 if(jtower->OfflineID() >= FEXAlgoSpaceDefs::jFEX_FCAL2_start){
313 PileUpWeightEM = 0;
314 InverseWeightEM = 0;
315 }
316 else if(jtower->OfflineID() >= FEXAlgoSpaceDefs::jFEX_FCAL1_start){
317 PileUpWeightHad = 0;
318 InverseWeightHad = 0;
319 }
320
321 jtower->setTTowerArea(PileUpWeightEM,0);
322 jtower->setTTowerArea(PileUpWeightHad,1);
323
324 jtower->setTTowerAreaInv(InverseWeightEM,0);
325 jtower->setTTowerAreaInv(InverseWeightHad,1);
326
327 jtower->setNoiseForMet(CutMetEM*LSBscale_EM,0);
328 jtower->setNoiseForMet(CutMetHad*LSBscale_HAD,1);
329
330 jtower->setNoiseForJet(CutJetEM*LSBscale_EM,0);
331 jtower->setNoiseForJet(CutJetHad*LSBscale_HAD,1);
332
333 }
334 return StatusCode::SUCCESS;
335}
336
337
338void jTowerBuilder::BuildAllTowers(std::unique_ptr<jTowerContainer> & jTowerContainerRaw) const {
339 BuildEMBjTowers(jTowerContainerRaw);
340 BuildTRANSjTowers(jTowerContainerRaw);
341 BuildEMEjTowers(jTowerContainerRaw);
342 BuildEMIEjTowers(jTowerContainerRaw);
343 BuildFCALjTowers(jTowerContainerRaw);
344}
345
346} // end of LVL1 namespace
347
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
static constexpr int jFEX_FCAL1_start
static constexpr int jFEX_FCAL2_start
void BuildTRANSjTowers(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const
void BuildAllTowers(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const
void BuildEMIEjTowers(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const
void BuildHECjTowers(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const
SG::ReadCondHandleKey< jFEXDBCondData > m_BDToolKey
jTowerBuilder(const std::string &type, const std::string &name, const IInterface *parent)
static constexpr float m_TT_Size_phi_FCAL
virtual void execute(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const override
virtual void init(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const override
void BuildFCALjTowers(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const
virtual StatusCode initialize() override
void BuildEMBjTowers(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const
static constexpr float m_TT_Size_phi
virtual StatusCode AssignPileupAndNoiseValues(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const override
void BuildSingleTower(std::unique_ptr< jTowerContainer > &jTowerContainerRaw, float eta, float phi, int key_eta, float keybase, int posneg, float centre_eta=0.0, float centre_phi=0.0, int fcal_layer=-1) const
void BuildEMEjTowers(std::unique_ptr< jTowerContainer > &jTowerContainerRaw) const
The jTower class is an interface object for jFEX trigger algorithms The purposes are twofold:
Definition jTower.h:36
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...