ATLAS Offline Software
Loading...
Searching...
No Matches
jFEXmetAlgo.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// jFEXmetAlgo - Algorithm for MET Algorithm in jFEX
6// -------------------
7// begin : 14 05 2021
8// email : Sergi.Rodriguez@cern.ch
9//***************************************************************************
10
11#include "jFEXmetAlgo.h"
12
13namespace LVL1{
14
15//Default Constructor
16LVL1::jFEXmetAlgo::jFEXmetAlgo(const std::string& type, const std::string& name, const IInterface* parent): AthAlgTool(type, name, parent) {
17 declareInterface<IjFEXmetAlgo>(this);
18}
19
21 ATH_CHECK(m_jTowerContainerKey.initialize());
22 return StatusCode::SUCCESS;
23}
24
25//calls container for TT
27
29 if(!m_jTowerContainer.isValid()) {
30 ATH_MSG_ERROR("Could not retrieve jTowerContainer " << m_jTowerContainerKey.key());
31 return StatusCode::FAILURE;
32 }
33 return StatusCode::SUCCESS;
34}
35
37 m_FPGA.clear();
38 m_FPGA_phi02.clear();
39 m_FPGA_fcal.clear();
40 return StatusCode::SUCCESS;
41}
42
43//Setup for the central region
45
46 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::setup ----------------");
47
48 m_hemisphere = hemisphere;
49 m_saturation = false;
50
52 for(int iphi=0;iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height;iphi++){
53 for(int ieta=8;ieta<16;ieta++){
54 m_FPGA[iphi].push_back(FPGA[iphi][ieta]);
55 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
56 }
57 }
58}
59
60//Setup for the forward region
62
63 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::setup ----------------");
64
65 m_hemisphere = hemisphere;
66 m_saturation = false;
67
69 for(int iphi=0;iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height;iphi++){
70 for(int ieta=8;ieta<17;ieta++){
71 m_FPGA[iphi].push_back(FPGA[iphi][ieta]);
72 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
73 }
74 }
75 m_FPGA_phi02.resize(16);
76 for(int iphi=0;iphi<16;iphi++){
77 for(int ieta=17;ieta<21;ieta++){
78 m_FPGA_phi02[iphi].push_back(FPGA[iphi][ieta]);
79 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
80 }
81 }
82 m_FPGA_fcal.resize(8);
83 for(int iphi=0;iphi<8;iphi++){
84 for(int ieta=21;ieta<FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width;ieta++){
85 m_FPGA_fcal[iphi].push_back(FPGA[iphi][ieta]);
86 m_saturation = m_saturation || getTTowerSat(FPGA[iphi][ieta]);
87 }
88 }
89
90}
91
92//this function calculates met in the central barrels
94{
95 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::buildBarrelmet ----------------");
96
99 m_met.clear();
100 m_met.resize(32,0);
101 m_met_angle.clear();
102 m_met_angle.resize(32,0);
103
104 for(uint iphi=0;iphi<m_FPGA.size();iphi++){
105 for(uint ieta=0;ieta<m_FPGA[iphi].size();ieta++){
106 m_met[iphi]+=getTTowerET(m_FPGA[iphi][ieta]);
107 }
108 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA[iphi][0]);
109 m_met_angle[iphi]=tmpTower->centrephi_toPI();
110 }
113}
114
115//this function calculates met in the forward modules
117{
118 ATH_MSG_DEBUG("---------------- jFEXmetAlgo::buildFWDmet ----------------");
119
122
123 //Granularity of phi = 0.1
124 m_met.clear();
125 m_met.resize(m_FPGA.size(),0);
126 m_met_angle.clear();
127 m_met_angle.resize(m_FPGA.size(),0);
128
129 for(uint iphi=0;iphi<m_FPGA.size();iphi++){
130 for(uint ieta=0;ieta<m_FPGA[iphi].size();ieta++){
131 m_met[iphi]+=getTTowerET(m_FPGA[iphi][ieta]);
132 }
133 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA[iphi][0]);
134 m_met_angle[iphi]=tmpTower->centrephi_toPI();
135 }
138
139 //Granularity of phi = 0.2
140 m_met.clear();
141 m_met.resize(m_FPGA_phi02.size(),0);
142 m_met_angle.clear();
143 m_met_angle.resize(m_FPGA_phi02.size(),0);
144
145 for(uint iphi=0;iphi<m_FPGA_phi02.size();iphi++){
146 for(uint ieta=0;ieta<m_FPGA_phi02[iphi].size();ieta++){
147 m_met[iphi]+=getTTowerET(m_FPGA_phi02[iphi][ieta]);
148 }
149 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA_phi02[iphi][0]);
150 m_met_angle[iphi]=tmpTower->centrephi_toPI();
151 }
154
155 //Granularity of phi = 0.4
156 m_met.clear();
157 m_met.resize(m_FPGA_fcal.size(),0);
158 m_met_angle.clear();
159 m_met_angle.resize(m_FPGA_fcal.size(),0);
160
161 for(uint iphi=0;iphi<m_FPGA_fcal.size();iphi++){
162 for(uint ieta=0;ieta<m_FPGA_fcal[iphi].size();ieta++){
163 m_met[iphi]+=getTTowerET(m_FPGA_fcal[iphi][ieta]);
164 }
165 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA_fcal[iphi][0]);
166 m_met_angle[iphi]=(static_cast<int>(tmpTower->iPhi()/4))*(M_PI/8) + M_PI/16;
167 }
170
171}
172
173//build Met X component for the central barrels
175{
176
177 m_met_Xcoord.clear();
178 m_met_Xcoord.resize(m_met.size(),0);
179 //computing the X and Y component of MET
180
181 for(uint iphi=0;iphi<m_met.size();iphi++){
182 int cos = std::round(std::cos(m_met_angle[iphi]) * m_firmware_scale * m_hemisphere);
183 m_met_Xcoord[iphi]= m_met[iphi]*cos;
184 }
185
186 //Summing all X coordinate
187 for(auto met_val : m_met_Xcoord){
188 m_Totalmet_Xcoord += met_val;
189 }
190}
191
192//return the X component of the Met
197
198//build Met Y component for the central barrels
200{
201
202 m_met_Ycoord.clear();
203 m_met_Ycoord.resize(m_met.size(),0);
204 //computing the X and Y component of MET
205 for(uint iphi=0;iphi<m_met.size();iphi++){
206 int sin = std::round(std::sin(m_met_angle[iphi]) * m_firmware_scale * m_hemisphere) ;
207 m_met_Ycoord[iphi]= m_met[iphi]*sin;
208 }
209
210 //Summing all Y coordinate
211 for(auto met_val : m_met_Ycoord){
212 m_Totalmet_Ycoord += met_val;
213 }
214}
215
216//return the Y component of the Met
221
222//Gets the ET for the TT. This ET is EM + HAD
223int LVL1::jFEXmetAlgo::getTTowerET(unsigned int TTID ) {
224 if(TTID == 0) {
225 return 0;
226 }
227
228 if(m_map_Etvalues.find(TTID) != m_map_Etvalues.end()) {
229 return m_map_Etvalues[TTID][1];
230 }
231
232 //we shouldn't arrive here
233 return 0;
234
235}
236
238 return m_saturation;
239}
240
241//getter for tower saturation
242bool LVL1::jFEXmetAlgo::getTTowerSat(unsigned int TTID ) {
243 if(TTID == 0) {
244 return false;
245 }
246
247 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(TTID);
248 return tmpTower->getTowerSat();
249}
250
251
252void LVL1::jFEXmetAlgo::setFPGAEnergy(std::unordered_map<int,std::vector<int> > et_map){
253 m_map_Etvalues=std::move(et_map);
254}
255}// 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:55
virtual StatusCode reset() override
static constexpr unsigned int m_firmware_bit_offset
Definition jFEXmetAlgo.h:73
virtual int GetMetYComponent() const override
std::vector< std::vector< int > > m_FPGA_fcal
Definition jFEXmetAlgo.h:57
virtual void buildMetYComponent()
SG::ReadHandleKey< LVL1::jTowerContainer > m_jTowerContainerKey
Definition jFEXmetAlgo.h:52
std::unordered_map< int, std::vector< int > > m_map_Etvalues
Definition jFEXmetAlgo.h:75
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:58
long long m_Totalmet_Xcoord
Definition jFEXmetAlgo.h:62
long long m_Totalmet_Ycoord
Definition jFEXmetAlgo.h:63
std::vector< long long > m_met_Ycoord
Definition jFEXmetAlgo.h:61
SG::ReadHandle< jTowerContainer > m_jTowerContainer
Definition jFEXmetAlgo.h:53
virtual int GetMetXComponent() const override
bool getTTowerSat(unsigned int TTID)
virtual StatusCode initialize() override
standard Athena-Algorithm method
static constexpr unsigned int m_firmware_scale
Definition jFEXmetAlgo.h:72
std::vector< long long > m_met_Xcoord
Definition jFEXmetAlgo.h:60
std::vector< std::vector< int > > m_FPGA_phi02
Definition jFEXmetAlgo.h:56
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:59
virtual StatusCode safetyTest() override
virtual void setFPGAEnergy(std::unordered_map< int, std::vector< int > > et_map) 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:172
float centrephi_toPI() const
Definition jTower.h:81
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...