diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.cxx index d32d25489f84403a23625e59218f364bb85c066f..fca43a5481a17f5be40d651b77e13e04257a5965 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.cxx @@ -70,6 +70,7 @@ StatusCode jFexInputByteStreamTool::convertFromBS(const std::vector<const ROBF*> ATH_CHECK(jTowersContainer.record(std::make_unique<xAOD::jFexTowerContainer>(), std::make_unique<xAOD::jFexTowerAuxContainer>())); ATH_MSG_DEBUG("Recorded jFexTowerContainer with key " << jTowersContainer.key()); + // Iterate over ROBFragments to decode for (const ROBF* rob : vrobf) { @@ -86,7 +87,6 @@ StatusCode jFexInputByteStreamTool::convertFromBS(const std::vector<const ROBF*> const auto dataArray = CxxUtils::span{rob->rod_data(), rob->rod_ndata()}; std::vector<uint32_t> vec_words(dataArray.begin(),dataArray.end()); - // jFEX to ROD trailer position unsigned int trailers_pos = rob->rod_ndata(); @@ -95,6 +95,11 @@ StatusCode jFexInputByteStreamTool::convertFromBS(const std::vector<const ROBF*> bool READ_WORDS = true; while(READ_WORDS){ + if( trailers_pos < jBits::jFEX2ROD_WORDS ){ + ATH_MSG_WARNING("There are not enough words ("<< trailers_pos <<") for the jFEX to ROD trailer decoder. Expected at least " << jBits::jFEX2ROD_WORDS<<". Skipping this FPGA(?)"); + READ_WORDS = false; + continue; + } const auto [payload, jfex, fpga] = jFEXtoRODTrailer ( vec_words.at(trailers_pos-2), vec_words.at(trailers_pos-1) ); if(payload % jBits::DATA_BLOCKS != 0){ @@ -117,7 +122,7 @@ StatusCode jFexInputByteStreamTool::convertFromBS(const std::vector<const ROBF*> ATH_MSG_ERROR(C.B_RED<<"Block size error in fragment 0x"<< std::hex << rob->rob_source_id() << std::dec<<". Words available: " << trailers_pos << ". Number of words wanted to decode: " << Max_iter <<C.END); return StatusCode::FAILURE; } - + for (unsigned int iblock = 0; iblock < Max_iter; iblock++){ const auto [channel, saturation] = BulkStreamTrailer(vec_words.at(wordIndex-1),vec_words.at(wordIndex-2)); diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.h b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.h index 1dea4104ba76821449565b89d5a7bd3117890e01..af18612ca83b4ab3c1dc8e75642a09fcb15fa55a 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.h +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXByteStream/src/jFexInputByteStreamTool.h @@ -75,8 +75,6 @@ class jFexInputByteStreamTool : public extends<AthAlgTool, IL1TriggerByteStreamT constexpr static unsigned int mapIndex(unsigned int jfex, unsigned int fpga, unsigned int channel, unsigned int tower); std::unordered_map<unsigned int, std::array<float,6> > m_Firm2Tower_map; /// {map index, {IDsimulation,eta,phi,source,iEta,iPhi}} - - }; #endif // JFEXINPUTBYTESTREAMTOOL_H