ATLAS Offline Software
Loading...
Searching...
No Matches
jFEXForwardJetsAlgo.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// jFEXForwardJetsAlgo - Algorithm for forward Jets in jFEX
6// -------------------
7// begin : 07 06 2021
8// email : Sergi.Rodriguez@cern.ch
9//***************************************************************************
10#include <iostream>
11#include <vector>
12#include <string>
13#include <map>
14#include "jFEXForwardJetsAlgo.h"
15#include "L1CaloFEXSim/jTower.h"
20
21#include <fstream>
22
23namespace LVL1{
24
25//Default Constructor
26LVL1::jFEXForwardJetsAlgo::jFEXForwardJetsAlgo(const std::string& type, const std::string& name, const IInterface* parent):
27 AthAlgTool(type, name, parent)
28 {
29 declareInterface<IjFEXForwardJetsAlgo>(this);
30 }
31
51
52//calls container for TT
55 if(! m_jTowerContainer.isValid()) {
56 ATH_MSG_ERROR("Could not retrieve jTowerContainer " << m_jFEXForwardJetsAlgo_jTowerContainerKey.key());
57
58 return StatusCode::FAILURE;
59 }
60
61 return StatusCode::SUCCESS;
62}
63
65 return StatusCode::SUCCESS;
66}
67
72
73//Gets geometric global centre Eta and Phi coord of the TT
74//Has the advantage over the individual eta, phi methods that it does only one tower search
75std::array<float,2> LVL1::jFEXForwardJetsAlgo::globalEtaPhi(int TTID) {
76 if(TTID == 0) {
77 return {999,999};
78 }
79
80 const LVL1::jTower *tmpTower = m_jTowerContainer->findTower(TTID);
81 return {tmpTower->centreEta(),tmpTower->centrephi_toPI()};
82}
83
84int LVL1::jFEXForwardJetsAlgo::getEt(unsigned int TTID) const {
85 if(TTID == 0) {
86 return -999;
87 }
88
89 auto itr = m_map_Etvalues.find(TTID);
90
91 if( itr == m_map_Etvalues.end()) {
92 return -999;
93 }
94
95 return itr->second[0];
96}
97
98std::unordered_map<int, jFEXForwardJetsInfo> LVL1::jFEXForwardJetsAlgo::FcalJetsTowerIDLists(int seedThreshold) {
99
100 std::unordered_map<int, jFEXForwardJetsInfo> FCALJetTowerIDLists;
101
102 std::vector<int> lower_centre_neta;
103 std::vector<int> upper_centre_neta;
104 m_lowerEM_eta = 0;
105 m_upperEM_eta = 0;
106
107 //STEP 1: check if we are in module 0 or 5 and assign corrrect eta FEXAlgoSpace parameters
108 if(m_jfex == 0) {
109 //Module 0
114 }
115 else {
116 //Module 5
119
122
123 }
124
125
126
127 //STEP 2: define phi FEXAlgoSpace parameters
130
131 //STEP 3: loop over different EM/FCAL0 eta phi core fpga regions. These are potential central trigger towers for jets
132 for(int myCounter = 0; myCounter<3; myCounter++) {
133 for(int centre_nphi = lower_centre_nphi[myCounter]; centre_nphi < upper_centre_nphi[myCounter]; centre_nphi++) {
134 for(int centre_neta = lower_centre_neta[myCounter]; centre_neta < upper_centre_neta[myCounter]; centre_neta++) {
135
136 //STEP 4: define TTID which will be the key for class in map
137 int myTTIDKey = m_jFEXalgoTowerID[centre_nphi][centre_neta];
138
139 //STEP 5: ignore when tower ID is zero. Should not happend though
140 if(myTTIDKey == 0) {
141 continue;
142 }
143 bool iAmJet = false;
144 bool bool_isLM = false;
145 bool bool_condCorr2 = false;
146 bool bool_isLMabove = false;
147 bool bool_condCorr = false;
148
149 //Know which condition should satisfy
150 unsigned int elemCorr = elementsCorr(myTTIDKey);
151 unsigned int elemCorr2 = elementsCorr2(myTTIDKey);
152
153 if(elemCorr == 0 and elemCorr2 == 0){
154 bool_isLM = isLM(myTTIDKey);
155 iAmJet = bool_isLM;
156 }
157 else if(elemCorr == 0 and elemCorr2 > 0){
158 bool_isLM = isLM(myTTIDKey);
159 bool_condCorr2 = condCorr2(myTTIDKey);
160 iAmJet = bool_isLM and bool_condCorr2;
161 }
162 else if(elemCorr > 0 and elemCorr2 == 0){
163 bool_isLM = isLM(myTTIDKey);
164 bool_isLMabove = isLMabove(myTTIDKey);
165 bool_condCorr = condCorr(myTTIDKey);
166 iAmJet = bool_isLM or (bool_isLMabove and bool_condCorr);
167 }
168 else if(elemCorr > 0 and elemCorr2 > 0){
169 bool_isLM = isLM(myTTIDKey);
170 bool_condCorr2 = condCorr2(myTTIDKey);
171 bool_isLMabove = isLMabove(myTTIDKey);
172 bool_condCorr = condCorr(myTTIDKey);
173 iAmJet = (bool_isLM and bool_condCorr2) or (bool_isLMabove and bool_condCorr);
174 }
175
176 //veto seeds below seed threshold
177 if (SumEtSeed(myTTIDKey) <= seedThreshold){
178 iAmJet = false;
179 }
180
181 if(iAmJet){
182
183 //STEP 6: define class
184 jFEXForwardJetsInfo TriggerTowerInformation;
185
186 TriggerTowerInformation.setCentreLocalTTPhi(centre_nphi);
187 TriggerTowerInformation.setCentreLocalTTEta(centre_neta);
188
189 const auto [centreTT_eta,centreTT_phi] = globalEtaPhi(myTTIDKey);
190 TriggerTowerInformation.setCentreTTPhi(centreTT_phi);
191 TriggerTowerInformation.setCentreTTEta(centreTT_eta);
192
193
194 //STEP 7: Filling energies
195 int saturation = 0;
196 // Seed
197 auto it_seed_map = m_SeedRingMap.find(myTTIDKey);
198 if(it_seed_map == m_SeedRingMap.end()) {
199 ATH_MSG_ERROR("Could not find TT" << myTTIDKey << " in Jet seed file.");
200 }
201
202 for(const auto& seedTT : it_seed_map->second){
203 TriggerTowerInformation.includeTTinSeed(seedTT);
204 saturation = saturation || getTTowerSat(seedTT);
205 TriggerTowerInformation.addToSeedET(getEt(seedTT));
206 }
207
208 // 1st Energy Ring!
209 it_seed_map = m_1stRingMap.find(myTTIDKey);
210 if(it_seed_map == m_1stRingMap.end()) {
211 ATH_MSG_ERROR("Could not find TT" << myTTIDKey << " in 1st Energy ring file.");
212 }
213
214 for(const auto& firstER_TT : it_seed_map->second){
215 TriggerTowerInformation.addToFirstEnergyRingET(getEt(firstER_TT));
216 saturation = saturation || getTTowerSat(firstER_TT);
218 TriggerTowerInformation.includeTTIDinFirstER(firstER_TT);
219 }
220 }
221
222 //setting saturation for jJ
223 if(saturation) TriggerTowerInformation.setSRjetSat();
224
225
226 // 2nd Energy Ring!
227 it_seed_map = m_2ndRingMap.find(myTTIDKey);
228 if(it_seed_map == m_2ndRingMap.end()) {
229 ATH_MSG_ERROR("Could not find TT" << myTTIDKey << " in 2nd Energy ring file.");
230 }
231
232 for(const auto& secondER_TT : it_seed_map->second){
233 TriggerTowerInformation.addToSecondEnergyRingET(getEt(secondER_TT));
234 saturation = saturation || getTTowerSat(secondER_TT);
236 TriggerTowerInformation.includeTTIDinSecondER(secondER_TT);
237 }
238 }
239
240 //setting saturation for jLJ
241 if(saturation) TriggerTowerInformation.setLRjetSat();
242
243 // Storing all jets in the same map!
244 FCALJetTowerIDLists[myTTIDKey] = std::move(TriggerTowerInformation);
245 }
246
247 }//end of centre_neta loop
248 }//end of centre_nphi loop
249 }//end of myCounter loop
250
251 return FCALJetTowerIDLists;
252}
253
254int LVL1::jFEXForwardJetsAlgo::SumEtSeed(unsigned int TTID) const {
255
256 // Exists the jTower in the mapping?
257 auto it_seed_map = m_SeedRingMap.find(TTID);
258 if(it_seed_map == m_SeedRingMap.end()) {
259 ATH_MSG_ERROR("Could not find TT" << TTID << " in Jet seed file.");
260 return 0;
261 }
262 int summedEt = 0;
263 for(const auto& seedTT : it_seed_map->second){
264 //getEt can return -999 as an error value
265 const int thisEt = getEt(seedTT);
266 if (thisEt != -999){
267 summedEt += getEt(seedTT);
268 }
269 }
270
271 return summedEt;
272}
273
274bool LVL1::jFEXForwardJetsAlgo::isLM(unsigned int TTID) const {
275
276 int CentralSeedEt = SumEtSeed(TTID);
277
278 // Exists the jTower in the seach (greater than) tower map?
279 auto it_seed_map = m_SearchGMap.find(TTID);
280 if(it_seed_map == m_SearchGMap.end()) {
281 ATH_MSG_ERROR("Could not find TT" << TTID << " in the search (>) local maxima for jets file.");
282 return false;
283 }
284
285 bool greater = true;
286 for (const auto& Gtt : it_seed_map->second ){
287 //checking if the Central seed has strictly more energy than its neighbours
288 int tmpEt = SumEtSeed(Gtt);
289 if( !(CentralSeedEt > tmpEt) ){
290 greater = false;
291 break;
292 }
293 }
294
295 //No need to continue.. Not a LM
296 if(!greater){
297 return false;
298 }
299
300 // Exists the jTower in the seach (greater or equal than) tower map?
301 it_seed_map = m_SearchGeMap.find(TTID);
302 if(it_seed_map == m_SearchGeMap.end()) {
303 ATH_MSG_ERROR("Could not find TT" << TTID << " in the seach (>=) local maxima for jets file.");
304 return false;
305 }
306
307 bool greaterEqual = true;
308 for (const auto& Gtt : it_seed_map->second ){
309 //checking if the Central seed has more energy or equal than its neighbours
310 int tmpEt = SumEtSeed(Gtt);
311 if( !(CentralSeedEt >= tmpEt) ){
312 greaterEqual = false;
313 break;
314 }
315 }
316
317 //Not a LM
318 if(!greaterEqual){
319 return false;
320 }
321 return true;
322}
323
324bool LVL1::jFEXForwardJetsAlgo::isLMabove(unsigned int TTID) const {
325
326 // Exists the jTower in the correction tower map?
327 auto it_seed_map = m_CorrMap.find(TTID);
328 if(it_seed_map == m_CorrMap.end()) {
329 ATH_MSG_ERROR("Could not find TT" << TTID << " in the correction (LM above) for jets file.");
330 return false;
331 }
332
333 // If there is not Trigger tower to correct with, then return false
334 const auto & GttVec = it_seed_map->second;
335 if (! GttVec.empty()) return isLM(GttVec.front());
336 return false;
337}
338
339unsigned int LVL1::jFEXForwardJetsAlgo::elementsCorr(unsigned int TTID) const {
340 auto it_seed_map = m_CorrMap.find(TTID);
341 if(it_seed_map == m_CorrMap.end()) {
342 ATH_MSG_ERROR("Could not find TT" << TTID << " in the condition (greater than) for jets file.");
343 return 0;
344 }
345
346 return (it_seed_map->second).size();
347}
348
349bool LVL1::jFEXForwardJetsAlgo::condCorr(unsigned int TTID) const {
350
351 // Exists the jTower in the correction tower map?
352 auto it_seed_map = m_CorrMap.find(TTID);
353 if(it_seed_map == m_CorrMap.end()) {
354 ATH_MSG_ERROR("Could not find TT" << TTID << " in the condition (greater than) for jets file.");
355 return false;
356 }
357
358 // If there is no TT to check then the Et of central is always bigger :D
359 if( (it_seed_map->second).size() == 0){
360 ATH_MSG_ERROR("Elements=0 in condCorr function for element"<< TTID <<". This should never happend. REPORT IT!");
361 return true;
362 }
363
364 int centralEt = getEt(TTID);
365 int centralSeed = SumEtSeed(TTID);
366 for (const auto& Gtt : it_seed_map->second ){
367 //Checking if central Et is always strictly greater than the previous TT Et
368 int tmpEt = getEt(Gtt);
369 int tmpSeedEt = SumEtSeed(Gtt);
370 if( !(centralEt > tmpEt && centralSeed >= tmpSeedEt ) ){
371 return false;
372 }
373 }
374
375 return true;
376
377}
378
379unsigned int LVL1::jFEXForwardJetsAlgo::elementsCorr2(unsigned int TTID) const {
380 auto it_seed_map = m_Corr2Map.find(TTID);
381 if(it_seed_map == m_Corr2Map.end()) {
382 ATH_MSG_ERROR("Could not find TT" << TTID << " in the condition (greater than) for jets file.");
383 return 0;
384 }
385
386 return (it_seed_map->second).size();
387}
388
389bool LVL1::jFEXForwardJetsAlgo::condCorr2(unsigned int TTID) const {
390
391 // Exists the jTower in the correction tower map?
392 auto it_seed_map = m_Corr2Map.find(TTID);
393 if(it_seed_map == m_Corr2Map.end()) {
394 ATH_MSG_ERROR("Could not find TT" << TTID << " in the correction (greater or equal) file.");
395 return false;
396 }
397
398 int centralEt = getEt(TTID);
399 int centralSeed = SumEtSeed(TTID);
400
401 for (const auto& Gtt : it_seed_map->second ){
402 //Checking if central Et is always greater or equal than the previous TT Et
403 int tmpEt = getEt(Gtt);
404
405 //(central >= 1stElem or seedcentral > seed1stElem) and ( central >= 2stElem or seedcentral > seed2stElem)
406 if( !( centralEt >= tmpEt || centralSeed > SumEtSeed(Gtt) ) ){
407 return false;
408 }
409 }
410
411 return true;
412
413}
414
415std::unordered_map<int, jFEXForwardJetsInfo> LVL1::jFEXForwardJetsAlgo::calculateJetETs(int seedThreshold) {
416
417 std::unordered_map<int, jFEXForwardJetsInfo> localMaximas = FcalJetsTowerIDLists(seedThreshold);
418 return localMaximas;
419}
420
421
422void LVL1::jFEXForwardJetsAlgo::setFPGAEnergy(std::unordered_map<int,std::vector<int> > et_map){
423 m_map_Etvalues=std::move(et_map);
424}
425
426//getter for tower saturation
428 if(TTID == 0) {
429 return false;
430 }
431
432 const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(TTID);
433 return tmpTower->getTowerSat();
434}
435
436StatusCode LVL1::jFEXForwardJetsAlgo::ReadfromFile(const std::string & fileName, std::unordered_map<unsigned int, std::vector<unsigned int> >& fillingMap) const {
437
438 std::string myline;
439
440 //opening file with ifstream
441 std::ifstream myfile(fileName);
442
443 if ( !myfile.is_open() ){
444 ATH_MSG_ERROR("Could not open file:" << fileName);
445 return StatusCode::FAILURE;
446 }
447
448 //loading the mapping information
449 while ( std::getline (myfile, myline) ) {
450
451 //removing the header of the file (it is just information!)
452 if(myline[0] == '#') continue;
453
454 //Splitting myline in different substrings
455 std::stringstream oneLine(myline);
456
457 //reading elements
458 std::vector<unsigned int> elements;
459 std::string element;
460 while(std::getline(oneLine, element, ' '))
461 {
462 elements.push_back(std::stoi(element));
463 }
464
465 // We should have at least two elements! Central TT and (at least) itself
466 if(elements.size() < 1){
467 ATH_MSG_ERROR("Unexpected number of elemennts (<1 expected) in file: "<< fileName);
468 return StatusCode::FAILURE;
469 }
470
471 //Central TiggerTower
472 unsigned int TTID = elements.at(0);
473
474 // rest of TTs that need to be checked
475 elements.erase(elements.begin());
476
477 fillingMap[TTID] = std::move(elements);
478
479 }
480 myfile.close();
481
482 return StatusCode::SUCCESS;
483}
484
485
486
487}// end of namespace LVL1
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
static constexpr int jFEX_algoSpace_C_EMB_start_eta
static constexpr int jFEX_wide_algoSpace_width
static constexpr int jFEX_algoSpace_A_FCAL_end_eta
static constexpr int jFEX_algoSpace_C_EMB_end_eta
static constexpr int jFEX_algoSpace_EMIE_end_phi
static constexpr int jFEX_algoSpace_C_FCAL_end_eta
static constexpr int jFEX_algoSpace_A_upperEM_eta
static constexpr int jFEX_algoSpace_A_EMB_eta
static constexpr int jFEX_algoSpace_A_FCAL_start_eta
static constexpr int jFEX_algoSpace_C_upperEM_eta
static constexpr int jFEX_algoSpace_C_FCAL_start_eta
static constexpr int jFEX_algoSpace_A_EMIE_eta
static constexpr int jFEX_algoSpace_A_lowerEM_eta
static constexpr int jFEX_algoSpace_FCAL_end_phi
static constexpr int jFEX_algoSpace_EMB_end_phi
static constexpr int jFEX_algoSpace_FCAL_start_phi
static constexpr int jFEX_algoSpace_EMIE_start_phi
static constexpr int jFEX_algoSpace_EMB_start_phi
static constexpr int jFEX_algoSpace_C_lowerEM_eta
static constexpr int jFEX_algoSpace_height
static constexpr int jFEX_algoSpace_C_EMIE_start_eta
static constexpr int jFEX_algoSpace_C_EMIE_end_eta
virtual void setup(int inputTable[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width], int jfex) override
virtual void setFPGAEnergy(std::unordered_map< int, std::vector< int > > et_map) override
std::unordered_map< unsigned int, std::vector< unsigned int > > m_SearchGMap
bool condCorr(unsigned int TTID) const
unsigned int elementsCorr2(unsigned int TTID) const
Gaudi::Property< std::string > m_2ndRingStr
virtual StatusCode reset() override
std::unordered_map< int, std::vector< int > > m_map_Etvalues
Gaudi::Property< std::string > m_Corr2Str
Gaudi::Property< std::string > m_CorrStr
std::unordered_map< unsigned int, std::vector< unsigned int > > m_2ndRingMap
Gaudi::Property< std::string > m_SeedRingStr
std::array< float, 2 > globalEtaPhi(int TTID)
virtual std::unordered_map< int, jFEXForwardJetsInfo > FcalJetsTowerIDLists(int seedThreshold) override
std::unordered_map< unsigned int, std::vector< unsigned int > > m_1stRingMap
virtual std::unordered_map< int, jFEXForwardJetsInfo > calculateJetETs(int seedThreshold) override
int getEt(unsigned int TTID) const
SG::ReadHandle< jTowerContainer > m_jTowerContainer
virtual StatusCode safetyTest() override
bool getTTowerSat(unsigned int TTID)
bool isLM(unsigned int TTID) const
virtual StatusCode initialize() override
standard Athena-Algorithm method
int m_jFEXalgoTowerID[FEXAlgoSpaceDefs::jFEX_algoSpace_height][FEXAlgoSpaceDefs::jFEX_wide_algoSpace_width]
bool condCorr2(unsigned int TTID) const
jFEXForwardJetsAlgo(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
std::unordered_map< unsigned int, std::vector< unsigned int > > m_Corr2Map
Gaudi::Property< std::string > m_1stRingStr
std::unordered_map< unsigned int, std::vector< unsigned int > > m_SearchGeMap
std::unordered_map< unsigned int, std::vector< unsigned int > > m_SeedRingMap
StatusCode ReadfromFile(const std::string &, std::unordered_map< unsigned int, std::vector< unsigned int > > &) const
bool isLMabove(unsigned int TTID) const
virtual int SumEtSeed(unsigned int TTID) const override
SG::ReadHandleKey< LVL1::jTowerContainer > m_jFEXForwardJetsAlgo_jTowerContainerKey
virtual ~jFEXForwardJetsAlgo()
Destructor.
std::unordered_map< unsigned int, std::vector< unsigned int > > m_CorrMap
Gaudi::Property< std::string > m_SearchGStr
Gaudi::Property< std::string > m_SearchGeStr
unsigned int elementsCorr(unsigned int TTID) const
void addToSecondEnergyRingET(int secondER_ET)
void addToFirstEnergyRingET(int firstER_ET)
void setCentreLocalTTEta(float centreLocalTTEta)
void setCentreTTPhi(float centreTTPhi)
void includeTTIDinFirstER(int firstER_TTID)
void includeTTIDinSecondER(int secondER_TTID)
void setCentreTTEta(float centreTTEta)
void setCentreLocalTTPhi(float centreLocalTTPhi)
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
float centreEta() const
Definition jTower.h:79
float centrephi_toPI() const
Definition jTower.h:81
static std::string find_calib_file(const std::string &logical_file_name)
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...