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