ATLAS Offline Software
Loading...
Searching...
No Matches
gFexInputProvider.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <math.h> /* atan2 */
6
7#include "gFexInputProvider.h"
10
12
13#include <unistd.h>
14
15using namespace std;
16using namespace LVL1;
17
18
19// gFex to L1Topo conversion factors
20const int gFexInputProvider::m_EtJet_conversion = 2; // 200 MeV to 100 MeV for gJet, gLJet
21const double gFexInputProvider::m_EtGlobal_conversion = 0.01; // 1 MeV to 100 MeV for gXE, gTE
22const int gFexInputProvider::m_phi_conversion = 1; // 20 x phi to 20 x phi
23const int gFexInputProvider::m_eta_conversion = 40; // eta to 40 x eta
24
25const double gFexInputProvider::m_EtDoubleJet_conversion = 0.1; // 100 MeV to GeV for gJet, gLJet
26const double gFexInputProvider::m_EtDoubleGlobal_conversion = 0.1; // 100 MeV to GeV for gXE, gTE
27const double gFexInputProvider::m_phiDouble_conversion = 0.05; // 20 x phi to phi
28const double gFexInputProvider::m_etaDouble_conversion = 0.025; // 40 x eta to eta
29
30
31gFexInputProvider::gFexInputProvider(const std::string& type, const std::string& name,
32 const IInterface* parent) :
33 base_class(type, name, parent)
34{
35 declareInterface<LVL1::IInputTOBConverter>( this );
36}
37
38
39StatusCode
41
44
49
52 if (! m_gESPRESSO_EDMKey.empty() ) {
53 renounce(m_gESPRESSO_EDMKey); //make this optional, as its availability depends on how gFEX TOBs are being produced (cannot be simulated by gFEX sim, optional form gFEX bytestream decoders
54 }
55
56 if (!m_monTool.empty()) ATH_CHECK(m_monTool.retrieve());
57
58 return StatusCode::SUCCESS;
59}
60
61StatusCode
63
64 if (m_gJet_EDMKey.empty()) {
65 ATH_MSG_DEBUG("gFex Jet input disabled, skip filling");
66 return StatusCode::SUCCESS;
67 }
68
70 ATH_CHECK(gJet_EDM.isValid());
71
72 for(const xAOD::gFexJetRoI* gFexRoI : * gJet_EDM) {
73
74 auto jetType = gFexRoI->gFexType();
75 if ( jetType != 1 and jetType != 2 ) { continue; } // 1 = gFEX gBlockLead, 2 = gFEX gBlockSub (L1Topo gJet)
76
77 ATH_MSG_DEBUG( "EDM gFex Jet type: "
78 << gFexRoI->gFexType()
79 << " Et: "
80 << gFexRoI->et() // returns the et value of the jet in units of MeV
81 << " gFexTobEt: "
82 << gFexRoI->gFexTobEt() // returns the et value of the jet in units of 200 MeV
83 << " eta: "
84 << gFexRoI->eta() // returns a floating point eta corresponding to the center of the tower (fixed values, defined in gFexJetRoI_v1.cxx)
85 << " phi: "
86 << gFexRoI->phi() // returns a floating point phi corresponding to the center of the tower
87 << " iPhiTopo: "
88 << gFexRoI->iPhiTopo() // returns an integer phi from 0 to 127
89 );
90
91 unsigned int EtTopo = gFexRoI->gFexTobEt()*m_EtJet_conversion;
92 unsigned int phiTopo = gFexRoI->iPhiTopo()*m_phi_conversion;
93 int etaTopo = static_cast<int>(gFexRoI->eta()*m_eta_conversion);
94
95 TCS::gJetTOB gJet( EtTopo, etaTopo, phiTopo );
96
97 gJet.setEtDouble( static_cast<double>(EtTopo*m_EtDoubleJet_conversion) );
98 gJet.setEtaDouble( static_cast<double>(etaTopo*m_etaDouble_conversion) );
99 gJet.setPhiDouble( static_cast<double>(phiTopo*m_phiDouble_conversion) );
100
101 inputEvent.addgJet( gJet );
102 auto mon_h_gJetPt = Monitored::Scalar("gJetTOBPt", gJet.EtDouble());
103 auto mon_h_gJetPhi = Monitored::Scalar("gJetTOBPhi", gJet.phi());
104 auto mon_h_gJetEta = Monitored::Scalar("gJetTOBEta", gJet.eta());
105 Monitored::Group(m_monTool, mon_h_gJetPt, mon_h_gJetPhi, mon_h_gJetEta);
106
107 }
108
109 return StatusCode::SUCCESS;
110
111}
112
113
114StatusCode
116
117 if (m_gLJet_EDMKey.empty()) {
118 ATH_MSG_DEBUG("gFex LJet input disabled, skip filling");
119 return StatusCode::SUCCESS;
120 }
121
123 ATH_CHECK(gLJet_EDM.isValid());
124
125 for(const xAOD::gFexJetRoI* gFexRoI : * gLJet_EDM) {
126
127 auto jetType = gFexRoI->gFexType();
128 if ( jetType != 3 ) { continue; } // 3 = gFEX gJet (L1Topo gLJet)
129
130 ATH_MSG_DEBUG( "EDM gFex LJet type: "
131 << gFexRoI->gFexType()
132 << " Et: "
133 << gFexRoI->et() // returns the et value of the jet in units of MeV
134 << " gFexTobEt: "
135 << gFexRoI->gFexTobEt() // returns the et value of the jet in units of 200 MeV
136 << " eta: "
137 << gFexRoI->eta() // returns a floating point eta corresponding to the center of the tower (fixed values, defined in gFexJetRoI_v1.cxx)
138 << " phi: "
139 << gFexRoI->phi() // returns a floating point phi corresponding to the center of the tower
140 << " iPhiTopo: "
141 << gFexRoI->iPhiTopo() // returns an integer phi from 0 to 127
142 );
143
144 unsigned int EtTopo = gFexRoI->gFexTobEt()*m_EtJet_conversion;
145 unsigned int phiTopo = gFexRoI->iPhiTopo()*m_phi_conversion;
146 int etaTopo = static_cast<int>(gFexRoI->eta()*m_eta_conversion);
147
148 TCS::gLJetTOB gJet( EtTopo, etaTopo, phiTopo );
149
150 gJet.setEtDouble( static_cast<double>(EtTopo*m_EtDoubleJet_conversion) );
151 gJet.setEtaDouble( static_cast<double>(etaTopo*m_etaDouble_conversion) );
152 gJet.setPhiDouble( static_cast<double>(phiTopo*m_phiDouble_conversion) );
153
154 inputEvent.addgLJet( gJet );
155 auto mon_h_gLJetPt = Monitored::Scalar("gLJetTOBPt", gJet.EtDouble());
156 auto mon_h_gLJetPhi = Monitored::Scalar("gLJetTOBPhi", gJet.phi());
157 auto mon_h_gLJetEta = Monitored::Scalar("gLJetTOBEta", gJet.eta());
158 Monitored::Group(m_monTool, mon_h_gLJetPt, mon_h_gLJetPhi, mon_h_gLJetEta);
159
160 }
161
162 return StatusCode::SUCCESS;
163
164}
165
166
167StatusCode
169
170 if (m_gXEJWOJ_EDMKey.empty()) {
171 ATH_MSG_DEBUG("gFex XEJWOJ input disabled, skip filling");
172 return StatusCode::SUCCESS;
173 }
174
176 ATH_CHECK(gXEJWOJ_EDM.isValid());
177
178 for(const xAOD::gFexGlobalRoI* gFexRoI : * gXEJWOJ_EDM) {
179
180 auto globalType = gFexRoI->globalType();
181 if ( globalType != 2 ) { continue; } // 2 = MET components (METx, METy)
182
183 ATH_MSG_DEBUG( "EDM gFex XEJWOJ type: "
184 << gFexRoI->globalType()
185 << " Ex: "
186 << gFexRoI->METquantityOne() // returns the Ex component in MeV
187 << " Ey: "
188 << gFexRoI->METquantityTwo() // returns the Ey component in MeV
189 );
190
191 int ExTopo = gFexRoI->METquantityOne()*m_EtGlobal_conversion;
192 int EyTopo = gFexRoI->METquantityTwo()*m_EtGlobal_conversion;
193
194 unsigned long long ExTopoLong = static_cast<unsigned long long>(ExTopo);
195 unsigned long long EyTopoLong = static_cast<unsigned long long>(EyTopo);
196
197 unsigned long long Et2Topo = ExTopoLong*ExTopoLong + EyTopoLong*EyTopoLong;
198 unsigned int EtTopo = std::sqrt(Et2Topo);
199
200 TCS::gXETOB gxe( -ExTopo, -EyTopo, EtTopo, TCS::GXEJWOJ );
201
202 gxe.setExDouble( static_cast<double>(ExTopo*m_EtDoubleGlobal_conversion) );
203 gxe.setEyDouble( static_cast<double>(EyTopo*m_EtDoubleGlobal_conversion) );
204 gxe.setEtDouble( static_cast<double>(EtTopo*m_EtDoubleGlobal_conversion) );
205 gxe.setEt2( Et2Topo );
206
207 inputEvent.setgXEJWOJ( gxe );
208 auto mon_h_gXEJWOJPt = Monitored::Scalar("gXEJWOJTOBPt", gxe.EtDouble());
209 auto mon_h_gXEJWOJPhi = Monitored::Scalar("gXEJWOJTOBPhi", atan2(gxe.Ey(), gxe.Ex()));
210 Monitored::Group(m_monTool, mon_h_gXEJWOJPt, mon_h_gXEJWOJPhi);
211
212 }
213
214 return StatusCode::SUCCESS;
215
216}
217
218
219StatusCode
221
222 if (m_gMHT_EDMKey.empty()) {
223 ATH_MSG_DEBUG("gFex MHT input disabled, skip filling");
224 return StatusCode::SUCCESS;
225 }
226
228 ATH_CHECK(gMHT_EDM.isValid());
229
230 for(const xAOD::gFexGlobalRoI* gFexRoI : * gMHT_EDM) {
231
232 auto globalType = gFexRoI->globalType();
233 if ( globalType != 3 ) { continue; } // 3 = MET hard term components (MHTx, MHTy)
234
235 ATH_MSG_DEBUG( "EDM gFex MHT type: "
236 << gFexRoI->globalType()
237 << " Ex: "
238 << gFexRoI->METquantityOne() // returns the Ex component in MeV
239 << " Ey: "
240 << gFexRoI->METquantityTwo() // returns the Ey component in MeV
241 );
242
243 int ExTopo = gFexRoI->METquantityOne()*m_EtGlobal_conversion;
244 int EyTopo = gFexRoI->METquantityTwo()*m_EtGlobal_conversion;
245
246 unsigned long long ExTopoLong = static_cast<unsigned long long>(ExTopo);
247 unsigned long long EyTopoLong = static_cast<unsigned long long>(EyTopo);
248
249 unsigned long long Et2Topo = ExTopoLong*ExTopoLong + EyTopoLong*EyTopoLong;
250 unsigned int EtTopo = std::sqrt(Et2Topo);
251
252 TCS::gXETOB gxe( -ExTopo, -EyTopo, EtTopo, TCS::GMHT );
253
254 gxe.setExDouble( static_cast<double>(ExTopo*m_EtDoubleGlobal_conversion) );
255 gxe.setEyDouble( static_cast<double>(EyTopo*m_EtDoubleGlobal_conversion) );
256 gxe.setEtDouble( static_cast<double>(EtTopo*m_EtDoubleGlobal_conversion) );
257 gxe.setEt2( Et2Topo );
258
259 inputEvent.setgMHT( gxe );
260 auto mon_h_gMHTPt = Monitored::Scalar("gMHTTOBPt", gxe.EtDouble());
261 auto mon_h_gMHTPhi = Monitored::Scalar("gMHTTOBPhi", atan2(gxe.Ey(), gxe.Ex()));
262 Monitored::Group(m_monTool, mon_h_gMHTPt, mon_h_gMHTPhi);
263
264 }
265
266 return StatusCode::SUCCESS;
267
268}
269
270
271StatusCode
273
274 if (m_gXENC_EDMKey.empty()) {
275 ATH_MSG_DEBUG("gFex XENC input disabled, skip filling");
276 return StatusCode::SUCCESS;
277 }
278
280 ATH_CHECK(gXENC_EDM.isValid());
281
282 for(const xAOD::gFexGlobalRoI* gFexRoI : * gXENC_EDM) {
283
284 ATH_MSG_DEBUG( "EDM gFex XENC type: "
285 << gFexRoI->globalType()
286 << " Ex: "
287 << gFexRoI->METquantityOne() // returns the Ex component in MeV
288 << " Ey: "
289 << gFexRoI->METquantityTwo() // returns the Ey component in MeV
290 );
291
292 int ExTopo = gFexRoI->METquantityOne()*m_EtGlobal_conversion;
293 int EyTopo = gFexRoI->METquantityTwo()*m_EtGlobal_conversion;
294
295 //Cast the Ex and Ey to longs to perform multiplication that is safe wrt. overflows
296 unsigned long long ExTopoLong = static_cast<unsigned long long>(ExTopo);
297 unsigned long long EyTopoLong = static_cast<unsigned long long>(EyTopo);
298
299 unsigned long long Et2Topo = ExTopoLong*ExTopoLong + EyTopoLong*EyTopoLong;
300 unsigned int EtTopo = std::sqrt(Et2Topo);
301
302 TCS::gXETOB gxe( -ExTopo, -EyTopo, EtTopo, TCS::GXENC );
303
304 gxe.setExDouble( static_cast<double>(ExTopo*m_EtDoubleGlobal_conversion) );
305 gxe.setEyDouble( static_cast<double>(EyTopo*m_EtDoubleGlobal_conversion) );
306 gxe.setEtDouble( static_cast<double>(EtTopo*m_EtDoubleGlobal_conversion) );
307 gxe.setEt2( Et2Topo );
308
309 inputEvent.setgXENC( gxe );
310 auto mon_h_gXENCPt = Monitored::Scalar("gXENCTOBPt", gxe.EtDouble());
311 Monitored::Group(m_monTool, mon_h_gXENCPt);
312
313 }
314
315 return StatusCode::SUCCESS;
316
317}
318
319
320StatusCode
322
323 if (m_gXERHO_EDMKey.empty()) {
324 ATH_MSG_DEBUG("gFex XENC input disabled, skip filling");
325 return StatusCode::SUCCESS;
326 }
327
329 ATH_CHECK(gXERHO_EDM.isValid());
330
331 for(const xAOD::gFexGlobalRoI* gFexRoI : * gXERHO_EDM) {
332
333 ATH_MSG_DEBUG( "EDM gFex XERHO type: "
334 << gFexRoI->globalType()
335 << " Ex: "
336 << gFexRoI->METquantityOne() // returns the Ex component in MeV
337 << " Ey: "
338 << gFexRoI->METquantityTwo() // returns the Ey component in MeV
339 );
340
341 int ExTopo = gFexRoI->METquantityOne()*m_EtGlobal_conversion;
342 int EyTopo = gFexRoI->METquantityTwo()*m_EtGlobal_conversion;
343
344 unsigned long long ExTopoLong = static_cast<unsigned long long>(ExTopo);
345 unsigned long long EyTopoLong = static_cast<unsigned long long>(EyTopo);
346
347 unsigned long long Et2Topo = ExTopoLong*ExTopoLong + EyTopoLong*EyTopoLong;
348 unsigned int EtTopo = std::sqrt(Et2Topo);
349
350 TCS::gXETOB gxe( -ExTopo, -EyTopo, EtTopo, TCS::GXERHO );
351
352 gxe.setExDouble( static_cast<double>(ExTopo*m_EtDoubleGlobal_conversion) );
353 gxe.setEyDouble( static_cast<double>(EyTopo*m_EtDoubleGlobal_conversion) );
354 gxe.setEtDouble( static_cast<double>(EtTopo*m_EtDoubleGlobal_conversion) );
355 gxe.setEt2( Et2Topo );
356
357 inputEvent.setgXERHO( gxe );
358 auto mon_h_gXERHOPt = Monitored::Scalar("gXERHOTOBPt", gxe.EtDouble());
359 Monitored::Group(m_monTool, mon_h_gXERHOPt);
360
361 }
362
363 return StatusCode::SUCCESS;
364
365}
366
367
368StatusCode
370
371 if (m_gTE_EDMKey.empty()) {
372 ATH_MSG_DEBUG("gFex TE input disabled, skip filling");
373 return StatusCode::SUCCESS;
374 }
375
377 ATH_CHECK(gTE_EDM.isValid());
378
379 for(const xAOD::gFexGlobalRoI* gFexRoI : * gTE_EDM) {
380
381 auto globalType = gFexRoI->globalType();
382 if ( globalType != 1 ) { continue; } // 1 = scalar values (MET, SumET)
383
384 ATH_MSG_DEBUG( "EDM gFex TE type: "
385 << gFexRoI->globalType()
386 << " sumEt: "
387 << gFexRoI->METquantityTwo() // returns sumEt in MeV
388 );
389
390 unsigned int sumEtTopo = gFexRoI->METquantityTwo()*m_EtGlobal_conversion;
391
392 TCS::gTETOB gte( sumEtTopo, TCS::GTE );
393
394 gte.setSumEtDouble( static_cast<double>(sumEtTopo*m_EtDoubleGlobal_conversion) );
395
396 inputEvent.setgTE( gte );
397 auto mon_h_gTEsumEt = Monitored::Scalar("gTEsumEt", gte.sumEtDouble());
398 Monitored::Group(m_monTool, mon_h_gTEsumEt);
399
400 }
401
402 return StatusCode::SUCCESS;
403
404}
405
406StatusCode
408 if (m_gESPRESSO_EDMKey.empty()) {
409 ATH_MSG_DEBUG("gFex ESPRESSO input disabled, skip filling");
410 return StatusCode::SUCCESS;
411 }
412
414 if (! gESPRESSO_EDM.isValid() ) {
415 //gESPRESSO is only active in HI runs and only available from data. If not present simply skip it.
416 ATH_MSG_DEBUG("gFex ESPRESSO input is not available, skip filling");
417 return StatusCode::SUCCESS;
418 }
419
420 for(const xAOD::gFexGlobalRoI* gFexRoI : * gESPRESSO_EDM) {
421
422 auto globalType = gFexRoI->globalType();
423 if ( globalType != 1 ) { continue; } // 1 = scalar values (MET, SumET)
424
425 ATH_MSG_DEBUG( "EDM gFex ESPRESSO type: "
426 << gFexRoI->globalType()
427 << " sumEt: "
428 << gFexRoI->METquantityTwo() // returns sumEt in MeV
429 );
430
431 unsigned int sumEtTopo = gFexRoI->METquantityTwo()*m_EtGlobal_conversion;
432
433 TCS::gTETOB gespresso( sumEtTopo, TCS::GESPRESSO );
434
435 gespresso.setSumEtDouble( static_cast<double>(sumEtTopo*m_EtDoubleGlobal_conversion) );
436
437 inputEvent.setgESPRESSO( gespresso );
438 auto mon_h_gTEsumEt = Monitored::Scalar("gESPRESSOsumEt", gespresso.sumEtDouble());
439 Monitored::Group(m_monTool, mon_h_gTEsumEt);
440
441 }
442
443 return StatusCode::SUCCESS;
444}
445
446StatusCode
448 ATH_CHECK(fillSRJet(inputEvent));
449 ATH_CHECK(fillLRJet(inputEvent));
450
451 ATH_CHECK(fillXEJWOJ(inputEvent));
452 ATH_CHECK(fillMHT(inputEvent));
453 ATH_CHECK(fillXENC(inputEvent));
454 ATH_CHECK(fillXERHO(inputEvent));
455
456 ATH_CHECK(fillTE(inputEvent));
457 ATH_CHECK(fillGESPRESSO(inputEvent));
458 return StatusCode::SUCCESS;
459}
460
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
static const double m_EtGlobal_conversion
SG::ReadHandleKey< xAOD::gFexGlobalRoIContainer > m_gXERHO_EDMKey
StatusCode fillLRJet(TCS::TopoInputEvent &inputEvent) const
SG::ReadHandleKey< xAOD::gFexGlobalRoIContainer > m_gTE_EDMKey
static const double m_phiDouble_conversion
static const double m_EtDoubleJet_conversion
SG::ReadHandleKey< xAOD::gFexGlobalRoIContainer > m_gXENC_EDMKey
StatusCode fillXEJWOJ(TCS::TopoInputEvent &inputEvent) const
virtual StatusCode fillTopoInputEvent(TCS::TopoInputEvent &) const override final
StatusCode fillSRJet(TCS::TopoInputEvent &inputEvent) const
static const double m_EtDoubleGlobal_conversion
StatusCode fillGESPRESSO(TCS::TopoInputEvent &inputEvent) const
static const int m_EtJet_conversion
SG::ReadHandleKey< xAOD::gFexGlobalRoIContainer > m_gESPRESSO_EDMKey
SG::ReadHandleKey< xAOD::gFexGlobalRoIContainer > m_gXEJWOJ_EDMKey
StatusCode fillXENC(TCS::TopoInputEvent &inputEvent) const
static const int m_eta_conversion
StatusCode fillTE(TCS::TopoInputEvent &inputEvent) const
SG::ReadHandleKey< xAOD::gFexJetRoIContainer > m_gJet_EDMKey
static const int m_phi_conversion
static const double m_etaDouble_conversion
StatusCode fillXERHO(TCS::TopoInputEvent &inputEvent) const
StatusCode fillMHT(TCS::TopoInputEvent &inputEvent) const
SG::ReadHandleKey< xAOD::gFexGlobalRoIContainer > m_gMHT_EDMKey
gFexInputProvider(const std::string &type, const std::string &name, const IInterface *parent)
virtual StatusCode initialize() override final
ToolHandle< GenericMonitoringTool > m_monTool
SG::ReadHandleKey< xAOD::gFexJetRoIContainer > m_gLJet_EDMKey
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode setgMHT(const gXETOB &gMHT)
StatusCode addgLJet(const gLJetTOB &jet)
StatusCode addgJet(const gJetTOB &jet)
StatusCode setgXENC(const gXETOB &gXENC)
StatusCode setgESPRESSO(const gTETOB &gESPRESSO)
StatusCode setgXEJWOJ(const gXETOB &gXEJWOJ)
StatusCode setgXERHO(const gXETOB &gXERHO)
StatusCode setgTE(const gTETOB &gTE)
void setEtDouble(double et)
Definition gJetTOB.h:50
void setEtaDouble(double eta)
Definition gJetTOB.h:51
unsigned phi() const
Definition gJetTOB.h:39
void setPhiDouble(double phi)
Definition gJetTOB.h:52
int eta() const
Definition gJetTOB.h:38
double EtDouble() const
Definition gJetTOB.h:41
unsigned phi() const
Definition gLJetTOB.h:39
void setPhiDouble(double phi)
Definition gLJetTOB.h:52
void setEtDouble(double et)
Definition gLJetTOB.h:50
int eta() const
Definition gLJetTOB.h:38
double EtDouble() const
Definition gLJetTOB.h:41
void setEtaDouble(double eta)
Definition gLJetTOB.h:51
double sumEtDouble() const
Definition gTETOB.h:32
void setSumEtDouble(double sumEt)
Definition gTETOB.h:37
int Ey() const
Definition gXETOB.h:31
void setEt2(unsigned long long et2)
Definition gXETOB.h:43
void setEyDouble(double ey)
Definition gXETOB.h:46
int Ex() const
Definition gXETOB.h:30
void setEtDouble(double et)
Definition gXETOB.h:47
void setExDouble(double ex)
Definition gXETOB.h:45
double EtDouble() const
Definition gXETOB.h:37
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
STL namespace.
gFexJetRoI_v1 gFexJetRoI
Define the latest version of the gFexJetRoI class.
Definition gFexJetRoI.h:16
gFexGlobalRoI_v1 gFexGlobalRoI
Define the latest version of the eFexEMRoI class.