Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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>
14 #include "L1CaloFEXSim/jTower.h"
17 
18 namespace LVL1{
19 
20 //Default Constructor
21 LVL1::jFEXmetAlgo::jFEXmetAlgo(const std::string& type, const std::string& name, const IInterface* parent): AthAlgTool(type, name, parent) {
22  declareInterface<IjFEXmetAlgo>(this);
23 }
24 
27 }
28 
30  ATH_CHECK(m_jTowerContainerKey.initialize());
31  return StatusCode::SUCCESS;
32 }
33 
34 //calls container for TT
36 
37  m_jTowerContainer = SG::ReadHandle<jTowerContainer>(m_jTowerContainerKey);
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 
106  m_Totalmet_Xcoord=0;
107  m_Totalmet_Ycoord=0;
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  }
120  buildMetXComponent();
121  buildMetYComponent();
122 }
123 
124 //this function calculates met in the forward modules
126 {
127  ATH_MSG_DEBUG("---------------- jFEXmetAlgo::buildFWDmet ----------------");
128 
129  m_Totalmet_Xcoord=0;
130  m_Totalmet_Ycoord=0;
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  }
145  buildMetXComponent();
146  buildMetYComponent();
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  }
161  buildMetXComponent();
162  buildMetYComponent();
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  }
177  buildMetXComponent();
178  buildMetYComponent();
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
203 {
204  return m_Totalmet_Xcoord >> m_firmware_bit_offset;
205 }
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
227 {
228  return m_Totalmet_Ycoord >> m_firmware_bit_offset;
229 }
230 
231 //Gets the ET for the TT. This ET is EM + HAD
232 int 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
251 bool 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 
261 void LVL1::jFEXmetAlgo::setFPGAEnergy(std::unordered_map<int,std::vector<int> > et_map){
262  m_map_Etvalues=et_map;
263 }
264 }// end of namespace LVL1
LVL1::jFEXmetAlgo::getjXESat
virtual bool getjXESat() const override
Definition: jFEXmetAlgo.cxx:246
LVL1::jFEXmetAlgo::buildBarrelmet
virtual void buildBarrelmet() override
Definition: jFEXmetAlgo.cxx:102
LVL1::jFEXmetAlgo::getTTowerET
virtual int getTTowerET(unsigned int TTID) override
Definition: jFEXmetAlgo.cxx:232
LVL1::FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width
constexpr static int jFEX_thin_algoSpace_width
Definition: FEXAlgoSpaceDefs.h:28
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
LVL1::jTower::centrephi_toPI
float centrephi_toPI() const
Definition: jTower.h:81
MuonGM::round
float round(const float toRound, const unsigned int decimals)
Definition: Mdt.cxx:27
M_PI
#define M_PI
Definition: ActiveFraction.h:11
LVL1::jFEXmetAlgo::getTTowerSat
bool getTTowerSat(unsigned int TTID)
Definition: jFEXmetAlgo.cxx:251
LVL1::FEXAlgoSpaceDefs::jFEX_algoSpace_height
constexpr static int jFEX_algoSpace_height
Definition: FEXAlgoSpaceDefs.h:29
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
LVL1
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition: ICMMCPHitsCnvTool.h:18
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
LVL1::jFEXmetAlgo::GetMetYComponent
virtual int GetMetYComponent() override
Definition: jFEXmetAlgo.cxx:226
LVL1::jTower::getTowerSat
bool getTowerSat() const
Definition: jTower.h:61
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LVL1::jFEXmetAlgo::initialize
virtual StatusCode initialize() override
standard Athena-Algorithm method
Definition: jFEXmetAlgo.cxx:29
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
LVL1::jFEXmetAlgo::buildMetYComponent
virtual void buildMetYComponent()
Definition: jFEXmetAlgo.cxx:208
LVL1::FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width
constexpr static int jFEX_wide_algoSpace_width
Definition: FEXAlgoSpaceDefs.h:27
test_pyathena.parent
parent
Definition: test_pyathena.py:15
LVL1::jFEXmetAlgo::safetyTest
virtual StatusCode safetyTest() override
Definition: jFEXmetAlgo.cxx:35
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
LVL1::jFEXmetAlgo::setFPGAEnergy
virtual void setFPGAEnergy(std::unordered_map< int, std::vector< int > > et_map) override
Definition: jFEXmetAlgo.cxx:261
LVL1::jTower::iPhi
int iPhi() const
Return global phi index.
Definition: jTower.cxx:171
FEXAlgoSpaceDefs.h
TrigConf::name
Definition: HLTChainList.h:35
jTowerContainer.h
LVL1::jFEXmetAlgo::jFEXmetAlgo
jFEXmetAlgo(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
Definition: jFEXmetAlgo.cxx:21
LVL1::jFEXmetAlgo::buildMetXComponent
virtual void buildMetXComponent()
Definition: jFEXmetAlgo.cxx:183
LVL1::jFEXmetAlgo::GetMetXComponent
virtual int GetMetXComponent() override
Definition: jFEXmetAlgo.cxx:202
jFEXmetAlgo.h
LVL1::jFEXmetAlgo::reset
virtual StatusCode reset() override
Definition: jFEXmetAlgo.cxx:45
LVL1::jTower
The jTower class is an interface object for jFEX trigger algorithms The purposes are twofold:
Definition: jTower.h:36
LVL1::jFEXmetAlgo::setup
virtual void setup(int FPGA[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width], int hemisphere) override
Definition: jFEXmetAlgo.cxx:53
LVL1::jFEXmetAlgo::buildFWDmet
virtual void buildFWDmet() override
Definition: jFEXmetAlgo.cxx:125
LVL1::gFEX::FPGA
FPGA
Definition: GTowerHelpers.h:17
LVL1::jFEXmetAlgo::~jFEXmetAlgo
virtual ~jFEXmetAlgo()
Destructor.
Definition: jFEXmetAlgo.cxx:26
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
AthAlgTool
Definition: AthAlgTool.h:26
jTower.h