diff --git a/Simulation/DetSimSD/include/DetSimSD/CaloSensitiveDetector.h b/Simulation/DetSimSD/include/DetSimSD/CaloSensitiveDetector.h index 28b3ab3b11f7e48b6f300402e1e9e9edefd986bb..db161be4269e9ba94c071a50f647b5a99b38ec19 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 m_isMergeEnabled=true); public: // Geant4 interface @@ -30,6 +30,8 @@ protected: protected: HitCollection* m_hc; + std::map<unsigned long, CalorimeterHit*> m_hitMap; + bool m_isMergeEnabled; }; diff --git a/Simulation/DetSimSD/src/CaloSensitiveDetector.cpp b/Simulation/DetSimSD/src/CaloSensitiveDetector.cpp index 1547f9fe3506be659803ef0d8f5da2e3bcd79fdf..4a7e5c930c1a35832931c9e82a4d60d722e5634d 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 is_merge_enabled) : DDG4SensitiveDetector(name, description), - m_hc(nullptr) { + m_hc(nullptr), + m_isMergeEnabled(is_merge_enabled){ const std::string& coll_name = m_sensitive.hitsCollection(); collectionName.insert(coll_name); } @@ -23,6 +24,7 @@ CaloSensitiveDetector::Initialize(G4HCofThisEvent* HCE) { if(HCID<0) HCID = G4SDManager::GetSDMpointer()->GetCollectionID(m_hc); HCE->AddHitsCollection( HCID, m_hc ); + m_hitMap.clear(); } G4bool @@ -33,13 +35,23 @@ CaloSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*) { dd4hep::sim::Geant4StepHandler h(step); dd4hep::Position pos = 0.5 * (h.prePos() + h.postPos()); HitContribution contrib = dd4hep::sim::Geant4Hit::extractContribution(step); - CalorimeterHit* hit=find(m_hc,dd4hep::sim::HitPositionCompare<CalorimeterHit>(pos)); - + const std::string& name = GetName(); + unsigned long id = getCellID( step ); + CalorimeterHit* hit=nullptr; + if(m_isMergeEnabled){ + std::map<unsigned long, CalorimeterHit*>::iterator it = m_hitMap.find(id); + if(it!=m_hitMap.end()) hit = it->second; + } + else{ + //Commented by fucd: hit position almost different, only very few hits found sucessfully, so discard to find since this option is disable merge + //hit=find(m_hc,dd4hep::sim::HitPositionCompare<CalorimeterHit>(pos)); + } // 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(m_isMergeEnabled) 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 844104e28b4fda57d60ab1100d38d7ae7d3c25b8..4219802f2f0df1bdc46be9552fd9661b3376295e 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 is_merge_enabled = true; + for(auto cal_name : m_listCalsMergeDisable){ + if(cal_name==name){ + is_merge_enabled = false; + break; + } + } + G4VSensitiveDetector* sd = new CaloSensitiveDetector(name, *dd4hep_geo, is_merge_enabled); + debug() << name << " set to merge true/false = " << is_merge_enabled << endmsg; return sd; } diff --git a/Simulation/DetSimSD/src/CalorimeterSensDetTool.h b/Simulation/DetSimSD/src/CalorimeterSensDetTool.h index f3e0796b55670534b10cfb242093a577c724f4e9..549de18d10ee548d6ba2daa3f2734d65f3b156ee 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_listCalsMergeDisable{this, "CalNamesMergeDisable", {}}; }; #endif