ATLAS Offline Software
Loading...
Searching...
No Matches
jFEXsumETAlgo.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// jFEXsumETAlgo - Algorithm for Sum ET Algorithm in jFEX
6// -------------------
7// begin : 12 05 2021
8// email : Sergi.Rodriguez@cern.ch
9//***************************************************************************
10#include <vector>
11#include <math.h>
12#include "jFEXsumETAlgo.h"
13#include "L1CaloFEXSim/jTower.h"
16
17namespace LVL1{
18
19//Default Constructor
20LVL1::jFEXsumETAlgo::jFEXsumETAlgo(const std::string& type, const std::string& name, const IInterface* parent): AthAlgTool(type, name, parent) {
21 declareInterface<IjFEXsumETAlgo>(this);
22}
23
27
29 ATH_CHECK(m_jTowerContainerKey.initialize());
30 return StatusCode::SUCCESS;
31}
32
33//calls container for TT
35
37 if(! m_jTowerContainer.isValid()) {
38 ATH_MSG_ERROR("Could not retrieve jTowerContainer " << m_jTowerContainerKey.key());
39 return StatusCode::FAILURE;
40 }
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//
54
55 ATH_MSG_DEBUG("---------------- jFEXsumETAlgo::setup ----------------");
57 for(int iphi=0;iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height;iphi++){
58 for(int ieta=8;ieta<16;ieta++){
59 m_FPGA[iphi].push_back(FPGA[iphi][ieta]);
60 }
61 }
62}
63
65
66 ATH_MSG_DEBUG("---------------- jFEXsumETAlgo::setup ----------------");
68 for(int iphi=0;iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height;iphi++){
69 for(int ieta=8;ieta<17;ieta++){
70 m_FPGA[iphi].push_back(FPGA[iphi][ieta]);
71 }
72 }
73 m_FPGA_phi02.resize(16);
74 for(int iphi=0;iphi<16;iphi++){
75 for(int ieta=17;ieta<21;ieta++){
76 m_FPGA_phi02[iphi].push_back(FPGA[iphi][ieta]);
77 }
78 }
79 m_FPGA_fcal.resize(8);
80 for(int iphi=0;iphi<8;iphi++){
81 for(int ieta=21;ieta<FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width;ieta++){
82 m_FPGA_fcal[iphi].push_back(FPGA[iphi][ieta]);
83 }
84 }
85
86}
87
88//this function calculates SumET for the barrel region
90{
91 ATH_MSG_DEBUG("---------------- jFEXsumETAlgo::buildBarrelSumET ----------------");
92
93 m_SumET.clear();
94 m_SumET.resize(8,0);
95 m_SumETSat.clear();
96 m_SumETSat.resize(8,0);
97
98 for(uint iphi=0;iphi<m_FPGA.size();iphi++){
99 for(uint ieta=0;ieta<m_FPGA[iphi].size();ieta++){
100 m_SumET[ieta]+=getTTowerET(m_FPGA[iphi][ieta]);
101 m_SumETSat[ieta] = m_SumETSat[ieta] || getTTowerSat(m_FPGA[iphi][ieta]);
102 }
103 }
104
105}
106
107//this function calculates SumET for the forward region
109{
110 ATH_MSG_DEBUG("---------------- jFEXsumETAlgo::buildFWDSumET ----------------");
111
112 m_SumET.clear();
113 m_SumET.resize(14,0);
114 m_SumETSat.clear();
115 m_SumETSat.resize(14,0);
116
117 // ECal with resolution of 0.1x0.1
118 for(uint iphi=0;iphi<m_FPGA.size();iphi++){
119 for(uint ieta=0;ieta<m_FPGA[iphi].size();ieta++){
120 m_SumET[ieta]+=getTTowerET(m_FPGA[iphi][ieta]);
121 m_SumETSat.at(ieta) = m_SumETSat.at(ieta) || getTTowerSat(m_FPGA[iphi][ieta]);
122 }
123 }
124
125 // ECal with resolution of 0.2x0.2
126 for(uint iphi=0;iphi<m_FPGA_phi02.size();iphi++){
127 for(uint ieta=0;ieta<m_FPGA_phi02[iphi].size();ieta++){
128 m_SumET[ieta+9]+=getTTowerET(m_FPGA_phi02[iphi][ieta]);
129 m_SumETSat.at(ieta+9) = m_SumETSat.at(ieta+9) || getTTowerSat(m_FPGA_phi02[iphi][ieta]);
130 }
131 }
132
133 // Fcal
134 for(uint iphi=0;iphi<m_FPGA_fcal.size();iphi++){
135 for(uint ieta=0;ieta<m_FPGA_fcal[iphi].size();ieta++){
136 m_SumET[13]+=getTTowerET(m_FPGA_fcal[iphi][ieta]); //All FCAL is considered one slice due to the non-aligment of the FCal layers
137 m_SumETSat.at(13) = m_SumETSat.at(13) || getTTowerSat(m_FPGA_fcal[iphi][ieta]);
138 }
139 }
140
141}
142
143std::tuple<int, bool> LVL1::jFEXsumETAlgo::getETlowerEta(uint bin) const
144{
145 uint max = m_SumET.size() > (bin + 1) ? bin : m_SumET.size();
146 int SumlowEta = 0;
147 bool SumlowEtaSat = false;
148 for(uint ieta=0;ieta<max;ieta++){
149 SumlowEta += m_SumET.at(ieta);
150 SumlowEtaSat = SumlowEtaSat || m_SumETSat.at(ieta);
151 }
152 return {SumlowEta, SumlowEtaSat};
153}
154
155
156
157std::tuple<int, bool> LVL1::jFEXsumETAlgo::getETupperEta(uint bin) const
158{
159 uint min = m_SumET.size() > (bin + 1) ? bin : m_SumET.size();
160 int SumhighEta = 0;
161 bool SumhighEtaSat = false;
162 for(uint ieta=min;ieta<m_SumET.size();ieta++){
163 SumhighEta += m_SumET.at(ieta);
164 SumhighEtaSat = SumhighEtaSat || m_SumETSat.at(ieta);
165 }
166 return {SumhighEta, SumhighEtaSat};
167}
168
169
170//getter for tower saturation
171bool LVL1::jFEXsumETAlgo::getTTowerSat(unsigned int TTID ) {
172 if(TTID == 0) {
173 return false;
174 }
175
176 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(TTID);
177 return tmpTower->getTowerSat();
178}
179
180//Gets the ET for the TT. This ET is EM + HAD
181int LVL1::jFEXsumETAlgo::getTTowerET(unsigned int TTID ) const {
182 if(TTID == 0) {
183 return 0;
184 }
185
186 auto itr = m_map_Etvalues.find(TTID);
187 if( itr == m_map_Etvalues.end()) {
188 return 0;
189 }
190
191 return (itr->second).at(1);
192}
193
194
195void LVL1::jFEXsumETAlgo::setFPGAEnergy(std::unordered_map<int,std::vector<int> > et_map){
196 m_map_Etvalues=std::move(et_map);
197}
198
199
200}// end of namespace LVL1
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
unsigned int uint
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
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
std::unordered_map< int, std::vector< int > > m_map_Etvalues
std::vector< bool > m_SumETSat
virtual StatusCode safetyTest() override
virtual std::tuple< int, bool > getETupperEta(uint bin) const override
virtual ~jFEXsumETAlgo()
Destructor.
std::vector< std::vector< int > > m_FPGA_fcal
virtual StatusCode reset() override
virtual void setFPGAEnergy(std::unordered_map< int, std::vector< int > > et_map) override
virtual void buildBarrelSumET() override
jFEXsumETAlgo(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
virtual void buildFWDSumET() override
std::vector< std::vector< int > > m_FPGA_phi02
std::vector< int > m_SumET
virtual void setup(int FPGA[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width]) override
std::vector< std::vector< int > > m_FPGA
virtual StatusCode initialize() override
standard Athena-Algorithm method
SG::ReadHandleKey< LVL1::jTowerContainer > m_jTowerContainerKey
virtual int getTTowerET(unsigned int TTID=0) const override
virtual std::tuple< int, bool > getETlowerEta(uint bin) const override
bool getTTowerSat(unsigned int TTID)
SG::ReadHandle< jTowerContainer > m_jTowerContainer
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
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...