ATLAS Offline Software
Loading...
Searching...
No Matches
JepRoiByteStreamV2Tool.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#include <numeric>
7#include <set>
8#include <utility>
9
10#include "GaudiKernel/IInterface.h"
11#include "GaudiKernel/MsgStream.h"
12#include "GaudiKernel/StatusCode.h"
13
15
20
21#include "CmxSubBlock.h"
22#include "JemRoiSubBlockV2.h"
24#include "L1CaloSrcIdMap.h"
25#include "L1CaloSubBlock.h"
26#include "L1CaloUserHeader.h"
27
29
30namespace LVL1BS {
31
32// Interface ID
33
34static const InterfaceID IID_IJepRoiByteStreamV2Tool("JepRoiByteStreamV2Tool",
35 1, 1);
36
41
42// Constructor
43
45 const std::string& name,
46 const IInterface* parent)
47 : AthAlgTool(type, name, parent),
48 m_robDataProvider("ROBDataProviderSvc", name),
49 m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
51 m_subDetector (eformat::TDAQ_CALO_JET_PROC_ROI)
52{
53 declareInterface<JepRoiByteStreamV2Tool>(this);
54
55 declareProperty("ErrorTool", m_errorTool,
56 "Tool to collect errors for monitoring");
57 declareProperty("CrateOffsetHw", m_crateOffsetHw = 12,
58 "Offset of JEP crate numbers in bytestream");
59 declareProperty("CrateOffsetSw", m_crateOffsetSw = 0,
60 "Offset of JEP crate numbers in RDOs");
61
62 // Properties for reading bytestream only
63 declareProperty("ROBSourceIDs", m_sourceIDsProp,
64 "ROB fragment source identifiers");
65 declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIBProp,
66 "ROB fragment source identifiers");
67
68 // Properties for writing bytestream only
69 declareProperty("DataVersion", m_version = 2, //<<== CHECK
70 "Format version number in sub-block header");
71 declareProperty("DataFormat", m_dataFormat = 1,
72 "Format identifier (0-1) in sub-block header");
73 declareProperty("SlinksPerCrate", m_slinks = 1,
74 "The number of S-Links per crate");
75 declareProperty("CrateMin", m_crateMin = 0,
76 "Minimum crate number, allows partial output");
77 declareProperty("CrateMax", m_crateMax = m_crates - 1,
78 "Maximum crate number, allows partial output");
79
80}
81
82// Destructor
83
87
88// Initialize
89
90
92{
93 ATH_MSG_INFO ("Initializing " << name());
94
95 ATH_CHECK( m_errorTool.retrieve() );
96 ATH_CHECK( m_byteStreamCnvSvc.retrieve() );
97
98 return StatusCode::SUCCESS;
99}
100
101// Finalize
102
104{
105 return StatusCode::SUCCESS;
106}
107
108// Conversion bytestream to JEM RoI
109
111 const EventContext& ctx,
112 const std::string& sgKey,
113 DataVector<LVL1::JEMTobRoI> *const collection) const
114{
115 const std::vector<uint32_t>& vID(sourceIDs(sgKey));
116 // // get ROB fragments
118 m_robDataProvider->getROBData(ctx, vID, robFrags, "JepRoiByteStreamV2Tool");
119 ATH_MSG_DEBUG("Number of ROB fragments:" << robFrags.size());
120 return convert(robFrags, collection);
121}
122
124 const IROBDataProviderSvc::VROBFRAG& robFrags,
125 DataVector<LVL1::JEMTobRoI>* const jeCollection) const
126{
127 return convertBs(robFrags, jeCollection, nullptr);
128}
129
130// Conversion bytestream to CMX RoI
131
133 const EventContext& ctx,
134 const std::string& sgKey,
135 LVL1::CMXRoI* cmCollection) const
136{
137 const std::vector<uint32_t>& vID(sourceIDs(sgKey));
138 // // get ROB fragments
140 m_robDataProvider->getROBData(ctx, vID, robFrags, "JepRoiByteStreamV2Tool");
141 ATH_MSG_DEBUG("Number of ROB fragments:" << robFrags.size());
142 return convert(robFrags, cmCollection);
143}
144
146 const IROBDataProviderSvc::VROBFRAG& robFrags,
147 LVL1::CMXRoI* cmCollection) const
148{
149 return convertBs(robFrags, nullptr, cmCollection);
150}
151
152// Conversion of JEP container to bytestream
153
155 const LVL1::JEPRoIBSCollectionV2* const jep) const
156{
157 const bool debug = msgLvl(MSG::DEBUG);
158 if (debug) msg(MSG::DEBUG);
159
160 // Get the event assembler
162 ATH_CHECK( m_byteStreamCnvSvc->getFullEventAssembler (fea,
163 "JepRoiByteStreamV2") );
164 const uint16_t minorVersion = m_srcIdMap.minorVersion();
165 fea->setRodMinorVersion(minorVersion);
166
167 // Pointer to ROD data vector
168
170
171 // Sub-block for neutral format
172 JemRoiSubBlockV2 subBlock;
173
174 // Set up the container maps
175
176 const bool neutralFormat = m_dataFormat == L1CaloSubBlock::NEUTRAL;
177
178 // JEM RoI map
179 JemRoiMap roiMap;
180 setupJemRoiMap(jep->JemRoi(), roiMap);
181 JemRoiMap::const_iterator mapIter = roiMap.begin();
182 JemRoiMap::const_iterator mapIterEnd = roiMap.end();
183
184 // CMX energy sums map
185 CmxSumsMap cmxEtMap;
186 if (neutralFormat) {
187 setupCmxEtMap(jep->CmxSums(), cmxEtMap);
188 }
189
190 // Loop over JEM RoI data
191
192 const int modulesPerSlink = m_modules / m_slinks;
193 for (int crate = m_crateMin; crate <= m_crateMax; ++crate) {
194 const int hwCrate = crate + m_crateOffsetHw;
195
196 for (int module = 0; module < m_modules; ++module) {
197
198 // Pack required number of modules per slink
199
200 if (module % modulesPerSlink == 0) {
201 const int daqOrRoi = 1;
202 const int slink = module / modulesPerSlink;
203 if (debug) {
204 msg() << "Treating crate " << hwCrate
205 << " slink " << slink << endmsg
206 << "Data Version/Format: " << m_version
207 << " " << m_dataFormat << endmsg;
208 }
209 const uint32_t rodIdJem = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
211 theROD = fea->getRodData(rodIdJem);
212 if (neutralFormat) {
213 const L1CaloUserHeader userHeader;
214 theROD->push_back(userHeader.header());
215 }
216 }
217 if (debug) msg() << "JEM Module " << module << endmsg;
218 if (!theROD) break; // for coverity, shouldn't happen
219
220 // Create a sub-block (Neutral format only)
221
222 if (neutralFormat) {
223 subBlock.clear();
224 subBlock.setRoiHeader(m_version, hwCrate, module);
225 }
226
227 // Find JEM RoIs for this module
228
229 for (; mapIter != mapIterEnd; ++mapIter) {
230 const LVL1::JEMTobRoI* const roi = mapIter->second;
231 if (roi->crate() < crate) continue;
232 if (roi->crate() > crate) break;
233 if (roi->jem() < module) continue;
234 if (roi->jem() > module) break;
235 if (roi->energyLarge() || roi->energySmall()) {
236 if (neutralFormat) subBlock.fillRoi(*roi);
237 else theROD->push_back(roi->roiWord());
238 }
239 }
240
241 // Pack and write the sub-block
242
243 if (neutralFormat) {
244 if ( !subBlock.pack()) {
245 msg(MSG::ERROR) << "JEM RoI sub-block packing failed" << endmsg;
246 return StatusCode::FAILURE;
247 }
248 if (debug) {
249 msg() << "JEM RoI sub-block data words: "
250 << subBlock.dataWords() << endmsg;
251 }
252 subBlock.write(theROD);
253 }
254 }
255 if (!theROD) break; // for coverity, shouldn't happen
256
257 // Append CMX RoIs to last S-Link of the system crate
258
259 if (crate != m_crates - 1) continue;
260
261 // Create sub-blocks for Neutral format
262
263 if (neutralFormat) {
264 const int timeslices = 1;
265 const int slice = 0;
266
267 // CMX-Energy
268
269 CmxEnergySubBlock subBlock;
270 const int cmxEnergyVersion = 3; //<<== CHECK
271 subBlock.setCmxHeader(cmxEnergyVersion, m_dataFormat, slice, hwCrate,
273 CmxSubBlock::LEFT, timeslices);
274 int maxSource = static_cast<int>(LVL1::CMXEtSums::MAX_SOURCE);
275 for (int source = 0; source < maxSource; ++source) {
276 const LVL1::CMXEtSums* const sums = findCmxSums(crate, source, cmxEtMap);
277 if ( sums ) {
278 const unsigned int ex = sums->Ex();
279 const unsigned int ey = sums->Ey();
280 const unsigned int et = sums->Et();
281 const int exErr = sums->ExError();
282 const int eyErr = sums->EyError();
283 const int etErr = sums->EtError();
284 if (source < m_modules) {
285 subBlock.setSubsums(slice, source, ex, ey, et, exErr, eyErr, etErr);
286 } else {
290 energySubBlockTypes(source, srcType, sumType, hitType);
291 if (srcType != CmxEnergySubBlock::MAX_SOURCE_TYPE) {
292 subBlock.setSubsums(slice, srcType, sumType, ex, ey, et,
293 exErr, eyErr, etErr);
294 } else if (hitType != CmxEnergySubBlock::MAX_HITS_TYPE) {
295 subBlock.setEtHits(slice, hitType, sumType, et);
296 }
297 }
298 }
299 }
300 if ( !subBlock.pack()) {
301 msg(MSG::ERROR) << "CMX-Energy sub-block packing failed" << endmsg;
302 return StatusCode::FAILURE;
303 }
304 if (debug) {
305 msg() << "CMX-Energy sub-block data words: "
306 << subBlock.dataWords() << endmsg;
307 }
308 subBlock.write(theROD);
309
310 } else {
311
312 // Standard format
313
314 const LVL1::CMXRoI* const roi = jep->CmxRoi();
315 if ( roi ) {
316 // CMX-Energy RoIs are not zero-supressed unless all are zero
317 for (int word = 0; word < m_maxRoiWords; ++word) {
318 theROD->push_back(roi->roiWord(word));
319 }
320 }
321 }
322 }
323
324 return StatusCode::SUCCESS;
325}
326
327// Return reference to vector with all possible Source Identifiers
328
329std::vector<uint32_t> JepRoiByteStreamV2Tool::makeSourceIDs (bool roiDaq) const
330{
331 std::vector<uint32_t> sourceIDs;
332
333 if (roiDaq) {
335 }
336 else {
338 }
339
340 if (sourceIDs.empty()) {
341 const int maxCrates = m_crates + m_crateOffsetHw;
342 const int maxSlinks = m_srcIdMap.maxSlinks();
343 for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate)
344 {
345 for (int slink = 0; slink < maxSlinks; ++slink)
346 {
347 const int daqOrRoi = 1;
348 const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
350 const uint32_t robId = m_srcIdMap.getRobID(rodId);
351 if (roiDaq)
352 {
353 if (slink < 2) sourceIDs.push_back(robId);
354 }
355 else if (slink >= 2) sourceIDs.push_back(robId);
356 }
357 }
358
359 }
360 return sourceIDs;
361}
362
363const std::vector<uint32_t>& JepRoiByteStreamV2Tool::sourceIDs(
364 const std::string& sgKey) const
365{
366 const std::string flag("RoIB");
367 const std::string::size_type pos = sgKey.find(flag);
368 const bool roiDaq =
369 (pos == std::string::npos || pos != sgKey.length() - flag.length());
370
371 if (roiDaq) {
372 static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq);
373 return sourceIDs;
374 }
375 else {
376 static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq);
377 return sourceIDsRoIB;
378 }
379}
380
381// Convert bytestream to given container type
382
384 const IROBDataProviderSvc::VROBFRAG& robFrags,
385 DataVector<LVL1::JEMTobRoI>* jeCollection,
386 LVL1::CMXRoI* cmCollection) const
387{
388 const bool debug = msgLvl(MSG::DEBUG);
389 if (debug) msg(MSG::DEBUG);
390
391 // Loop over ROB fragments
392
393 int robCount = 0;
394 std::set<uint32_t> dupCheck;
395 std::set<uint32_t> dupRoiCheck;
396 ROBIterator rob = robFrags.begin();
397 ROBIterator robEnd = robFrags.end();
398 for (; rob != robEnd; ++rob) {
399
400 if (debug) {
401 ++robCount;
402 msg() << "Treating ROB fragment " << robCount << endmsg;
403 }
404
405 // Skip fragments with ROB status errors
406
407 uint32_t robid = (*rob)->source_id();
408 if ((*rob)->nstatus() > 0) {
409 ROBPointer robData;
410 (*rob)->status(robData);
411 if (*robData != 0) {
412 m_errorTool->robError(robid, *robData);
413 if (debug) msg() << "ROB status error - skipping fragment" << endmsg;
414 continue;
415 }
416 }
417
418 // Skip duplicate fragments
419
420 if (!dupCheck.insert(robid).second) {
422 if (debug) msg() << "Skipping duplicate ROB fragment" << endmsg;
423 continue;
424 }
425
426 // Unpack ROD data (slinks)
427
428 RODPointer payloadBeg;
429 RODPointer payload;
430 RODPointer payloadEnd;
431 (*rob)->rod_data(payloadBeg);
432 payloadEnd = payloadBeg + (*rob)->rod_ndata();
433 payload = payloadBeg;
434 if (payload == payloadEnd) {
435 if (debug) msg() << "ROB fragment empty" << endmsg;
436 continue;
437 }
438
439 // Check identifier
440 const uint32_t sourceID = (*rob)->rod_source_id();
441 if (m_srcIdMap.getRobID(sourceID) != robid ||
442 m_srcIdMap.subDet(sourceID) != m_subDetector ||
443 m_srcIdMap.daqOrRoi(sourceID) != 1 ||
444 (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) ||
445 m_srcIdMap.crate(sourceID) < m_crateOffsetHw ||
446 m_srcIdMap.crate(sourceID) >= m_crateOffsetHw + m_crates) {
448 if (debug) {
449 msg() << "Wrong source identifier in data: "
450 << MSG::hex << sourceID << MSG::dec << endmsg;
451 }
452 continue;
453 }
454
455 // Check minor version
456 const int minorVersion = (*rob)->rod_version() & 0xffff;
457 if (minorVersion <= m_srcIdMap.minorVersionPreLS1()) {
458 if (debug) msg() << "Skipping pre-LS1 data" << endmsg;
459 continue;
460 }
461 const int rodCrate = m_srcIdMap.crate(sourceID);
462 if (debug) {
463 msg() << "Treating crate " << rodCrate
464 << " slink " << m_srcIdMap.slink(sourceID) << endmsg;
465 }
466
467 // First word may be User Header
468 if (L1CaloUserHeader::isValid(*payload)) {
469 L1CaloUserHeader userHeader(*payload);
470 userHeader.setVersion(minorVersion);
471 const int headerWords = userHeader.words();
472 if (headerWords != 1) {
474 if (debug) msg() << "Unexpected number of user header words: "
475 << headerWords << endmsg;
476 continue;
477 }
478 for (int i = 0; i < headerWords; ++i) ++payload;
479 }
480
481 // Loop over sub-blocks if there are any
482
483 unsigned int rodErr = L1CaloSubBlock::ERROR_NONE;
484 while (payload != payloadEnd) {
485
487 const int slice = 0;
488 if (CmxSubBlock::cmxBlock(*payload)) {
489 // CMXs
491 CmxEnergySubBlock subBlock;
492 payload = subBlock.read(payload, payloadEnd);
493 if (cmCollection != nullptr) {
494 if (subBlock.dataWords() && !subBlock.unpack()) {
495 if (debug) {
496 std::string errMsg(subBlock.unpackErrorMsg());
497 msg() << "CMX-Energy sub-block unpacking failed: "
498 << errMsg << endmsg;
499 }
500 rodErr = subBlock.unpackErrorCode();
501 break;
502 }
503 const LVL1::CMXRoI roi(
504 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
507 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
510 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
513 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
516 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
519 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
522 subBlock.hits(slice, CmxEnergySubBlock::SUM_ET,
524 subBlock.hits(slice, CmxEnergySubBlock::MISSING_ET,
528 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
531 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
534 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
537 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
540 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
543 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
546 subBlock.hits(slice, CmxEnergySubBlock::SUM_ET,
548 subBlock.hits(slice, CmxEnergySubBlock::MISSING_ET,
550 for (int word = 0; word < m_maxRoiWords; ++word) {
551 cmCollection->setRoiWord(roi.roiWord(word));
552 }
553 }
554 }
555 } else {
556 // JEM RoI
557 JemRoiSubBlockV2 subBlock;
558 payload = subBlock.read(payload, payloadEnd);
559 if (jeCollection != nullptr) {
560 if (subBlock.dataWords() && !subBlock.unpack()) {
561 if (debug) {
562 std::string errMsg(subBlock.unpackErrorMsg());
563 msg() << "JEM RoI sub-block unpacking failed: "
564 << errMsg << endmsg;
565 }
566 rodErr = subBlock.unpackErrorCode();
567 break;
568 }
569 for (int frame = 0; frame < m_frames; ++frame) {
570 const LVL1::JEMTobRoI roi = subBlock.roi(frame);
571 if (roi.energyLarge() || roi.energySmall()) {
572 jeCollection->push_back(new LVL1::JEMTobRoI(roi));
573 }
574 }
575 }
576 }
577 } else {
578 // Just RoI word
579 LVL1::JEMTobRoI jroi;
580 LVL1::CMXRoI croi;
581 if (jroi.setRoiWord(*payload)) {
582 if (jeCollection != nullptr) {
583 if (jroi.crate() != rodCrate - m_crateOffsetHw) {
584 if (debug) msg() << "Inconsistent RoI crate number: "
585 << jroi.crate() << endmsg;
587 break;
588 }
589 const uint32_t location = (*payload) & 0xfff80000;
590 if (dupRoiCheck.insert(location).second) {
591 if (jroi.energyLarge() || jroi.energySmall()) {
592 jeCollection->push_back(new LVL1::JEMTobRoI(*payload));
593 }
594 } else {
595 if (debug) msg() << "Duplicate RoI word "
596 << MSG::hex << *payload << MSG::dec << endmsg;
598 break;
599 }
600 }
601 } else if (croi.setRoiWord(*payload)) {
602 if (cmCollection != nullptr) {
603 const uint32_t roiType = (*payload) & 0xfc000000;
604
605 if (dupRoiCheck.insert(roiType).second) {
606 cmCollection->setRoiWord(*payload);
607 } else {
608 if (debug) msg() << "Duplicate RoI word "
609 << MSG::hex << *payload << MSG::dec << endmsg;
611 break;
612 }
613 }
614 } else {
615 if (debug) msg() << "Invalid RoI word "
616 << MSG::hex << *payload << MSG::dec << endmsg;
618 break;
619 }
620 ++payload;
621 }
622 }
623 if (rodErr != L1CaloSubBlock::ERROR_NONE)
624 m_errorTool->rodError(robid, rodErr);
625 }
626
627 return StatusCode::SUCCESS;
628}
629
630// Find CMX energy sums for given crate, source
631
633 const int source,
634 const CmxSumsMap& cmxEtMap) const
635{
636 const LVL1::CMXEtSums* sums = 0;
637 CmxSumsMap::const_iterator mapIter;
638 mapIter = cmxEtMap.find(crate * 100 + source);
639 if (mapIter != cmxEtMap.end()) sums = mapIter->second;
640 return sums;
641}
642
643// Set up JEM RoIs map
644
646 const jeCollection,
647 JemRoiMap& roiMap) const
648{
649 roiMap.clear();
650 if (jeCollection) {
651 JemRoiCollection::const_iterator pos = jeCollection->begin();
652 JemRoiCollection::const_iterator pose = jeCollection->end();
653 for (; pos != pose; ++pos) {
654 const LVL1::JEMTobRoI* const roi = *pos;
655 const uint32_t key = roi->roiWord();
656 roiMap.insert(std::make_pair(key, roi));
657 }
658 }
659}
660
661// Set up CMX energy sums map
662
664 const etCollection,
665 CmxSumsMap& cmxEtMap) const
666{
667 cmxEtMap.clear();
668 if (etCollection) {
669 CmxSumsCollection::const_iterator pos = etCollection->begin();
670 CmxSumsCollection::const_iterator pose = etCollection->end();
671 for (; pos != pose; ++pos) {
672 const LVL1::CMXEtSums* const sums = *pos;
673 const int crate = sums->crate() - m_crateOffsetSw;
674 const int key = crate * 100 + sums->source();
675 cmxEtMap.insert(std::make_pair(key, sums));
676 }
677 }
678}
679
680// Get energy subBlock types from CMXEtSums source type
681
685 CmxEnergySubBlock::HitsType& hitType) const
686{
687 switch (source) {
691 break;
695 break;
697 srcType = CmxEnergySubBlock::LOCAL;
699 break;
701 srcType = CmxEnergySubBlock::LOCAL;
703 break;
705 srcType = CmxEnergySubBlock::TOTAL;
707 break;
709 srcType = CmxEnergySubBlock::TOTAL;
711 break;
715 break;
719 break;
723 break;
727 break;
731 break;
732 default:
733 break;
734 }
735}
736
737} // end namespace
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
const bool debug
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
Template class for assembling a full atlas raw event from subfragments.
void setRodMinorVersion(uint16_t m)
change the ROD minor version
std::vector< uint32_t > RODDATA
ROD data as a vector of unsigned int.
RODDATA * getRodData(uint32_t id)
get a block of ROD data
std::vector< const ROBF * > VROBFRAG
Sub-Block class for CMX-Energy data post LS1.
unsigned int hits(int slice, HitsType hType, SumType sType) const
Return hits map for given hits type and sum type.
void setSubsums(int slice, int jem, unsigned int ex, unsigned int ey, unsigned int et, int exError, int eyError, int etError)
Store energy subsums and errors for given JEM.
void setEtHits(int slice, HitsType hType, SumType sType, unsigned int map)
Store hits map for given hits type and sum type.
unsigned int energy(int slice, int jem, EnergyType eType) const
Return energy subsum for given JEM and energy type.
int error(int slice, int jem, EnergyType eType) const
Return energy subsum error for given JEM and energy type.
static bool cmxBlock(uint32_t word)
Determine if header word corresponds to CMX.
void setCmxHeader(int version, int format, int slice, int crate, int summing, int firmware, int position, int timeslices)
Store CMX header.
static CmxFirmwareCode cmxType(uint32_t word)
CMX differentiation (CMX_CP, CMX_JET, or CMX_ENERGY).
Sub-Block class for JEM RoI data (neutral format) post-LS1.
void clear()
Clear all data.
LVL1::JEMTobRoI roi(int frame) const
Return RoI for given frame.
void fillRoi(LVL1::JEMTobRoI roi)
Store RoI.
void setRoiHeader(int version, int crate, int module)
Store header.
OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer
OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer
int m_crateOffsetHw
Property: Hardware crate number offset.
void setupJemRoiMap(const JemRoiCollection *jeCollection, JemRoiMap &roiMap) const
Set up JEM RoIs map.
static const InterfaceID & interfaceID()
AlgTool InterfaceID.
const int m_crates
Number of crates.
IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator
int m_crateMax
Property: Maximum crate number when writing out bytestream.
int m_version
Property: Sub_block header version.
const int m_modules
Number of JEM modules per crate.
std::vector< uint32_t > makeSourceIDs(bool roiDaq) const
const int m_maxRoiWords
Number of CMX energy RoI words.
DataVector< LVL1::CMXEtSums > CmxSumsCollection
virtual StatusCode finalize() override
const eformat::SubDetector m_subDetector
Sub-detector type.
ServiceHandle< IByteStreamCnvSvc > m_byteStreamCnvSvc
int m_dataFormat
Property: Data compression format.
void energySubBlockTypes(int source, CmxEnergySubBlock::SourceType &srcType, CmxEnergySubBlock::SumType &sumType, CmxEnergySubBlock::HitsType &hitType) const
Get energy subBlock types from CMXEtSums source type.
virtual StatusCode initialize() override
const int m_frames
Number of RoI frames.
int m_crateMin
Property: Minimum crate number when writing out bytestream.
StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG &robFrags, DataVector< LVL1::JEMTobRoI > *jeCollection, LVL1::CMXRoI *cmCollection) const
Convert bytestream to given container type.
void setupCmxEtMap(const CmxSumsCollection *enCollection, CmxSumsMap &cmxEtMap) const
Set up CMX energy sums map.
int m_slinks
Property: Number of slinks per crate when writing out bytestream.
std::vector< uint32_t > m_sourceIDsRoIBProp
Property: ROB source IDs for RoIB.
JepRoiByteStreamV2Tool(const std::string &type, const std::string &name, const IInterface *parent)
int m_crateOffsetSw
Property: Software crate number offset.
const LVL1::CMXEtSums * findCmxSums(int crate, int source, const CmxSumsMap &cmxEtMap) const
Find CMX energy sums for given crate, source.
StatusCode convert(const EventContext &ctx, const std::string &name, DataVector< LVL1::JEMTobRoI > *jeCollection) const
Convert ROB fragments to JEM RoIs.
ServiceHandle< IROBDataProviderSvc > m_robDataProvider
DataVector< LVL1::JEMTobRoI > JemRoiCollection
std::map< int, const LVL1::CMXEtSums * > CmxSumsMap
const L1CaloSrcIdMap m_srcIdMap
Source ID converter.
ToolHandle< LVL1BS::L1CaloErrorByteStreamTool > m_errorTool
Property: Error collection tool.
std::vector< uint32_t > m_sourceIDsProp
Property: ROB source IDs.
const std::vector< uint32_t > & sourceIDs(const std::string &sgKey) const
Return reference to vector with all possible Source Identifiers.
std::map< uint32_t, const LVL1::JEMTobRoI * > JemRoiMap
int unpackErrorCode() const
Return the unpacking error code.
int dataWords() const
Return number of data words.
static SubBlockWordType wordType(uint32_t word)
Word identification.
void write(FullEventAssembler< L1CaloSrcIdMap >::RODDATA *theROD) const
Output complete packed sub-block to ROD vector.
std::string unpackErrorMsg() const
Return the unpacking error message for printing.
OFFLINE_FRAGMENTS_NAMESPACE::PointerType read(const OFFLINE_FRAGMENTS_NAMESPACE::PointerType beg, const OFFLINE_FRAGMENTS_NAMESPACE::PointerType end)
Input complete packed sub-block from ROD array.
L1Calo User Header class.
static bool isValid(uint32_t word)
Test for valid header word.
void setVersion(int minorVersion)
Set version flag.
int words() const
Return number of header words (should be one).
uint32_t header() const
Return packed header.
CMXEtSums object stores Et sums from the Energy CMXs.
unsigned int Ey() const
returns module Ey sum for peak sample
unsigned int Ex() const
returns module Ex sum for peak sample
unsigned int Et() const
For triggered time slice.
int ExError() const
returns module Ex sum error for peak sample
int EyError() const
returns module Ey sum error for peak sample
int EtError() const
returns module ET sum error for peak sample
bool setRoiWord(uint32_t roiWord)
Set RoI word with ID check.
Definition CMXRoI.cxx:115
uint32_t roiWord(int word) const
Return packed Energy RoI word (0-5).
bool setRoiWord(uint32_t roiWord)
Set RoI word with ID check.
Definition JEMTobRoI.cxx:55
uint32_t roiWord() const
Return packed RoI word.
int energyLarge() const
Return energy large window size.
int energySmall() const
Return energy small window size.
Jet/Energy Processor RoI container for writing bytestream post-LS1.
const CMXRoI * CmxRoi() const
Return pointer to CMX RoIs.
const DataVector< CMXEtSums > * CmxSums() const
Return pointer to CMX energy sums collection.
const DataVector< JEMTobRoI > * JemRoi() const
Return pointer to JEM RoI collection.
static const InterfaceID IID_IJepRoiByteStreamV2Tool("JepRoiByteStreamV2Tool", 1, 1)
Extra patterns decribing particle interation process.