From ac3ce4193725c60f2132a99f70c4336439231dec Mon Sep 17 00:00:00 2001
From: Chengdong Fu <fucd@ihep.ac.cn>
Date: Fri, 10 Jan 2025 16:56:55 +0800
Subject: [PATCH 1/4] sub-detector id to name

---
 Detector/DetGeomSvc/src/DetGeomSvc.cpp          | 17 ++++++++++++++++-
 Detector/DetGeomSvc/src/DetGeomSvc.h            |  5 ++++-
 .../include/DetInterface/IGeomSvc.h             | 12 ++++++------
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/Detector/DetGeomSvc/src/DetGeomSvc.cpp b/Detector/DetGeomSvc/src/DetGeomSvc.cpp
index 72009ab2..79847faf 100644
--- a/Detector/DetGeomSvc/src/DetGeomSvc.cpp
+++ b/Detector/DetGeomSvc/src/DetGeomSvc.cpp
@@ -41,6 +41,13 @@ DetGeomSvc::initialize() {
   m_dd4hep_geo->fromCompact(m_dd4hep_xmls.value());
   // recover to old level, if not, too many DD4hep print
   //dd4hep::setPrintLevel(level);
+  auto world = getDD4HepGeo();
+  auto subs  = world.children();
+  for (auto sub : subs) {
+    int detId = sub.second.id();
+    if (detId!=-1) m_detIdToNames[detId] = sub.first;
+    info() << sub.second.id() << " " << sub.first << endmsg;
+  }
 
   return sc;
 }
@@ -69,7 +76,6 @@ DetGeomSvc::lcdd() {
     return m_dd4hep_geo;
 }
 
-
 IGeomSvc::Decoder*
 DetGeomSvc::getDecoder(const std::string& readout_name) {
 
@@ -124,3 +130,12 @@ DetGeomSvc::getSurfaceMap(const std::string& det_name) {
   }
   return m_surface_manager->map(det_name);
 }
+
+std::string
+DetGeomSvc::getDetName(const int det_id) {
+  auto it = m_detIdToNames.find(det_id);
+  if (it!=m_detIdToNames.end())
+    return it->second;
+  else
+    return lcdd()->world().name();
+}
diff --git a/Detector/DetGeomSvc/src/DetGeomSvc.h b/Detector/DetGeomSvc/src/DetGeomSvc.h
index 85c2401a..6c8d0011 100644
--- a/Detector/DetGeomSvc/src/DetGeomSvc.h
+++ b/Detector/DetGeomSvc/src/DetGeomSvc.h
@@ -33,10 +33,11 @@ class DetGeomSvc: public extends<Service, IGeomSvc> {
   // IGeomSvc
   dd4hep::DetElement getDD4HepGeo() override;
   dd4hep::Detector* lcdd() override;
-  
+
  private:
   Decoder* getDecoder(const std::string& readout_name) override;
   const dd4hep::rec::SurfaceMap* getSurfaceMap(const std::string& det_name) override;
+  std::string getDetName(const int det_id) override;
     
 private:
   // DD4hep XML compact file path
@@ -45,6 +46,8 @@ private:
   // 
   dd4hep::Detector* m_dd4hep_geo;
   dd4hep::rec::SurfaceManager* m_surface_manager = nullptr;
+
+  std::map<int, std::string> m_detIdToNames;
 };
 
 #endif // GeomSvc_h
diff --git a/Detector/DetInterface/include/DetInterface/IGeomSvc.h b/Detector/DetInterface/include/DetInterface/IGeomSvc.h
index 5c63e5a6..b314a2e1 100644
--- a/Detector/DetInterface/include/DetInterface/IGeomSvc.h
+++ b/Detector/DetInterface/include/DetInterface/IGeomSvc.h
@@ -16,14 +16,11 @@
 #include <map>
 
 namespace dd4hep {
-    class Detector;
-    class DetElement;
-    namespace DDSegmentation {
-        class BitFieldCoder;
-    }
   class Detector;
   class DetElement;
-
+  namespace DDSegmentation {
+    class BitFieldCoder;
+  }
 }
 
 class StructExtension;
@@ -39,6 +36,7 @@ public:
   // receive DD4hep Geometry
   virtual dd4hep::DetElement getDD4HepGeo() = 0;
   virtual dd4hep::Detector* lcdd() = 0;
+
   // receive Geant4 Geometry
   // virtual G4VUserDetectorConstruction* getGeant4Geo() = 0;
 
@@ -46,6 +44,8 @@ public:
   virtual Decoder* getDecoder(const std::string& readout_name) = 0;
   virtual const dd4hep::rec::SurfaceMap* getSurfaceMap(const std::string& det_name) = 0;
 
+  virtual std::string getDetName(const int det_id) = 0;
+
   virtual ~IGeomSvc() {}
 };
 
-- 
GitLab


From 43762bb990caa415645223a949ca21aa4a5e97d1 Mon Sep 17 00:00:00 2001
From: Chengdong Fu <fucd@ihep.ac.cn>
Date: Fri, 10 Jan 2025 16:57:37 +0800
Subject: [PATCH 2/4] add TDR sub-detector name

---
 Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
index 11809c87..2e71075a 100644
--- a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
+++ b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
@@ -13,7 +13,12 @@ namespace CEPCConf{
     static const int TPC     = 4;
     static const int SET     = 5;
     static const int ETD     = 6;
-    static const int DC      = 7; 
+    // same position -> same ID, just named as different in different stage
+    static const int ITKBarrel = 2;
+    static const int ITKEndcap = 3;
+    static const int DC        = 4;
+    static const int OTKBarrel = 5;
+    static const int OTKEndcap = 6;
     
     static const int ECAL        = 20;
     static const int ECAL_PLUG   = 21;
-- 
GitLab


From 0cdbbeaeb7da836dad10943e3a4bd0040880563a Mon Sep 17 00:00:00 2001
From: Chengdong Fu <fucd@ihep.ac.cn>
Date: Fri, 10 Jan 2025 17:04:05 +0800
Subject: [PATCH 3/4] use extension data

---
 Reconstruction/RecSiTracking/CMakeLists.txt   |  17 +-
 .../RecSiTracking/src/ForwardTrackingAlg.cpp  |  59 ++++--
 .../RecSiTracking/src/SiliconTrackingAlg.cpp  |  93 +++++++--
 .../RecSiTracking/src/SiliconTrackingAlg.h    |   2 +-
 .../RecSiTracking/src/TrackSubsetAlg.cpp      |  21 +-
 Reconstruction/RecTrkGlobal/CMakeLists.txt    |  10 +-
 .../RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp | 186 +++++++++---------
 .../RecTrkGlobal/src/Clupatra/ClupatraAlg.h   |   4 +
 .../src/Clupatra/clupatra_new.cpp             |  39 +++-
 .../FullLDCTracking/FullLDCTrackingAlg.cpp    | 104 +++++++++-
 .../src/FullLDCTracking/FullLDCTrackingAlg.h  |   4 +-
 cmake/CEPCSWOptions.cmake                     |   2 +
 12 files changed, 389 insertions(+), 152 deletions(-)

diff --git a/Reconstruction/RecSiTracking/CMakeLists.txt b/Reconstruction/RecSiTracking/CMakeLists.txt
index 8fd9be94..96a95c4f 100644
--- a/Reconstruction/RecSiTracking/CMakeLists.txt
+++ b/Reconstruction/RecSiTracking/CMakeLists.txt
@@ -1,22 +1,25 @@
-
 # Modules
 gaudi_add_module(SiliconTracking
                  SOURCES src/ForwardTrackingAlg.cpp
                          src/SiliconTrackingAlg.cpp
                          src/SpacePointBuilderAlg.cpp
                          src/TrackSubsetAlg.cpp
-                 LINK GearSvc
-                      EventSeeder
+                 LINK EventSeeder
                       TrackingLib
                       TrackSystemSvcLib
                       DataHelperLib
                       KiTrackLib
                       Gaudi::GaudiKernel
-                      k4FWCore::k4FWCore 
-                      ${GEAR_LIBRARIES} 
-                      ${GSL_LIBRARIES} 
-                      ${LCIO_LIBRARIES} 
+                      k4FWCore::k4FWCore
+                      ${GSL_LIBRARIES}
+                      ${LCIO_LIBRARIES}
 )
+
+if (CEPCSW_USE_GEAR)
+  target_compile_definitions(SiliconTracking PRIVATE CEPCSW_USE_GEAR)
+  target_link_libraries(SiliconTracking PRIVATE GearSvc ${GEAR_LIBRARIES})
+endif()
+
 install(TARGETS SiliconTracking
   EXPORT CEPCSWTargets
   RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
diff --git a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp
index 3184563f..831aa8c8 100644
--- a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp
+++ b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp
@@ -1,5 +1,5 @@
 #include "ForwardTrackingAlg.h"
-#include "GearSvc/IGearSvc.h"
+
 #include "TrackSystemSvc/ITrackSystemSvc.h"
 #include "DataHelper/Navigation.h"
 
@@ -16,14 +16,19 @@
 #endif
 
 #include "UTIL/ILDConf.h"
+#include "DetIdentifier/CEPCConf.h"
 
 //#include "MarlinCED.h"
-
+#ifdef CEPCSW_USE_GEAR
+#include "GearSvc/IGearSvc.h"
 #include "gear/GEAR.h"
 #include "gear/GearParameters.h"
 #include "gear/BField.h"
 #include "gear/FTDParameters.h"
 #include "gear/FTDLayerLayout.h"
+#else
+#include "DetInterface/IGeomSvc.h"
+#endif
 
 //----From KiTrack-----------------------------
 #include "KiTrack/SubsetHopfieldNN.h"
@@ -127,13 +132,16 @@ StatusCode ForwardTrackingAlg::initialize(){
     debug() << endmsg;
   }
 
+#ifdef CEPCSW_USE_GEAR
   auto _gear = service<IGearSvc>("GearSvc");
   if ( !_gear ) {
     error() << "Failed to find GearSvc ..." << endmsg;
     return StatusCode::FAILURE;
   }
   gear::GearMgr* gearMgr = _gear->getGearMgr();
-     
+
+  // Get the B Field in z direction
+  _Bz = gearMgr->getBField().at( gear::Vector3D(0., 0., 0.) ).z();
   /**********************************************************************************************/
   /*       Make a SectorSystemFTD                                                               */
   /**********************************************************************************************/
@@ -152,14 +160,38 @@ StatusCode ForwardTrackingAlg::initialize(){
     if( ftdLayers.getNSensors(i) > nSensors ) nSensors = ftdLayers.getNSensors(i);
     
   }
+#else
+  auto geomSvc = service<IGeomSvc>("GeomSvc");
+  if ( !geomSvc ) {
+    info() << "Failed to find GeomSvc ..." << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0));
+  _Bz = field.z()/dd4hep::tesla;
+
+  int nLayers(0), nModules(0), nSensors(0);
+  try {
+    auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
+    auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>();
+    auto ftdlayers = ftdData->layers;
+
+    nLayers = ftdlayers.size() + 1;
+    for (int layer = 0; layer < ftdlayers.size(); layer++) {
+      auto& ftdlayer = ftdlayers[layer];
+      if (ftdlayer.petalNumber > nModules) nModules = ftdlayer.petalNumber;
+      if (ftdlayer.sensorsPerPetal > nSensors)    nSensors = ftdlayer.sensorsPerPetal;
+    }
+  } catch(std::runtime_error& e) {
+    fatal() << e.what() << endmsg;
+    return StatusCode::FAILURE;
+  }
+#endif
   
   debug() << "SectorSystemFTD is using " << nLayers << " layers (including one for the IP), " << nModules << " petals and " << nSensors << " sensors." << endmsg;
    
   _sectorSystemFTD = new SectorSystemFTD( nLayers, nModules , nSensors );
 
-  // Get the B Field in z direction
-  _Bz = gearMgr->getBField().at( gear::Vector3D(0., 0., 0.) ).z();    //The B field in z direction
-  
   /**********************************************************************************************/
   /*       Initialise the MarlinTrkSystem, needed by the tracks for fitting                     */
   /**********************************************************************************************/
@@ -1001,20 +1033,7 @@ void ForwardTrackingAlg::finaliseTrack( edm4hep::MutableTrack* trackImpl ){
         
     ++hitNumbers[ subdet ];
   }
-  
-  //trackImpl->subdetectorHitNumbers().resize(2 * lcio::ILDDetID::ETD);
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - 2 ] = hitNumbers[lcio::ILDDetID::VXD];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 2 ] = hitNumbers[lcio::ILDDetID::FTD];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SIT - 2 ] = hitNumbers[lcio::ILDDetID::SIT];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::TPC - 2 ] = hitNumbers[lcio::ILDDetID::TPC];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SET - 2 ] = hitNumbers[lcio::ILDDetID::SET];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::ETD - 2 ] = hitNumbers[lcio::ILDDetID::ETD];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - 1 ] = hitNumbers[lcio::ILDDetID::VXD];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 1 ] = hitNumbers[lcio::ILDDetID::FTD];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SIT - 1 ] = hitNumbers[lcio::ILDDetID::SIT];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::TPC - 1 ] = hitNumbers[lcio::ILDDetID::TPC];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SET - 1 ] = hitNumbers[lcio::ILDDetID::SET];
-  //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::ETD - 1 ] = hitNumbers[lcio::ILDDetID::ETD];
+
 #if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
   trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]);
   trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]);
diff --git a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp
index 73f833e6..f5316ac5 100644
--- a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp
+++ b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp
@@ -25,6 +25,7 @@
 #include <cmath>
 #include <climits>
 
+#ifdef CEPCSW_USE_GEAR
 #include <gear/GEAR.h>
 #include <gear/GearMgr.h>
 #include <gear/GearParameters.h>
@@ -32,8 +33,13 @@
 #include <gear/VXDParameters.h>
 #include "gear/FTDLayerLayout.h"
 #include "gear/FTDParameters.h"
-
 #include <gear/BField.h>
+#else
+#include "DetInterface/IGeomSvc.h"
+#include "DetIdentifier/CEPCDetectorData.h"
+#endif
+
+#include "DDRec/Vector3D.h"
 
 #include <UTIL/BitField64.h>
 #include <UTIL/BitSet32.h>
@@ -184,7 +190,7 @@ StatusCode  SiliconTrackingAlg::initialize() {
   
 #endif
   
-  if(setupGearGeom()==StatusCode::FAILURE) return StatusCode::FAILURE;
+  if (setupGeom().isFailure()) return StatusCode::FAILURE;
   
   if (_useSIT == 0)
     _nLayers = _nLayersVTX;
@@ -503,9 +509,9 @@ int SiliconTrackingAlg::InitialiseFTD() {
       TrackerHitExtended * hitExt = new TrackerHitExtended( hit );
       //gear::Vector3D U(1.0,hit->getU()[1],hit->getU()[0],gear::Vector3D::spherical);
       //gear::Vector3D V(1.0,hit->getV()[1],hit->getV()[0],gear::Vector3D::spherical);
-      gear::Vector3D U(1.0,hit.getCovMatrix()[1],hit.getCovMatrix()[0],gear::Vector3D::spherical);
-      gear::Vector3D V(1.0,hit.getCovMatrix()[4],hit.getCovMatrix()[3],gear::Vector3D::spherical);
-      gear::Vector3D Z(0.0,0.0,1.0);
+      dd4hep::rec::Vector3D U(1.0,(double)hit.getCovMatrix()[1],(double)hit.getCovMatrix()[0],dd4hep::rec::Vector3D::spherical);
+      dd4hep::rec::Vector3D V(1.0,(double)hit.getCovMatrix()[4],(double)hit.getCovMatrix()[3],dd4hep::rec::Vector3D::spherical);
+      dd4hep::rec::Vector3D Z(0.0,0.0,1.0);
       
       const float eps = 1.0e-07;
       // V must be the global z axis
@@ -729,9 +735,9 @@ int SiliconTrackingAlg::InitialiseVTX() {
       if (UTIL::BitSet32(type)[CEPCConf::TrkHitTypeBit::PLANAR]) {
 	//gear::Vector3D U(1.0,hit->getU()[1],hit->getU()[0],gear::Vector3D::spherical);
 	//gear::Vector3D V(1.0,hit->getV()[1],hit->getV()[0],gear::Vector3D::spherical);
-	gear::Vector3D U(1.0,hit.getCovMatrix()[1],hit.getCovMatrix()[0],gear::Vector3D::spherical);
-	gear::Vector3D V(1.0,hit.getCovMatrix()[4],hit.getCovMatrix()[3],gear::Vector3D::spherical);
-	gear::Vector3D Z(0.0,0.0,1.0);
+	dd4hep::rec::Vector3D U(1.0,hit.getCovMatrix()[1],hit.getCovMatrix()[0],dd4hep::rec::Vector3D::spherical);
+	dd4hep::rec::Vector3D V(1.0,hit.getCovMatrix()[4],hit.getCovMatrix()[3],dd4hep::rec::Vector3D::spherical);
+	dd4hep::rec::Vector3D Z(0.0,0.0,1.0);
 	//debug() << "covMatrix : " << hit->getCovMatrix()[0] << " " << hit->getCovMatrix()[1] << endmsg;
 	const float eps = 1.0e-07;
 	// V must be the global z axis
@@ -877,9 +883,9 @@ int SiliconTrackingAlg::InitialiseVTX() {
           // first we need to check if the measurement vectors are aligned with the global coordinates 
           //gear::Vector3D U(1.0,trkhit_P->getU()[1],trkhit_P->getU()[0],gear::Vector3D::spherical);
           //gear::Vector3D V(1.0,trkhit_P->getV()[1],trkhit_P->getV()[0],gear::Vector3D::spherical);
-	  gear::Vector3D U(1.0,trkhit.getCovMatrix()[1],trkhit.getCovMatrix()[0],gear::Vector3D::spherical);
-	  gear::Vector3D V(1.0,trkhit.getCovMatrix()[4],trkhit.getCovMatrix()[3],gear::Vector3D::spherical);
-          gear::Vector3D Z(0.0,0.0,1.0);
+	  dd4hep::rec::Vector3D U(1.0,trkhit.getCovMatrix()[1],trkhit.getCovMatrix()[0],dd4hep::rec::Vector3D::spherical);
+	  dd4hep::rec::Vector3D V(1.0,trkhit.getCovMatrix()[4],trkhit.getCovMatrix()[3],dd4hep::rec::Vector3D::spherical);
+	  dd4hep::rec::Vector3D Z(0.0,0.0,1.0);
           
           const float eps = 1.0e-07;
           // V must be the global z axis 
@@ -2846,10 +2852,10 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) {
       try {
         //status = MarlinTrk::createFinalisedLCIOTrack(marlinTrk, trkHits, &track, fit_backwards, covMatrix, _bField, _maxChi2PerHit);
 	status = m_fitTool->Fit(track, trkHits, covMatrix, _maxChi2PerHit, fit_backwards);
-      } catch (...) {
+      } catch (MarlinTrk::Exception& excep) {
 	//      delete Track;
         //      delete marlinTrk;
-        error() << "MarlinTrk::createFinalisedLCIOTrack fail" << endmsg;
+        error() << "MarlinTrk::createFinalisedLCIOTrack fail, " << excep.what() << endmsg;
         //throw ;
       }
       debug() << "createFinalisedLCIOTrack finish" << endmsg;
@@ -2997,7 +3003,9 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) {
 	  << " Pz = " << pzTot << endmsg;
 }
 
-StatusCode SiliconTrackingAlg::setupGearGeom(){
+StatusCode SiliconTrackingAlg::setupGeom() {
+
+#ifdef CEPCSW_USE_GEAR
   auto _gear = service<IGearSvc>("GearSvc");
   if ( !_gear ) {
     error() << "Failed to find GearSvc ..." << endmsg;
@@ -3143,6 +3151,63 @@ StatusCode SiliconTrackingAlg::setupGearGeom(){
       
     } 
   }
+#else
+  auto geomSvc = service<IGeomSvc>("GeomSvc");
+  if ( !geomSvc ) {
+    info() << "Failed to find GeomSvc ..." << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0));
+  _bField = field.z()/dd4hep::tesla;
+
+  _nLayersVTX = 0;
+  dd4hep::rec::CompositeData* vtxData = nullptr;
+  auto vxdDet  = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::VXD));
+  try {
+    vtxData = vxdDet.extension<dd4hep::rec::CompositeData>();
+  } catch(std::runtime_error& e) {
+    warning() << e.what() << endmsg;
+  }
+  if (vtxData) {
+    _nLayersVTX = vtxData->layersPlanar.size() + vtxData->layersBent.size();
+  }
+  else {
+    try{
+      auto oldData = vxdDet.extension<dd4hep::rec::ZPlanarData>();
+      _nLayersVTX = oldData->layers.size();
+    } catch(std::runtime_error& e){
+      error() << e.what() << " not CompositeData and ZPlanarData for vertex detector, check geometry" << endmsg;
+    }
+  }
+
+  _nLayersSIT = 0;
+  try {
+    auto sitDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::SIT));
+    auto sitData = sitDet.extension<dd4hep::rec::ZPlanarData>();
+    _nLayersSIT = sitData->layers.size();
+  } catch(std::runtime_error& e) {
+    error() << e.what() << endmsg;
+  }
+
+  _nlayersFTD = 0;
+  try {
+    auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
+    auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>();
+    auto ftdlayers = ftdData->layers;
+    for (int layer = 0; layer < ftdlayers.size(); layer++) {
+      dd4hep::rec::ZDiskPetalsData::LayerLayout& ftdlayer = ftdlayers[layer];
+      _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm); // front petal even numbered
+      if (ftdlayer.petalNumber > 0) {
+	_zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm - 2*ftdlayer.zOffsetSupport/dd4hep::mm);  // front petal odd numbered
+	_petalBasedFTDWithOverlaps = true;
+      }
+    }
+    _nlayersFTD =_zLayerFTD.size();
+  } catch(std::runtime_error& e){
+    warning() << e.what() << endmsg;
+  }
+#endif
 
   info() << "nvxd = " << _nLayersVTX << " nsit = " << _nLayersSIT << " nftd = " << _nlayersFTD << endmsg;
 
diff --git a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h
index 2d0bbd2d..13f3e323 100644
--- a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h
+++ b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h
@@ -424,7 +424,7 @@ class SiliconTrackingAlg : public GaudiAlgorithm {
   int getModuleID(edm4hep::TrackerHit hit)   { _encoder->setValue(hit.getCellID()); return (*_encoder)[lcio::ILDCellID0::module]; };
   int getSensorID(edm4hep::TrackerHit hit)   { _encoder->setValue(hit.getCellID()); return (*_encoder)[lcio::ILDCellID0::sensor]; };
   
-  StatusCode setupGearGeom() ;
+  StatusCode setupGeom() ;
   
   std::vector<float> _zLayerFTD;
   
diff --git a/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp b/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp
index c8b6d1ea..9fa74792 100644
--- a/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp
+++ b/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp
@@ -1,13 +1,17 @@
 #include "TrackSubsetAlg.h"
 
+#ifdef CEPCSW_USE_GEAR
 #include "GearSvc/IGearSvc.h"
+#include <gear/BField.h>
+#else
+#include "DetInterface/IGeomSvc.h"
+#endif
+
 #include "TrackSystemSvc/ITrackSystemSvc.h"
 #include "DataHelper/Navigation.h"
 
 #include <UTIL/ILDConf.h>
 
-#include <gear/BField.h>
-
 #include "KiTrack/SubsetSimple.h"
 #include "KiTrack/SubsetHopfieldNN.h"
 #include "Tools/Fitter.h"
@@ -72,6 +76,7 @@ StatusCode TrackSubsetAlg::initialize() {
   /**********************************************************************************************/
   /*       Initialise the MarlinTrkSystem, needed by the tracks for fitting                     */
   /**********************************************************************************************/
+#ifdef CEPCSW_USE_GEAR
   auto _gear = service<IGearSvc>("GearSvc");
   if ( !_gear ) {
     error() << "Failed to find GearSvc ..." << endmsg;
@@ -79,7 +84,17 @@ StatusCode TrackSubsetAlg::initialize() {
   }
   gear::GearMgr* gearMgr = _gear->getGearMgr();
   _bField = gearMgr->getBField().at( gear::Vector3D( 0.,0.,0.)  ).z() ;
-    
+#else
+  auto geomSvc = service<IGeomSvc>("GeomSvc");
+  if ( !geomSvc ) {
+    info() << "Failed to find GeomSvc ..." << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0));
+  _bField = field.z()/dd4hep::tesla;
+#endif
+
   // set upt the geometry
   auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc");
   if ( !_trackSystemSvc ) {
diff --git a/Reconstruction/RecTrkGlobal/CMakeLists.txt b/Reconstruction/RecTrkGlobal/CMakeLists.txt
index 9ea9ecd6..df71dda6 100644
--- a/Reconstruction/RecTrkGlobal/CMakeLists.txt
+++ b/Reconstruction/RecTrkGlobal/CMakeLists.txt
@@ -7,16 +7,13 @@ gaudi_add_module(Tracking
                          src/FullLDCTracking/FullLDCTrackingAlg.cpp
                          src/TruthTracker/TruthTrackerAlg.cpp
                          src/FitterTool/KalTestTool.cpp
-                 LINK GearSvc
-                      EventSeeder
+                 LINK EventSeeder
                       TrackSystemSvcLib
                       DetSegmentation
                       Gaudi::GaudiAlgLib
                       Gaudi::GaudiKernel
-                      ${GEAR_LIBRARIES}
                       ${GSL_LIBRARIES}
                       ${LCIO_LIBRARIES}
-                      DetSegmentation
                       EDM4HEP::edm4hep EDM4HEP::edm4hepDict
                       k4FWCore::k4FWCore
 )
@@ -25,6 +22,11 @@ target_include_directories(Tracking PUBLIC
   $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>/include
   $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
 
+if (CEPCSW_USE_GEAR)
+  target_compile_definitions(Tracking PRIVATE CEPCSW_USE_GEAR)
+  target_link_libraries(Tracking PRIVATE GearSvc ${GEAR_LIBRARIES})
+endif()
+
 install(TARGETS Tracking
   EXPORT CEPCSWTargets
   RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
diff --git a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp
index 678beddd..1218198c 100644
--- a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp
+++ b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp
@@ -22,12 +22,12 @@
 //#include "UTIL/CellIDDecoder.h"
 #include "UTIL/ILDConf.h"
 //#include "UTIL/LCIterator.h"
-
+#include "DetIdentifier/CEPCConf.h"
 //-------gsl -----
 #include "gsl/gsl_randist.h"
 #include "gsl/gsl_cdf.h"
 
-
+#ifdef CEPCSW_USE_GEAR
 //---- GEAR ----
 #include "gear/GEAR.h"
 #include "gear/TPCParameters.h"
@@ -35,7 +35,12 @@
 #include "gear/ZPlanarLayerLayout.h"
 #include "gear/PadRowLayout2D.h"
 #include "gear/BField.h"
-
+gear::GearMgr* gearMgr;
+#else
+#include "DetIdentifier/CEPCDetectorData.h"
+#include "DetInterface/IGeomSvc.h"
+SmartIF<IGeomSvc> geomSvc;
+#endif
 
 #include "TrackSystemSvc/IMarlinTrack.h"
 #include "TrackSystemSvc/IMarlinTrkSystem.h"
@@ -53,22 +58,12 @@ using namespace MarlinTrk ;
 
 using namespace clupatra_new ;
 
-/*
-   namespace edm4hep::TrackState {
-   const int AtIP = 0;
-   const int AtFirstHit = 1;
-   const int AtLastHit = 2;
-   const int AtCalorimeter = 3;
-   };
-   */
-
 RuntimeMap<edm4hep::Track, clupatra_new::TrackInfoStruct*> TrackInfo_of_edm4hepTrack;
 RuntimeMap<edm4hep::Track, MarlinTrk::IMarlinTrack*> MarTrk_of_edm4hepTrack;
 RuntimeMap<MarlinTrk::IMarlinTrack*, clupatra_new::CluTrack*> CluTrk_of_MarTrack;
 RuntimeMap<edm4hep::TrackerHit, clupatra_new::Hit*> GHitof;
 RuntimeMap<clupatra_new::CluTrack*, MarlinTrk::IMarlinTrack*> MarTrkof;
 
-gear::GearMgr* gearMgr; 
 #define WRITE_PICKED_DEBUG_TRACKS false
 
 //----------------------------------------------------------------
@@ -197,56 +192,85 @@ void ClupatraAlg::printParameters() {
 
 StatusCode ClupatraAlg::initialize() {
 
-	// Usually a good idea to
-        // don't need, since Gaudi Algorithm will print all Property  
-	//printParameters() ;
+  // Usually a good idea to
+  // don't need, since Gaudi Algorithm will print all Property
+  //printParameters() ;
+
+#ifdef CEPCSW_USE_GEAR
+  // Gear can be put as global
+  auto _gear = service<IGearSvc>("GearSvc");
+  gearMgr = _gear->getGearMgr();
+
+  _gearTPC = &(gearMgr->getTPCParameters());
+  _bfield = gearMgr->getBField().at( gear::Vector3D(0.,0.0,0.) ).z() ;
+
+  // Support for more than one module
+  // The ternary operator is used to make the trick with the static variable which
+  // is supposed to be calculated only once, also for performance reason
+  _maxTPCLayers = (gearMgr->getDetectorName() == "LPTPC" ) ?
+    _gearTPC->getModule(0).getNRows() + _gearTPC->getModule(2).getNRows() + _gearTPC->getModule(5).getNRows() :  // LCTPC
+    _gearTPC->getModule(0).getNRows(); // ILD
+
+  _driftLength = _gearTPC->getMaxDriftLength() ;
+#else
+  geomSvc = service<IGeomSvc>("GeomSvc");
+  if (!geomSvc) {
+    fatal() << "Fail to find GeomSvc" << endmsg;
+    return StatusCode::FAILURE;
+  }
+  const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0));
+  _bfield = field.z()/dd4hep::tesla;
+  dd4hep::DetElement tpcDet  = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC));
+  auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>();
+  _maxTPCLayers = tpcData->maxRow;
+  _driftLength  = tpcData->driftLength/dd4hep::mm;
+#endif
 
   // Set up the track fit tool
   m_fitTool = ToolHandle<ITrackFitterTool>(m_fitToolName.value());
 
-	auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc");
-	if ( !_trackSystemSvc ) {
-		error() << "Fail to find TrackSystemSvc ..." << endmsg;
-	}
-
-	_trksystem = _trackSystemSvc->getTrackSystem(this);
-	if(!_trksystem){
-	  error() << "Cannot initialize MarlinTrkSystem of Type: KalTest" <<endmsg;
-	  return StatusCode::FAILURE;
-	}
-
-	_trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useQMS,        _MSOn ) ;
-	_trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::usedEdx,       _ElossOn) ;
-	_trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing,  _SmoothOn) ;
-	_trksystem->init() ;
-
-	_nRun = 0 ;
-	_nEvt = 0 ;
-	// FIXME: fucd
-        //tree = new TTree("Tuple", "Particle Tree");
-        //tree->Branch("omega", &omega, "omega/D");
-        //tree->Branch("totalCandidates", &totalCandidates, "totalCandidates/I");
-        //tree->Branch("eventNumber", &_nEvt, "eventNumber/I");
-	if(_DumpTime){
-	  NTuplePtr nt1(ntupleSvc(), "MyTuples/Time"+name());
-	  if ( !nt1 ) {
-	    m_tuple = ntupleSvc()->book("MyTuples/Time"+name(),CLID_ColumnWiseTuple,"Tracking time");
-	    if ( 0 != m_tuple ) {
-	      m_tuple->addItem ("timeTotal", m_timeTotal ).ignore();
-	      m_tuple->addItem ("timeKalman", m_timeKalman ).ignore();
-	    }
-	    else {
-	      fatal() << "Cannot book MyTuples/Time"+name() <<endmsg;
-	      return StatusCode::FAILURE;
-	    }
-	  }
-	  else{
-	    m_tuple = nt1;
-	  }
-	}
-
-	return GaudiAlgorithm::initialize();
-
+  auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc");
+  if ( !_trackSystemSvc ) {
+    error() << "Fail to find TrackSystemSvc ..." << endmsg;
+  }
+
+  _trksystem = _trackSystemSvc->getTrackSystem(this);
+  if(!_trksystem){
+    error() << "Cannot initialize MarlinTrkSystem of Type: KalTest" <<endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useQMS,        _MSOn ) ;
+  _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::usedEdx,       _ElossOn) ;
+  _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing,  _SmoothOn) ;
+  _trksystem->init() ;
+
+  _nRun = 0 ;
+  _nEvt = 0 ;
+  // FIXME: fucd
+  //tree = new TTree("Tuple", "Particle Tree");
+  //tree->Branch("omega", &omega, "omega/D");
+  //tree->Branch("totalCandidates", &totalCandidates, "totalCandidates/I");
+  //tree->Branch("eventNumber", &_nEvt, "eventNumber/I");
+  if(_DumpTime){
+    NTuplePtr nt1(ntupleSvc(), "MyTuples/Time"+name());
+    if ( !nt1 ) {
+      m_tuple = ntupleSvc()->book("MyTuples/Time"+name(),CLID_ColumnWiseTuple,"Tracking time");
+      if ( 0 != m_tuple ) {
+	m_tuple->addItem ("timeTotal", m_timeTotal ).ignore();
+	m_tuple->addItem ("timeKalman", m_timeKalman ).ignore();
+      }
+      else {
+	fatal() << "Cannot book MyTuples/Time"+name() <<endmsg;
+	return StatusCode::FAILURE;
+      }
+    }
+    else{
+      m_tuple = nt1;
+    }
+  }
+
+  return GaudiAlgorithm::initialize();
 }
 
 
@@ -284,32 +308,16 @@ StatusCode ClupatraAlg::execute() {
 
 	PLCIOTrackConverter converter ;
 
-	// Gear can be put as global
-	auto _gear = service<IGearSvc>("GearSvc");
-	gearMgr = _gear->getGearMgr();
-
-	_gearTPC = &(gearMgr->getTPCParameters());
-	_bfield = gearMgr->getBField().at( gear::Vector3D(0.,0.0,0.) ).z() ;
-
-	// Support for more than one module
-	// The ternary operator is used to make the trick with the static variable which
-	// is supposed to be calculated only once, also for performance reason 
-	static const unsigned int maxTPCLayers = (gearMgr->getDetectorName() == "LPTPC" ) ?
-		_gearTPC->getModule(0).getNRows() + _gearTPC->getModule(2).getNRows() + _gearTPC->getModule(5).getNRows() :  // LCTPC
-		_gearTPC->getModule(0).getNRows(); // ILD
-
-	double driftLength = _gearTPC->getMaxDriftLength() ;
-	ZIndex zIndex( -driftLength , driftLength , _nZBins  ) ;
+	ZIndex zIndex( -_driftLength , _driftLength , _nZBins  ) ;
 
 
 	const edm4hep::TrackerHitCollection* col = nullptr;
         debug() << "col" << endmsg;
 
-	try{   col = _TPCHitCollectionHandle.get();
-
+	try {
+	  col = _TPCHitCollectionHandle.get();
 	} catch(...) {
-		// FIXME: Mingrui fix the output message
-		// streamlog_out( WARNING ) <<  " input collection not in event : " << _colName << "   - nothing to do  !!! " << std::endl ;
+	  warning() <<  " input collection not in event : " << _colName << "   - nothing to do  !!! " << endmsg;
 	}
 
 	//===============================================================================================
@@ -333,7 +341,7 @@ StatusCode ClupatraAlg::execute() {
 		//------
 		TrackerHit th(col->at(i));
 		//debug() << i << " " << th->getCellID() << endmsg;
-		if ( fabs(th.getPosition()[2]) > driftLength ) continue;
+		if ( fabs(th.getPosition()[2]) > _driftLength ) continue;
 
 		ClupaHit* ch  = & clupaHits[i] ;
 
@@ -369,7 +377,7 @@ StatusCode ClupatraAlg::execute() {
 
 	//---------------------------------------------------------------------------------------------------------
 
-	HitListVector hitsInLayer( maxTPCLayers ) ;
+	HitListVector hitsInLayer( _maxTPCLayers ) ;
 	addToHitListVector(  nncluHits.begin(), nncluHits.end() , hitsInLayer  ) ;
 
 	debug() << "  added  " <<  nncluHits.size()  << "  tp hitsInLayer - > size " <<  hitsInLayer.size() << endmsg;
@@ -455,7 +463,7 @@ StatusCode ClupatraAlg::execute() {
 
 		HitDistance dist( nloop * dcut , _cosAlphaCut ) ;
 
-		outerRow = maxTPCLayers - 1 ;
+		outerRow = _maxTPCLayers - 1 ;
 
 		while( outerRow >= _minCluSize ) {
 
@@ -521,7 +529,7 @@ StatusCode ClupatraAlg::execute() {
 			// remove clusters whith too many duplicate hits per pad row
 			Clusterer::cluster_list bclu ;    // bad clusters
 			bclu.setOwner() ;
-			split_list( sclu, std::back_inserter(bclu),  DuplicatePadRows( maxTPCLayers, _duplicatePadRowFraction  ) ) ;
+			split_list( sclu, std::back_inserter(bclu),  DuplicatePadRows( _maxTPCLayers, _duplicatePadRowFraction  ) ) ;
 			// free hits from bad clusters
 			std::for_each( bclu.begin(), bclu.end(), std::mem_fun( &CluTrack::freeElements ) ) ;
 
@@ -625,12 +633,12 @@ StatusCode ClupatraAlg::execute() {
 	static const int do_global_reclustering = true ;
 	if( do_global_reclustering ) {
 
-		outerRow = maxTPCLayers - 1 ;
+		outerRow = _maxTPCLayers - 1 ;
 
 		int padRangeRecluster = 50 ; // FIXME: make parameter
 		// define an inner cylinder where we exclude hits from re-clustering:
-		double zMaxInnerHits   = driftLength * .67 ;   // FIXME: make parameter
-		double rhoMaxInnerHits = _gearTPC->getPlaneExtent()[0] + (  _gearTPC->getPlaneExtent()[1] - _gearTPC->getPlaneExtent()[0] ) * .67 ;// FIXME: make parameter
+		double zMaxInnerHits   = _driftLength * .67 ;   // FIXME: make parameter
+		double rhoMaxInnerHits = _rmin + ( _rmax - _rmin ) * .67 ;// FIXME: make parameter
 
 
 		while( outerRow > 0 ) {
@@ -1305,9 +1313,9 @@ void ClupatraAlg::computeTrackInfo(  edm4hep::Track lTrk  ){
 	if( ! TrackInfo_of_edm4hepTrack(lTrk) )
 		TrackInfo_of_edm4hepTrack(lTrk) = new TrackInfoStruct ;
 
-	float r_inner = _gearTPC->getPlaneExtent()[0] ;
-	float r_outer = _gearTPC->getPlaneExtent()[1] ;
-	float driftLength = _gearTPC->getMaxDriftLength() ;
+	float r_inner = _rmin ;
+	float r_outer = _rmax ;
+	float driftLength = _driftLength ;
 
 	// compute z-extend of this track segment
 	// auto hv = lTrk->getTrackerHits() ;
diff --git a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h
index 2e81b9e6..a15c7c10 100644
--- a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h
+++ b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h
@@ -153,6 +153,10 @@ class ClupatraAlg : public GaudiAlgorithm {
   DataHandle<edm4hep::TrackCollection> _ClupatraTrackSegmentCollectionHandle{"ClupatraSegmentTracks", Gaudi::DataHandle::Writer, this};
 
   float _bfield ;
+  float _maxTPCLayers ;
+  float _driftLength ;
+  float _rmin ;
+  float _rmax ;
 
   int _nRun ;
   int _nEvt ;
diff --git a/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp b/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp
index 8e732aed..ac62fa4e 100644
--- a/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp
+++ b/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp
@@ -7,19 +7,24 @@
 #include <DetIdentifier/CEPCConf.h>
 #include <UTIL/BitSet32.h>
 
+#ifdef CEPCSW_USE_GEAR
 ///---- GEAR ----
 #include "gear/GEAR.h"
 #include "gear/TPCParameters.h"
 #include "gear/TPCModule.h"
-
 #include "gear/BField.h"
+extern gear::GearMgr* gearMgr; // = _gear->getGearMgr();
+#else
+#include "DetInterface/IGeomSvc.h"
+extern IGeomSvc* geomSvc;
+#endif
 
 #include "IMPL/TrackerHitImpl.h"
 #include "IMPL/TrackStateImpl.h"
 
 #include "k4FWCore/DataHandle.h"
 #include "GaudiAlg/GaudiAlgorithm.h"
-#include "GearSvc/IGearSvc.h"
+//#include "GearSvc/IGearSvc.h"
 
 #include "podio/podioVersion.h"
 
@@ -31,7 +36,6 @@ namespace lcio{
 	const int  ILDTrackTypeBit::COMPOSITE = 17  ;
 }
 
-extern gear::GearMgr* gearMgr; // = _gear->getGearMgr();
 extern RuntimeMap<clupatra_new::CluTrack*, MarlinTrk::IMarlinTrack*> MarTrkof;
 extern RuntimeMap<edm4hep::Track, MarlinTrk::IMarlinTrack*> MarTrk_of_edm4hepTrack;
 extern RuntimeMap<edm4hep::Track, clupatra_new::TrackInfoStruct*> TrackInfo_of_edm4hepTrack;
@@ -248,6 +252,7 @@ namespace clupatra_new{
 
 		int nHitsAdded = 0 ;
 
+#ifdef CEPCSW_USE_GEAR
 		const double bfield = gearMgr->getBField().at( gear::Vector3D(0.,0.0,0.) ).z() ;
 
 		// Support for more than one module
@@ -257,6 +262,13 @@ namespace clupatra_new{
 		static const int maxTPCLayerID  = (gearMgr->getDetectorName() == "LPTPC" ) ?
 			gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() - 1 : // LCTPC
 			gearTPC->getModule(0).getNRows() - 1 ; // ILD
+#else
+		const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0));
+		const double bfield = field.z()/dd4hep::tesla;
+		auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC));
+		auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>();
+		static const int maxTPCLayerID  = tpcData->maxRow - 1;
+#endif
 
 		clu->sort( LayerSortIn() ) ;
 
@@ -709,7 +721,7 @@ namespace clupatra_new{
 
 		// Support for more than one module
 		//auto _gear = service<IGearSvc>("GearSvc");
-
+#ifdef CEPCSW_USE_GEAR
 		static const gear::TPCParameters*  gearTPC = &(gearMgr->getTPCParameters());
 		// The ternary operator is used to make the trick with the static variable which
 		// is supposed to be calculated only once, also for performance reason
@@ -717,7 +729,11 @@ namespace clupatra_new{
 			(gearMgr->getDetectorName() == "LPTPC" ) ?
 			gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() : // LCTPC
 			gearTPC->getModule(0).getNRows() ; // ILD
-
+#else
+		auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC));
+		auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>();
+                static const int tpcNRow  = tpcData->maxRow;
+#endif
 		HitListVector hitsInLayer( tpcNRow )  ;
 		addToHitListVector(  hV.begin(), hV.end(), hitsInLayer ) ;
 
@@ -860,6 +876,7 @@ namespace clupatra_new{
 
 		// auto _gear = service<IGearSvc>("GearSvc");
 		// Support for more than one module
+#ifdef CEPCSW_USE_GEAR
 		static const gear::TPCParameters*  gearTPC = &(gearMgr->getTPCParameters());
 		// The ternary operator is used to make the trick with the static variable which
 		// is supposed to be calculated only once, also for performance reason
@@ -867,6 +884,11 @@ namespace clupatra_new{
 			(gearMgr->getDetectorName() == "LPTPC" ) ?
 			gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() : // LCTPC
 			gearTPC->getModule(0).getNRows() ; // ILD
+#else
+		auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC));
+		auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>();
+                static const int tpcNRow  = tpcData->maxRow;
+#endif
 
 		HitListVector hitsInLayer( tpcNRow )  ;
 		addToHitListVector(  hV.begin(), hV.end(), hitsInLayer ) ;
@@ -1041,6 +1063,7 @@ namespace clupatra_new{
 
 
 		// Support for more than one module
+#ifdef CEPCSW_USE_GEAR
 		static const gear::TPCParameters*  gearTPC = &(gearMgr->getTPCParameters());
 		// The ternary operator is used to make the trick with the static variable which
 		// is supposed to be calculated only once, also for performance reason
@@ -1048,7 +1071,11 @@ namespace clupatra_new{
 			(gearMgr->getDetectorName() == "LPTPC" ) ?
 			gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() : // LCTPC
 			gearTPC->getModule(0).getNRows() ; // ILD
-
+#else
+		auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC));
+		auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>();
+                static const int tpcNRow = tpcData->maxRow;
+#endif
 		HitListVector hitsInLayer( tpcNRow )  ;
 
 		addToHitListVector(  clu.begin(), clu.end(), hitsInLayer ) ;
diff --git a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
index e7a64ee2..61160c99 100755
--- a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
+++ b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
@@ -3,8 +3,6 @@
 #include "DataHelper/Navigation.h"
 #include "Tracking/TrackingHelper.h"
 
-#include <GearSvc/IGearSvc.h>
-
 #include <edm4hep/TrackerHit.h>
 #include <edm4hep/TrackerHitPlane.h>
 #include <edm4hep/Track.h>
@@ -25,6 +23,8 @@
 #include <map>
 
 //#include "DataHelper/ClusterShapes.h"
+#ifdef CEPCSW_USE_GEAR
+#include <GearSvc/IGearSvc.h>
 #include <gear/GEAR.h>
 #include <gear/GearParameters.h>
 #include <gear/BField.h>
@@ -34,6 +34,10 @@
 #include "gear/FTDParameters.h"
 #include <gear/TPCParameters.h>
 #include <gear/PadRowLayout2D.h>
+#else
+#include "DetIdentifier/CEPCDetectorData.h"
+#include "DetInterface/IGeomSvc.h"
+#endif
 
 #include "TrackSystemSvc/IMarlinTrack.h"
 #include "TrackSystemSvc/IMarlinTrkSystem.h"
@@ -197,7 +201,7 @@ StatusCode FullLDCTrackingAlg::initialize() {
   _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing,  _SmoothOn) ;
   _trksystem->init() ;
     
-  this->setupGearGeom();
+  if (this->setupGeom().isFailure()) return StatusCode::FAILURE;
   return GaudiAlgorithm::initialize();
 }
 
@@ -5038,8 +5042,9 @@ StatusCode FullLDCTrackingAlg::finalize() {
   return StatusCode::SUCCESS;
 }
 
-void FullLDCTrackingAlg::setupGearGeom(){
-  
+StatusCode FullLDCTrackingAlg::setupGeom(){
+
+#ifdef CEPCSW_USE_GEAR
   auto _gear = service<IGearSvc>("GearSvc");
   gearMgr = _gear->getGearMgr();
 
@@ -5226,9 +5231,96 @@ void FullLDCTrackingAlg::setupGearGeom(){
       debug() << " ### gear::FTD Parameters as defined in SFtd05 Not Present in GEAR FILE" << endmsg;
     }
   }
+#else
+  auto geomSvc = service<IGeomSvc>("GeomSvc");
+  if (!geomSvc) {
+    fatal() << "Fail to find GeomSvc" << endmsg;
+    return StatusCode::FAILURE;
+  }
+  const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0));
+  _bField = field.z()/dd4hep::tesla;
+
+  _nLayersVTX = 0;
+  dd4hep::rec::CompositeData* vtxData = nullptr;
+  auto vxdDet  = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::VXD));
+  try {
+    vtxData = vxdDet.extension<dd4hep::rec::CompositeData>();
+  } catch(std::runtime_error& e) {
+    warning() << e.what() << endmsg;
+  }
+  if (vtxData) {
+    _nLayersVTX = vtxData->layersPlanar.size() + vtxData->layersBent.size();
+  }
+  else {
+    try{
+      auto oldData = vxdDet.extension<dd4hep::rec::ZPlanarData>();
+      _nLayersVTX = oldData->layers.size();
+    } catch(std::runtime_error& e){
+      error() << e.what() << " not CompositeData and ZPlanarData for vertex detector, check geometry" << endmsg;
+    }
+  }
+
+  _nLayersSIT = 0;
+  try {
+    auto sitDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::SIT));
+    auto sitData = sitDet.extension<dd4hep::rec::ZPlanarData>();
+    _nLayersSIT = sitData->layers.size();
+  } catch(std::runtime_error& e) {
+    error() << e.what() << endmsg;
+  }
+
+  _nLayersSET = 0;
+  try {
+    auto setDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::SET));
+    auto setData = setDet.extension<dd4hep::rec::ZPlanarData>();
+    _nLayersSET = setData->layers.size();
+  } catch(std::runtime_error& e) {
+    error() << e.what() << endmsg;
+  }
+
+  try {
+    auto tpcDet  = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC));
+    auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>();
+    _tpc_nrows = tpcData->maxRow;
+    _tpc_max_drift_length  = tpcData->driftLength/dd4hep::mm;
+    _tpc_inner_r = tpcData->rMin/dd4hep::mm;
+    _tpc_outer_r = tpcData->rMax/dd4hep::mm;
+    _tpc_pad_height = tpcData->padHeight/dd4hep::mm;
+  } catch(std::runtime_error& e) {
+    error() << e.what() << endmsg;
+  }
+
+  _nLayersFTD = 0;
+  try {
+    auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
+    auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>();
+    auto ftdlayers = ftdData->layers;
+    for (int layer = 0; layer < ftdlayers.size(); layer++) {
+      dd4hep::rec::ZDiskPetalsData::LayerLayout& ftdlayer = ftdlayers[layer];
+      _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm); // front petal even numbered
+      if (ftdlayer.petalNumber > 0) {
+	_zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm - 2*ftdlayer.zOffsetSupport/dd4hep::mm);  // front petal odd numbered
+	_petalBasedFTDWithOverlaps = true;
+      }
+    }
+    _nLayersFTD =_zLayerFTD.size();
+  } catch(std::runtime_error& e){
+    warning() << e.what() << endmsg;
+  }
+
+  _nLayersETD = 0;
+  try {
+    auto etdDet  = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::ETD));
+    auto etdData = etdDet.extension<dd4hep::rec::ZDiskPetalsData>();
+    _nLayersETD  = etdData->layers.size();
+  } catch(std::runtime_error& e){
+    warning() << e.what() << endmsg;
+  }
+#endif
 
   debug() << "layer number read: nvxd = " << _nLayersVTX << " nsit = " << _nLayersSIT << " ntpc = " << _tpc_nrows
-	  << " nset = " << _nLayersSET << " nftd = " << _nLayersFTD << endmsg;
+	  << " nset = " << _nLayersSET << " nftd = " << _nLayersFTD << " netd = " << _nLayersETD << endmsg;
+  return StatusCode::SUCCESS;
 }
 
 void FullLDCTrackingAlg::checkTrackState(int location){
diff --git a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h
index a73866ca..1728f1b2 100755
--- a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h
+++ b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h
@@ -418,7 +418,7 @@ protected:
   int getSensorID(edm4hep::TrackerHit hit)   { _encoder->setValue(hit.getCellID()); return (*_encoder)[lcio::ILDCellID0::sensor]; };
 
   
-  void setupGearGeom() ;
+  StatusCode setupGeom() ;
 
   double _tpc_max_drift_length;
   double _tpc_inner_r;
@@ -500,7 +500,7 @@ protected:
 //  
 //  std::vector<FTD_Disk> _FTDgeo;
   std::vector<float> _zLayerFTD;
-  gear::GearMgr* gearMgr;
+  //gear::GearMgr* gearMgr;
 
   unsigned int _nLayersFTD;
   int _nPhiFTD; 
diff --git a/cmake/CEPCSWOptions.cmake b/cmake/CEPCSWOptions.cmake
index 5dca0ca4..9ec71b8f 100644
--- a/cmake/CEPCSWOptions.cmake
+++ b/cmake/CEPCSWOptions.cmake
@@ -48,3 +48,5 @@ if (NOT CEPCSW_EXTERNAL_AS_COMPONENT)
     set(CEPCSW_EXTERNAL_ROOT ${CMAKE_INSTALL_PREFIX}/External)
   endif()
 endif()
+
+option(CEPCSW_USE_GEAR "Use gear" FALSE)
-- 
GitLab


From ac430435c696d4cb543bde77b3e3b0cec0ff94a6 Mon Sep 17 00:00:00 2001
From: Chengdong Fu <fucd@ihep.ac.cn>
Date: Tue, 14 Jan 2025 09:54:35 +0800
Subject: [PATCH 4/4] correct DC id

---
 .../DetIdentifier/include/DetIdentifier/CEPCConf.h  | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
index 2e71075a..6de9c474 100644
--- a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
+++ b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
@@ -13,12 +13,13 @@ namespace CEPCConf{
     static const int TPC     = 4;
     static const int SET     = 5;
     static const int ETD     = 6;
-    // same position -> same ID, just named as different in different stage
-    static const int ITKBarrel = 2;
-    static const int ITKEndcap = 3;
-    static const int DC        = 4;
-    static const int OTKBarrel = 5;
-    static const int OTKEndcap = 6;
+    static const int DC      = 7;
+    // keep compatibility of tracking algorothm for old detector design,
+    // need to update these options as comprehensive consideration after switching new tracking in good algorithm design
+    static const int ITKBarrel = SIT;
+    static const int ITKEndcap = FTD;
+    static const int OTKBarrel = SET;
+    static const int OTKEndcap = ETD;
     
     static const int ECAL        = 20;
     static const int ECAL_PLUG   = 21;
-- 
GitLab