From 55e5a92c7fe07240d08cb4a19b15a9472f510009 Mon Sep 17 00:00:00 2001
From: Alexandre Laurier <alexandre.laurier@cern.ch>
Date: Fri, 17 Apr 2020 21:09:31 +0200
Subject: [PATCH] Manually sweep !31843 from 21.3 to master

---
 .../share/skeleton.FilterHit.py               |  27 ++++-
 .../src/McEventCollectionFilter.cxx           | 110 ++++++++++++++++--
 .../src/McEventCollectionFilter.h             |  19 ++-
 3 files changed, 142 insertions(+), 14 deletions(-)

diff --git a/Simulation/SimuJobTransforms/share/skeleton.FilterHit.py b/Simulation/SimuJobTransforms/share/skeleton.FilterHit.py
index 9cbf7394613..b84d4eca1d7 100644
--- a/Simulation/SimuJobTransforms/share/skeleton.FilterHit.py
+++ b/Simulation/SimuJobTransforms/share/skeleton.FilterHit.py
@@ -173,13 +173,20 @@ else:
 #                     "CaloCalibrationHitContainer#TileCalibHitInactiveCell",
 #                     "CaloCalibrationHitContainer#TileCalibHitDeadMaterial" ]
 #CSC
-Stream1.ItemList+=["CSCSimHitCollection#CSC_Hits"]
+if DetFlags.detdescr.CSC_on():
+    Stream1.ItemList+=["CSCSimHitCollection#CSC_Hits"]
 #MDT
 Stream1.ItemList+=["MDTSimHitCollection#MDT_Hits"]
 #RPC
 Stream1.ItemList+=["RPCSimHitCollection#RPC_Hits"]
 #TGC
 Stream1.ItemList+=["TGCSimHitCollection#TGC_Hits"]
+#STGC
+if DetFlags.detdescr.sTGC_on():
+    Stream1.ItemList+=["sTGCSimHitCollection#sTGCSensitiveDetector"]
+#MM
+if DetFlags.detdescr.Micromegas_on():
+    Stream1.ItemList+=["MMSimHitCollection#MicromegasSensitiveDetector"]
 
 
 #--------------------------------------------------------------
@@ -229,6 +236,8 @@ if hasattr(runArgs,'TruthReductionScheme'):
         AddressRemappingSvc.addInputRename("MDTSimHitCollection","MDT_Hits","MDT_HitsOLD")
         AddressRemappingSvc.addInputRename("RPCSimHitCollection","RPC_Hits","RPC_HitsOLD")
         AddressRemappingSvc.addInputRename("TGCSimHitCollection","TGC_Hits","TGC_HitsOLD")
+        AddressRemappingSvc.addInputRename("sTGCSimHitCollection","sTGCSensitiveDetector","sTGCSensitiveDetectorOLD")
+        AddressRemappingSvc.addInputRename("MMSimHitCollection","MicromegasSensitiveDetector","MicromegasSensitiveDetectorOLD")
     except:
         pass
 
@@ -244,6 +253,22 @@ if hasattr(runArgs,'TruthReductionScheme'):
             McEventCollectionFilter.UseTRTHits = False
         except:
             filterHitLog.error('Trying to run on upgrade samples (no TRT) with an old tag of McEventCollectionFilter - job will fail.')
+    if not DetFlags.detdescr.CSC_on():
+        try:
+            McEventCollectionFilter.UseCSCHits = False
+        except:
+            filterHitLog.error('Trying to run on upgrade samples (no CSC) with an old tag of McEventCollectionFilter - job will fail.')
+    ## For RUN3 geometries, turn on the NSW technologies.
+    if DetFlags.detdescr.sTGC_on():
+        try:
+            McEventCollectionFilter.UseSTGCHits = True
+        except:
+            filterHitLog.error('Failed to add sTGC Hits to McEventCollectionFilter - job will fail.')
+    if DetFlags.detdescr.Micromegas_on():
+        try:
+            McEventCollectionFilter.UseMMHits = True
+        except:
+            filterHitLog.error('Failed to add Micromega Hits to McEventCollectionFilter - job will fail.')
     topSequence += McEventCollectionFilter
 
 
diff --git a/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.cxx b/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.cxx
index a347b359273..a95a9c93d6c 100644
--- a/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.cxx
+++ b/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.cxx
@@ -13,6 +13,8 @@
 #include "InDetSimEvent/SiHit.h"
 #include "MuonSimEvent/TGCSimHit.h"
 #include "MuonSimEvent/CSCSimHit.h"
+#include "MuonSimEvent/sTGCSimHit.h"
+#include "MuonSimEvent/MMSimHit.h"
 // CLHEP
 #include "CLHEP/Vector/LorentzVector.h"
 #include "CLHEP/Units/SystemOfUnits.h"
@@ -28,22 +30,29 @@ McEventCollectionFilter::McEventCollectionFilter(const std::string& name, ISvcLo
   , m_inputPixelHits("StoreGateSvc+PixelHitsOLD")
   , m_inputSCTHits("StoreGateSvc+SCT_HitsOLD")
   , m_inputTRTHits("StoreGateSvc+TRTUncompressedHitsOLD")
-  , m_inputCSCHits("StoreGateSvc+CSCHitsOLD")
-  , m_inputMDTHits("StoreGateSvc+MDTHitsOLD")
-  , m_inputRPCHits("StoreGateSvc+RPCHitsOLD")
-  , m_inputTGCHits("StoreGateSvc+TGCHitsOLD")
+  , m_inputCSCHits("StoreGateSvc+CSC_HitsOLD")
+  , m_inputMDTHits("StoreGateSvc+MDT_HitsOLD")
+  , m_inputRPCHits("StoreGateSvc+RPC_HitsOLD")
+  , m_inputTGCHits("StoreGateSvc+TGC_HitsOLD")
+  , m_inputSTGCHits("StoreGateSvc+sTGCSensitiveDetectorOLD")
+  , m_inputMMHits("StoreGateSvc+MicromegasSensitiveDetectorOLD")
   , m_outputTruthCollection("StoreGateSvc+TruthEvent")
   , m_outputBCMHits("StoreGateSvc+BCMHits")
   , m_outputPixelHits("StoreGateSvc+PixelHits")
   , m_outputSCTHits("StoreGateSvc+SCT_Hits")
   , m_outputTRTHits("StoreGateSvc+TRTUncompressedHits")
-  , m_outputCSCHits("StoreGateSvc+CSCHits")
-  , m_outputMDTHits("StoreGateSvc+MDTHits")
-  , m_outputRPCHits("StoreGateSvc+RPCHits")
-  , m_outputTGCHits("StoreGateSvc+TGCHits")
+  , m_outputCSCHits("StoreGateSvc+CSC_Hits")
+  , m_outputMDTHits("StoreGateSvc+MDT_Hits")
+  , m_outputRPCHits("StoreGateSvc+RPC_Hits")
+  , m_outputTGCHits("StoreGateSvc+TGC_Hits")
+  , m_outputSTGCHits("StoreGateSvc+sTGCSensitiveDetector")
+  , m_outputMMHits("StoreGateSvc+MicromegasSensitiveDetector")
   , m_IsKeepTRTElect(false)
   , m_PileupPartPDGID(999) //Geantino
   , m_UseTRTHits(true)
+  , m_UseCSCHits(true) // On unless RUN3 symmetric layout
+  , m_UseSTGCHits(false) // Off unless RUN3 layout
+  , m_UseMMHits(false) // Off unless RUN3 layout
   , m_RefBarcode(0)
 {
   declareProperty("TruthInput"        , m_inputTruthCollection);
@@ -64,9 +73,16 @@ McEventCollectionFilter::McEventCollectionFilter(const std::string& name, ISvcLo
   declareProperty("RPCHitsOutput"     , m_outputRPCHits);
   declareProperty("TGCHitsInput"      , m_inputTGCHits);
   declareProperty("TGCHitsOutput"     , m_outputTGCHits);
+  declareProperty("sTGCHitsInput"     , m_inputSTGCHits);
+  declareProperty("sTGCHitsOutput"    , m_outputSTGCHits);
+  declareProperty("MMHitsInput"       , m_inputMMHits);
+  declareProperty("MMHitsOutput"      , m_outputMMHits);
   declareProperty("IsKeepTRTElect"    , m_IsKeepTRTElect);
   declareProperty("PileupPartPDGID"   , m_PileupPartPDGID);
   declareProperty("UseTRTHits"        , m_UseTRTHits);
+  declareProperty("UseCSCHits"        , m_UseCSCHits);
+  declareProperty("UseSTGCHits"       , m_UseSTGCHits);
+  declareProperty("UseMMHits"         , m_UseMMHits);
 
 }
 
@@ -110,7 +126,9 @@ StatusCode McEventCollectionFilter::execute(){
   ATH_CHECK( MDTHitsTruthRelink() );
 
   //.......to relink all CSC hits to the new particle
-  ATH_CHECK( CSCHitsTruthRelink() );
+  if(m_UseCSCHits) {
+    ATH_CHECK( CSCHitsTruthRelink() );
+  }
 
   //.......to relink all RPC hits to the new particle
   ATH_CHECK( RPCHitsTruthRelink() );
@@ -118,6 +136,16 @@ StatusCode McEventCollectionFilter::execute(){
   //.......to relink all TGC hits to the new particle
   ATH_CHECK( TGCHitsTruthRelink() );
 
+  //.......to relink all sTGC hits to the new particle
+  if(m_UseSTGCHits) {
+  ATH_CHECK( STGC_HitsTruthRelink() );
+  }
+
+  //.......to relink all MM hits to the new particle
+  if(m_UseMMHits) {
+    ATH_CHECK( MM_HitsTruthRelink() );
+  }
+
   ATH_MSG_DEBUG( "succeded McEventCollectionFilter ..... " );
 
   return StatusCode::SUCCESS;
@@ -473,6 +501,70 @@ StatusCode McEventCollectionFilter::TGCHitsTruthRelink(){
   return StatusCode::SUCCESS;
 }
 
+//--------------------------------------------------------
+StatusCode McEventCollectionFilter::STGC_HitsTruthRelink(){
+  //--------------------------------------------------------
+  //.......to relink all sTGC hits to the new particle
+  //--------------------------------------------------------
+  if(!m_inputSTGCHits.isValid())
+    {
+      ATH_MSG_ERROR( "Could not find sTGCSimHitCollection");
+      return StatusCode::FAILURE;
+    }
+  ATH_MSG_DEBUG( "Found sTGCSimHitCollection");
+
+  if (!m_outputSTGCHits.isValid()) m_outputSTGCHits = std::make_unique<sTGCSimHitCollection>();
+  for(sTGCSimHitConstIterator i=m_inputSTGCHits->begin();i!=m_inputSTGCHits->end();++i){
+    const HepMcParticleLink oldLink = (*i).particleLink();
+    int curBarcode=0;
+    if(oldLink.barcode()!=0)  curBarcode=m_RefBarcode;
+    HepMcParticleLink partLink(curBarcode, oldLink.eventIndex(), oldLink.getEventCollection());
+
+    int             id = (*i).sTGCId();
+    double        time = (*i).globalTime();
+    Amg::Vector3D  pos = (*i).globalPosition();
+    int          pdgID = (*i).particleEncoding();
+    Amg::Vector3D  dir = (*i).globalDirection();
+    double   enDeposit = (*i).depositEnergy();
+
+    m_outputSTGCHits->Emplace(id,time,pos,pdgID,dir,enDeposit,partLink);
+  }
+
+  return StatusCode::SUCCESS;
+}
+
+//--------------------------------------------------------
+StatusCode McEventCollectionFilter::MM_HitsTruthRelink(){
+  //--------------------------------------------------------
+  //.......to relink all MM hits to the new particle
+  //--------------------------------------------------------
+  if(!m_inputMMHits.isValid())
+    {
+      ATH_MSG_ERROR( "Could not find MMSimHitCollection");
+      return StatusCode::FAILURE;
+    }
+  ATH_MSG_DEBUG( "Found MMSimHitCollection");
+
+  if (!m_outputMMHits.isValid()) m_outputMMHits = std::make_unique<MMSimHitCollection>();
+  for(MMSimHitConstIterator i=m_outputMMHits->begin();i!=m_outputMMHits->end();++i){
+    const HepMcParticleLink oldLink = (*i).particleLink();
+    int curBarcode=0;
+    if(oldLink.barcode()!=0)  curBarcode=m_RefBarcode;
+    HepMcParticleLink partLink(curBarcode, oldLink.eventIndex(), oldLink.getEventCollection());
+
+    int             id = (*i).MMId();
+    double        time = (*i).globalTime();
+    Amg::Vector3D  pos = (*i).globalPosition();
+    int          pdgID = (*i).particleEncoding();
+    double    kinEnergy = (*i).kineticEnergy();
+    Amg::Vector3D  dir = (*i).globalDirection();
+    double   enDeposit = (*i).depositEnergy();
+
+    m_outputMMHits->Emplace(id,time,pos,pdgID,kinEnergy,dir,enDeposit,partLink);
+  }
+
+  return StatusCode::SUCCESS;
+}
 
 //--------------------------------------------------------
 StatusCode McEventCollectionFilter::FindTRTElectronHits()
diff --git a/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.h b/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.h
index dad034f0900..a000f0f0d33 100644
--- a/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.h
+++ b/Simulation/Tools/McEventCollectionFilter/src/McEventCollectionFilter.h
@@ -16,6 +16,8 @@
 #include "MuonSimEvent/RPCSimHitCollection.h"
 #include "MuonSimEvent/TGCSimHitCollection.h"
 #include "MuonSimEvent/CSCSimHitCollection.h"
+#include "MuonSimEvent/sTGCSimHitCollection.h"
+#include "MuonSimEvent/MMSimHitCollection.h"
 
 // std library includes
 #include <string>
@@ -42,6 +44,8 @@ private:
   StatusCode CSCHitsTruthRelink();
   StatusCode RPCHitsTruthRelink();
   StatusCode TGCHitsTruthRelink();
+  StatusCode STGC_HitsTruthRelink();
+  StatusCode MM_HitsTruthRelink();
 
   SG::ReadHandle<McEventCollection>  m_inputTruthCollection;
   SG::ReadHandle<SiHitCollection>  m_inputBCMHits;
@@ -52,20 +56,27 @@ private:
   SG::ReadHandle<MDTSimHitCollection>  m_inputMDTHits;
   SG::ReadHandle<RPCSimHitCollection>  m_inputRPCHits;
   SG::ReadHandle<TGCSimHitCollection>  m_inputTGCHits;
+  SG::ReadHandle<sTGCSimHitCollection> m_inputSTGCHits;
+  SG::ReadHandle<MMSimHitCollection>   m_inputMMHits;
 
   SG::WriteHandle<McEventCollection> m_outputTruthCollection;
   SG::WriteHandle<SiHitCollection> m_outputBCMHits;
   SG::WriteHandle<SiHitCollection> m_outputPixelHits;
   SG::WriteHandle<SiHitCollection> m_outputSCTHits;
   SG::WriteHandle<TRTUncompressedHitCollection> m_outputTRTHits;
-  SG::WriteHandle<CSCSimHitCollection> m_outputCSCHits;
-  SG::WriteHandle<MDTSimHitCollection> m_outputMDTHits;
-  SG::WriteHandle<RPCSimHitCollection> m_outputRPCHits;
-  SG::WriteHandle<TGCSimHitCollection> m_outputTGCHits;
+  SG::WriteHandle<CSCSimHitCollection>  m_outputCSCHits;
+  SG::WriteHandle<MDTSimHitCollection>  m_outputMDTHits;
+  SG::WriteHandle<RPCSimHitCollection>  m_outputRPCHits;
+  SG::WriteHandle<TGCSimHitCollection>  m_outputTGCHits;
+  SG::WriteHandle<sTGCSimHitCollection> m_outputSTGCHits;
+  SG::WriteHandle<MMSimHitCollection>   m_outputMMHits;
 
   bool m_IsKeepTRTElect;
   int m_PileupPartPDGID;
   bool m_UseTRTHits;
+  bool m_UseCSCHits;
+  bool m_UseSTGCHits;
+  bool m_UseMMHits;
   //---------------------
   //std::string   m_HitName;
   int m_RefBarcode;
-- 
GitLab