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;