diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx index 9e50d2ec1179c07b7e0dbbdb1d9a9608cec27c86..e70f580f2c9a0da6b60265c08b8722122504bcf3 100644 --- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx +++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx @@ -661,6 +661,7 @@ StatusCode SCT_RodDecoder::processHeader(const uint16_t inData, // This is the real calculation for the offline data.linkNumber = (((rodlinkNumber >>4)&0x7)*12+(rodlinkNumber &0xF)); const uint32_t onlineID{(robID & 0xFFFFFF) | (data.linkNumber << 24)}; + IdentifierHash hash; if ((onlineID ==0) or (data.linkNumber > 95)) { ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs)); hasError = true; @@ -670,7 +671,15 @@ StatusCode SCT_RodDecoder::processHeader(const uint16_t inData, return sc; } else { - data.setCollection(m_sctID, m_cabling->getHashFromOnlineId(onlineID, ctx), rdoIDCont, errs); + hash = m_cabling->getHashFromOnlineId(onlineID, ctx); + if (hash.is_valid()) { + data.setCollection(m_sctID, hash, rdoIDCont, errs); + } + else { + std::stringstream msg; + msg <<std::hex << onlineID; + ATH_MSG_ERROR("Rob fragment (rob=" << robID << ") with invalid onlineID " << msg.str() << " -> " << hash << "."); + } } // Look for masked off links - bit 7 if ((inData >> 7) & 0x1) { @@ -712,6 +721,12 @@ StatusCode SCT_RodDecoder::processHeader(const uint16_t inData, ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::FormatterError, errs)); hasError = true; } + if (!hasError and not hash.is_valid()) { + std::stringstream msg; + msg <<std::hex << onlineID; + ATH_MSG_ERROR("Rob fragment (rob=" << robID << ") with invalid onlineID " << msg.str() << " -> " << hash << "."); + hasError = true; + } data.condensedMode = static_cast<bool>(inData & 0x100); @@ -991,19 +1006,13 @@ StatusCode SCT_RodDecoder::processExpandedHit(const uint16_t inData, } else { // Next hits cluster expanded if (inData & 0x80) { // Paired hits - if (data.strip >= N_STRIPS_PER_SIDE) { + if (data.strip >= N_STRIPS_PER_SIDE-2) { ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs)); hasError = true; ATH_MSG_DEBUG("Expanded mode - strip number out of range"); return sc; } m_evenExpHitNumber++; - if (chip>=N_CHIPS_PER_SIDE) { - ATH_MSG_DEBUG("Expanded Hit: paired hits xxx ERROR chip Nb = " << chip << " >= " << N_CHIPS_PER_SIDE); - m_chipNumberError++; - ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs)); - return sc; - } // First hit from the pair data.strip++; data.timeBin = (inData & 0x7); @@ -1031,10 +1040,10 @@ StatusCode SCT_RodDecoder::processExpandedHit(const uint16_t inData, } else { // Last hit of the cluster m_lastExpHitNumber++; - if (chip>=N_CHIPS_PER_SIDE) { - ATH_MSG_DEBUG("Expanded Hit: last hit xxx ERROR chip Nb = " << chip << " >= " << N_CHIPS_PER_SIDE); - m_chipNumberError++; + if (data.strip >= N_STRIPS_PER_SIDE-1) { ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs)); + hasError = true; + ATH_MSG_DEBUG("Expanded mode - strip number out of range"); return sc; } data.strip++; diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h index 5825fdcfb0f9b978e8be996b9ddd9a013d3f5732..c938780a0a937bab637a9160dfd20528aa444d30 100644 --- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h +++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h @@ -1,7 +1,7 @@ // -*- C++ -*- /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #ifndef INDETRAWDATABYTESTREAM_SCT_RODDECODER_H @@ -147,12 +147,19 @@ class SCT_RodDecoder : public extends<AthAlgTool, ISCT_RodDecoder> // For MissingLinkHeaderError bool foundMissingLinkHeaderError{false}; std::unordered_set<IdentifierHash> foundHashes; - - std::unordered_map<IdentifierHash, std::unique_ptr<SCT_RDO_Collection>> rdoCollMap; // If SCT_RDO_Collection* is nullptr, it means the collection is already present in the container. - std::unordered_map<IdentifierHash, SCT_RDO_Container::IDC_WriteHandle> writeHandleMap; + struct Hasher { + std::size_t operator()(const IdentifierHash &hash) const { return hash.value();} + }; + std::unordered_map<IdentifierHash, std::unique_ptr<SCT_RDO_Collection>, Hasher> rdoCollMap; // If SCT_RDO_Collection* is nullptr, it means the collection is already present in the container. + std::unordered_map<IdentifierHash, SCT_RDO_Container::IDC_WriteHandle, Hasher> writeHandleMap; bool foundHeader{false}; + SharedData() { + writeHandleMap.reserve( 72); + rdoCollMap.reserve( 72 ); + } + void reset() { strip = 0; oldStrip = -1; @@ -169,18 +176,20 @@ class SCT_RodDecoder : public extends<AthAlgTool, ISCT_RodDecoder> } void setSaved(const bool isOld, const int code) { if (isOld) { - saved[oldSide*N_STRIPS_PER_SIDE + oldStrip] = code; + saved.at(oldSide*N_STRIPS_PER_SIDE + oldStrip) = code; } else { - saved[ side*N_STRIPS_PER_SIDE + strip] = code; + saved.at( side*N_STRIPS_PER_SIDE + strip) = code; } } bool isSaved(const bool isOld) { if (isOld) { - return saved[oldSide*N_STRIPS_PER_SIDE + oldStrip]; + unsigned int idx = static_cast<std::size_t>(oldSide*N_STRIPS_PER_SIDE + oldStrip); + return idx < saved.size() ? saved[idx] : false; } else { - return saved[ side*N_STRIPS_PER_SIDE + strip]; + const unsigned int idx = static_cast<unsigned int>(side*N_STRIPS_PER_SIDE + strip); + return idx < saved.size() ? saved[idx] : false; } } void setCollection(const SCT_ID* sctID,