From b3e27ee25e9624428bdc9f30296c4aa017c02ba6 Mon Sep 17 00:00:00 2001 From: Chengdong Fu <fucd@ihep.ac.cn> Date: Thu, 21 Oct 2021 10:55:44 +0800 Subject: [PATCH] change to control merge/unmerge hits of same cell by map option --- .../DetSimSD/include/DetSimSD/CaloSensitiveDetector.h | 3 ++- Simulation/DetSimSD/src/CaloSensitiveDetector.cpp | 11 ++++++----- Simulation/DetSimSD/src/CalorimeterSensDetTool.cpp | 10 +++++++++- Simulation/DetSimSD/src/CalorimeterSensDetTool.h | 1 + 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Simulation/DetSimSD/include/DetSimSD/CaloSensitiveDetector.h b/Simulation/DetSimSD/include/DetSimSD/CaloSensitiveDetector.h index 5e228698..0ad3398a 100644 --- a/Simulation/DetSimSD/include/DetSimSD/CaloSensitiveDetector.h +++ b/Simulation/DetSimSD/include/DetSimSD/CaloSensitiveDetector.h @@ -15,7 +15,7 @@ public: typedef G4THitsCollection<CalorimeterHit> CaloHitCollection; public: - CaloSensitiveDetector(const std::string& name, dd4hep::Detector& description); + CaloSensitiveDetector(const std::string& name, dd4hep::Detector& description, bool unmerge=true); public: // Geant4 interface @@ -31,6 +31,7 @@ protected: HitCollection* m_hc; std::map<unsigned long, CalorimeterHit*> m_hitMap; + bool m_unmerge; }; diff --git a/Simulation/DetSimSD/src/CaloSensitiveDetector.cpp b/Simulation/DetSimSD/src/CaloSensitiveDetector.cpp index 25ce6e6e..8fd0dcb7 100644 --- a/Simulation/DetSimSD/src/CaloSensitiveDetector.cpp +++ b/Simulation/DetSimSD/src/CaloSensitiveDetector.cpp @@ -4,9 +4,10 @@ #include <algorithm> -CaloSensitiveDetector::CaloSensitiveDetector(const std::string& name, dd4hep::Detector& description) +CaloSensitiveDetector::CaloSensitiveDetector(const std::string& name, dd4hep::Detector& description, bool unmerge) : DDG4SensitiveDetector(name, description), - m_hc(nullptr) { + m_hc(nullptr), + m_unmerge(unmerge){ const std::string& coll_name = m_sensitive.hitsCollection(); collectionName.insert(coll_name); } @@ -38,7 +39,7 @@ CaloSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*) { unsigned long id = getCellID( step ); //std::cout << name << " " << id << std::endl; CalorimeterHit* hit=nullptr; - if(name.find("Merge")==-1&&name.find("merge")==-1) find(m_hc,dd4hep::sim::HitPositionCompare<CalorimeterHit>(pos)); + if(m_unmerge) hit=find(m_hc,dd4hep::sim::HitPositionCompare<CalorimeterHit>(pos)); else{ std::map<unsigned long, CalorimeterHit*>::iterator it = m_hitMap.find(id); if(it!=m_hitMap.end()) hit = it->second; @@ -46,9 +47,9 @@ CaloSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*) { // G4cout << "----------- Geant4GenericSD<Calorimeter>::buildHits : position : " << pos << G4endl; if ( !hit ) { hit = new CalorimeterHit(pos); - hit->cellID = getCellID( step ); + hit->cellID = id; //getCellID( step ); m_hc->insert(hit); - if(name.find("Merge")!=-1||name.find("merge")!=-1) m_hitMap[id] = hit; + if(!m_unmerge) m_hitMap[id] = hit; } hit->truth.push_back(contrib); hit->energyDeposit += contrib.deposit; diff --git a/Simulation/DetSimSD/src/CalorimeterSensDetTool.cpp b/Simulation/DetSimSD/src/CalorimeterSensDetTool.cpp index 844104e2..cb7be229 100644 --- a/Simulation/DetSimSD/src/CalorimeterSensDetTool.cpp +++ b/Simulation/DetSimSD/src/CalorimeterSensDetTool.cpp @@ -35,7 +35,15 @@ CalorimeterSensDetTool::createSD(const std::string& name) { dd4hep::Detector* dd4hep_geo = m_geosvc->lcdd(); - G4VSensitiveDetector* sd = new CaloSensitiveDetector(name, *dd4hep_geo); + bool flagUnmerge = false; + for(auto cal_name : m_unmergeCals){ + if(cal_name==name){ + flagUnmerge = true; + break; + } + } + G4VSensitiveDetector* sd = new CaloSensitiveDetector(name, *dd4hep_geo, flagUnmerge); + debug() << name << " set to merge true/false = " << !flagUnmerge << endmsg; return sd; } diff --git a/Simulation/DetSimSD/src/CalorimeterSensDetTool.h b/Simulation/DetSimSD/src/CalorimeterSensDetTool.h index f3e0796b..dd1b24f0 100644 --- a/Simulation/DetSimSD/src/CalorimeterSensDetTool.h +++ b/Simulation/DetSimSD/src/CalorimeterSensDetTool.h @@ -29,6 +29,7 @@ private: // in order to initialize SD, we need to get the lcdd() SmartIF<IGeomSvc> m_geosvc; + Gaudi::Property<std::vector<std::string> > m_unmergeCals{this, "UnmergedCalNames", {}}; }; #endif -- GitLab