13#include "eformat/SourceIdentifier.h"
32uint32_t bitFieldSize(uint32_t word, uint8_t offset, uint8_t
size) {
33 return (word >> offset) & ((1U <<
size) - 1);
36uint32_t crateModuleMask(uint8_t crate, uint8_t module) {
37 return (crate << 8) | (1 << 4) | module;
40uint32_t coolId(uint8_t crate, uint8_t module, uint8_t channel) {
43 return (crateModuleMask(crate, module) << 16) | (pin << 8) | asic;
46int16_t pedCorrection(uint16_t twoBytePedCor) {
47 return twoBytePedCor > 511? (twoBytePedCor - 1024): twoBytePedCor;
51std::string noAuxSuffix(
const std::string& name) {
52 if ((
name.size() > 4) && (
name.substr(
name.size()-4, 4) ==
"Aux.")) {
53 return name.substr(0,
name.size() - 4);
66 m_errorTool(
"LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
67 m_ppmMaps(
"LVL1::PpmMappingTool/PpmMappingTool"),
72 declareInterface<PpmByteStreamReadV1V2Tool>(
this);
75 "Crate/Module/Channel to Eta/Phi/Layer mapping tool");
77 "Get ROB source IDs service");
95 return StatusCode::SUCCESS;
103 return StatusCode::SUCCESS;
120 for (; rob != robEnd; ++rob) {
123 if (!
sc.isSuccess()) {
129 return StatusCode::SUCCESS;
134 const EventContext& ctx,
141 const EventContext& ctx,
142 const std::string& sgKey,
147 const std::vector<uint32_t>& vID(
ppmSourceIDs(state, sgKey));
151 ATH_MSG_DEBUG(
"Number of ROB fragments:" << robFrags.size());
154 return StatusCode::SUCCESS;
162 auto rob = **robIter;
165 "Treating ROB fragment source id #" << MSG::hex << rob.rob_source_id());
175 if (rob.nstatus() > 0) {
181 return StatusCode::FAILURE;
189 rob.rod_data(payloadBeg);
190 payloadEnd = payloadBeg + rob.rod_ndata();
191 payload = payloadBeg;
193 if (payload == payloadEnd) {
195 return StatusCode::FAILURE;
200 uint16_t rodVer = rob.rod_version() & 0xffff;
201 uint32_t rodRunNumber = rob.rod_run_no() & 0xffffff;
202 state.
m_verCode = ((rodVer & 0xfff) << 4) | 1;
207 return StatusCode::FAILURE;
210 ATH_MSG_DEBUG(
"Treating crate " << rodCrate <<
" slink " << rodSlink);
214 return StatusCode::FAILURE;
218 "Run number: " << MSG::dec << rodRunNumber <<
endmsg
219 <<
"Version code: 0x" << MSG::hex <<
int(state.
m_verCode) << MSG::dec
220 <<
endmsg <<
"LUT triggered slice offset: "
223 <<
endmsg <<
"FADC baseline lower bound: "
227 uint8_t blockType = 0;
230 for (; payload != payloadEnd; ++payload) {
241 blockType = (*payload >> 28) & 0xf;
243 if ((blockType & 0xd) == 0xc) {
252 subBlock = blockType & 0xe;
253 }
else if (blockType == (subBlock | 1)) {
259 case eformat::TDAQ_CALO_PREPROC:
272 return StatusCode::SUCCESS;
289 return StatusCode::FAILURE;
291 return StatusCode::SUCCESS;
325 <<
"' for rob version '"
327 << MSG::dec <<
"'" );
328 return StatusCode::FAILURE;
330 return StatusCode::SUCCESS;
337 uint8_t totSlice = 3 * numLut + numFadc;
340 for (
int asic = 0 ; asic < 4 ; ++asic ) {
341 for (
int mcm = 0 ; mcm < 16 ; ++mcm ) {
343 std::vector<uint32_t> rotated(totSlice);
345 for ( uint8_t slice = 0 ; slice < totSlice ; ++slice ) {
346 for ( uint8_t bit = 0 ; bit < 11 ; ++bit ) {
347 if ( state.
m_ppBlock[slice * 11 + asic * (11 * totSlice) + bit + 1] & (1 << mcm))
348 rotated[slice] |= (1 << bit);
352 bool nonZeroData =
false;
353 for (uint8_t slice = 0; slice < numLut; ++slice) {
355 || rotated[slice + numLut]
356 || rotated[slice + 2 * numLut + numFadc]) {
362 std::vector<uint8_t> lcpVal;
363 std::vector<uint8_t> lcpBcidVec;
364 std::vector<uint8_t> ljeVal;
365 std::vector<uint8_t> ljeSat80Vec;
366 std::vector<int16_t> pedCor;
367 std::vector<uint8_t> pedEn;
369 std::vector<uint16_t> adcVal;
370 std::vector<uint8_t> adcExt;
373 for (uint8_t slice = 0; slice < numLut; ++slice) {
374 lcpVal.push_back(rotated[slice] & 0xff);
375 ljeVal.push_back(rotated[slice + numLut] & 0xff);
376 pedCor.push_back(::pedCorrection(rotated[slice + 2 * numLut + numFadc] & 0x3ff));
378 lcpBcidVec.push_back((rotated[slice] >> 8) & 0x7);
379 ljeSat80Vec.push_back((rotated[slice + numLut] >> 8) & 0x7);
380 pedEn.push_back((rotated[slice + 2 * numLut + numFadc] >> 10) & 0x1);
384 for (uint8_t slice = 0; slice < numFadc; ++slice) {
385 if (rotated[slice + numLut]) {
392 for (uint8_t slice = 0; slice < numFadc; ++ slice) {
393 adcVal.push_back(rotated[slice + 2 * numLut] & 0x3ff);
394 adcExt.push_back((rotated[slice + 2 * numLut] >> 10 & 0x1) & 0x3ff);
404 std::move(lcpBcidVec),
406 std::move(ljeSat80Vec),
415 return StatusCode::SUCCESS;
426 present = br.getField(1);
436 std::vector<uint16_t> adcVal = {0 , 0, 0, 0, 0};
437 std::vector<uint8_t> adcExt = {0 , 0, 0, 0, 0};
439 uint8_t minHeader = br.getField(4);
440 uint8_t minIndex = minHeader % 5;
441 if (minHeader < 15) {
442 if (minHeader < 10) {
445 fmt = 2 + br.getField( 2);
446 uint8_t haveLut = br.getField(1);
449 lutVal = br.getField(3);
453 uint8_t haveExt = br.getField(1);
455 lutVal = br.getField(8);
456 lutExt = br.getField(1);
457 lutSat = br.getField(1);
458 lutPeak = br.getField(1);
462 for(uint8_t i = 0; i < 5; ++i) {
463 adcExt[i] = br.getField(1);
472 uint8_t haveAdc = br.getField(1);
474 uint16_t val = br.getField(10);
475 for(uint8_t i = 0; i < 5; ++i) {
487 std::vector<uint8_t> {lutVal},
488 std::vector<uint8_t> {uint8_t(lutExt | (lutSat << 1) | (lutPeak << 2))},
495 }
catch (
const std::out_of_range& ex) {
499 return StatusCode::SUCCESS;
504 BitReader& br, uint8_t format, uint8_t minIndex)
const
506 std::vector<uint16_t> adc = {0, 0, 0, 0, 0};
509 for(uint8_t i = 0; i <5; ++i) {
510 uint8_t longField = 0;
513 longField = br.getField(1);
514 numBits = longField == 0? 4: (format * 2);
516 numBits = i == 0? 4: (format + 2);
520 minAdc = br.getField(numBits);
521 if (longField == 0) {
525 adc[i] = minAdc + br.getField(numBits);
532 adc[0] = adc[minIndex];
533 adc[minIndex] = minAdc;
545 StatusCode
sc = StatusCode::SUCCESS;
552 const uint8_t nTotal = numAdc + numLut;
553 const uint8_t wordsPerBlock = 8;
554 const uint8_t iBlk = inData / wordsPerBlock;
558 for(uint8_t i = 0; i < 2; ++i) {
559 uint16_t subword = (word >> 16 * i) & 0x7ff;
560 state.
m_ppLuts[iChan].push_back(subword);
563 }
else if (iBlk < nTotal) {
564 for(uint8_t i = 0; i < 2; ++i) {
565 uint16_t subword = (word >> (16 * i)) & 0x7ff;
566 state.
m_ppFadcs[iChan].push_back(subword);
572 sc = StatusCode::FAILURE;
583 return StatusCode::SUCCESS;
586 return StatusCode::SUCCESS;
588 return StatusCode::FAILURE;
596 int16_t pedCorBase = -20;
600 for(uint8_t chan = 0; chan <
s_channels; ++chan) {
603 std::vector<uint8_t> haveLut(numLut, 0);
604 std::vector<uint8_t> lcpVal(numLut, 0);
606 std::vector<uint8_t> lcpExt(numLut, 0);
607 std::vector<uint8_t> lcpSat(numLut, 0);
608 std::vector<uint8_t> lcpPeak(numLut, 0);
609 std::vector<uint8_t> lcpBcidVec(numLut, 0);
611 std::vector<uint8_t> ljeVal(numLut, 0);
613 std::vector<uint8_t> ljeLow(numLut, 0);
614 std::vector<uint8_t> ljeHigh(numLut, 0);
615 std::vector<uint8_t> ljeRes(numLut, 0);
616 std::vector<uint8_t> ljeSat80Vec(numLut, 0);
618 std::vector<uint16_t> adcVal(numAdc, 0);
619 std::vector<uint8_t> adcExt(numAdc, 0);
620 std::vector<int16_t> pedCor(numLut, 0);
621 std::vector<uint8_t> pedEn(numLut, 0);
623 int8_t encoding = -1;
624 int8_t minIndex = -1;
627 present = br.getField(1);
631 CHECK((encoding != -1) && (minIndex != -1));
635 for(
uint i=0; i < numLut; ++i) {
636 lcpPeak[i] = br.getField(1);
640 for (uint8_t i = 0; i < numLut; ++i) {
641 ljeLow[i] = br.getField(1);
647 for (uint8_t i = 0; i < numLut; ++i) {
648 if (lcpPeak[i] == 1) {
649 lcpVal[i] = br.getField(4);
652 for(uint8_t i = 0; i < numLut; ++i) {
653 if (lcpPeak[i] == 1){
654 ljeVal[i] = br.getField(3);
658 }
else if (encoding < 6) {
660 for(uint8_t i = 0; i < numLut; ++i){
661 haveLut[i] = br.getField(1);
665 uint8_t haveExt = br.getField(1);
668 for (uint8_t i = 0; i < numAdc; ++i) {
669 adcExt[i] = br.getField(1);
673 for(uint8_t i = 0; i < numLut; ++i){
674 if (haveLut[i] == 1) {
675 lcpVal[i] = br.getField(8);
676 lcpExt[i] = br.getField(1);
677 lcpSat[i] = br.getField(1);
678 lcpPeak[i] = br.getField(1);
682 for(uint8_t i = 0; i < numLut; ++i){
683 if (haveLut[i] == 1) {
684 ljeVal[i] = br.getField(8);
685 ljeLow[i] = br.getField(1);
686 ljeHigh[i] = br.getField(1);
687 ljeRes[i] = br.getField(1);
695 if (minIndex <0)
return StatusCode::FAILURE;
698 if ((encoding < 3) || (encoding == 6)) {
699 for (uint8_t i = 0; i < numLut; ++i)
701 pedCor[i] = br.getField(6) + pedCorBase;
710 for (uint8_t i = 0; i < numLut; ++i)
712 uint16_t val = br.getField(10);
713 pedCor[i] = ::pedCorrection(val);
714 pedEn[i] = br.getField(1);
718 for(uint8_t i=0; i < numLut; ++i){
719 lcpBcidVec[i] = uint8_t((lcpPeak[i] << 2) | (lcpSat[i] << 1) | lcpExt[i]);
720 ljeSat80Vec[i] = uint8_t((ljeRes[i] << 2) | (ljeHigh[i] << 1) | ljeLow[i]);
725 std::move(lcpVal), std::move(lcpBcidVec),
726 std::move(ljeVal), std::move(ljeSat80Vec),
727 std::move(adcVal), std::move(adcExt),
728 std::move(pedCor), std::move(pedEn)));
733 }
catch (
const std::out_of_range& ex) {
738 return StatusCode::SUCCESS;
744 int8_t& encoding, int8_t& minIndex)
const
746 uint8_t minHeader = 0;
749 minHeader = br.getField(4);
751 minIndex = minHeader % 5;
753 if (minHeader < 10) {
754 encoding = minHeader / 5;
756 encoding = 2 + br.getField(2);
765 }
else if (numAdc == 7) {
767 }
else if (numAdc < 16) {
772 uint8_t fieldSize = 1 << numBits;
773 minHeader = br.getField(numBits);
774 uint8_t encValue = fieldSize - 1;
775 if (minHeader == encValue) {
779 minHeader += br.getField(2) << numBits;
780 minIndex = minHeader % fieldSize;
781 encValue = 3 * fieldSize;
783 if (minHeader < encValue) {
784 encoding = minHeader / fieldSize;
786 encoding = 3 + br.getField(2);
796 uint8_t encoding, uint8_t minIndex)
const
801 uint16_t val = br.getField(6);
802 return std::vector<uint16_t>(numAdc, val);
803 }
else if ( encoding < 3) {
804 std::vector<uint16_t> adc(numAdc, 0);
806 adc[minIndex] = minAdc;
807 for(uint8_t i = 1; i < numAdc; ++i) {
808 adc[i == minIndex? 0: i] = br.getField(encoding + 2) + minAdc;
812 std::vector<uint16_t> adc(numAdc, 0);
813 uint16_t minAdc = br.getField(1)
814 ? br.getField(encoding * 2)
818 adc[minIndex] = minAdc;
819 for (uint8_t i = 1; i < numAdc; ++i) {
820 adc[minIndex == i? 0: i] = br.getField(
821 br.getField(1)? encoding * 2: 4
832 return StatusCode::SUCCESS;
835 return StatusCode::FAILURE;
837 return StatusCode::FAILURE;
848 for (uint8_t chan = 0; chan < 64; ++chan) {
851 std::vector<uint8_t> lcpVal;
852 std::vector<uint8_t> lcpBcidVec;
854 std::vector<uint8_t> ljeVal;
855 std::vector<uint8_t> ljeSat80Vec;
859 std::vector<uint16_t> adcVal;
860 std::vector<uint8_t> adcExt;
861 std::vector<int16_t> pedCor;
862 std::vector<uint8_t> pedEn;
864 for (
int i = 0; i < numLut; ++i) {
865 lcpVal.push_back(br.getField(8));
866 lcpBcidVec.push_back(br.getField(3));
869 for (
int i = 0; i < numLut; ++i) {
870 ljeVal.push_back(br.getField(8));
871 ljeSat80Vec.push_back(br.getField(3));
874 for (
int i = 0; i < numAdc; ++i) {
875 adcVal.push_back(br.getField(10));
876 adcExt.push_back(br.getField(1));
879 for (
int i = 0; i < numLut; ++i) {
880 uint16_t pc = br.getField(10);
881 pedCor.push_back(pedCorrection(pc));
882 pedEn.push_back(br.getField(1));
884 }
catch (
const std::out_of_range& ex) {
891 std::move(lcpVal), std::move(lcpBcidVec),
892 std::move(ljeVal), std::move(ljeSat80Vec),
893 std::move(adcVal), std::move(adcExt),
894 std::move(pedCor), std::move(pedEn)));
897 return StatusCode::SUCCESS;
902 for(
const auto & lut : state.
m_ppLuts) {
911 return StatusCode::SUCCESS;
915 uint8_t crate, uint8_t module, uint32_t payload)
const
923 if (tt->coolId() >> 16 & crateModuleMask(crate, module)){
926 tt->setErrorWord( errorBits.
error() );
935 uint8_t crate, uint8_t module,
BitReader& br)
const
939 uint8_t haveStatus = br.getField(1);
940 uint8_t haveErrors = br.getField(1);
943 if (haveStatus || haveErrors) {
946 uint16_t errorWord = 0;
951 if ((mcmMap & (1 << i)) != 0) {
952 uint16_t blockStatus = 0;
953 uint16_t blockErrors = 0;
956 blockStatus = br.getField(5);
957 errorWord |= blockStatus;
960 blockErrors = br.getField(6);
961 errorWord |= (blockErrors<<5);
964 mcmErrors.at(i)=errorWord;
973 if (tt->coolId() >> 16 & crateModuleMask(crate, module)){
974 uint16_t mcmID = (tt->coolId() >> 8) & 0xff;
975 uint16_t chnID = tt->coolId() & 0xff;
976 uint16_t
error = mcmErrors.at(mcmID);
990 tt->setErrorWord( errorBits.
error() );
1004 std::vector<uint8_t>&& lcpVal,
1005 std::vector<uint8_t>&& lcpBcidVec,
1006 std::vector<uint8_t>&& ljeVal,
1007 std::vector<uint8_t>&& ljeSat80Vec,
1008 std::vector<uint16_t>&& adcVal,
1009 std::vector<uint8_t>&& adcExt,
1010 std::vector<int16_t>&& pedCor,
1011 std::vector<uint8_t>&& pedEn)
const
1013 uint32_t coolId = ::coolId(crate, module, channel);
1019 bool isData =
m_ppmMaps->mapping(crate, module, channel,
eta,
phi, layer);
1022 return StatusCode::SUCCESS;
1026 const int pin = channel % 16;
1027 const int asic = channel / 16;
1028 eta = 16 * crate + module;
1029 phi = 4 * pin + asic;
1035 tt->initialize(coolId,
eta,
phi,
1036 std::move(lcpVal), std::move(ljeVal),
1037 std::move(pedCor), std::move(pedEn),
1038 std::move(lcpBcidVec), std::move(adcVal),
1039 std::move(adcExt), std::move(ljeSat80Vec),
1042 return StatusCode::SUCCESS;
1050 std::vector<uint8_t>&& luts,
1051 std::vector<uint8_t>&& lcpBcidVec,
1052 std::vector<uint16_t>&& fadc,
1053 std::vector<uint8_t>&& bcidExt
1056 std::vector<uint8_t> ljeSat80Vec;
1058 std::vector<int16_t> pedCor;
1059 std::vector<uint8_t> pedEn;
1060 std::vector<uint8_t> luts_copy =luts;
1063 crate, module, channel,
1064 std::move(luts), std::move(lcpBcidVec),
1065 std::move(luts_copy) , std::move(ljeSat80Vec),
1066 std::move(fadc), std::move(bcidExt),
1067 std::move(pedCor), std::move(pedEn))
1070 return StatusCode::SUCCESS;
1078 const std::vector<uint16_t>& luts,
1079 const std::vector<uint16_t>& fadc
1082 std::vector<uint8_t> lcpVal;
1083 std::vector<uint8_t> lcpBcidVec;
1085 std::vector<uint16_t> adcVal;
1086 std::vector<uint8_t> adcExt;
1088 for(
auto lut: luts) {
1099 crate, module, channel,
1100 std::move(lcpVal), std::move(lcpBcidVec),
1101 std::move(adcVal), std::move(adcExt)));
1103 return StatusCode::SUCCESS;
1111 const int crates = 8;
1117 for (
int crate = 0; crate < crates; ++crate) {
1118 for (
int slink = 0; slink <
m_srcIdMap->maxSlinks(); ++slink) {
1119 const uint32_t rodId =
m_srcIdMap->getRodID(crate, slink, 0,
1120 eformat::TDAQ_CALO_PREPROC);
1121 const uint32_t robId =
m_srcIdMap->getRobID(rodId);
1123 if (crate > 1 && crate < 6) {
1125 if (crate < 4 && slink == 0) {
1137 const std::string& sgKey)
const
1142 if (sgKey.find(
"Muon") != std::string::npos) {
1144 }
else if (sgKey.find(
"Spare") != std::string::npos) {
1162 (
const uint8_t numBits)
1170 if ((iBit + numBits) <= 31) {
1171 result = ::bitFieldSize(
m_ppBlock[iWord], iBit, numBits);
1173 uint8_t nb1 = 31 - iBit;
1174 uint8_t nb2 = numBits - nb1;
1175 uint32_t field1 = ::bitFieldSize(
m_ppBlock[iWord], iBit, nb1);
1176 uint32_t field2 = ::bitFieldSize(
m_ppBlock[iWord + 1], 0, nb2);
1177 result = field1 | (field2 << nb1);
1183 throw std::out_of_range(
"Requested too much bits from ppm block");
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define CHECK(...)
Evaluate an expression and check for errors.
size_t size() const
Number of registered mappings.
Atomic min/max functions.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
size_type capacity() const noexcept
Returns the total number of elements that the collection can hold before needing to allocate more mem...
std::vector< const ROBF * > VROBFRAG
T get(const uint32_t &word) const
This class provides conversion between Lower level Source ID to higher level source ID for L1Calo Byt...
int error() const
Return the full error word.
void set(ErrorBit bit, int value=1)
Set an error bit or data.
static const std::string xAODTriggerTowerLocation
T atomic_fetch_max(std::atomic< T > *a, T v, std::memory_order memorder=std::memory_order_seq_cst)
Atomically calculate maximum.
TriggerTowerContainer_v2 TriggerTowerContainer
Define the latest version of the TriggerTower container.
setScaleOne setStatusOne setSaturated int16_t
TriggerTower_v2 TriggerTower
Define the latest version of the TriggerTower class.