ATLAS Offline Software
Loading...
Searching...
No Matches
jFEXmetAlgo.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// jFEXmetAlgo - Algorithm for MET Algorithm in jFEX
6// -------------------
7// begin : 14 05 2021
8// email : Sergi.Rodriguez@cern.ch
9//***************************************************************************
10#include <vector>
11#include <stdio.h>
12#include <math.h>
13#include "jFEXmetAlgo.h"
14#include "L1CaloFEXSim/jTower.h"
17
18namespace LVL1{
19
20//Default Constructor
21LVL1::jFEXmetAlgo::jFEXmetAlgo(const std::string& type, const std::string& name, const IInterface* parent): AthAlgTool(type, name, parent) {
22 declareInterface<IjFEXmetAlgo>(this);
23}
24
28
30 ATH_CHECK(m_jTowerContainerKey.initialize());
31 return StatusCode::SUCCESS;
32}
33
34//calls container for TT
36
38 if(!m_jTowerContainer.isValid()) {
39 ATH_MSG_ERROR("Could not retrieve jTowerContainer " << m_jTowerContainerKey.key());
40 return StatusCode::FAILURE;
41 }
42 return StatusCode::SUCCESS;
43}
44
46 m_FPGA.clear();
47 m_FPGA_phi02.clear();
48 m_FPGA_fcal.clear();
49 return StatusCode::SUCCESS;
50}
51
52//Setup for the central region
54
55 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::setup ----------------");
56
57 m_hemisphere = hemisphere;
58 m_saturation = false;
59
61 for(int iphi=0;iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height;iphi++){
62 for(int ieta=8;ieta<16;ieta++){
63 m_FPGA[iphi].push_back(FPGA[iphi][ieta]);
64 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
65 }
66 }
67}
68
69//Setup for the forward region
71
72 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::setup ----------------");
73
74 m_hemisphere = hemisphere;
75 m_saturation = false;
76
78 for(int iphi=0;iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height;iphi++){
79 for(int ieta=8;ieta<17;ieta++){
80 m_FPGA[iphi].push_back(FPGA[iphi][ieta]);
81 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
82 }
83 }
84 m_FPGA_phi02.resize(16);
85 for(int iphi=0;iphi<16;iphi++){
86 for(int ieta=17;ieta<21;ieta++){
87 m_FPGA_phi02[iphi].push_back(FPGA[iphi][ieta]);
88 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
89 }
90 }
91 m_FPGA_fcal.resize(8);
92 for(int iphi=0;iphi<8;iphi++){
93 for(int ieta=21;ieta<FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width;ieta++){
94 m_FPGA_fcal[iphi].push_back(FPGA[iphi][ieta]);
95 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
96 }
97 }
98
99}
100
101//this function calculates met in the central barrels
103{
104 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::buildBarrelmet ----------------");
105
108 m_met.clear();
109 m_met.resize(32,0);
110 m_met_angle.clear();
111 m_met_angle.resize(32,0);
112
113 for(uint iphi=0;iphi<m_FPGA.size();iphi++){
114 for(uint ieta=0;ieta<m_FPGA[iphi].size();ieta++){
115 m_met[iphi]+=getTTowerET(m_FPGA[iphi][ieta]);
116 }
117 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA[iphi][0]);
118 m_met_angle[iphi]=tmpTower->centrephi_toPI();
119 }
122}
123
124//this function calculates met in the forward modules
126{
127 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::buildFWDmet ----------------");
128
131
132 //Granularity of phi = 0.1
133 m_met.clear();
134 m_met.resize(m_FPGA.size(),0);
135 m_met_angle.clear();
136 m_met_angle.resize(m_FPGA.size(),0);
137
138 for(uint iphi=0;iphi<m_FPGA.size();iphi++){
139 for(uint ieta=0;ieta<m_FPGA[iphi].size();ieta++){
140 m_met[iphi]+=getTTowerET(m_FPGA[iphi][ieta]);
141 }
142 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA[iphi][0]);
143 m_met_angle[iphi]=tmpTower->centrephi_toPI();
144 }
147
148 //Granularity of phi = 0.2
149 m_met.clear();
150 m_met.resize(m_FPGA_phi02.size(),0);
151 m_met_angle.clear();
152 m_met_angle.resize(m_FPGA_phi02.size(),0);
153
154 for(uint iphi=0;iphi<m_FPGA_phi02.size();iphi++){
155 for(uint ieta=0;ieta<m_FPGA_phi02[iphi].size();ieta++){
156 m_met[iphi]+=getTTowerET(m_FPGA_phi02[iphi][ieta]);
157 }
158 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA_phi02[iphi][0]);
159 m_met_angle[iphi]=tmpTower->centrephi_toPI();
160 }
163
164 //Granularity of phi = 0.4
165 m_met.clear();
166 m_met.resize(m_FPGA_fcal.size(),0);
167 m_met_angle.clear();
168 m_met_angle.resize(m_FPGA_fcal.size(),0);
169
170 for(uint iphi=0;iphi<m_FPGA_fcal.size();iphi++){
171 for(uint ieta=0;ieta<m_FPGA_fcal[iphi].size();ieta++){
172 m_met[iphi]+=getTTowerET(m_FPGA_fcal[iphi][ieta]);
173 }
174 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA_fcal[iphi][0]);
175 m_met_angle[iphi]=(static_cast<int>(tmpTower->iPhi()/4))*(M_PI/8) + M_PI/16;
176 }
179
180}
181
182//build Met X component for the central barrels
184{
185
186 m_met_Xcoord.clear();
187 m_met_Xcoord.resize(m_met.size(),0);
188 //computing the X and Y component of MET
189
190 for(uint iphi=0;iphi<m_met.size();iphi++){
191 int cos = std::round(std::cos(m_met_angle[iphi]) * m_firmware_scale * m_hemisphere);
192 m_met_Xcoord[iphi]= m_met[iphi]*cos;
193 }
194
195 //Summing all X coordinate
196 for(auto met_val : m_met_Xcoord){
197 m_Totalmet_Xcoord += met_val;
198 }
199}
200
201//return the X component of the Met
206
207//build Met Y component for the central barrels
209{
210
211 m_met_Ycoord.clear();
212 m_met_Ycoord.resize(m_met.size(),0);
213 //computing the X and Y component of MET
214 for(uint iphi=0;iphi<m_met.size();iphi++){
215 int sin = std::round(std::sin(m_met_angle[iphi]) * m_firmware_scale * m_hemisphere) ;
216 m_met_Ycoord[iphi]= m_met[iphi]*sin;
217 }
218
219 //Summing all Y coordinate
220 for(auto met_val : m_met_Ycoord){
221 m_Totalmet_Ycoord += met_val;
222 }
223}
224
225//return the Y component of the Met
230
231//Gets the ET for the TT. This ET is EM + HAD
232int LVL1::jFEXmetAlgo::getTTowerET(unsigned int TTID ) {
233 if(TTID == 0) {
234 return 0;
235 }
236
237 if(m_map_Etvalues.find(TTID) != m_map_Etvalues.end()) {
238 return m_map_Etvalues[TTID][1];
239 }
240
241 //we shouldn't arrive here
242 return 0;
243
244}
245
247 return m_saturation;
248}
249
250//getter for tower saturation
251bool LVL1::jFEXmetAlgo::getTTowerSat(unsigned int TTID ) {
252 if(TTID == 0) {
253 return false;
254 }
255
256 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(TTID);
257 return tmpTower->getTowerSat();
258}
259
260
261void LVL1::jFEXmetAlgo::setFPGAEnergy(std::unordered_map<int,std::vector<int> > et_map){
262 m_map_Etvalues=std::move(et_map);
263}
264}// end of namespace LVL1
#define M_PI
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
unsigned int uint
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
static constexpr int jFEX_wide_algoSpace_width
static constexpr int jFEX_thin_algoSpace_width
static constexpr int jFEX_algoSpace_height
virtual int getTTowerET(unsigned int TTID) override
std::vector< std::vector< int > > m_FPGA
Definition jFEXmetAlgo.h:54
virtual StatusCode reset() override
static constexpr unsigned int m_firmware_bit_offset
Definition jFEXmetAlgo.h:72
virtual ~jFEXmetAlgo()
Destructor.
std::vector< std::vector< int > > m_FPGA_fcal
Definition jFEXmetAlgo.h:56
virtual void buildMetYComponent()
SG::ReadHandleKey< LVL1::jTowerContainer > m_jTowerContainerKey
Definition jFEXmetAlgo.h:51
std::unordered_map< int, std::vector< int > > m_map_Etvalues
Definition jFEXmetAlgo.h:74
virtual void buildFWDmet() override
virtual void buildBarrelmet() override
virtual void buildMetXComponent()
virtual bool getjXESat() const override
std::vector< long long > m_met
Definition jFEXmetAlgo.h:57
long long m_Totalmet_Xcoord
Definition jFEXmetAlgo.h:61
long long m_Totalmet_Ycoord
Definition jFEXmetAlgo.h:62
std::vector< long long > m_met_Ycoord
Definition jFEXmetAlgo.h:60
SG::ReadHandle< jTowerContainer > m_jTowerContainer
Definition jFEXmetAlgo.h:52
bool getTTowerSat(unsigned int TTID)
virtual StatusCode initialize() override
standard Athena-Algorithm method
virtual int GetMetXComponent() override
static constexpr unsigned int m_firmware_scale
Definition jFEXmetAlgo.h:71
std::vector< long long > m_met_Xcoord
Definition jFEXmetAlgo.h:59
std::vector< std::vector< int > > m_FPGA_phi02
Definition jFEXmetAlgo.h:55
virtual void setup(int FPGA[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width], int hemisphere) override
std::vector< float > m_met_angle
Definition jFEXmetAlgo.h:58
virtual StatusCode safetyTest() override
virtual void setFPGAEnergy(std::unordered_map< int, std::vector< int > > et_map) override
virtual int GetMetYComponent() override
jFEXmetAlgo(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
The jTower class is an interface object for jFEX trigger algorithms The purposes are twofold:
Definition jTower.h:36
bool getTowerSat() const
Definition jTower.h:61
int iPhi() const
Return global phi index.
Definition jTower.cxx:171
float centrephi_toPI() const
Definition jTower.h:81
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...