15 declareInterface<IeFEXFPGATowerIdProvider>(
this);
21 if (setAddress(csvpath) == StatusCode::FAILURE) {
22 ATH_MSG_WARNING(
"tower_fpga_efex_map.csv missing or invalid. Swiching to hard-coded mapping.");
24 return StatusCode::SUCCESS;
30 m_towerrankingcache.clear();
35 if (inputaddress.empty()) {
37 return StatusCode::FAILURE;
40 m_csvaddress = inputaddress;
41 if (loadcsv() == StatusCode::FAILURE) {
43 return StatusCode::FAILURE;
45 m_towerrankingcache.clear();
46 m_towerrankingcache.resize(96);
48 for (
int efex{ 0 }; efex < 24; efex++) {
49 for (
int fpga{ 0 }; fpga < 4; fpga++) {
50 if (rankTowerinFPGA(getFPGAIndex(efex, fpga)) == StatusCode::FAILURE) {
52 return StatusCode::FAILURE;
56 return StatusCode::SUCCESS;
60 int FPGAindex{ getFPGAIndex(eFEXID, FPGAID) };
61 if (m_towerrankingcache[FPGAindex]) {
64 for (
int i{ 0 };
i < 10;
i++) {
65 for (
int j{ 0 }; j < 6; j++) {
66 towerlist[
i][j] = (*m_towerrankingcache[FPGAindex]).at(vectorindex++);
72 for (
int i{ 0 };
i < 10;
i++) {
73 for (
int j{ 0 }; j < 6; j++) {
78 return StatusCode::FAILURE;
80 return StatusCode::SUCCESS;
84 int FPGA0index{ getFPGAIndex(eFEXID, 0) };
85 int FPGA1index{ getFPGAIndex(eFEXID, 1) };
86 int FPGA2index{ getFPGAIndex(eFEXID, 2) };
87 int FPGA3index{ getFPGAIndex(eFEXID, 3) };
89 if (!m_towerrankingcache[FPGA0index] || !m_towerrankingcache[FPGA1index] ||
90 !m_towerrankingcache[FPGA2index] || !m_towerrankingcache[FPGA3index]) {
91 for (
int i{ 0 };
i < 10;
i++) {
92 for (
int j{ 0 }; j < 18; j++) {
97 return StatusCode::FAILURE;
101 int vectorindex{ 0 };
102 for (
int i{ 0 };
i < 10;
i++) {
103 for (
int j{ 0 }; j < 6; j++) {
104 towerlist[
i][j] = (*m_towerrankingcache[FPGA0index]).at(vectorindex++);
110 for (
int i{ 0 };
i < 10;
i++) {
112 for (
int j{ 2 }; j < 4; j++) {
113 towerlist[
i][j + 4] = (*m_towerrankingcache[FPGA1index]).at(vectorindex++);
120 for (
int i{ 0 };
i < 10;
i++) {
121 for (
int j{ 0 }; j < 6; j++) {
122 towerlist[
i][j + 8] = (*m_towerrankingcache[FPGA2index]).at(vectorindex++);
128 for (
int i{ 0 };
i < 10;
i++) {
130 for (
int j{ 2 }; j < 6; j++) {
131 towerlist[
i][j + 12] = (*m_towerrankingcache[FPGA3index]).at(vectorindex++);
134 return StatusCode::SUCCESS;
148 if (!m_towerrankingcache[FPGAindex]) {
149 std::vector<std::pair<int, int>> rankingmap;
151 for (
auto each : *m_alltowers[FPGAindex]) {
152 if (each.eTowerPhi < 3 && each.eTowerPhi > -1 && FPGAindex >= getFPGAIndex(21, 0)) {
153 rankingmap.push_back(std::pair<int, int>(-each.eTowerEta - (90 + each.eTowerPhi) * 100, each.eTowerID));
155 rankingmap.push_back(std::pair<int, int>(-each.eTowerEta - each.eTowerPhi * 100, each.eTowerID));
159 if (rankingmap.size() != 60) {
160 return StatusCode::FAILURE;
162 std::sort(rankingmap.begin(), rankingmap.end(),
163 [](std::pair<int, int>
a, std::pair<int, int>
b) {
165 if (a.first == b.first) {
166 return (a.second < b.second);
168 return (
a.first >
b.first);
170 auto output = std::make_unique<std::vector<int>>();
173 for (
int i{ 0 };
i < 10;
i++) {
174 for (
int j{ 0 }; j < 6; j++) {
175 output->push_back(rankingmap[vectorindex++].
second);
178 m_towerrankingcache[FPGAindex] = std::move(output);
180 return StatusCode::SUCCESS;
186 return m_alltowers.contains(FPGAindex);
192 std::string eachline;
193 std::ifstream myfile(m_csvaddress);
194 if (myfile.is_open()) {
195 while (std::getline(myfile, eachline)) {
197 std::string::size_type ipos = eachline.find(
"#");
198 if (ipos!=std::string::npos) eachline.resize(ipos);
201 if (std::all_of(eachline.begin(), eachline.end(), ::isspace)) {
206 auto validchar = [](
char ch) {
return (::isspace(
ch) || ::isdigit(
ch) ||
ch==
','); };
207 if (!std::all_of(eachline.begin(), eachline.end(), validchar)) {
213 std::stringstream eachline_stream(eachline);
214 std::vector<int> numbers_in_eachline;
215 while (eachline_stream.good()) {
216 std::string tem_string;
217 std::getline(eachline_stream, tem_string,
',');
219 numbers_in_eachline.push_back(std::stoi(tem_string));
223 return StatusCode::FAILURE;
229 if (numbers_in_eachline.size() != 5) {
231 return StatusCode::FAILURE;
234 if (numbers_in_eachline[3] < 0 || numbers_in_eachline[4] < 0) {
237 return StatusCode::FAILURE;
239 int FPGAindex = getFPGAIndex(numbers_in_eachline[0], numbers_in_eachline[1]);
241 if (FPGAindex == -1) {
243 return StatusCode::FAILURE;
246 tem_towerinfo.
eTowerID = numbers_in_eachline[2];
251 if (
int(numbers_in_eachline[2] / 100000) % 2 != 0) {
256 tem_towerinfo.
eTowerEta = etasign * (numbers_in_eachline[3]);
257 tem_towerinfo.
eTowerPhi = numbers_in_eachline[4];
262 if (hasFPGA(FPGAindex)) {
263 m_alltowers[FPGAindex]->push_back(tem_towerinfo);
265 m_alltowers[FPGAindex] = std::make_unique<std::vector<towerinfo>>(std::vector{tem_towerinfo});
271 return StatusCode::FAILURE;
273 return StatusCode::SUCCESS;
281 if (FPGAid < 0 or FPGAid > 3) {
284 if (eFEXid < 0 or FPGAid > 23) {
287 return eFEXid * 4 + FPGAid;