ATLAS Offline Software
Loading...
Searching...
No Matches
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
6#include <iostream>
7#include <fstream>
8#include <string>
10
11LVL1::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
20
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
31StatusCode 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
47StatusCode 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
68{
69 auto haskey = m_SuperCelltoTowerIdmap.find(scid);
70 if (haskey == m_SuperCelltoTowerIdmap.end()) {
71 return false;
72 }
73 return true;
74}
75
79
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}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
eFEXSuperCellTowerIdProvider(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
std::unordered_map< uint64_t, towerinfo > m_SuperCelltoTowerIdmap
map to store information about SuperCells with SuperCell ID as the key.
bool hasSuperCell(uint64_t) const
Check if the SuperCell id exists in the csv file.
StatusCode setAddress(const std::string &)
set the address to the csv file and load
virtual StatusCode initialize() override
initialize the tool
bool ifhaveinputfile() const
Check if the csv file is valid.
StatusCode geteTowerIDandslot(uint64_t scid, int &eTowerID, int &slot, bool &issplit) const
obtain ordered tower IDs in an eFEX
std::string m_csvaddress
path to the csv file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
Provide Supercell-tower mapping.
Sturcture stores mapping information of a SuperCell.
bool isSplit
if the SuperCell Et needs to be splited
int slot
slot of the tower in which the SuperCell belongs to