Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
LVL1::eFEXFPGATowerIdProvider Class Reference

Provide tower-FPGA mapping Load information stored in a .csv file and provide the IDs of all towers in an FPGA or an eFEX module. More...

#include <eFEXFPGATowerIdProvider.h>

Inheritance diagram for LVL1::eFEXFPGATowerIdProvider:
Collaboration diagram for LVL1::eFEXFPGATowerIdProvider:

Classes

struct  towerinfo
 Sturcture defines the id, eta and phi position of a tower. More...
 

Public Member Functions

 eFEXFPGATowerIdProvider (const std::string &type, const std::string &name, const IInterface *parent)
 Constructor. More...
 
 ~eFEXFPGATowerIdProvider ()
 Destructor. More...
 
StatusCode initialize () override
 initialize the tool More...
 
StatusCode setAddress (const std::string &inputaddress) override
 set path to the csv file and load More...
 
StatusCode getRankedTowerIDinFPGA (int eFEXID, int FPGAID, int(&towerlist)[10][6]) const override
 obtain ordered tower IDs in an FPGA More...
 
StatusCode getRankedTowerIDineFEX (int eFEXID, int(&towerlist)[10][18]) const override
 obtain ordered tower IDs in an eFEX More...
 
bool ifhaveinputfile () const override
 
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & evtStore () const
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc. More...
 
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm. More...
 
virtual StatusCode sysStart () override
 Handle START transition. More...
 
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles. More...
 
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles. More...
 
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T > &t)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc="none")
 Declare a new Gaudi property. More...
 
void updateVHKA (Gaudi::Details::PropertyBase &)
 
MsgStream & msg () const
 
MsgStream & msg (const MSG::Level lvl) const
 
bool msgLvl (const MSG::Level lvl) const
 

Static Public Member Functions

static const InterfaceID & interfaceID ()
 

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution More...
 
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
 
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed. More...
 

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t
 

Private Member Functions

StatusCode rankTowerinFPGA (int FPGAindex) override
 rank the tower ids in an FPGA This function determines the order of towers in an FPGA. More...
 
bool hasFPGA (int) const override
 check if an FPGA exists in the csv file More...
 
StatusCode loadcsv () override
 load the mapping info in the csv file More...
 
int getFPGAIndex (int eFEXid, int FPGAid) const override
 determine the index of an FPGA More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyArrayType &)
 specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleType &)
 specialization for handling Gaudi::Property<SG::VarHandleBase> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &t, const SG::NotHandleType &)
 specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
 

Private Attributes

bool m_hascsvfile {false}
 if the csv file is valid More...
 
std::vector< std::unique_ptr< std::vector< int > > > m_towerrankingcache
 Ordered tower Ids in each FPGAs. The index is the index of the FPGA. More...
 
std::unordered_map< int, std::unique_ptr< std::vector< towerinfo > > > m_alltowers
 Unordered tower Ids in each FPGAs. The index is the index of the FPGA. More...
 
std::string m_csvaddress
 path to the input csv file More...
 
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default) More...
 
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default) More...
 
std::vector< SG::VarHandleKeyArray * > m_vhka
 
bool m_varHandleArraysDeclared
 

Detailed Description

Provide tower-FPGA mapping Load information stored in a .csv file and provide the IDs of all towers in an FPGA or an eFEX module.

Definition at line 33 of file eFEXFPGATowerIdProvider.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ eFEXFPGATowerIdProvider()

LVL1::eFEXFPGATowerIdProvider::eFEXFPGATowerIdProvider ( const std::string &  type,
const std::string &  name,
const IInterface *  parent 
)

Constructor.

Definition at line 12 of file eFEXFPGATowerIdProvider.cxx.

12  :
14 {
15  declareInterface<IeFEXFPGATowerIdProvider>(this);
16 }

◆ ~eFEXFPGATowerIdProvider()

LVL1::eFEXFPGATowerIdProvider::~eFEXFPGATowerIdProvider ( )

Destructor.

Definition at line 27 of file eFEXFPGATowerIdProvider.cxx.

28 {
29  m_alltowers.clear();
30  m_towerrankingcache.clear();
31 }

Member Function Documentation

◆ declareGaudiProperty() [1/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyArrayType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKeyArray>

Definition at line 170 of file AthCommonDataStore.h.

172  {
173  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
174  hndl.value(),
175  hndl.documentation());
176 
177  }

◆ declareGaudiProperty() [2/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158  {
159  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
160  hndl.value(),
161  hndl.documentation());
162 
163  }

◆ declareGaudiProperty() [3/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleBase>

Definition at line 184 of file AthCommonDataStore.h.

186  {
187  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
188  hndl.value(),
189  hndl.documentation());
190  }

◆ declareGaudiProperty() [4/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  t,
const SG::NotHandleType  
)
inlineprivateinherited

specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray>

Definition at line 199 of file AthCommonDataStore.h.

200  {
201  return PBASE::declareProperty(t);
202  }

◆ declareProperty() [1/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleBase hndl,
const std::string &  doc,
const SG::VarHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleBase. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 245 of file AthCommonDataStore.h.

249  {
250  this->declare(hndl.vhKey());
251  hndl.vhKey().setOwner(this);
252 
253  return PBASE::declareProperty(name,hndl,doc);
254  }

◆ declareProperty() [2/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKey hndl,
const std::string &  doc,
const SG::VarHandleKeyType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleKey. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 221 of file AthCommonDataStore.h.

225  {
226  this->declare(hndl);
227  hndl.setOwner(this);
228 
229  return PBASE::declareProperty(name,hndl,doc);
230  }

◆ declareProperty() [3/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKeyArray hndArr,
const std::string &  doc,
const SG::VarHandleKeyArrayType  
)
inlineinherited

Definition at line 259 of file AthCommonDataStore.h.

263  {
264 
265  // std::ostringstream ost;
266  // ost << Algorithm::name() << " VHKA declareProp: " << name
267  // << " size: " << hndArr.keys().size()
268  // << " mode: " << hndArr.mode()
269  // << " vhka size: " << m_vhka.size()
270  // << "\n";
271  // debug() << ost.str() << endmsg;
272 
273  hndArr.setOwner(this);
274  m_vhka.push_back(&hndArr);
275 
276  Gaudi::Details::PropertyBase* p = PBASE::declareProperty(name, hndArr, doc);
277  if (p != 0) {
278  p->declareUpdateHandler(&AthCommonDataStore<PBASE>::updateVHKA, this);
279  } else {
280  ATH_MSG_ERROR("unable to call declareProperty on VarHandleKeyArray "
281  << name);
282  }
283 
284  return p;
285 
286  }

◆ declareProperty() [4/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc,
const SG::NotHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This is the generic version, for types that do not derive from SG::VarHandleKey. It just forwards to the base class version of declareProperty.

Definition at line 333 of file AthCommonDataStore.h.

337  {
338  return PBASE::declareProperty(name, property, doc);
339  }

◆ declareProperty() [5/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc = "none" 
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This dispatches to either the generic declareProperty or the one for VarHandle/Key/KeyArray.

Definition at line 352 of file AthCommonDataStore.h.

355  {
356  typedef typename SG::HandleClassifier<T>::type htype;
357  return declareProperty (name, property, doc, htype());
358  }

◆ declareProperty() [6/6]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T > &  t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145  {
146  typedef typename SG::HandleClassifier<T>::type htype;
148  }

◆ detStore()

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

95 { return m_detStore; }

◆ evtStore() [1/2]

ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

85 { return m_evtStore; }

◆ evtStore() [2/2]

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( ) const
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 90 of file AthCommonDataStore.h.

90 { return m_evtStore; }

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase &  ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ getFPGAIndex()

int LVL1::eFEXFPGATowerIdProvider::getFPGAIndex ( int  eFEXid,
int  FPGAid 
) const
overrideprivatevirtual

determine the index of an FPGA

Parameters
eFEXIDId of the eFEX module (0-23)
FPGAIDId of the FPGA (0-3)
Returns
FPGA index

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 276 of file eFEXFPGATowerIdProvider.cxx.

277 {
278  // check the range of eFEX ID and FPGA ID
279  // There is supposed to be 24 eFex and each eFex
280  // contains 4 FPGAs.
281  if (FPGAid < 0 or FPGAid > 3) {
282  return -1;
283  }
284  if (eFEXid < 0 or FPGAid > 23) {
285  return -1;
286  }
287  return eFEXid * 4 + FPGAid;
288 }

◆ getRankedTowerIDineFEX()

StatusCode LVL1::eFEXFPGATowerIdProvider::getRankedTowerIDineFEX ( int  eFEXID,
int(&)  towerlist[10][18] 
) const
overridevirtual

obtain ordered tower IDs in an eFEX

Parameters
eFEXIDId of the eFEX module (0-23)
towerlista 10*18 (phi*eta) array to store the output tower Ids
Returns
status code

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 83 of file eFEXFPGATowerIdProvider.cxx.

83  {
84  int FPGA0index{ getFPGAIndex(eFEXID, 0) };
85  int FPGA1index{ getFPGAIndex(eFEXID, 1) };
86  int FPGA2index{ getFPGAIndex(eFEXID, 2) };
87  int FPGA3index{ getFPGAIndex(eFEXID, 3) };
88 
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++) {
93  towerlist[i][j] = 0;
94  }
95  }
96  ATH_MSG_ERROR("FPGA mapping info missing.");
97  return StatusCode::FAILURE;
98  }
99 
100  // FPGA0
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++);
105  }
106  }
107 
108  // fPGA1 skipping overlap with FPGA0 and FPGA2
109  vectorindex = 0;
110  for (int i{ 0 }; i < 10; i++) {
111  vectorindex += 2;
112  for (int j{ 2 }; j < 4; j++) {
113  towerlist[i][j + 4] = (*m_towerrankingcache[FPGA1index]).at(vectorindex++);
114  }
115  vectorindex += 2;
116  }
117 
118  // FPGA2
119  vectorindex = 0;
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++);
123  }
124  }
125 
126  // FPGA4 skipping overlap with FPGA2
127  vectorindex = 0;
128  for (int i{ 0 }; i < 10; i++) {
129  vectorindex += 2;
130  for (int j{ 2 }; j < 6; j++) {
131  towerlist[i][j + 12] = (*m_towerrankingcache[FPGA3index]).at(vectorindex++);
132  }
133  }
134  return StatusCode::SUCCESS;
135 }

◆ getRankedTowerIDinFPGA()

StatusCode LVL1::eFEXFPGATowerIdProvider::getRankedTowerIDinFPGA ( int  eFEXID,
int  FPGAID,
int(&)  towerlist[10][6] 
) const
overridevirtual

obtain ordered tower IDs in an FPGA

Parameters
eFEXIDId of the eFEX module (0-23)
FPGAIDId of the FPGA (0-3)
towerlista 10*6 (phi*eta) array to store the output tower Ids
Returns
status code

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 59 of file eFEXFPGATowerIdProvider.cxx.

59  {
60  int FPGAindex{ getFPGAIndex(eFEXID, FPGAID) };
61  if (m_towerrankingcache[FPGAindex]) {
62  // obtain the tower order from cache
63  int vectorindex{ 0 };
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++);
67  }
68  }
69  }
70  // set tower ids to 0 if the information about the FPGA stored in the .csv file is damaged
71  else {
72  for (int i{ 0 }; i < 10; i++) {
73  for (int j{ 0 }; j < 6; j++) {
74  towerlist[i][j] = 0;
75  }
76  }
77  ATH_MSG_ERROR("FPGA mapping info missing.");
78  return StatusCode::FAILURE;
79  }
80  return StatusCode::SUCCESS;
81 }

◆ hasFPGA()

bool LVL1::eFEXFPGATowerIdProvider::hasFPGA ( int  FPGAindex) const
overrideprivatevirtual

check if an FPGA exists in the csv file

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 183 of file eFEXFPGATowerIdProvider.cxx.

184 {
185  // check if the info of a speific FPGA has been loaded or not
186  return m_alltowers.contains(FPGAindex);
187 }

◆ ifhaveinputfile()

bool LVL1::eFEXFPGATowerIdProvider::ifhaveinputfile ( ) const
overridevirtual

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 137 of file eFEXFPGATowerIdProvider.cxx.

137  {
138  return m_hascsvfile;
139 }

◆ initialize()

StatusCode LVL1::eFEXFPGATowerIdProvider::initialize ( )
override

initialize the tool

Definition at line 18 of file eFEXFPGATowerIdProvider.cxx.

19 {
20  std::string csvpath = PathResolver::find_file("tower_fpga_efex_map.csv", "DATAPATH");
21  if (setAddress(csvpath) == StatusCode::FAILURE) {
22  ATH_MSG_WARNING("tower_fpga_efex_map.csv missing or invalid. Swiching to hard-coded mapping.");
23  };
24  return StatusCode::SUCCESS;
25 }

◆ inputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ interfaceID()

static const InterfaceID& LVL1::IeFEXFPGATowerIdProvider::interfaceID ( )
inlinestaticinherited

Definition at line 18 of file IeFEXFPGATowerIdProvider.h.

18 { return IID_IIeFEXFPGATowerIdProvider; };

◆ loadcsv()

StatusCode LVL1::eFEXFPGATowerIdProvider::loadcsv ( )
overrideprivatevirtual

load the mapping info in the csv file

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 189 of file eFEXFPGATowerIdProvider.cxx.

190 {
191  // read the .csv file line by line
192  std::string eachline;
193  std::ifstream myfile(m_csvaddress);
194  if (myfile.is_open()) {
195  while (std::getline(myfile, eachline)) {
196  // ignore text after #
197  std::string::size_type ipos = eachline.find("#");
198  if (ipos!=std::string::npos) eachline.resize(ipos);
199 
200  // prevent reading lines with only white spaces
201  if (std::all_of(eachline.begin(), eachline.end(), ::isspace)) {
202  continue;
203  }
204 
205  // ignore lines with non-digit characters
206  auto validchar = [](char ch) { return (::isspace(ch) || ::isdigit(ch) || ch==','); };
207  if (!std::all_of(eachline.begin(), eachline.end(), validchar)) {
208  ATH_MSG_INFO("invalid line '" << eachline << "'");
209  break;
210  }
211 
212  // split lines in the .csv file by comma
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, ',');
218  try {
219  numbers_in_eachline.push_back(std::stoi(tem_string));
220  }
221  catch (...) {
222  ATH_MSG_WARNING( "Invalid input in tower_fpga_efex_map.csv." );
223  return StatusCode::FAILURE;
224  }
225  }
226 
227  // There is supposed to be 5 numbers in each line:
228  // eFEX ID, FPGA ID, eTower ID, eta, phi
229  if (numbers_in_eachline.size() != 5) {
230  ATH_MSG_WARNING( "Invalid input in tower_fpga_efex_map.csv." );
231  return StatusCode::FAILURE;
232  }
233  // eta and phi are supposed to be positive
234  if (numbers_in_eachline[3] < 0 || numbers_in_eachline[4] < 0) {
235  ATH_MSG_WARNING("Invalid input in tower_fpga_efex_map.csv.");
236  // return scodefail
237  return StatusCode::FAILURE;
238  }
239  int FPGAindex = getFPGAIndex(numbers_in_eachline[0], numbers_in_eachline[1]);
240  // check the range of eFEX ID and FPGA ID
241  if (FPGAindex == -1) {
242  ATH_MSG_WARNING("Invalid input in tower_fpga_efex_map.csv.");
243  return StatusCode::FAILURE;
244  }
245  towerinfo tem_towerinfo;
246  tem_towerinfo.eTowerID = numbers_in_eachline[2];
247  // determine the sign of eta using the tower id
248  // positive: 200000-299999, 400000-499999, 600000-699999
249  // negative: 100000-199999, 300000-399999, 500000-599999
250  int etasign;
251  if (int(numbers_in_eachline[2] / 100000) % 2 != 0) {
252  etasign = -1;
253  } else {
254  etasign = 1;
255  }
256  tem_towerinfo.eTowerEta = etasign * (numbers_in_eachline[3]);
257  tem_towerinfo.eTowerPhi = numbers_in_eachline[4];
258 
259  // Create a key for the FPGA if the the FPGA key is not
260  // avaliable in the m_alltowers hash table object yet.
261  // Otherwise append the tower to the existing bucket.
262  if (hasFPGA(FPGAindex)) {
263  m_alltowers[FPGAindex]->push_back(tem_towerinfo);
264  } else {
265  m_alltowers[FPGAindex] = std::make_unique<std::vector<towerinfo>>(std::vector{tem_towerinfo});
266  }
267  }
268  myfile.close();
269  } else {
270  ATH_MSG_WARNING("Unable to open share/tower_fpga_efex_map.csv.");
271  return StatusCode::FAILURE;
272  }
273  return StatusCode::SUCCESS;
274 }

◆ msg() [1/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24  {
25  return this->msgStream();
26  }

◆ msg() [2/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( const MSG::Level  lvl) const
inlineinherited

Definition at line 27 of file AthCommonMsg.h.

27  {
28  return this->msgStream(lvl);
29  }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level  lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30  {
31  return this->msgLevel(lvl);
32  }

◆ outputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ rankTowerinFPGA()

StatusCode LVL1::eFEXFPGATowerIdProvider::rankTowerinFPGA ( int  FPGAindex)
overrideprivatevirtual

rank the tower ids in an FPGA This function determines the order of towers in an FPGA.

Towers are sorted using eta and phi, and then store the result in m_towerrankingcache object for future use.

Parameters
FPGAindexindex of the FPGA
Returns
status code
See also
getFPGAIndex

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 141 of file eFEXFPGATowerIdProvider.cxx.

142 {
143  // This function determines the order of towers in an FPGA.
144  // Towers are sorted using eta and phi, and
145  // then store the result in m_towerrankingcache object for future use.
146 
147  // If the tower order of an FPGA has not been determined yet, start sorting.
148  if (!m_towerrankingcache[FPGAindex]) {
149  std::vector<std::pair<int, int>> rankingmap;
150  // the row order is determined by eta while the column order is determined by phi
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));
154  } else {
155  rankingmap.push_back(std::pair<int, int>(-each.eTowerEta - each.eTowerPhi * 100, each.eTowerID));
156  }
157  }
158  // There is supposed to be 60 towers in each FPGA
159  if (rankingmap.size() != 60) {
160  return StatusCode::FAILURE;
161  }
162  std::sort(rankingmap.begin(), rankingmap.end(),
163  [](std::pair<int, int> a, std::pair<int, int> b) {
164  // tower around eta == 0 has the same eta.
165  if (a.first == b.first) {
166  return (a.second < b.second);
167  }
168  return (a.first > b.first);
169  });
170  auto output = std::make_unique<std::vector<int>>();
171  output->reserve(60);
172  int vectorindex = 0;
173  for (int i{ 0 }; i < 10; i++) {
174  for (int j{ 0 }; j < 6; j++) {
175  output->push_back(rankingmap[vectorindex++].second);
176  }
177  }
178  m_towerrankingcache[FPGAindex] = std::move(output);
179  }
180  return StatusCode::SUCCESS;
181 }

◆ renounce()

std::enable_if_t<std::is_void_v<std::result_of_t<decltype(&T::renounce)(T)> > && !std::is_base_of_v<SG::VarHandleKeyArray, T> && std::is_base_of_v<Gaudi::DataHandle, T>, void> AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T &  h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381  {
382  h.renounce();
383  PBASE::renounce (h);
384  }

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364  {
365  handlesArray.renounce();
366  }

◆ setAddress()

StatusCode LVL1::eFEXFPGATowerIdProvider::setAddress ( const std::string &  inputaddress)
overridevirtual

set path to the csv file and load

Implements LVL1::IeFEXFPGATowerIdProvider.

Definition at line 33 of file eFEXFPGATowerIdProvider.cxx.

34 {
35  if (inputaddress.empty()) {
36  m_hascsvfile = false;
37  return StatusCode::FAILURE;
38  }
39  m_hascsvfile = true;
40  m_csvaddress = inputaddress;
41  if (loadcsv() == StatusCode::FAILURE) {
42  m_hascsvfile = false;
43  return StatusCode::FAILURE;
44  }
45  m_towerrankingcache.clear();
46  m_towerrankingcache.resize(96);
47  // sort the towers in each FPGA
48  for (int efex{ 0 }; efex < 24; efex++) {
49  for (int fpga{ 0 }; fpga < 4; fpga++) {
50  if (rankTowerinFPGA(getFPGAIndex(efex, fpga)) == StatusCode::FAILURE) {
51  m_hascsvfile = false;
52  return StatusCode::FAILURE;
53  }
54  }
55  }
56  return StatusCode::SUCCESS;
57 }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in DerivationFramework::CfAthAlgTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and asg::AsgMetadataTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase &  )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308  {
309  // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310  // << " size: " << m_vhka.size() << endmsg;
311  for (auto &a : m_vhka) {
312  std::vector<SG::VarHandleKey*> keys = a->keys();
313  for (auto k : keys) {
314  k->setOwner(this);
315  }
316  }
317  }

Member Data Documentation

◆ m_alltowers

std::unordered_map<int, std::unique_ptr<std::vector<towerinfo> > > LVL1::eFEXFPGATowerIdProvider::m_alltowers
private

Unordered tower Ids in each FPGAs. The index is the index of the FPGA.

See also
getFPGAIndex

Definition at line 104 of file eFEXFPGATowerIdProvider.h.

◆ m_csvaddress

std::string LVL1::eFEXFPGATowerIdProvider::m_csvaddress
private

path to the input csv file

Definition at line 123 of file eFEXFPGATowerIdProvider.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_hascsvfile

bool LVL1::eFEXFPGATowerIdProvider::m_hascsvfile {false}
private

if the csv file is valid

Definition at line 83 of file eFEXFPGATowerIdProvider.h.

◆ m_towerrankingcache

std::vector<std::unique_ptr<std::vector<int> > > LVL1::eFEXFPGATowerIdProvider::m_towerrankingcache
private

Ordered tower Ids in each FPGAs. The index is the index of the FPGA.

See also
getFPGAIndex

Definition at line 101 of file eFEXFPGATowerIdProvider.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files:
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
sendEI_SPB.ch
ch
Definition: sendEI_SPB.py:35
LVL1::eFEXFPGATowerIdProvider::m_alltowers
std::unordered_map< int, std::unique_ptr< std::vector< towerinfo > > > m_alltowers
Unordered tower Ids in each FPGAs. The index is the index of the FPGA.
Definition: eFEXFPGATowerIdProvider.h:104
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
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
AthCommonDataStore::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
Definition: AthCommonDataStore.h:390
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
std::vector< SG::VarHandleKeyArray * > m_vhka
Definition: AthCommonDataStore.h:398
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
SG::VarHandleKeyArray::setOwner
virtual void setOwner(IDataHandleHolder *o)=0
IDTPMcnv.htype
htype
Definition: IDTPMcnv.py:29
LVL1::eFEXFPGATowerIdProvider::m_towerrankingcache
std::vector< std::unique_ptr< std::vector< int > > > m_towerrankingcache
Ordered tower Ids in each FPGAs. The index is the index of the FPGA.
Definition: eFEXFPGATowerIdProvider.h:101
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
AthCommonDataStore
Definition: AthCommonDataStore.h:52
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
test_pyathena.parent
parent
Definition: test_pyathena.py:15
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
Definition: AthCommonDataStore.h:393
LVL1::eFEXFPGATowerIdProvider::setAddress
StatusCode setAddress(const std::string &inputaddress) override
set path to the csv file and load
Definition: eFEXFPGATowerIdProvider.cxx:33
AthAlgTool::AthAlgTool
AthAlgTool()
Default constructor:
SG::VarHandleKeyArray::renounce
virtual void renounce()=0
SG::HandleClassifier::type
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
Definition: HandleClassifier.h:54
merge.output
output
Definition: merge.py:17
merge_scale_histograms.doc
string doc
Definition: merge_scale_histograms.py:9
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
LVL1::eFEXFPGATowerIdProvider::getFPGAIndex
int getFPGAIndex(int eFEXid, int FPGAid) const override
determine the index of an FPGA
Definition: eFEXFPGATowerIdProvider.cxx:276
LVL1::eFEXFPGATowerIdProvider::rankTowerinFPGA
StatusCode rankTowerinFPGA(int FPGAindex) override
rank the tower ids in an FPGA This function determines the order of towers in an FPGA.
Definition: eFEXFPGATowerIdProvider.cxx:141
a
TList * a
Definition: liststreamerinfos.cxx:10
h
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LVL1::eFEXFPGATowerIdProvider::loadcsv
StatusCode loadcsv() override
load the mapping info in the csv file
Definition: eFEXFPGATowerIdProvider.cxx:189
LVL1::eFEXFPGATowerIdProvider::hasFPGA
bool hasFPGA(int) const override
check if an FPGA exists in the csv file
Definition: eFEXFPGATowerIdProvider.cxx:183
LVL1::eFEXFPGATowerIdProvider::m_csvaddress
std::string m_csvaddress
path to the input csv file
Definition: eFEXFPGATowerIdProvider.h:123
LVL1::eFEXFPGATowerIdProvider::m_hascsvfile
bool m_hascsvfile
if the csv file is valid
Definition: eFEXFPGATowerIdProvider.h:83
SG::VarHandleBase::vhKey
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
Definition: StoreGate/src/VarHandleBase.cxx:629
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:798
AthCommonDataStore::declareGaudiProperty
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition: AthCommonDataStore.h:156
fitman.k
k
Definition: fitman.py:528