ATLAS Offline Software
eFexTowerBuilder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 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 #undef R__HAS_VDT
22 #include "ROOT/RVec.hxx"
23 
24 #include "TFile.h"
25 #include "TTree.h"
27 #include "TH2D.h"
28 #include "TROOT.h"
29 #include "TCanvas.h"
30 #include "TBox.h"
31 
32 namespace LVL1 {
33 
34 eFexTowerBuilder::eFexTowerBuilder( const std::string& name, ISvcLocator* pSvcLocator ) : AthReentrantAlgorithm( name, pSvcLocator ){
35 
36 
37 }
38 
40  ATH_MSG_INFO ("Initializing " << name() << "...");
41 
42  CHECK( m_ddmKey.initialize(true) );
43  CHECK( m_ttKey.initialize(true) );
44  CHECK( m_scellKey.initialize(true) );
45  CHECK( m_outKey.initialize(true) );
46 
47  if (auto fileName = PathResolverFindCalibFile( m_mappingFile ); !fileName.empty()) {
48  std::unique_ptr<TFile> f( TFile::Open(fileName.c_str()) );
49  if (f) {
50  TTree* t = f->Get<TTree>("mapping");
51  if(t) {
52  unsigned long long scid = 0;
53  std::pair<int,int> coord = {0,0};
54  std::pair<int,int> slot;
55  t->SetBranchAddress("scid",&scid);
56  t->SetBranchAddress("etaIndex",&coord.first);
57  t->SetBranchAddress("phiIndex",&coord.second);
58  t->SetBranchAddress("slot1",&slot.first);
59  t->SetBranchAddress("slot2",&slot.second);
60  for(Long64_t i=0;i<t->GetEntries();i++) {
61  t->GetEntry(i);
62  m_scMap[scid] = std::make_pair(coord,slot);
63  }
64  }
65  }
66  if (m_scMap.empty()) {
67  ATH_MSG_WARNING("Failed to load sc -> eFexTower map from " << fileName);
68  } else {
69  ATH_MSG_INFO("Loaded sc -> eFexTower map from " << fileName);
70  }
71  }
72 
73 
74  return StatusCode::SUCCESS;
75 }
76 
77 StatusCode eFexTowerBuilder::fillTowers(const EventContext& ctx) const {
78 
79 
82  if(!tTowers.isValid()){
83  ATH_MSG_FATAL("Could not retrieve collection " << m_ttKey.key() );
84  return StatusCode::FAILURE;
85  }
86  SG::ReadHandle<CaloCellContainer> scells(m_scellKey,ctx); // n.b. 34048 is a full complement of scells
87  if(!scells.isValid()){
88  ATH_MSG_FATAL("Could not retrieve collection " << m_scellKey.key() );
89  return StatusCode::FAILURE;
90  }
91 
92 
93 
94 
95  std::map<std::pair<int,int>,std::array<int,11>> towers;
96 
97  for (auto digi: *scells) {
98  const auto itr = m_scMap.find(digi->ID().get_compact());
99  if (itr == m_scMap.end()) { continue; } // not in map so not mapping to a tower
100  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
101  // note: a val of -99999 is what is produced if efex was sent an invalid code of 1022
102  bool isMasked = m_applyMasking ? ((digi)->provenance()&0x80) : false;
103  //bool isInvalid = m_applyMasking ? ((digi)->provenance()&0x40) : false;
104  // Removing invalid check until can verify expected behaviour with LATOME experts
105  // if(isInvalid && val!=-99999) {
106  // ATH_MSG_ERROR("Unexpected energy value " << val <<" for invalid channel");
107  // }
108 
109  auto& tower = towers[itr->second.first];
110  if (itr->second.second.second<11) {
111  // doing an energy split between slots ... don't include a masked channel (or invalid channel)
112  if (!isMasked && val!=-99999) {
113  // if the other contribution was masked or invalid, revert to 0 before adding this contribution
114  if (tower.at(itr->second.second.first)==std::numeric_limits<int>::max() || tower.at(itr->second.second.first)==-99999) {
115  tower.at(itr->second.second.first)=0;
116  }
117  tower.at(itr->second.second.first) += val >> 1;
118  tower.at(itr->second.second.second) += (val - (val >> 1)); // HW seems fixed now!
119  }
120  // hw is incorrectly ignoring masking on the second part
121  // so always add the 2nd bit
122  //tower.at(itr->second.second.second) += (val - (val >> 1)); // Removed b.c. of fix above - leaving this comment here until resolved!
123  } else {
124  auto& v = tower.at(itr->second.second.first);
125  if (isMasked) {
126  // dont mark it masked if it already has a contribution
127  if(v==0) v = std::numeric_limits<int>::max();
128  } else {
129  v += val;
130  }
131  }
132 
133  }
134 
135  // add tile energies from TriggerTowers
136  static const auto etaIndex = [](float eta) { return int( eta*10 ) + ((eta<0) ? -1 : 1); };
137  static const auto phiIndex = [](float phi) { return int( phi*32./M_PI ) + (phi<0 ? -1 : 1); };
138  for(const auto& tTower : *tTowers) {
139  if (std::abs(tTower->eta()) > 1.5) continue;
140  if (tTower->sampling() != 1) continue;
141  double phi = tTower->phi(); if(phi > M_PI) phi -= 2.*M_PI;
142  towers[std::pair(etaIndex(tTower->eta()),phiIndex(phi))][10] = tTower->cpET();
143  }
144 
145  if(msgLvl(MSG::DEBUG)) {
146  std::scoped_lock lock(m_debugMutex);
147  // dump towers to histograms
148  // current count units are latome counts = 12.5MeV per count
149 
150  TFile *debugFile = dynamic_cast<TFile *>(gROOT->GetListOfFiles()->FindObject("debug_eFexTowerBuilder.root"));
151  if (!debugFile) debugFile = TFile::Open("debug_eFexTowerBuilder.root", "RECREATE");
152  if (debugFile->GetListOfKeys()->GetEntries() < 20) {
153  TDirectory *dir = gDirectory;
154  debugFile->cd();
155  TH2D ps("ps", "ps [MeV];#eta;#phi", 50, -2.5, 2.5, 64, -M_PI, M_PI);
156  TH2D l1("l1", "l1 [MeV];#eta;#phi", 200, -2.5, 2.5, 64, -M_PI, M_PI);
157  TH2D l2("l2", "l2 [MeV];#eta;#phi", 200, -2.5, 2.5, 64, -M_PI, M_PI);
158  TH2D l3("l3", "l3 [MeV];#eta;#phi", 50, -2.5, 2.5, 64, -M_PI, M_PI);
159  TH2D had("had", "had [MeV];#eta;#phi", 50, -2.5, 2.5, 64, -M_PI, M_PI);
160  for (auto &[coord, counts]: towers) {
161  if (counts.empty()) continue;
162  double tEta = ((coord.first < 0 ? 0.5 : -0.5) + coord.first - 0.5) * 0.1; // left edge
163  double tPhi = ((coord.second < 0 ? 0.5 : -0.5) + coord.second) * M_PI / 32; // centre
164  if (counts.at(0) != std::numeric_limits<int>::max()) ps.Fill(tEta + 0.05, tPhi, counts.at(0) * 12.5);
165  for (int i = 0; i < 4; i++)
166  if (counts.at(i + 1) != std::numeric_limits<int>::max())
167  l1.Fill(tEta + 0.025 * i + 0.0125, tPhi, counts.at(i + 1) * 12.5);
168  for (int i = 0; i < 4; i++)
169  if (counts.at(i + 5) != std::numeric_limits<int>::max())
170  l2.Fill(tEta + 0.025 * i + 0.0125, tPhi, counts.at(i + 5) * 12.5);
171  if (counts.at(9) != std::numeric_limits<int>::max()) l3.Fill(tEta + 0.05, tPhi, counts.at(9) * 12.5);
172  if (counts.at(10) != std::numeric_limits<int>::max())
173  had.Fill(tEta + 0.05, tPhi, counts.at(10) * (std::abs(coord.first) <= 15 ? 500. : 12.5));
174  }
175  std::vector < TH1 * > hists{&ps, &l1, &l2, &l3, &had};
176  TCanvas c;
177  c.SetName(TString::Format("evt%lu", ctx.eventID().event_number()));
178  c.SetTitle(TString::Format("Run %u LB %u Event %lu", ctx.eventID().run_number(), ctx.eventID().lumi_block(),
179  ctx.eventID().event_number()));
180  c.Divide(2, 3);
181  TH2D tobs("tobs", "Sum [MeV];#eta;#phi", 50, -2.5, 2.5, 64, -M_PI, M_PI);
182  for (size_t i = 0; i < hists.size(); i++) {
183  c.GetPad(i + 1)->cd();
184  hists[i]->SetStats(false);
185  hists[i]->SetMarkerSize(2); // controls text size
186  hists[i]->GetXaxis()->SetRangeUser(-0.3, 0.3);
187  hists[i]->GetYaxis()->SetRangeUser(-0.3, 0.3);
188  hists[i]->Draw((hists[i]->GetNbinsX() > 50) ? "coltext89" : "coltext");
189  for (int ii = 1; ii <= hists[i]->GetNbinsX(); ii++) {
190  for (int jj = 1; jj <= hists[i]->GetNbinsY(); jj++)
191  tobs.Fill(hists[i]->GetXaxis()->GetBinCenter(ii), hists[i]->GetYaxis()->GetBinCenter(jj),
192  hists[i]->GetBinContent(ii, jj));
193  }
194  }
195  c.GetPad(hists.size() + 1)->cd();
196  tobs.SetStats(false);
197  tobs.Draw("col");
198  TBox b(-0.3, -0.3, 0.3, 0.3);
199  b.SetLineColor(kRed);
200  b.SetFillStyle(0);
201  b.SetLineWidth(1);
202  b.SetBit(TBox::kCannotMove);
203  tobs.GetListOfFunctions()->Add(b.Clone());
204  gPad->AddExec("onClick", TString::Format(
205  "{ auto pad = gPad->GetCanvas()->GetPad(%lu); if( pad->GetEvent()==kButton1Down ) { double x = pad->PadtoX(pad->AbsPixeltoX(pad->GetEventX())); double y = pad->PadtoY(pad->AbsPixeltoY(pad->GetEventY())); for(int i=1;i<%lu;i++) {auto h = dynamic_cast<TH1*>(gPad->GetCanvas()->GetPad(i)->GetListOfPrimitives()->At(1)); if(h) {h->GetXaxis()->SetRangeUser(x-0.3,x+0.3);h->GetYaxis()->SetRangeUser(y-0.3,y+0.3); } } if(auto b = dynamic_cast<TBox*>(pad->FindObject(\"tobs\")->FindObject(\"TBox\"))) {b->SetX1(x-0.3);b->SetX2(x+0.3);b->SetY1(y-0.3);b->SetY2(y+0.3);} gPad->GetCanvas()->Paint(); gPad->GetCanvas()->Update(); } }",
206  hists.size() + 1, hists.size() + 1));
207  c.Write();
208  gDirectory = dir;
209  }
210  }
211 
212 
213 
215  ATH_CHECK( eTowers.record(std::make_unique<xAOD::eFexTowerContainer>(),std::make_unique<xAOD::eFexTowerAuxContainer>()) );
216 
217  static const auto calToFex = [](int calEt) {
218  if(calEt == std::numeric_limits<int>::max()) return 0; // indicates masked channel
219  if( calEt == -99999 ) return 1022; // invalid channel value
220  if(calEt<448) return std::max((calEt&~1)/2+32,1); // 25 MeV per eFexTower count
221  if(calEt<1472) return (calEt-448)/4+256; // 50 MeV per eFexTower count
222  if(calEt<3520) return (calEt-1472)/8+512; // 100 MeV ...
223  if(calEt<11584) return (calEt-3520)/32+768; // 400 MeV ...
224  return 1020;
225  };
226 
227  // now create the towers
228  for(auto& [coord,counts] : towers) {
229  size_t ni = (std::abs(coord.first)<=15) ? 10 : 11; // ensures we skip the tile towers for next line
230  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
231  eTowers->push_back( std::make_unique<xAOD::eFexTower>() );
232  eTowers->back()->initialize( ( (coord.first<0 ? 0.5:-0.5) + coord.first)*0.1 ,
233  ( (coord.second<0 ? 0.5:-0.5) + coord.second)*M_PI/32,
234  std::vector<uint16_t>(counts.begin(), counts.end()),
235  -1, /* module number */
236  -1, /* fpga number */
237  0,0 /* status flags ... could use to indicate which cells were actually present?? */);
238  }
239 
240  return StatusCode::SUCCESS;
241 
242 }
243 
244 StatusCode eFexTowerBuilder::fillMap(const EventContext& ctx) const {
245 
246  ATH_MSG_INFO("Filling sc -> eFexTower map");
247 
249  SG::ReadHandle<CaloCellContainer> scells(m_scellKey,ctx); // 34048 is a full complement of scells
250  if(!scells.isValid()){
251  ATH_MSG_FATAL("Could not retrieve collection " << m_scellKey.key() );
252  return StatusCode::FAILURE;
253  }
254  if (scells->size() != 34048) {
255  ATH_MSG_FATAL("Cannot fill sc -> eFexTower mapping with an incomplete sc collection");
256  return StatusCode::FAILURE;
257  }
258  struct TowerSCells {
259  std::vector<unsigned long long> ps;
260  std::vector<std::pair<float,unsigned long long>> l1;
261  std::vector<std::pair<float,unsigned long long>> l2;
262  std::vector<unsigned long long> l3;
263  std::vector<unsigned long long> had;
264  std::vector<unsigned long long> other;
265  };
266  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)
267  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)
268  std::map<std::pair<int,int>,TowerSCells> towers;
269  std::map<unsigned long long,int> eTowerSlots; // not used by this alg, but we produce the map for benefit of eFexTower->eTower alg
270 
271  for (auto digi: *scells) {
272  Identifier id = digi->ID(); // this is if using supercells
273 
274  if (auto elem = ddm->get_element(id); elem && std::abs(elem->eta_raw())<2.5) {
275  float eta = elem->eta_raw(); // this seems more symmetric
276  int sampling = elem->getSampling();
277  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)
278 
279  unsigned long long val = id.get_compact();
280 
281  int towerid = -1;int slot = -1;bool issplit = false;
282  CHECK(m_eFEXSuperCellTowerIdProviderTool->geteTowerIDandslot(id.get_compact(), towerid, slot, issplit));
283  eTowerSlots[id.get_compact()] = slot;
284 
285  auto& sc = towers[std::pair(etaIndex(eta),phiIndex(elem->phi_raw()))];
286  switch(sampling) {
287  case 0: case 4: //lar barrel/endcap presampler
288  sc.ps.push_back(val);
289  break;
290  case 1: case 5: //lar barrel/endcap l1
291  sc.l1.push_back({elem->eta(),val}); break;
292  case 2: case 6: //lar barrel/endcap l2
293  sc.l2.push_back({elem->eta(),val}); break;
294  case 3: case 7: //lar barrel/endcap l3
295  sc.l3.push_back(val); break;
296  case 8: case 9: case 10: case 11: //lar hec
297  sc.had.push_back(val); break;
298  default:
299  sc.other.push_back(val); break;
300  }
301  }
302  }
303 
304 
305  // sort (by increasing eta) l1/l2 sc and handle special cases
306  // finally also output the eTower slot vector
307  std::vector<size_t> slotVector(11);
308  for(auto& [coord,sc] : towers) {
309  std::sort(sc.l1.begin(),sc.l1.end());
310  std::sort(sc.l2.begin(),sc.l2.end());
311  // we have 5 l2 cells @ |eta|=1.45 ... put lowest |eta| one in l3 slot
312  if (sc.l2.size()==5) {
313  if (coord.first >= 0) {
314  sc.l3.push_back(sc.l2.front().second);
315  sc.l2.erase(sc.l2.begin()); // remove first
316  } else {
317  sc.l3.push_back(sc.l2.back().second);
318  sc.l2.resize(sc.l2.size()-1); // remove last
319  }
320  }
321  if (std::abs(coord.first)==15) { //|eta| = 1.45
322  // in the overlap region it seems like the latome id with highest |eta| is swapped with next highest
323  // so to compare we swap the first and second (3rd and 4th are fine) if eta < 0, or 3rd and 4th if eta > 0
324  if (coord.first<0) {std::swap(sc.l1.at(0),sc.l1.at(1)); }
325  else {std::swap(sc.l1.at(2),sc.l1.at(3));}
326  }
327  // handle case @ |eta|~1.8-2 with 6 L1 cells
328  if (sc.l1.size()==6) {
329  m_scMap[sc.l1.at(0).second] = std::pair(coord,std::pair(1,11));
330  m_scMap[sc.l1.at(1).second] = std::pair(coord,std::pair(1,2));
331  m_scMap[sc.l1.at(2).second] = std::pair(coord,std::pair(2,11));
332  m_scMap[sc.l1.at(3).second] = std::pair(coord,std::pair(3,11));
333  m_scMap[sc.l1.at(4).second] = std::pair(coord,std::pair(3,4));
334  m_scMap[sc.l1.at(5).second] = std::pair(coord,std::pair(4,11));
335  slotVector[1] = eTowerSlots[sc.l1.at(0).second];
336  slotVector[2] = eTowerSlots[sc.l1.at(2).second];
337  slotVector[3] = eTowerSlots[sc.l1.at(3).second];
338  slotVector[4] = eTowerSlots[sc.l1.at(5).second];
339  }
340 
341  // for |eta|>2.4 there's only 1 l1 sc, to match hardware this should be compared placed in the 'last' l1 input
342  if (sc.l1.size()==1) {
343  m_scMap[sc.l1.at(0).second] = std::pair(coord,std::pair(4,11));
344  slotVector[1] = 1; slotVector[2] = 2; slotVector[3] = 3; slotVector[4] = eTowerSlots[sc.l1.at(0).second];
345  }
346 
347  // fill the map with sc ids -> tower coord + slot
348  if (!sc.ps.empty()) {m_scMap[sc.ps.at(0)] = std::pair(coord,std::pair(0,11)); slotVector[0] = eTowerSlots[sc.ps.at(0)]; }
349  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]; }
350  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]; }
351  if (!sc.l3.empty()) {m_scMap[sc.l3.at(0)] = std::pair(coord,std::pair(9,11)); slotVector[9] = eTowerSlots[sc.l3.at(0)]; }
352  if (!sc.had.empty()) {m_scMap[sc.had.at(0)] = std::pair(coord,std::pair(10,11));slotVector[10] = eTowerSlots[sc.had.at(0)]; }
353 
354  // finally output the slotVector for this tower
355  // do only for the slots that don't match
356  // note to self: seems like everything is fine apart from the l1->ps remap for |eta|>2.4
357  // so leaving this bit commented out for now ... useful to leave it here in case need to recheck in future
358 // for(size_t i=0;i<slotVector.size();i++) {
359 // if(slotVector[i] != i) {
360 // std::cout << coord.first << "," << coord.second << "," << i << "," << slotVector[i] << std::endl;
361 // }
362 // }
363  }
364 
365  // save the map to disk
366  TFile f("scToEfexTowers.root","RECREATE");
367  TTree* t = new TTree("mapping","mapping");
368  unsigned long long scid = 0;
369  std::pair<int,int> coord = {0,0};
370  std::pair<int,int> slot = {-1,-1};
371  t->Branch("scid",&scid);
372  t->Branch("etaIndex",&coord.first);
373  t->Branch("phiIndex",&coord.second);
374  t->Branch("slot1",&slot.first);
375  t->Branch("slot2",&slot.second);
376  for(auto& [id,val] : m_scMap) {
377  scid = id; coord = val.first; slot = val.second;
378  t->Fill();
379  }
380  t->Write();
381  f.Close();
382 
383  return StatusCode::SUCCESS;
384 
385 }
386 
387 
388 StatusCode eFexTowerBuilder::execute(const EventContext& ctx) const {
389  ATH_MSG_DEBUG("Executing " << name() << "...");
390  setFilterPassed(true, ctx);
391 
392 
393  {
394  std::lock_guard lock(m_fillMapMutex);
395  if (m_scMap.empty()) CHECK( fillMap(ctx) );
396  }
397 
398  return fillTowers(ctx);
399 
400 }
401 
402 } // LVL1 Namespace
LVL1::eFexTowerBuilder::fillTowers
StatusCode fillTowers(const EventContext &ctx) const
Definition: eFexTowerBuilder.cxx:77
LVL1::eFexTowerBuilder::execute
virtual StatusCode execute(const EventContext &ctx) const
Definition: eFexTowerBuilder.cxx:388
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
max
#define max(a, b)
Definition: cfImp.cxx:41
LVL1::eFexTowerBuilder::eFexTowerBuilder
eFexTowerBuilder(const std::string &name, ISvcLocator *pSvcLocator)
Definition: eFexTowerBuilder.cxx:34
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
StateLessPT_NewConfig.Format
Format
Definition: StateLessPT_NewConfig.py:146
MuonGM::round
float round(const float toRound, const unsigned int decimals)
Definition: Mdt.cxx:27
M_PI
#define M_PI
Definition: ActiveFraction.h:11
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
LVL1::eFexTowerBuilder::initialize
virtual StatusCode initialize()
Definition: eFexTowerBuilder.cxx:39
LVL1::eFexTowerBuilder::m_eFEXSuperCellTowerIdProviderTool
ToolHandle< IeFEXSuperCellTowerIdProvider > m_eFEXSuperCellTowerIdProviderTool
Definition: eFexTowerBuilder.h:70
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:63
LVL1
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition: ICMMCPHitsCnvTool.h:18
LVL1::eFexTowerBuilder::fillMap
StatusCode fillMap(const EventContext &ctx) const
Definition: eFexTowerBuilder.cxx:244
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LVL1::eFexTowerBuilder::m_scellKey
SG::ReadHandleKey< CaloCellContainer > m_scellKey
Definition: eFexTowerBuilder.h:65
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
LVL1::eFexTowerBuilder::m_debugMutex
std::mutex m_debugMutex
Definition: eFexTowerBuilder.h:74
skel.l2
l2
Definition: skel.GENtoEVGEN.py:426
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
ParseInputs.gDirectory
gDirectory
Definition: Final2012/ParseInputs.py:133
lumiFormat.i
int i
Definition: lumiFormat.py:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
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:72
CaloCell_SuperCell_ID.h
Helper class for offline supercell identifiers.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MakeTH3DFromTH2Ds.hists
hists
Definition: MakeTH3DFromTH2Ds.py:72
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
eFexTowerAuxContainer.h
TH2D
Definition: rootspy.cxx:430
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
beamspotman.dir
string dir
Definition: beamspotman.py:623
LVL1::eFexTowerBuilder::m_outKey
SG::WriteHandleKey< xAOD::eFexTowerContainer > m_outKey
Definition: eFexTowerBuilder.h:67
PathResolver.h
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:191
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
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:157
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
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:66
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
LVL1::eFexTowerBuilder::m_mappingFile
Gaudi::Property< std::string > m_mappingFile
Definition: eFexTowerBuilder.h:69
DEBUG
#define DEBUG
Definition: page_access.h:11
skel.l1
l1
Definition: skel.GENtoEVGEN.py:425
python.compressB64.c
def c
Definition: compressB64.py:93
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
AthReentrantAlgorithm::setFilterPassed
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Definition: AthReentrantAlgorithm.h:139