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