ATLAS Offline Software
Loading...
Searching...
No Matches
jFEXPileupAndNoise.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// jFEXPileupAndNoise - Algorithm for Pileup and Noise in jFEX
6// -------------------
7// begin : 24 05 2021
8// email : Sergi.Rodriguez@cern.ch
9//***************************************************************************
10
11#include "jFEXPileupAndNoise.h"
12
13namespace LVL1{
14
15//Default Constructor
16LVL1::jFEXPileupAndNoise::jFEXPileupAndNoise(const std::string& type, const std::string& name, const IInterface* parent): AthAlgTool(type, name, parent) {
17 declareInterface<IjFEXPileupAndNoise>(this);
18}
19
23
25
26 ATH_CHECK(m_jTowerContainerKey.initialize());
27 ATH_CHECK( m_BDToolKey.initialize() );
28
29 return StatusCode::SUCCESS;
30}
31
32//calls container for TT
34
36 if(! m_jTowerContainer.isValid()) {
37 ATH_MSG_ERROR("Could not retrieve jTowerContainer " << m_jTowerContainerKey.key());
38 return StatusCode::FAILURE;
39 }
40
41 return StatusCode::SUCCESS;
42}
43
45
46 m_is_FWD=0;
51
53
54 return StatusCode::SUCCESS;
55}
56
71
72
73//Setup for the central region, duplicate fuction
81
82
83//Setup for the forward region, duplicate fuction
91
92
94
96
98 if(! myDBTool.isValid()) {
99 ATH_MSG_ERROR("Could not retrieve DB tool " << m_BDToolKey);
100 }
101
102 for(int iphi=0;iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height;iphi++){
103 for(int ieta=0;ieta<m_etaMAX;ieta++){
104
105 int TTID = 0;
106
107 if(m_is_FWD){
108 TTID = m_FPGA_forward[iphi][ieta];
109 }
110 else{
111 TTID = m_FPGA_central[iphi][ieta];
112 }
113
114 if(TTID == 0){
115 continue; //skipping TTID iqual to 0
116 }
117
118 const LVL1::jTower *tmpTower = m_jTowerContainer->findTower(TTID);
119
120 int tmp_eta = getTTowerEta(tmpTower);
121 // energies used below are in MeV, but to reproduce firmware behavior we need to truncate at the same position,
122 // i.e., temporarily go back to the granularity used in firmware!
123 int em_granularity = 25;
124 int had_granularity = tmp_eta < 15 ? 500 : 25; //For Tile inputs granularity is 500MeV, for LAr 25MeV
125 //storing the energies
126 int tmp_energy_EM = getET_EM(tmpTower)/em_granularity;
127 int tmp_energy_HAD = getET_HAD(tmpTower)/had_granularity;
128 int tmp_EM_AreaINV = getTTAreaINV_EM(tmpTower);
129 int tmp_HD_AreaINV = getTTAreaINV_HAD(tmpTower);
130 m_FPGA_ET_EM[TTID] = getET_EM(tmpTower);
131 m_FPGA_ET_HAD[TTID] = getET_HAD(tmpTower);
132
133 tmp_energy_EM = (tmp_energy_EM * tmp_EM_AreaINV)/(1<<FEXAlgoSpaceDefs::pu_AreaINV);
134 tmp_energy_HAD= (tmp_energy_HAD* tmp_HD_AreaINV)/(1<<FEXAlgoSpaceDefs::pu_AreaINV);
135
136 //calculating rho's
137
138 // EM layer ( not EM FCAL!! )
139
140 if(tmp_eta < 32 ){
141 if(tmp_energy_EM > myDBTool->get_PUThrLowEm() and tmp_energy_EM < myDBTool->get_PUThrHighEm()) {
142 m_rho_EM += tmp_energy_EM;
144 }
145 }
146
147 // Tile layer
148 if(tmp_eta < 15){
149 if(tmp_energy_HAD > myDBTool->get_PUThrLowHadTrex() and tmp_energy_HAD < myDBTool->get_PUThrHighHadTrex()){
150 m_rho_HAD1 += tmp_energy_HAD;
152 }
153 }
154 // HEC Overlap layer!
155 else if(tmp_eta < 16 ){
156 if(tmp_energy_HAD > myDBTool->get_PUThrLowHadHecOverlap() and tmp_energy_HAD < myDBTool->get_PUThrHighHadHecOverlap()){
157 m_rho_HAD2 += tmp_energy_HAD;
159 }
160 }
161 // Rest of HEC without overlap
162 else if(tmp_eta < 32 ){
163 if(tmp_energy_HAD > myDBTool->get_PUThrLowHadLar() and tmp_energy_HAD < myDBTool->get_PUThrHighHadLar()){
164 m_rho_HAD3 += tmp_energy_HAD;
166 }
167 }
168 // FCAL is treated here!
169 else if(tmp_eta >= 32){
170
171 // Contributes the HAD layer (FCAL2 and FCAL3)
173 if(tmp_energy_HAD > myDBTool->get_PUThrLowFcal() and tmp_energy_HAD < myDBTool->get_PUThrHighFcal()){
174 m_rho_FCAL += tmp_energy_HAD;
176 }
177 }
178 // FCAL1 is EM layer so the energy is suposed to be in the EM layer
179 else{
180 if(tmp_energy_EM > myDBTool->get_PUThrLowFcal() and tmp_energy_EM < myDBTool->get_PUThrHighFcal()){
181 m_rho_FCAL += tmp_energy_EM;
183 }
184 }
185 }
186 }
187 }//end of iphi loop
188
189 //calculating rho values for each region
195
196 //return values in MeV -> m_rho_HAD1 corresponds to TileCal, so 500MeV/count, rest is 25MeV/count
197 //note: do not convert the internal values yet, this needs to happen after the PU correction is applied
198 // to fully reproduce FW behavior!
199 std::vector<int> rho_values {m_rho_EM*25,m_rho_HAD1*500,m_rho_HAD2*25,m_rho_HAD3*25,m_rho_FCAL*25};
200
202
203 return rho_values;
204}
205
207
208 //This is to save one bit in the firmware (19 bit will set be set to 1 instead of the 20th bit and rest are 0)
209 if(ntowers == 1) return ((1<<FEXAlgoSpaceDefs::pu_rhoLUT) - 1);
210 return static_cast<int>((1.0/ntowers)*(1<<FEXAlgoSpaceDefs::pu_rhoLUT) );
211}
212
214
215 for(int iphi=0; iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height; iphi++) {
216 for(int ieta=0; ieta<m_etaMAX; ieta++) {
217
218 int TTID = 0;
219
220 if(m_is_FWD) {
221 TTID = m_FPGA_forward[iphi][ieta];
222 }
223 else {
224 TTID = m_FPGA_central[iphi][ieta];
225 }
226
227 if(TTID == 0) continue; //skipping TTID iqual to 0
228
229 const LVL1::jTower *tmpTower = m_jTowerContainer->findTower(TTID);
230 int tmp_eta = getTTowerEta(tmpTower);
231 int tmp_EM_Area = getTTArea_EM(tmpTower);
232 int tmp_HD_Area = getTTArea_HAD(tmpTower);
233
234 if(tmp_eta < 32) {
235 m_FPGA_ET_EM[TTID] =m_FPGA_ET_EM[TTID] - ((m_rho_EM * tmp_EM_Area)/(1<<FEXAlgoSpaceDefs::pu_Area)) * 25; //factor 25: jFEX internal counts -> MeV (LAr)
236 }
237
238 if(tmp_eta < 15) {
239 m_FPGA_ET_HAD[TTID]=m_FPGA_ET_HAD[TTID] - ((m_rho_HAD1 * tmp_HD_Area)/(1<<FEXAlgoSpaceDefs::pu_Area)) * 500; //factor 500: jFEX internal counts -> MeV (Tile)
240 }
241 else if(tmp_eta < 16 ) {
242 m_FPGA_ET_HAD[TTID]=m_FPGA_ET_HAD[TTID] - ((m_rho_HAD2 * tmp_HD_Area)/(1<<FEXAlgoSpaceDefs::pu_Area)) * 25; //factor 25: jFEX internal counts -> MeV (LAr)
243 }
244 else if(tmp_eta < 32 ) {
245 m_FPGA_ET_HAD[TTID]=m_FPGA_ET_HAD[TTID] - ((m_rho_HAD3 * tmp_HD_Area)/(1<<FEXAlgoSpaceDefs::pu_Area)) * 25; //factor 25: jFEX internal counts -> MeV (LAr)
246 }
247 else if(tmp_eta >= 32) {
248 // Contributes the HAD layer (FCAL2 and FCAL3)
250 m_FPGA_ET_HAD[TTID] = m_FPGA_ET_HAD[TTID] - ((m_rho_FCAL * (tmp_HD_Area))/(1<<FEXAlgoSpaceDefs::pu_Area)) * 25; //factor 25: jFEX internal counts -> MeV (LAr)
251 }
252 // FCAL1 is EM layer so the energy is suposed to be in the EM layer
253 else{
254 m_FPGA_ET_EM[TTID] = m_FPGA_ET_EM[TTID] - ((m_rho_FCAL * (tmp_EM_Area))/(1<<FEXAlgoSpaceDefs::pu_Area)) * 25; //factor 25: jFEX internal counts -> MeV (LAr)
255 }
256 }
257 }
258 }
259}
260
261
262//Flags that allow to apply the pileup/noise to the objets
265 if(! myDBTool.isValid()) {
266 ATH_MSG_ERROR("Could not retrieve DB tool " << m_BDToolKey);
267 return StatusCode::FAILURE;
268 }
269
270 m_apply_pileup2jets = myDBTool->get_doPileUpJet();
271 m_apply_pileup2met = myDBTool->get_doPileUpMet();
272
273 return StatusCode::SUCCESS;
274}
275
279
283
284
285
286std::unordered_map<int,std::vector<int> > LVL1::jFEXPileupAndNoise::Get_EM_Et_values(){
287
288 // map for energies sent to the FPGA
289 m_map_Etvalues_EM.clear();
290
291
292 for(int iphi=0; iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height; iphi++) {
293 for(int ieta=0; ieta<m_etaMAX; ieta++) {
294
295 int TTID = 0;
296
297 if(m_is_FWD) {
298 TTID = m_FPGA_forward[iphi][ieta];
299 }
300 else {
301 TTID = m_FPGA_central[iphi][ieta];
302 }
303
304 if(TTID == 0) continue; //skipping TTID iqual to 0
305 const LVL1::jTower *tmpTower = m_jTowerContainer->findTower(TTID);
306
307 // tmp variable to fill the map
308 std::vector<int> v_energies;
309 v_energies.clear();
310 v_energies.resize(2,0);
311
312 //saving the SG energy
313 int tmp_TotalEt_jet=getET_EM(tmpTower);
314 int tmp_TotalEt_met=getET_EM(tmpTower);
315
316 // if true changing the raw energy to the pileup subtracted energy for jets
318 tmp_TotalEt_jet = m_FPGA_ET_EM[TTID];
319 }
320
321 // if true changing the raw energy to the pileup subtracted energy for met
323 tmp_TotalEt_met = m_FPGA_ET_EM[TTID];
324 }
325
326 v_energies[0]=tmp_TotalEt_jet;
327 v_energies[1]=tmp_TotalEt_met;
328
329 m_map_Etvalues_EM.insert(std::make_pair(TTID, v_energies));
330 }
331 }
332
334
335 return m_map_Etvalues_EM;
336}
337
338std::unordered_map<int,std::vector<int> > LVL1::jFEXPileupAndNoise::Get_HAD_Et_values(){
339
340 // map for energies sent to the FPGA
341 m_map_Etvalues_HAD.clear();
342
343
344 for(int iphi=0; iphi<FEXAlgoSpaceDefs::jFEX_algoSpace_height; iphi++) {
345 for(int ieta=0; ieta<m_etaMAX; ieta++) {
346
347 int TTID = 0;
348
349 if(m_is_FWD) {
350 TTID = m_FPGA_forward[iphi][ieta];
351 }
352 else {
353 TTID = m_FPGA_central[iphi][ieta];
354 }
355
356 if(TTID == 0) continue; //skipping TTID iqual to 0
357 const LVL1::jTower *tmpTower = m_jTowerContainer->findTower(TTID);
358
359 // tmp variable to fill the map
360 std::vector<int> v_energies;
361 v_energies.clear();
362 v_energies.resize(2,0);
363
364 //saving the SG energy
365 int tmp_TotalEt_jet=getET_HAD(tmpTower);
366 int tmp_TotalEt_met=getET_HAD(tmpTower);
367
368 // if true changing the raw energy to the pileup subtracted energy for jets
370 tmp_TotalEt_jet = m_FPGA_ET_HAD[TTID];
371 }
372
373 // if true changing the raw energy to the pileup subtracted energy for met
375 tmp_TotalEt_met = m_FPGA_ET_HAD[TTID];
376 }
377
378 v_energies[0]=tmp_TotalEt_jet;
379 v_energies[1]=tmp_TotalEt_met;
380
381 m_map_Etvalues_HAD.insert(std::make_pair(TTID, v_energies));
382 }
383 }
384
386
387 return m_map_Etvalues_HAD;
388}
389
390void LVL1::jFEXPileupAndNoise::ApplyNoiseCuts(std::unordered_map<int,std::vector<int> > & map_Etvalues,int layer ){
391
392 const LVL1::jTower *tmpTower;
393
394 for(auto [key,vec] : map_Etvalues){
395
396 tmpTower = m_jTowerContainer->findTower(key);
397 int Jet_NoiseCut = tmpTower->getNoiseForJet(layer);
398 int Met_NoiseCut = tmpTower->getNoiseForMet(layer);
399
400 if(m_apply_noise2jets && map_Etvalues[key][0]<=Jet_NoiseCut){ // Et for jets
401 map_Etvalues[key][0]=0.;
402 }
403 if(m_apply_noise2met && map_Etvalues[key][1]<=Met_NoiseCut){ // Et for Met
404 map_Etvalues[key][1]=0.;
405 }
406
407 }
408
409}
410
411std::unordered_map<int,std::vector<int> > LVL1::jFEXPileupAndNoise::GetEt_values() const {
412
413 // map for energies sent to the FPGA
414 std::unordered_map<int,std::vector<int> > map_Etvalues;
415
416 /*
417 * The vector Et_energy has size 2
418 * Et_energy[0] is used un the Jet algos
419 * Et_energy[1] is used un the Met/SumEt algos
420 */
421 std::vector<int> Et_energy;
422
423 for(auto [key,vec] : m_map_Etvalues_EM){
424
425 Et_energy.clear();
426 Et_energy.resize(2,0);
427
428 Et_energy[0] = m_map_Etvalues_EM.at(key)[0] + m_map_Etvalues_HAD.at(key)[0];
429 Et_energy[1] = m_map_Etvalues_EM.at(key)[1] + m_map_Etvalues_HAD.at(key)[1];
430 map_Etvalues[key] = Et_energy;
431 }
432 return map_Etvalues;
433}
434
435
436//Gets Eta of the TT
438 return tmpTower->iEta() < 0 ? std::abs(tmpTower->iEta()+1) : tmpTower->iEta() ;
439}
440//Gets ET of the TT
442 return tmpTower->getTotalET();
443}
444//Gets EM ET of the TT
446 return tmpTower->getET_EM();
447}
448//Gets HAD ET of the TT
450 return tmpTower->getET_HAD();
451}
452
453//Get Area of a EM TT
455 return tmpTower->getTTowerArea(0);
456}
457
458//Get Area of a HAD TT
460 return tmpTower->getTTowerArea(1);
461}
462
463//Get Area of a EM TT
465 return tmpTower->getTTowerAreaInv(0);
466}
467
468//Get Area of a HAD TT
470 return tmpTower->getTTowerAreaInv(1);
471}
472
473
474}// end of namespace LVL1
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
std::vector< size_t > vec
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
static constexpr int jFEX_wide_algoSpace_width
static constexpr unsigned int pu_AreaINV
static constexpr unsigned int pu_Area
static constexpr unsigned int pu_rhoLUT
static constexpr int jFEX_FCAL2_start
static constexpr int jFEX_thin_algoSpace_width
static constexpr int jFEX_algoSpace_height
std::unordered_map< int, int > m_FPGA_ET_EM
int m_FPGA_central[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width]
virtual std::unordered_map< int, std::vector< int > > Get_HAD_Et_values() override
std::unordered_map< int, int > m_FPGA_ET_HAD
virtual StatusCode safetyTest() override
SG::ReadCondHandleKey< jFEXDBCondData > m_BDToolKey
jFEXPileupAndNoise(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
int getTTArea_HAD(const LVL1::jTower *tmpTower) const
std::unordered_map< int, std::vector< int > > m_map_Etvalues_EM
int getTTAreaINV_HAD(const LVL1::jTower *tmpTower) const
virtual void ApplyNoise2Met(bool b) override
virtual void setup(int FPGA[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_thin_algoSpace_width]) override
int getTTArea_EM(const LVL1::jTower *tmpTower) const
int getTTowerET(const LVL1::jTower *tmpTower) const
SG::ReadHandle< jTowerContainer > m_jTowerContainer
virtual StatusCode initialize() override
standard Athena-Algorithm method
virtual StatusCode reset() override
int m_FPGA_forward[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width]
int rhoDivLUT(int ntowers) const
int getTTowerEta(const LVL1::jTower *tmpTower) const
virtual ~jFEXPileupAndNoise()
Destructor.
int getET_EM(const LVL1::jTower *tmpTower) const
void ApplyNoiseCuts(std::unordered_map< int, std::vector< int > > &map_Etvalues, int layer)
virtual StatusCode ApplyPileup() override
int getTTAreaINV_EM(const LVL1::jTower *tmpTower) const
SG::ReadHandleKey< LVL1::jTowerContainer > m_jTowerContainerKey
virtual std::unordered_map< int, std::vector< int > > GetEt_values() const override
virtual std::vector< int > CalculatePileup() override
virtual std::unordered_map< int, std::vector< int > > Get_EM_Et_values() override
virtual void ApplyNoise2Jets(bool b) override
std::unordered_map< int, std::vector< int > > m_map_Etvalues_HAD
int getET_HAD(const LVL1::jTower *tmpTower) const
The jTower class is an interface object for jFEX trigger algorithms The purposes are twofold:
Definition jTower.h:36
int getTotalET() const
Get ET sum of all cells in the jTower in MeV.
Definition jTower.cxx:199
int getET_EM() const
Get EM ET value in MeV.
Definition jTower.h:131
int iEta() const
Get coordinates of tower.
Definition jTower.cxx:167
int getNoiseForJet(int layer) const
Definition jTower.cxx:348
int getTTowerArea(int layer) const
Definition jTower.cxx:322
int getTTowerAreaInv(int layer) const
Definition jTower.cxx:330
int getNoiseForMet(int layer) const
Definition jTower.cxx:339
int getET_HAD() const
Get HAD ET value in MeV.
Definition jTower.h:134
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...