Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
eFexTowerBuilder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 //***************************************************************************
6 // eFexTowerBuilder - description:
7 // Builds an eFexTowerContainer from a CaloCellContainer (for supercells) and TriggerTowerContainer (for ppm tile towers)
8 // -------------------
9 // begin : 06 12 2022
10 // email : will@cern.ch
11 //***************************************************************************/
12 
13 
14 // MyPackage includes
15 #include "eFexTowerBuilder.h"
16 
18 
20 
21 
22 #include "TFile.h"
23 #include "TTree.h"
25 
26 namespace LVL1 {
27 
28 eFexTowerBuilder::eFexTowerBuilder( const std::string& name, ISvcLocator* pSvcLocator ) : AthReentrantAlgorithm( name, pSvcLocator ){
29 
30 
31 }
32 
34  ATH_MSG_INFO ("Initializing " << name() << "...");
35 
36  CHECK( m_ddmKey.initialize(true) );
37  CHECK( m_ttKey.initialize(true) );
38  CHECK( m_scellKey.initialize(true) );
39  CHECK( m_outKey.initialize(true) );
40  CHECK( m_eiKey.initialize(true) );
41 
42  if (auto fileName = PathResolverFindCalibFile( m_mappingFile ); !fileName.empty()) {
43  std::unique_ptr<TFile> f( TFile::Open(fileName.c_str()) );
44  if (f) {
45  TTree* t = f->Get<TTree>("mapping");
46  if(t) {
47  unsigned long long scid = 0;
48  std::pair<int,int> coord = {0,0};
49  std::pair<int,int> slot;
50  t->SetBranchAddress("scid",&scid);
51  t->SetBranchAddress("etaIndex",&coord.first);
52  t->SetBranchAddress("phiIndex",&coord.second);
53  t->SetBranchAddress("slot1",&slot.first);
54  t->SetBranchAddress("slot2",&slot.second);
55  for(Long64_t i=0;i<t->GetEntries();i++) {
56  t->GetEntry(i);
57  m_scMap[scid] = std::make_pair(coord,slot);
58  }
59  }
60  }
61  if (m_scMap.empty()) {
62  ATH_MSG_WARNING("Failed to load sc -> eFexTower map from " << fileName);
63  } else {
64  ATH_MSG_INFO("Loaded sc -> eFexTower map from " << fileName);
65  }
66  }
67 
68  return StatusCode::SUCCESS;
69 }
70 
71 StatusCode eFexTowerBuilder::fillTowers(const EventContext& ctx) const {
72 
73 
76  if(!tTowers.isValid()){
77  ATH_MSG_FATAL("Could not retrieve collection " << m_ttKey.key() );
78  return StatusCode::FAILURE;
79  }
80  SG::ReadHandle<CaloCellContainer> scells(m_scellKey,ctx); // n.b. 34048 is a full complement of scells
81  if(!scells.isValid()){
82  ATH_MSG_FATAL("Could not retrieve collection " << m_scellKey.key() );
83  return StatusCode::FAILURE;
84  }
85 
87  if(!ei.isValid()) {
88  ATH_MSG_FATAL("Cannot retrieve eventinfo");
89  return StatusCode::FAILURE;
90  }
91  bool isMC = ei->eventType(xAOD::EventInfo::IS_SIMULATION); // currently only used to decide if should set a saturation code or not
92 
93 
94  std::map<std::pair<int,int>,std::array<int,11>> towers;
95 
96  constexpr int INVALID_VALUE = -99999; // use this value to indicate invalid
97  constexpr int MASKED_VALUE = std::numeric_limits<int>::max(); // use this value to indicate masked
98  constexpr int SATURATED_VALUE = std::numeric_limits<int>::max()-1; // use this value to indicate saturation
99 
100  for (auto digi: *scells) {
101  const auto itr = m_scMap.find(digi->ID().get_compact());
102  if (itr == m_scMap.end()) { continue; } // not in map so not mapping to a tower
103  int val = std::round(digi->energy()/(12.5*std::cosh(digi->eta()))); // 12.5 is b.c. energy is in units of 12.5MeV per count
104  // note: a val of < -99998 is what is produced if efex was sent an invalid code of 1022 (see LArRawtoSuperCell)
105  bool isSaturated = (!isMC) ? (digi->quality()) : false; // not applying saturation codes in MC until the changes to trigger counts has been investigated
106  bool isMasked = m_applyMasking ? ((digi)->provenance()&0x80) : false;
107  bool isInvalid = m_applyMasking ? ((digi)->provenance()&0x40) : false;
108  // note: if debugging, the SCIDs have value: digi->ID().get_compact()>>32
109  if(isInvalid) {
110  val = INVALID_VALUE;
111  }
112  if(isSaturated) {
113  val = SATURATED_VALUE;
114  }
115 
116  auto towerItr = towers.emplace(itr->second.first,std::array<int,11>{}); // returns pair<itr,bool> with bool indicating if emplaced
117  if(towerItr.second) { // did an emplace
118  towerItr.first->second.fill(INVALID_VALUE); // ensure all slots initialize with invalid value
119  }
120  auto& tower = (towerItr.first->second);
121  if (itr->second.second.second<11) {
122  // doing an energy split between slots ... don't include a masked channel (or invalid channel)
123  if (!isMasked && val!=INVALID_VALUE) {
124  if(isSaturated) {
125  // mark both as saturated
126  tower.at(itr->second.second.first) = SATURATED_VALUE;
127  tower.at(itr->second.second.second) = SATURATED_VALUE;
128  }
129  if(tower.at(itr->second.second.first)!=(SATURATED_VALUE)) { // don't override saturation
130  // if the other contribution was masked or invalid, revert to 0 before adding this contribution
131  if (tower.at(itr->second.second.first)==MASKED_VALUE || tower.at(itr->second.second.first)==INVALID_VALUE) {
132  tower.at(itr->second.second.first)=0;
133  }
134  tower.at(itr->second.second.first) += val >> 1;
135  }
136  if(tower.at(itr->second.second.second)!=(SATURATED_VALUE)) { // don't override saturation
137  // if the other contribution was masked or invalid, revert to 0 before adding this contribution
138  if (tower.at(itr->second.second.second)==MASKED_VALUE || tower.at(itr->second.second.second)==INVALID_VALUE) {
139  tower.at(itr->second.second.second)=0;
140  }
141  tower.at(itr->second.second.second) += (val - (val >> 1)); // HW seems fixed now!
142  }
143  }
144  // hw is incorrectly ignoring masking on the second part
145  // so always add the 2nd bit
146  //tower.at(itr->second.second.second) += (val - (val >> 1)); // Removed b.c. of fix above - leaving this comment here until resolved!
147  } else {
148  auto& v = tower.at(itr->second.second.first);
149  if (isMasked) {
150  // dont mark it masked if it already has a contribution
151  if(v==INVALID_VALUE) v = MASKED_VALUE;
152  } else if(isSaturated) {
153  v = val;
154  } else {
155  if(v==INVALID_VALUE) v = 0;
156  v += val;
157  }
158  }
159 
160  }
161 
162  // add tile energies from TriggerTowers
163  static const auto etaIndex = [](float eta) { return int( eta*10 ) + ((eta<0) ? -1 : 1); };
164  static const auto phiIndex = [](float phi) { return int( phi*32./M_PI ) + (phi<0 ? -1 : 1); };
165  for(const xAOD::TriggerTower_v2* tTower : *tTowers) {
166  if (std::abs(tTower->eta()) > 1.5) continue;
167  if (tTower->sampling() != 1) continue;
168  double phi = tTower->phi(); if(phi > M_PI) phi -= 2.*M_PI;
169  auto towerItr = towers.emplace(std::pair(etaIndex(tTower->eta()),phiIndex(phi)),std::array<int,11>{}); // returns pair<itr,bool> with bool indicating if emplaced
170  if(towerItr.second) { // did an emplace
171  towerItr.first->second.fill(INVALID_VALUE); // ensure all slots initialize with invalid value
172  }
173  (towerItr.first->second).at(10) = tTower->cpET();
174  }
175 
176 
178  ATH_CHECK( eTowers.record(std::make_unique<xAOD::eFexTowerContainer>(),std::make_unique<xAOD::eFexTowerAuxContainer>()) );
179 
180  static const auto calToFex = [](int calEt) {
181  if(calEt == MASKED_VALUE) return 0; // indicates masked channel
182  if(calEt == SATURATED_VALUE) return 1023; // saturated channel
183  if( calEt == INVALID_VALUE ) return 1022; // invalid channel value
184  if(calEt<448) return std::max((calEt&~1)/2+32,1); // 25 MeV per eFexTower count
185  if(calEt<1472) return (calEt-448)/4+256; // 50 MeV per eFexTower count
186  if(calEt<3520) return (calEt-1472)/8+512; // 100 MeV ...
187  if(calEt<11584) return (calEt-3520)/32+768; // 400 MeV ...
188  return 1020;
189  };
190 
191  // now create the towers. Note that we need a code for "missing" input (1025), because a tower can contain some but not all
192  // inputs, depending on which sources are present in the run (e.g. if tile is present but not LAr).
193  // This is different to e.g. jFex, which creates a separate tower for each source at each location
194  // so jFex doesn't need a "missing" input code.
195  for(auto& [coord,counts] : towers) {
196  size_t ni = (std::abs(coord.first)<=15) ? 10 : 11; // ensures we skip the tile towers for next line
197  for(size_t i=0;i<ni;++i) counts[i] = (scells->empty() ? 1025 : calToFex(counts[i])); // do latome energy scaling to non-tile towers - if had no cells will use code "1025" to indicate
198  eTowers->push_back( std::make_unique<xAOD::eFexTower>() );
199  eTowers->back()->initialize( ( (coord.first<0 ? 0.5:-0.5) + coord.first)*0.1 ,
200  ( (coord.second<0 ? 0.5:-0.5) + coord.second)*M_PI/32,
201  std::vector<uint16_t>(counts.begin(), counts.end()),
202  -1, /* module number */
203  -1, /* fpga number */
204  0,0 /* status flags ... could use to indicate which cells were actually present?? */);
205  }
206 
207  return StatusCode::SUCCESS;
208 
209 }
210 
211 StatusCode eFexTowerBuilder::fillMap(const EventContext& ctx) const {
212 
213  ATH_MSG_INFO("Filling sc -> eFexTower map");
214 
216  SG::ReadHandle<CaloCellContainer> scells(m_scellKey,ctx); // 34048 is a full complement of scells
217  if(!scells.isValid()){
218  ATH_MSG_FATAL("Could not retrieve collection " << m_scellKey.key() );
219  return StatusCode::FAILURE;
220  }
221  if (scells->size() != 34048 && !m_mappingFile.empty()) {
222  ATH_MSG_FATAL("Cannot fill sc -> eFexTower mapping with an incomplete sc collection");
223  return StatusCode::FAILURE;
224  }
225  struct TowerSCells {
226  std::vector<unsigned long long> ps;
227  std::vector<std::pair<float,unsigned long long>> l1;
228  std::vector<std::pair<float,unsigned long long>> l2;
229  std::vector<unsigned long long> l3;
230  std::vector<unsigned long long> had;
231  std::vector<unsigned long long> other;
232  };
233  static const auto etaIndex = [](float eta) { return int( eta*10 ) + ((eta<0) ? -1 : 1); }; // runs from -25 to 25, skipping over 0 (so gives outer edge eta)
234  static const auto phiIndex = [](float phi) { return int( phi*32./ROOT::Math::Pi() ) + (phi<0 ? -1 : 1); }; // runs from -pi to pi, skipping over 0 (gives out edge phi)
235  std::map<std::pair<int,int>,TowerSCells> towers;
236  std::map<unsigned long long,int> eTowerSlots; // not used by this alg, but we produce the map for benefit of eFexTower->eTower alg
237 
238  for (auto digi: *scells) {
239  Identifier id = digi->ID(); // this is if using supercells
240 
241  if (auto elem = ddm->get_element(id); elem && std::abs(elem->eta_raw())<2.5) {
242  float eta = elem->eta_raw(); // this seems more symmetric
243  int sampling = elem->getSampling();
244  if(sampling==6 && ddm->getCaloCell_ID()->region(id)==0 && eta<0) eta-=0.01; // nudge this L2 endcap supercell into correct tower (right on boundary)
245 
246  unsigned long long val = id.get_compact();
247 
248  int towerid = -1;int slot = -1;bool issplit = false;
249  CHECK(m_eFEXSuperCellTowerIdProviderTool->geteTowerIDandslot(id.get_compact(), towerid, slot, issplit));
250  eTowerSlots[id.get_compact()] = slot;
251 
252  auto& sc = towers[std::pair(etaIndex(eta),phiIndex(elem->phi_raw()))];
253  switch(sampling) {
254  case 0: case 4: //lar barrel/endcap presampler
255  sc.ps.push_back(val);
256  break;
257  case 1: case 5: //lar barrel/endcap l1
258  sc.l1.push_back({elem->eta(),val}); break;
259  case 2: case 6: //lar barrel/endcap l2
260  sc.l2.push_back({elem->eta(),val}); break;
261  case 3: case 7: //lar barrel/endcap l3
262  sc.l3.push_back(val); break;
263  case 8: case 9: case 10: case 11: //lar hec
264  sc.had.push_back(val); break;
265  default:
266  sc.other.push_back(val); break;
267  }
268  }
269  }
270 
271 
272  // sort (by increasing eta) l1/l2 sc and handle special cases
273  // finally also output the eTower slot vector
274  std::vector<size_t> slotVector(11);
275  for(auto& [coord,sc] : towers) {
276  std::sort(sc.l1.begin(),sc.l1.end());
277  std::sort(sc.l2.begin(),sc.l2.end());
278  // we have 5 l2 cells @ |eta|=1.45 ... put lowest |eta| one in l3 slot
279  if (sc.l2.size()==5) {
280  if (coord.first >= 0) {
281  sc.l3.push_back(sc.l2.front().second);
282  sc.l2.erase(sc.l2.begin()); // remove first
283  } else {
284  sc.l3.push_back(sc.l2.back().second);
285  sc.l2.resize(sc.l2.size()-1); // remove last
286  }
287  }
288  if (std::abs(coord.first)==15) { //|eta| = 1.45
289  // in the overlap region it seems like the latome id with highest |eta| is swapped with next highest
290  // so to compare we swap the first and second (3rd and 4th are fine) if eta < 0, or 3rd and 4th if eta > 0
291  if (coord.first<0) {std::swap(sc.l1.at(0),sc.l1.at(1)); }
292  else {std::swap(sc.l1.at(2),sc.l1.at(3));}
293  }
294  // handle case @ |eta|~1.8-2 with 6 L1 cells
295  if (sc.l1.size()==6) {
296  m_scMap[sc.l1.at(0).second] = std::pair(coord,std::pair(1,11));
297  m_scMap[sc.l1.at(1).second] = std::pair(coord,(m_v6Mapping && coord.first < 0) ? std::pair(2,1) : std::pair(1,2)); // in LATOME v5 FW this was (1,2) for both sides
298  m_scMap[sc.l1.at(2).second] = std::pair(coord,std::pair(2,11));
299  m_scMap[sc.l1.at(3).second] = std::pair(coord,std::pair(3,11));
300  m_scMap[sc.l1.at(4).second] = std::pair(coord,(m_v6Mapping && coord.first < 0) ? std::pair(4,3) : std::pair(3,4)); // in LATOME v5 FW this was (3,4) for both sides
301  m_scMap[sc.l1.at(5).second] = std::pair(coord,std::pair(4,11));
302  slotVector[1] = eTowerSlots[sc.l1.at(0).second];
303  slotVector[2] = eTowerSlots[sc.l1.at(2).second];
304  slotVector[3] = eTowerSlots[sc.l1.at(3).second];
305  slotVector[4] = eTowerSlots[sc.l1.at(5).second];
306  }
307 
308  // for |eta|>2.4 there's only 1 l1 sc, to match hardware this should be compared placed in the 'last' l1 input
309  if (sc.l1.size()==1) {
310  m_scMap[sc.l1.at(0).second] = std::pair(coord,std::pair(4,11));
311  slotVector[1] = 1; slotVector[2] = 2; slotVector[3] = 3; slotVector[4] = eTowerSlots[sc.l1.at(0).second];
312  }
313 
314  // fill the map with sc ids -> tower coord + slot
315  if (!sc.ps.empty()) {m_scMap[sc.ps.at(0)] = std::pair(coord,std::pair(0,11)); slotVector[0] = eTowerSlots[sc.ps.at(0)]; }
316  if(sc.l1.size()==4) for(size_t i=0;i<4;i++) if(sc.l1.size() > i) {m_scMap[sc.l1.at(i).second] = std::pair(coord,std::pair(i+1,11)); slotVector[i+1] = eTowerSlots[sc.l1.at(i).second]; }
317  for(size_t i=0;i<4;i++) if(sc.l2.size() > i) { m_scMap[sc.l2.at(i).second] = std::pair(coord,std::pair(i+5,11)); slotVector[i+5] = eTowerSlots[sc.l2.at(i).second]; }
318  if (!sc.l3.empty()) {m_scMap[sc.l3.at(0)] = std::pair(coord,std::pair(9,11)); slotVector[9] = eTowerSlots[sc.l3.at(0)]; }
319  if (!sc.had.empty()) {m_scMap[sc.had.at(0)] = std::pair(coord,std::pair(10,11));slotVector[10] = eTowerSlots[sc.had.at(0)]; }
320 
321  // finally output the slotVector for this tower
322  // do only for the slots that don't match
323  // note to self: seems like everything is fine apart from the l1->ps remap for |eta|>2.4
324  // so leaving this bit commented out for now ... useful to leave it here in case need to recheck in future
325 // for(size_t i=0;i<slotVector.size();i++) {
326 // if(slotVector[i] != i) {
327 // std::cout << coord.first << "," << coord.second << "," << i << "," << slotVector[i] << std::endl;
328 // }
329 // }
330  }
331 
332  // save the map to disk, if required
333  if(!m_mappingFile.empty()) {
334  TFile f(m_mappingFile.value().c_str(), "RECREATE");
335  TTree *t = new TTree("mapping", "mapping");
336  unsigned long long scid = 0;
337  std::pair<int, int> coord = {0, 0};
338  std::pair<int, int> slot = {-1, -1};
339  t->Branch("scid", &scid);
340  t->Branch("etaIndex", &coord.first);
341  t->Branch("phiIndex", &coord.second);
342  t->Branch("slot1", &slot.first);
343  t->Branch("slot2", &slot.second);
344  for (auto &[id, val]: m_scMap) {
345  scid = id;
346  coord = val.first;
347  slot = val.second;
348  t->Fill();
349  }
350  t->Write();
351  f.Close();
352  }
353  return StatusCode::SUCCESS;
354 
355 }
356 
357 
358 StatusCode eFexTowerBuilder::execute(const EventContext& ctx) const {
359  ATH_MSG_DEBUG("Executing " << name() << "...");
360  setFilterPassed(true, ctx);
361 
362 
363  {
364  std::lock_guard lock(m_fillMapMutex);
365  if (m_scMap.empty()) CHECK( fillMap(ctx) );
366  }
367 
368  return fillTowers(ctx);
369 
370 }
371 
372 } // LVL1 Namespace
LVL1::eFexTowerBuilder::fillTowers
StatusCode fillTowers(const EventContext &ctx) const
Definition: eFexTowerBuilder.cxx:71
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
LVL1::eFexTowerBuilder::eFexTowerBuilder
eFexTowerBuilder(const std::string &name, ISvcLocator *pSvcLocator)
Definition: eFexTowerBuilder.cxx:28
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
MuonGM::round
float round(const float toRound, const unsigned int decimals)
Definition: Mdt.cxx:27
M_PI
#define M_PI
Definition: ActiveFraction.h:11
LVL1::eFexTowerBuilder::initialize
virtual StatusCode initialize()
Definition: eFexTowerBuilder.cxx:33
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
eFexTowerBuilder.h
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
LVL1::eFexTowerBuilder::m_ddmKey
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_ddmKey
Definition: eFexTowerBuilder.h:67
xAOD::EventInfo_v1::IS_SIMULATION
@ IS_SIMULATION
true: simulation, false: data
Definition: EventInfo_v1.h:151
LVL1
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition: ICMMCPHitsCnvTool.h:18
LVL1::eFexTowerBuilder::m_eiKey
SG::ReadHandleKey< xAOD::EventInfo > m_eiKey
Definition: eFexTowerBuilder.h:65
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LVL1::eFexTowerBuilder::m_scellKey
SG::ReadHandleKey< CaloCellContainer > m_scellKey
Definition: eFexTowerBuilder.h:69
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
LArG4FSStartPointFilterLegacy.execute
execute
Definition: LArG4FSStartPointFilterLegacy.py:20
xAOD::phi
setEt phi
Definition: TrigEMCluster_v1.cxx:29
skel.l2
l2
Definition: skel.GENtoEVGEN.py:410
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
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
LVL1::eFexTowerBuilder::m_applyMasking
Gaudi::Property< bool > m_applyMasking
Definition: eFexTowerBuilder.h:76
python.LArMinBiasAlgConfig.int
int
Definition: LArMinBiasAlgConfig.py:59
xAOD::TriggerTower_v2
Description of TriggerTower_v2.
Definition: TriggerTower_v2.h:49
CaloCell_SuperCell_ID.h
Helper class for offline supercell identifiers.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
hist_file_dump.f
f
Definition: hist_file_dump.py:141
eFexTowerAuxContainer.h
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector::back
const T * back() const
Access the last element in the collection as an rvalue.
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
TrigConf::name
Definition: HLTChainList.h:35
LVL1::eFexTowerBuilder::m_outKey
SG::WriteHandleKey< xAOD::eFexTowerContainer > m_outKey
Definition: eFexTowerBuilder.h:71
PathResolver.h
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:239
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
JetVoronoiDiagramHelpers::coord
double coord
Definition: JetVoronoiDiagramHelpers.h:45
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
eflowRec::phiIndex
unsigned int phiIndex(float phi, float binsize)
calculate phi index for a given phi
Definition: EtaPhiLUT.cxx:23
python.PyAthena.v
v
Definition: PyAthena.py:154
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
RunTileMonitoring.towers
towers
Definition: RunTileMonitoring.py:133
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LVL1::eFexTowerBuilder::m_ttKey
SG::ReadHandleKey< xAOD::TriggerTowerContainer > m_ttKey
Definition: eFexTowerBuilder.h:70
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
LVL1::eFexTowerBuilder::m_mappingFile
Gaudi::Property< std::string > m_mappingFile
Definition: eFexTowerBuilder.h:73
EventInfoRead.isMC
isMC
Definition: EventInfoRead.py:11
skel.l1
l1
Definition: skel.GENtoEVGEN.py:409
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAOD::EventInfo_v1::eventType
bool eventType(EventType type) const
Check for one particular bitmask value.
Identifier
Definition: IdentifierFieldParser.cxx:14