ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Trigger
TrigT1
L1CaloFEX
L1CaloFEXSim
src
eFEXSuperCellTowerIdProvider.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
#include "
L1CaloFEXSim/eFEXSuperCellTowerIdProvider.h
"
6
#include <iostream>
7
#include <fstream>
8
#include <string>
9
#include "
PathResolver/PathResolver.h
"
10
11
LVL1::eFEXSuperCellTowerIdProvider::eFEXSuperCellTowerIdProvider
(
const
std::string &
type
,
const
std::string &
name
,
const
IInterface *parent):
12
AthAlgTool
(
type
,
name
, parent)
13
{
14
declareInterface<eFEXSuperCellTowerIdProvider>(
this
);
15
}
16
17
LVL1::eFEXSuperCellTowerIdProvider::~eFEXSuperCellTowerIdProvider
()
18
{
19
}
20
21
StatusCode
LVL1::eFEXSuperCellTowerIdProvider::initialize
()
22
{
23
m_hascsvfile
=
false
;
24
std::string csvpath =
PathResolver::find_file
(
"sc_tower_map.csv"
,
"DATAPATH"
);
25
if
(
setAddress
(csvpath) == StatusCode::FAILURE) {
26
ATH_MSG_WARNING
(
"sc_tower_map.csv missing or invalid. Swiching to hard-coded mapping."
);
27
};
28
return
StatusCode::SUCCESS;
29
}
30
31
StatusCode
LVL1::eFEXSuperCellTowerIdProvider::setAddress
(
const
std::string& inputaddress)
32
{
33
if
(inputaddress.empty()) {
34
m_hascsvfile
=
false
;
35
return
StatusCode::FAILURE;
36
}
37
38
m_hascsvfile
=
true
;
39
m_csvaddress
= inputaddress;
40
if
(
loadcsv
() == StatusCode::FAILURE) {
41
m_hascsvfile
=
false
;
42
return
StatusCode::FAILURE;
43
}
44
return
StatusCode::SUCCESS;
45
}
46
47
StatusCode
LVL1::eFEXSuperCellTowerIdProvider::geteTowerIDandslot
(uint64_t scid,
int
&eTowerID,
int
&slot,
bool
&issplit)
const
48
{
49
auto
mapentry =
m_SuperCelltoTowerIdmap
.find(scid);
50
51
if
(mapentry !=
m_SuperCelltoTowerIdmap
.end()) {
52
towerinfo
towerinfo_tem = mapentry->second;
53
eTowerID = towerinfo_tem.
eTowerID
;
54
slot = towerinfo_tem.
slot
;
55
issplit = towerinfo_tem.
isSplit
;
56
}
else
{
57
// The csv file only contains valid SuperCell
58
// Ingore invalid id.
59
eTowerID = -1;
60
slot = -1;
61
issplit =
false
;
62
}
63
64
return
StatusCode::SUCCESS;
65
}
66
67
bool
LVL1::eFEXSuperCellTowerIdProvider::hasSuperCell
(uint64_t scid)
const
68
{
69
auto
haskey =
m_SuperCelltoTowerIdmap
.find(scid);
70
if
(haskey ==
m_SuperCelltoTowerIdmap
.end()) {
71
return
false
;
72
}
73
return
true
;
74
}
75
76
bool
LVL1::eFEXSuperCellTowerIdProvider::ifhaveinputfile
()
const
{
77
return
m_hascsvfile
;
78
}
79
80
StatusCode
LVL1::eFEXSuperCellTowerIdProvider::loadcsv
()
81
{
82
// read the .csv file line by line
83
std::string eachline;
84
std::ifstream myfile(
m_csvaddress
);
85
if
(myfile.is_open()) {
86
while
(std::getline(myfile, eachline)) {
87
88
// ignore text after #
89
std::string::size_type ipos = eachline.find(
"#"
);
90
if
(ipos!=std::string::npos) eachline.resize(ipos);
91
92
// prevent reading lines with only white spaces
93
if
(std::all_of(eachline.begin(), eachline.end(), ::isspace)) {
94
continue
;
95
}
96
97
// split lines in the .csv file by comma
98
std::stringstream eachline_stream(eachline);
99
int
each_etowerid{ -1 }, each_slot{ -1 };
100
bool
eachisSplit{
false
};
101
std::string each_scid =
""
;
102
int
i{ 0 };
103
while
(eachline_stream.good()) {
104
i++;
105
int
number_in_eachline;
106
std::string tem_string;
107
std::getline(eachline_stream, tem_string,
','
);
108
// first column: tower id
109
// second column: supercell id
110
// third column: slot number
111
// fourth column: if split energy
112
if
(i == 1 || i == 3 || i == 4) {
113
try
{
114
number_in_eachline = std::stoi(tem_string);
115
}
116
catch
(...) {
117
ATH_MSG_ERROR
(
"Invalid input in "
<<
m_csvaddress
<<
". Unable to convert "
<< tem_string <<
" to int."
);
118
return
StatusCode::FAILURE;
119
}
120
if
(i == 1) {
121
each_etowerid = number_in_eachline;
122
}
else
if
(i == 3) {
123
each_slot = number_in_eachline;
124
}
else
{
125
// check if the fourth column is a boolean or not
126
if
(number_in_eachline != 0 && number_in_eachline != 1) {
127
ATH_MSG_ERROR
(
"Invalid input in "
<<
m_csvaddress
<<
". Unable to reader the fourth column."
);
128
return
StatusCode::FAILURE;
129
}
130
eachisSplit = number_in_eachline;
131
}
132
}
133
else
if
(i == 2) {
134
each_scid = std::move(tem_string);
135
}
136
else
{
137
ATH_MSG_ERROR
(
"Invalid input in "
<<
m_csvaddress
<<
". Too many columns."
);
138
return
StatusCode::FAILURE;
139
}
140
}
141
142
// check the range of tower id
143
if
(each_etowerid > 601599 || each_etowerid < 100000) {
144
ATH_MSG_ERROR
(
"Invalid eTower ID in "
<<
m_csvaddress
<<
"."
);
145
return
StatusCode::FAILURE;
146
}
147
// check the range of slot
148
if
(each_slot > 13 || each_slot < 0) {
149
ATH_MSG_ERROR
(
"Invalid slot number in "
<<
m_csvaddress
<<
"."
);
150
return
StatusCode::FAILURE;
151
}
152
// The Hexadecimal SuperCell id should always start as 0x
153
if
(each_scid.find(
"0x"
) == std::string::npos) {
154
ATH_MSG_ERROR
(
"Invalid SuperCell ID in "
<<
m_csvaddress
<<
"."
);
155
return
StatusCode::FAILURE;
156
}
157
towerinfo
each_towerinfo;
158
each_towerinfo.
eTowerID
= each_etowerid;
159
each_towerinfo.
slot
= each_slot;
160
each_towerinfo.
isSplit
= eachisSplit;
161
uint64_t scid_uint64 = strtoull(each_scid.c_str(),
nullptr
, 16);
162
try
{
163
m_SuperCelltoTowerIdmap
[scid_uint64] = each_towerinfo;
164
}
catch
(...) {
165
ATH_MSG_ERROR
(
"Invalid SuperCell ID in "
<<
m_csvaddress
<<
"."
);
166
return
StatusCode::FAILURE;
167
}
168
}
169
myfile.close();
170
}
171
else
{
172
ATH_MSG_ERROR
(
"eFEXFPGATowerIdProvider: Unable to open"
<<
m_csvaddress
<<
"."
);
173
return
StatusCode::FAILURE;
174
}
175
return
StatusCode::SUCCESS;
176
}
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition
AthMsgStreamMacros.h:33
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition
AthMsgStreamMacros.h:32
PathResolver.h
AthAlgTool::AthAlgTool
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Definition
AthAlgTool.cxx:16
LVL1::eFEXSuperCellTowerIdProvider::eFEXSuperCellTowerIdProvider
eFEXSuperCellTowerIdProvider(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
Definition
eFEXSuperCellTowerIdProvider.cxx:11
LVL1::eFEXSuperCellTowerIdProvider::m_SuperCelltoTowerIdmap
std::unordered_map< uint64_t, towerinfo > m_SuperCelltoTowerIdmap
map to store information about SuperCells with SuperCell ID as the key.
Definition
eFEXSuperCellTowerIdProvider.h:85
LVL1::eFEXSuperCellTowerIdProvider::loadcsv
StatusCode loadcsv()
load the csv file
Definition
eFEXSuperCellTowerIdProvider.cxx:80
LVL1::eFEXSuperCellTowerIdProvider::hasSuperCell
bool hasSuperCell(uint64_t) const
Check if the SuperCell id exists in the csv file.
Definition
eFEXSuperCellTowerIdProvider.cxx:67
LVL1::eFEXSuperCellTowerIdProvider::setAddress
StatusCode setAddress(const std::string &)
set the address to the csv file and load
Definition
eFEXSuperCellTowerIdProvider.cxx:31
LVL1::eFEXSuperCellTowerIdProvider::initialize
virtual StatusCode initialize() override
initialize the tool
Definition
eFEXSuperCellTowerIdProvider.cxx:21
LVL1::eFEXSuperCellTowerIdProvider::m_hascsvfile
bool m_hascsvfile
if the csv file is valid
Definition
eFEXSuperCellTowerIdProvider.h:74
LVL1::eFEXSuperCellTowerIdProvider::ifhaveinputfile
bool ifhaveinputfile() const
Check if the csv file is valid.
Definition
eFEXSuperCellTowerIdProvider.cxx:76
LVL1::eFEXSuperCellTowerIdProvider::geteTowerIDandslot
StatusCode geteTowerIDandslot(uint64_t scid, int &eTowerID, int &slot, bool &issplit) const
obtain ordered tower IDs in an eFEX
Definition
eFEXSuperCellTowerIdProvider.cxx:47
LVL1::eFEXSuperCellTowerIdProvider::m_csvaddress
std::string m_csvaddress
path to the csv file
Definition
eFEXSuperCellTowerIdProvider.h:76
LVL1::eFEXSuperCellTowerIdProvider::~eFEXSuperCellTowerIdProvider
~eFEXSuperCellTowerIdProvider()
Destructor.
Definition
eFEXSuperCellTowerIdProvider.cxx:17
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
Definition
PathResolver.cxx:220
eFEXSuperCellTowerIdProvider.h
Provide Supercell-tower mapping.
type
LVL1::eFEXSuperCellTowerIdProvider::towerinfo
Sturcture stores mapping information of a SuperCell.
Definition
eFEXSuperCellTowerIdProvider.h:37
LVL1::eFEXSuperCellTowerIdProvider::towerinfo::eTowerID
int eTowerID
tower ID
Definition
eFEXSuperCellTowerIdProvider.h:38
LVL1::eFEXSuperCellTowerIdProvider::towerinfo::isSplit
bool isSplit
if the SuperCell Et needs to be splited
Definition
eFEXSuperCellTowerIdProvider.h:40
LVL1::eFEXSuperCellTowerIdProvider::towerinfo::slot
int slot
slot of the tower in which the SuperCell belongs to
Definition
eFEXSuperCellTowerIdProvider.h:39
TrigConf::name
Definition
HLTChainList.h:35
Generated on
for ATLAS Offline Software by
1.17.0