From e94ca729c172bc1efb6756624c94df33505a7466 Mon Sep 17 00:00:00 2001
From: Tadej Novak <tadej.novak@cern.ch>
Date: Mon, 16 Nov 2020 15:27:00 +0100
Subject: [PATCH] MM and sTGC overlay without PileUpMergeSvc

---
 .../share/MuonOverlay_jobOptions.py           | 10 ++--------
 .../share/OverlayOutput_jobOptions.py         |  2 ++
 .../MM_Digitization/MM_DigitizationTool.h     |  2 +-
 .../python/MM_DigitizationConfig.py           |  1 +
 .../src/MM_DigitizationTool.cxx               | 19 +++++++++++++++++--
 .../python/sTGC_DigitizationConfig.py         |  1 +
 .../sTGC_Digitization/sTgcDigitizationTool.h  |  2 +-
 .../src/sTgcDigitizationTool.cxx              | 19 +++++++++++++++++--
 8 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/MuonOverlay_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/MuonOverlay_jobOptions.py
index c2608fd0b04..06712206c31 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/MuonOverlay_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/MuonOverlay_jobOptions.py
@@ -47,10 +47,7 @@ if DetFlags.overlay.MDT_on() or DetFlags.overlay.CSC_on() or DetFlags.overlay.RP
         job += CfgGetter.getAlgorithm("MdtDigitToMdtRDO")
 
     if DetFlags.overlay.sTGC_on():
-        # As of July 2019, the input RDOs still hold a DigitContainer
-        # so no Need to run Rdo->Digit
-        # To be changed when we remove digitContainer from RDO
-        #job += CfgGetter.getAlgorithm("STGC_RdoToDigitAlg")
+        job += CfgGetter.getAlgorithm("STGC_RdoToDigitAlg")
         job += CfgGetter.getAlgorithm("STGC_OverlayDigitizer")
         job += CfgGetter.getAlgorithm("STGC_Overlay")
         if not overlayFlags.isDataOverlay():
@@ -58,10 +55,7 @@ if DetFlags.overlay.MDT_on() or DetFlags.overlay.CSC_on() or DetFlags.overlay.RP
         job += CfgGetter.getAlgorithm("STGC_DigitToRDO")
 
     if DetFlags.overlay.Micromegas_on():
-        # As of July 2019, the input RDOs still hold a DigitContainer
-        # so no need to run Rdo->Digit
-        # To be changed when we remove digitContainer from RDO
-        #job += CfgGetter.getAlgorithm("MM_RdoToDigitAlg")
+        job += CfgGetter.getAlgorithm("MM_RdoToDigitAlg")
         job += CfgGetter.getAlgorithm("MM_OverlayDigitizer")
         job += CfgGetter.getAlgorithm("MM_Overlay")
         if not overlayFlags.isDataOverlay():
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutput_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutput_jobOptions.py
index e6115496c7f..18b581350dd 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutput_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutput_jobOptions.py
@@ -115,9 +115,11 @@ if DetFlags.overlay.TGC_on():
 
 if DetFlags.overlay.sTGC_on():
     outStream.ItemList += [ 'Muon::STGC_RawDataContainer#sTGCRDO' ]
+    outStream.ItemList += [ "sTgcDigitContainer#sTGC_DIGITS" ]
 
 if DetFlags.overlay.Micromegas_on():
     outStream.ItemList += [ 'Muon::MM_RawDataContainer#MMRDO' ]
+    outStream.ItemList += [ "MmDigitContainer#MM_DIGITS" ]
 
 if DetFlags.overlay.LVL1_on():
     if DetFlags.simulateLVL1.LAr_on():
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_DigitizationTool.h b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_DigitizationTool.h
index 8365ce9dcbe..b15a49d20da 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_DigitizationTool.h
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_DigitizationTool.h
@@ -113,7 +113,7 @@ class MM_DigitizationTool : public PileUpToolBase {
 
 	private:
 		/** Record MmDigitContainer and MuonSimDataCollection */
-		StatusCode getNextEvent();
+		StatusCode getNextEvent(const EventContext& ctx);
 		StatusCode doDigitization(const EventContext& ctx);
 
 		bool  checkMMSimHit(const MMSimHit& /* hit */ ) const;
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/python/MM_DigitizationConfig.py b/MuonSpectrometer/MuonDigitization/MM_Digitization/python/MM_DigitizationConfig.py
index eda1b277e67..c8179ae9ae6 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/python/MM_DigitizationConfig.py
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/python/MM_DigitizationConfig.py
@@ -53,6 +53,7 @@ def MM_Response_DigitTool(name="MM_Response_DigitTool",**kwargs):
 def MM_OverlayDigitizationTool(name="MM_OverlayDigitizationTool",**kwargs):
     from OverlayCommonAlgs.OverlayFlags import overlayFlags
     if overlayFlags.isOverlayMT():
+        kwargs.setdefault("OnlyUseContainerName", False)
         kwargs.setdefault("OutputObjectName", overlayFlags.sigPrefix() + "MM_DIGITS")
         if not overlayFlags.isDataOverlay():
             kwargs.setdefault("OutputSDOName", overlayFlags.sigPrefix() + "MM_SDO")
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_DigitizationTool.cxx b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_DigitizationTool.cxx
index b5d47b1f6d9..17fedb455de 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_DigitizationTool.cxx
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_DigitizationTool.cxx
@@ -328,7 +328,7 @@ StatusCode MM_DigitizationTool::processBunchXing(int bunchXing,
 }
 
 /*******************************************************************************/
-StatusCode MM_DigitizationTool::getNextEvent() {
+StatusCode MM_DigitizationTool::getNextEvent(const EventContext& ctx) {
 
 // Get next event and extract collection of hit collections:
 // This is applicable to non-PileUp Event...
@@ -338,6 +338,21 @@ StatusCode MM_DigitizationTool::getNextEvent() {
 	//  get the container(s)
 	typedef PileUpMergeSvc::TimedList<MMSimHitCollection>::type TimedHitCollList;
 
+  // In case of single hits container just load the collection using read handles
+  if (!m_onlyUseContainerName) {
+    SG::ReadHandle<MMSimHitCollection> hitCollection(m_hitsContainerKey, ctx);
+    if (!hitCollection.isValid()) {
+      ATH_MSG_ERROR("Could not get MMSimHitCollection container " << hitCollection.name() << " from store " << hitCollection.store());
+      return StatusCode::FAILURE;
+    }
+
+    // create a new hits collection
+    m_timedHitCollection_MM = std::make_unique<TimedHitCollection<MMSimHit>>(1);
+    m_timedHitCollection_MM->insert(0, hitCollection.cptr());
+    ATH_MSG_DEBUG("MMSimHitCollection found with " << hitCollection->size() << " hits");
+    return StatusCode::SUCCESS;
+  }
+
 	//this is a list<info<time_t, DataLink<MMSimHitCollection> > >
 	TimedHitCollList hitCollList;
 
@@ -397,7 +412,7 @@ StatusCode MM_DigitizationTool::processAllSubEvents(const EventContext& ctx) {
 
 	//merging of the hit collection in getNextEvent method
 
-	if (m_timedHitCollection_MM == nullptr) ATH_CHECK( getNextEvent() );
+	if (m_timedHitCollection_MM == nullptr) ATH_CHECK( getNextEvent(ctx) );
 
 	ATH_CHECK( doDigitization(ctx) );
 
diff --git a/MuonSpectrometer/MuonDigitization/sTGC_Digitization/python/sTGC_DigitizationConfig.py b/MuonSpectrometer/MuonDigitization/sTGC_Digitization/python/sTGC_DigitizationConfig.py
index a4d397afc97..da5428886a8 100644
--- a/MuonSpectrometer/MuonDigitization/sTGC_Digitization/python/sTGC_DigitizationConfig.py
+++ b/MuonSpectrometer/MuonDigitization/sTGC_Digitization/python/sTGC_DigitizationConfig.py
@@ -43,6 +43,7 @@ def getSTGCRange(name="sTgcRange", **kwargs):
 def STGC_OverlayDigitizationTool(name="STGC_OverlayDigitizationTool",**kwargs):
     from OverlayCommonAlgs.OverlayFlags import overlayFlags
     if overlayFlags.isOverlayMT():
+        kwargs.setdefault("OnlyUseContainerName", False)
         kwargs.setdefault("OutputObjectName", overlayFlags.sigPrefix() + "sTGC_DIGITS")
         if not overlayFlags.isDataOverlay():
             kwargs.setdefault("OutputSDOName", overlayFlags.sigPrefix() + "sTGC_SDO")
diff --git a/MuonSpectrometer/MuonDigitization/sTGC_Digitization/sTGC_Digitization/sTgcDigitizationTool.h b/MuonSpectrometer/MuonDigitization/sTGC_Digitization/sTGC_Digitization/sTgcDigitizationTool.h
index 885cf8eca76..3cb01a0e203 100644
--- a/MuonSpectrometer/MuonDigitization/sTGC_Digitization/sTGC_Digitization/sTgcDigitizationTool.h
+++ b/MuonSpectrometer/MuonDigitization/sTGC_Digitization/sTGC_Digitization/sTgcDigitizationTool.h
@@ -98,7 +98,7 @@ private:
   CLHEP::HepRandomEngine* getRandomEngine(const std::string& streamName, const EventContext& ctx) const;
 
   /** Get next event and extract collection of hit collections */
-  StatusCode getNextEvent();
+  StatusCode getNextEvent(const EventContext& ctx);
   /** Core part of digitization use by mergeEvent (IPileUpTool) and digitize (IMuonDigitizationTool) */
   StatusCode doDigitization(const EventContext& ctx);
 
diff --git a/MuonSpectrometer/MuonDigitization/sTGC_Digitization/src/sTgcDigitizationTool.cxx b/MuonSpectrometer/MuonDigitization/sTGC_Digitization/src/sTgcDigitizationTool.cxx
index 1c702151c4f..7463d2b4011 100644
--- a/MuonSpectrometer/MuonDigitization/sTGC_Digitization/src/sTgcDigitizationTool.cxx
+++ b/MuonSpectrometer/MuonDigitization/sTGC_Digitization/src/sTgcDigitizationTool.cxx
@@ -216,12 +216,27 @@ StatusCode sTgcDigitizationTool::processBunchXing(int bunchXing,
   return StatusCode::SUCCESS;
 }
 /*******************************************************************************/
-StatusCode sTgcDigitizationTool::getNextEvent() {
+StatusCode sTgcDigitizationTool::getNextEvent(const EventContext& ctx) {
 
   ATH_MSG_DEBUG ( "sTgcDigitizationTool::getNextEvent()" );
 
   //  get the container(s)
   typedef PileUpMergeSvc::TimedList<sTGCSimHitCollection>::type TimedHitCollList;
+
+  // In case of single hits container just load the collection using read handles
+  if (!m_onlyUseContainerName) {
+    SG::ReadHandle<sTGCSimHitCollection> hitCollection(m_hitsContainerKey, ctx);
+    if (!hitCollection.isValid()) {
+      ATH_MSG_ERROR("Could not get sTGCSimHitCollection container " << hitCollection.name() << " from store " << hitCollection.store());
+      return StatusCode::FAILURE;
+    }
+
+    // create a new hits collection
+    m_thpcsTGC = std::make_unique<TimedHitCollection<sTGCSimHit>>(1);
+    m_thpcsTGC->insert(0, hitCollection.cptr());
+    ATH_MSG_DEBUG("sTGCSimHitCollection found with " << hitCollection->size() << " hits");
+    return StatusCode::SUCCESS;
+  }
  
   //this is a list<info<time_t, DataLink<sTGCSimHitCollection> > >
   TimedHitCollList hitCollList;
@@ -288,7 +303,7 @@ StatusCode sTgcDigitizationTool::processAllSubEvents(const EventContext& ctx) {
 
   //merging of the hit collection in getNextEvent method      
   if (m_thpcsTGC == nullptr) {
-    status = getNextEvent();
+    status = getNextEvent(ctx);
     if (StatusCode::FAILURE == status) {
       ATH_MSG_INFO ( "There are no sTGC hits in this event" );
       return status;
-- 
GitLab