From cb58716fd720591c0382cf1d74b5828de2cb9d6c Mon Sep 17 00:00:00 2001 From: yulunmiao Date: Tue, 30 Jul 2024 20:44:43 +0200 Subject: [PATCH 1/5] Add definitions of flags in digi SOA --- .../interface/HGCalRawDataDefinitions.h | 9 +++ .../HGCalRawToDigi/interface/HGCalUnpacker.h | 18 +++++- .../HGCalRawToDigi/src/HGCalUnpacker.cc | 58 ++++++++----------- 3 files changed, 51 insertions(+), 34 deletions(-) diff --git a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h index 8502ddd42f5a5..97f443f2f5b10 100644 --- a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h +++ b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h @@ -106,6 +106,15 @@ namespace hgcal { SLINK_STATUS_MASK = 0xffff, SLINK_STATUS_POS = 0, }; + + enum DIGI_FLAG { + FULL_READOUT = 0x0000, + ZS_ADCm1 = 0x0001, + ZS_ToA = 0x0002, + ZS_ToA_ADCm1 = 0x0003, + ZS_ADC = 0x0004, + Invalid = 0x0005 + }; } // namespace hgcal #endif diff --git a/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h b/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h index f886a65d0a078..687e1eadc08ec 100644 --- a/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h +++ b/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h @@ -11,6 +11,7 @@ #ifndef EventFilter_HGCalRawToDigi_HGCalUnpacker_h #define EventFilter_HGCalRawToDigi_HGCalUnpacker_h +#include "DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h" #include "DataFormats/FEDRawData/interface/FEDRawData.h" #include "DataFormats/HGCalDigi/interface/HGCalDigiHost.h" #include "DataFormats/HGCalDigi/interface/HGCalECONDInfoHost.h" @@ -130,7 +131,22 @@ class HGCalUnpacker { 0b1111111111, 0b1111111111, 0b1111111111}; - + constexpr static uint16_t flags_[16] = {hgcal::DIGI_FLAG::ZS_ToA, + hgcal::DIGI_FLAG::ZS_ToA_ADCm1, + hgcal::DIGI_FLAG::ZS_ToA, + hgcal::DIGI_FLAG::ZS_ADCm1, + hgcal::DIGI_FLAG::FULL_READOUT, + hgcal::DIGI_FLAG::FULL_READOUT, + hgcal::DIGI_FLAG::FULL_READOUT, + hgcal::DIGI_FLAG::FULL_READOUT, + hgcal::DIGI_FLAG::Invalid, + hgcal::DIGI_FLAG::Invalid, + hgcal::DIGI_FLAG::Invalid, + hgcal::DIGI_FLAG::Invalid, + hgcal::DIGI_FLAG::FULL_READOUT, + hgcal::DIGI_FLAG::FULL_READOUT, + hgcal::DIGI_FLAG::FULL_READOUT, + hgcal::DIGI_FLAG::FULL_READOUT}; constexpr static uint32_t erxBodyBits_[16] = {24, 16, 24, 24, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}; // HGCalUnpackerConfig config_; diff --git a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc index 014fd237b85c2..8234e982d8f27 100644 --- a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc +++ b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc @@ -105,7 +105,6 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, ++ptr; // parse Capture Block body (ECON-Ds) for (uint32_t econdIdx = 0; econdIdx < HGCalMappingModuleIndexer::maxECONDperCB_; econdIdx++) { - auto econd_pkt_status = (cb_header >> (3 * econdIdx)) & 0b111; LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx << ", econdIdx = " << econdIdx << ", econd_pkt_status = " << econd_pkt_status; @@ -113,14 +112,13 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, // always increment the global ECON-D index (unless inactive/unconnected) globalECONDIdx++; } - bool pkt_exists = - (econd_pkt_status == backend::ECONDPacketStatus::Normal) || - (econd_pkt_status == backend::ECONDPacketStatus::PayloadCRCError) || - (econd_pkt_status == backend::ECONDPacketStatus::EventIDMismatch) || - (fedConfig.mismatchPassthroughMode && econd_pkt_status == backend::ECONDPacketStatus::BCIDOrbitIDMismatch); + (econd_pkt_status == backend::ECONDPacketStatus::Normal) || + (econd_pkt_status == backend::ECONDPacketStatus::PayloadCRCError) || + (econd_pkt_status == backend::ECONDPacketStatus::EventIDMismatch) || + (econd_pkt_status == backend::ECONDPacketStatus::BCIDOrbitIDMismatch); // TODO: `BCIDOrbitIDMismatch` if (!pkt_exists) { - continue; + continue; } // ECON-D header (two 32b words) @@ -133,12 +131,10 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, if (((econd_headers[0] >> ECOND_FRAME::HEADER_POS) & ECOND_FRAME::HEADER_MASK) != fedConfig.econds[globalECONDIdx].headerMarker) { econdInfo.view()[ECONDdenseIdx].exception() = 3; - - //DO NOT THROW!! just flag as exception and try to continue - //throw cms::Exception("CorruptData") - // << "Expected a ECON-D header at word " << std::dec << (uint32_t)(ptr - header) << "/0x" << std::hex - // << (uint32_t)(ptr - header) << " (marker: 0x" << fedConfig.econds[globalECONDIdx].headerMarker - // << "), got 0x" << econd_headers[0] << "."; + throw cms::Exception("CorruptData") + << "Expected a ECON-D header at word " << std::dec << (uint32_t)(ptr - header) << "/0x" << std::hex + << (uint32_t)(ptr - header) << " (marker: 0x" << fedConfig.econds[globalECONDIdx].headerMarker + << "), got 0x" << econd_headers[0] << "."; } ++ptr; @@ -155,8 +151,7 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, (((econd_headers[1] >> ECOND_FRAME::BITS_POS) & 0b1) << ECONDFlag::BITS_POS); econdInfo.view()[ECONDdenseIdx].payloadLength() = (uint16_t)econd_payload_length; econdInfo.view()[ECONDdenseIdx].econdFlag() = (uint8_t)econdFlag; - econdInfo.view()[ECONDdenseIdx].exception() = 0; - + // convert ECON-D packets into 32b words -- need to swap the order of the two 32b words in the 64b word auto econd_payload = to_econd_payload(ptr, econd_payload_length); @@ -167,8 +162,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, << ", econd_headers = " << std::hex << std::setfill('0') << std::setw(8) << econd_headers[0] << " " << econd_headers[1] << std::dec << ", econd_payload_length = " << econd_payload_length; - //quality check for ECON-D (no need to check again econd_pkt_status here again) - if ((((econd_headers[0] >> ECOND_FRAME::HT_POS) & ECOND_FRAME::HT_MASK) >= 0b10) || + //quality check for ECON-D + if (econd_pkt_status != 0b000 || (((econd_headers[0] >> ECOND_FRAME::HT_POS) & ECOND_FRAME::HT_MASK) >= 0b10) || (((econd_headers[0] >> ECOND_FRAME::EBO_POS) & ECOND_FRAME::EBO_MASK) >= 0b10) || (((econd_headers[0] >> ECOND_FRAME::BITM_POS) & 0b1) == 0) || (((econd_headers[0] >> ECOND_FRAME::BITM_POS) & 0b1) == 0) || econd_payload_length == 0 || headerOnlyMode) { @@ -214,7 +209,7 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, // check if the channel has data if (((erxHeader >> channelIdx) & 1) == 0) { - //digis.view()[denseIdx].flags() = FIXME! set flag as suppressed + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; continue; } @@ -269,14 +264,13 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); // check if the channel has data - if (((erxHeader >> channelIdx) & 1) == 0) { - //digis.view()[denseIdx].flags() = FIXME! set flag as suppressed + if (((erxHeader >> channelIdx) & 1) == 0) { + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; continue; } - - // check if in characterization mode + // check if in characteristic mode if (fedConfig.econds[globalECONDIdx].rocs[erxIdx / 2].charMode) { - //characterization mode + //characteristic mode digis.view()[denseIdx].tctp() = (econd_payload[iword] >> 30) & 0b11; digis.view()[denseIdx].adcm1() = 0; digis.view()[denseIdx].adc() = (econd_payload[iword] >> 20) & 0b1111111111; @@ -284,8 +278,7 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, digis.view()[denseIdx].toa() = econd_payload[iword] & 0b1111111111; digis.view()[denseIdx].cm() = cmSum; digis.view()[denseIdx].flags() = 0; - - } else { + } else { //not characteristic mode digis.view()[denseIdx].tctp() = (econd_payload[iword] >> 30) & 0b11; @@ -299,7 +292,7 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, } digis.view()[denseIdx].toa() = econd_payload[iword] & 0b1111111111; digis.view()[denseIdx].cm() = cmSum; - digis.view()[denseIdx].flags() = 0; + digis.view()[denseIdx].flags() = flags_[iword]; } iword += 1; } @@ -307,14 +300,13 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, } // end of ECON-D parsing if (iword != econd_payload_length - 1) { - econdInfo.view()[ECONDdenseIdx].exception() = 5; - //SHOULD NOT THROW!!!! - //throw cms::Exception("CorruptData") - // << "Mismatch between unpacked and expected ECON-D #" << (int)globalECONDIdx << " payload length\n" - // << " unpacked payload length=" << iword + 1 << "\n" - // << " expected payload length=" << econd_payload_length; + econdInfo.view()[ECONDdenseIdx].exception() = 5; + throw cms::Exception("CorruptData") + << "Mismatch between unpacked and expected ECON-D #" << (int)globalECONDIdx << " payload length\n" + << " unpacked payload length=" << iword + 1 << "\n" + << " expected payload length=" << econd_payload_length; } - + econdInfo.view()[ECONDdenseIdx].exception() = 0; } // skip the padding word as capture blocks are padded to 128b if (std::distance(ptr, header) % 2) { From 2de4239a0b7197e0f1aa282362dc6dbfb0e83fc9 Mon Sep 17 00:00:00 2001 From: yulunmiao Date: Tue, 30 Jul 2024 21:10:22 +0200 Subject: [PATCH 2/5] update the other part to most recent commit --- .../HGCalRawToDigi/src/HGCalUnpacker.cc | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc index 8234e982d8f27..ce22eec537cfb 100644 --- a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc +++ b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc @@ -105,6 +105,7 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, ++ptr; // parse Capture Block body (ECON-Ds) for (uint32_t econdIdx = 0; econdIdx < HGCalMappingModuleIndexer::maxECONDperCB_; econdIdx++) { + auto econd_pkt_status = (cb_header >> (3 * econdIdx)) & 0b111; LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx << ", econdIdx = " << econdIdx << ", econd_pkt_status = " << econd_pkt_status; @@ -112,13 +113,14 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, // always increment the global ECON-D index (unless inactive/unconnected) globalECONDIdx++; } + bool pkt_exists = - (econd_pkt_status == backend::ECONDPacketStatus::Normal) || - (econd_pkt_status == backend::ECONDPacketStatus::PayloadCRCError) || - (econd_pkt_status == backend::ECONDPacketStatus::EventIDMismatch) || - (econd_pkt_status == backend::ECONDPacketStatus::BCIDOrbitIDMismatch); // TODO: `BCIDOrbitIDMismatch` + (econd_pkt_status == backend::ECONDPacketStatus::Normal) || + (econd_pkt_status == backend::ECONDPacketStatus::PayloadCRCError) || + (econd_pkt_status == backend::ECONDPacketStatus::EventIDMismatch) || + (fedConfig.mismatchPassthroughMode && econd_pkt_status == backend::ECONDPacketStatus::BCIDOrbitIDMismatch); if (!pkt_exists) { - continue; + continue; } // ECON-D header (two 32b words) @@ -131,10 +133,12 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, if (((econd_headers[0] >> ECOND_FRAME::HEADER_POS) & ECOND_FRAME::HEADER_MASK) != fedConfig.econds[globalECONDIdx].headerMarker) { econdInfo.view()[ECONDdenseIdx].exception() = 3; - throw cms::Exception("CorruptData") - << "Expected a ECON-D header at word " << std::dec << (uint32_t)(ptr - header) << "/0x" << std::hex - << (uint32_t)(ptr - header) << " (marker: 0x" << fedConfig.econds[globalECONDIdx].headerMarker - << "), got 0x" << econd_headers[0] << "."; + + //DO NOT THROW!! just flag as exception and try to continue + //throw cms::Exception("CorruptData") + // << "Expected a ECON-D header at word " << std::dec << (uint32_t)(ptr - header) << "/0x" << std::hex + // << (uint32_t)(ptr - header) << " (marker: 0x" << fedConfig.econds[globalECONDIdx].headerMarker + // << "), got 0x" << econd_headers[0] << "."; } ++ptr; @@ -151,7 +155,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, (((econd_headers[1] >> ECOND_FRAME::BITS_POS) & 0b1) << ECONDFlag::BITS_POS); econdInfo.view()[ECONDdenseIdx].payloadLength() = (uint16_t)econd_payload_length; econdInfo.view()[ECONDdenseIdx].econdFlag() = (uint8_t)econdFlag; - + econdInfo.view()[ECONDdenseIdx].exception() = 0; + // convert ECON-D packets into 32b words -- need to swap the order of the two 32b words in the 64b word auto econd_payload = to_econd_payload(ptr, econd_payload_length); @@ -162,8 +167,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, << ", econd_headers = " << std::hex << std::setfill('0') << std::setw(8) << econd_headers[0] << " " << econd_headers[1] << std::dec << ", econd_payload_length = " << econd_payload_length; - //quality check for ECON-D - if (econd_pkt_status != 0b000 || (((econd_headers[0] >> ECOND_FRAME::HT_POS) & ECOND_FRAME::HT_MASK) >= 0b10) || + //quality check for ECON-D (no need to check again econd_pkt_status here again) + if ((((econd_headers[0] >> ECOND_FRAME::HT_POS) & ECOND_FRAME::HT_MASK) >= 0b10) || (((econd_headers[0] >> ECOND_FRAME::EBO_POS) & ECOND_FRAME::EBO_MASK) >= 0b10) || (((econd_headers[0] >> ECOND_FRAME::BITM_POS) & 0b1) == 0) || (((econd_headers[0] >> ECOND_FRAME::BITM_POS) & 0b1) == 0) || econd_payload_length == 0 || headerOnlyMode) { @@ -264,13 +269,14 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); // check if the channel has data - if (((erxHeader >> channelIdx) & 1) == 0) { + if (((erxHeader >> channelIdx) & 1) == 0) { digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; continue; } - // check if in characteristic mode + + // check if in characterization mode if (fedConfig.econds[globalECONDIdx].rocs[erxIdx / 2].charMode) { - //characteristic mode + //characterization mode digis.view()[denseIdx].tctp() = (econd_payload[iword] >> 30) & 0b11; digis.view()[denseIdx].adcm1() = 0; digis.view()[denseIdx].adc() = (econd_payload[iword] >> 20) & 0b1111111111; @@ -278,7 +284,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, digis.view()[denseIdx].toa() = econd_payload[iword] & 0b1111111111; digis.view()[denseIdx].cm() = cmSum; digis.view()[denseIdx].flags() = 0; - } else { + + } else { //not characteristic mode digis.view()[denseIdx].tctp() = (econd_payload[iword] >> 30) & 0b11; @@ -300,13 +307,14 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, } // end of ECON-D parsing if (iword != econd_payload_length - 1) { - econdInfo.view()[ECONDdenseIdx].exception() = 5; - throw cms::Exception("CorruptData") - << "Mismatch between unpacked and expected ECON-D #" << (int)globalECONDIdx << " payload length\n" - << " unpacked payload length=" << iword + 1 << "\n" - << " expected payload length=" << econd_payload_length; + econdInfo.view()[ECONDdenseIdx].exception() = 5; + //SHOULD NOT THROW!!!! + //throw cms::Exception("CorruptData") + // << "Mismatch between unpacked and expected ECON-D #" << (int)globalECONDIdx << " payload length\n" + // << " unpacked payload length=" << iword + 1 << "\n" + // << " expected payload length=" << econd_payload_length; } - econdInfo.view()[ECONDdenseIdx].exception() = 0; + } // skip the padding word as capture blocks are padded to 128b if (std::distance(ptr, header) % 2) { From d99b7cb3385ca47f45ce92559f3201dd7fc9042e Mon Sep 17 00:00:00 2001 From: yulunmiao Date: Thu, 1 Aug 2024 16:46:13 +0200 Subject: [PATCH 3/5] Add flags for passthrough ECON-Ds --- .../interface/HGCalRawDataDefinitions.h | 7 +- .../HGCalRawToDigi/src/HGCalUnpacker.cc | 85 +++++++++---------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h index 97f443f2f5b10..7bb03cee3110c 100644 --- a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h +++ b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h @@ -108,12 +108,17 @@ namespace hgcal { }; enum DIGI_FLAG { + //Flags for normal ECON-D FULL_READOUT = 0x0000, ZS_ADCm1 = 0x0001, ZS_ToA = 0x0002, ZS_ToA_ADCm1 = 0x0003, ZS_ADC = 0x0004, - Invalid = 0x0005 + Invalid = 0x0005, + //Flags for passthrough ECON-D + Normal = 0x8000, + Characterization = 0x8001, + Inactive = 0x8002, }; } // namespace hgcal diff --git a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc index ce22eec537cfb..a7a86ed087565 100644 --- a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc +++ b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc @@ -51,10 +51,10 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, const auto* ptr = header; for (unsigned iword = 0; ptr < trailer; ++iword) { - LogDebug("[HGCalUnpacker]") << std::setw(8) << iword << ": 0x" << std::hex << std::setfill('0') << std::setw(16) << *ptr << " (" - << std::setfill('0') << std::setw(8) << *(reinterpret_cast(ptr) + 1) << " " - << std::setfill('0') << std::setw(8) << *reinterpret_cast(ptr) << ")" << std::dec - ; + LogDebug("[HGCalUnpacker]") << std::setw(8) << iword << ": 0x" << std::hex << std::setfill('0') << std::setw(16) + << *ptr << " (" << std::setfill('0') << std::setw(8) + << *(reinterpret_cast(ptr) + 1) << " " << std::setfill('0') + << std::setw(8) << *reinterpret_cast(ptr) << ")" << std::dec; ++ptr; } @@ -84,11 +84,12 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, for (uint32_t captureblockIdx = 0; captureblockIdx < HGCalMappingModuleIndexer::maxCBperFED_ && ptr < trailer - 2; captureblockIdx++) { // check capture block header (64b) - LogDebug("[HGCalUnpacker]") << "@" << std::setw(8) << std::distance(header, ptr) << ": 0x" << std::hex << std::setfill('0') - << std::setw(16) << *ptr << std::dec; + LogDebug("[HGCalUnpacker]") << "@" << std::setw(8) << std::distance(header, ptr) << ": 0x" << std::hex + << std::setfill('0') << std::setw(16) << *ptr << std::dec; auto cb_header = *ptr; - LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx << ", cb_header = " << std::hex - << std::setfill('0') << std::setw(16) << cb_header << std::dec; + LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx + << ", cb_header = " << std::hex << std::setfill('0') << std::setw(16) << cb_header + << std::dec; // sanity check if (((cb_header >> (BACKEND_FRAME::CAPTUREBLOCK_RESERVED_POS + 32)) & BACKEND_FRAME::CAPTUREBLOCK_RESERVED_MASK) != fedConfig.cbHeaderMarker) { @@ -105,27 +106,26 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, ++ptr; // parse Capture Block body (ECON-Ds) for (uint32_t econdIdx = 0; econdIdx < HGCalMappingModuleIndexer::maxECONDperCB_; econdIdx++) { - auto econd_pkt_status = (cb_header >> (3 * econdIdx)) & 0b111; - LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx << ", econdIdx = " << econdIdx - << ", econd_pkt_status = " << econd_pkt_status; + LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx + << ", econdIdx = " << econdIdx << ", econd_pkt_status = " << econd_pkt_status; if (econd_pkt_status != backend::ECONDPacketStatus::InactiveECOND) { // always increment the global ECON-D index (unless inactive/unconnected) globalECONDIdx++; } - + bool pkt_exists = - (econd_pkt_status == backend::ECONDPacketStatus::Normal) || - (econd_pkt_status == backend::ECONDPacketStatus::PayloadCRCError) || - (econd_pkt_status == backend::ECONDPacketStatus::EventIDMismatch) || - (fedConfig.mismatchPassthroughMode && econd_pkt_status == backend::ECONDPacketStatus::BCIDOrbitIDMismatch); + (econd_pkt_status == backend::ECONDPacketStatus::Normal) || + (econd_pkt_status == backend::ECONDPacketStatus::PayloadCRCError) || + (econd_pkt_status == backend::ECONDPacketStatus::EventIDMismatch) || + (fedConfig.mismatchPassthroughMode && econd_pkt_status == backend::ECONDPacketStatus::BCIDOrbitIDMismatch); if (!pkt_exists) { - continue; + continue; } // ECON-D header (two 32b words) - LogDebug("[HGCalUnpacker]") << "@" << std::setw(8) << std::distance(header, ptr) << ": 0x" << std::hex << std::setfill('0') - << std::setw(16) << *ptr << std::dec; + LogDebug("[HGCalUnpacker]") << "@" << std::setw(8) << std::distance(header, ptr) << ": 0x" << std::hex + << std::setfill('0') << std::setw(16) << *ptr << std::dec; auto econd_headers = to_32b_words(ptr); uint32_t ECONDdenseIdx = moduleIndexer.getIndexForModule(fedId, globalECONDIdx); econdInfo.view()[ECONDdenseIdx].location() = (uint32_t)(ptr - header); @@ -134,10 +134,10 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, fedConfig.econds[globalECONDIdx].headerMarker) { econdInfo.view()[ECONDdenseIdx].exception() = 3; - //DO NOT THROW!! just flag as exception and try to continue + //DO NOT THROW!! just flag as exception and try to continue //throw cms::Exception("CorruptData") // << "Expected a ECON-D header at word " << std::dec << (uint32_t)(ptr - header) << "/0x" << std::hex - // << (uint32_t)(ptr - header) << " (marker: 0x" << fedConfig.econds[globalECONDIdx].headerMarker + // << (uint32_t)(ptr - header) << " (marker: 0x" << fedConfig.econds[globalECONDIdx].headerMarker // << "), got 0x" << econd_headers[0] << "."; } ++ptr; @@ -156,16 +156,17 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, econdInfo.view()[ECONDdenseIdx].payloadLength() = (uint16_t)econd_payload_length; econdInfo.view()[ECONDdenseIdx].econdFlag() = (uint8_t)econdFlag; econdInfo.view()[ECONDdenseIdx].exception() = 0; - + // convert ECON-D packets into 32b words -- need to swap the order of the two 32b words in the 64b word auto econd_payload = to_econd_payload(ptr, econd_payload_length); // forward ptr to the next ECON-D; use integer division with (... + 1) / 2 to round up ptr += (econd_payload_length + 1) / 2; - LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx << ", econdIdx = " << econdIdx - << ", econd_headers = " << std::hex << std::setfill('0') << std::setw(8) << econd_headers[0] << " " - << econd_headers[1] << std::dec << ", econd_payload_length = " << econd_payload_length; + LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx + << ", econdIdx = " << econdIdx << ", econd_headers = " << std::hex + << std::setfill('0') << std::setw(8) << econd_headers[0] << " " << econd_headers[1] + << std::dec << ", econd_payload_length = " << econd_payload_length; //quality check for ECON-D (no need to check again econd_pkt_status here again) if ((((econd_headers[0] >> ECOND_FRAME::HT_POS) & ECOND_FRAME::HT_MASK) >= 0b10) || @@ -189,8 +190,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, if ((enabledErx >> erxIdx & 1) == 0) { continue; } - LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx << ", econdIdx = " << econdIdx - << ", erxIdx=" << erxIdx; + LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx + << ", econdIdx = " << econdIdx << ", erxIdx=" << erxIdx; // check if the eRx sub-packet is empty (the "F" flag in the eRx sub-packet header) if (((econd_payload[iword] >> ECOND_FRAME::ERXFORMAT_POS) & ECOND_FRAME::ERXFORMAT_MASK) == 1) { @@ -203,8 +204,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, uint16_t cmSum = ((econd_payload[iword] >> ECOND_FRAME::COMMONMODE0_POS) & ECOND_FRAME::COMMONMODE0_MASK) + ((econd_payload[iword + 1] >> ECOND_FRAME::COMMONMODE1_POS) & ECOND_FRAME::COMMONMODE1_MASK); uint64_t erxHeader = ((uint64_t)econd_payload[iword] << 32) | ((uint64_t)econd_payload[iword + 1]); - LogDebug("[HGCalUnpacker]") << "erx_headers = 0x" << std::hex << std::setfill('0') << std::setw(16) << erxHeader - << ", cmSum = " << std::dec << cmSum; + LogDebug("[HGCalUnpacker]") << "erx_headers = 0x" << std::hex << std::setfill('0') << std::setw(16) + << erxHeader << ", cmSum = " << std::dec << cmSum; iword += 2; // parse erx body (channel data) @@ -214,7 +215,7 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, // check if the channel has data if (((erxHeader >> channelIdx) & 1) == 0) { - digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; continue; } @@ -246,8 +247,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, if ((enabledErx >> erxIdx & 1) == 0) { continue; } - LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx << ", econdIdx = " << econdIdx - << ", erxIdx=" << erxIdx; + LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx + << ", econdIdx = " << econdIdx << ", erxIdx=" << erxIdx; // check if the eRx sub-packet is empty (the "F" flag in the eRx sub-packet header) if (((econd_payload[iword] >> ECOND_FRAME::ERXFORMAT_POS) & ECOND_FRAME::ERXFORMAT_MASK) == 1) { @@ -260,8 +261,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, uint16_t cmSum = ((econd_payload[iword] >> ECOND_FRAME::COMMONMODE0_POS) & ECOND_FRAME::COMMONMODE0_MASK) + ((econd_payload[iword + 1] >> ECOND_FRAME::COMMONMODE1_POS) & ECOND_FRAME::COMMONMODE1_MASK); uint64_t erxHeader = ((uint64_t)econd_payload[iword] << 32) | ((uint64_t)econd_payload[iword + 1]); - LogDebug("[HGCalUnpacker]") << "erx_headers = 0x" << std::hex << std::setfill('0') << std::setw(16) << erxHeader - << ", cmSum = " << std::dec << cmSum; + LogDebug("[HGCalUnpacker]") << "erx_headers = 0x" << std::hex << std::setfill('0') << std::setw(16) + << erxHeader << ", cmSum = " << std::dec << cmSum; iword += 2; // parse erx body (channel data) @@ -269,8 +270,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); // check if the channel has data - if (((erxHeader >> channelIdx) & 1) == 0) { - digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; + if (((erxHeader >> channelIdx) & 1) == 0) { + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::Inactive; continue; } @@ -283,9 +284,8 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, digis.view()[denseIdx].tot() = (econd_payload[iword] >> 10) & 0b1111111111; digis.view()[denseIdx].toa() = econd_payload[iword] & 0b1111111111; digis.view()[denseIdx].cm() = cmSum; - digis.view()[denseIdx].flags() = 0; - - } else { + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::Characterization; + } else { //not characteristic mode digis.view()[denseIdx].tctp() = (econd_payload[iword] >> 30) & 0b11; @@ -299,7 +299,7 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, } digis.view()[denseIdx].toa() = econd_payload[iword] & 0b1111111111; digis.view()[denseIdx].cm() = cmSum; - digis.view()[denseIdx].flags() = flags_[iword]; + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::Normal; } iword += 1; } @@ -307,14 +307,13 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, } // end of ECON-D parsing if (iword != econd_payload_length - 1) { - econdInfo.view()[ECONDdenseIdx].exception() = 5; - //SHOULD NOT THROW!!!! + econdInfo.view()[ECONDdenseIdx].exception() = 5; + //SHOULD NOT THROW!!!! //throw cms::Exception("CorruptData") // << "Mismatch between unpacked and expected ECON-D #" << (int)globalECONDIdx << " payload length\n" // << " unpacked payload length=" << iword + 1 << "\n" // << " expected payload length=" << econd_payload_length; } - } // skip the padding word as capture blocks are padded to 128b if (std::distance(ptr, header) % 2) { From 1513435759c61c7bcf344f2e52ee645fbd7a132c Mon Sep 17 00:00:00 2001 From: yulunmiao Date: Thu, 1 Aug 2024 18:21:18 +0200 Subject: [PATCH 4/5] Debug: loop through every denseIdx --- EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc index a7a86ed087565..d539d916bd711 100644 --- a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc +++ b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc @@ -188,6 +188,10 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, for (uint32_t erxIdx = 0; erxIdx < erxMax; erxIdx++) { // check if the eRx is enabled if ((enabledErx >> erxIdx & 1) == 0) { + for (uint32_t channelIdx = 0; channelIdx < maxChPerErxNonCM; channelIdx++) { + uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; + } continue; } LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx @@ -245,6 +249,10 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, for (uint32_t erxIdx = 0; erxIdx < erxMax; erxIdx++) { // check if the eRx is enabled if ((enabledErx >> erxIdx & 1) == 0) { + for (uint32_t channelIdx = 0; channelIdx < maxChPerErxNonCM; channelIdx++) { + uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); + digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::Inactive; + } continue; } LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx From be54b0a0f5281d2fb6fd0419f5df7b16e049c7ec Mon Sep 17 00:00:00 2001 From: yulunmiao Date: Thu, 1 Aug 2024 23:14:27 +0200 Subject: [PATCH 5/5] Fix the number of channel in eRx;Add default flag for digi, representing digi not read in raw data --- .../interface/HGCalRawDataDefinitions.h | 6 +++--- .../HGCalRawToDigi/plugins/HGCalRawToDigi.cc | 4 ++++ EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc | 17 ++--------------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h index 7bb03cee3110c..b0cbb88885ad5 100644 --- a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h +++ b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h @@ -113,12 +113,12 @@ namespace hgcal { ZS_ADCm1 = 0x0001, ZS_ToA = 0x0002, ZS_ToA_ADCm1 = 0x0003, - ZS_ADC = 0x0004, - Invalid = 0x0005, + Invalid = 0x0004, //Flags for passthrough ECON-D Normal = 0x8000, Characterization = 0x8001, - Inactive = 0x8002, + //Flag for digi not in raw data + NotAvailable = 0xFFFF }; } // namespace hgcal diff --git a/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc b/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc index 14545f475dad9..4022841a3a891 100644 --- a/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc +++ b/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc @@ -12,6 +12,7 @@ #include "DataFormats/HGCalDigi/interface/HGCalElectronicsId.h" #include "DataFormats/HGCalDigi/interface/HGCalDigiHost.h" #include "DataFormats/HGCalDigi/interface/HGCalECONDInfoHost.h" +#include "DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h" #include "CondFormats/DataRecord/interface/HGCalElectronicsMappingRcd.h" #include "CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h" @@ -112,6 +113,9 @@ void HGCalRawToDigi::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) // retrieve the FED raw data const auto& raw_data = iEvent.get(fedRawToken_); + for(int32_t i=0; i < digis.view().metadata().size();i++){ + digis.view()[i].flags() = hgcal::DIGI_FLAG::NotAvailable; + } for (unsigned fedId = 0; fedId < moduleIndexer_.nfeds_; ++fedId) { const auto& fed_data = raw_data.FEDData(fedId); if (fed_data.size() == 0) diff --git a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc index d539d916bd711..e98f895fd452a 100644 --- a/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc +++ b/EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc @@ -19,9 +19,6 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, hgcaldigi::HGCalDigiHost& digis, hgcaldigi::HGCalECONDInfoHost& econdInfo, bool headerOnlyMode) { - // number of non-CM channels (= 37) - constexpr uint16_t maxChPerErxNonCM = HGCalMappingCellIndexer::maxChPerErx_ - 2; - // ReadoutSequence object for this FED const auto& fedReadoutSequence = moduleIndexer.fedReadoutSequences_[fedId]; // Configuration object for this FED @@ -188,10 +185,6 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, for (uint32_t erxIdx = 0; erxIdx < erxMax; erxIdx++) { // check if the eRx is enabled if ((enabledErx >> erxIdx & 1) == 0) { - for (uint32_t channelIdx = 0; channelIdx < maxChPerErxNonCM; channelIdx++) { - uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); - digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; - } continue; } LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx @@ -214,12 +207,11 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, // parse erx body (channel data) uint32_t iBit = 0; - for (uint32_t channelIdx = 0; channelIdx < maxChPerErxNonCM; channelIdx++) { + for (uint32_t channelIdx = 0; channelIdx < HGCalMappingCellIndexer::maxChPerErx_; channelIdx++) { uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); // check if the channel has data if (((erxHeader >> channelIdx) & 1) == 0) { - digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::ZS_ADC; continue; } @@ -249,10 +241,6 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, for (uint32_t erxIdx = 0; erxIdx < erxMax; erxIdx++) { // check if the eRx is enabled if ((enabledErx >> erxIdx & 1) == 0) { - for (uint32_t channelIdx = 0; channelIdx < maxChPerErxNonCM; channelIdx++) { - uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); - digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::Inactive; - } continue; } LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx @@ -274,12 +262,11 @@ void HGCalUnpacker::parseFEDData(unsigned fedId, iword += 2; // parse erx body (channel data) - for (uint32_t channelIdx = 0; channelIdx < maxChPerErxNonCM; channelIdx++) { + for (uint32_t channelIdx = 0; channelIdx < HGCalMappingCellIndexer::maxChPerErx_; channelIdx++) { uint32_t denseIdx = moduleIndexer.getIndexForModuleData(fedId, globalECONDIdx, erxIdx, channelIdx); // check if the channel has data if (((erxHeader >> channelIdx) & 1) == 0) { - digis.view()[denseIdx].flags() = hgcal::DIGI_FLAG::Inactive; continue; }