From fdbc34c938135c32545ec00f7b03419d96223422 Mon Sep 17 00:00:00 2001
From: Sunanda <sunanda.banerjee@cern.ch>
Date: Thu, 21 Jan 2021 23:18:20 +0100
Subject: [PATCH 1/2] Define fine calorimeters thrugh python

---
 SimG4CMS/Calo/src/CaloSD.cc                   | 72 +++++++++----------
 SimG4CMS/Calo/src/CaloTrkProcessing.cc        | 29 ++++----
 SimG4CMS/Calo/test/python/runHGC4_cfg.py      |  9 ++-
 SimG4Core/Application/python/g4SimHits_cfi.py |  3 +
 4 files changed, 60 insertions(+), 53 deletions(-)

diff --git a/SimG4CMS/Calo/src/CaloSD.cc b/SimG4CMS/Calo/src/CaloSD.cc
index 0f02c23b83226..da0257d7a0099 100644
--- a/SimG4CMS/Calo/src/CaloSD.cc
+++ b/SimG4CMS/Calo/src/CaloSD.cc
@@ -30,7 +30,7 @@
 #include <memory>
 #include <sstream>
 
-// #define EDM_ML_DEBUG
+//#define EDM_ML_DEBUG
 
 CaloSD::CaloSD(const std::string& name,
                const edm::EventSetup& es,
@@ -70,6 +70,9 @@ CaloSD::CaloSD(const std::string& name,
   correctT = beamZ / CLHEP::c_light / CLHEP::nanosecond;
   doFineCalo_ = m_CaloSD.getParameter<bool>("DoFineCalo");
   eMinFine_ = m_CaloSD.getParameter<double>("EminFineTrack") * CLHEP::MeV;
+  std::vector<std::string> fineNames = m_CaloSD.getParameter<std::vector<std::string> >("FineCaloNames");
+  std::vector<int> fineLevels = m_CaloSD.getParameter<std::vector<int> >("FineCaloLevels");
+  std::vector<int> useFines = m_CaloSD.getParameter<std::vector<int> >("UseFineCalo");
 
   SetVerboseLevel(verbn);
   meanResponse.reset(nullptr);
@@ -110,46 +113,41 @@ CaloSD::CaloSD(const std::string& name,
                               << timeSlice << "\nIgnore TrackID Flag " << ignoreTrackID << " doFineCalo flag "
                               << doFineCalo_;
 
-  // Get pointer to CaloSimulationParameters
-  edm::ESHandle<CaloSimulationParameters> csps;
-  es.get<HcalParametersRcd>().get(csps);
-  if (csps.isValid()) {
-    const CaloSimulationParameters* csp = csps.product();
-    edm::LogVerbatim("CaloSim") << "CaloSD: " << csp->fCaloNames_.size() << " entries for fineCalorimeters:";
-    for (unsigned int i = 0; i < csp->fCaloNames_.size(); i++)
-      edm::LogVerbatim("CaloSim") << " [" << i << "] " << csp->fCaloNames_[i] << ":" << csp->fLevels_[i];
-
-    const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
-    std::vector<G4LogicalVolume*>::const_iterator lvcite;
-    for (unsigned int i = 0; i < csp->fCaloNames_.size(); i++) {
-      G4LogicalVolume* lv = nullptr;
-      G4String name = static_cast<G4String>(csp->fCaloNames_[i]);
-      for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) {
-        if ((*lvcite)->GetName() == name) {
-          lv = (*lvcite);
-          break;
-        }
-      }
-      if (lv != nullptr) {
-        CaloSD::Detector detector;
-        detector.name = name;
-        detector.lv = lv;
-        detector.level = csp->fLevels_[i];
-        fineDetectors_.emplace_back(detector);
+  // Treat fine calorimeters
+  edm::LogVerbatim("CaloSim") << "CaloSD: Have a possibility of " << fineNames.size() << " fine calorimeters of which " << useFines.size() << " are selected";
+  for (unsigned int k = 0; k < fineNames.size(); ++k)
+    edm::LogVerbatim("CaloSim") << "[" << k << "] " << fineNames[k] << " at " << fineLevels[k];
+  std::ostringstream st1;
+  for (unsigned int k = 0; k < useFines.size(); ++k)
+    st1 << " [" << k << "] " << useFines[k] << ":" << fineNames[useFines[k]];
+  edm::LogVerbatim("CaloSim") << "CaloSD used calorimeters" << st1.str();
+  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
+  std::vector<G4LogicalVolume*>::const_iterator lvcite;
+  for (unsigned int i = 0; i < useFines.size(); i++) {
+    G4LogicalVolume* lv = nullptr;
+    G4String name = static_cast<G4String>(fineNames[useFines[i]]);
+    for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) {
+      if ((*lvcite)->GetName() == name) {
+	lv = (*lvcite);
+	break;
       }
     }
-#ifdef EDM_ML_DEBUG
-    edm::LogVerbatim("CaloSim") << "CaloSD::Loads information for " << fineDetectors_.size() << " fine detectors";
-    unsigned int k(0);
-    for (const auto& detector : fineDetectors_) {
-      edm::LogVerbatim("CaloSim") << "Detector[" << k << "] " << detector.name << " at level " << detector.level
-                                  << " pointer to LV: " << detector.lv;
+    if (lv != nullptr) {
+      CaloSD::Detector detector;
+      detector.name = name;
+      detector.lv = lv;
+      detector.level = fineLevels[useFines[i]];
+      fineDetectors_.emplace_back(detector);
     }
-#endif
-  } else {
-    edm::LogError("CaloSim") << "CaloSD: Cannot find CaloSimulationParameters";
-    throw cms::Exception("Unknown", "CaloSD") << "Cannot find CaloSimulationParameters\n";
   }
+#ifdef EDM_ML_DEBUG
+  edm::LogVerbatim("CaloSim") << "CaloSD::Loads information for " << fineDetectors_.size() << " fine detectors";
+  unsigned int k(0);
+  for (const auto& detector : fineDetectors_) {
+    edm::LogVerbatim("CaloSim") << "Detector[" << k << "] " << detector.name << " at level " << detector.level
+				<< " pointer to LV: " << detector.lv;
+  }
+#endif
 }
 
 CaloSD::~CaloSD() {}
diff --git a/SimG4CMS/Calo/src/CaloTrkProcessing.cc b/SimG4CMS/Calo/src/CaloTrkProcessing.cc
index 39324a8789ef0..44320e54a6e04 100644
--- a/SimG4CMS/Calo/src/CaloTrkProcessing.cc
+++ b/SimG4CMS/Calo/src/CaloTrkProcessing.cc
@@ -12,15 +12,14 @@
 #include "FWCore/Utilities/interface/Exception.h"
 
 #include "G4EventManager.hh"
-
 #include "G4LogicalVolumeStore.hh"
 #include "G4LogicalVolume.hh"
 #include "G4Step.hh"
 #include "G4Track.hh"
-
 #include "G4SystemOfUnits.hh"
 
-// #define EDM_ML_DEBUG
+#include <sstream>
+//#define EDM_ML_DEBUG
 
 CaloTrkProcessing::CaloTrkProcessing(const std::string& name,
                                      const edm::EventSetup& es,
@@ -35,9 +34,19 @@ CaloTrkProcessing::CaloTrkProcessing(const std::string& name,
   putHistory_ = m_p.getParameter<bool>("PutHistory");
   doFineCalo_ = m_p.getParameter<bool>("DoFineCalo");
   eMinFine_ = m_p.getParameter<double>("EminFineTrack") * CLHEP::MeV;
+  std::vector<std::string> fineNames = m_p.getParameter<std::vector<std::string> >("FineCaloNames");
+  std::vector<int> fineLevels = m_p.getParameter<std::vector<int> >("FineCaloLevels");
+  std::vector<int> useFines = m_p.getParameter<std::vector<int> >("UseFineCalo");
 
   edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: Initialised with TestBeam = " << testBeam_ << " Emin = " << eMin_
                               << " Flags " << putHistory_ << " (History), " << doFineCalo_ << " (Special Calorimeter)";
+  edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: Have a possibility of " << fineNames.size() << " fine calorimeters of which " << useFines.size() << " are selected";
+  for (unsigned int k = 0; k < fineNames.size(); ++k)
+    edm::LogVerbatim("CaloSim") << "[" << k << "] " << fineNames[k] << " at " << fineLevels[k];
+  std::ostringstream st1;
+  for (unsigned int k = 0; k < useFines.size(); ++k)
+    st1 << " [" << k << "] " << useFines[k] << ":" << fineNames[useFines[k]];
+  edm::LogVerbatim("CaloSim") << "CaloTrkProcessing used calorimeters" << st1.str();
 
   // Get pointer to CaloSimulationParameters
   edm::ESHandle<CaloSimulationParameters> csps;
@@ -60,14 +69,6 @@ CaloTrkProcessing::CaloTrkProcessing(const std::string& name,
     edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: " << csp->insideLevel_.size() << " entries for insideLevel:";
     for (unsigned int i = 0; i < csp->insideLevel_.size(); i++)
       edm::LogVerbatim("CaloSim") << " (" << i << ") " << csp->insideLevel_[i];
-    edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: " << csp->fCaloNames_.size()
-                                << " entries for fineCalorimeterNames:";
-    for (unsigned int i = 0; i < csp->fCaloNames_.size(); i++)
-      edm::LogVerbatim("CaloSim") << " (" << i << ") " << csp->fCaloNames_[i];
-    edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: " << csp->fLevels_.size()
-                                << " entries for fineCalorimeterLevels:";
-    for (unsigned int i = 0; i < csp->fLevels_.size(); i++)
-      edm::LogVerbatim("CaloSim") << " (" << i << ") " << csp->fLevels_[i];
 #endif
 
     if (csp->caloNames_.size() < csp->neighbours_.size()) {
@@ -125,9 +126,9 @@ CaloTrkProcessing::CaloTrkProcessing(const std::string& name,
       istart += csp->neighbours_[i];
     }
 
-    for (unsigned int i = 0; i < csp->fCaloNames_.size(); i++) {
+    for (unsigned int i = 0; i < useFines.size(); i++) {
       G4LogicalVolume* lv = nullptr;
-      G4String name = static_cast<G4String>(csp->fCaloNames_[i]);
+      G4String name = static_cast<G4String>(fineNames[useFines[i]]);
       for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) {
         if ((*lvcite)->GetName() == name) {
           lv = (*lvcite);
@@ -138,7 +139,7 @@ CaloTrkProcessing::CaloTrkProcessing(const std::string& name,
         CaloTrkProcessing::Detector detector;
         detector.name = name;
         detector.lv = lv;
-        detector.level = csp->fLevels_[i];
+        detector.level = fineLevels[useFines[i]];
         detector.fromDets.clear();
         detector.fromDetL.clear();
         detector.fromLevels.clear();
diff --git a/SimG4CMS/Calo/test/python/runHGC4_cfg.py b/SimG4CMS/Calo/test/python/runHGC4_cfg.py
index 71d9dc579407d..d5c0196538979 100644
--- a/SimG4CMS/Calo/test/python/runHGC4_cfg.py
+++ b/SimG4CMS/Calo/test/python/runHGC4_cfg.py
@@ -64,10 +64,15 @@
 process.g4SimHits.Physics.type = 'SimG4Core/Physics/FTFP_BERT_EMM'
 process.g4SimHits.Physics.DefaultCutValue          = 0.1
 process.g4SimHits.HGCSD.CornerMinMask              = 3
-process.g4SimHits.CaloSD.UseFineCaloID             = True
+process.g4SimHits.CaloSD.UseFineCalo               = [2]
+process.g4SimHits.CaloTrkProcessing.UseFineCalo    = [2]
+process.g4SimHits.TrackingAction.UseFineCalo       = [2]
+process.g4SimHits.CaloSD.DoFineCalo                = True
 process.g4SimHits.CaloTrkProcessing.DoFineCalo     = True
+process.g4SimHits.TrackingAction.DoFineCalo        = True
+process.g4SimHits.CaloSD.EminFineTrack             = 1000.0
 process.g4SimHits.CaloTrkProcessing.EminFineTrack  = 1000.0
-process.g4SimHits.CaloTrkProcessing.EminFinePhoton = 500.0
+process.g4SimHits.TrackingAction.EminFineTrack     = 1000.0
 
 # Schedule definition
 process.schedule = cms.Schedule(process.generation_step,
diff --git a/SimG4Core/Application/python/g4SimHits_cfi.py b/SimG4Core/Application/python/g4SimHits_cfi.py
index b69c077743078..b54b28eaae131 100644
--- a/SimG4Core/Application/python/g4SimHits_cfi.py
+++ b/SimG4Core/Application/python/g4SimHits_cfi.py
@@ -45,6 +45,9 @@
     DoFineCalo = cms.bool(False),
     # currently unused; left in place for future studies
     EminFineTrack = cms.double(10000.0),
+    FineCaloNames = cms.vstring('ECAL', 'HCAL', 'HGCal', 'HFNoseVol', 'VCAL'),
+    FineCaloLevels = cms.vint32(4, 4, 8, 3, 3),
+    UseFineCalo = cms.vint32(2, 3),
 )
 
 ## enable fine calorimeter functionality: must occur *before* common PSet is used below

From 5ac789df58b91871f0ba235d78bf1460f307a3d0 Mon Sep 17 00:00:00 2001
From: Sunanda <sunanda.banerjee@cern.ch>
Date: Fri, 22 Jan 2021 00:10:56 +0100
Subject: [PATCH 2/2] Code check

---
 SimG4CMS/Calo/src/CaloSD.cc            | 15 ++++++++-------
 SimG4CMS/Calo/src/CaloTrkProcessing.cc |  3 ++-
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/SimG4CMS/Calo/src/CaloSD.cc b/SimG4CMS/Calo/src/CaloSD.cc
index da0257d7a0099..56de27a218f80 100644
--- a/SimG4CMS/Calo/src/CaloSD.cc
+++ b/SimG4CMS/Calo/src/CaloSD.cc
@@ -70,9 +70,9 @@ CaloSD::CaloSD(const std::string& name,
   correctT = beamZ / CLHEP::c_light / CLHEP::nanosecond;
   doFineCalo_ = m_CaloSD.getParameter<bool>("DoFineCalo");
   eMinFine_ = m_CaloSD.getParameter<double>("EminFineTrack") * CLHEP::MeV;
-  std::vector<std::string> fineNames = m_CaloSD.getParameter<std::vector<std::string> >("FineCaloNames");
-  std::vector<int> fineLevels = m_CaloSD.getParameter<std::vector<int> >("FineCaloLevels");
-  std::vector<int> useFines = m_CaloSD.getParameter<std::vector<int> >("UseFineCalo");
+  std::vector<std::string> fineNames = m_CaloSD.getParameter<std::vector<std::string>>("FineCaloNames");
+  std::vector<int> fineLevels = m_CaloSD.getParameter<std::vector<int>>("FineCaloLevels");
+  std::vector<int> useFines = m_CaloSD.getParameter<std::vector<int>>("UseFineCalo");
 
   SetVerboseLevel(verbn);
   meanResponse.reset(nullptr);
@@ -114,7 +114,8 @@ CaloSD::CaloSD(const std::string& name,
                               << doFineCalo_;
 
   // Treat fine calorimeters
-  edm::LogVerbatim("CaloSim") << "CaloSD: Have a possibility of " << fineNames.size() << " fine calorimeters of which " << useFines.size() << " are selected";
+  edm::LogVerbatim("CaloSim") << "CaloSD: Have a possibility of " << fineNames.size() << " fine calorimeters of which "
+                              << useFines.size() << " are selected";
   for (unsigned int k = 0; k < fineNames.size(); ++k)
     edm::LogVerbatim("CaloSim") << "[" << k << "] " << fineNames[k] << " at " << fineLevels[k];
   std::ostringstream st1;
@@ -128,8 +129,8 @@ CaloSD::CaloSD(const std::string& name,
     G4String name = static_cast<G4String>(fineNames[useFines[i]]);
     for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) {
       if ((*lvcite)->GetName() == name) {
-	lv = (*lvcite);
-	break;
+        lv = (*lvcite);
+        break;
       }
     }
     if (lv != nullptr) {
@@ -145,7 +146,7 @@ CaloSD::CaloSD(const std::string& name,
   unsigned int k(0);
   for (const auto& detector : fineDetectors_) {
     edm::LogVerbatim("CaloSim") << "Detector[" << k << "] " << detector.name << " at level " << detector.level
-				<< " pointer to LV: " << detector.lv;
+                                << " pointer to LV: " << detector.lv;
   }
 #endif
 }
diff --git a/SimG4CMS/Calo/src/CaloTrkProcessing.cc b/SimG4CMS/Calo/src/CaloTrkProcessing.cc
index 44320e54a6e04..16900a1e99f06 100644
--- a/SimG4CMS/Calo/src/CaloTrkProcessing.cc
+++ b/SimG4CMS/Calo/src/CaloTrkProcessing.cc
@@ -40,7 +40,8 @@ CaloTrkProcessing::CaloTrkProcessing(const std::string& name,
 
   edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: Initialised with TestBeam = " << testBeam_ << " Emin = " << eMin_
                               << " Flags " << putHistory_ << " (History), " << doFineCalo_ << " (Special Calorimeter)";
-  edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: Have a possibility of " << fineNames.size() << " fine calorimeters of which " << useFines.size() << " are selected";
+  edm::LogVerbatim("CaloSim") << "CaloTrkProcessing: Have a possibility of " << fineNames.size()
+                              << " fine calorimeters of which " << useFines.size() << " are selected";
   for (unsigned int k = 0; k < fineNames.size(); ++k)
     edm::LogVerbatim("CaloSim") << "[" << k << "] " << fineNames[k] << " at " << fineLevels[k];
   std::ostringstream st1;