ATLAS Offline Software
eFEXSuperCellTowerIdProvider.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include <iostream>
7 #include <fstream>
8 #include <string>
10 
11 LVL1::eFEXSuperCellTowerIdProvider::eFEXSuperCellTowerIdProvider(const std::string &type, const std::string &name, const IInterface *parent):
13 {
14  declareInterface<IeFEXSuperCellTowerIdProvider>(this);
15 }
16 
18 {
19 }
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 
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 
68 {
69  auto haskey = m_SuperCelltoTowerIdmap.find(scid);
70  if (haskey == m_SuperCelltoTowerIdmap.end()) {
71  return false;
72  }
73  return true;
74 }
75 
77  return m_hascsvfile;
78 }
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 = 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 }
LVL1::eFEXSuperCellTowerIdProvider::towerinfo::isSplit
bool isSplit
if the SuperCell Et needs to be splited
Definition: eFEXSuperCellTowerIdProvider.h:39
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, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
LVL1::eFEXSuperCellTowerIdProvider::ifhaveinputfile
bool ifhaveinputfile() const override
Check if the csv file is valid.
Definition: eFEXSuperCellTowerIdProvider.cxx:76
LVL1::eFEXSuperCellTowerIdProvider::eFEXSuperCellTowerIdProvider
eFEXSuperCellTowerIdProvider(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
Definition: eFEXSuperCellTowerIdProvider.cxx:11
LVL1::eFEXSuperCellTowerIdProvider::setAddress
StatusCode setAddress(std::string) override
set the address to the csv file and load
Definition: eFEXSuperCellTowerIdProvider.cxx:31
LVL1::eFEXSuperCellTowerIdProvider::hasSuperCell
bool hasSuperCell(uint64_t) const override
Check if the SuperCell id exists in the csv file.
Definition: eFEXSuperCellTowerIdProvider.cxx:67
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LVL1::eFEXSuperCellTowerIdProvider::towerinfo
Sturcture stores mapping information of a SuperCell.
Definition: eFEXSuperCellTowerIdProvider.h:36
lumiFormat.i
int i
Definition: lumiFormat.py:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
test_pyathena.parent
parent
Definition: test_pyathena.py:15
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
LVL1::eFEXSuperCellTowerIdProvider::towerinfo::slot
int slot
slot of the tower in which the SuperCell belongs to
Definition: eFEXSuperCellTowerIdProvider.h:38
LVL1::eFEXSuperCellTowerIdProvider::towerinfo::eTowerID
int eTowerID
tower ID
Definition: eFEXSuperCellTowerIdProvider.h:37
TrigConf::name
Definition: HLTChainList.h:35
PathResolver.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
LVL1::eFEXSuperCellTowerIdProvider::geteTowerIDandslot
StatusCode geteTowerIDandslot(uint64_t scid, int &eTowerID, int &slot, bool &issplit) const override
obtain ordered tower IDs in an eFEX
Definition: eFEXSuperCellTowerIdProvider.cxx:47
LVL1::eFEXSuperCellTowerIdProvider::loadcsv
StatusCode loadcsv() override
load the csv file
Definition: eFEXSuperCellTowerIdProvider.cxx:80
AthAlgTool
Definition: AthAlgTool.h:26
eFEXSuperCellTowerIdProvider.h
Provide Supercell-tower mapping.
LVL1::eFEXSuperCellTowerIdProvider::initialize
StatusCode initialize() override
initialize the tool
Definition: eFEXSuperCellTowerIdProvider.cxx:21