ATLAS Offline Software
Loading...
Searching...
No Matches
eFexByteStreamTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5//***************************************************************************
6// eFexByteStreamTool - description
7// -------------------
8// begin : 11 05 2022
9// email : will@cern.ch
10// ***************************************************************************/
11
12#include "eFexByteStreamTool.h"
13#include "CxxUtils/span.h"
14#include "eformat/SourceIdentifier.h"
15#include "eformat/Status.h"
16
21
27
30
31namespace {
32 // Helper method for creating the containers
33 template<typename T, typename W>
35 std::map <std::pair<L1CaloRdoFexTob::TobSource, bool>, SG::WriteHandle<T>> &map,
36 L1CaloRdoFexTob::TobSource source, bool inTime, const SG::WriteHandleKey <T> &handle,
37 const EventContext &ctx) {
38 if (!handle.empty()) {
39 return map.emplace(std::make_pair(source, inTime),
40 SG::WriteHandle<T>(handle, ctx)).first->second.record(
41 std::make_unique<T>(), std::make_unique<W>());
42 }
43 return StatusCode::SUCCESS;
44 }
45}
46
48 const std::string& name,
49 const IInterface* parent)
50 : base_class(type, name, parent) {}
51
53
54 // Initialise eEM data handle keys
55 ATH_CHECK(m_eEMWriteKey.initialize(!m_eEMWriteKey.empty()));
56
57 // Initialise eTAU data handle keys
58 ATH_CHECK(m_eTAUWriteKey.initialize(!m_eTAUWriteKey.empty()));
59
60 // write keys for xTOBs
61 ATH_CHECK(m_eEMxWriteKey.initialize(!m_eEMxWriteKey.empty()));
62 ATH_CHECK(m_eTAUxWriteKey.initialize(!m_eTAUxWriteKey.empty()));
63
64 // multislice TOBs
67
68 // Initialize eTower handle key
69 ATH_CHECK(m_eTowerWriteKey.initialize(!m_eTowerWriteKey.empty()));
70
71 m_decoder = std::make_unique<L1CaloBsDecoderRun3>();
72
73 // Initialize monitoring tool if not empty
74 if (!m_monTool.empty()) {
75 ATH_CHECK(m_monTool.retrieve());
76 m_decoder->setLogger( std::make_unique<MonitoredLogging>(m_monTool) );
77 ATH_MSG_INFO("Logging errors to " << m_monTool.name() << " monitoring tool");
78 }
79
80
81 return StatusCode::SUCCESS;
82}
83
84void eFexByteStreamTool::MonitoredLogging::err(const std::string& location, const std::string& title, const std::string&) const {
85
87 Monitored::Scalar("efexDecoderErrorLocation",std::string("lb=") + std::to_string(Gaudi::Hive::currentContext().eventID().lumi_block()) + "," + (location.empty() ? std::string("UNKNOWN") : location)),
88 Monitored::Scalar("efexDecoderErrorTitle",title.empty() ? std::string("UNKNOWN") : title)
89 );
90
91 Monitored::Group(m_monTool, Monitored::Scalar("lbn",Gaudi::Hive::currentContext().eventID().lumi_block()),
92 Monitored::Scalar("decoderError",(title.empty() ? std::string("UNKNOWN") : title) + ":" + (location.empty() ? std::string("UNKNOWN") : location))
93 );
94}
95
96// BS->xAOD conversion
97StatusCode eFexByteStreamTool::convertFromBS(const std::vector<const ROBF*>& vrobf, const EventContext& ctx) const {
98
99 // indices are source (tob or xtob) and bool for in/out of time
100 std::map<std::pair<L1CaloRdoFexTob::TobSource,bool>,SG::WriteHandle<xAOD::eFexEMRoIContainer>> eContainers;
101 std::map<std::pair<L1CaloRdoFexTob::TobSource,bool>,SG::WriteHandle<xAOD::eFexTauRoIContainer>> tContainers;
102
103 bool multislice=false;
104
105 if (!m_eEMWriteKey.empty()) {
106 ATH_CHECK(StatusCode(addContainer<xAOD::eFexEMRoIContainer, xAOD::eFexEMRoIAuxContainer>(
107 eContainers, L1CaloRdoFexTob::TobSource::EfexTob, false, m_eEMWriteKey, ctx)));
108 }
109 if (!m_eTAUWriteKey.empty()) {
110 ATH_CHECK(StatusCode(addContainer<xAOD::eFexTauRoIContainer, xAOD::eFexTauRoIAuxContainer>(
111 tContainers, L1CaloRdoFexTob::TobSource::EfexTob, false, m_eTAUWriteKey, ctx)));
112 }
113 if (!m_eEMxWriteKey.empty()) {
114 ATH_CHECK( StatusCode(addContainer<xAOD::eFexEMRoIContainer,xAOD::eFexEMRoIAuxContainer>(
116 }
117 if (!m_eTAUxWriteKey.empty()) {
118 ATH_CHECK( StatusCode(addContainer<xAOD::eFexTauRoIContainer,xAOD::eFexTauRoIAuxContainer>(
120 }
121 if (!m_eEMSliceWriteKey.empty()) {
122 ATH_CHECK( StatusCode(addContainer<xAOD::eFexEMRoIContainer,xAOD::eFexEMRoIAuxContainer>(
124 multislice=true;
125 }
126 if (!m_eTAUSliceWriteKey.empty()) {
127 ATH_CHECK( StatusCode(addContainer<xAOD::eFexTauRoIContainer,xAOD::eFexTauRoIAuxContainer>(
129 multislice=true;
130 }
131
132
134 if(!m_eTowerWriteKey.empty()) {
136 ATH_CHECK( eTowers.record(std::make_unique<xAOD::eFexTowerContainer>(),std::make_unique<xAOD::eFexTowerAuxContainer>()) );
137 }
138
139 std::list<L1CaloRdoRodInfo> rodInfos;
140 std::list<L1CaloRdoEfexTob> efexTobs;
141 std::list<L1CaloRdoEfexTower> efexTowers;
142 L1CaloBsDecoderRun3& decoder = *m_decoder;
143 std::map<std::tuple<int,int,int,int,int>,size_t> towerMap; // maps {crate,module,fpga,eta,phi} onto index in vector
144 for (const ROBF* rob : vrobf) {
145 // Iterate over ROD words and decode
146 ATH_MSG_DEBUG("Decoding " << rob->rod_ndata() << " ROD words from ROB 0x" << std::hex << rob->rob_source_id() << std::dec);
147 L1CaloBsDecoderUtil::decodeRodInfo( rob, rodInfos );
148
149 if(rob->rod_ndata()==0) continue;
150
151 CxxUtils::span data{rob->rod_data(), rob->rod_ndata()};
152 auto lastRod = rodInfos.end(); lastRod--;
153
154 if ( (rob->rob_source_id() >> 16) == eformat::TDAQ_CALO_FEAT_EXTRACT_DAQ && !m_eTowerWriteKey.empty() ) {
155 // decoding raw input data
156 // tower et counts should be in order: PS, L1, L2, L3, Had
157 // towers with all et counts 0 will still be zero-suppressed
158 efexTowers.clear();
159 decoder.decodeEfexData(data.begin(), data.end(), efexTowers, lastRod );
160 for(auto& t : efexTowers) {
161 if (t.getLayer() != 0) continue; // do hadronic in next loop
162 towerMap[std::make_tuple(t.getCrate(),t.getModule(),t.getFpgaNumber(),t.getRegion().getEtaIndex(),t.getRegion().getPhiIndex())] = eTowers->size();
163 eTowers->push_back( std::make_unique<xAOD::eFexTower>() );
164 // in bytestream cell orders are L2,PS,L1,L3 so reorder to usual PS,L1,L2,L3 order
165 std::vector<uint16_t> counts(11,xAOD::eFexTower::c_missingCountCode);
166 counts[0] = t.getSupercells().at(4);
167 for(size_t idx = 0;idx<4;idx++) {
168 counts[idx+1] = t.getSupercells().at(idx+5); // L1
169 counts[idx+5] = t.getSupercells().at(idx); // L2
170 }
171 counts[9] = t.getSupercells().at(9);
172
173 eTowers->back()->initialize(t.getRegion().getEtaIndex()*0.1 + 0.05,2.*ROOT::Math::Pi()*(0.5 + t.getRegion().getPhiIndex() - 64*(t.getRegion().getPhiIndex()>=32))/64,
174 counts,
175 t.getModule() + t.getCrate()*12,
176 t.getFpgaNumber(),
177 t.getFlag(),0 /* hadronic status flag */);
178 }
179
180 for(auto& t : efexTowers) {
181 if (t.getLayer() == 0) continue; // do hadronic towers now ... add to existing towers
182 size_t idx = eTowers->size();
183 if(auto itr = towerMap.find({t.getCrate(), t.getModule(), t.getFpgaNumber(),t.getRegion().getEtaIndex(),t.getRegion().getPhiIndex()}); itr != towerMap.end()) {
184 idx = itr->second;
185 } else {
186 // possible that ecal tower was zero-suppressed but hcal has energy, so create such a tower
187 towerMap[std::make_tuple(t.getCrate(),t.getModule(),t.getFpgaNumber(),t.getRegion().getEtaIndex(),t.getRegion().getPhiIndex())] = eTowers->size();
188 eTowers->push_back( std::make_unique<xAOD::eFexTower>() );
189 eTowers->back()->initialize(t.getRegion().getEtaIndex()*0.1 + 0.05,2.*ROOT::Math::Pi()*(0.5 + t.getRegion().getPhiIndex() - 64*(t.getRegion().getPhiIndex()>=32))/64,
190 std::vector<uint16_t>(11,xAOD::eFexTower::c_missingCountCode),
191 t.getModule() + t.getCrate()*12,t.getFpgaNumber(),0,t.getFlag());
192 }
193 auto tower = eTowers->at(idx);
194 tower->setHad_status(t.getFlag());
195 auto et_count = tower->et_count();
196 et_count.at(10) = t.getValue();
197 tower->setEt_count(et_count);
198 }
199
200
201
202 } else if ( (rob->rob_source_id() >> 16) == eformat::TDAQ_CALO_FEAT_EXTRACT_ROI ) {
203 // decoding tobs
204 efexTobs.clear();
205 decoder.decodeEfexTobs(data.begin(), data.end(), efexTobs, lastRod);
206
207 for (const L1CaloRdoEfexTob &tob: efexTobs) {
208 // loop over slices ... create separate tobs for each, where there's a word defined
209 for (size_t slice = 0; slice < tob.numSlices(); slice++) {
210 if (!multislice && int(slice) != tob.getL1aPos())
211 continue; // ignore out-of-time slices if multiSlice option = false
212 if (tob.getWord0(slice) == 0) continue; // this tob isn't in this slice
213 if (tob.getTobType() == L1CaloRdoFexTob::TobType::EM) {
214 auto cont = eContainers.find({tob.getTobSource(), int(slice) != tob.getL1aPos()});
215 if (cont == eContainers.end()) continue; // not writing this tob collection
216 cont->second->push_back(std::make_unique<xAOD::eFexEMRoI>());
217 if (tob.getTobSource() == L1CaloRdoFexTob::TobSource::EfexTob) {
218 cont->second->back()->initialize(tob.getModule(), tob.getCrate(), tob.getWord0(slice));
219 } else {
220 cont->second->back()->initialize(tob.getWord0(slice), tob.getWord1(slice));
221 }
222 } else if (tob.getTobType() == L1CaloRdoFexTob::TobType::Tau) {
223 auto cont = tContainers.find({tob.getTobSource(), int(slice) != tob.getL1aPos()});
224 if (cont == tContainers.end()) continue; // not writing this tob collection
225 cont->second->push_back(std::make_unique<xAOD::eFexTauRoI>());
226 if (tob.getTobSource() == L1CaloRdoFexTob::TobSource::EfexTob) {
227 cont->second->back()->initialize(tob.getModule(), tob.getCrate(), tob.getWord0(slice));
228 } else {
229 cont->second->back()->initialize(tob.getWord0(slice), tob.getWord1(slice));
230 }
231 }
232 } // timeslice loop
233 } // tob loop
234 } // tob data if block
235 } // fragment loop
236
237 if(msgLevel(MSG::DEBUG)) {
238 std::stringstream msg;
239 for (auto&[k, v]: eContainers) {
240 msg << v->size() << " " << (k.second ? "out-of-time " : "in-time ") << "eg" <<
241 (k.first == L1CaloRdoFexTob::TobSource::EfexTob ? "" : "x") << "TOB, ";
242 }
243 for (auto&[k, v]: tContainers) {
244 msg << v->size() << " " << (k.second ? "out-of-time " : "in-time ") << "tau" <<
245 (k.first == L1CaloRdoFexTob::TobSource::EfexTob ? "" : "x") << "TOB, ";
246 }
247 ATH_MSG_DEBUG("Decoded: " << msg.str());
248 if (!m_eTowerWriteKey.empty()) {
249 ATH_MSG_DEBUG("Decoded: " << eTowers->size() << " eTowers");
250 }
251 }
252 // this is how to print the in-time em xTOBs:
253// for(const auto& tob : *(eContainers[{L1CaloRdoFexTob::TobSource::EfexXtob,false}])) {
254// std::cout << tob->eFexNumber() << "." << tob->fpga() << ": " << tob->fpgaEta() << " " << tob->fpgaPhi() << " " << tob->et() << " " << tob->etXTOB() << " " << tob->etTOB() << " " << std::endl;
255// }
256
257 return StatusCode::SUCCESS;
258}
259
260namespace Decoder {
261 struct Tob {
262 uint32_t word0;
263 };
264 struct xTob {
265 uint32_t word0;
266 uint32_t word1;
267 };
268 struct Slice {
269 struct Id {
270 uint32_t sliceNumber = 0;
271 uint32_t fpgaNumber = 0;
272 bool operator<(const Id& r) const {
273 return (fpgaNumber<r.fpgaNumber || (fpgaNumber==r.fpgaNumber && sliceNumber<r.sliceNumber));
274 }
275 };
276 void addTob(const xAOD::eFexEMRoI& tob) {
277 if(tob.isTOB()) {
278 tobs.push_back({.word0=tob.word0()});
279 } else {
280 em_xtobs.push_back({.word0=tob.word0(),.word1=tob.word1()});
281 }
282 }
283 void addTob(const xAOD::eFexTauRoI& tob) {
284 if(tob.isTOB()) {
285 tobs.push_back({.word0=tob.word0()});
286 } else {
287 tau_xtobs.push_back({.word0=tob.word0(),.word1=tob.word1()});
288 }
289 }
290 std::vector<uint32_t> getWords(const Id& id) {
291
292 const uint32_t tobType = (id.fpgaNumber==1) ? 1 : 0; // only fpga1 produce tau tobs
293 const uint32_t numTobs = tobs.size();
294 const uint32_t numEmXtobs = em_xtobs.size();
295 const uint32_t numTauXtobs = tau_xtobs.size();
296 const uint32_t safeMode=0; // tob/xtob data not suppressed
297
298 std::vector<uint32_t> out;
299 out.reserve(numTobs + numEmXtobs*2+numTauXtobs*2 + 1 + (numTobs%2 ? 0 : 1)); // last part to ensure multiple of 64bit
300 for(auto& tob : tobs) out.push_back(tob.word0);
301 for(auto& xtob : em_xtobs) {out.push_back(xtob.word0);out.push_back(xtob.word1);}
302 for(auto& xtob : tau_xtobs) {out.push_back(xtob.word0);out.push_back(xtob.word1);}
303 if(numTobs%2==0) out.push_back(0); // padding word
304
305 uint32_t sliceTrailer = 0;
306 sliceTrailer += (tobType&0x1)<<8;
307 sliceTrailer += (numTobs&0x7)<<9;
308 sliceTrailer += (numEmXtobs&0x3f)<<12;
309 sliceTrailer += (numTauXtobs&0x3f)<<18;
310 sliceTrailer += (id.sliceNumber&0x7)<<24;
311 sliceTrailer += (safeMode&0x1)<<27;
312 sliceTrailer += (id.fpgaNumber&0x3)<<28;
313
314 out.push_back(sliceTrailer);
315 return out;
316
317 }
318 std::vector<xTob> em_xtobs;
319 std::vector<xTob> tau_xtobs;
320 std::vector<Tob> tobs;
321 };
322 struct Module {
323 struct Id {
324 uint32_t shelfNumber = 0;
325 uint32_t efexNumber = 0;
326 bool operator<(const Id& r) const {
327 return (shelfNumber<r.shelfNumber || (shelfNumber==r.shelfNumber && efexNumber<r.efexNumber));
328 }
329 };
330 void addTob(const xAOD::eFexTauRoI& tob, uint32_t sliceNumber) {
331 const uint32_t fpgaNumber = (tob.isTOB()) ? 1 : tob.fpga(); // must put emTobs in fpga0, tauTobs in fpga1
332 slices[{.sliceNumber=sliceNumber,.fpgaNumber=fpgaNumber}].addTob(tob);
333 }
334 void addTob(const xAOD::eFexEMRoI& tob, uint32_t sliceNumber) {
335 const uint32_t fpgaNumber = (tob.isTOB()) ? 0 : tob.fpga(); // must put emTobs in fpga0, tauTobs in fpga1
336 slices[{.sliceNumber=sliceNumber,.fpgaNumber=fpgaNumber}].addTob(tob);
337 }
338 std::vector<uint32_t> getWords(const Id& id, int numSlices) {
339 std::vector<uint32_t> out;
340
341 for(auto& [thisId,slice] : slices) {
342 auto sliceWords = slice.getWords(thisId);
343 out.insert(out.end(), sliceWords.begin(), sliceWords.end());
344 }
345
346 const size_t efexBlockSize = out.size(); // total size
347
348 uint32_t efexTrailer1 = 0;
349 efexTrailer1 += (efexBlockSize&0xfff);
350 efexTrailer1 += (id.efexNumber&0xf)<<12;
351 efexTrailer1 += (id.shelfNumber&0x1)<<16;
352 efexTrailer1 += (numSlices&0xf)<<24;
353
354 uint32_t efexTrailer2 = 0; // should really compute CRC and put in 20 MSBs
355
356 out.push_back(efexTrailer1);
357 out.push_back(efexTrailer2);
358 return out;
359 }
360 std::map<Slice::Id,Slice> slices;
361 };
362 struct Fragment {
363 int numSlices = 1;
364 template<typename T> void addTob(const T& tob, int sliceNumber) {
365 const uint32_t shelfNumber = tob.shelfNumber();
366 const uint32_t efexNumber = tob.eFexNumber();
367 modules[{.shelfNumber=shelfNumber,.efexNumber=efexNumber}].addTob(tob,sliceNumber);
368 }
369 std::vector<uint32_t> getWords(uint32_t shelfNumber) {
370 std::vector<uint32_t> out;
371 for(auto& [id,module] : modules) {
372 if(id.shelfNumber!=shelfNumber) continue;
373 auto words = module.getWords(id,numSlices);
374 out.insert(out.end(),words.begin(),words.end());
375 }
376 // add the rod trailer (the bits that matter, at least)
377 uint32_t rodTrailer1 = 0;
378 uint32_t rodTrailer2 = 0;
379
380 rodTrailer1 += (out.size()&0xffff);
381
382 out.push_back(rodTrailer1);
383 out.push_back(rodTrailer2);
384 return out;
385 }
386 std::map<Module::Id,Module> modules = {};
387 };
388}
389
390StatusCode eFexByteStreamTool::convertToBS(std::vector<OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment*>& vrobf,
392 const EventContext& eventContext) {
393
394 // multislice encoding is not yet implemented
395 // to do would need to decide how many slices have been read out (not guaranteed determinable from the out-of-time tobs)
396 // then need to set the sliceNumber appropriately for central TOBs
397
398 Decoder::Fragment f{.numSlices=1};
399 const int centralSlice = f.numSlices / 2; // central slice index; integer division, evaluates to 0 when numSlices=1
400
401 if (tc && !tc->empty()) {
402 const xAOD::TrigComposite* l1 = tc->at(0);
403 for (const std::string& name : l1->getObjectNames<xAOD::eFexEMRoIContainer>()) {
404 auto link = l1->objectLink<xAOD::eFexEMRoIContainer>(name);
405 if (link.isValid()) {
406 if (const xAOD::eFexEMRoIContainer* cont = link.getStorableObjectPointer()) {
407 for (const xAOD::eFexEMRoI_v1* tob : *cont) {
408 f.addTob(*tob, centralSlice);
409 }
410 }
411 }
412 }
413 for (const std::string& name : l1->getObjectNames<xAOD::eFexTauRoIContainer>()) {
414 auto link = l1->objectLink<xAOD::eFexTauRoIContainer>(name);
415 if (link.isValid()) {
416 if (const xAOD::eFexTauRoIContainer* cont = link.getStorableObjectPointer()) {
417 for (const xAOD::eFexTauRoI_v1* tob : *cont) {
418 f.addTob(*tob, centralSlice);
419 }
420 }
421 }
422 }
423 }
424
425 // clearCache, newRodData, and newRobFragment defined in IL1TriggerByteStreamTool
426 // Allocate memory
427 clearCache(eventContext);
428
429 static const std::vector<uint32_t> mids = {0x1000,0x1100}; // 0x1000,0x1100 are the two shelves
430 for(uint32_t i=0;i<2;i++) {
431 auto words = f.getWords(i);
432 uint32_t* data = newRodData(eventContext, words.size());
433 std::copy( words.begin(), words.end(), data); // transfer words to cache/reserved array
434
435 // Create ROB fragment
436 uint32_t moduleid = mids[i];
437 eformat::helper::SourceIdentifier sid(eformat::TDAQ_CALO_FEAT_EXTRACT_ROI, moduleid);
438 vrobf.push_back(newRobFragment(eventContext, sid.code(), words.size(), data, 0/*detEvtType??*/));
439 }
440 return StatusCode::SUCCESS;
441}
442
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment ROBF
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t tc
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment WROBF
Simplified version of the C++20 std::span.
Definition span.h:61
Decoder for Run 3 data formats: eFEX, jFEX, gFEX and phase 1 Topo.
static void decodeRodInfo(const eformat::ROBFragment< const uint32_t * > *rod, std::list< L1CaloRdoRodInfo > &dat)
L1CaloRdoFexTob subclass for eFEX EM/Tau TOBs or XTOBs.
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ToolHandle< GenericMonitoringTool > m_monTool
virtual void err(const std::string &location, const std::string &title, const std::string &detail) const override
SG::WriteHandleKey< xAOD::eFexTowerContainer > m_eTowerWriteKey
SG::WriteHandleKey< xAOD::eFexTauRoIContainer > m_eTAUxWriteKey
SG::WriteHandleKey< xAOD::eFexTauRoIContainer > m_eTAUWriteKey
std::unique_ptr< L1CaloBsDecoderRun3 > m_decoder
virtual StatusCode convertFromBS(const std::vector< const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment * > &vrobf, const EventContext &eventContext) const override
BS->xAOD conversion.
SG::WriteHandleKey< xAOD::eFexEMRoIContainer > m_eEMxWriteKey
eFexByteStreamTool(const std::string &type, const std::string &name, const IInterface *parent)
virtual StatusCode convertToBS(std::vector< OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment * > &vrobf, const xAOD::TrigCompositeContainer *tc, const EventContext &eventContext) override
xAOD->BS conversion: reads the RoI containers reachable via the TrigCompositeContainer.
SG::WriteHandleKey< xAOD::eFexEMRoIContainer > m_eEMSliceWriteKey
SG::WriteHandleKey< xAOD::eFexTauRoIContainer > m_eTAUSliceWriteKey
ToolHandle< GenericMonitoringTool > m_monTool
virtual StatusCode initialize() override
SG::WriteHandleKey< xAOD::eFexEMRoIContainer > m_eEMWriteKey
STL class.
Class describing a LVL1 eFEX EM region of interest.
uint32_t word0() const
The "raw" 32-bit words describing the e/gamma candidate.
unsigned int fpga() const
FPGA number.
uint32_t word1() const
char isTOB() const
Is this one a TOB (or xTOB partner of a TOB)?
Class describing a LVL1 eFEX tau region of interest.
uint32_t word0() const
The "raw" 32-bit words describing the e/gamma candidate.
char isTOB() const
Is this one a TOB (or xTOB partner of a TOB)?
unsigned int fpga() const
FPGA number.
uint32_t word1() const
static const int c_missingCountCode
int r
Definition globals.cxx:22
Int_t addContainer(Analysis::CalibrationDataContainer *cnt, TFile *file, const char *tagger, const char *jetAuthor, const char *OP, const char *flavour, const char *name=0, bool isReference=false)
virtual void handle(const Incident &inc)
Handle end of run incidents to save the metadata at that point.
::StatusCode StatusCode
StatusCode definition for legacy code.
eformat::write::ROBFragment ROBFragment
Definition RawEvent.h:33
eformat::ROBFragment< PointerType > ROBFragment
Definition RawEvent.h:27
eFexEMRoIContainer_v1 eFexEMRoIContainer
eFexEMRoI_v1 eFexEMRoI
Define the latest version of the eFexEMRoI class.
Definition eFexEMRoI.h:17
TrigCompositeContainer_v1 TrigCompositeContainer
Declare the latest version of the container.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.
eFexTauRoIContainer_v1 eFexTauRoIContainer
eFexTauRoI_v1 eFexTauRoI
Define the latest version of the eFexTauRoI class.
Definition eFexTauRoI.h:16
Simplified version of the C++20 std::span.
std::map< Module::Id, Module > modules
std::vector< uint32_t > getWords(uint32_t shelfNumber)
void addTob(const T &tob, int sliceNumber)
bool operator<(const Id &r) const
std::vector< uint32_t > getWords(const Id &id, int numSlices)
std::map< Slice::Id, Slice > slices
void addTob(const xAOD::eFexTauRoI &tob, uint32_t sliceNumber)
void addTob(const xAOD::eFexEMRoI &tob, uint32_t sliceNumber)
bool operator<(const Id &r) const
std::vector< Tob > tobs
void addTob(const xAOD::eFexEMRoI &tob)
std::vector< uint32_t > getWords(const Id &id)
std::vector< xTob > em_xtobs
std::vector< xTob > tau_xtobs
void addTob(const xAOD::eFexTauRoI &tob)
MsgStream & msg
Definition testRead.cxx:32