ATLAS Offline Software
Loading...
Searching...
No Matches
gFEXSim.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// gFEXSim - Simulation of the gFEX module
6// -------------------
7// begin : 01 04 2021
8// email : cecilia.tosciri@cern.ch
9//***************************************************************************
10
11#include "gFEXSim.h"
12#include "L1CaloFEXSim/gTower.h"
13#include "gFEXFPGA.h"
15#include "gFEXJetAlgo.h"
18
19namespace LVL1 {
20
21 gFEXSim::gFEXSim(const std::string& type,const std::string& name,const IInterface* parent):
22 AthAlgTool(type,name,parent)
23 {
24 declareInterface<IgFEXSim>(this);
25 }
26
27
31
32 StatusCode gFEXSim::initialize(){
33 ATH_CHECK( m_gFEXFPGA_Tool.retrieve() );
34 ATH_CHECK( m_gFEXJetAlgoTool.retrieve() );
35 ATH_CHECK( m_gFEXJwoJAlgoTool.retrieve() );
36 ATH_CHECK( m_gFEXaltMetAlgoTool.retrieve() );
37 ATH_CHECK(m_l1MenuKey.initialize());
38 ATH_CHECK(m_gTowersWriteKey.initialize());
39
40 return StatusCode::SUCCESS;
41 }
42
43
44 StatusCode gFEXSim::execute(const EventContext& ctx,
45 const gTowersIDs& tmp_gTowersIDs_subset,
46 gFEXOutputCollection* gFEXOutputs,
47 std::vector<uint32_t>& gRhoTobWords,
48 std::vector<uint32_t>& gBlockTobWords,
49 std::vector<uint32_t>& gJetTobWords,
50 std::vector<int32_t>& gScalarEJwojTobWords,
51 std::vector<uint32_t>& gMETComponentsJwojTobWords,
52 std::vector<uint32_t>& gMHTComponentsJwojTobWords,
53 std::vector<uint32_t>& gMSTComponentsJwojTobWords,
54 std::vector<uint32_t>& gMETComponentsNoiseCutTobWords,
55 std::vector<uint32_t>& gMETComponentsRmsTobWords,
56 std::vector<uint32_t>& gScalarENoiseCutTobWords,
57 std::vector<uint32_t>& gScalarERmsTobWords) const {
58
59 // Container to save gTowers
61 ATH_CHECK(gTowersContainer.record(std::make_unique<xAOD::gFexTowerContainer>(), std::make_unique<xAOD::gFexTowerAuxContainer>()));
62 ATH_MSG_DEBUG("Recorded gFexTriggerTower container with key " << gTowersContainer.key());
63
64 gTowersType Atwr = {{{0}}};
65 gTowersType Btwr = {{{0}}};
66 gTowersType Ctwr = {{{0}}};
67
68 gTowersType Atwr50 = {{{0}}};
69 gTowersType Btwr50 = {{{0}}};
70 gTowersType Ctwr50 = {{{0}}};
71
72 gTowersType Asat = {{{0}}};
73 gTowersType Bsat = {{{0}}};
74 gTowersType Csat = {{{0}}};
75
76
77 //FPGA A
78 gTowersCentral tmp_gTowersIDs_subset_centralFPGA;
79 memset(&tmp_gTowersIDs_subset_centralFPGA, 0, sizeof tmp_gTowersIDs_subset_centralFPGA);
80 for (int myrow = 0; myrow<FEXAlgoSpaceDefs::centralNphi; myrow++){
81 for (int mycol = 0; mycol<12; mycol++){
82 tmp_gTowersIDs_subset_centralFPGA[myrow][mycol] = tmp_gTowersIDs_subset[myrow][mycol+8];
83 }
84 }
85
86 m_gFEXFPGA_Tool->FillgTowerEDMCentral(ctx, gTowersContainer, 0, tmp_gTowersIDs_subset_centralFPGA, Atwr, Atwr50, Asat);
87
88 //FPGA B
89 gTowersCentral tmp_gTowersIDs_subset_centralFPGA_B;
90 memset(&tmp_gTowersIDs_subset_centralFPGA_B, 0, sizeof tmp_gTowersIDs_subset_centralFPGA_B);
91 for (int myrow = 0; myrow<FEXAlgoSpaceDefs::centralNphi; myrow++){
92 for (int mycol = 0; mycol<12; mycol++){
93 tmp_gTowersIDs_subset_centralFPGA_B[myrow][mycol] = tmp_gTowersIDs_subset[myrow][mycol+20];
94 }
95 }
96
97 m_gFEXFPGA_Tool->FillgTowerEDMCentral(ctx, gTowersContainer, 1, tmp_gTowersIDs_subset_centralFPGA_B, Btwr, Btwr50, Bsat);
98
99 //FPGA C
100
101 // C-N
102 //Use a matrix with 32 rows, even if FPGA-N (negative) also deals with regions of 16 bins in phi (those connected to FCAL).
103 //We have 4 columns with 32 rows and 4 columns with 16 rows for each FPGA-C.
104 //So we use a matrix 32x8 but we fill only half of it in the region 3.3<|eta|<4.8.
105 gTowersForward tmp_gTowersIDs_subset_forwardFPGA_N;
106 memset(&tmp_gTowersIDs_subset_forwardFPGA_N, 0, sizeof tmp_gTowersIDs_subset_forwardFPGA_N);
107 for (int myrow = 0; myrow<FEXAlgoSpaceDefs::forwardNphi; myrow++){
108 for (int mycol = 0; mycol<4; mycol++){
109 tmp_gTowersIDs_subset_forwardFPGA_N[myrow][mycol] = tmp_gTowersIDs_subset[myrow][mycol];
110 }
111 }
112 for (int myrow = 0; myrow<FEXAlgoSpaceDefs::centralNphi; myrow++){
113 for (int mycol = 4; mycol<8; mycol++){
114 tmp_gTowersIDs_subset_forwardFPGA_N[myrow][mycol] = tmp_gTowersIDs_subset[myrow][mycol];
115 }
116 }
117
118 // C-P
119 //Use a matrix with 32 rows, even if FPGA-C (positive) also deals with regions of 16 bins in phi (those connected to FCAL).
120 //We have 4 columns with 32 rows and 4 columns with 16 rows for each FPGA-C.
121 //So we use a matrix 32x8 but we fill only half of it in the region 3.3<|eta|<4.8.
122 gTowersForward tmp_gTowersIDs_subset_forwardFPGA_P;
123 memset(&tmp_gTowersIDs_subset_forwardFPGA_P, 0, sizeof tmp_gTowersIDs_subset_forwardFPGA_P);
124 for (int myrow = 0; myrow<FEXAlgoSpaceDefs::centralNphi; myrow++){
125 for (int mycol = 0; mycol<4; mycol++){
126 tmp_gTowersIDs_subset_forwardFPGA_P[myrow][mycol] = tmp_gTowersIDs_subset[myrow][mycol+32];
127 }
128 }
129 for (int myrow = 0; myrow<FEXAlgoSpaceDefs::forwardNphi; myrow++){
130 for (int mycol = 4; mycol<8; mycol++){
131 tmp_gTowersIDs_subset_forwardFPGA_P[myrow][mycol] = tmp_gTowersIDs_subset[myrow][mycol+32];
132 }
133 }
134
135 m_gFEXFPGA_Tool->FillgTowerEDMForward(ctx, gTowersContainer, 2, tmp_gTowersIDs_subset_forwardFPGA_N, tmp_gTowersIDs_subset_forwardFPGA_P, Ctwr, Ctwr50, Csat);
136
137
138 // Retrieve the L1 menu configuration
140 ATH_CHECK(l1Menu.isValid());
141
142 //Parameters related to gLJ (large-R jet objects - gJet)
143 auto & thr_gLJ = l1Menu->thrExtraInfo().gLJ();
144 int gLJ_seedThrA = thr_gLJ.seedThrCounts('A'); //defined in GeV by default
145 int gLJ_seedThrB = thr_gLJ.seedThrCounts('B'); //defined in GeV by default
146 int gLJ_seedThrC = thr_gLJ.seedThrCounts('C'); //defined in GeV by default
147
148 int gLJ_ptMinToTopoCounts1 = thr_gLJ.ptMinToTopoCounts(1);
149 int gLJ_ptMinToTopoCounts2 = thr_gLJ.ptMinToTopoCounts(2);
150
151 float gLJ_rhoMaxA = (thr_gLJ.rhoTowerMax('A')*1000)/50;//Values are given in GeV, need to be converted with 50MeV scale to be used in PU calculation
152 float gLJ_rhoMaxB = (thr_gLJ.rhoTowerMax('B')*1000)/50;//Values are given in GeV, need to be converted with 50MeV scale to be used in PU calculation
153 float gLJ_rhoMaxC = (thr_gLJ.rhoTowerMax('C')*1000)/50;//Values are given in GeV, need to be converted with 50MeV scale to be used in PU calculation
154
155
156 //Parameters related to gJ (small-R jet objects - gBlock)
157 auto & thr_gJ = l1Menu->thrExtraInfo().gJ();
158 int gJ_ptMinToTopoCounts1 = thr_gJ.ptMinToTopoCounts(1);
159 int gJ_ptMinToTopoCounts2 = thr_gJ.ptMinToTopoCounts(2);
160
161
162 int pucA = 0;
163 int pucB = 0;
164 int pucC = 0;
165 int pucA_JWJ = 0;
166 int pucB_JWJ = 0;
167 int pucC_JWJ = 0;
168 //note that jetThreshold is not a configurable parameter in firmware, it is used to check that jet values are positive
169 int jetThreshold = FEXAlgoSpaceDefs::jetThr; //this threshold is set by the online software
170
171 if (FEXAlgoSpaceDefs::ENABLE_PUC == true){
172 m_gFEXJetAlgoTool->pileUpCalculation(Atwr50, gLJ_rhoMaxA, 1, pucA, pucA_JWJ);
173 m_gFEXJetAlgoTool->pileUpCalculation(Btwr50, gLJ_rhoMaxB, 1, pucB, pucB_JWJ);
174 m_gFEXJetAlgoTool->pileUpCalculation(Ctwr50, gLJ_rhoMaxC, 1, pucC, pucC_JWJ);
175 }
176
177
178
179 // The output TOBs, to be filled by the gFEXJetAlgoTool
180 std::array<uint32_t, 7> ATOB1_dat = {0};
181 std::array<uint32_t, 7> ATOB2_dat = {0};
182 std::array<uint32_t, 7> BTOB1_dat = {0};
183 std::array<uint32_t, 7> BTOB2_dat = {0};
184 std::array<uint32_t, 7> CTOB1_dat = {0};
185 std::array<uint32_t, 7> CTOB2_dat = {0};
186
187
188 // Pass the energy matrices to the algo tool, and run the algorithms
189 auto tobs_v = m_gFEXJetAlgoTool->largeRfinder(Atwr, Btwr, Ctwr, Asat, Bsat, Csat, pucA, pucB, pucC,
190 gLJ_seedThrA, gLJ_seedThrB, gLJ_seedThrC, gJ_ptMinToTopoCounts1, gJ_ptMinToTopoCounts2,
191 jetThreshold, gLJ_ptMinToTopoCounts1, gLJ_ptMinToTopoCounts2,
192 ATOB1_dat, ATOB2_dat,
193 BTOB1_dat, BTOB2_dat,
194 CTOB1_dat, CTOB2_dat);
195
196 gRhoTobWords.resize(3);
197 gBlockTobWords.resize(12);
198 gJetTobWords.resize(6);
199
200 gRhoTobWords[0] = ATOB2_dat[0];//Pile up correction A
201 gRhoTobWords[1] = BTOB2_dat[0];//Pile up correction B
202 gRhoTobWords[2] = CTOB2_dat[0];//Pile up correction C
203
204 //Placing the gBlock TOBs into a dedicated array
205 gBlockTobWords[0] = ATOB1_dat[1];//leading gBlock in FPGA A, eta bins (0--5)
206 gBlockTobWords[1] = ATOB2_dat[1];//leading gBlock in FPGA A, eta bins (6--11)
207 gBlockTobWords[2] = BTOB1_dat[1];//leading gBlock in FPGA B, eta bins (0--5)
208 gBlockTobWords[3] = BTOB2_dat[1];//leading gBlock in FPGA B, eta bins (6--11)
209
210 gBlockTobWords[4] = ATOB1_dat[2];//subleading gBlock in FPGA A, eta bins (0--5)
211 gBlockTobWords[5] = ATOB2_dat[2];//subleading gBlock in FPGA A, eta bins (6--11)
212 gBlockTobWords[6] = BTOB1_dat[2];//subleading gBlock in FPGA B, eta bins (0--5)
213 gBlockTobWords[7] = BTOB2_dat[2];//subleading gBlock in FPGA B, eta bins (6--11)
214
215 gBlockTobWords[8] = CTOB1_dat[1];//leading gBlock in FPGA C, eta negative
216 gBlockTobWords[9] = CTOB2_dat[1];//leading gBlock in FPGA C, eta positive
217 gBlockTobWords[10] = CTOB1_dat[2];//sub-leading gBlock in FPGA C, eta negative
218 gBlockTobWords[11] = CTOB2_dat[2];//sub-leading gBlock in FPGA C, eta positive
219
220 //Placing the gJet TOBs into a dedicated array
221 gJetTobWords[0] = ATOB1_dat[3];//leading gJet in FPGA A, eta bins (0--5)
222 gJetTobWords[1] = ATOB2_dat[3];//leading gJet in FPGA A, eta bins (6--11)
223 gJetTobWords[2] = BTOB1_dat[3];//leading gJet in FPGA B, eta bins (0--5)
224 gJetTobWords[3] = BTOB2_dat[3];//leading gJet in FPGA B, eta bins (6--11)
225 gJetTobWords[4] = CTOB1_dat[3];//leading gJet in FPGA C negative
226 gJetTobWords[5] = CTOB2_dat[3];//leading gJet in FPGA C positive
227
228
229 // Use the gFEXJetAlgoTool
230 std::array<int32_t, 4> outJwojTOB = {0};
231 std::array<uint32_t, 4> outAltMetTOB = {0};
232
233 // run the JwoJ algorithm
234 auto global_tobs = m_gFEXJwoJAlgoTool->jwojAlgo(ctx, Atwr, pucA_JWJ, Btwr, pucB_JWJ, Ctwr, pucC_JWJ, outJwojTOB);
235
236 gScalarEJwojTobWords.resize(1);
237 gMETComponentsJwojTobWords.resize(1);
238 gMHTComponentsJwojTobWords.resize(1);
239 gMSTComponentsJwojTobWords.resize(1);
240
241
242 //Placing the global TOBs into a dedicated array
243 gScalarEJwojTobWords[0] = outJwojTOB[0];//
244 gMETComponentsJwojTobWords[0] = outJwojTOB[1];//
245 gMHTComponentsJwojTobWords[0] = outJwojTOB[2];//
246 gMSTComponentsJwojTobWords[0] = outJwojTOB[3];//
247
248 // run the altMet algorithm
249 m_gFEXaltMetAlgoTool->altMetAlgo(ctx, Atwr, Btwr, Ctwr, outAltMetTOB);
250
251 gMETComponentsNoiseCutTobWords.resize(1);
252 gMETComponentsRmsTobWords.resize(1);
253 gScalarENoiseCutTobWords.resize(1);
254 gScalarERmsTobWords.resize(1);
255
256 //Placing the global TOBs into a dedicated array
257 gMETComponentsNoiseCutTobWords[0] = outAltMetTOB[0];//
258 gMETComponentsRmsTobWords[0] = outAltMetTOB[1];//
259 gScalarENoiseCutTobWords[0] = outAltMetTOB[2];//
260 gScalarERmsTobWords[0] = outAltMetTOB[3];//
261
262 for (int i = 0; i <14; i++){
263 gFEXOutputs->addJetTob(tobs_v[i]->getWord());
264 gFEXOutputs->addValueJet("EtaJet", tobs_v[i]->getEta());
265 gFEXOutputs->addValueJet("PhiJet", tobs_v[i]->getPhi());
266 gFEXOutputs->addValueJet("ETJet", tobs_v[i]->getET());
267 gFEXOutputs->addValueJet("StatusJet", tobs_v[i]->getStatus());
268 gFEXOutputs->addValueJet("TobIDJet", tobs_v[i]->getTobID());
269 gFEXOutputs->fillJet();
270
271 }
272
273 for (int i = 0; i <4; i++){
274 gFEXOutputs->addGlobalTob(global_tobs[i]->getWord());
275 gFEXOutputs->addValueGlobal("GlobalQuantity1", global_tobs[i]->getQuantity1());
276 gFEXOutputs->addValueGlobal("GlobalQuantity2", global_tobs[i]->getQuantity2());
277 gFEXOutputs->addValueGlobal("SaturationGlobal", global_tobs[i]->getSaturation());
278 gFEXOutputs->addValueGlobal("TobIDGlobal", global_tobs[i]->getTobID());
279 gFEXOutputs->addValueGlobal("GlobalStatus1", global_tobs[i]->getStatus1());
280 gFEXOutputs->addValueGlobal("GlobalStatus2", global_tobs[i]->getStatus2());
281 gFEXOutputs->fillGlobal();
282
283 }
284
285 return StatusCode::SUCCESS;
286}
287
288
289} // end of namespace bracket
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
static constexpr int centralNphi
static constexpr int jetThr
static constexpr int forwardNphi
static constexpr bool ENABLE_PUC
void addValueGlobal(std::string key, float value)
void addValueJet(std::string key, float value)
add a value related to the jet finder algorithm for a TOB
ToolHandle< IgFEXFPGA > m_gFEXFPGA_Tool
Internal data.
Definition gFEXSim.h:69
virtual StatusCode execute(const EventContext &ctx, const gTowersIDs &tmp_gTowersIDs_subset, gFEXOutputCollection *gFEXOutputs, std::vector< uint32_t > &gRhoTobWords, std::vector< uint32_t > &gBlockTobWords, std::vector< uint32_t > &gJetTobWords, std::vector< int32_t > &gScalarEJwojTobWords, std::vector< uint32_t > &gMETComponentsJwojTobWords, std::vector< uint32_t > &gMHTComponentsJwojTobWords, std::vector< uint32_t > &gMSTComponentsJwojTobWords, std::vector< uint32_t > &gMETComponentsNoiseCutTobWords, std::vector< uint32_t > &gMETComponentsRmsTobWords, std::vector< uint32_t > &gScalarENoiseCutTobWords, std::vector< uint32_t > &gScalarERmsTobWords) const override
Definition gFEXSim.cxx:44
SG::ReadHandleKey< TrigConf::L1Menu > m_l1MenuKey
Definition gFEXSim.h:77
ToolHandle< IgFEXJwoJAlgo > m_gFEXJwoJAlgoTool
Definition gFEXSim.h:73
SG::WriteHandleKey< xAOD::gFexTowerContainer > m_gTowersWriteKey
Definition gFEXSim.h:79
virtual StatusCode initialize() override
Definition gFEXSim.cxx:32
gFEXSim(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
Definition gFEXSim.cxx:21
ToolHandle< IgFEXJetAlgo > m_gFEXJetAlgoTool
Definition gFEXSim.h:71
ToolHandle< IgFEXaltMetAlgo > m_gFEXaltMetAlgoTool
Definition gFEXSim.h:75
virtual ~gFEXSim()
Destructor.
Definition gFEXSim.cxx:29
virtual bool isValid() override final
Can the handle be successfully dereferenced?
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
std::array< std::array< int, 8 >, 32 > gTowersForward
std::array< std::array< int, 12 >, 32 > gTowersCentral
std::array< std::array< int, 12 >, 32 > gTowersType
Definition IgFEXFPGA.h:25
std::array< std::array< int, 40 >, 32 > gTowersIDs
Definition IgFEXSim.h:20