10#include "GaudiKernel/IInterface.h"
11#include "GaudiKernel/MsgStream.h"
12#include "GaudiKernel/StatusCode.h"
48 const std::string& name,
49 const IInterface* parent)
51 m_errorTool(
"LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
55 declareInterface<JepRoiByteStreamTool>(
this);
58 "Offset of JEP crate numbers in bytestream");
60 "Offset of JEP crate numbers in RDOs");
64 "ROB fragment source identifiers");
66 "ROB fragment source identifiers");
70 "Format version number in sub-block header");
72 "Format identifier (0-1) in sub-block header");
74 "The number of S-Links per crate");
94 return StatusCode::SUCCESS;
101 return StatusCode::SUCCESS;
110 return convertBs(robFrags, jeCollection,
nullptr);
119 return convertBs(robFrags,
nullptr, cmCollection);
133 "JepRoiByteStream") );
134 const uint16_t minorVersion =
m_srcIdMap.minorVersion();
151 JemRoiMap::const_iterator mapIter = roiMap.begin();
152 JemRoiMap::const_iterator mapIterEnd = roiMap.end();
166 for (
int crate = 0; crate <
m_crates; ++crate) {
169 for (
int module = 0;
module < m_modules; ++module) {
173 if (module % modulesPerSlink == 0) {
174 const int daqOrRoi = 1;
175 const int slink =
module / modulesPerSlink;
177 msg() <<
"Treating crate " << hwCrate
178 <<
" slink " << slink <<
endmsg
182 const uint32_t rodIdJem =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
187 theROD->push_back(userHeader.
header());
190 if (
debug)
msg() <<
"JEM Module " <<
module << endmsg;
202 for (; mapIter != mapIterEnd; ++mapIter) {
204 if (roi->
crate() < crate)
continue;
205 if (roi->
crate() > crate)
break;
206 if (roi->
jem() < module)
continue;
207 if (roi->
jem() > module)
break;
209 if (neutralFormat) subBlock.
fillRoi(*roi);
210 else theROD->push_back(roi->
roiWord());
217 if ( !subBlock.
pack()) {
218 msg(MSG::ERROR) <<
"JEM RoI sub-block packing failed" <<
endmsg;
219 return StatusCode::FAILURE;
222 msg() <<
"JEM RoI sub-block data words: "
225 subBlock.
write(theROD);
232 if (crate !=
m_crates - 1)
continue;
237 const int timeslices = 1;
243 const int cmmEnergyVersion = 2;
248 for (
int dataID = 0; dataID < maxDataID; ++dataID) {
274 const unsigned int ex = sums->
Ex();
275 const unsigned int ey = sums->
Ey();
276 const unsigned int et = sums->
Et();
277 const int exErr = sums->
ExError();
278 const int eyErr = sums->
EyError();
279 const int etErr = sums->
EtError();
287 enBlock.
setSubsums(slice, source, ex, ey,
et, exErr, eyErr, etErr);
291 if ( !enBlock.
pack()) {
292 msg(MSG::ERROR) <<
"CMM-Energy sub-block packing failed" <<
endmsg;
293 return StatusCode::FAILURE;
296 msg() <<
"CMM-Energy sub-block data words: "
299 enBlock.
write(theROD);
308 for (
int dataID = 0; dataID < maxDataID; ++dataID) {
341 const unsigned int hits = ch->Hits();
342 const int errs = ch->Error();
346 jetBlock.
setJetHits(slice, source, hits, errs);
350 if ( !jetBlock.
pack()) {
351 msg(MSG::ERROR) <<
"CMM-Jet sub-block packing failed" <<
endmsg;
352 return StatusCode::FAILURE;
355 msg() <<
"CMM-Jet sub-block data words: "
358 jetBlock.
write(theROD);
369 roi->
ex(), roi->
ey(), roi->
et(),
390 return StatusCode::SUCCESS;
411 for (
int slink = 0; slink < maxSlinks; ++slink)
413 const int daqOrRoi = 1;
414 const uint32_t rodId =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
416 const uint32_t robId =
m_srcIdMap.getRobID(rodId);
419 if (slink < 2)
sourceIDs.push_back(robId);
421 else if (slink >= 2)
sourceIDs.push_back(robId);
430 const std::string& sgKey)
const
432 const std::string flag(
"RoIB");
433 const std::string::size_type pos = sgKey.find(flag);
435 (pos == std::string::npos || pos != sgKey.length() - flag.length());
442 static const std::vector<uint32_t> sourceIDsRoIB =
makeSourceIDs(roiDaq);
443 return sourceIDsRoIB;
460 std::set<uint32_t> dupCheck;
461 std::set<uint32_t> dupRoiCheck;
464 for (; rob != robEnd; ++rob) {
468 msg() <<
"Treating ROB fragment " << robCount <<
endmsg;
473 uint32_t robid = (*rob)->source_id();
474 if ((*rob)->nstatus() > 0) {
476 (*rob)->status(robData);
479 if (
debug)
msg() <<
"ROB status error - skipping fragment" <<
endmsg;
486 if (!dupCheck.insert(robid).second) {
497 (*rob)->rod_data(payloadBeg);
498 payloadEnd = payloadBeg + (*rob)->rod_ndata();
499 payload = payloadBeg;
500 if (payload == payloadEnd) {
506 const uint32_t sourceID = (*rob)->rod_source_id();
515 msg() <<
"Wrong source identifier in data: "
516 << MSG::hex << sourceID << MSG::dec <<
endmsg;
520 const int rodCrate =
m_srcIdMap.crate(sourceID);
522 msg() <<
"Treating crate " << rodCrate
529 const int minorVersion = (*rob)->rod_version() & 0xffff;
531 const int headerWords = userHeader.
words();
532 if (headerWords != 1) {
534 if (
debug)
msg() <<
"Unexpected number of user header words: "
538 for (
int i = 0; i < headerWords; ++i) ++payload;
544 while (payload != payloadEnd) {
552 payload = subBlock.
read(payload, payloadEnd);
553 if (cmCollection !=
nullptr) {
557 msg() <<
"CMM-Jet sub-block unpacking failed: "
564 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
569 payload = subBlock.
read(payload, payloadEnd);
570 if (cmCollection !=
nullptr) {
574 msg() <<
"CMM-Energy sub-block unpacking failed: "
598 payload = subBlock.
read(payload, payloadEnd);
599 if (jeCollection !=
nullptr) {
603 msg() <<
"JEM RoI sub-block unpacking failed: "
609 for (
int frame = 0; frame < 8; ++frame) {
610 for (
int forward = 0; forward < 2; ++forward) {
624 if (jeCollection !=
nullptr) {
626 if (
debug)
msg() <<
"Inconsistent RoI crate number: "
631 const uint32_t location = (*payload) & 0xfffc0000;
632 if (dupRoiCheck.insert(location).second) {
637 if (
debug)
msg() <<
"Duplicate RoI word "
638 << MSG::hex << *payload << MSG::dec <<
endmsg;
644 if (cmCollection !=
nullptr) {
645 uint32_t roiType = (*payload) & 0xf0000000;
646 if ((roiType & 0xe0000000) == 0xa0000000) roiType = 0xa0000000;
647 if (dupRoiCheck.insert(roiType).second) {
650 if (
debug)
msg() <<
"Duplicate RoI word "
651 << MSG::hex << *payload << MSG::dec <<
endmsg;
657 if (
debug)
msg() <<
"Invalid RoI word "
658 << MSG::hex << *payload << MSG::dec <<
endmsg;
669 return StatusCode::SUCCESS;
679 CmmHitsMap::const_iterator mapIter;
680 mapIter = cmmHitsMap.find(crate * 100 + dataID);
681 if (mapIter != cmmHitsMap.end()) hits = mapIter->second;
692 CmmSumsMap::const_iterator mapIter;
693 mapIter = cmmEtMap.find(crate * 100 + dataID);
694 if (mapIter != cmmEtMap.end()) sums = mapIter->second;
708 for (; pos != pose; ++pos) {
710 const uint32_t key = roi->
roiWord();
711 roiMap.insert(std::make_pair(key, roi));
726 for (; pos != pose; ++pos) {
729 const int key = crate * 100 + hits->dataID();
730 cmmHitsMap.insert(std::make_pair(key, hits));
745 for (; pos != pose; ++pos) {
748 const int key = crate * 100 + sums->
dataID();
749 cmmEtMap.insert(std::make_pair(key, sums));
#define ATH_CHECK
Evaluate an expression and check for errors.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
bool msgLvl(const MSG::Level lvl) const
DataModel_detail::const_iterator< DataVector > const_iterator
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 CMM-Energy data.
int exError(int slice, int source) const
Return Ex subsum error for given JEM or source ID.
void setMissingEtSigHits(int slice, unsigned int map)
Store Missing-ET-Sig Hits map.
unsigned int ey(int slice, int source) const
Return Ey subsum for given JEM or source ID.
unsigned int et(int slice, int source) const
Return Et subsum for given JEM or source ID.
void setSumEtHits(int slice, unsigned int map)
Store Sum-Et Hits map.
unsigned int sumEtHits(int slice) const
Return Sum-Et Hits map.
int eyError(int slice, int source) const
Return Ey subsum error for given JEM or source ID.
unsigned int missingEtSigHits(int slice) const
Return Missing-ET-Sig Hits map.
bool unpack()
Unpack data.
void setSubsums(int slice, int source, unsigned int ex, unsigned int ey, unsigned int et, int exError, int eyError, int etError)
Store energy subsums and errors for given JEM or source ID.
unsigned int missingEtHits(int slice) const
Return Missing-ET Hits map.
int etError(int slice, int source) const
Return Et subsum error for given JEM or source ID.
void setMissingEtHits(int slice, unsigned int map)
Store Missing-ET Hits map.
unsigned int ex(int slice, int source) const
Return Ex subsum for given JEM or source ID.
Sub-Block class for CMM-Jet data.
void setJetHits(int slice, int source, unsigned int hits, int error)
Store jet hit counts and error for given jem or source ID.
void setJetEtMap(int slice, unsigned int map)
Store jet ET map.
unsigned int jetEtMap(int slice) const
Return jet ET map.
bool unpack()
Unpack data.
static bool cmmBlock(uint32_t word)
Determine if header word corresponds to CMM.
void setCmmHeader(int version, int format, int slice, int crate, int summing, int firmware, int position, int timeslices)
Store CMM header.
static CmmFirmwareCode cmmType(uint32_t word)
CMM differentiation (CMM_CP, CMM_JET, or CMM_ENERGY)
Sub-Block class for JEM RoI data (neutral format).
void fillRoi(LVL1::JEMRoI roi)
Store RoI.
void setRoiHeader(int version, int crate, int module)
Store header.
void clear()
Clear all data.
LVL1::JEMRoI roi(int frame, int forward) const
Return RoI for given frame and forward.
bool unpack()
Unpack data.
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.
CMMEtSums object stores Et sums from the Energy CMMs.
unsigned int Ex() const
returns module Ex sum for peak sample
int dataID() const
returns data ID
int EyError() const
returns module Ey sum error for peak sample
int crate() const
Data accessors.
unsigned int Et() const
For triggered time slice.
unsigned int Ey() const
returns module Ey sum for peak sample
int ExError() const
returns module Ex sum error for peak sample
int EtError() const
returns module ET sum error for peak sample
CMMJetHits class stores Jet hit multiplicities received by and read out from the Jet CMMs.
uint32_t energyRoiWord1() const
Return packed Energy RoI word 1.
int missingEtSigHits() const
Return Missing-ET-Sig hits.
uint32_t energyRoiWord2() const
Return packed Energy RoI word 2.
int sumEtHits() const
Return Sum-ET hits.
int jetEtHits() const
Return Jet-ET hits.
int jetEtError() const
Return Jet-ET error flag (bit 1 Parity)
bool setRoiWord(uint32_t roiWord)
Set RoI word with ID check.
int missingEtError() const
Return Missing-ET error flag (bit 1 Parity)
int missingEtHits() const
Return Missing-ET hits.
int sumEtError() const
Return Sum-ET error flag (bit 1 Parity)
int missingEtSigError() const
Return Missing-ET-Sig error flag (bit 1 Parity)
uint32_t jetEtRoiWord() const
Return packed Jet-Et RoI word.
int etError() const
Return Et error flags (bit 0 Overflow, bit 1 Parity)
int exError() const
Return Ex error flags (bit 0 Overflow, bit 1 Parity)
uint32_t energyRoiWord0() const
Return packed Energy RoI word 0.
int eyError() const
Return Ey error flags (bit 0 Overflow, bit 1 Parity)
bool setRoiWord(uint32_t roiWord)
Set RoI word with ID check.
uint32_t roiWord() const
Return packed RoI word.
int error() const
Return error flags (bit 0 Saturation, bit 1 Parity)
int hits() const
Return Jet hit map (8 bits Main or 4 bits Forward)
int jem() const
Return JEM number (0-15)
int crate() const
Return crate number (0-1)
Jet/Energy Processor RoI container for writing bytestream.
const CMMRoI * CmmRoi() const
Return pointer to CMM RoIs.
const DataVector< CMMEtSums > * CmmSums() const
Return pointer to CMM energy sums collection.
const DataVector< JEMRoI > * JemRoi() const
Return pointer to JEM RoI collection.
const DataVector< CMMJetHits > * CmmHits() const
Return pointer to CMM hit sums collection.
static const InterfaceID IID_IJepRoiByteStreamTool("JepRoiByteStreamTool", 1, 1)
Extra patterns decribing particle interation process.