10#include "GaudiKernel/IInterface.h"
11#include "GaudiKernel/MsgStream.h"
12#include "GaudiKernel/StatusCode.h"
50 const std::string &name,
51 const IInterface *parent)
53 m_cpmMaps(
"LVL1::CpmMappingTool/CpmMappingTool"),
54 m_errorTool(
"LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
60 declareInterface<CpByteStreamV2Tool>(
this);
63 "Crate/Module/Channel to Eta/Phi/Layer mapping tool");
65 "Tool to collect errors for monitoring");
68 "Offset of CP crate numbers in bytestream");
70 "Offset of CP crate numbers in RDOs");
74 "ROB fragment source identifiers");
78 "Format version number in sub-block header");
80 "Format identifier (0-1) in sub-block header");
82 "The number of S-Links per crate");
84 "The number of slices in the simulation");
86 "If >0, the number of slices in bytestream");
88 "Minimum crate number, allows partial output");
90 "Maximum crate number, allows partial output");
115 return StatusCode::SUCCESS;
120 const EventContext& ctx,
121 const std::string& sgKey,
124 const std::vector<uint32_t>& vID(
sourceIDs());
128 ATH_MSG_DEBUG(
"Number of ROB fragments:" << robFrags.size());
129 return convert(sgKey, robFrags, ttCollection);
133 const std::string& sgKey,
143 const EventContext& ctx,
144 const std::string& sgKey,
147 const std::vector<uint32_t>& vID(
sourceIDs());
151 ATH_MSG_DEBUG(
"Number of ROB fragments:" << robFrags.size());
152 return convert(sgKey, robFrags, tobCollection);
156 const std::string& sgKey,
166 const EventContext& ctx,
167 const std::string& sgKey,
170 const std::vector<uint32_t>& vID(
sourceIDs());
174 ATH_MSG_DEBUG(
"Number of ROB fragments:" << robFrags.size());
175 return convert(sgKey, robFrags, hitCollection);
179 const std::string& sgKey,
193 return StatusCode::FAILURE;
203 const uint16_t minorVersion =
m_srcIdMap.minorVersion();
232 int timeslicesNew = 1;
239 for (
int module = 1;
module <= m_modules; ++module)
241 const int mod =
module - 1;
245 if (mod % modulesPerSlink == 0)
247 const int daqOrRoi = 0;
248 const int slink = (
m_slinks == 2) ? 2 * (mod / modulesPerSlink)
249 : mod / modulesPerSlink;
252 msg() <<
"Treating crate " << hwCrate
253 <<
" slink " << slink <<
endmsg;
264 msg(MSG::ERROR) <<
"Inconsistent number of slices or "
265 <<
"triggered slice offsets in data for crate "
266 << hwCrate <<
" slink " << slink <<
endmsg;
267 return StatusCode::FAILURE;
275 <<
"Slices/offset: " << timeslices <<
" " << trigCpm;
276 if (timeslices != timeslicesNew)
278 msg() <<
" modified to " << timeslicesNew <<
" " << trigCpmNew;
283 userHeader.
setCpm(trigCpmNew);
284 const uint32_t rodIdCpm =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
287 theROD->push_back(userHeader.
header());
289 if (
debug)
msg() <<
"Module " <<
module << endmsg;
294 for (
int slice = 0; slice < timeslicesNew; ++slice)
298 hwCrate, module, timeslicesNew);
300 if (neutralFormat)
break;
317 std::vector<int> emData;
318 std::vector<int> hadData;
319 std::vector<int> emError;
320 std::vector<int> hadError;
325 for (
int slice = 0; slice < timeslicesNew; ++slice)
335 const int index = ( neutralFormat ) ? 0 : slice;
338 hadData[slice], emErr, hadErr);
349 subBlock->
setStatus(failingBCN, gLinkTimeout, gLinkDown,
350 moduleError, fIFOOverflow, bCNMismatch,
351 gLinkProtocol, gLinkParity);
361 for (pos = cpmBlocks.
begin(); pos != cpmBlocks.
end(); ++pos)
364 if ( !subBlock->
pack())
366 msg(MSG::ERROR) <<
"CPM sub-block packing failed" <<
endmsg;
367 return StatusCode::FAILURE;
371 msg() <<
"CPM sub-block data words: "
374 subBlock->
write(theROD);
380 for (
int cmx = 0; cmx <
m_cmxs; ++cmx)
388 for (
int slice = 0; slice < timeslicesNew; ++slice)
394 if (neutralFormat)
break;
399 for (
int cpm = 1; cpm <=
m_modules; ++cpm)
401 for (
int chip = 0; chip <
m_chips; ++chip)
403 for (
int loc = 0; loc <
m_locs; ++loc)
405 const int key =
tobKey(crate, cmx, cpm, chip, loc);
410 std::vector<int> energy;
411 std::vector<int> isolation;
412 std::vector<int>
error;
413 std::vector<unsigned int> presence;
418 for (
int slice = 0; slice < timeslicesNew; ++slice)
427 const int index = ( neutralFormat ) ? 0 : slice;
429 subBlock->
setTob(slice, cpm, chip, loc, energy[slice],
430 isolation[slice], err);
442 const int key =
hitsKey(crate, cmx, source);
446 std::vector<unsigned int> hits0;
447 std::vector<unsigned int> hits1;
448 std::vector<int> err0;
449 std::vector<int> err1;
454 for (
int slice = 0; slice < timeslicesNew; ++slice)
458 const int index = ( neutralFormat ) ? 0 : slice;
460 subBlock->
setHits(slice, source, 0, hits0[slice],
462 subBlock->
setHits(slice, source, 1, hits1[slice],
474 if ( !subBlock->pack())
476 msg(MSG::ERROR) <<
"CMX-Cp sub-block packing failed" <<
endmsg;
477 return StatusCode::FAILURE;
481 msg() <<
"CMX-Cp sub-block data words: "
482 << subBlock->dataWords() <<
endmsg;
484 subBlock->write(theROD);
489 return StatusCode::SUCCESS;
506 for (
int slink = 0; slink < maxSlinks; ++slink)
508 const int daqOrRoi = 0;
509 const uint32_t rodId =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
511 const uint32_t robId =
m_srcIdMap.getRobID(rodId);
528 const std::string& sgKey,
534 ld.coreOverlap = sgKey.ends_with(
"Overlap") || sgKey.ends_with (
"OverlapAux.");
545 std::set<uint32_t> dupCheck;
548 for (; rob != robEnd; ++rob)
551 ATH_MSG_DEBUG(
"Treating ROB fragment " << robCount <<
" source_id = " << std::hex << (*rob)->rob_source_id() << std::dec);
555 const uint32_t robid = (*rob)->source_id();
556 if ((*rob)->nstatus() > 0)
559 (*rob)->status(robData);
563 if (
debug)
msg() <<
"ROB status error - skipping fragment" <<
endmsg;
570 if (!dupCheck.insert(robid).second)
582 (*rob)->rod_data(payloadBeg);
583 payloadEnd = payloadBeg + (*rob)->rod_ndata();
584 payload = payloadBeg;
585 if (payload == payloadEnd)
592 const uint32_t sourceID = (*rob)->rod_source_id();
603 msg() <<
"Wrong source identifier in data: ROD "
604 << MSG::hex << sourceID <<
" ROB " << robid
611 const int minorVersion = (*rob)->rod_version() & 0xffff;
613 if (minorVersion <=
m_srcIdMap.minorVersionPreLS1())
618 const int rodCrate =
m_srcIdMap.crate(sourceID);
621 msg() <<
"Treating crate " << rodCrate
634 const int headerWords = userHeader.
words();
635 if (headerWords != 1)
638 if (
debug)
msg() <<
"Unexpected number of user header words: "
642 for (
int i = 0; i < headerWords; ++i) ++payload;
644 const int trigCpm = userHeader.
cpm();
647 msg() <<
"Minor format version number: " << MSG::hex
648 << minorVersion << MSG::dec <<
endmsg
649 <<
"Triggered slice offset: " << trigCpm <<
endmsg;
655 while (payload != payloadEnd)
676 cmxCpSubBlock.
clear();
677 payload = cmxCpSubBlock.
read(payload, payloadEnd);
678 if (cmxCpSubBlock.
crate() != rodCrate)
680 if (
debug)
msg() <<
"Inconsistent crate number in ROD source ID"
707 payload = cpmSubBlock.
read(payload, payloadEnd);
708 if (cpmSubBlock.
crate() != rodCrate)
710 if (
debug)
msg() <<
"Inconsistent crate number in ROD source ID"
731 return StatusCode::SUCCESS;
743 const int hwCrate = subBlock->
crate();
747 const int timeslices = subBlock->
timeslices();
748 const int sliceNum = subBlock->
slice();
751 msg() <<
"CMX-CP: Crate " << hwCrate
752 <<
" Position " << cmx
753 <<
" Firmware " << firmware
754 <<
" Summing " << summing
755 <<
" Total slices " << timeslices
756 <<
" Slice " << sliceNum
759 if (timeslices <= trigCpm)
761 if (
debug)
msg() <<
"Triggered slice from header "
762 <<
"inconsistent with number of slices: "
763 << trigCpm <<
", " << timeslices <<
endmsg;
767 if (timeslices <= sliceNum)
769 if (
debug)
msg() <<
"Total slices inconsistent with slice number: "
770 << timeslices <<
", " << sliceNum <<
endmsg;
780 msg() <<
"CMX-CP sub-block unpacking failed: " << errMsg <<
endmsg;
791 const int subStatus = dErr.
error();
795 const int sliceBeg = ( neutralFormat ) ? 0 : sliceNum;
796 const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
797 for (
int slice = sliceBeg; slice < sliceEnd; ++slice)
806 for (
int cpm = 1; cpm <=
m_modules; ++cpm)
808 const unsigned int presenceMap = subBlock->
presenceMap(slice, cpm);
809 for (
int tob = 0; tob <
m_maxTobs; ++tob)
811 const int energy = subBlock->
energy(slice, cpm, tob);
812 const int isolation = subBlock->
isolation(slice, cpm, tob);
814 if (energy == 0 && isolation == 0 &&
error == 0)
break;
815 const int loc = subBlock->
localCoord(slice, cpm, tob);
816 const int chip = subBlock->
chip(slice, cpm, tob);
829 const int key =
tobKey(crate, cmx, cpm, chip, loc);
833 ld.energyVec.assign(timeslices, 0);
834 ld.isolVec.assign(timeslices, 0);
835 ld.errorVec.assign(timeslices, 0);
836 ld.presenceMapVec.assign(timeslices, 0);
837 ld.energyVec[slice] = energy;
838 ld.isolVec[slice] = isolation;
839 ld.errorVec[slice] =
error;
840 ld.presenceMapVec[slice] = presenceMap;
842 std::make_unique<LVL1::CMXCPTob>(swCrate, cmx, cpm, chip, loc,
843 ld.energyVec, ld.isolVec, ld.errorVec,
844 ld.presenceMapVec, trigCpm);
845 tdata.
m_tobMap.insert(std::make_pair(key, tbp.get()));
850 ld.energyVec = tb->energyVec();
851 ld.isolVec = tb->isolationVec();
852 ld.errorVec = tb->errorVec();
853 ld.presenceMapVec = tb->presenceMapVec();
854 const int nsl = ld.energyVec.size();
855 if (timeslices != nsl)
857 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
862 if (ld.energyVec[slice] != 0 || ld.isolVec[slice] != 0 ||
863 ld.errorVec[slice] != 0)
865 if (
debug)
msg() <<
"Duplicate data for slice " << slice <<
endmsg;
869 ld.energyVec[slice] = energy;
870 ld.isolVec[slice] = isolation;
871 ld.errorVec[slice] =
error;
872 ld.presenceMapVec[slice] = presenceMap;
873 tb->addTob(ld.energyVec, ld.isolVec, ld.errorVec, ld.presenceMapVec);
885 for (
int source = 0; source < maxSid; ++source)
892 const unsigned int hits0 = subBlock->
hits(slice, source, 0);
893 const unsigned int hits1 = subBlock->
hits(slice, source, 1);
894 int err0 = subBlock->
hitsError(slice, source, 0);
895 int err1 = subBlock->
hitsError(slice, source, 1);
896 int overflow = subBlock->
roiOverflow(slice, source);
900 err0 = err0Bits.
error();
904 err1 = err1Bits.
error();
905 if (hits0 || hits1 || err0 || err1)
907 const int key =
hitsKey(crate, cmx, source);
911 ld.hitsVec0.assign(timeslices, 0);
912 ld.hitsVec1.assign(timeslices, 0);
913 ld.errVec0.assign(timeslices, 0);
914 ld.errVec1.assign(timeslices, 0);
915 ld.hitsVec0[slice] = hits0;
916 ld.hitsVec1[slice] = hits1;
917 ld.errVec0[slice] = err0;
918 ld.errVec1[slice] = err1;
920 std::make_unique<LVL1::CMXCPHits>(swCrate, cmx, source,
921 ld.hitsVec0, ld.hitsVec1,
922 ld.errVec0, ld.errVec1, trigCpm);
923 hdata.
m_hitsMap.insert(std::make_pair(key, chp.get()));
928 ld.hitsVec0 = ch->hitsVec0();
929 ld.hitsVec1 = ch->hitsVec1();
930 ld.errVec0 = ch->errorVec0();
931 ld.errVec1 = ch->errorVec1();
932 const int nsl = ld.hitsVec0.size();
933 if (timeslices != nsl)
935 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
940 if (ld.hitsVec0[slice] != 0 || ld.hitsVec1[slice] != 0 ||
941 ld.errVec0[slice] != 0 || ld.errVec1[slice] != 0)
943 if (
debug)
msg() <<
"Duplicate data for slice " << slice <<
endmsg;
947 ld.hitsVec0[slice] = hits0;
948 ld.hitsVec1[slice] = hits1;
949 ld.errVec0[slice] = err0;
950 ld.errVec1[slice] = err1;
951 ch->addHits(ld.hitsVec0, ld.hitsVec1, ld.errVec0, ld.errVec1);
971 const int hwCrate = subBlock->
crate();
972 const int module = subBlock->
module();
973 const int timeslices = subBlock->
timeslices();
974 const int sliceNum = subBlock->
slice();
977 msg() <<
"CPM: Crate " << hwCrate
978 <<
" Module " << module
979 <<
" Total slices " << timeslices
980 <<
" Slice " << sliceNum <<
endmsg;
984 if (
debug)
msg() <<
"Unexpected module number: " <<
module << endmsg;
988 if (timeslices <= trigCpm)
990 if (
debug)
msg() <<
"Triggered slice from header "
991 <<
"inconsistent with number of slices: "
992 << trigCpm <<
", " << timeslices <<
endmsg;
996 if (timeslices <= sliceNum)
998 if (
debug)
msg() <<
"Total slices inconsistent with slice number: "
999 << timeslices <<
", " << sliceNum <<
endmsg;
1009 msg() <<
"CPM sub-block unpacking failed: " << errMsg <<
endmsg;
1019 const int subStatus = dErr.
error();
1021 const int sliceBeg = ( neutralFormat ) ? 0 : sliceNum;
1022 const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
1023 for (
int slice = sliceBeg; slice < sliceEnd; ++slice)
1028 for (
int chan = 0; chan <
m_channels; ++chan)
1030 if (!subStatus && !subBlock->
anyTowerData(chan))
continue;
1031 const int em = subBlock->
emData(slice, chan);
1032 const int had = subBlock->
hadData(slice, chan);
1033 const int emErr = subBlock->
emError(slice, chan);
1034 const int hadErr = subBlock->
hadError(slice, chan);
1035 int emErr1 = subStatus;
1041 emErr1 = emErrBits.
error();
1043 int hadErr1 = subStatus;
1049 hadErr1 = hadErrBits.
error();
1051 if (em || had || emErr1 || hadErr1)
1058 if (layer == ld.coreOverlap)
1060 const unsigned int key = ld.towerKey.ttKey(
phi,
eta);
1064 ld.emVec.assign(timeslices, 0);
1065 ld.hadVec.assign(timeslices, 0);
1066 ld.emErrVec.assign(timeslices, 0);
1067 ld.hadErrVec.assign(timeslices, 0);
1068 ld.emVec[slice] = em;
1069 ld.hadVec[slice] = had;
1070 ld.emErrVec[slice] = emErr1;
1071 ld.hadErrVec[slice] = hadErr1;
1073 std::make_unique<LVL1::CPMTower>(
phi,
eta, ld.emVec, ld.emErrVec,
1074 ld.hadVec, ld.hadErrVec, trigCpm);
1075 data.m_ttMap.insert(std::make_pair(key, ttp.get()));
1076 data.m_ttCollection->push_back(std::move(ttp));
1080 ld.emVec = tt->emEnergyVec();
1081 ld.hadVec = tt->hadEnergyVec();
1082 ld.emErrVec = tt->emErrorVec();
1083 ld.hadErrVec = tt->hadErrorVec();
1084 const int nsl = ld.emVec.size();
1085 if (timeslices != nsl)
1089 msg() <<
"Inconsistent number of slices in sub-blocks"
1095 if (ld.emVec[slice] != 0 || ld.hadVec[slice] != 0 ||
1096 ld.emErrVec[slice] != 0 || ld.hadErrVec[slice] != 0)
1098 if (
debug)
msg() <<
"Duplicate data for slice "
1103 ld.emVec[slice] = em;
1104 ld.hadVec[slice] = had;
1105 ld.emErrVec[slice] = emErr1;
1106 ld.hadErrVec[slice] = hadErr1;
1107 tt->fill(ld.emVec, ld.emErrVec, ld.hadVec, ld.hadErrVec, trigCpm);
1111 else if (
verbose && (em || had || emErr || hadErr))
1113 msg(MSG::VERBOSE) <<
"Non-zero data but no channel mapping for channel "
1120 msg(MSG::VERBOSE) <<
"No CPM tower data for channel "
1121 << chan <<
" slice " << slice <<
endmsg;
1135 ConstCpmTowerMap::const_iterator mapIter = ttMap.find(key);
1136 if (mapIter != ttMap.end())
return mapIter->second;
1141 const unsigned int key)
const
1143 CpmTowerMap::const_iterator mapIter =
data.m_ttMap.find(key);
1144 if (mapIter !=
data.m_ttMap.end())
return mapIter->second;
1154 ConstCmxCpTobMap::const_iterator mapIter = tobMap.find(key);
1155 if (mapIter != tobMap.end())
return mapIter->second;
1160 const int key)
const
1162 CmxCpTobMap::const_iterator mapIter =
data.m_tobMap.find(key);
1163 if (mapIter !=
data.m_tobMap.end())
return mapIter->second;
1173 ConstCmxCpHitsMap::const_iterator mapIter = hitsMap.find(key);
1174 if (mapIter != hitsMap.end())
return mapIter->second;
1179 const int key)
const
1181 CmxCpHitsMap::const_iterator mapIter =
data.m_hitsMap.find(key);
1182 if (mapIter !=
data.m_hitsMap.end())
return mapIter->second;
1198 for (; pos != pose; ++pos)
1201 const unsigned int key = towerKey.
ttKey(tt->phi(), tt->eta());
1202 ttMap.insert(std::make_pair(key, tt));
1210 const tobCollection,
1218 for (; pos != pose; ++pos)
1222 const int cmx = tob->
cmx();
1223 const int cpm = tob->
cpm();
1224 const int chip = tob->
chip();
1226 const int key =
tobKey(crate, cmx, cpm, chip, loc);
1227 tobMap.insert(std::make_pair(key, tob));
1235 const hitCollection,
1243 for (; pos != pose; ++pos)
1247 const int cmx = hits->cmx();
1248 const int source = hits->source();
1249 const int key =
hitsKey(crate, cmx, source);
1250 hitsMap.insert(std::make_pair(key, hits));
1258 const int chip,
const int loc)
const
1260 return (((((((crate << 1) | cmx) << 4) | cpm) << 4) | chip) << 2) | loc;
1266 const int source)
const
1268 return (((crate << 1) | cmx) << 3) | source;
1274 const int modulesPerSlink,
int ×lices,
int &trigCpm,
1282 for (
int mod = module; mod < module + modulesPerSlink; ++mod)
1284 for (
int chan = 0; chan <
m_channels; ++chan)
1289 if ( !
m_cpmMaps->mapping(crate, mod, chan,
eta,
phi, layer))
continue;
1290 const unsigned int key = towerKey.
ttKey(
phi,
eta);
1292 if ( !tt )
continue;
1293 const int numdat = 4;
1294 std::vector<int> sums(numdat);
1295 std::vector<int> sizes(numdat);
1296 sums[0] = std::accumulate((tt->emEnergyVec()).begin(),
1297 (tt->emEnergyVec()).end(), 0);
1298 sums[1] = std::accumulate((tt->hadEnergyVec()).begin(),
1299 (tt->hadEnergyVec()).end(), 0);
1300 sums[2] = std::accumulate((tt->emErrorVec()).begin(),
1301 (tt->emErrorVec()).end(), 0);
1302 sums[3] = std::accumulate((tt->hadErrorVec()).begin(),
1303 (tt->hadErrorVec()).end(), 0);
1304 sizes[0] = (tt->emEnergyVec()).size();
1305 sizes[1] = (tt->hadEnergyVec()).size();
1306 sizes[2] = (tt->emErrorVec()).size();
1307 sizes[3] = (tt->hadErrorVec()).size();
1308 const int peak = tt->peak();
1309 for (
int i = 0; i < numdat; ++i)
1311 if (sums[i] == 0)
continue;
1317 else if (slices != sizes[i] || trigC != peak)
return false;
1322 if (module / modulesPerSlink ==
m_slinks - 1)
1324 for (
int cmx = 0; cmx <
m_cmxs; ++cmx)
1326 for (
int cpm = 1; cpm <=
m_modules; ++ cpm)
1328 for (
int chip = 0; chip <
m_chips; ++chip)
1330 for (
int loc = 0; loc <
m_locs; ++loc)
1332 const int key =
tobKey(crate, cmx, cpm, chip, loc);
1337 const int numdat = 3;
1338 std::vector<int> sums(numdat);
1339 std::vector<int> sizes(numdat);
1340 sums[0] = std::accumulate((tob->
energyVec()).begin(),
1342 sums[1] = std::accumulate((tob->
isolationVec()).begin(),
1344 sums[2] = std::accumulate((tob->
errorVec()).begin(),
1348 sizes[2] = (tob->
errorVec()).size();
1349 const int peak = tob->
peak();
1350 for (
int i = 0; i < numdat; ++i)
1352 if (sums[i] == 0)
continue;
1358 else if (slices != sizes[i] || trigC != peak)
return false;
1366 const int key =
hitsKey(crate, cmx, source);
1372 const int numdat = 4;
1373 std::vector<unsigned int> sums(numdat);
1374 std::vector<int> sizes(numdat);
1375 sums[0] = std::accumulate((hits->hitsVec0()).begin(),
1376 (hits->hitsVec0()).end(), 0);
1377 sums[1] = std::accumulate((hits->hitsVec1()).begin(),
1378 (hits->hitsVec1()).end(), 0);
1379 sums[2] = std::accumulate((hits->errorVec0()).begin(),
1380 (hits->errorVec0()).end(), 0);
1381 sums[3] = std::accumulate((hits->errorVec1()).begin(),
1382 (hits->errorVec1()).end(), 0);
1383 sizes[0] = (hits->hitsVec0()).size();
1384 sizes[1] = (hits->hitsVec1()).size();
1385 sizes[2] = (hits->errorVec0()).size();
1386 sizes[3] = (hits->errorVec1()).size();
1387 const int peak = hits->peak();
1388 for (
int i = 0; i < numdat; ++i)
1390 if (sums[i] == 0)
continue;
1396 else if (slices != sizes[i] || trigC != peak)
return false;
1403 timeslices = slices;
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define CHECK(...)
Evaluate an expression and check for errors.
char data[hepevt_bytes_allocation_ATLAS]
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.
DataModel_detail::iterator< DataVector > iterator
Standard iterator.
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-CP data post LS1.
unsigned int hits(int slice, int source, int flag) const
Return hit/topo counts for given source ID and HL flag.
int roiOverflow(int slice, int source) const
Return RoI overflow for given source ID.
void clear()
Clear all data.
int energy(int slice, int cpm, int tob) const
Return energy for given cpm and tob.
bool unpack()
Unpack data.
void setPresenceMap(int slice, int cpm, unsigned int map)
Store presence map.
int hitsError(int slice, int source, int flag) const
Return hit error for given source ID and HL flag.
unsigned int presenceMap(int slice, int cpm) const
Return presence map for given CPM.
void setHits(int slice, int source, int flag, unsigned int hits, int error)
Store hit counts for given source ID and HL flag.
void setRoiOverflow(int slice, int source, int overflow)
Store RoI overflow for given source ID.
int chip(int slice, int cpm, int tob) const
Return chip for given cpm and tob.
int localCoord(int slice, int cpm, int tob) const
Return Local coordinate for given cpm and tob.
int isolation(int slice, int cpm, int tob) const
Return isolation for given cpm and tob.
int tobError(int slice, int cpm, int tob) const
Return error bits for given cpm and tob.
void setTob(int slice, int cpm, int chip, int loc, int energy, int isol, int error)
Store TOB (RoI) data for given CPM, chip, local coord.
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 CPM data post LS1.
int hadData(int slice, int channel) const
Return Had data for given channel.
int hadError(int slice, int channel) const
Return Had error for given channel.
int emError(int slice, int channel) const
Return Em error for given channel.
bool unpack()
Unpack data.
int emData(int slice, int channel) const
Return Em data for given channel.
void clear()
Clear all data.
int timeslices() const
Return number of timeslices.
void fillTowerData(int slice, int channel, int em, int had, int emErr, int hadErr)
Store trigger tower data.
void setCpmHeader(int version, int format, int slice, int crate, int module, int timeslices)
Store CPM header.
bool anyTowerData(int channel) const
Return true if there is tower data for given channel.
void setStatus(uint32_t failingBCN, bool glinkTimeout, bool glinkDown, bool upstreamError, bool daqOverflow, bool bcnMismatch, bool glinkProtocol, bool glinkParity)
Store error status trailer.
int unpackErrorCode() const
Return the unpacking error code.
uint32_t subStatus() const
Return Sub-status word.
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.
static void data(const std::vector< int > &oldVec, std::vector< int > &newVec, int newSlices)
Return modified data vector<int>.
static int peak(int oldPeak, int oldSlices, int newSlices)
Return new triggered slice offset.
Summary of CP (EM/tau) hits produced by the merger modules.
TOB data received by the merger modules.
int peak() const
returns peak slice number
const std::vector< int > & isolationVec() const
returns isolation
const std::vector< int > & errorVec() const
returns error
int crate() const
Data accessors.
const std::vector< int > & energyVec() const
For multi-slice readout.
int chip() const
returns chip number (3 or 4 bits?)
int cmx() const
returns CMX number (0/1)==(Left/Right)==(Tau/Em)
int cpm() const
returns CPM number
int location() const
returns location (3 or 2 bits?)
Cluster Processor container for writing bytestream.
The CPMTower class contains the TriggerTower information received by the Cluster Processor Modules.
int error() const
Return the full error word.
void set(ErrorBit bit, int value=1)
Set an error bit or data.
int get(ErrorBit bit) const
Return an error bit or data.
The TriggerTowerKey object provides the key for each trigger tower depending on its eta-phi coords.
virtual unsigned int ttKey(const TriggerTower &tower)
returns the key of the passed tower
static const InterfaceID IID_ICpByteStreamV2Tool("CpByteStreamV2Tool", 1, 1)