From a9ea2670bc820eecc9241cea757948173c86504e Mon Sep 17 00:00:00 2001 From: Susumu Oda <susumu.oda@cern.ch> Date: Wed, 23 Jan 2019 19:26:21 +0000 Subject: [PATCH] Make SCTEventFlagWriter and SCTRawDataProvider reentrant (ATLASRECTS-4824) --- .../ISCT_ByteStreamErrorsTool.h | 9 ++++--- .../src/SCT_ByteStreamErrorsTool.cxx | 18 ++++++------- .../src/SCT_ByteStreamErrorsTool.h | 4 +-- .../src/SCTEventFlagWriter.cxx | 12 ++++----- .../src/SCTEventFlagWriter.h | 8 +++--- .../src/SCTRawDataProvider.cxx | 25 ++++++++----------- .../src/SCTRawDataProvider.h | 8 +++--- 7 files changed, 42 insertions(+), 42 deletions(-) diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/SCT_ConditionsTools/ISCT_ByteStreamErrorsTool.h b/InnerDetector/InDetConditions/SCT_ConditionsTools/SCT_ConditionsTools/ISCT_ByteStreamErrorsTool.h index a229b5f9db6..0350b90af77 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsTools/SCT_ConditionsTools/ISCT_ByteStreamErrorsTool.h +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/SCT_ConditionsTools/ISCT_ByteStreamErrorsTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /** @@ -11,12 +11,14 @@ #ifndef ISCT_ByteStreamErrorsTool_h #define ISCT_ByteStreamErrorsTool_h -#include <set> - #include "InDetConditionsSummaryService/InDetHierarchy.h" #include "SCT_ConditionsTools/ISCT_ConditionsTool.h" #include "SCT_ConditionsData/SCT_ByteStreamErrors.h" +#include "GaudiKernel/EventContext.h" + +#include <set> + class Identifier; class IdentifierHash; @@ -38,6 +40,7 @@ class ISCT_ByteStreamErrorsTool: virtual public ISCT_ConditionsTool { //@} virtual const std::set<IdentifierHash>* getErrorSet(int errorType) const =0; + virtual const std::set<IdentifierHash>* getErrorSet(int errorType, const EventContext& ctx) const =0; virtual bool isRODSimulatedData() const =0; virtual bool isRODSimulatedData(const IdentifierHash& elementIdHash) const =0; diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.cxx b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.cxx index 44330c08632..c2994778c4b 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.cxx +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /** @@ -111,8 +111,8 @@ SCT_ByteStreamErrorsTool::isGood(const IdentifierHash& elementIdHash) const { bool result{true}; for (SCT_ByteStreamErrors::errorTypes badError: SCT_ByteStreamErrors::BadErrors) { - const std::set<IdentifierHash>& errorSet{getErrorSet(badError, ctx)}; - result = (errorSet.count(elementIdHash)==0); + const std::set<IdentifierHash>* errorSet{getErrorSet(badError, ctx)}; + result = (errorSet->count(elementIdHash)==0); if (not result) return result; } @@ -265,9 +265,9 @@ const std::set<IdentifierHash>* SCT_ByteStreamErrorsTool::getErrorSet(int errorType) const { const EventContext& ctx{Gaudi::Hive::currentContext()}; if (errorType>=0 and errorType<SCT_ByteStreamErrors::NUM_ERROR_TYPES) { - return &getErrorSet(static_cast<SCT_ByteStreamErrors::errorTypes>(errorType), ctx); + return getErrorSet(errorType, ctx); } - return 0; + return nullptr; } //////////////////////////////////////////////////////////////////////// @@ -383,8 +383,8 @@ SCT_ByteStreamErrorsTool::isRODSimulatedData() const { bool SCT_ByteStreamErrorsTool::isRODSimulatedData(const IdentifierHash& elementIdHash) const { const EventContext& ctx{Gaudi::Hive::currentContext()}; - const std::set<IdentifierHash>& errorSet{getErrorSet(SCT_ByteStreamErrors::RODSimulatedData, ctx)}; - return (errorSet.count(elementIdHash)!=0); + const std::set<IdentifierHash>* errorSet{getErrorSet(SCT_ByteStreamErrors::RODSimulatedData, ctx)}; + return (errorSet->count(elementIdHash)!=0); } /////////////////////////////////////////////////////////////////////////////// @@ -436,13 +436,13 @@ const InDetDD::SiDetectorElement* SCT_ByteStreamErrorsTool::getDetectorElement(c return m_detectorElements->getDetectorElement(waferHash); } -const std::set<IdentifierHash>& SCT_ByteStreamErrorsTool::getErrorSet(SCT_ByteStreamErrors::errorTypes errorType, const EventContext& ctx) const { +const std::set<IdentifierHash>* SCT_ByteStreamErrorsTool::getErrorSet(int errorType, const EventContext& ctx) const { StatusCode sc{fillData(ctx)}; if (sc.isFailure()) { ATH_MSG_ERROR("fillData in getErrorSet fails"); } - return m_bsErrors[errorType][ctx.slot()]; + return &m_bsErrors[errorType][ctx.slot()]; } const std::map<Identifier, unsigned int>& SCT_ByteStreamErrorsTool::getTempMaskedChips(const EventContext& ctx) const { diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.h b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.h index b4c37254fb8..3a7b2dfbff7 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.h +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_ByteStreamErrorsTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /** @@ -62,6 +62,7 @@ public: virtual bool isGood(const IdentifierHash& elementIdHash) const override; const std::set<IdentifierHash>* getErrorSet(int errorType) const override; // Used by SCTRawDataProviderTool and others + const std::set<IdentifierHash>* getErrorSet(int errorType, const EventContext& ctx) const override; // Used by SCTRawDataProviderTool and others virtual unsigned int tempMaskedChips(const Identifier& moduleId) const override; // Internally used virtual unsigned int abcdErrorChips(const Identifier& moduleId) const override; // Internally used @@ -111,7 +112,6 @@ private: const SCT_ByteStreamFractionContainer* getFracData() const; const InDetDD::SiDetectorElement* getDetectorElement(const IdentifierHash& waferHash) const; - const std::set<IdentifierHash>& getErrorSet(SCT_ByteStreamErrors::errorTypes errorType, const EventContext& ctx) const; const std::map<Identifier, unsigned int>& getTempMaskedChips(const EventContext& ctx) const; const std::map<Identifier, unsigned int>& getAbcdErrorChips(const EventContext& ctx) const; }; diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.cxx b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.cxx index aac33e7c254..7c1a0d70120 100644 --- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.cxx +++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "SCTEventFlagWriter.h" @@ -9,7 +9,7 @@ // Constructor SCTEventFlagWriter::SCTEventFlagWriter(const std::string& name, ISvcLocator* pSvcLocator) : - AthAlgorithm(name, pSvcLocator) + AthReentrantAlgorithm(name, pSvcLocator) { } @@ -25,14 +25,14 @@ StatusCode SCTEventFlagWriter::initialize() // Execute -StatusCode SCTEventFlagWriter::execute() +StatusCode SCTEventFlagWriter::execute(const EventContext& ctx) const { - long unsigned int nLVL1IDErrors{m_bsErrTool->getErrorSet(SCT_ByteStreamErrors::LVL1IDError)->size()}; - long unsigned int nROBFragmentErrors{m_bsErrTool->getErrorSet(SCT_ByteStreamErrors::ROBFragmentError)->size()}; + long unsigned int nLVL1IDErrors{m_bsErrTool->getErrorSet(SCT_ByteStreamErrors::LVL1IDError, ctx)->size()}; + long unsigned int nROBFragmentErrors{m_bsErrTool->getErrorSet(SCT_ByteStreamErrors::ROBFragmentError, ctx)->size()}; if ((nLVL1IDErrors > 500) or (nROBFragmentErrors > 1000)) { // Check if number of errors exceed threshold bool setOK_xAOD{false}; - SG::ReadHandle<xAOD::EventInfo> xAODEvtInfo{m_xAODEvtInfoKey}; // Retrive xAOD EventInfo + SG::ReadHandle<xAOD::EventInfo> xAODEvtInfo{m_xAODEvtInfoKey, ctx}; // Retrive xAOD EventInfo if (xAODEvtInfo.isValid()) { // Retriving xAOD EventInfo successful setOK_xAOD = xAODEvtInfo->updateErrorState(xAOD::EventInfo::SCT, xAOD::EventInfo::Error); } diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.h b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.h index 665085c3611..ad1afd761fd 100644 --- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.h +++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTEventFlagWriter.h @@ -1,11 +1,11 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef SCT_RAWDATABYTESTREAMCNV_SCTEVENTFLAGWRITER_H #define SCT_RAWDATABYTESTREAMCNV_SCTEVENTFLAGWRITER_H -#include "AthenaBaseComps/AthAlgorithm.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" #include "xAODEventInfo/EventInfo.h" #include "StoreGate/ReadHandleKey.h" @@ -21,7 +21,7 @@ class ISCT_ByteStreamErrorsTool; * This algorithm flags an event bad if it has >500 LVL1ID errors or * >1000 ROBFragment errors. */ -class SCTEventFlagWriter : public AthAlgorithm +class SCTEventFlagWriter : public AthReentrantAlgorithm { public: @@ -35,7 +35,7 @@ class SCTEventFlagWriter : public AthAlgorithm virtual StatusCode initialize() override; /** Execute */ - virtual StatusCode execute() override; + virtual StatusCode execute(const EventContext& ctx) const override; private: diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.cxx b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.cxx index 32acf01264b..25604d4d4ba 100644 --- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.cxx +++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "SCTRawDataProvider.h" @@ -17,7 +17,7 @@ using OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment; // Constructor SCTRawDataProvider::SCTRawDataProvider(const std::string& name, ISvcLocator* pSvcLocator) : - AthAlgorithm(name, pSvcLocator), + AthReentrantAlgorithm(name, pSvcLocator), m_regionSelector{"RegSelSvc", name}, m_robDataProvider{"ROBDataProviderSvc", name}, m_sctID{nullptr}, @@ -63,28 +63,27 @@ typedef EventContainers::IdentifiableContTemp<InDetRawDataCollection<SCT_RDORawD // Execute -StatusCode SCTRawDataProvider::execute() +StatusCode SCTRawDataProvider::execute(const EventContext& ctx) const { m_rawDataTool->beginNewEvent(); - SG::WriteHandle<SCT_RDO_Container> rdoContainer(m_rdoContainerKey); + SG::WriteHandle<SCT_RDO_Container> rdoContainer(m_rdoContainerKey, ctx); bool externalCacheRDO = !m_rdoContainerCacheKey.key().empty(); if (not externalCacheRDO) { ATH_CHECK(rdoContainer.record (std::make_unique<SCT_RDO_Container>(m_sctID->wafer_hash_max()))); ATH_MSG_DEBUG("Created container for " << m_sctID->wafer_hash_max()); } else { - SG::UpdateHandle<SCT_RDO_Cache> update(m_rdoContainerCacheKey); + SG::UpdateHandle<SCT_RDO_Cache> update(m_rdoContainerCacheKey, ctx); ATH_CHECK(update.isValid()); ATH_CHECK(rdoContainer.record (std::make_unique<SCT_RDO_Container>(update.ptr()))); ATH_MSG_DEBUG("Created container using cache for " << m_rdoContainerCacheKey.key()); } - - SG::WriteHandle<InDetBSErrContainer> bsErrContainer(m_bsErrContainerKey); + SG::WriteHandle<InDetBSErrContainer> bsErrContainer(m_bsErrContainerKey, ctx); ATH_CHECK(bsErrContainer.record(std::make_unique<InDetBSErrContainer>())); - SG::WriteHandle<SCT_ByteStreamFractionContainer> bsFracContainer(m_bsFracContainerKey); + SG::WriteHandle<SCT_ByteStreamFractionContainer> bsFracContainer(m_bsFracContainerKey, ctx); ATH_CHECK(bsFracContainer.record(std::make_unique<SCT_ByteStreamFractionContainer>())); // Ask ROBDataProviderSvc for the vector of ROBFragment for all SCT ROBIDs @@ -97,7 +96,7 @@ StatusCode SCTRawDataProvider::execute() else { // Only load ROBs from RoI std::vector<uint32_t> listOfROBs; - SG::ReadHandle<TrigRoiDescriptorCollection> roiCollection{m_roiCollectionKey}; + SG::ReadHandle<TrigRoiDescriptorCollection> roiCollection{m_roiCollectionKey, ctx}; ATH_CHECK(roiCollection.isValid()); TrigRoiDescriptor superRoI; // Add all RoIs to a super-RoI superRoI.setComposite(true); @@ -109,14 +108,13 @@ StatusCode SCTRawDataProvider::execute() m_robDataProvider->getROBData(listOfROBs, vecROBFrags); } - ATH_MSG_DEBUG("Number of ROB fragments " << vecROBFrags.size()); - SG::WriteHandle<InDetTimeCollection> lvl1Collection{m_lvl1CollectionKey}; + SG::WriteHandle<InDetTimeCollection> lvl1Collection{m_lvl1CollectionKey, ctx}; lvl1Collection = std::make_unique<InDetTimeCollection>(vecROBFrags.size()); ATH_CHECK(lvl1Collection.isValid()); - SG::WriteHandle<InDetTimeCollection> bcIDCollection{m_bcIDCollectionKey}; + SG::WriteHandle<InDetTimeCollection> bcIDCollection{m_bcIDCollectionKey, ctx}; bcIDCollection = std::make_unique<InDetTimeCollection>(vecROBFrags.size()); ATH_CHECK(bcIDCollection.isValid()); @@ -151,8 +149,7 @@ StatusCode SCTRawDataProvider::execute() if (m_rawDataTool->convert(vecROBFrags, *rdoInterface, bsErrContainer.ptr(), - bsFracContainer.ptr()).isFailure()) - { + bsFracContainer.ptr()).isFailure()) { ATH_MSG_WARNING("BS conversion into RDOs failed"); } diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.h b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.h index 58d88c5d7f0..22b1a189589 100644 --- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.h +++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCTRawDataProvider.h @@ -1,11 +1,11 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef SCT_RAWDATABYTESTREAMCNV_SCTRAWDATAPROVIDER_H #define SCT_RAWDATABYTESTREAMCNV_SCTRAWDATAPROVIDER_H -#include "AthenaBaseComps/AthAlgorithm.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" #include "InDetRawData/InDetTimeCollection.h" #include "InDetRawData/SCT_RDO_Container.h" @@ -39,7 +39,7 @@ class SCT_ByteStreamFractionContainer; * * Class based on TRT equivalent. */ -class SCTRawDataProvider : public AthAlgorithm +class SCTRawDataProvider : public AthReentrantAlgorithm { public: @@ -53,7 +53,7 @@ class SCTRawDataProvider : public AthAlgorithm virtual StatusCode initialize() override; /** Execute */ - virtual StatusCode execute() override; + virtual StatusCode execute(const EventContext& ctx) const override; private: -- GitLab