Skip to content
Snippets Groups Projects
Unverified Commit 1a58348e authored by lintao@ihep.ac.cn's avatar lintao@ihep.ac.cn Committed by GitHub
Browse files

Merge pull request #192 from fucd/calhit

SIM: add merge option by sub-detector name while SD
parents 532595ec e64bd50b
No related branches found
No related tags found
No related merge requests found
......@@ -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;
};
......
......@@ -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;
......
......@@ -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;
}
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment