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