10#include "GaudiKernel/IInterface.h"
11#include "GaudiKernel/MsgStream.h"
12#include "GaudiKernel/StatusCode.h"
51 const std::string& name,
52 const IInterface* parent)
54 m_jemMaps(
"LVL1::JemMappingTool/JemMappingTool"),
55 m_errorTool(
"LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
59 declareInterface<JepByteStreamTool>(
this);
62 "Crate/Module/Channel to Eta/Phi/Layer mapping tool");
65 "Offset of JEP crate numbers in bytestream");
67 "Offset of JEP crate numbers in RDOs");
69 "The number of S-Links per crate");
73 "ROB fragment source identifiers");
77 "Format version number in sub-block header");
79 "Format identifier (0-1) in sub-block header");
81 "The number of slices in the simulation");
83 "If >0, the number of slices in bytestream");
98 msg(MSG::INFO) <<
"Initializing " << name() <<
endmsg;
101 if (
sc.isFailure()) {
107 if (
sc.isFailure()) {
114 return StatusCode::SUCCESS;
121 return StatusCode::SUCCESS;
127 const std::string& sgKey,
138 const std::string& sgKey,
149 const std::string& sgKey,
160 const std::string& sgKey,
171 const std::string& sgKey,
191 const uint16_t minorVersion =
m_srcIdMap.minorVersion();
229 int timeslicesNew = 1;
231 for (
int crate = 0; crate <
m_crates; ++crate) {
234 for (
int module = 0;
module < m_modules; ++module) {
238 if (module % modulesPerSlink == 0) {
239 const int daqOrRoi = 0;
240 const int slink =
module / modulesPerSlink;
242 msg() <<
"Treating crate " << hwCrate
243 <<
" slink " << slink <<
endmsg;
256 msg(MSG::ERROR) <<
"Inconsistent number of slices or "
257 <<
"triggered slice offsets in data for crate "
258 << hwCrate <<
" slink " << slink <<
endmsg;
259 return StatusCode::FAILURE;
266 <<
"Slices/offset: " << timeslices <<
" " << trigJem;
267 if (timeslices != timeslicesNew) {
268 msg() <<
" modified to " << timeslicesNew <<
" " << trigJemNew;
273 userHeader.
setJem(trigJemNew);
274 const uint32_t rodIdJem =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
277 theROD->push_back(userHeader.
header());
279 if (
debug)
msg() <<
"Module " <<
module << endmsg;
286 for (
int slice = 0; slice < timeslicesNew; ++slice) {
289 hwCrate, module, timeslicesNew);
291 if (neutralFormat)
break;
297 for (
int chan = 0; chan <
m_channels; ++chan) {
304 std::vector<int> emData;
305 std::vector<int> hadData;
306 std::vector<int> emErrors;
307 std::vector<int> hadErrors;
312 for (
int slice = 0; slice < timeslicesNew; ++slice) {
315 const int index = ( neutralFormat ) ? 0 : slice;
317 const JemJetElement jetEle(chan, emData[slice], hadData[slice],
332 std::vector<unsigned int>
vec;
334 for (
int slice = 0; slice < timeslicesNew; ++slice) {
335 const int index = ( neutralFormat ) ? 0 : slice;
342 std::vector<unsigned int> exVec;
343 std::vector<unsigned int> eyVec;
344 std::vector<unsigned int> etVec;
348 for (
int slice = 0; slice < timeslicesNew; ++slice) {
349 const int index = ( neutralFormat ) ? 0 : slice;
359 for (pos = jemBlocks.
begin(); pos != jemBlocks.
end(); ++pos) {
361 if ( !subBlock->
pack()) {
362 msg(MSG::ERROR) <<
"JEM sub-block packing failed" <<
endmsg;
363 return StatusCode::FAILURE;
366 msg() <<
"JEM sub-block data words: "
369 subBlock->
write(theROD);
384 for (
int slice = 0; slice < timeslicesNew; ++slice) {
386 const int cmmEnergyVersion = 2;
396 if (neutralFormat)
break;
402 for (
int dataID = 0; dataID < maxDataID; ++dataID) {
430 std::vector<unsigned int> ex;
431 std::vector<unsigned int> ey;
432 std::vector<unsigned int>
et;
433 std::vector<int> exErr;
434 std::vector<int> eyErr;
435 std::vector<int> etErr;
442 for (
int slice = 0; slice < timeslicesNew; ++slice) {
456 const int index = ( neutralFormat ) ? 0 : slice;
466 ex[slice], ey[slice],
et[slice],
467 exError, eyError, etError);
473 pos = cmmEnergyBlocks.
begin();
474 for (; pos != cmmEnergyBlocks.
end(); ++pos) {
476 if ( !subBlock->
pack()) {
477 msg(MSG::ERROR) <<
"CMM-Energy sub-block packing failed" <<
endmsg;
478 return StatusCode::FAILURE;
481 msg() <<
"CMM-Energy sub-block data words: "
484 subBlock->
write(theROD);
490 for (
int dataID = 0; dataID < maxDataID; ++dataID) {
523 std::vector<unsigned int> hits;
524 std::vector<int> errs;
527 for (
int slice = 0; slice < timeslicesNew; ++slice) {
529 const int index = ( neutralFormat ) ? 0 : slice;
534 subBlock->
setJetHits(slice, source, hits[slice],
541 jos = cmmJetBlocks.
begin();
542 for (; jos != cmmJetBlocks.
end(); ++jos) {
544 if ( !subBlock->
pack()) {
545 msg(MSG::ERROR) <<
"CMM-Jet sub-block packing failed" <<
endmsg;
546 return StatusCode::FAILURE;
549 msg() <<
"CMM-Jet sub-block data words: "
552 subBlock->
write(theROD);
556 return StatusCode::SUCCESS;
573 for (
int slink = 0; slink < maxSlinks; ++slink)
575 const int daqOrRoi = 0;
576 const uint32_t rodId =
m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
578 const uint32_t robId =
m_srcIdMap.getRobID(rodId);
595 const std::string& sgKey,
602 const std::string flag(
"Overlap");
603 const std::string::size_type pos = sgKey.find(flag);
605 (pos == std::string::npos || pos != sgKey.length() - flag.length()) ? 0 : 1;
620 std::set<uint32_t> dupCheck;
623 for (; rob != robEnd; ++rob) {
627 msg() <<
"Treating ROB fragment " << robCount <<
endmsg;
632 uint32_t robid = (*rob)->source_id();
633 if ((*rob)->nstatus() > 0) {
635 (*rob)->status(robData);
638 if (
debug)
msg() <<
"ROB status error - skipping fragment" <<
endmsg;
645 if (!dupCheck.insert(robid).second) {
656 (*rob)->rod_data(payloadBeg);
657 payloadEnd = payloadBeg + (*rob)->rod_ndata();
658 payload = payloadBeg;
659 if (payload == payloadEnd) {
665 const uint32_t sourceID = (*rob)->rod_source_id();
674 msg() <<
"Wrong source identifier in data: ROD "
675 << MSG::hex << sourceID <<
" ROB " << robid
680 const int rodCrate =
m_srcIdMap.crate(sourceID);
682 msg() <<
"Treating crate " << rodCrate
693 const int minorVersion = (*rob)->rod_version() & 0xffff;
695 const int headerWords = userHeader.
words();
696 if (headerWords != 1) {
698 if (
debug)
msg() <<
"Unexpected number of user header words: "
702 for (
int i = 0; i < headerWords; ++i) ++payload;
704 int trigJem = userHeader.
jem();
705 int trigCmm = userHeader.
jepCmm();
707 msg() <<
"Minor format version number: " << MSG::hex
708 << minorVersion << MSG::dec <<
endmsg
709 <<
"JEM triggered slice offset: " << trigJem <<
endmsg
710 <<
"CMM triggered slice offset: " << trigCmm <<
endmsg;
712 if (trigJem != trigCmm) {
713 const int newTrig = (trigJem > trigCmm) ? trigJem : trigCmm;
716 if (
debug)
msg() <<
"Changed both offsets to " << newTrig <<
endmsg;
722 while (payload != payloadEnd) {
732 cmmJetSubBlock.
clear();
733 payload = cmmJetSubBlock.
read(payload, payloadEnd);
734 if (cmmJetSubBlock.
crate() != rodCrate) {
735 if (
debug)
msg() <<
"Inconsistent crate number in ROD source ID"
748 cmmEnergySubBlock.
clear();
749 payload = cmmEnergySubBlock.
read(payload, payloadEnd);
750 if (cmmEnergySubBlock.
crate() != rodCrate) {
751 if (
debug)
msg() <<
"Inconsistent crate number in ROD source ID"
771 payload = jemSubBlock.
read(payload, payloadEnd);
772 if (jemSubBlock.
crate() != rodCrate) {
773 if (
debug)
msg() <<
"Inconsistent crate number in ROD source ID"
792 return StatusCode::SUCCESS;
805 const int hwCrate = subBlock->
crate();
809 const int timeslices = subBlock->
timeslices();
810 const int sliceNum = subBlock->
slice();
812 msg() <<
"CMM-Energy: Crate " << hwCrate
813 <<
" Module " << module
814 <<
" Firmware " << firmware
815 <<
" Summing " << summing
816 <<
" Total slices " << timeslices
817 <<
" Slice " << sliceNum <<
endmsg;
819 if (timeslices <= trigCmm) {
820 if (
debug)
msg() <<
"Triggered CMM slice from header "
821 <<
"inconsistent with number of slices: "
822 << trigCmm <<
", " << timeslices <<
endmsg;
826 if (timeslices <= sliceNum) {
827 if (
debug)
msg() <<
"Total slices inconsistent with slice number: "
828 << timeslices <<
", " << sliceNum <<
endmsg;
836 msg() <<
"CMM-Energy sub-block unpacking failed: " << errMsg <<
endmsg;
850 const int ssError = derr.
error();
851 const int sliceBeg = ( neutralFormat ) ? 0 : sliceNum;
852 const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
853 for (
int slice = sliceBeg; slice < sliceEnd; ++slice) {
857 for (
int source = 0; source < maxSid; ++source) {
879 const unsigned int ex = subBlock->
ex(slice, source);
880 const unsigned int ey = subBlock->
ey(slice, source);
881 const unsigned int et = subBlock->
et(slice, source);
882 int exErr = subBlock->
exError(slice, source);
883 int eyErr = subBlock->
eyError(slice, source);
884 int etErr = subBlock->
etError(slice, source);
905 exErr = exErrBits.
error();
906 eyErr = eyErrBits.
error();
907 etErr = etErrBits.
error();
908 if (ex || ey ||
et || exErr || eyErr || etErr) {
911 ld.exVec.assign(timeslices, 0);
912 ld.eyVec.assign(timeslices, 0);
913 ld.etVec.assign(timeslices, 0);
914 ld.exErrVec.assign(timeslices, 0);
915 ld.eyErrVec.assign(timeslices, 0);
916 ld.etErrVec.assign(timeslices, 0);
917 ld.exVec[slice] = ex;
918 ld.eyVec[slice] = ey;
919 ld.etVec[slice] =
et;
920 ld.exErrVec[slice] = exErr;
921 ld.eyErrVec[slice] = eyErr;
922 ld.etErrVec[slice] = etErr;
924 std::make_unique<LVL1::CMMEtSums>(swCrate, dataID, ld.etVec, ld.exVec, ld.eyVec,
925 ld.etErrVec, ld.exErrVec, ld.eyErrVec, trigCmm);
926 const int key = crate * 100 + dataID;
927 data.m_cmmEtMap.insert(std::make_pair(key, sumsp.get()));
928 data.m_cmmEtCollection->push_back(std::move(sumsp));
930 ld.exVec = sums->
ExVec();
931 ld.eyVec = sums->
EyVec();
932 ld.etVec = sums->
EtVec();
936 const int nsl = ld.exVec.size();
937 if (timeslices != nsl) {
938 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
943 if (ld.exVec[slice] != 0 || ld.eyVec[slice] != 0 || ld.etVec[slice] != 0 ||
944 ld.exErrVec[slice] != 0 || ld.eyErrVec[slice] != 0 ||
945 ld.etErrVec[slice] != 0) {
946 if (
debug)
msg() <<
"Duplicate data for slice " << slice <<
endmsg;
950 ld.exVec[slice] = ex;
951 ld.eyVec[slice] = ey;
952 ld.etVec[slice] =
et;
953 ld.exErrVec[slice] = exErr;
954 ld.eyErrVec[slice] = eyErr;
955 ld.etErrVec[slice] = etErr;
956 sums->
addEx(ld.exVec, ld.exErrVec);
957 sums->
addEy(ld.eyVec, ld.eyErrVec);
958 sums->
addEt(ld.etVec, ld.etErrVec);
967 if ( missEt || ssError ) {
971 ld.etVec.assign(timeslices, 0);
972 ld.etErrVec.assign(timeslices, 0);
973 ld.etVec[slice] = missEt;
974 ld.etErrVec[slice] = ssError;
976 std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
977 ld.etVec, ld.etVec, ld.etVec,
978 ld.etErrVec, ld.etErrVec, ld.etErrVec, trigCmm);
979 const int key = crate * 100 + dataID;
980 data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
981 data.m_cmmEtCollection->push_back(std::move(mapp));
983 ld.etVec =
map->EtVec();
984 ld.etErrVec =
map->EtErrorVec();
985 const int nsl = ld.etVec.size();
986 if (timeslices != nsl) {
987 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
992 if (ld.etVec[slice] != 0 || ld.etErrVec[slice] != 0) {
993 if (
debug)
msg() <<
"Duplicate data for slice " << slice <<
endmsg;
997 ld.etVec[slice] = missEt;
998 ld.etErrVec[slice] = ssError;
999 map->addEx(ld.etVec, ld.etErrVec);
1000 map->addEy(ld.etVec, ld.etErrVec);
1001 map->addEt(ld.etVec, ld.etErrVec);
1004 const unsigned int sumEt = subBlock->
sumEtHits(slice);
1005 if ( sumEt || ssError ) {
1009 ld.etVec.assign(timeslices, 0);
1010 ld.etErrVec.assign(timeslices, 0);
1011 ld.etVec[slice] = sumEt;
1012 ld.etErrVec[slice] = ssError;
1014 std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
1015 ld.etVec, ld.etVec, ld.etVec,
1016 ld.etErrVec, ld.etErrVec, ld.etErrVec, trigCmm);
1017 const int key = crate * 100 + dataID;
1018 data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
1019 data.m_cmmEtCollection->push_back(std::move(mapp));
1021 ld.etVec =
map->EtVec();
1022 ld.etErrVec =
map->EtErrorVec();
1023 const int nsl = ld.etVec.size();
1024 if (timeslices != nsl) {
1025 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
1030 if (ld.etVec[slice] != 0 || ld.etErrVec[slice] != 0) {
1031 if (
debug)
msg() <<
"Duplicate data for slice " << slice <<
endmsg;
1035 ld.etVec[slice] = sumEt;
1036 ld.etErrVec[slice] = ssError;
1037 map->addEx(ld.etVec, ld.etErrVec);
1038 map->addEy(ld.etVec, ld.etErrVec);
1039 map->addEt(ld.etVec, ld.etErrVec);
1042 if (subBlock->
version() > 1) {
1044 if ( missEtSig || ssError ) {
1048 ld.etVec.assign(timeslices, 0);
1049 ld.etErrVec.assign(timeslices, 0);
1050 ld.etVec[slice] = missEtSig;
1051 ld.etErrVec[slice] = ssError;
1053 std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
1054 ld.etVec, ld.etVec, ld.etVec,
1055 ld.etErrVec, ld.etErrVec, ld.etErrVec, trigCmm);
1056 const int key = crate * 100 + dataID;
1057 data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
1058 data.m_cmmEtCollection->push_back(std::move(mapp));
1060 ld.etVec =
map->EtVec();
1061 ld.etErrVec =
map->EtErrorVec();
1062 const int nsl = ld.etVec.size();
1063 if (timeslices != nsl) {
1064 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
1069 if (ld.etVec[slice] != 0 || ld.etErrVec[slice] != 0) {
1070 if (
debug)
msg() <<
"Duplicate data for slice "
1075 ld.etVec[slice] = missEtSig;
1076 ld.etErrVec[slice] = ssError;
1077 map->addEx(ld.etVec, ld.etErrVec);
1078 map->addEy(ld.etVec, ld.etErrVec);
1079 map->addEt(ld.etVec, ld.etErrVec);
1098 const int hwCrate = subBlock->
crate();
1102 const int timeslices = subBlock->
timeslices();
1103 const int sliceNum = subBlock->
slice();
1105 msg() <<
"CMM-Jet: Crate " << hwCrate
1106 <<
" Module " << module
1107 <<
" Firmware " << firmware
1108 <<
" Summing " << summing
1109 <<
" Total slices " << timeslices
1110 <<
" Slice " << sliceNum <<
endmsg;
1112 if (timeslices <= trigCmm) {
1113 if (
debug)
msg() <<
"Triggered CMM slice from header "
1114 <<
"inconsistent with number of slices: "
1115 << trigCmm <<
", " << timeslices <<
endmsg;
1119 if (timeslices <= sliceNum) {
1120 if (
debug)
msg() <<
"Total slices inconsistent with slice number: "
1121 << timeslices <<
", " << sliceNum <<
endmsg;
1129 msg() <<
"CMM-Jet sub-block unpacking failed: " << errMsg <<
endmsg;
1143 const int ssError = derr.
error();
1144 const int sliceBeg = ( neutralFormat ) ? 0 : sliceNum;
1145 const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
1146 for (
int slice = sliceBeg; slice < sliceEnd; ++slice) {
1150 for (
int source = 0; source < maxSid; ++source) {
1151 int dataID = source;
1179 const unsigned int hits = subBlock->
jetHits(slice, source);
1183 const int err = errBits.
error();
1187 ld.hitsVec.assign(timeslices, 0);
1188 ld.errVec.assign(timeslices, 0);
1189 ld.hitsVec[slice] = hits;
1190 ld.errVec[slice] = err;
1192 std::make_unique<LVL1::CMMJetHits>(swCrate, dataID, ld.hitsVec, ld.errVec, trigCmm);
1193 const int key = crate * 100 + dataID;
1194 data.m_cmmHitsMap.insert(std::make_pair(key, jhp.get()));
1195 data.m_cmmHitCollection->push_back(std::move(jhp));
1199 const int nsl = ld.hitsVec.size();
1200 if (timeslices != nsl) {
1201 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
1206 if (ld.hitsVec[slice] != 0 || ld.errVec[slice] != 0) {
1207 if (
debug)
msg() <<
"Duplicate data for slice " << slice <<
endmsg;
1211 ld.hitsVec[slice] = hits;
1212 ld.errVec[slice] = err;
1213 jh->
addHits(ld.hitsVec, ld.errVec);
1221 const unsigned int etMap = subBlock->
jetEtMap(slice);
1222 if ( etMap || ssError ) {
1226 ld.hitsVec.assign(timeslices, 0);
1227 ld.errVec.assign(timeslices, 0);
1228 ld.hitsVec[slice] = etMap;
1229 ld.errVec[slice] = ssError;
1231 std::make_unique<LVL1::CMMJetHits>(swCrate, dataID, ld.hitsVec, ld.errVec, trigCmm);
1232 const int key = crate * 100 + dataID;
1233 data.m_cmmHitsMap.insert(std::make_pair(key, mapp.get()));
1234 data.m_cmmHitCollection->push_back(std::move(mapp));
1236 ld.hitsVec =
map->HitsVec();
1237 ld.errVec =
map->ErrorVec();
1238 const int nsl = ld.hitsVec.size();
1239 if (timeslices != nsl) {
1240 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
1245 if (ld.hitsVec[slice] != 0 || ld.errVec[slice] != 0) {
1246 if (
debug)
msg() <<
"Duplicate data for slice " << slice <<
endmsg;
1250 ld.hitsVec[slice] = etMap;
1251 ld.errVec[slice] = ssError;
1252 map->addHits(ld.hitsVec, ld.errVec);
1271 const int hwCrate = subBlock->
crate();
1272 const int module = subBlock->
module();
1273 const int timeslices = subBlock->
timeslices();
1274 const int sliceNum = subBlock->
slice();
1276 msg() <<
"JEM: Crate " << hwCrate
1277 <<
" Module " << module
1278 <<
" Total slices " << timeslices
1279 <<
" Slice " << sliceNum <<
endmsg;
1281 if (timeslices <= trigJem) {
1282 if (
debug)
msg() <<
"Triggered JEM slice from header "
1283 <<
"inconsistent with number of slices: "
1284 << trigJem <<
", " << timeslices <<
endmsg;
1288 if (timeslices <= sliceNum) {
1289 if (
debug)
msg() <<
"Total slices inconsistent with slice number: "
1290 << timeslices <<
", " << sliceNum <<
endmsg;
1298 msg() <<
"JEM sub-block unpacking failed: " << errMsg <<
endmsg;
1311 const int ssError = derr.
error();
1312 std::vector<int> dummy(timeslices);
1313 const int sliceBeg = ( neutralFormat ) ? 0 : sliceNum;
1314 const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
1315 for (
int slice = sliceBeg; slice < sliceEnd; ++slice) {
1322 for (
int chan = 0; chan <
m_channels; ++chan) {
1324 if (jetEle.
data() || ssError) {
1329 if (layer == ld.coreOverlap) {
1332 const unsigned int key = ld.elementKey.jeKey(
phi,
eta);
1334 std::make_unique<LVL1::JetElement>(
phi,
eta, dummy, dummy, key,
1335 dummy, dummy, dummy, trigJem);
1337 jedata.
m_jeMap.insert(std::make_pair(key, jep.get()));
1340 const std::vector<int>& emEnergy(je->
emEnergyVec());
1342 const std::vector<int>& emError(je->
emErrorVec());
1343 const std::vector<int>& hadError(je->
hadErrorVec());
1344 const int nsl = emEnergy.size();
1345 if (timeslices != nsl) {
1347 msg() <<
"Inconsistent number of slices in sub-blocks"
1353 if (emEnergy[slice] != 0 || hadEnergy[slice] != 0 ||
1354 emError[slice] != 0 || hadError[slice] != 0) {
1355 if (
debug)
msg() <<
"Duplicate data for slice "
1363 const int linkError = jetEle.
linkError();
1373 msg(MSG::VERBOSE) <<
"Non-zero data but no channel mapping for channel "
1378 msg(MSG::VERBOSE) <<
"No jet element data for channel "
1379 << chan <<
" slice " << slice <<
endmsg;
1388 const unsigned int hits = subBlock->
jetHits(slice);
1392 ld.hitsVec.assign(timeslices, 0);
1393 ld.hitsVec[slice] = hits;
1395 std::make_unique<LVL1::JEMHits>(swCrate, module, ld.hitsVec, trigJem);
1400 const int nsl = ld.hitsVec.size();
1401 if (timeslices != nsl) {
1403 msg() <<
"Inconsistent number of slices in sub-blocks"
1409 if (ld.hitsVec[slice] != 0) {
1410 if (
debug)
msg() <<
"Duplicate data for slice "
1415 ld.hitsVec[slice] = hits;
1419 msg(MSG::VERBOSE) <<
"No jet hits data for crate/module/slice "
1420 << hwCrate <<
"/" << module <<
"/" << slice
1429 const unsigned int ex = subBlock->
ex(slice);
1430 const unsigned int ey = subBlock->
ey(slice);
1431 const unsigned int et = subBlock->
et(slice);
1435 ld.exVec.assign(timeslices, 0);
1436 ld.eyVec.assign(timeslices, 0);
1437 ld.etVec.assign(timeslices, 0);
1438 ld.exVec[slice] = ex;
1439 ld.eyVec[slice] = ey;
1440 ld.etVec[slice] =
et;
1442 std::make_unique<LVL1::JEMEtSums>(swCrate, module, ld.etVec, ld.exVec, ld.eyVec,
1444 sumdata.
m_etMap.insert(std::make_pair(crate *
m_modules + module, sumsp.get()));
1447 ld.exVec = sums->
ExVec();
1448 ld.eyVec = sums->
EyVec();
1449 ld.etVec = sums->
EtVec();
1450 const int nsl = ld.exVec.size();
1451 if (timeslices != nsl) {
1453 msg() <<
"Inconsistent number of slices in sub-blocks"
1459 if (ld.exVec[slice] != 0 || ld.eyVec[slice] != 0 || ld.etVec[slice] != 0) {
1460 if (
debug)
msg() <<
"Duplicate data for slice "
1465 ld.exVec[slice] = ex;
1466 ld.eyVec[slice] = ey;
1467 ld.etVec[slice] =
et;
1468 sums->
addEx(ld.exVec);
1469 sums->
addEy(ld.eyVec);
1470 sums->
addEt(ld.etVec);
1473 msg(MSG::VERBOSE) <<
"No energy sums data for crate/module/slice "
1474 << hwCrate <<
"/" << module <<
"/" << slice
1491 const unsigned int key = elementKey.
jeKey(
phi,
eta);
1492 ConstJetElementMap::const_iterator mapIter = jeMap.find(key);
1493 if (mapIter != jeMap.end())
return mapIter->second;
1502 const unsigned int key = elementKey.
jeKey(
phi,
eta);
1503 JetElementMap::const_iterator mapIter =
data.m_jeMap.find(key);
1504 if (mapIter !=
data.m_jeMap.end())
return mapIter->second;
1515 ConstJetHitsMap::const_iterator mapIter = hitsMap.find(crate *
m_modules + module);
1516 if (mapIter != hitsMap.end())
return mapIter->second;
1522 const int module)
const
1524 JetHitsMap::const_iterator mapIter =
data.m_hitsMap.find(crate *
m_modules + module);
1525 if (mapIter !=
data.m_hitsMap.end())
return mapIter->second;
1536 ConstEnergySumsMap::const_iterator mapIter = etMap.find(crate *
m_modules + module);
1537 if (mapIter != etMap.end())
return mapIter->second;
1543 const int module)
const
1545 EnergySumsMap::const_iterator mapIter =
data.m_etMap.find(crate *
m_modules + module);
1546 if (mapIter !=
data.m_etMap.end())
return mapIter->second;
1557 ConstCmmHitsMap::const_iterator mapIter = cmmHitsMap.find(crate * 100 + dataID);
1558 if (mapIter != cmmHitsMap.end())
return mapIter->second;
1564 const int dataID)
const
1566 CmmHitsMap::const_iterator mapIter =
data.m_cmmHitsMap.find(crate * 100 + dataID);
1567 if (mapIter !=
data.m_cmmHitsMap.end())
return mapIter->second;
1578 ConstCmmSumsMap::const_iterator mapIter = cmmEtMap.find(crate * 100 + dataID);
1579 if (mapIter != cmmEtMap.end())
return mapIter->second;
1585 const int dataID)
const
1587 CmmSumsMap::const_iterator mapIter =
data.m_cmmEtMap.find(crate * 100 + dataID);
1588 if (mapIter !=
data.m_cmmEtMap.end())
return mapIter->second;
1603 for (; pos != pose; ++pos) {
1605 const unsigned int key = elementKey.
jeKey(je->
phi(), je->
eta());
1606 jeMap.insert(std::make_pair(key, je));
1614 const hitCollection,
1618 if (hitCollection) {
1621 for (; pos != pose; ++pos) {
1624 const int key =
m_modules * crate + hits->module();
1625 hitsMap.insert(std::make_pair(key, hits));
1640 for (; pos != pose; ++pos) {
1644 etMap.insert(std::make_pair(key, sums));
1652 const hitCollection,
1656 if (hitCollection) {
1659 for (; pos != pose; ++pos) {
1662 const int key = crate * 100 + hits->dataID();
1663 cmmHitsMap.insert(std::make_pair(key, hits));
1678 for (; pos != pose; ++pos) {
1681 const int key = crate * 100 + sums->
dataID();
1682 cmmEtMap.insert(std::make_pair(key, sums));
1690 const int modulesPerSlink,
1702 for (
int mod = module; mod < module + modulesPerSlink; ++mod) {
1703 for (
int chan = 0; chan <
m_channels; ++chan) {
1707 if ( !
m_jemMaps->mapping(crate, mod, chan,
eta,
phi, layer))
continue;
1709 if ( !je )
continue;
1710 const int numdat = 5;
1711 std::vector<int> sums(numdat);
1712 std::vector<int> sizes(numdat);
1713 sums[0] = std::accumulate((je->
emEnergyVec()).begin(),
1715 sums[1] = std::accumulate((je->
hadEnergyVec()).begin(),
1717 sums[2] = std::accumulate((je->
emErrorVec()).begin(),
1719 sums[3] = std::accumulate((je->
hadErrorVec()).begin(),
1721 sums[4] = std::accumulate((je->
linkErrorVec()).begin(),
1728 const int peak = je->
peak();
1729 for (
int i = 0; i < numdat; ++i) {
1730 if (sums[i] == 0)
continue;
1734 }
else if (slices != sizes[i] || trigJ != peak)
return false;
1739 const unsigned int sum = std::accumulate((hits->JetHitsVec()).begin(),
1740 (hits->JetHitsVec()).end(), 0);
1742 const int size = (hits->JetHitsVec()).size();
1743 const int peak = hits->peak();
1747 }
else if (slices != size || trigJ != peak)
return false;
1752 const int numdat = 3;
1753 std::vector<unsigned int> sums(numdat);
1754 std::vector<int> sizes(numdat);
1755 sums[0] = std::accumulate((
et->ExVec()).begin(),
1756 (
et->ExVec()).end(), 0);
1757 sums[1] = std::accumulate((
et->EyVec()).begin(),
1758 (
et->EyVec()).end(), 0);
1759 sums[2] = std::accumulate((
et->EtVec()).begin(),
1760 (
et->EtVec()).end(), 0);
1761 sizes[0] = (
et->ExVec()).size();
1762 sizes[1] = (
et->EyVec()).size();
1763 sizes[2] = (
et->EtVec()).size();
1764 const int peak =
et->peak();
1765 for (
int i = 0; i < numdat; ++i) {
1766 if (sums[i] == 0)
continue;
1770 }
else if (slices != sizes[i] || trigJ != peak)
return false;
1775 if (module / modulesPerSlink ==
m_slinks - 1) {
1778 const int maxDataID = (maxDataID1 > maxDataID2) ? maxDataID1 : maxDataID2;
1779 for (
int dataID = 0; dataID < maxDataID; ++dataID) {
1780 const int numdat = 6;
1781 std::vector<unsigned int> sums(numdat);
1782 std::vector<int> sizes(numdat);
1784 if (dataID < maxDataID1) hits =
findCmmHits(crate, dataID, cmmHitsMap);
1786 sums[0] = std::accumulate((hits->HitsVec()).begin(),
1787 (hits->HitsVec()).end(), 0);
1788 sums[1] = std::accumulate((hits->ErrorVec()).begin(),
1789 (hits->ErrorVec()).end(), 0);
1790 sizes[0] = (hits->HitsVec()).size();
1791 sizes[1] = (hits->ErrorVec()).size();
1792 const int peak = hits->peak();
1793 for (
int i = 0; i < 2; ++i) {
1794 if (sums[i] == 0)
continue;
1798 }
else if (slices != sizes[i] || trigJ != peak)
return false;
1802 if (dataID < maxDataID2)
et =
findCmmSums(crate, dataID, cmmEtMap);
1804 sums[0] = std::accumulate((
et->ExVec()).begin(),
1805 (
et->ExVec()).end(), 0);
1806 sums[1] = std::accumulate((
et->EyVec()).begin(),
1807 (
et->EyVec()).end(), 0);
1808 sums[2] = std::accumulate((
et->EtVec()).begin(),
1809 (
et->EtVec()).end(), 0);
1810 sums[3] = std::accumulate((
et->ExErrorVec()).begin(),
1811 (
et->ExErrorVec()).end(), 0);
1812 sums[4] = std::accumulate((
et->EyErrorVec()).begin(),
1813 (
et->EyErrorVec()).end(), 0);
1814 sums[5] = std::accumulate((
et->EtErrorVec()).begin(),
1815 (
et->EtErrorVec()).end(), 0);
1816 sizes[0] = (
et->ExVec()).size();
1817 sizes[1] = (
et->EyVec()).size();
1818 sizes[2] = (
et->EtVec()).size();
1819 sizes[3] = (
et->ExErrorVec()).size();
1820 sizes[4] = (
et->EyErrorVec()).size();
1821 sizes[5] = (
et->EtErrorVec()).size();
1822 const int peak =
et->peak();
1823 for (
int i = 0; i < numdat; ++i) {
1824 if (sums[i] == 0)
continue;
1828 }
else if (slices != sizes[i] || trigJ != peak)
return false;
1834 timeslices = slices;
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
std::vector< size_t > vec
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 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.
void clear()
Clear all data.
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.
unsigned int jetHits(int slice, int source) const
Return jet hit counts for given jem or source ID.
int jetHitsError(int slice, int source) const
Return jet hit error for given jem or source ID.
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.
void clear()
Clear all data.
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)
JEM jet element dataword class.
Sub-Block class for JEM data.
void setJemHeader(int version, int format, int slice, int crate, int module, int timeslices)
Store JEM header.
void fillJetElement(int slice, const JemJetElement &jetEle)
Store jet element data.
bool unpack()
Unpack data.
unsigned int ex(int slice) const
Return energy subsum Ex.
int timeslices() const
Return number of timeslices.
void clear()
Clear all data.
void setJetHits(int slice, unsigned int hits)
Store jet hit counts.
unsigned int jetHits(int slice) const
Return jet hit counts.
unsigned int et(int slice) const
Return energy subsum Et.
unsigned int ey(int slice) const
Return energy subsum Ey.
void setEnergySubsums(int slice, unsigned int ex, unsigned int ey, unsigned int et)
Store energy subsum data.
JemJetElement jetElement(int slice, int channel) const
Return jet element for given channel.
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.
CMMEtSums object stores Et sums from the Energy CMMs.
const std::vector< int > & EtErrorVec() const
returns module ET errors
void addEx(const std::vector< unsigned int > &Ex, const std::vector< int > &ExError)
Update Ex sum.
const std::vector< int > & ExErrorVec() const
returns module Ex errors
int dataID() const
returns data ID
void addEt(const std::vector< unsigned int > &Et, const std::vector< int > &EtError)
Add data to existing objects.
int crate() const
Data accessors.
const std::vector< unsigned int > & EtVec() const
Access multi-slice data.
void addEy(const std::vector< unsigned int > &Ey, const std::vector< int > &EyError)
Update Ey sum.
const std::vector< unsigned int > & ExVec() const
returns module Ex sum
const std::vector< int > & EyErrorVec() const
returns module Ey errors
const std::vector< unsigned int > & EyVec() const
returns module Ey sum
CMMJetHits class stores Jet hit multiplicities received by and read out from the Jet CMMs.
const std::vector< int > & ErrorVec() const
returns errors
void addHits(const std::vector< unsigned int > &hits, const std::vector< int > &errors)
Add hits to existing object.
const std::vector< unsigned int > & HitsVec() const
Multi-slice accessors.
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.
int module() const
returns module number
const std::vector< unsigned int > & EyVec() const
returns module Ey sum
void addEx(const std::vector< unsigned int > &Ex)
Update Ex sum.
const std::vector< unsigned int > & ExVec() const
returns module Ex sum
void addEt(const std::vector< unsigned int > &Et)
Update ET sum.
const std::vector< unsigned int > & EtVec() const
returns module ET sum
int crate() const
returns crate number
void addEy(const std::vector< unsigned int > &Ey)
Update Ey sum.
const std::vector< unsigned int > & JetHitsVec() const
returns jet hits
void addJetHits(const std::vector< unsigned int > &hits)
Set Jet hits.
Jet/Energy Processor container for writing bytestream.
const DataVector< JEMEtSums > * EnergySums() const
Return pointer to energy sums collection.
const DataVector< JetElement > * JetElements() const
Return pointer to jet element collection.
const DataVector< JEMHits > * JetHits() const
Return pointer to hit sums collection.
const DataVector< CMMEtSums > * CmmSums() const
Return pointer to CMM energy sums collection.
const DataVector< CMMJetHits > * CmmHits() const
Return pointer to CMM hit sums collection.
virtual unsigned int jeKey(const xAOD::TriggerTower &tower)
returns key of passed tower
The JetElementKey object provides the key for each JetElement depending on its eta,...
Jet elements are the inputs to the Jet, ETmiss and ETsum triggers.
double eta() const
Eta of centre of JetElement.
const std::vector< int > & hadEnergyVec() const
return Had energy vector reference (all timeslices)
double phi() const
Phi of centre of JetElement.
const std::vector< int > & linkErrorVec() const
return link error vector reference (all timeslices)
void addSlice(int slice, int emEnergy, int hadEnergy, int emError, int hadError, int linkError)
add data for one timeslice.
const std::vector< int > & emErrorVec() const
return Em error vector reference (all timeslices)
int peak() const
return triggered slice offset
const std::vector< int > & hadErrorVec() const
return Had error vector reference (all timeslices)
const std::vector< int > & emEnergyVec() const
Return data for all slices.
static const InterfaceID IID_IJepByteStreamTool("JepByteStreamTool", 1, 1)
Extra patterns decribing particle interation process.