12#include "GaudiKernel/IInterface.h"
13#include "GaudiKernel/MsgStream.h"
14#include "GaudiKernel/StatusCode.h"
41 const std::string &name,
42 const IInterface *parent)
45 m_errorTool(
"LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
49 declareInterface<CpmRoiByteStreamV2Tool>(
this);
52 "Tool to collect errors for monitoring");
54 "Offset of CP crate numbers in bytestream");
56 "Offset of CP crate numbers in RDOs");
60 "ROB fragment source identifiers");
62 "ROB fragment source identifiers for RoIBs");
66 "Format version number in sub-block header");
68 "Format identifier (0-1) in sub-block header");
70 "The number of S-Links per crate");
72 "Minimum crate number, allows partial output");
74 "Maximum crate number, allows partial output");
77 "Set it for M7 raw data");
97 return StatusCode::SUCCESS;
103 const std::string& sgKey,
106 const std::vector<uint32_t>& vID(
sourceIDs(sgKey));
109 m_robDataProvider->getROBData(Gaudi::Hive::currentContext(), vID, robFrags,
"CpmRoiByteStreamV2Tool");
110 ATH_MSG_DEBUG(
"Number of ROB fragments:" << robFrags.size());
111 return convert(robFrags, collection);
127 std::set<uint32_t> dupCheck;
128 std::set<uint32_t> dupRoiCheck;
131 for (; rob != robEnd; ++rob)
137 msg() <<
"Treating ROB fragment " << robCount <<
endmsg;
142 uint32_t robid = (*rob)->source_id();
143 if ((*rob)->nstatus() > 0)
146 (*rob)->status(robData);
150 if (
debug)
msg() <<
"ROB status error - skipping fragment" <<
endmsg;
157 if (!dupCheck.insert(robid).second)
169 (*rob)->rod_data(payloadBeg);
170 payloadEnd = payloadBeg + (*rob)->rod_ndata();
171 payload = payloadBeg;
172 if (payload == payloadEnd)
179 const uint32_t sourceID = (*rob)->rod_source_id();
190 msg() <<
"Wrong source identifier in data: "
191 << MSG::hex << sourceID << MSG::dec <<
endmsg;
197 const int minorVersion = (*rob)->rod_version() & 0xffff;
198 if (minorVersion <=
m_srcIdMap.minorVersionPreLS1())
203 const int rodCrate =
m_srcIdMap.crate(sourceID);
206 msg() <<
"Treating crate " << rodCrate
215 const int headerWords = userHeader.
words();
216 if (headerWords != 1 )
219 if (
debug)
msg() <<
"Unexpected number of user header words: "
223 for (
int i = 0; i < headerWords; ++i) ++payload;
229 while (payload != payloadEnd)
235 payload = subBlock.
read(payload, payloadEnd);
238 msg() <<
"CPM RoI sub-block: Crate " << subBlock.
crate()
247 msg() <<
"CPM RoI sub-block unpacking failed: " << errMsg <<
endmsg;
252 const int numChips = 8;
253 const int numLocs = 2;
254 const int numTypes = 2;
255 for (
int chip = 0; chip < numChips; ++chip)
257 for (
int loc = 0; loc < numLocs; ++loc)
274 uint32_t roiWord = *payload;
276 roiWord |= 0x80000000;
282 if (
debug)
msg() <<
"Inconsistent RoI crate number: "
289 if (
debug)
msg() <<
"Invalid CPM number: "
294 const uint32_t location = roiWord & 0xffff0000;
295 if (dupRoiCheck.insert(location).second)
304 if (
debug)
msg() <<
"Duplicate RoI word "
305 << MSG::hex << roiWord << MSG::dec <<
endmsg;
312 if (
debug)
msg() <<
"Invalid RoI word "
313 << MSG::hex << roiWord << MSG::dec <<
endmsg;
325 msg() <<
"Number of RoIs read = " << roiCollection->
size() <<
endmsg;
328 return StatusCode::SUCCESS;
342 "CpmRoiByteStreamV2") );
343 const uint16_t minorVersion =
m_srcIdMap.minorVersion();
361 msg() <<
"Number of RoIs to be written = " << roiCollection->
size()
362 <<
" (collection), " << roiMap.size() <<
" (map)"
366 CpmRoiMap::const_iterator mapIter = roiMap.begin();
367 CpmRoiMap::const_iterator mapIterEnd = roiMap.end();
378 for (
int module = 1;
module <= m_modules; ++module)
380 const int mod =
module - 1;
384 if (mod % modulesPerSlink == 0)
386 const int daqOrRoi = 1;
387 const int slink = (
m_slinks == 2) ? 2 * (mod / modulesPerSlink)
388 : mod / modulesPerSlink;
391 msg() <<
"Treating crate " << hwCrate
392 <<
" slink " << slink <<
endmsg
396 const uint32_t rodIdCpm =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
402 theROD->push_back(userHeader.
header());
405 if (
debug)
msg() <<
"Module " <<
module << endmsg;
417 for (; mapIter != mapIterEnd; ++mapIter)
420 if (roi->
crate() < crate)
continue;
421 if (roi->
crate() > crate)
break;
422 if (roi->
cpm() < module)
continue;
423 if (roi->
cpm() > module)
break;
426 if (neutralFormat) subBlock.
fillRoi(*roi);
427 else theROD->push_back(roi->
roiWord());
436 if ( !subBlock.
pack())
438 msg(MSG::ERROR) <<
"CPMTobRoI sub-block packing failed" <<
endmsg;
439 return StatusCode::FAILURE;
443 msg() <<
"CPMTobRoI sub-block data words: "
446 subBlock.
write(theROD);
457 return StatusCode::SUCCESS;
478 for (
int slink = 0; slink < maxSlinks; ++slink)
480 const int daqOrRoi = 1;
481 const uint32_t rodId =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
483 const uint32_t robId =
m_srcIdMap.getRobID(rodId);
486 if (slink < 2)
sourceIDs.push_back(robId);
488 else if (slink >= 2)
sourceIDs.push_back(robId);
497 const std::string &sgKey)
const
499 const std::string flag(
"RoIB");
500 const std::string::size_type pos = sgKey.find(flag);
502 (pos == std::string::npos || pos != sgKey.length() - flag.length());
509 static const std::vector<uint32_t> sourceIDsRoIB =
makeSourceIDs(roiDaq);
510 return sourceIDsRoIB;
525 for (; pos != pose; ++pos)
529 const int crate = roi->
crate();
530 const int cpm = roi->
cpm();
531 const int chip = roi->
chip();
532 const int loc = roi->
location() >> 2;
533 const uint32_t key = (((((((crate << 4) | cpm) << 3) | chip) << 1) | loc) << 1) |
type;
534 roiMap.insert(std::make_pair(key, roi));
#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.
size_type size() const noexcept
Returns the number of elements in 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 CPM RoI data (neutral format) post LS1.
void clear()
Clear all data.
void setRoiHeader(int version, int crate, int module)
Store header.
void fillRoi(LVL1::CPMTobRoI roi)
Store RoI.
bool unpack()
Unpack data.
LVL1::CPMTobRoI roi(int chip, int loc, int type) const
Return RoI for given chip and location (left/right) and type (em/tau)
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.
uint32_t roiWord() const
Return packed RoI word.
int energy() const
Return energy.
int chip() const
Return CP chip number (0-7)
int isolation() const
Return isolation.
int location() const
Return location (RoI local coords) (0-7)
int type() const
Return type em/tau (0/1)
int crate() const
Return crate number (0-1)
bool setRoiWord(uint32_t roiWord)
Set RoI word with ID check.
int cpm() const
Return CPM number (1-14)
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
static const InterfaceID IID_ICpmRoiByteStreamV2Tool("CpmRoiByteStreamV2Tool", 1, 1)