diff --git a/.build.ci.sh b/.build.ci.sh
index 011fd6aec2830f401761aa721d7f205ada99e475..6e4c3265fe63ab5c6d4acf1c9d01e13c5e44658d 100644
--- a/.build.ci.sh
+++ b/.build.ci.sh
@@ -8,7 +8,6 @@ logfile=mylog.txt
 
 if [ "$LCG_RELEASE" = "KEY4HEP_STACK" ]; then
     logfile=mylog-k4.sh
-    source /cvmfs/sw.hsf.org/key4hep/setup.sh
     ./build-k4.sh >& ${logfile} &
     buildpid=$!
 else
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 395f4809ac5cacd349c54807300ffd09065033a4..a5d7c37b8a2a534afbe8f9d7fdac37fa0d1c8031 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -21,7 +21,7 @@ jobs:
     runs-on: self-hosted
     strategy:
       matrix:
-        LCG_RELEASE: [LCG_101, KEY4HEP_STACK]
+        LCG_RELEASE: [LCG_EXTERNAL, KEY4HEP_STACK]
         # CEPCSW_BLDTOOL: [make, ninja]
         CEPCSW_BLDTOOL: [ninja]
 
diff --git a/Analysis/CMakeLists.txt b/Analysis/CMakeLists.txt
index 7e666e5bb77e848d9218a4ee66b5018fcd871a94..58590ac4f319bc8f4bc40f2fd0f093d97927a4a4 100644
--- a/Analysis/CMakeLists.txt
+++ b/Analysis/CMakeLists.txt
@@ -1,3 +1,4 @@
 
 add_subdirectory(TotalInvMass)
 add_subdirectory(TrackInspect)
+add_subdirectory(DumpEvent)
diff --git a/Analysis/DumpEvent/CMakeLists.txt b/Analysis/DumpEvent/CMakeLists.txt
index 3c5f697d2e4355b72a6ee88c16e271edba076353..d432b646a874c1a640a2459ccbbec64d92f53527 100644
--- a/Analysis/DumpEvent/CMakeLists.txt
+++ b/Analysis/DumpEvent/CMakeLists.txt
@@ -1,5 +1,6 @@
 gaudi_add_module(DumpEvent
                  SOURCES src/DumpMCParticleAlg.cpp
+                         src/DumpSimHitAlg.cpp
 		         #src/DumpHitAlg.cpp
 			 src/DumpTrackAlg.cpp
 			 #src/DumpCalorimeterAlg.cpp
@@ -10,6 +11,7 @@ gaudi_add_module(DumpEvent
                       ${CLHEP_LIBRARIES}
 		      ${DD4hep_COMPONENT_LIBRARIES}
                       DetInterface
+                      k4FWCore::k4FWCore
 )
 
 install(TARGETS DumpEvent
diff --git a/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp b/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp
index 56d68151489b3515c6089b9947b7a1ab7a78301a..33c730123ab45553783e328b91197387c31b794e 100644
--- a/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp
+++ b/Analysis/DumpEvent/src/DumpMCParticleAlg.cpp
@@ -93,11 +93,11 @@ StatusCode DumpMCParticleAlg::execute(){
       m_charge[m_nParticles] = particle.getCharge();
       m_time[m_nParticles] = particle.getTime();
       m_mass[m_nParticles] = particle.getMass();
-      const edm4hep::Vector3d& vertex = particle.getVertex();
+      const auto& vertex = particle.getVertex();
       m_vx[m_nParticles] = vertex.x;
       m_vy[m_nParticles] = vertex.y;
       m_vz[m_nParticles] = vertex.z;
-      const edm4hep::Vector3f& momentum = particle.getMomentum();
+      const auto& momentum = particle.getMomentum();
       m_px[m_nParticles] = momentum.x;
       m_py[m_nParticles] = momentum.y;
       m_pz[m_nParticles] = momentum.z;
diff --git a/Analysis/DumpEvent/src/DumpSimHitAlg.cpp b/Analysis/DumpEvent/src/DumpSimHitAlg.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ea53b5fb0e6f0596a3215a4433f3f623001b11d
--- /dev/null
+++ b/Analysis/DumpEvent/src/DumpSimHitAlg.cpp
@@ -0,0 +1,83 @@
+/*
+ * Description:
+ *   Dump the simulated information.
+ *
+ * Author:
+ *   Tao Lin <lintao AT ihep.ac.cn>
+ */
+
+#include "k4FWCore/DataHandle.h"
+#include "GaudiKernel/Algorithm.h"
+
+#include "edm4hep/MCParticleCollection.h"
+#include "edm4hep/SimTrackerHitCollection.h"
+#include "edm4hep/SimCalorimeterHitCollection.h"
+#include "edm4hep/CaloHitContributionCollection.h"
+
+#include "GaudiKernel/NTuple.h"
+
+class DumpSimHitAlg: public Algorithm {
+public:
+
+    DumpSimHitAlg(const std::string& name, ISvcLocator* pSvcLocator);
+
+    // Three mandatory member functions of any algorithm
+    StatusCode initialize() override;
+    StatusCode execute() override;
+    StatusCode finalize() override;
+
+private:
+    // - collection MCParticleG4: the simulated particles in Geant4
+    DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticle", 
+            Gaudi::DataHandle::Reader, this};
+
+    // Dedicated collections for CEPC
+    DataHandle<edm4hep::SimTrackerHitCollection> m_VXDCol{"VXDCollection", 
+            Gaudi::DataHandle::Reader, this};
+
+};
+
+DECLARE_COMPONENT( DumpSimHitAlg )
+
+DumpSimHitAlg::DumpSimHitAlg(const std::string& name, ISvcLocator* pSvcLocator) 
+: Algorithm(name, pSvcLocator) {
+
+}
+
+StatusCode DumpSimHitAlg::initialize() {
+    return StatusCode::SUCCESS;
+}
+
+StatusCode DumpSimHitAlg::execute() {
+    auto mcCol = m_mcParCol.get();
+
+    for (auto particle: *mcCol) {
+        info() << "mc particle -> "
+               << " (ID: " << particle.getObjectID().index << ") "
+               << " (simulator status: " << particle.getSimulatorStatus() << ") "
+               << endmsg;
+    }
+
+    auto vxdCol = m_VXDCol.get();
+
+    for (auto hit: *vxdCol) {
+        auto mcparticle = hit.getMCParticle();
+
+        if (mcparticle.getGeneratorStatus() != 1) {
+            error() << "Found generator status is not 1 for hit. " << endmsg;
+        }
+
+        info() << "hit -> "
+               << " mcparticle ("
+               << " ID: " << mcparticle.getObjectID().index << "; "
+               << " generator status: " << mcparticle.getGeneratorStatus() << "; "
+               << " simulator status: " << mcparticle.getSimulatorStatus() << ") "
+               << endmsg;
+    }
+
+    return StatusCode::SUCCESS;
+}
+
+StatusCode DumpSimHitAlg::finalize() {
+    return StatusCode::SUCCESS;
+}
diff --git a/Analysis/DumpEvent/src/DumpTrackAlg.cpp b/Analysis/DumpEvent/src/DumpTrackAlg.cpp
index 6a284e256481cc50a9c59a9060f6335695e86823..9bb18af06d7199528b2ee0f318ec80e3541b67af 100644
--- a/Analysis/DumpEvent/src/DumpTrackAlg.cpp
+++ b/Analysis/DumpEvent/src/DumpTrackAlg.cpp
@@ -1,5 +1,15 @@
 #include "DumpTrackAlg.h"
 
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
+
+
 #include "GaudiKernel/DataObject.h"
 #include "GaudiKernel/IHistogramSvc.h"
 #include "GaudiKernel/MsgStream.h"
@@ -119,6 +129,15 @@ StatusCode DumpTrackAlg::execute(){
 	//  std::cout << track.getSubDetectorHitNumbers(ii) << " ";
 	//}
 	//std::cout << std::endl;
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+	if(track.subdetectorHitNumbers_size()>=5){
+	  m_nHitsVXD[m_nTracks] = track.getSubdetectorHitNumbers(0);
+	  m_nHitsFTD[m_nTracks] = track.getSubdetectorHitNumbers(1);
+	  m_nHitsSIT[m_nTracks] = track.getSubdetectorHitNumbers(2);
+	  m_nHitsGAS[m_nTracks] = track.getSubdetectorHitNumbers(3);
+	  m_nHitsSET[m_nTracks] = track.getSubdetectorHitNumbers(4);
+	}
+#else
 	if(track.subDetectorHitNumbers_size()>=5){
 	  m_nHitsVXD[m_nTracks] = track.getSubDetectorHitNumbers(0);
 	  m_nHitsFTD[m_nTracks] = track.getSubDetectorHitNumbers(1);
@@ -126,6 +145,7 @@ StatusCode DumpTrackAlg::execute(){
 	  m_nHitsGAS[m_nTracks] = track.getSubDetectorHitNumbers(3);
 	  m_nHitsSET[m_nTracks] = track.getSubDetectorHitNumbers(4);
 	}
+#endif
 	else{
 	  m_nHitsVXD[m_nTracks] = 0;
           m_nHitsSIT[m_nTracks] = 0;
diff --git a/Analysis/TrackInspect/src/TrackInspectAlg.cpp b/Analysis/TrackInspect/src/TrackInspectAlg.cpp
index 281df767c6590c627909fc4661ffe108b2664b02..2c41f2a98e42bbfd2ef1bd329fe557cbd7682b50 100644
--- a/Analysis/TrackInspect/src/TrackInspectAlg.cpp
+++ b/Analysis/TrackInspect/src/TrackInspectAlg.cpp
@@ -39,6 +39,8 @@
 
 #include "DataHelper/HelixClass.h"
 
+#include "podio/podioVersion.h"
+
 #include "CLHEP/Units/SystemOfUnits.h"
 #include <math.h>
 #include <TTree.h>
@@ -179,7 +181,11 @@ StatusCode TrackInspectAlg::execute(){
             if (theTracks.size() == 0) {
                 totalCandidates[m_nParticles] = 0;
                 nCandidate[m_nParticles] = -1;
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
                 Fill(particle, edm4hep::Track(nullptr));
+#else
+                Fill(particle, edm4hep::Track::makeEmpty());
+#endif
                 m_nParticles++;
             }
             else {
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 19b583c3dd5311abb45124333a2a536763535b67..8c8290cc67623cac361969d73a5ed9f365aa4f9a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,7 +23,7 @@ endif()
 # ``-DCMAKE_CXX_STANDARD=<standard>`` when invoking CMake
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "")
 
-if(NOT CMAKE_CXX_STANDARD MATCHES "14|17")
+if(NOT CMAKE_CXX_STANDARD MATCHES "17|20")
   message(FATAL_ERROR "Unsupported C++ standard: ${CMAKE_CXX_STANDARD}")
 endif()
 
@@ -52,3 +52,15 @@ install(EXPORT ${PROJECT_NAME}Targets
   )
 
 gaudi_install(CMAKE cmake/${PROJECT_NAME}Config.cmake)
+
+file(WRITE ${CMAKE_BINARY_DIR}/setup.sh.in
+    "#!/bin/bash\n"
+    "# Generated by cmake \n"
+    "# Following is the extra envvar:\n"
+    "@RUN_SCRIPT_EXTRA_COMMANDS@"
+)
+configure_file("${CMAKE_BINARY_DIR}/setup.sh.in" "${CMAKE_BINARY_DIR}/setup.sh"
+               @ONLY)
+
+install(FILES "${CMAKE_BINARY_DIR}/setup.sh"
+        DESTINATION ${CMAKE_INSTALL_PREFIX})
diff --git a/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml b/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml
index 16cc9b5eb3d10cbb0149ae79152a3ef3a0345fed..b29393b660f1966209aecdca9f5bf9ce720fe7d6 100644
--- a/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml
+++ b/Detector/DetCEPCv4/compact/CepCBeamPipe_v01_01.xml
@@ -10,6 +10,7 @@
     <constant name="BeamPipe_Be_total_thickness"   value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/>
     <constant name="BeamPipe_Al_thickness"         value="BeamPipe_Be_total_thickness"/>
     <constant name="BeamPipe_Cu_thickness"         value="2.0*mm"/>
+    <constant name="BeamPipe_Iron_thickness"       value="2.5*mm"/>
 
     <constant name="BeamPipe_CentralBe_zmax"       value="120*mm"/>
     <constant name="BeamPipe_CentralAl_zmax"       value="205*mm"/>
@@ -20,12 +21,16 @@
     <constant name="BeamPipe_Crotch_zmax"          value="855*mm"/>
     <constant name="BeamPipe_FirstSeparated_zmax"  value="1110*mm"/>
     <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/>
-    <constant name="BeamPipe_end_z"                value="12*m"/>
+    <constant name="BeamPipe_QD0_zmax"             value="3950*mm"/>
+    <constant name="BeamPipe_QF1_zmin"             value="4450*mm"/>
+    <constant name="BeamPipe_QF1_zmax"             value="5910*mm"/>
+    <constant name="BeamPipe_end_z"                value="7050*mm"/>
     
     <constant name="BeamPipe_Central_inner_radius"  value="14*mm"/>
     <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/>
     <constant name="BeamPipe_Upstream_inner_radius" value="6*mm"/>
     <constant name="BeamPipe_Dnstream_inner_radius" value="10*mm"/>
+    <constant name="BeamPipe_QF1_inner_radius"  value="20.5*mm"/>
     <constant name="BeamPipe_Crotch_hole_height"    value="30.67*mm"/>
     <constant name="BeamPipe_VertexRegion_rmax"     value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/>
     <constant name="BeamPipe_ForwardRegion_rmax"    value="BeamPipe_Expanded_inner_radius+BeamPipe_Cu_thickness"/>
@@ -34,53 +39,182 @@
   </define>
 
   <detectors>        
-    <detector name="BeamPipe" type="DD4hep_CRDBeamPipe_v01" vis="BeamPipeVis">
+    <detector name="BeamPipe" type="CRDBeamPipe_v01" vis="BeamPipeVis">
       <parameter crossingangle="CepC_Main_Crossing_Angle" />
-      <envelope vis="BlueVis">
+      <envelope>
 	<shape type="Assembly"/>
       </envelope>
 
       <section type ="Center" name="IPInnerTube" zStart="0" zEnd="BeamPipe_CentralBe_zmax" rStart="0">
-	<layer material="beam" thickness="BeamPipe_Central_inner_radius"/>
-	<layer material="G4_Be" thickness="BeamPipe_Be_inner_thickness"/>
+	<layer material="beam" thickness="BeamPipe_Central_inner_radius" vis="VacVis"/>
+	<layer material="G4_Be" thickness="BeamPipe_Be_inner_thickness" vis="BeamPipeVis"/>
 	<layer material="G4_PARAFFIN" thickness="BeamPipe_Cooling_thickness"/>
-	<layer material="G4_Be" thickness="BeamPipe_Be_outer_thickness"/>
+	<layer material="G4_Be" thickness="BeamPipe_Be_outer_thickness" vis="BeamPipeVis"/>
       </section>
       <section type="Center" name="IPAl" zStart="BeamPipe_CentralBe_zmax" zEnd="BeamPipe_CentralAl_zmax" rStart="0">
-	<layer material="beam" thickness="BeamPipe_Central_inner_radius"/>
-	<layer material="G4_Al" thickness="BeamPipe_Al_thickness"/>
+	<layer material="beam" thickness="BeamPipe_Central_inner_radius" vis="VacVis"/>
+	<layer material="G4_Al" thickness="BeamPipe_Al_thickness" vis="BeamPipeVis"/>
       </section>
       <section type="Center" name="ExpandPipe" zStart="BeamPipe_CentralAl_zmax" zEnd="BeamPipe_ConeAl_zmax" rStart="0">
-	<layer material="beam" thickness="BeamPipe_Central_inner_radius" thicknessEnd="BeamPipe_Expanded_inner_radius"/>
-	<layer material="G4_Al" thickness="BeamPipe_Al_thickness" thicknessEnd="BeamPipe_Al_thickness"/>
+	<layer material="beam" thickness="BeamPipe_Central_inner_radius" thicknessEnd="BeamPipe_Expanded_inner_radius" vis="VacVis"/>
+	<layer material="G4_Al" thickness="BeamPipe_Al_thickness" thicknessEnd="BeamPipe_Al_thickness" vis="BeamPipeVis"/>
       </section>
       <section type="Center" name="ThickPipe" zStart="BeamPipe_ConeAl_zmax" zEnd="BeamPipe_LinkerAl_zmax" rStart="0">
-	<layer material="beam" thickness="BeamPipe_Expanded_inner_radius"/>
-	<layer material="G4_Al" thickness="BeamPipe_Al_thickness"/>
+	<layer material="beam" thickness="BeamPipe_Expanded_inner_radius" vis="VacVis"/>
+	<layer material="G4_Al" thickness="BeamPipe_Al_thickness" vis="BeamPipeVis"/>
       </section>
       <section type="CenterSide" name="OutsideLink" zStart="BeamPipe_LinkerAl_zmax" zEnd="BeamPipe_LinkerCu_zmax" rStart="0">
-	<layer material="beam" thickness="BeamPipe_Expanded_inner_radius"/>
-	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/>
+	<layer material="beam" thickness="BeamPipe_Expanded_inner_radius" vis="VacVis"/>
+	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/>
       </section>
       <section type="FatWaist" name="Waist" zStart="BeamPipe_LinkerCu_zmax" zEnd="BeamPipe_Waist_zmax" rStart="BeamPipe_Expanded_inner_radius" size="BeamPipe_Crotch_hole_height">
-	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/>
+	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/>
       </section>
-      <!--CrotchAsymUp&CrotchAsymDn not work to fix, because of problem on convert from TGeo to Geant4--> 
-      <!--section type="CrotchAsymUp" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax"
+      <section type="CrotchAsymUp" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax"
 	       rStart="BeamPipe_Expanded_inner_radius" rEnd="BeamPipe_Upstream_inner_radius" size="BeamPipe_Crotch_hole_height">
-	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" thicknessEnd="ForkAsymThickness"/>
+	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" thicknessEnd="ForkAsymThickness" vis="BeamPipeVis"/>
       </section>
       <section type="CrotchAsymDn" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax"
 	       rStart="BeamPipe_Expanded_inner_radius" rEnd="BeamPipe_Dnstream_inner_radius" size="BeamPipe_Crotch_hole_height">
-        <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/>
-      </section-->
+        <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/>
+      </section>
       <section type="FlareLegUp" name="FirstDoublePipe" zStart="BeamPipe_Crotch_zmax" zEnd="BeamPipe_FirstSeparated_zmax" rStart="0">
-	<layer material="beam" thickness="BeamPipe_Upstream_inner_radius" thicknessEnd="BeamPipe_Dnstream_inner_radius"/>
-	<layer material="G4_Cu" thickness="ForkAsymThickness" thicknessEnd="BeamPipe_Cu_thickness"/>
+	<layer material="beam" thickness="BeamPipe_Upstream_inner_radius" thicknessEnd="BeamPipe_Dnstream_inner_radius" vis="VacVis"/>
+	<layer material="G4_Cu" thickness="ForkAsymThickness" thicknessEnd="BeamPipe_Cu_thickness" vis="BeamPipeVis"/>
       </section>
       <section type="FlareLegDn" name="FirstDoublePipe" zStart="BeamPipe_Crotch_zmax" zEnd="BeamPipe_FirstSeparated_zmax" rStart="0">
-        <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius"/>
-        <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness"/>
+        <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/>
+        <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="BeamPipeVis"/>
+      </section>
+      <section type="Legs" name="QD0Link" zStart="BeamPipe_FirstSeparated_zmax" zEnd="BeamPipe_SecondSeparated_zmax" rStart="0">
+	<layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/>
+      </section>
+      <section type="Legs" name="QD0" zStart="BeamPipe_SecondSeparated_zmax" zEnd="BeamPipe_QD0_zmax" rStart="0">
+        <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/>
+	<layer material="G4_Cu" thickness="3.5*mm" vis="BeamPipeVis"/>
+	<layer material="superconductor" thickness="6.0*mm" vis="BeamPipeVis"/>
+	<layer material="stainless_steel" thickness="8.0*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="Legs" name="QF1Link" zStart="BeamPipe_QD0_zmax" zEnd="BeamPipe_QF1_zmin" rStart="0">
+        <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" thicknessEnd="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/>
+      </section>
+      <section type="Legs" name="QF1" zStart="BeamPipe_QF1_zmin" zEnd="BeamPipe_QF1_zmax" rStart="0">
+        <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/>
+	<layer material="G4_Cu" thickness="3.0*mm" vis="BeamPipeVis"/>
+        <layer material="superconductor" thickness="6.0*mm" vis="BeamPipeVis"/>
+        <layer material="stainless_steel" thickness="8.0*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="Legs" name="Farest" zStart="BeamPipe_QF1_zmax" zEnd="BeamPipe_end_z" rStart="0">
+        <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="BeamPipeVis"/>
+      </section>
+
+      <!-- Magnets and their cooling, support -->
+      <section type="CenterSide" name="Magnet_1" zStart="1160*mm" zEnd="1900*mm" rStart="90*mm">
+        <layer material="superconductor" thickness="20*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="Magnet_2" zStart="1930*mm" zEnd="3964*mm" rStart="120*mm">
+        <layer material="superconductor" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="Magnet_3" zStart="3970*mm" zEnd="7000*mm" rStart="185*mm">
+        <layer material="superconductor" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_1" zStart="970*mm" zEnd="1110*mm" rStart="31*mm">
+        <layer material="stainless_steel" thickness="1.5*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_2" zStart="1110*mm" zEnd="1115*mm" rStart="50.0*mm">
+        <layer material="stainless_steel" thickness="91.25*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_3" zStart="1115*mm" zEnd="1900*mm" rStart="130.75*mm" rEnd="175*mm">
+        <layer material="stainless_steel" thickness="10.5*mm" thicknessEnd="65*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_4" zStart="1900*mm" zEnd="3800*mm" rStart="175*mm">
+        <layer material="stainless_steel" thickness="65*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_5" zStart="3800*mm" zEnd="3910*mm" rStart="175*mm">
+        <layer material="stainless_steel" thickness="135*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_6" zStart="3910*mm" zEnd="7160*mm" rStart="240*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_1" zStart="1130*mm" zEnd="1135*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="50*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_2i" zStart="1135*mm" zEnd="1925*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_2o" zStart="1135*mm" zEnd="1900*mm" rStart="120*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_3l" zStart="1900*mm" zEnd="1905*mm" rStart="120*mm">
+        <layer material="stainless_steel" thickness="25*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_3r" zStart="1925*mm" zEnd="1930*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="35*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_4i" zStart="1930*mm" zEnd="4000*mm" rStart="105*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_4o" zStart="1905*mm" zEnd="3940*mm" rStart="140*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_5l" zStart="3940*mm" zEnd="3945*mm" rStart="140*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_5r" zStart="4000*mm" zEnd="4005*mm" rStart="105*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_6i" zStart="4005*mm" zEnd="7050*mm" rStart="170*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_6o" zStart="3945*mm" zEnd="7050*mm" rStart="205*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_7" zStart="7050*mm" zEnd="7055*mm" rStart="170*mm">
+        <layer material="stainless_steel" thickness="40*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1l" zStart="1135*mm" zEnd="1160*mm" rStart="80*mm">
+        <layer material="lN2" thickness="40*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1i" zStart="1160*mm" zEnd="1900*mm" rStart="80*mm">
+        <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1o" zStart="1160*mm" zEnd="1900*mm" rStart="110*mm">
+        <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1r" zStart="1900*mm" zEnd="1925*mm" rStart="80*mm">
+        <layer material="lN2" thickness="40*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2l" zStart="1905*mm" zEnd="1930*mm" rStart="120*mm">
+        <layer material="lN2" thickness="20*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2i" zStart="1925*mm" zEnd="3964*mm" rStart="110*mm">
+        <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2o" zStart="1930*mm" zEnd="3945*mm" rStart="130*mm">
+        <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2r1" zStart="3964*mm" zEnd="4000*mm" rStart="110*mm">
+        <layer material="lN2" thickness="65*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2r2" zStart="3945*mm" zEnd="3964*mm" rStart="130*mm">
+        <layer material="lN2" thickness="45*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3l" zStart="3945*mm" zEnd="3970*mm" rStart="175*mm">
+        <layer material="lN2" thickness="30*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3i" zStart="3970*mm" zEnd="7000*mm" rStart="175*mm">
+        <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3o" zStart="3970*mm" zEnd="7000*mm" rStart="195*mm">
+        <layer material="lN2" thickness="10*mm" vis="BeamPipeVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3r" zStart="7000*mm" zEnd="7050*mm" rStart="175*mm">
+        <layer material="lN2" thickness="30*mm" vis="BeamPipeVis"/>
       </section>
     </detector>
   </detectors>        
diff --git a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml
index 7ddaac0420405195b2cd851f17c7d9b0a4d6b740..9b74840eaf166d14574be4cf718325d5b52cb77c 100644
--- a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml
+++ b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_02.xml
@@ -9,7 +9,7 @@
           <shape type="BooleanShape" operation="Subtraction" material="Air">
             <shape type="Box" dx="Ecal_endcap_center_box_size/2.0" dy="Ecal_endcap_center_box_size/2.0"
                    dz="EcalEndcapRing_max_z"/>
-            <shape type="Tube" rmin="0" rmax="EcalEndcapRing_inner_radius - env_safety" dz="2.0*EcalEndcapRing_max_z + env_safety"/>
+            <shape type="Tube" rmin="0" rmax="EcalEndcapRing_inner_radius" dz="2.0*EcalEndcapRing_max_z + env_safety"/>
 
             <position x="0.5*(EcalEndcapRing_min_z + EcalEndcapRing_max_z)*tan(Ecal_ECRing_Crossing_Angle/2)" y="0" z="0"/>
             <!-- position x="0" y="0" z="0"/ -->
diff --git a/Detector/DetCEPCv4/compact/ftd_cepc_02.xml b/Detector/DetCEPCv4/compact/ftd_cepc_02.xml
index 66e75c1dbbd95cc5155904feb069016bac32471d..498b2f214c3b86e033dc75850afbd8d1e3614fb4 100644
--- a/Detector/DetCEPCv4/compact/ftd_cepc_02.xml
+++ b/Detector/DetCEPCv4/compact/ftd_cepc_02.xml
@@ -9,7 +9,8 @@
     <detector name="FTD" type="FTD_cepc" vis="FTDVis" id="ILDDetID_FTD" limits="Tracker_limits" readout="FTDCollection" insideTrackingVolume="true">
 
       <envelope vis="ILD_FTDVis">
-        <shape type="BooleanShape" operation="Subtraction" material="Air" >
+	<shape type="Assembly"/>
+        <!--shape type="BooleanShape" operation="Subtraction" material="Air" >
           <shape type="BooleanShape" operation="Subtraction" material="Air" >
             <shape type="BooleanShape" operation="Subtraction" material="Air" >
               <shape type="BooleanShape" operation="Subtraction" material="Air" >
@@ -29,7 +30,7 @@
                  z="(FTD_half_length-BeamPipe_CentralAl_zmax)/2. + env_safety "/>
           <position x="0" y="0" z="-BeamPipe_CentralAl_zmax-(FTD_half_length-BeamPipe_CentralAl_zmax)/2."/>
           <rotation x="0" y="180.*deg" z="0" />
-        </shape>
+        </shape-->
       </envelope>
 
       <type_flags type="DetType_TRACKER +  DetType_ENDCAP  + DetType_PIXEL + DetType_STRIP "/>
diff --git a/Detector/DetCEPCv4/compact/materials.xml b/Detector/DetCEPCv4/compact/materials.xml
index 5e0ba2345541a067e10e04f76df2babf39331c6b..aa77249fab9f39cb728716ae16d88858679def02 100644
--- a/Detector/DetCEPCv4/compact/materials.xml
+++ b/Detector/DetCEPCv4/compact/materials.xml
@@ -548,5 +548,20 @@
        <fraction n="0.194" ref="Cu" />
     </material>
 
+    <material name="G4_PARAFFIN">
+      <D type="density" value="0.93" unit="g/cm3" />
+       <fraction n="0.148605" ref="H" />
+       <fraction n="0.851395" ref="C" />
+    </material>
+
+    <material name="superconductor">
+      <D type="density" value="6.78" unit="g/cm3" />
+       <fraction n="0.56" ref="Ni" />
+       <fraction n="0.44" ref="Ti" />
+    </material>
 
+    <material name="lN2">
+      <D type="density" value="0.807" unit="g/cm3" />
+       <fraction n="1" ref="N" />
+    </material>
   </materials>
diff --git a/Detector/DetCEPCv4/compact/top_defs.xml b/Detector/DetCEPCv4/compact/top_defs.xml
index 021f80a852b9e20e8cd3fa1aad6b8a04f1882f2c..cfe69006fac01d14ae44a3d3a91277957783c18f 100644
--- a/Detector/DetCEPCv4/compact/top_defs.xml
+++ b/Detector/DetCEPCv4/compact/top_defs.xml
@@ -14,7 +14,7 @@
   <constant name="Field_outer_thickness" value="2550*mm"/>
 
   <!-- VXD -->
-  <constant name="top_VXD_inner_radius"   value="15*mm "/>
+  <constant name="top_VXD_inner_radius"   value="15.5*mm "/>
   <constant name="top_VXD_outer_radius"   value="101*mm "/>
   <constant name="top_VXD_half_length"    value="200*mm "/>
 
diff --git a/Detector/DetCEPCv4/compact/vxd07_01.xml b/Detector/DetCEPCv4/compact/vxd07_01.xml
index 77374a30526776c53a80bc8a3888c64388237228..e13de6c885b9262b54214308a8ce492ed46e38ce 100644
--- a/Detector/DetCEPCv4/compact/vxd07_01.xml
+++ b/Detector/DetCEPCv4/compact/vxd07_01.xml
@@ -61,7 +61,7 @@
 				external_metal_thickness="0.009*mm"  />
       <!-- SQL command: "SELECT * FROM cryostat;"  -->
       <cryostat id="1" alu_skin_inner_radious="100*mm" alu_skin_tickness="0.5*mm" foam_inner_radious="90*mm" foam_tickness="10*mm" foam_half_z="166.6*mm" 
-		endplate_inner_radious="VXD_inner_radius_1+5.6*mm" 
+		endplate_inner_radious="VXD_inner_radius_1"
 		cryostat_option="1" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm"  />
       <!-- SQL command: "select * from support_shell;"  -->
       <support_shell id="0" inner_radious="65*mm" half_z="145*mm" thickess="0.49392*mm" endplate_inner_radious="30*mm" endplate_inner_radius_L1="15.7*mm" endplate_outer_radius_L1="20*mm" 
diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp
index 334af303d765b12f008d7eccad8a8f4c02e036ee..d72739195fd9e32cd13594aa5f7d94581977331e 100644
--- a/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp
+++ b/Detector/DetCEPCv4/src/calorimeter/SHcalSc04_Barrel_v04.cpp
@@ -46,11 +46,11 @@ using dd4hep::rec::LayeredCalorimeterData;
 
 // After reading in all the necessary parameters.
 // To check the radius range and the space for placing the total layers
-static bool validateEnvelope(double rInner, double rOuter, double radiatorThickness, double layerThickness, int layerNumber){
+static bool validateEnvelope(double rInner, double rOuter, double radiatorThickness, double layerThickness, int layerNumber, int nsymmetry){
   
   bool Error = false;
   bool Warning = false;
-  double spaceAllowed = rOuter*cos(M_PI/16.) - rInner;
+  double spaceAllowed = rOuter*cos(M_PI/nsymmetry) - rInner;
   double spaceNeeded  = (radiatorThickness + layerThickness)* layerNumber;
   double spaceToleranted  = (radiatorThickness + layerThickness)* (layerNumber+1);
   double rOuterRecommaned = ( rInner + spaceNeeded )/cos(M_PI/16.);
@@ -59,17 +59,17 @@ static bool validateEnvelope(double rInner, double rOuter, double radiatorThickn
   
   if( spaceNeeded > spaceAllowed )
     {
-      printout( dd4hep::ERROR,  "SHcalSc04_Barrel_v01", " Layer number is more than it can be built! "  ) ;
+      printout( dd4hep::ERROR,  "SHcalSc04_Barrel_v04", " Layer number is more than it can be built! "  ) ;
       Error = true;
     }
   else if ( spaceToleranted < spaceAllowed )
     {
-      printout( dd4hep::WARNING,  "SHcalSc04_Barrel_v01", " Layer number is less than it is able to build!" ) ;
+      printout( dd4hep::WARNING,  "SHcalSc04_Barrel_v04", " Layer number is less than it is able to build!" ) ;
       Warning = true;
     }
   else
     {
-      printout( dd4hep::DEBUG,  "SHcalSc04_Barrel_v01"," has been validated and start to build it." ) ;
+      printout( dd4hep::DEBUG,  "SHcalSc04_Barrel_v04"," has been validated and start to build it." ) ;
       Error = false;
       Warning = false;
     }
@@ -179,13 +179,8 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
 
   int         Hcal_nlayers                     = theDetector.constant<int>("Hcal_nlayers");
 
-  double      TPC_outer_radius               = theDetector.constant<double>("TPC_outer_radius");
-
-  double      Ecal_outer_radius               = theDetector.constant<double>("Ecal_outer_radius");
-
-  printout( dd4hep::DEBUG,  "SHcalSc04_Barrel_v04", "TPC_outer_radius : %e   - Ecal_outer_radius: %e ", TPC_outer_radius , Ecal_outer_radius) ;
-
-  validateEnvelope(Hcal_inner_radius, Hcal_outer_radius, Hcal_radiator_thickness, Hcal_chamber_thickness, Hcal_nlayers);
+  printout( dd4hep::INFO, "SHcalSc04_Barrel_v04", "Hcal_inner_radius : %e   - Hcal_outer_radius %e ", Hcal_inner_radius , Hcal_outer_radius);
+  validateEnvelope(Hcal_inner_radius, Hcal_outer_radius, Hcal_radiator_thickness, Hcal_chamber_thickness, Hcal_nlayers, Hcal_inner_symmetry);
 
   Readout readout = sens.readout();
   dd4hep::Segmentation seg = readout.segmentation();
diff --git a/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp b/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp
index 52049c85e44281d4b77e0cd64c6c88f8980ff6db..648cc222a61c1d0a22468ce4308f90773f24a04e 100644
--- a/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp
+++ b/Detector/DetCEPCv4/src/tracker/FTD_Simple_Staggered_geo.cpp
@@ -1274,7 +1274,9 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
   ftd.addExtension< ZDiskPetalsData >( zDiskPetalsData ) ;
   
   //--------------------------------------
-  
+  if ( x_det.hasAttr(_U(combineHits)) ) {
+    ftd.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  }
 
   return ftd;
 }
diff --git a/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp b/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp
index 0b5aef7dbae2a1798e7805b4e3321c984fa763f3..053371aacf430406f2412e579648971f1d610d50 100644
--- a/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp
+++ b/Detector/DetCEPCv4/src/tracker/FTD_cepc_geo.cpp
@@ -563,6 +563,9 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
 	  {
             _dbParDisk.ZStartOuterCylinder = _z_position;
 	  }
+
+        _dbParDisk.ZStopOuterCylinder = _zEnd;
+        _dbParDisk.ZStopInnerCylinder = _zEnd;
 	break;
           
       case 7:
@@ -1273,7 +1276,9 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
   ftd.addExtension< ZDiskPetalsData >( zDiskPetalsData ) ;
   
   //--------------------------------------
-  
+  if ( x_det.hasAttr(_U(combineHits)) ) {
+    ftd.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  }
 
   return ftd;
 }
diff --git a/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp b/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp
index 91e906c81c82af1ec6e9c5c785562599c046b68f..e311fcc923d3470be157a1caf69716dbda8a05b0 100644
--- a/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp
+++ b/Detector/DetCEPCv4/src/tracker/SET_Simple_Planar_geo.cpp
@@ -456,6 +456,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
   
   
   set.setVisAttributes( theDetector, x_det.visStr(), envelope );
+
+  if ( x_det.hasAttr(_U(combineHits)) ) {
+    set.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  }
   
   return set;
 }
diff --git a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp
index e6a93e80c637876fdfc867725787d9c034973c7a..f76791463b748f9ddc7eeb4db177f8564569af0f 100644
--- a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp
+++ b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Planar_geo.cpp
@@ -473,6 +473,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
   //--------------------------------------
   
   sit.setVisAttributes( theDetector, x_det.visStr(), envelope );
+
+  if ( x_det.hasAttr(_U(combineHits)) ) {
+    sit.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  }
   
   return sit;
 }
diff --git a/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp b/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp
index 1ed9e3a7c6ce0fc7ad2561e4e6178311fa4f365a..ae2d4d83c77c14e4552d00c9e0f03bb03c8826f5 100644
--- a/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp
+++ b/Detector/DetCEPCv4/src/tracker/VXD04_geo.cpp
@@ -1582,10 +1582,12 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
 
   
   //--------------------------------------
-  
-  
   vxd.setVisAttributes( theDetector, x_det.visStr(), envelope );
 
+  if ( x_det.hasAttr(_U(combineHits)) ) {
+    vxd.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  }
+
   return vxd;
 }
 DECLARE_DETELEMENT(VXD04,create_element)
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml
index 1ef2c4b96676946979cddee80bb62df06356e012..1d57df45b51dfe153cdb02dc2e3f9ec4753392b9 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml
@@ -10,6 +10,11 @@
 
   <define>
     <constant name="ForkAsymThickness" value="BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness-BeamPipe_Upstream_inner_radius"/>
+    <constant name="BeamPipe_QD0_zmax"             value="3950*mm"/>
+    <constant name="BeamPipe_QF1_zmin"             value="4450*mm"/>
+    <constant name="BeamPipe_QF1_zmax"             value="5910*mm"/>
+    <constant name="BeamPipe_QF1_inner_radius"     value="20.5*mm"/>
+    <constant name="BeamPipe_Iron_thickness"       value="2.5*mm"/>
   </define>
 
   <detectors>        
@@ -44,8 +49,6 @@
       <section type="FatWaist" name="Waist" zStart="BeamPipe_LinkerCu_zmax" zEnd="BeamPipe_Waist_zmax" rStart="BeamPipe_Expanded_inner_radius" size="BeamPipe_Crotch_hole_height">
 	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="TubeVis"/>
       </section>
-      <!--CrotchAsymUp&CrotchAsymDn not work to fix, because of problem on convert from TGeo to Geant4-->
-      <!--Since lcg101, they work-->
       <section type="CrotchAsymUp" name="Fork" zStart="BeamPipe_Waist_zmax" zEnd="BeamPipe_Crotch_zmax"
 	       rStart="BeamPipe_Expanded_inner_radius" rEnd="BeamPipe_Upstream_inner_radius" size="BeamPipe_Crotch_hole_height">
 	<layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" thicknessEnd="ForkAsymThickness" vis="TubeVis"/>
@@ -62,6 +65,136 @@
         <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/>
         <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="TubeVis"/>
       </section>
+      <section type="Legs" name="QD0Link" zStart="BeamPipe_FirstSeparated_zmax" zEnd="BeamPipe_SecondSeparated_zmax" rStart="0">
+        <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+      </section>
+      <section type="Legs" name="QD0" zStart="BeamPipe_SecondSeparated_zmax" zEnd="BeamPipe_QD0_zmax" rStart="0">
+        <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+        <layer material="G4_Cu" thickness="3.5*mm" vis="TubeVis"/>
+        <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/>
+        <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/>
+      </section>
+      <section type="Legs" name="QF1Link" zStart="BeamPipe_QD0_zmax" zEnd="BeamPipe_QF1_zmin" rStart="0">
+        <layer material="beam" thickness="BeamPipe_Dnstream_inner_radius" thicknessEnd="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+      </section>
+      <section type="Legs" name="QF1" zStart="BeamPipe_QF1_zmin" zEnd="BeamPipe_QF1_zmax" rStart="0">
+        <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+        <layer material="G4_Cu" thickness="3.0*mm" vis="TubeVis"/>
+        <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/>
+        <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/>
+      </section>
+      <section type="Legs" name="Farest" zStart="BeamPipe_QF1_zmax" zEnd="BeamPipe_end_z" rStart="0">
+        <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+      </section>
+
+      <!-- Magnets and their cooling, support -->
+      <section type="CenterSide" name="Magnet_1" zStart="1160*mm" zEnd="1900*mm" rStart="90*mm">
+        <layer material="superconductor" thickness="20*mm" vis="MagentaVis"/>
+      </section>
+      <section type="CenterSide" name="Magnet_2" zStart="1930*mm" zEnd="3964*mm" rStart="120*mm">
+        <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/>
+      </section>
+      <section type="CenterSide" name="Magnet_3" zStart="3970*mm" zEnd="7000*mm" rStart="185*mm">
+        <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_1" zStart="970*mm" zEnd="1110*mm" rStart="31*mm">
+        <layer material="stainless_steel" thickness="1.5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_2" zStart="1110*mm" zEnd="1115*mm" rStart="50.0*mm">
+        <layer material="stainless_steel" thickness="91.25*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_3" zStart="1115*mm" zEnd="1900*mm" rStart="130.75*mm" rEnd="175*mm">
+        <layer material="stainless_steel" thickness="10.5*mm" thicknessEnd="65*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_4" zStart="1900*mm" zEnd="3800*mm" rStart="175*mm">
+        <layer material="stainless_steel" thickness="65*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_5" zStart="3800*mm" zEnd="3910*mm" rStart="175*mm">
+        <layer material="stainless_steel" thickness="135*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_6" zStart="3910*mm" zEnd="7160*mm" rStart="240*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_1" zStart="1130*mm" zEnd="1135*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="50*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_2i" zStart="1135*mm" zEnd="1925*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_2o" zStart="1135*mm" zEnd="1900*mm" rStart="120*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_3l" zStart="1900*mm" zEnd="1905*mm" rStart="120*mm">
+        <layer material="stainless_steel" thickness="25*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_3r" zStart="1925*mm" zEnd="1930*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="35*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_4i" zStart="1930*mm" zEnd="4000*mm" rStart="105*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_4o" zStart="1905*mm" zEnd="3940*mm" rStart="140*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_5l" zStart="3940*mm" zEnd="3945*mm" rStart="140*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_5r" zStart="4000*mm" zEnd="4005*mm" rStart="105*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_6i" zStart="4005*mm" zEnd="7050*mm" rStart="170*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_6o" zStart="3945*mm" zEnd="7050*mm" rStart="205*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_7" zStart="7050*mm" zEnd="7055*mm" rStart="170*mm">
+        <layer material="stainless_steel" thickness="40*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1l" zStart="1135*mm" zEnd="1160*mm" rStart="80*mm">
+        <layer material="lN2" thickness="40*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1i" zStart="1160*mm" zEnd="1900*mm" rStart="80*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1o" zStart="1160*mm" zEnd="1900*mm" rStart="110*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1r" zStart="1900*mm" zEnd="1925*mm" rStart="80*mm">
+        <layer material="lN2" thickness="40*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2l" zStart="1905*mm" zEnd="1930*mm" rStart="120*mm">
+        <layer material="lN2" thickness="20*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2i" zStart="1925*mm" zEnd="3964*mm" rStart="110*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2o" zStart="1930*mm" zEnd="3945*mm" rStart="130*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2r1" zStart="3964*mm" zEnd="4000*mm" rStart="110*mm">
+        <layer material="lN2" thickness="65*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2r2" zStart="3945*mm" zEnd="3964*mm" rStart="130*mm">
+        <layer material="lN2" thickness="45*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3l" zStart="3945*mm" zEnd="3970*mm" rStart="175*mm">
+        <layer material="lN2" thickness="30*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3i" zStart="3970*mm" zEnd="7000*mm" rStart="175*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3o" zStart="3970*mm" zEnd="7000*mm" rStart="195*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3r" zStart="7000*mm" zEnd="7050*mm" rStart="175*mm">
+        <layer material="lN2" thickness="30*mm" vis="BlueVis"/>
+      </section>
     </detector>
   </detectors>        
 </lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml
index ef58b72abe1e9d6e836043f4b03a7cfb0d2316bc..24f79c29b5ed686aa1c95c4e0656bf63a37da58d 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_02.xml
@@ -11,6 +11,11 @@
   <define>
     <!--only needed for asymetry double pipe-->
     <!--constant name="ForkAsymThickness" value="BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness-BeamPipe_Upstream_inner_radius"/-->
+    <constant name="BeamPipe_QD0_zmax"             value="3950*mm"/>
+    <constant name="BeamPipe_QF1_zmin"             value="4450*mm"/>
+    <constant name="BeamPipe_QF1_zmax"             value="5910*mm"/>
+    <constant name="BeamPipe_QF1_inner_radius"     value="20.5*mm"/>
+    <constant name="BeamPipe_Iron_thickness"       value="2.5*mm"/>
   </define>
 
   <detectors>        
@@ -63,6 +68,132 @@
         <layer material="beam" thickness="BeamPipe_Fork_inner_radius" vis="VacVis"/>
         <layer material="G4_Cu" thickness="BeamPipe_Cu_thickness" vis="TubeVis"/>
       </section>
+      <section type="Legs" name="QD0" zStart="BeamPipe_SecondSeparated_zmax" zEnd="BeamPipe_QD0_zmax" rStart="0">
+        <layer material="beam" thickness="BeamPipe_Fork_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+        <layer material="G4_Cu" thickness="3.5*mm" vis="TubeVis"/>
+        <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/>
+        <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/>
+      </section>
+      <section type="Legs" name="QF1Linker" zStart="BeamPipe_QD0_zmax" zEnd="BeamPipe_QF1_zmin" rStart="0">
+        <layer material="beam" thickness="BeamPipe_Fork_inner_radius" thicknessEnd="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+      </section>
+      <section type="Legs" name="QF1" zStart="BeamPipe_QF1_zmin" zEnd="BeamPipe_QF1_zmax" rStart="0">
+        <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+        <layer material="G4_Cu" thickness="3.0*mm" vis="TubeVis"/>
+        <layer material="superconductor" thickness="6.0*mm" vis="MagentaVis"/>
+        <layer material="stainless_steel" thickness="8.0*mm" vis="ShellVis"/>
+      </section>
+      <section type="Legs" name="Farest" zStart="BeamPipe_QF1_zmax" zEnd="BeamPipe_end_z" rStart="0">
+        <layer material="beam" thickness="BeamPipe_QF1_inner_radius" vis="VacVis"/>
+        <layer material="stainless_steel" thickness="BeamPipe_Iron_thickness" vis="TubeVis"/>
+      </section>
+
+      <!-- Magnets and their cooling, support -->
+      <section type="CenterSide" name="Magnet_1" zStart="1160*mm" zEnd="1900*mm" rStart="90*mm">
+        <layer material="superconductor" thickness="20*mm" vis="MagentaVis"/>
+      </section>
+      <section type="CenterSide" name="Magnet_2" zStart="1930*mm" zEnd="3964*mm" rStart="120*mm">
+        <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/>
+      </section>
+      <section type="CenterSide" name="Magnet_3" zStart="3970*mm" zEnd="7000*mm" rStart="185*mm">
+        <layer material="superconductor" thickness="10*mm" vis="MagentaVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_1" zStart="970*mm" zEnd="1110*mm" rStart="33*mm">
+        <layer material="stainless_steel" thickness="1.5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_2" zStart="1110*mm" zEnd="1115*mm" rStart="50.0*mm">
+        <layer material="stainless_steel" thickness="91.25*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_3" zStart="1115*mm" zEnd="1900*mm" rStart="130.75*mm" rEnd="175*mm">
+        <layer material="stainless_steel" thickness="10.5*mm" thicknessEnd="65*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_4" zStart="1900*mm" zEnd="3800*mm" rStart="175*mm">
+        <layer material="stainless_steel" thickness="65*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_5" zStart="3800*mm" zEnd="3910*mm" rStart="175*mm">
+        <layer material="stainless_steel" thickness="135*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetShell_6" zStart="3910*mm" zEnd="7160*mm" rStart="240*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_1" zStart="1130*mm" zEnd="1135*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="50*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_2i" zStart="1135*mm" zEnd="1925*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_2o" zStart="1135*mm" zEnd="1900*mm" rStart="120*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_3l" zStart="1900*mm" zEnd="1905*mm" rStart="120*mm">
+        <layer material="stainless_steel" thickness="25*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_3r" zStart="1925*mm" zEnd="1930*mm" rStart="75*mm">
+        <layer material="stainless_steel" thickness="35*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_4i" zStart="1930*mm" zEnd="4000*mm" rStart="105*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_4o" zStart="1905*mm" zEnd="3940*mm" rStart="140*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_5l" zStart="3940*mm" zEnd="3945*mm" rStart="140*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_5r" zStart="4000*mm" zEnd="4005*mm" rStart="105*mm">
+        <layer material="stainless_steel" thickness="70*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_6i" zStart="4005*mm" zEnd="7050*mm" rStart="170*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_6o" zStart="3945*mm" zEnd="7050*mm" rStart="205*mm">
+        <layer material="stainless_steel" thickness="5*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetSupport_7" zStart="7050*mm" zEnd="7055*mm" rStart="170*mm">
+        <layer material="stainless_steel" thickness="40*mm" vis="ShellVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1l" zStart="1135*mm" zEnd="1160*mm" rStart="80*mm">
+        <layer material="lN2" thickness="40*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1i" zStart="1160*mm" zEnd="1900*mm" rStart="80*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1o" zStart="1160*mm" zEnd="1900*mm" rStart="110*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_1r" zStart="1900*mm" zEnd="1925*mm" rStart="80*mm">
+        <layer material="lN2" thickness="40*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2l" zStart="1905*mm" zEnd="1930*mm" rStart="120*mm">
+        <layer material="lN2" thickness="20*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2i" zStart="1925*mm" zEnd="3964*mm" rStart="110*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2o" zStart="1930*mm" zEnd="3945*mm" rStart="130*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2r1" zStart="3964*mm" zEnd="4000*mm" rStart="110*mm">
+        <layer material="lN2" thickness="65*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_2r2" zStart="3945*mm" zEnd="3964*mm" rStart="130*mm">
+        <layer material="lN2" thickness="45*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3l" zStart="3945*mm" zEnd="3970*mm" rStart="175*mm">
+        <layer material="lN2" thickness="30*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3i" zStart="3970*mm" zEnd="7000*mm" rStart="175*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3o" zStart="3970*mm" zEnd="7000*mm" rStart="195*mm">
+        <layer material="lN2" thickness="10*mm" vis="BlueVis"/>
+      </section>
+      <section type="CenterSide" name="MagnetCooling_3r" zStart="7000*mm" zEnd="7050*mm" rStart="175*mm">
+        <layer material="lN2" thickness="30*mm" vis="BlueVis"/>
+      </section>
     </detector>
   </detectors>        
 </lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml
index e439461d9ca5f824e321e0e43b2fc833232f88bd..eaf59929b25cdf92662baa9c612f7d0d7d625543 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml
@@ -2,10 +2,13 @@
 <lccdd>
   <define>
     <constant name="ecalbarrel_inner_radius" value="Ecal_barrel_inner_radius"/>
-    <constant name="ecalbarrel_thickness"    value="Ecal_barrel_thickness"/>    <!--Must be n*10*mm! -->
-    <constant name="ecalbarrel_zlength"      value="Ecal_barrel_half_length*2"/>   <!--Must be n*10*mm! -->
-    <constant name="bar_x" value="1*cm"/>
-    <constant name="bar_y" value="1*cm"/>
+    <constant name="ecalbarrel_thickness"    value="Ecal_barrel_thickness"/>       <!--Must be n*10*mm! -->
+    <constant name="ecalbarrel_zlength"      value="Ecal_barrel_half_length*2"/>   <!--Must be n*10*mm n*Nblock_z! -->
+    <constant name="n_symm"                  value="Ecal_barrel_symmetry" />       <!--Only support 8 and 12 now -->
+    <constant name="Nblock_z"   value="11" />
+    <constant name="Nblock_phi" value="4" />
+    <constant name="bar_x"      value="1*cm"/>
+    <constant name="bar_y"      value="1*cm"/>
   </define>
 
   <regions>
@@ -21,7 +24,7 @@
   
   <readouts>
     <readout name="EcalBarrelCollection">
-      <!-- <segmentation type="NoSegmentation"/> -->
+      <!--segmentation type="NoSegmentation"/-->
 
       <!--segmentation type="CartesianGridXYZ"
                     grid_size_x="1*cm"
diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_03.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_03.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1e79e9de9e349722c1a0ea93573e09c1f37093ee
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_03.xml
@@ -0,0 +1,64 @@
+<lccdd>
+  <define>
+    <constant name="SiliconThickness" value="0.2*mm"/>
+    <constant name="SupportThickness" value="1.0*mm"/>
+    <constant name="ModuleZGap"       value="1.0*mm"/>
+    <constant name="ModuleRPhiGap"    value="-10*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_FTD" name="FTD" type="SiTrackerSkewRing_v01" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true" reflect="true">
+      <envelope>
+	<shape type="Assembly"/>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER +  DetType_ENDCAP  + DetType_PIXEL "/>
+
+      <reconstruction strip_width="0.05*mm" strip_length="92*mm" strip_pitch="0" strip_angle="0"/>
+
+      <layer id="0" z="SiTracker_endcap_z1" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z1*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius1"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+	<component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+	<component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="1" z="SiTracker_endcap_z2" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z2*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius2"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="2" z="SiTracker_endcap_z3" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z3*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius3"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="3" z="SiTracker_endcap_z4" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z4*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius4"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="4" z="SiTracker_endcap_z5" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z5*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius5"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="5" z="SiTracker_endcap_z6" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z6*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius6"
+             phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="6" z="SiTracker_endcap_z7" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z7*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius7"
+             phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="FTDCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml
index 2c3c63d33dfebfe092b71deddd759918a9a39228..9c7ab8b8e95a98f25c5667d814965ee63f922f74 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_StaggeredLadder_v01_01.xml
@@ -22,7 +22,7 @@
       <envelope>
 	<shape type="BooleanShape" operation="Subtraction" material="Air" >
 	  <shape type="BooleanShape" operation="Subtraction" material="Air" >
-            <shape type="Tube" rmin="VXD_inner_radius+1*mm" rmax="VXD_outer_radius" dz="VXD_half_length" />
+            <shape type="Tube" rmin="VXD_inner_radius" rmax="VXD_outer_radius" dz="VXD_half_length" />
             <shape type="Cone" rmin1="0" rmax1="BeamPipe_VertexRegion_rmax" rmin2="0" rmax2="Vertex_Side_rmin" z="(VXD_half_length-BeamPipe_CentralAl_zmax)/2." />
             <position x="0" y="0" z="VXD_half_length-(VXD_half_length-BeamPipe_CentralAl_zmax)/2."/>
           </shape>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml
index d5bf5a5e8e3ec510077cb7796d13568b8db24585..ce0a8a50b7a35da791a675216f0cf086567f27e3 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml
@@ -3,7 +3,7 @@
     <constant name="VXD_inner_radius" value="Vertex_inner_radius"/>
     <constant name="VXD_outer_radius" value="Vertex_outer_radius"/>
     <constant name="VXD_half_length"  value="Vertex_half_length"/>
-    <constant name="VXD_inner_radius_1" value="BeamPipe_VertexRegion_rmax"/>
+    <constant name="VXD_inner_radius_1" value="Vertex_Side_rmin"/><!--BeamPipe_VertexRegion_rmax"/-->
     <constant name="VXD_radius_r1" value="16*mm"/>
     <constant name="VXD_radius_r3" value="37*mm"/>
     <constant name="VXD_radius_r5" value="58*mm"/>
@@ -22,10 +22,10 @@
 	    <shape type="BooleanShape" operation="Subtraction" material="Air" >
 	      <shape type="BooleanShape" operation="Subtraction" material="Air" >
 		<shape type="Tube" rmin="VXD_inner_radius" rmax="VXD_outer_radius" dz="VXD_half_length" />
-		<shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " />
+		<shape type="Tube" rmin="0" rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " />
 		<position x="0" y="0" z="VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety"/> 
 	      </shape>
-	      <shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " />
+	      <shape type="Tube" rmin="0" rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " />
 	      <position x="0" y="0" z="- ( VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety ) "/> 
 	      <rotation x="0" y="180.*deg" z="0" />
 	    </shape>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..57a6014c2f70c1feccfef1f8cd802c41bbb16052
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_02.xml
@@ -0,0 +1,87 @@
+<lccdd>
+  <define>
+    <constant name="VXD_inner_radius" value="Vertex_inner_radius"/>
+    <constant name="VXD_outer_radius" value="Vertex_outer_radius"/>
+    <constant name="VXD_half_length"  value="Vertex_half_length"/>
+    <constant name="VXD_inner_radius_1" value="Vertex_Side_rmin"/>
+    <constant name="VXD_radius_r1" value="16*mm"/>
+    <constant name="VXD_radius_r3" value="37*mm"/>
+    <constant name="VXD_radius_r5" value="58*mm"/>
+    <constant name="VXD_length_r1" value="113*mm"/>
+    <constant name="VXD_length_r3" value="408*mm"/>
+    <constant name="VXD_length_r5" value="408*mm"/>
+    <constant name="VXD_cone_max_z" value="Vertex_half_length-10*mm"/>
+    <constant name="VXD_cone_min_z" value="VXD_length_r5+10*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_VXD" name="VXD" type="VXD04" vis="SeeThrough" readout="VXDCollection" insideTrackingVolume="true">
+      <envelope>
+	<shape type="Assembly"/>
+      </envelope>
+
+      <!-- set the detecor type flag - note: using the '+' operator here as the evaluator does not understand '|' 
+	   -> be carefull not to add any flags twice !!!     -->
+      <type_flags type=" DetType_TRACKER + DetType_PIXEL + DetType_VERTEX "/>
+  
+      <!-- database : TMP_DB10 -->
+      <!-- SQL command: "select * from layers_common_parameters;"  -->
+      <layers_common_parameters id="1"
+				electronics_structure_thickness="0.1*mm"
+				active_silicon_thickness="0.05*mm"
+				support_structure_radial_thickness="0.49392*mm"
+				end_electronics_half_z="5*mm" 
+				strip_final_beampipe_radious="VXD_inner_radius_1"	
+				side_band_electronics_option="1"
+				end_ladd_electronics_option="1"
+				side_band_electronics_width="0.5*mm" 
+				side_band_electronics_thickness="0.05*mm"
+				active_side_band_electronics_option="0"
+				layer_gap="2*mm"
+				flex_cable_material="G4_KAPTON"
+				flex_cable_thickness="0.05*mm"
+				foam_spacer_material="SiC_foam"
+				foam_spacer_thickness="0.94*mm"
+				metal_traces_material="G4_Al"
+				metal_traces_thickness="0.01*mm"
+				cool_pipe_material="titanium" 
+				cool_pipe_inner_radius="0.75*mm"
+				cool_pipe_outer_radius="1*mm"
+				external_kapton_thickness="0.05*mm"
+				external_metal_thickness="0.009*mm"  />
+      <!-- SQL command: "SELECT * FROM cryostat;"  -->
+      <cryostat id="1" alu_skin_inner_radious="85*mm" alu_skin_tickness="0.5*mm" foam_inner_radious="80*mm" foam_tickness="10*mm" foam_half_z="466*mm" 
+		endplate_inner_radious="VXD_inner_radius_1" 
+		cryostat_option="0" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm"  />
+      <!-- SQL command: "select * from support_shell;"  -->
+      <support_shell id="0" inner_radious="65*mm" half_z="435*mm" thickess="0.49392*mm" endplate_inner_radious="30*mm" endplate_inner_radius_L1="15.7*mm" endplate_outer_radius_L1="20*mm" 
+		     offset_ladder_block="0.28224*mm" beryllium_ladder_block_length="5*mm" beryllium_ladder_block_thickness="0.25*mm" shell_endplate_thickness="2*mm" forward_shell_half_z="6.5*mm"  />
+      <!-- SQL command: "select * from layer;"  -->
+      <layer id="0" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.5*mm" nb_ladder="10" ladder_gap="0*mm" end_electronics_width="5.5*mm" 
+	     initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" 
+	     final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm"  />
+      <layer id="1" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.5*mm" nb_ladder="10" ladder_gap="0*mm" end_electronics_width="5.5*mm" 
+	     initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" 
+	     final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm"  />
+      <layer id="2" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="11" ladder_gap="0*mm" end_electronics_width="11*mm" 
+	     initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" 
+	     final_metal_striplines_thickness="0.00893*mm" support_width="10*mm"  />
+      <layer id="3" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="11" ladder_gap="0*mm" end_electronics_width="11*mm" 
+	     initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" 
+	     final_metal_striplines_thickness="0.00893*mm" support_width="10*mm"  />
+      <layer id="4" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r5" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" end_electronics_width="11*mm" 
+	     initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" 
+	     final_metal_striplines_thickness="0.0138*mm" support_width="10*mm"  />
+      <layer id="5" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r5" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" end_electronics_width="11*mm" 
+	     initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" 
+	     final_metal_striplines_thickness="0.0138*mm" support_width="10*mm"  />
+    </detector>
+    
+  </detectors>
+  
+  <readouts>
+    <readout name="VXDCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+    </readout>
+  </readouts>
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_03.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_03.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5de5bfea1767444929757bb1e8270392afee8b34
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_03.xml
@@ -0,0 +1,107 @@
+<lccdd>
+  <define>
+    <constant name="VXD_inner_radius" value="Vertex_inner_radius"/>
+    <constant name="VXD_outer_radius" value="Vertex_outer_radius"/>
+    <constant name="VXD_half_length"  value="Vertex_half_length"/>
+    <constant name="VXD_inner_radius_1" value="Vertex_Side_rmin"/>
+    <constant name="VXD_radius_r1" value="12*mm"/>
+    <constant name="VXD_radius_r3" value="34*mm"/>
+    <constant name="VXD_radius_r5" value="58*mm"/>
+    <constant name="VXD_length_r1" value="62.5*mm"/>
+    <constant name="VXD_length_r3" value="125*mm"/>
+    <constant name="VXD_length_r5" value="125*mm"/>
+    <constant name="VXD_cone_max_z" value="Vertex_half_length-10*mm"/>
+    <constant name="VXD_cone_min_z" value="VXD_length_r5+10*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_VXD" name="VXD" type="VXD04" vis="VXDVis" readout="VXDCollection" insideTrackingVolume="true" combineHits="true">
+      <envelope>
+	<shape type="BooleanShape" operation="Subtraction" material="Air" >
+	  <shape type="BooleanShape" operation="Subtraction" material="Air" >
+	    <shape type="BooleanShape" operation="Subtraction" material="Air" >
+	      <shape type="BooleanShape" operation="Subtraction" material="Air" >
+		<shape type="Tube" rmin="VXD_inner_radius" rmax="VXD_outer_radius" dz="VXD_half_length" />
+		<shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " />
+		<position x="0" y="0" z="VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety"/> 
+	      </shape>
+	      <shape type="Tube" rmin="0." rmax="VXD_inner_radius_1" dz="(VXD_half_length - VXD_cone_max_z)/2. + env_safety " />
+	      <position x="0" y="0" z="- ( VXD_half_length-(VXD_half_length - VXD_cone_max_z)/2.+ env_safety ) "/> 
+	      <rotation x="0" y="180.*deg" z="0" />
+	    </shape>
+	    <shape type="Cone" rmin1="0" rmax1="VXD_inner_radius" rmin2="0" rmax2="VXD_inner_radius_1" 
+		   z="(VXD_cone_max_z-VXD_cone_min_z)/2. + env_safety "/>
+	    <position x="0" y="0" z="VXD_cone_min_z+(VXD_cone_max_z-VXD_cone_min_z)/2."/> 
+	  </shape>
+	  <shape type="Cone" rmin1="0" rmax1="VXD_inner_radius" rmin2="0" rmax2="VXD_inner_radius_1" 
+		 z="(VXD_cone_max_z-VXD_cone_min_z)/2. + env_safety "/>
+	  <position x="0" y="0" z="-(VXD_cone_min_z+(VXD_cone_max_z-VXD_cone_min_z)/2.)"/> 
+	  <rotation x="0" y="180.*deg" z="0" />
+	</shape>
+      </envelope>
+
+      <!-- set the detecor type flag - note: using the '+' operator here as the evaluator does not understand '|' 
+	   -> be carefull not to add any flags twice !!!     -->
+      <type_flags type=" DetType_TRACKER + DetType_PIXEL + DetType_VERTEX "/>
+  
+      <!-- database : TMP_DB10 -->
+      <!-- SQL command: "select * from layers_common_parameters;"  -->
+      <layers_common_parameters id="1"
+				electronics_structure_thickness="0.1*mm"
+				active_silicon_thickness="0.05*mm"
+				support_structure_radial_thickness="0.49392*mm"
+				end_electronics_half_z="5*mm" 
+				strip_final_beampipe_radious="VXD_inner_radius_1"	
+				side_band_electronics_option="1"
+				end_ladd_electronics_option="1"
+				side_band_electronics_width="0.5*mm" 
+				side_band_electronics_thickness="0.05*mm"
+				active_side_band_electronics_option="0"
+				layer_gap="2*mm"
+				flex_cable_material="G4_KAPTON"
+				flex_cable_thickness="0.05*mm"
+				foam_spacer_material="SiC_foam"
+				foam_spacer_thickness="0.94*mm"
+				metal_traces_material="G4_Al"
+				metal_traces_thickness="0.01*mm"
+				cool_pipe_material="titanium" 
+				cool_pipe_inner_radius="0.75*mm"
+				cool_pipe_outer_radius="1*mm"
+				external_kapton_thickness="0.05*mm"
+				external_metal_thickness="0.009*mm"  />
+      <!-- SQL command: "SELECT * FROM cryostat;"  -->
+      <cryostat id="1" alu_skin_inner_radious="100*mm" alu_skin_tickness="0.5*mm" foam_inner_radious="90*mm" foam_tickness="10*mm" foam_half_z="166.6*mm" 
+		endplate_inner_radious="VXD_inner_radius_1" 
+		cryostat_option="0" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm"  />
+      <!-- SQL command: "select * from support_shell;"  -->
+      <support_shell id="0" inner_radious="65*mm" half_z="145*mm" thickess="0.49392*mm" endplate_inner_radious="30*mm" endplate_inner_radius_L1="15.7*mm" endplate_outer_radius_L1="20*mm" 
+		     offset_ladder_block="0.28224*mm" beryllium_ladder_block_length="5*mm" beryllium_ladder_block_thickness="0.25*mm" shell_endplate_thickness="2*mm" forward_shell_half_z="6.5*mm"  />
+      <!-- SQL command: "select * from layer;"  -->
+      <layer id="0" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.2*mm" nb_ladder="8" ladder_gap="0" strip_line_final_z="150*mm" end_electronics_width="5.2*mm" 
+	     initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" 
+	     final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm"  />
+      <layer id="1" layer_radius="VXD_radius_r1" ladder_length="VXD_length_r1" ladder_width="5.2*mm" nb_ladder="8" ladder_gap="0" strip_line_final_z="150*mm" end_electronics_width="5.2*mm" 
+	     initial_kapton_striplines_thickness="0.04566*mm" final_kapton_striplines_thickness="0.02435*mm" initial_metal_striplines_thickness="0.00806*mm" 
+	     final_metal_striplines_thickness="0.0043*mm" support_width="4.5*mm"  />
+      <layer id="2" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="10.2*mm" nb_ladder="11" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="10.2*mm" 
+	     initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" 
+	     final_metal_striplines_thickness="0.00893*mm" support_width="9.2*mm"  />
+      <layer id="3" layer_radius="VXD_radius_r3" ladder_length="VXD_length_r3" ladder_width="10.2*mm" nb_ladder="11" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="10.2*mm" 
+	     initial_kapton_striplines_thickness="0.04102*mm" final_kapton_striplines_thickness="0.05059*mm" initial_metal_striplines_thickness="0.00724*mm" 
+	     final_metal_striplines_thickness="0.00893*mm" support_width="9.2*mm"  />
+      <layer id="4" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="11*mm" 
+	     initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" 
+	     final_metal_striplines_thickness="0.0138*mm" support_width="10*mm"  />
+      <layer id="5" layer_radius="VXD_radius_r5" ladder_length="VXD_length_r3" ladder_width="11*mm" nb_ladder="17" ladder_gap="0*mm" strip_line_final_z="150*mm" end_electronics_width="11*mm" 
+	     initial_kapton_striplines_thickness="0.04044*mm" final_kapton_striplines_thickness="0.07819*mm" initial_metal_striplines_thickness="0.00714*mm" 
+	     final_metal_striplines_thickness="0.0138*mm" support_width="10*mm"  />
+    </detector>
+    
+  </detectors>
+  
+  <readouts>
+    <readout name="VXDCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+    </readout>
+  </readouts>
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/materials.xml b/Detector/DetCRD/compact/CRD_common_v01/materials.xml
index 1636e38fac798925712717c082a54819c05eacb5..ee48236f87579faa19bdfac3ccd926b583c39094 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/materials.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/materials.xml
@@ -570,4 +570,15 @@
      <fraction n="0.5103012386298891" ref="C" />
    </material>
 
+   <material name="superconductor">
+      <D type="density" value="6.78" unit="g/cm3" />
+       <fraction n="0.56" ref="Ni" />
+       <fraction n="0.44" ref="Ti" />
+   </material>
+
+    <material name="lN2">
+      <D type="density" value="0.807" unit="g/cm3" />
+       <fraction n="1" ref="N" />
+    </material>
+
   </materials>
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/Br.csv b/Detector/DetCRD/compact/CRD_o1_v01/Br.csv
new file mode 100644
index 0000000000000000000000000000000000000000..093e9af359158fdaca67e469b41eb7761fcc7c13
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v01/Br.csv
@@ -0,0 +1,25 @@
+,0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8
+0,0,0.00072238,0.00141836,0.00207148,0.00267135,0.00321527,0.00370693,0.00415367,0.00456403,0.00494571,0.00530457,0.00564426,0.00596631,0.0062705,0.00655513,0.00681818,0.00705771,0.00732861,0.00810929
+0.1,0,0.00146197,0.00286741,0.00418194,0.00538432,0.00647049,0.00744939,0.00833756,0.00915321,0.00991255,0.01062748,0.01130531,0.01194895,0.01255775,0.01312817,0.01365485,0.0141346,0.01459255,0.01554511
+0.2,0,0.00299748,0.00586624,0.00852836,0.01094282,0.01310558,0.01504385,0.01679673,0.01840687,0.0199088,0.02132748,0.02267685,0.02396242,0.02518188,0.02632737,0.02738665,0.02834344,0.02917975,0.0297083
+0.3,0,0.00470406,0.00916282,0.01324734,0.01687741,0.02009235,0.02293873,0.02550271,0.02785864,0.03007062,0.03216839,0.03417707,0.03610186,0.03793614,0.03966636,0.04127328,0.0427277,0.0439612,0.04473902
+0.4,-0.00000647,0.00664673,0.01294727,0.01853694,0.02342833,0.02766724,0.03135658,0.0346236,0.03762847,0.04046865,0.04320808,0.0458611,0.04842299,0.05087912,0.05320893,0.05538617,0.05738196,0.05915243,0.06079397
+0.5,-0.00000753,0.0093127,0.01763368,0.02493902,0.03105909,0.03608541,0.04029972,0.04410349,0.04768399,0.05113054,0.05449101,0.05777605,0.06097232,0.0640623,0.06701241,0.06978611,0.07235239,0.07473295,0.0768376
+0.6,-0.00000589,0.01285906,0.02432863,0.03345808,0.04053062,0.04591404,0.05036601,0.05437551,0.05823045,0.06212425,0.06603374,0.06993371,0.07378217,0.07753199,0.0811289,0.08452695,0.08768658,0.09055379,0.09345266
+0.7,-0.00001818,0.01897127,0.03418009,0.04560011,0.05281641,0.05740905,0.06123209,0.06509765,0.06921145,0.07346395,0.07789282,0.08238071,0.0868928,0.09132841,0.09560674,0.0996668,0.10344551,0.10688772,0.1094982
+0.8,0.00017943,0.02721068,0.05488351,0.06640383,0.06919675,0.07087947,0.07329664,0.07650002,0.08044778,0.08499199,0.0898992,0.09508866,0.10031511,0.1054739,0.11049698,0.11526844,0.1197168,0.12378965,0.12742038
+0.9,0.01131628,0.09964188,0.10956434,0.09523256,0.08783426,0.08543011,0.08570056,0.08801099,0.09185151,0.09665147,0.10215635,0.1080128,0.11402253,0.12001919,0.12585215,0.13140119,0.13657321,0.14130417,0.14599683
+1,0.0123671,0.30322555,0.21825395,0.13134489,0.11117667,0.10138317,0.09856821,0.09950552,0.10304793,0.1082858,0.11448423,0.12115218,0.12806483,0.13499432,0.14172577,0.14814184,0.15410985,0.15952363,0.16392705
+1.1,-0.0130006,0.81867829,0.31323294,0.17470945,0.14281412,0.1172797,0.11038319,0.11012807,0.11366068,0.11965809,0.12674095,0.13453239,0.1424621,0.15041161,0.15816834,0.16556992,0.17246392,0.17863443,0.18396849
+1.2,-0.0229895,0.93538797,0.46957454,0.23912773,0.16118861,0.12885932,0.11926629,0.11930251,0.12397495,0.13088178,0.13917771,0.14794117,0.15714058,0.1663046,0.17522892,0.18375358,0.19173635,0.19902265,0.20514923
+1.3,-0.01855092,0.48878047,0.39570774,0.21783572,0.14628804,0.12719277,0.1244525,0.12673939,0.13266682,0.14132752,0.1509941,0.16155572,0.17221989,0.18271251,0.19296685,0.20274364,0.21194262,0.22056561,0.22852649
+1.4,0.0001534,0.61056539,0.22481189,0.15686994,0.12208722,0.12103158,0.12341572,0.1312666,0.14044614,0.15121053,0.16330192,0.17541998,0.18760352,0.19975484,0.211436,0.22260322,0.23308339,0.24285057,0.25312152
+1.5,0.00007495,0.22857647,0.11926743,0.12824678,0.10299139,0.1138839,0.12406379,0.13519351,0.14790416,0.16150443,0.17522457,0.1894441,0.20354108,0.21735608,0.23071957,0.24344031,0.25529341,0.26606367,0.27585775
+1.6,-0.00010149,-0.02566563,0.13180144,0.09216303,0.09393796,0.10978737,0.12344628,0.13875879,0.15454946,0.17083052,0.18742221,0.20381937,0.2201136,0.23576992,0.25099247,0.26534345,0.27884519,0.2909712,0.30117348
+1.7,-0.00023463,0.03542866,0.00826892,0.0293468,0.07075312,0.10064326,0.12197606,0.14230222,0.16183629,0.18109952,0.20002048,0.21870015,0.23677882,0.25481145,0.27194845,0.28851309,0.3038795,0.3181035,0.33064435
+1.8,0.00266113,-0.1083805,-0.04846637,-0.00185282,0.05428142,0.09184384,0.12142219,0.14631224,0.16958781,0.1915702,0.21306046,0.23400751,0.25476344,0.27460806,0.29417531,0.31269297,0.33038118,0.34699276,0.36319102
+1.9,0.00866707,-0.75826116,-0.16385417,-0.02638878,0.03737719,0.08554504,0.12285399,0.15138835,0.17764276,0.20246647,0.22648528,0.24987969,0.27268593,0.29528103,0.31704459,0.33821854,0.35836124,0.37715912,0.39453256
+2,-0.01028629,-0.84166325,-0.27516465,-0.04932607,0.03169354,0.09161905,0.12744717,0.15835233,0.18706874,0.21441486,0.24039237,0.26605301,0.29141355,0.31634381,0.34090269,0.36472764,0.38763394,0.40901008,0.42806931
+2.1,-0.02345212,-0.71040417,-0.12480799,-0.01011505,0.04757865,0.10347055,0.13577915,0.16723645,0.19733806,0.22620832,0.25454209,0.28241604,0.31023706,0.33793591,0.36537642,0.39210751,0.41815286,0.44323329,0.46554539
+2.2,0.04080456,0.04226858,-0.00078258,0.01048593,0.05762617,0.11188833,0.14459982,0.17659737,0.20787331,0.23848516,0.26902316,0.29876896,0.32841727,0.36007475,0.39038007,0.42062969,0.44952508,0.47982482,0.51122804
+2.3,-0.00060695,0.00780579,0.03477412,0.03449414,0.04893474,0.10802297,0.14912835,0.18036347,0.21372361,0.24592588,0.27777672,0.31122163,0.34693402,0.37919576,0.41359103,0.44954674,0.48620949,0.516638,0.55516713
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/Bz.csv b/Detector/DetCRD/compact/CRD_o1_v01/Bz.csv
new file mode 100644
index 0000000000000000000000000000000000000000..3bcbdca0c9c212075ef7617e929717a4fdb854ae
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v01/Bz.csv
@@ -0,0 +1,25 @@
+,0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8
+0,2.98254375,2.98318937,2.98547167,2.98899442,2.99374132,2.99961886,3.00652732,3.01437409,3.02307982,3.03257973,3.0428217,3.05376278,3.06536515,3.07759241,3.09040663,3.10376663,3.11764635,3.1322132,3.14750674
+0.1,2.98109899,2.98175883,2.9840892,2.98767855,2.99250257,2.99845884,3.00544098,3.01335272,3.02211376,3.0316603,3.04194227,3.05291904,3.06455505,3.07681584,3.08966473,3.10306094,3.11695014,3.13125837,3.14695687
+0.2,2.97669588,2.97740238,2.97988968,2.98369431,2.98876474,2.99496905,3.00217997,3.01029042,3.0192184,3.02890417,3.03930467,3.05038681,3.06212207,3.07448198,3.08743474,3.10094015,3.11494236,3.12912079,3.14515215
+0.3,2.96910905,2.96990752,2.97270436,2.97692716,2.98246308,2.98912314,2.99674135,3.00519553,3.01440385,3.02431862,3.03491123,3.0461631,3.05805801,3.07057825,3.08370024,3.09739453,3.11161525,3.12652478,3.14114769
+0.4,2.95790006,2.95886479,2.96221313,2.96717546,2.97349577,2.98087865,2.98913349,2.99809283,3.00769228,3.01791665,3.02876844,3.04024247,3.05234864,3.06508339,3.07843296,3.09237751,3.1069152,3.12198926,3.1366115
+0.5,2.94243158,2.94347691,2.94786359,2.95411488,2.96176669,2.97015463,2.97940277,2.98902944,2.99913374,3.00971108,3.02088486,3.03261413,3.04497303,3.05796775,3.07159454,3.08583906,3.10067846,3.1161207,3.13094287
+0.6,2.92094761,2.92246038,2.92872698,2.9372441,2.94699778,2.95714022,2.96764351,2.97814264,2.98880074,2.99976326,3.01127211,3.02326221,3.0359063,3.04919134,3.06313922,3.07773566,3.09292699,3.10868421,3.1244398
+0.7,2.89064164,2.89309777,2.9030216,2.91587173,2.92916445,2.94201055,2.95415218,2.96563002,2.9767351,2.98808544,2.9999004,3.01215538,3.02512561,3.03869621,3.05301365,3.06801461,3.083694,3.09974359,3.11559875
+0.8,2.84359314,2.84976659,2.86839028,2.88886517,2.90865565,2.92572711,2.93949461,2.95160087,2.96318284,2.97471894,2.98673052,2.99929833,3.0125135,3.02643358,3.04114725,3.05661202,3.0727791,3.09005281,3.10558271
+0.9,2.79377195,2.79484734,2.81169347,2.8555578,2.88918856,2.90960141,2.9241453,2.93657548,2.94802672,2.95977126,2.97171818,2.98454606,2.99799764,3.01233191,3.02743736,3.04343022,3.06021239,3.07737665,3.09574487
+1,2.0535586,2.54472074,2.74173407,2.84947422,2.876516,2.89449246,2.90861048,2.92050954,2.9315521,2.94296308,2.95492102,2.96770859,2.98154662,2.99619258,3.01179073,3.02837584,3.04580913,3.06404436,3.08274544
+1.1,-0.03347429,2.28387737,2.78580819,2.85570683,2.87165377,2.8817725,2.89303944,2.90344406,2.91357043,2.92442137,2.93585694,2.94880619,2.96290759,2.97791834,2.99404928,3.01129936,3.029572,3.04881589,3.06767787
+1.2,-2.83937519,2.87734798,3.02485748,2.86942174,2.86874145,2.87052332,2.87716174,2.88513562,2.89372698,2.90345868,2.91473407,2.9275138,2.94197698,2.95729219,2.97404537,2.99201004,3.01119216,3.03151131,3.05153552
+1.3,-3.69765888,2.58057627,3.02821863,2.88738109,2.86932003,2.86205042,2.86000272,2.86499069,2.87163865,2.87983486,2.89089361,2.90376024,2.91837852,2.93421113,2.95157652,2.97029736,2.99034153,3.01198579,3.03418575
+1.4,-3.79899166,-0.47892673,3.13566838,2.91113876,2.88664502,2.84969876,2.84019214,2.83916989,2.84528126,2.85343453,2.86393496,2.87724142,2.89200306,2.90843409,2.92645823,2.94600774,2.966883,2.98897154,3.01568605
+1.5,-3.81052656,-0.60812881,2.98139683,2.91195237,2.87195812,2.82828197,2.8136639,2.81063727,2.81562642,2.82350832,2.83437979,2.84756355,2.86266308,2.87963631,2.89854369,2.91897372,2.94096453,2.96348955,2.99259771
+1.6,-3.96050739,-0.7731603,3.12235101,2.8808503,2.84101603,2.80294502,2.78022688,2.77826142,2.78243026,2.79018237,2.80103121,2.81463616,2.83007497,2.84771231,2.86750718,2.88898777,2.91235399,2.93780291,2.96061481
+1.7,-4.02599445,-0.93592331,2.89647078,2.82089094,2.76282035,2.75353776,2.74261542,2.74084514,2.74476447,2.75288815,2.76418066,2.77796882,2.79422958,2.81248555,2.83298022,2.8557321,2.88049262,2.90786297,2.93134384
+1.8,-3.87968428,-0.83325284,2.86203808,2.75420373,2.70226483,2.70221165,2.69862684,2.6982541,2.70294435,2.71170193,2.72341528,2.73781958,2.75460121,2.77361869,2.79494731,2.8186598,2.84476997,2.87308853,2.9021298
+1.9,-3.14971335,-0.35968446,2.82790469,2.67604145,2.64888583,2.6528447,2.64851541,2.6516181,2.65730121,2.66681706,2.67899248,2.69393163,2.71110006,2.73084567,2.75300787,2.7776393,2.80500933,2.83419274,2.86793361
+2,-2.3023104,-0.22353596,2.61967494,2.5937405,2.59182482,2.59859145,2.59510427,2.60018043,2.60797762,2.61842573,2.63083054,2.64615837,2.66375681,2.68386971,2.70678236,2.73242961,2.76091048,2.79267313,2.82456839
+2.1,0.32933266,0.44186465,2.46969787,2.50079108,2.52435322,2.54190753,2.53942484,2.54601671,2.55516344,2.56649507,2.57916145,2.59453011,2.61225552,2.63264638,2.65596904,2.68241859,2.71217202,2.74579311,2.77807088
+2.2,0.19143149,0.203763,2.4800973,2.4492233,2.46665427,2.48551649,2.4810036,2.48932808,2.49926241,2.51088011,2.52425068,2.53911646,2.55651669,2.5767344,2.60032566,2.62728555,2.65755481,2.69306386,2.73026936
+2.3,0.02797829,0.28282052,2.44391037,2.41509089,2.41246836,2.41538895,2.42029371,2.42996001,2.44075216,2.45197615,2.46501328,2.48036927,2.49567035,2.51567342,2.53957983,2.56657511,2.59683019,2.6306168,2.67158842
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml
index 5c0950c2a4d448764e77c7635e42ce7679631a9e..9a79f6fb8bd2883dfb4dc599a1ca1d4f49bf901e 100644
--- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml
@@ -69,7 +69,7 @@
     <constant name="BeamPipe_Crotch_zmax"          value="855*mm"/>
     <constant name="BeamPipe_FirstSeparated_zmax"  value="1110*mm"/>
     <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/>
-    <constant name="BeamPipe_end_z"                value="12*m"/>
+    <constant name="BeamPipe_end_z"                value="7050*mm"/>
 
     <constant name="BeamPipe_Central_inner_radius"  value="14*mm"/>
     <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/>
@@ -82,6 +82,7 @@
     <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/>
     <constant name="Vertex_outer_radius" value="101*mm"/>
     <constant name="Vertex_half_length"  value="200*mm"/>
+    <constant name="Vertex_Side_rmin"    value="BeamPipe_VertexRegion_rmax"/>
 
     <!-- Parameters of single drift chamber  -->
     <constant name="DC_rbegin" value="800*mm"/>
@@ -147,7 +148,7 @@
     <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code-->
     <constant name="Ecal_barrel_thickness"    value="280*mm"/>
     <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/>
-    <constant name="Ecal_barrel_half_length"  value="3350*mm"/>
+    <constant name="Ecal_barrel_half_length"  value="3300*mm"/>
     <constant name="Ecal_barrel_symmetry"    value="8"/>
 
     <constant name="Ecal_endcap_inner_radius" value="350*mm"/>
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker-non.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker-non.xml
new file mode 100644
index 0000000000000000000000000000000000000000..11c283c6aca6b24a23d5c360a150b39d511c806f
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker-non.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  <info name="CRD_o1_v01"
+        title="CepC reference detctor with coil inside Hcal, pixel SIT/SET"
+        author="C.D.Fu, "
+        url="http://cepc.ihep.ac.cn"
+        status="developing"
+        version="v01">
+    <comment>CepC reference detector simulation models used for detector study </comment>
+  </info>
+  
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
+  </includes>
+  
+  <define>
+    <constant name="world_size" value="25*m"/>
+    <constant name="world_x" value="world_size"/>
+    <constant name="world_y" value="world_size"/>
+    <constant name="world_z" value="world_size"/>
+
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
+  </define>
+
+  <include ref="./CRD_Dimensions_v01_01.xml"/>
+
+  <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/>
+  <include ref="../CRD_common_v01/VXD_v01_01.xml"/>
+  <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/>
+  <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
+  <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
+  
+  <fields>
+    <field name="Non-uniformFieldMap" type="GenericBFieldMapBrBz" lunit="m" bunit="tesla"
+           provider="file">
+      <!--source url="Br=/tmp/lint/CEPCSW/Br.csv;Bz=/tmp/lint/CEPCSW/fieldmap.csv"/-->
+      <!--must include absolute path or relative to path to run job-->
+      <source url="Br=Detector/DetCRD/compact/CRD_o1_v01/Br1.csv;Bz=Detector/DetCRD/compact/CRD_o1_v01/Bz.csv"/>
+    </field>
+  </fields>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml
index b4d34f857cad6ceb7b5de918c031c15f10a80de0..3ac63dc4b86b225ce8fbfe75d19e05f64eda90e3 100644
--- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml
@@ -13,7 +13,6 @@
   
   <includes>
     <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
-    <!--gdmlFile  ref="../CRD_common_v01/materials-woIsotope.xml"/-->
     <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
   </includes>
   
diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
index 5c0950c2a4d448764e77c7635e42ce7679631a9e..9a79f6fb8bd2883dfb4dc599a1ca1d4f49bf901e 100644
--- a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
@@ -69,7 +69,7 @@
     <constant name="BeamPipe_Crotch_zmax"          value="855*mm"/>
     <constant name="BeamPipe_FirstSeparated_zmax"  value="1110*mm"/>
     <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/>
-    <constant name="BeamPipe_end_z"                value="12*m"/>
+    <constant name="BeamPipe_end_z"                value="7050*mm"/>
 
     <constant name="BeamPipe_Central_inner_radius"  value="14*mm"/>
     <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/>
@@ -82,6 +82,7 @@
     <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/>
     <constant name="Vertex_outer_radius" value="101*mm"/>
     <constant name="Vertex_half_length"  value="200*mm"/>
+    <constant name="Vertex_Side_rmin"    value="BeamPipe_VertexRegion_rmax"/>
 
     <!-- Parameters of single drift chamber  -->
     <constant name="DC_rbegin" value="800*mm"/>
@@ -147,7 +148,7 @@
     <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code-->
     <constant name="Ecal_barrel_thickness"    value="280*mm"/>
     <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/>
-    <constant name="Ecal_barrel_half_length"  value="3350*mm"/>
+    <constant name="Ecal_barrel_half_length"  value="3300*mm"/>
     <constant name="Ecal_barrel_symmetry"    value="8"/>
 
     <constant name="Ecal_endcap_inner_radius" value="350*mm"/>
diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a2a65e6c52df05a938069bccfc9dd9038d590747
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  <info name="CRD_o1_v02"
+        title="CepC reference detctor with coil inside Hcal, pixel SIT and strip SET"
+        author="C.D.Fu, "
+        url="http://cepc.ihep.ac.cn"
+        status="developing"
+        version="v02">
+    <comment>CepC reference detector simulation models used for detector study </comment>
+  </info>
+  
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
+  </includes>
+  
+  <define>
+    <constant name="world_size" value="25*m"/>
+    <constant name="world_x" value="world_size"/>
+    <constant name="world_y" value="world_size"/>
+    <constant name="world_z" value="world_size"/>
+
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
+  </define>
+
+  <include ref="./CRD_Dimensions_v01_02.xml"/>
+
+  <!--include ref="../CRD_common_v01/Beampipe_v01_01.xml"/>
+  <include ref="../CRD_common_v01/VXD_v01_01.xml"/>
+  <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/>
+  <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
+  <include ref="../CRD_common_v01/SET_SimplePlanar_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/-->
+  <!--include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/-->
+  <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/-->
+
+  <fields>
+    <field name="InnerSolenoid" type="solenoid"
+           inner_field="Field_nominal_value"
+           outer_field="0"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="SolenoidCoil_center_radius"
+           outer_radius="Solenoid_outer_radius">
+    </field>
+    <field name="OuterSolenoid" type="solenoid"
+           inner_field="0"
+           outer_field="Field_outer_nominal_value"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="Solenoid_outer_radius"
+           outer_radius="Yoke_barrel_inner_radius">
+    </field>
+  </fields>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_Dimensions_v01_03.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_Dimensions_v01_03.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ed08613cb930c93d9a67bdd0365dbe7fb3a1b57e
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_Dimensions_v01_03.xml
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+
+  <info name="CRDDimensions"
+       title="master file with includes and world dimension"
+       author="C.D.Fu, Mengyao Liu"
+       url="no"
+       status="development"
+       version="1.0">
+    <comment>
+      undeterminded parameters
+    </comment>
+  </info>
+
+  <define>
+    <constant name="CrossingAngle" value="0.033*rad"/>  
+
+    <constant name="Global_endcap_costheta" value="0.99"/>
+
+    <constant name="GlobalTrackerReadoutID_DCH" type="string" value="system:8,chamber:1,layer:7,phi:16"/>
+    <constant name="GlobalTrackerReadoutID" type="string" value="system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2"/>
+
+    <constant name="Field_nominal_value" value="3*tesla"/>
+    <constant name="Field_outer_nominal_value" value="-1.3*tesla"/>
+
+    <constant name="env_safety" value="0.1*mm"/>
+
+    <constant name="DetID_NOTUSED"      value="  0"/>
+    <constant name="DetID_VXD"          value="  1"/>
+    <constant name="DetID_SIT"          value="  2"/>
+    <constant name="DetID_FTD"          value="  3"/>
+    <constant name="DetID_TPC"          value="  4"/>
+    <constant name="DetID_SET"          value="  5"/>
+    <constant name="DetID_ETD"          value="  6"/>
+    <constant name="DetID_DC"           value="  4"/> <!--in order to cheat Clupatra, same as TPC--> 
+    
+    <constant name="DetID_ECAL"         value=" 20"/>
+    <constant name="DetID_ECAL_PLUG"    value=" 21"/>
+    <constant name="DetID_HCAL"         value=" 22"/>
+    <constant name="DetID_HCAL_RING"    value=" 23"/>
+    <constant name="DetID_LCAL"         value=" 24"/>
+    <constant name="DetID_BCAL"         value=" 25"/>
+    <constant name="DetID_LHCAL"        value=" 26"/>
+    <constant name="DetID_YOKE"         value=" 27"/>
+    <constant name="DetID_COIL"         value=" 28"/>
+    <constant name="DetID_ECAL_ENDCAP"  value=" 29"/>
+    <constant name="DetID_HCAL_ENDCAP"  value=" 30"/>
+    <constant name="DetID_YOKE_ENDCAP"  value=" 31"/>
+    
+    <constant name="DetID_bwd"       value="-1"/>
+    <constant name="DetID_barrel"    value=" 0"/>
+    <constant name="DetID_fwd"       value="+1"/>
+    
+    <constant name="BeamPipe_Be_inner_thickness"   value="0.5*mm"/>
+    <constant name="BeamPipe_Cooling_thickness"    value="0.5*mm"/>
+    <constant name="BeamPipe_Be_outer_thickness"   value="0.3*mm"/>
+    <constant name="BeamPipe_Be_total_thickness"   value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/>
+    <constant name="BeamPipe_Al_thickness"         value="BeamPipe_Be_total_thickness"/>
+    <constant name="BeamPipe_Cu_thickness"         value="2.0*mm"/>
+    
+    <constant name="BeamPipe_CentralBe_zmax"       value="120*mm"/>
+    <constant name="BeamPipe_CentralAl_zmax"       value="205*mm"/>
+    <constant name="BeamPipe_ConeAl_zmax"          value="655*mm"/>
+    <constant name="BeamPipe_LinkerAl_zmax"        value="700*mm"/>
+    <constant name="BeamPipe_LinkerCu_zmax"        value="780*mm"/>
+    <constant name="BeamPipe_Waist_zmax"           value="805*mm"/>
+    <constant name="BeamPipe_Crotch_zmax"          value="855*mm"/>
+    <constant name="BeamPipe_FirstSeparated_zmax"  value="1110*mm"/>
+    <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/>
+    <constant name="BeamPipe_end_z"                value="7050*mm"/>
+
+    <constant name="BeamPipe_Central_inner_radius"  value="14*mm"/>
+    <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/>
+    <constant name="BeamPipe_Upstream_inner_radius" value="6*mm"/>
+    <constant name="BeamPipe_Dnstream_inner_radius" value="10*mm"/>
+    <constant name="BeamPipe_Crotch_hole_height"    value="30.67*mm"/>
+    <constant name="BeamPipe_VertexRegion_rmax"     value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/>
+    <constant name="BeamPipe_ForwardRegion_rmax"    value="BeamPipe_Expanded_inner_radius+BeamPipe_Cu_thickness"/>
+
+    <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/>
+    <constant name="Vertex_outer_radius" value="101*mm"/>
+    <constant name="Vertex_half_length"  value="205*mm"/>
+    <constant name="Vertex_Side_rmin"    value="BeamPipe_VertexRegion_rmax"/>
+
+    <constant name="DC_Endcap_dz" value="0.1*mm"/>
+    <constant name="DC_half_length"  value="2980*mm" />
+    <constant name="DC_safe_distance" value="0.02*mm"/>
+    <constant name="SDT_inner_wall_thickness" value="0.2*mm"/>
+    <constant name="SDT_outer_wall_thickness" value="2.8*mm"/>
+    <constant name="MainTracker_half_length"  value="DC_half_length+DC_Endcap_dz" />
+
+    <!--obselete for single drift chamber-->
+    <constant name="InnerTracker_half_length"  value="DC_half_length" />
+    <constant name="InnerTracker_inner_radius" value="234*mm"/>
+    <constant name="InnerTracker_outer_radius" value="909*mm"/>
+    <constant name="OuterTracker_half_length"  value="DC_half_length"/>
+    <constant name="OuterTracker_inner_radius" value="1082.18*mm"/>
+    <constant name="OuterTracker_outer_radius" value="1723*mm"/>
+
+    <!-- Parameters of single drift chamber  -->
+    <constant name="DC_chamber_layer_rbegin" value="800*mm"/>
+    <constant name="DC_chamber_layer_rend" value="1800*mm"/>
+
+    <constant name="DC_inner_radius" value="DC_chamber_layer_rbegin-SDT_inner_wall_thickness-DC_safe_distance"/>
+    <constant name="DC_outer_radius" value="DC_chamber_layer_rend+SDT_outer_wall_thickness+DC_safe_distance"/>
+
+    <constant name="SIT1_inner_radius"   value="230*mm"/>
+    <constant name="SIT2_inner_radius"   value="410*mm"/>
+    <constant name="SIT3_inner_radius"   value="590*mm"/>
+    <constant name="SIT4_inner_radius"   value="770*mm"/>
+    <constant name="SIT1_half_length"    value="461*mm"/>
+    <constant name="SIT2_half_length"    value="691*mm"/>
+    <constant name="SIT3_half_length"    value="1013*mm"/>
+    <constant name="SIT4_half_length"    value="1335*mm"/>
+
+    <constant name="SET_inner_radius"    value="1815*mm"/>
+
+    <constant name="SiTracker_barrel_endcap_gap" value="5*mm"/>
+    <constant name="SiTracker_DC_endcap_gap"     value="10*mm"/>
+    <constant name="SiTracker_endcap_z1" value="SIT1_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z2" value="SIT2_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z3" value="SIT3_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z4" value="SIT4_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z5" value="MainTracker_half_length+SiTracker_DC_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius1" value="SIT1_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius2" value="SIT2_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius3" value="SIT3_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius4" value="SIT4_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius5" value="SET_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <!--obseleted -->
+    <constant name="FTD_BeamPipe_cable_clearance"     value="10*mm"/> 
+    <constant name="FTD_BeamPipe_gap"     value="15*mm"/>
+    <constant name="FTD_InnerTracker_gap" value="5*mm"/>
+
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> 
+    <constant name="TPC_Ecal_Hcal_barrel_halfZ"   value="MainTracker_half_length"/>
+    <constant name="TPC_inner_radius"             value="InnerTracker_inner_radius"/>
+    <constant name="TPC_outer_radius"             value="OuterTracker_outer_radius"/>
+    <constant name="SIT1_Radius"                  value="SIT1_inner_radius"/>
+    <constant name="SIT1_Half_Length_Z"           value="SIT1_half_length"/>
+    <constant name="SIT2_Radius"                  value="InnerTracker_inner_radius"/> <!--fake, used by FTD_Simple_Staggered and FTD_cepc, now should be determined by inner tracker-->
+    <constant name="SIT2_Half_Length_Z"           value="SIT2_half_length"/>
+    <constant name="TUBE_IPOuterTube_end_z"       value="BeamPipe_CentralAl_zmax"/>
+    <constant name="TUBE_IPOuterTube_end_radius"  value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/>
+    <constant name="TUBE_IPOuterBulge_end_z"      value="BeamPipe_Crotch_zmax"/><!--"BeamPipe_ConeAl_zmax"/-->
+    <constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/>
+    <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/-->
+
+    <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code-->
+    <constant name="Ecal_barrel_thickness"    value="280*mm"/>
+    <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/>
+    <constant name="Ecal_barrel_half_length"  value="3300*mm"/>
+    <constant name="Ecal_barrel_symmetry"    value="8"/>
+
+    <constant name="Ecal_endcap_inner_radius" value="350*mm"/>
+    <constant name="Ecal_endcap_outer_radius" value="Ecal_barrel_inner_radius+Ecal_barrel_thickness"/>
+    <constant name="Ecal_endcap_zmin"        value="3050*mm"/>
+    <constant name="Ecal_endcap_zmax"        value="3350*mm"/>
+    <constant name="Ecal_endcap_symmetry"    value="8"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/>
+    
+    <constant name="Solenoid_inner_radius" value="2330*mm"/>
+    <constant name="Solenoid_outer_radius" value="2480*mm"/>
+    <constant name="Solenoid_half_length" value="3830*mm"/>
+    <constant name="SolenoidCoil_half_length" value="3800*mm"/>
+    <constant name="SolenoidCoil_radius" value="2351*mm"/>
+    <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/>
+
+    <constant name="Hcal_barrel_inner_radius" value="2530*mm"/>
+    <constant name="Hcal_barrel_outer_radius" value="3610*mm"/>
+    <constant name="Hcal_barrel_half_length"  value="4480*mm"/>
+    <constant name="Hcal_barrel_symmetry"    value="12"/>
+    
+    <constant name="Hcal_endcap_inner_radius" value="400*mm"/>
+    <constant name="Hcal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/>
+    <constant name="Hcal_endcap_zmin" value="3400*mm"/>
+    <constant name="Hcal_endcap_zmax" value="4480*mm"/>
+    <constant name="Hcal_endcap_symmetry" value="12"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/>
+    <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/>
+    <constant name="Hcal_outer_radius" value="Hcal_endcap_outer_radius"/>
+
+    <!--constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/>
+    <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/>
+    <constant name="Hcal_ring_zmin" value="2600*mm"/>
+    <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/>
+    <constant name="Hcal_ring_symmetry" value="8"/-->
+        
+    <constant name="Yoke_barrel_inner_radius" value="3660*mm"/>
+    <constant name="Yoke_barrel_outer_radius" value="4260*mm"/>
+    <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/>
+    <constant name="Yoke_barrel_symmetry" value="12"/>
+    
+    <constant name="Yoke_endcap_inner_radius" value="400*mm"/>
+    <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/>
+    <constant name="Yoke_endcap_zmin" value="4660*mm"/>
+    <constant name="Yoke_endcap_zmax" value="5460*mm"/>
+    <constant name="Yoke_endcap_outer_symmetry" value="Yoke_barrel_symmetry"/>
+    <constant name="Yoke_endcap_inner_symmetry" value="0"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/>
+    
+    <!--constant name="LumiCal_zmax" value="805*mm" />
+    <constant name="LumiCal_zmin" value="700*mm"/>
+    <constant name="LumiCal_thickness" value="(LumiCal_zmax-LumiCal_zmin)/2.0"/>
+    <constant name="LumiCal_inner_radius" value="35.0*mm"/>
+    <constant name="LumiCal_outer_radius" value="100.0*mm- env_safety"/-->
+        
+    <constant name="tracker_region_zmax" value="OuterTracker_half_length"/>
+    <constant name="tracker_region_rmax" value="OuterTracker_outer_radius"/>
+
+  </define>
+  
+  <limits>
+    <limitset name="cal_limits">
+      <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+    </limitset>
+    <limitset name="dc_limits">
+      <limit name="step_length_max" particles="*" value="10.0" unit="mm" />
+    </limitset>
+    <limitset name="tracker_limits">
+      <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+    </limitset>
+  </limits>
+
+  <regions>
+    <region name="BeampipeRegion"/>
+    <region name="VertexRegion"/>
+    <region name="ForwardRegion"/>
+  </regions>
+
+  <display>
+    <vis name="VXDVis"           alpha="0.1" r="0.1"   g=".5"      b=".5"    showDaughters="true"  visible="true"/>
+    <vis name="VXDLayerVis"      alpha="1.0" r="0.1"   g=".5"      b=".5"    showDaughters="true"  visible="true"/>
+    <vis name="VXDSupportVis"    alpha="1.0" r="0.0"   g="1.0"     b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="FTDVis"           alpha="1.0" r="0.5"   g="0.87"    b="0.11"  showDaughters="true"  visible="true"/>
+    <vis name="FTDSupportVis"    alpha="1.0" r="0.3"   g="0.3"     b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="FTDSensitiveVis"  alpha="1.0" r="0.3"   g="0.5"     b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="DCVis"            alpha="1.0" r="0.96"  g="0.64"    b="0.90"  showDaughters="true"  visible="true"/>
+    <vis name="DCLayerVis"       alpha="1.0" r="0.96"  g="0.64"    b="0.90"  showDaughters="false" visible="true"/>
+    <vis name="SITVis"           alpha="0.0" r="0.54"  g="0.59"    b="0.93"  showDaughters="true"  visible="false"/>
+    <vis name="SITSupportVis"    alpha="1.0" r="0.0"   g="0.0"     b="1.0"   showDaughters="false" visible="true"/>
+    <vis name="SITSensitiveVis"  alpha="1.0" r="0.67"  g="0.99"    b="0.78"  showDaughters="false" visible="true"/>
+    <vis name="SETVis"           alpha="0.0" r="0.8"   g="0.8"     b="0.4"   showDaughters="true"  visible="false"/>
+    <vis name="SETSupportVis"    alpha="1.0" r="1.0"   g="0.0"     b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="SETSensitiveVis"  alpha="1.0" r="0.0"   g="0.0"     b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="ECALVis"          alpha="1.0" r="0.2"   g="0.6"     b="0"     showDaughters="true"  visible="true"/>
+    <vis name="HCALVis"          alpha="1.0" r="0.95"  g="0.78"    b="0.69"  showDaughters="true"  visible="true"/>
+    <vis name="SOLVis"           alpha="1.0" r="0.4"   g="0.4"     b="0.4"   showDaughters="true"  visible="true"/>
+    <vis name="YOKEVis"          alpha="1.0" r="0.64"  g="0.75"    b="0.99"  showDaughters="false" visible="true"/>
+    <vis name="LCALVis"          alpha="1.0" r="0.25"  g="0.88"    b="0.81"  showDaughters="true"  visible="true"/>
+    <vis name="SupportVis"       alpha="1.0" r="0.2"   g="0.2"     b="0.2"   showDaughters="true"  visible="true"/>
+    <vis name="ShellVis"         alpha="1.0" r="0.83"  g="0.55"    b="0.89"  showDaughters="false" visible="true"/>
+
+    <vis name="WhiteVis"         alpha="0.0" r=".96" g=".96"  b=".96"   showDaughters="true"  visible="true"/>
+    <vis name="LightGrayVis"     alpha="0.0" r=".75" g=".75"  b=".75"   showDaughters="true"  visible="true"/>
+    <vis name="Invisible"        alpha="0.0" r="0.0" g="0.0"  b="0.0"   showDaughters="false"  visible="false"/>
+    <vis name="SeeThrough"       alpha="0.0" r="0.0" g="0.0"  b="0.0"   showDaughters="true"  visible="false"/>
+    <vis name="RedVis"           alpha="1.0" r="1.0" g="0.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="GreenVis"         alpha="1.0" r="0.0" g="1.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="BlueVis"          alpha="1.0" r="0.0" g="0.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="CyanVis"          alpha="1.0" r="0.0" g="1.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="MagentaVis"       alpha="1.0" r="1.0" g="0.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="YellowVis"        alpha="1.0" r="1.0" g="1.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="BlackVis"         alpha="1.0" r="0.0" g="0.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="GrayVis"          alpha="1.0" r="0.5" g="0.5"  b="0.5"   showDaughters="true"  visible="true"/>
+  </display>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyTracker.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cc30d11b38cb9b01e91cee5245c89220b80a0f7f
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyTracker.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  <info name="CRD_o1_v03"
+        title="CepC reference detctor with coil inside Hcal, pixel SIT/SET"
+        author="C.D.Fu, "
+        url="http://cepc.ihep.ac.cn"
+        status="developing"
+        version="v03">
+    <comment>CepC reference detector simulation models used for detector study </comment>
+  </info>
+  
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
+    <gdmlFile  ref="../materials.xml"/>
+  </includes>
+  
+  <define>
+    <constant name="world_size" value="25*m"/>
+    <constant name="world_x" value="world_size"/>
+    <constant name="world_y" value="world_size"/>
+    <constant name="world_z" value="world_size"/>
+
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
+  </define>
+
+  <include ref="./CRD_Dimensions_v01_03.xml"/>
+
+  <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/>
+  <include ref="../CRD_common_v01/VXD_StaggeredLadder_v01_01.xml"/>
+  <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/>
+  <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
+  <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
+  
+  <fields>
+    <field name="InnerSolenoid" type="solenoid"
+           inner_field="Field_nominal_value"
+           outer_field="0"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="SolenoidCoil_center_radius"
+           outer_radius="Solenoid_outer_radius">
+    </field>
+    <field name="OuterSolenoid" type="solenoid"
+           inner_field="0"
+           outer_field="Field_outer_nominal_value"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="Solenoid_outer_radius"
+           outer_radius="Yoke_barrel_inner_radius">
+    </field>
+  </fields>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml
index 44eb691c033035b07cf8d0a435fe8defdeac4014..5ccc266975b9a577a4d902f89a022081c6225e8d 100644
--- a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03-onlyVXD.xml
@@ -2,12 +2,12 @@
 <lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
-  <info name="CRD_o1_v02"
+  <info name="CRD_o1_v03"
         title="CepC reference detctor with coil inside Hcal, pixel SIT and strip SET"
         author="Hao Zeng"
         url="http://cepc.ihep.ac.cn"
         status="developing"
-        version="v01">
+        version="v03">
     <comment>CepC reference detector simulation models used for detector study </comment>
   </info>
   
@@ -26,7 +26,7 @@
     <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
   </define>
 
-  <include ref="../CRD_o1_v02/CRD_Dimensions_v01_02.xml"/>
+  <include ref="./CRD_Dimensions_v01_03.xml"/>
 
   <include ref="../CRD_common_v01/VXD_StaggeredLadder_v01_01.xml"/>
 
diff --git a/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03.xml b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03.xml
new file mode 100644
index 0000000000000000000000000000000000000000..79eea6dcf5d048ace369f3bd3c300d5b8ce04340
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v03/CRD_o1_v03.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  <info name="CRD_o1_v03"
+        title="CepC reference detctor with coil inside Hcal, pixel SIT/SET"
+        author="C.D.Fu, "
+        url="http://cepc.ihep.ac.cn"
+        status="developing"
+        version="v03">
+    <comment>CepC reference detector simulation models used for detector study </comment>
+  </info>
+  
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
+  </includes>
+  
+  <define>
+    <constant name="world_size" value="25*m"/>
+    <constant name="world_x" value="world_size"/>
+    <constant name="world_y" value="world_size"/>
+    <constant name="world_z" value="world_size"/>
+
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
+  </define>
+
+  <include ref="./CRD_Dimensions_v01_03.xml"/>
+
+  <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/>
+  <include ref="../CRD_common_v01/VXD_StaggeredLadder_v01_01.xml"/>
+  <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/>
+  <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
+  <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/-->
+  
+  <fields>
+    <field name="InnerSolenoid" type="solenoid"
+           inner_field="Field_nominal_value"
+           outer_field="0"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="SolenoidCoil_center_radius"
+           outer_radius="Solenoid_outer_radius">
+    </field>
+    <field name="OuterSolenoid" type="solenoid"
+           inner_field="0"
+           outer_field="Field_outer_nominal_value"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="Solenoid_outer_radius"
+           outer_radius="Yoke_barrel_inner_radius">
+    </field>
+  </fields>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v04/CRD_Dimensions_v01_04.xml b/Detector/DetCRD/compact/CRD_o1_v04/CRD_Dimensions_v01_04.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d1e188653170c137c04f42f68457dfd7eb00c219
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v04/CRD_Dimensions_v01_04.xml
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+
+  <info name="CRDDimensions"
+       title="master file with includes and world dimension"
+       author="C.D.Fu, Mengyao Liu"
+       url="no"
+       status="development"
+       version="1.0">
+    <comment>
+      undeterminded parameters
+    </comment>
+  </info>
+
+  <define>
+    <constant name="CrossingAngle" value="0.033*rad"/>  
+
+    <constant name="Global_endcap_costheta" value="0.99"/>
+
+    <constant name="GlobalTrackerReadoutID_DCH" type="string" value="system:8,chamber:1,layer:7,phi:16"/>
+    <constant name="GlobalTrackerReadoutID" type="string" value="system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2"/>
+
+    <constant name="Field_nominal_value" value="3*tesla"/>
+    <constant name="Field_outer_nominal_value" value="-1.3*tesla"/>
+
+    <constant name="env_safety" value="0.1*mm"/>
+
+    <constant name="DetID_NOTUSED"      value="  0"/>
+    <constant name="DetID_VXD"          value="  1"/>
+    <constant name="DetID_SIT"          value="  2"/>
+    <constant name="DetID_FTD"          value="  3"/>
+    <constant name="DetID_TPC"          value="  4"/>
+    <constant name="DetID_SET"          value="  5"/>
+    <constant name="DetID_ETD"          value="  6"/>
+    <constant name="DetID_DC"           value="  4"/> <!--in order to cheat Clupatra, same as TPC--> 
+    
+    <constant name="DetID_ECAL"         value=" 20"/>
+    <constant name="DetID_ECAL_PLUG"    value=" 21"/>
+    <constant name="DetID_HCAL"         value=" 22"/>
+    <constant name="DetID_HCAL_RING"    value=" 23"/>
+    <constant name="DetID_LCAL"         value=" 24"/>
+    <constant name="DetID_BCAL"         value=" 25"/>
+    <constant name="DetID_LHCAL"        value=" 26"/>
+    <constant name="DetID_YOKE"         value=" 27"/>
+    <constant name="DetID_COIL"         value=" 28"/>
+    <constant name="DetID_ECAL_ENDCAP"  value=" 29"/>
+    <constant name="DetID_HCAL_ENDCAP"  value=" 30"/>
+    <constant name="DetID_YOKE_ENDCAP"  value=" 31"/>
+    
+    <constant name="DetID_bwd"       value="-1"/>
+    <constant name="DetID_barrel"    value=" 0"/>
+    <constant name="DetID_fwd"       value="+1"/>
+    
+    <constant name="BeamPipe_Be_inner_thickness"   value="0.2*mm"/>
+    <constant name="BeamPipe_Cooling_thickness"    value="0.35*mm"/>
+    <constant name="BeamPipe_Be_outer_thickness"   value="0.15*mm"/>
+    <constant name="BeamPipe_Be_total_thickness"   value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/>
+    <constant name="BeamPipe_Al_thickness"         value="BeamPipe_Be_total_thickness"/>
+    <constant name="BeamPipe_Cu_thickness"         value="4.0*mm"/>
+    
+    <constant name="BeamPipe_CentralBe_zmax"       value="85*mm"/>
+    <constant name="BeamPipe_CentralAl_zmax"       value="180*mm"/>
+    <constant name="BeamPipe_ExpandAl_zmax"        value="655*mm"/>
+    <constant name="BeamPipe_Linker_zmin"          value="700*mm"/>
+    <constant name="BeamPipe_Linker_zmax"          value="780*mm"/>
+    <constant name="BeamPipe_Waist_zmax"           value="805*mm"/>
+    <constant name="BeamPipe_Crotch_zmax"          value="855*mm"/>
+    <constant name="BeamPipe_FirstSeparated_zmax"  value="1110*mm"/>
+    <constant name="BeamPipe_Mask_zmin"            value="1210*mm"/>
+    <constant name="BeamPipe_Mask_zmax"            value="1230*mm"/>
+    <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/>
+    <constant name="BeamPipe_end_z"                value="7050*mm"/>
+
+    <constant name="BeamPipe_Central_inner_radius"  value="10*mm"/>
+    <constant name="BeamPipe_Fork_inner_radius"     value="10*mm"/>
+    <constant name="BeamPipe_FirstExpand_width"     value="35*mm"/>
+    <constant name="BeamPipe_SecondExpand_width"    value="39*mm"/>
+    <constant name="BeamPipe_Mask_inner_radius"     value="6*mm"/>
+    <constant name="BeamPipe_VertexRegion_rmax"     value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/>
+    <constant name="BeamPipe_FrontLinker_rmax"      value="BeamPipe_FirstExpand_width/2+BeamPipe_Al_thickness"/>
+    <constant name="BeamPipe_ForwardRegion_rmax"    value="BeamPipe_SecondExpand_width/2+BeamPipe_Cu_thickness"/>
+
+    <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/>
+    <constant name="Vertex_outer_radius" value="70*mm"/>
+    <constant name="Vertex_half_length"  value="200*mm"/>
+    <constant name="Vertex_Side_rmin"    value="BeamPipe_VertexRegion_rmax+(BeamPipe_FrontLinker_rmax-BeamPipe_VertexRegion_rmax)/(BeamPipe_ExpandAl_zmax-BeamPipe_CentralAl_zmax)
+						                          *(Vertex_half_length-BeamPipe_CentralAl_zmax)"/>
+
+    <constant name="DC_Endcap_dz" value="0.1*mm"/>
+    <constant name="DC_half_length"  value="2980*mm" />
+    <constant name="DC_safe_distance" value="0.02*mm"/>
+    <constant name="SDT_inner_wall_thickness" value="0.2*mm"/>
+    <constant name="SDT_outer_wall_thickness" value="2.8*mm"/>
+    <constant name="MainTracker_half_length"  value="DC_half_length+DC_Endcap_dz" />
+
+    <!--obselete for single drift chamber-->
+    <constant name="InnerTracker_half_length"  value="DC_half_length" />
+    <constant name="InnerTracker_inner_radius" value="234*mm"/>
+    <constant name="InnerTracker_outer_radius" value="909*mm"/>
+    <constant name="OuterTracker_half_length"  value="DC_half_length"/>
+    <constant name="OuterTracker_inner_radius" value="1082.18*mm"/>
+    <constant name="OuterTracker_outer_radius" value="1723*mm"/>
+
+    <!-- Parameters of single drift chamber  -->
+    <constant name="DC_chamber_layer_rbegin" value="1000*mm"/>
+    <constant name="DC_chamber_layer_rend" value="1800*mm"/>
+
+    <constant name="DC_inner_radius" value="DC_chamber_layer_rbegin-SDT_inner_wall_thickness-DC_safe_distance"/>
+    <constant name="DC_outer_radius" value="DC_chamber_layer_rend+SDT_outer_wall_thickness+DC_safe_distance"/>
+
+    <constant name="SIT1_inner_radius"   value="150*mm"/>
+    <constant name="SIT2_inner_radius"   value="350*mm"/>
+    <constant name="SIT4_inner_radius"   value="DC_chamber_layer_rbegin-30*mm"/>
+    <constant name="SIT3_inner_radius"   value="0.5*(SIT2_inner_radius+SIT4_inner_radius)"/>
+    <constant name="SIT1_half_length"    value="461*mm"/>
+    <constant name="SIT2_half_length"    value="691*mm"/>
+    <constant name="SIT3_half_length"    value="1013*mm"/>
+    <constant name="SIT4_half_length"    value="1335*mm"/>
+
+    <constant name="SET_inner_radius"    value="1815*mm"/>
+
+    <constant name="SiTracker_barrel_endcap_gap" value="5*mm"/>
+    <constant name="SiTracker_DC_endcap_gap"     value="10*mm"/>
+    <constant name="SiTracker_endcap_z1" value="Vertex_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z2" value="SiTracker_endcap_z1+100*mm"/>
+    <constant name="SiTracker_endcap_z3" value="SIT1_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z4" value="SIT2_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z5" value="SIT3_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z6" value="SIT4_half_length+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_z7" value="MainTracker_half_length+SiTracker_DC_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius1" value="SIT1_inner_radius"/>
+    <constant name="SiTracker_endcap_outer_radius2" value="SIT1_inner_radius"/>
+    <constant name="SiTracker_endcap_outer_radius3" value="SIT1_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius4" value="SIT2_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius5" value="SIT3_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius6" value="SIT4_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <constant name="SiTracker_endcap_outer_radius7" value="SET_inner_radius+SiTracker_barrel_endcap_gap"/>
+    <!--obseleted -->
+    <constant name="FTD_BeamPipe_cable_clearance"     value="10*mm"/> 
+    <constant name="FTD_BeamPipe_gap"     value="15*mm"/>
+    <constant name="FTD_InnerTracker_gap" value="5*mm"/>
+
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> 
+    <constant name="TPC_Ecal_Hcal_barrel_halfZ"   value="MainTracker_half_length"/>
+    <constant name="TPC_inner_radius"             value="InnerTracker_inner_radius"/>
+    <constant name="TPC_outer_radius"             value="OuterTracker_outer_radius"/>
+    <constant name="SIT1_Radius"                  value="SIT1_inner_radius"/>
+    <constant name="SIT1_Half_Length_Z"           value="SIT1_half_length"/>
+    <constant name="SIT2_Radius"                  value="InnerTracker_inner_radius"/> <!--fake, used by FTD_Simple_Staggered and FTD_cepc, now should be determined by inner tracker-->
+    <constant name="SIT2_Half_Length_Z"           value="SIT2_half_length"/>
+    <constant name="TUBE_IPOuterTube_end_z"       value="BeamPipe_CentralAl_zmax"/>
+    <constant name="TUBE_IPOuterTube_end_radius"  value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/>
+    <constant name="TUBE_IPOuterBulge_end_z"      value="BeamPipe_Crotch_zmax"/><!--"BeamPipe_ConeAl_zmax"/-->
+    <!--constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/-->
+    <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/-->
+
+    <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code-->
+    <constant name="Ecal_barrel_thickness"    value="280*mm"/>
+    <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/>
+    <constant name="Ecal_barrel_half_length"  value="3300*mm"/>
+    <constant name="Ecal_barrel_symmetry"    value="8"/>
+
+    <constant name="Ecal_endcap_inner_radius" value="350*mm"/>
+    <constant name="Ecal_endcap_outer_radius" value="Ecal_barrel_inner_radius+Ecal_barrel_thickness"/>
+    <constant name="Ecal_endcap_zmin"        value="3050*mm"/>
+    <constant name="Ecal_endcap_zmax"        value="3350*mm"/>
+    <constant name="Ecal_endcap_symmetry"    value="8"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/>
+    
+    <constant name="Solenoid_inner_radius" value="2330*mm"/>
+    <constant name="Solenoid_outer_radius" value="2480*mm"/>
+    <constant name="Solenoid_half_length" value="3830*mm"/>
+    <constant name="SolenoidCoil_half_length" value="3800*mm"/>
+    <constant name="SolenoidCoil_radius" value="2351*mm"/>
+    <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/>
+
+    <constant name="Hcal_barrel_inner_radius" value="2530*mm"/>
+    <constant name="Hcal_barrel_outer_radius" value="3610*mm"/>
+    <constant name="Hcal_barrel_half_length"  value="4480*mm"/>
+    <constant name="Hcal_barrel_symmetry"    value="12"/>
+    
+    <constant name="Hcal_endcap_inner_radius" value="400*mm"/>
+    <constant name="Hcal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/>
+    <constant name="Hcal_endcap_zmin" value="3400*mm"/>
+    <constant name="Hcal_endcap_zmax" value="4480*mm"/>
+    <constant name="Hcal_endcap_symmetry" value="12"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/>
+    <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/>
+    <constant name="Hcal_outer_radius" value="Hcal_endcap_outer_radius"/>
+
+    <!--constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/>
+    <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/>
+    <constant name="Hcal_ring_zmin" value="2600*mm"/>
+    <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/>
+    <constant name="Hcal_ring_symmetry" value="8"/-->
+        
+    <constant name="Yoke_barrel_inner_radius" value="3660*mm"/>
+    <constant name="Yoke_barrel_outer_radius" value="4260*mm"/>
+    <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/>
+    <constant name="Yoke_barrel_symmetry" value="12"/>
+    
+    <constant name="Yoke_endcap_inner_radius" value="400*mm"/>
+    <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/>
+    <constant name="Yoke_endcap_zmin" value="4660*mm"/>
+    <constant name="Yoke_endcap_zmax" value="5460*mm"/>
+    <constant name="Yoke_endcap_outer_symmetry" value="Yoke_barrel_symmetry"/>
+    <constant name="Yoke_endcap_inner_symmetry" value="0"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/>
+    
+    <!--constant name="LumiCal_zmax" value="805*mm" />
+    <constant name="LumiCal_zmin" value="700*mm"/>
+    <constant name="LumiCal_thickness" value="(LumiCal_zmax-LumiCal_zmin)/2.0"/>
+    <constant name="LumiCal_inner_radius" value="35.0*mm"/>
+    <constant name="LumiCal_outer_radius" value="100.0*mm- env_safety"/-->
+        
+    <constant name="tracker_region_zmax" value="OuterTracker_half_length"/>
+    <constant name="tracker_region_rmax" value="OuterTracker_outer_radius"/>
+
+  </define>
+  
+  <limits>
+    <limitset name="cal_limits">
+      <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+    </limitset>
+    <limitset name="dc_limits">
+      <limit name="step_length_max" particles="*" value="10.0" unit="mm" />
+    </limitset>
+    <limitset name="tracker_limits">
+      <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+    </limitset>
+  </limits>
+
+  <regions>
+    <region name="BeampipeRegion"/>
+    <region name="VertexRegion"/>
+    <region name="ForwardRegion"/>
+  </regions>
+
+  <display>
+    <vis name="VXDVis"           alpha="0.1" r="0.1"   g=".5"      b=".5"    showDaughters="true"  visible="true"/>
+    <vis name="VXDLayerVis"      alpha="1.0" r="0.1"   g=".5"      b=".5"    showDaughters="true"  visible="true"/>
+    <vis name="VXDSupportVis"    alpha="1.0" r="0.0"   g="1.0"     b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="FTDVis"           alpha="1.0" r="0.5"   g="0.87"    b="0.11"  showDaughters="true"  visible="true"/>
+    <vis name="FTDSupportVis"    alpha="1.0" r="0.3"   g="0.3"     b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="FTDSensitiveVis"  alpha="1.0" r="0.3"   g="0.5"     b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="DCVis"            alpha="1.0" r="0.96"  g="0.64"    b="0.90"  showDaughters="true"  visible="true"/>
+    <vis name="DCLayerVis"       alpha="1.0" r="0.96"  g="0.64"    b="0.90"  showDaughters="false" visible="true"/>
+    <vis name="SITVis"           alpha="0.0" r="0.54"  g="0.59"    b="0.93"  showDaughters="true"  visible="false"/>
+    <vis name="SITSupportVis"    alpha="1.0" r="0.0"   g="0.0"     b="1.0"   showDaughters="false" visible="true"/>
+    <vis name="SITSensitiveVis"  alpha="1.0" r="0.67"  g="0.99"    b="0.78"  showDaughters="false" visible="true"/>
+    <vis name="SETVis"           alpha="0.0" r="0.8"   g="0.8"     b="0.4"   showDaughters="true"  visible="false"/>
+    <vis name="SETSupportVis"    alpha="1.0" r="1.0"   g="0.0"     b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="SETSensitiveVis"  alpha="1.0" r="0.0"   g="0.0"     b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="ECALVis"          alpha="1.0" r="0.2"   g="0.6"     b="0"     showDaughters="true"  visible="true"/>
+    <vis name="HCALVis"          alpha="1.0" r="0.95"  g="0.78"    b="0.69"  showDaughters="true"  visible="true"/>
+    <vis name="SOLVis"           alpha="1.0" r="0.4"   g="0.4"     b="0.4"   showDaughters="true"  visible="true"/>
+    <vis name="YOKEVis"          alpha="1.0" r="0.64"  g="0.75"    b="0.99"  showDaughters="false" visible="true"/>
+    <vis name="LCALVis"          alpha="1.0" r="0.25"  g="0.88"    b="0.81"  showDaughters="true"  visible="true"/>
+    <vis name="SupportVis"       alpha="1.0" r="0.2"   g="0.2"     b="0.2"   showDaughters="true"  visible="true"/>
+    <vis name="ShellVis"         alpha="1.0" r="0.82"  g="0.59"    b="0.36"  showDaughters="false" visible="true"/>
+
+    <vis name="WhiteVis"         alpha="0.0" r=".96" g=".96"  b=".96"   showDaughters="true"  visible="true"/>
+    <vis name="LightGrayVis"     alpha="0.0" r=".75" g=".75"  b=".75"   showDaughters="true"  visible="true"/>
+    <vis name="Invisible"        alpha="0.0" r="0.0" g="0.0"  b="0.0"   showDaughters="false"  visible="false"/>
+    <vis name="SeeThrough"       alpha="0.0" r="0.0" g="0.0"  b="0.0"   showDaughters="true"  visible="false"/>
+    <vis name="RedVis"           alpha="1.0" r="1.0" g="0.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="GreenVis"         alpha="1.0" r="0.0" g="1.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="BlueVis"          alpha="1.0" r="0.0" g="0.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="CyanVis"          alpha="1.0" r="0.0" g="1.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="MagentaVis"       alpha="1.0" r="1.0" g="0.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="YellowVis"        alpha="1.0" r="1.0" g="1.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="BlackVis"         alpha="1.0" r="0.0" g="0.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="GrayVis"          alpha="1.0" r="0.5" g="0.5"  b="0.5"   showDaughters="true"  visible="true"/>
+  </display>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04-onlyTracker.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ececd6165bbf2b9217bd005dc0bba4f980da37e2
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04-onlyTracker.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  <info name="CRD_o1_v04"
+        title="CepC reference detctor with coil inside Hcal, pixel SIT/SET"
+        author="C.D.Fu, "
+        url="http://cepc.ihep.ac.cn"
+        status="developing"
+        version="v04">
+    <comment>CepC reference detector simulation models used for detector study </comment>
+  </info>
+  
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
+  </includes>
+  
+  <define>
+    <constant name="world_size" value="25*m"/>
+    <constant name="world_x" value="world_size"/>
+    <constant name="world_y" value="world_size"/>
+    <constant name="world_z" value="world_size"/>
+
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
+  </define>
+
+  <include ref="./CRD_Dimensions_v01_04.xml"/>
+
+  <include ref="../CRD_common_v01/Beampipe_v01_02.xml"/>
+  <include ref="../CRD_common_v01/VXD_v01_03.xml"/>
+  <include ref="../CRD_common_v01/FTD_SkewRing_v01_03.xml"/>
+  <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
+  <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
+
+  <fields>
+    <field name="InnerSolenoid" type="solenoid"
+           inner_field="Field_nominal_value"
+           outer_field="0"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="SolenoidCoil_center_radius"
+           outer_radius="Solenoid_outer_radius">
+    </field>
+    <field name="OuterSolenoid" type="solenoid"
+           inner_field="0"
+           outer_field="Field_outer_nominal_value"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="Solenoid_outer_radius"
+           outer_radius="Yoke_barrel_inner_radius">
+    </field>
+  </fields>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04.xml b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1804d93a39d5f90048721b6fb21f83fcd6e82c84
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v04/CRD_o1_v04.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  <info name="CRD_o1_v04"
+        title="CepC reference detctor with coil inside Hcal, pixel SIT/SET"
+        author="C.D.Fu, "
+        url="http://cepc.ihep.ac.cn"
+        status="developing"
+        version="v04">
+    <comment>CepC reference detector simulation models used for detector study </comment>
+  </info>
+  
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
+  </includes>
+  
+  <define>
+    <constant name="world_size" value="25*m"/>
+    <constant name="world_x" value="world_size"/>
+    <constant name="world_y" value="world_size"/>
+    <constant name="world_z" value="world_size"/>
+
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
+  </define>
+
+  <include ref="./CRD_Dimensions_v01_04.xml"/>
+
+  <include ref="../CRD_common_v01/Beampipe_v01_02.xml"/>
+  <include ref="../CRD_common_v01/VXD_v01_03.xml"/>
+  <include ref="../CRD_common_v01/FTD_SkewRing_v01_03.xml"/>
+  <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
+  <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/>
+  
+  <fields>
+    <field name="InnerSolenoid" type="solenoid"
+           inner_field="Field_nominal_value"
+           outer_field="0"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="SolenoidCoil_center_radius"
+           outer_radius="Solenoid_outer_radius">
+    </field>
+    <field name="OuterSolenoid" type="solenoid"
+           inner_field="0"
+           outer_field="Field_outer_nominal_value"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="Solenoid_outer_radius"
+           outer_radius="Yoke_barrel_inner_radius">
+    </field>
+  </fields>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/README.md b/Detector/DetCRD/compact/README.md
index f4a0aefb6796ed3cdeafb1b7aeb84d24cf32ed3a..0ef4c00fa60d35c805202947751e8a82338f343c 100644
--- a/Detector/DetCRD/compact/README.md
+++ b/Detector/DetCRD/compact/README.md
@@ -5,7 +5,9 @@ The following CRD detector models are available in CEPCSW
 | Model         |  Description                 | MainTracker |  Ecal   | Hcal | Status         |
 | ------------- | -----------------------------|------------ |---------|------|----------------|
 | CRD_o1_v01    | coil inside simulation model | SIT+DC+SET  | crystal | RPC  | developing     |
-| CRD_o1_v02    | pixel SET                    | SIT+DC+SET  | crystal | RPC  | developing     |
+| CRD_o1_v02    | strip SET                    | SIT+DC+SET  | crystal | RPC  | developing     |
+| CRD_o1_v03    | MOST2 vertex                 | SIT+DC+SET  | crystal | RPC  | developing     |
+| CRD_o1_v04    | smaller center beam pipe     | SIT+DC+SET  | crystal | RPC  | developing     |
 | ------------- | -----------------------------|-------------|---------|------|----------------|
  
 ## Details
@@ -47,3 +49,15 @@ The following CRD detector models are available in CEPCSW
  - strip SET: double layers
  - compact files:
          - [./CRD_o1_v02/CRD_o1_v02.xml](./CRD_o1_v02/CRD_o1_v02.xml)
+
+### CRD_o1_v03 (to update)
+ - based on CRD_o1_v01
+ - MOST2 vertex
+ - compact files:
+         - [./CRD_o1_v03/CRD_o1_v03.xml](./CRD_o1_v03/CRD_o1_v03.xml)
+
+### CRD_o1_v04 (to update)
+ - based on CRD_o1_v01
+ - smaller center beam pipe & new MDI: inner radius = 10mm, flat at y direction
+ - compact files:
+         - [./CRD_o1_v04/CRD_o1_v04.xml](./CRD_o1_v04/CRD_o1_v04.xml)
diff --git a/Detector/DetCRD/scripts/CRD-Sim.py b/Detector/DetCRD/scripts/CRD-Sim.py
index 0e734b785f0c6442b320bc75e43c3d10472bc8a5..e658c12772b0d2a8e304055eafae7ad1e5c7a56f 100644
--- a/Detector/DetCRD/scripts/CRD-Sim.py
+++ b/Detector/DetCRD/scripts/CRD-Sim.py
@@ -1,4 +1,6 @@
 #!/usr/bin/env python
+import os
+
 from Gaudi.Configuration import *
 
 from Configurables import k4DataSvc
diff --git a/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py b/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py
index 5d595621af36d9284d9ac4e1f78adf85c0838f5d..cb3ceeb761e542e1cf6e43c2a469db62a0feac3f 100644
--- a/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py
+++ b/Detector/DetCRD/scripts/CRD_VXD_MOST2-sim.py
@@ -1,4 +1,6 @@
 #!/usr/bin/env python
+import os
+
 from Gaudi.Configuration import *
 
 from Configurables import k4DataSvc
diff --git a/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py b/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py
index 19836013be8fcc3b1dcbcd6993473de64b1a0ba5..52a6209da65917bb7ced0acacc15d198fee15973 100644
--- a/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py
+++ b/Detector/DetCRD/scripts/CRD_o1_v01-SimRec.py
@@ -1,6 +1,10 @@
 #!/usr/bin/env python
+import os
+
 from Gaudi.Configuration import *
 
+NTupleSvc().Output = ["MyTuples DATAFILE='test.root' OPT='NEW' TYP='ROOT'"]
+
 from Configurables import k4DataSvc
 dsvc = k4DataSvc("EventDataSvc")
 
@@ -125,6 +129,10 @@ digiVXD.TrackerHitCollection = vxdhitname
 digiVXD.ResolutionU = [0.0028, 0.006, 0.004, 0.004, 0.004, 0.004]
 digiVXD.ResolutionV = [0.0028, 0.006, 0.004, 0.004, 0.004, 0.004]
 digiVXD.UsePlanarTag = True
+# if Parameterized spatial resolution, set ParameterizeResolution to True
+digiVXD.ParameterizeResolution = False
+digiVXD.ParametersU = [5.60959e-03, 5.74913e-03, 7.03433e-03, 1.99516, -663.952, 3.752e-03, 0, -0.0704734, 0.0454867e-03, 1.07359]
+digiVXD.ParametersV = [5.60959e-03, 5.74913e-03, 7.03433e-03, 1.99516, -663.952, 3.752e-03, 0, -0.0704734, 0.0454867e-03, 1.07359]
 #digiVXD.OutputLevel = DEBUG
 
 digiSIT = PlanarDigiAlg("SITDigi")
@@ -135,6 +143,10 @@ digiSIT.TrackerHitAssociationCollection = "SITTrackerHitAssociation"
 digiSIT.ResolutionU = [0.0072]
 digiSIT.ResolutionV = [0.086]
 digiSIT.UsePlanarTag = True
+# if Parameterized spatial resolution, set ParameterizeResolution to True
+digiSIT.ParameterizeResolution = False
+digiSIT.ParametersU = [2.29655e-03, 0.965899e-03, 0.584699e-03, 17.0856, 84.566, 12.4695e-03, -0.0643059, 0.168662, 1.87998e-03, 0.514452]
+digiSIT.ParametersV = [1.44629e-02, 2.20108e-03, 1.03044e-02, 4.39195e+00, 3.29641e+00, 1.55167e+18, -5.41954e+01, 5.72986e+00, -6.80699e-03, 5.04095e-01]
 #digiSIT.OutputLevel = DEBUG
 
 digiSET = PlanarDigiAlg("SETDigi")
@@ -145,6 +157,10 @@ digiSET.TrackerHitAssociationCollection = "SETTrackerHitAssociation"
 digiSET.ResolutionU = [0.0072]
 digiSET.ResolutionV = [0.086]
 digiSET.UsePlanarTag = True
+# if Parameterized spatial resolution, set ParameterizeResolution to True
+digiSET.ParameterizeResolution = False
+digiSET.ParametersU = [2.29655e-03, 0.965899e-03, 0.584699e-03, 17.0856, 84.566, 12.4695e-03, -0.0643059, 0.168662, 1.87998e-03, 0.514452]
+digiSET.ParametersV = [1.44629e-02, 2.20108e-03, 1.03044e-02, 4.39195e+00, 3.29641e+00, 1.55167e+18, -5.41954e+01, 5.72986e+00, -6.80699e-03, 5.04095e-01]
 #digiSET.OutputLevel = DEBUG
 
 digiFTD = PlanarDigiAlg("FTDDigi")
@@ -155,11 +171,17 @@ digiFTD.TrackerHitAssociationCollection = "FTDTrackerHitAssociation"
 digiFTD.ResolutionU = [0.003, 0.003, 0.0072, 0.0072, 0.0072, 0.0072, 0.0072]
 digiFTD.ResolutionV = [0.003, 0.003, 0.0072, 0.0072, 0.0072, 0.0072, 0.0072]
 digiFTD.UsePlanarTag = True
+# if Parameterized spatial resolution, set ParameterizeResolution to True
+digiFTD.ParameterizeResolution = False
+digiFTD.ParametersU = [2.29655e-03, 0.965899e-03, 0.584699e-03, 17.0856, 84.566, 12.4695e-03, -0.0643059, 0.168662, 1.87998e-03, 0.514452]
+digiFTD.ParametersV = [1.44629e-02, 2.20108e-03, 1.03044e-02, 4.39195e+00, 3.29641e+00, 1.55167e+18, -5.41954e+01, 5.72986e+00, -6.80699e-03, 5.04095e-01]
 #digiFTD.OutputLevel = DEBUG
 
 from Configurables import DCHDigiAlg
 digiDC = DCHDigiAlg("DCHDigi")
 digiDC.DigiDCHitCollection = dchitname
+# TODO: DCHDigiAlg need fixed, only WriteAna = True can run
+digiDC.WriteAna = True
 #digiDC.OutputLevel = DEBUG
 
 # two strip tracker hits -> one space point
diff --git a/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py b/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py
index 253ea21a71125f20f9216094dd2071e2fdd950e4..05844c9f8d5e2a2e94ae13349a12dda57d0cfcc2 100644
--- a/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py
+++ b/Detector/DetCRD/scripts/CRD_o1_v02-SimRec.py
@@ -1,6 +1,10 @@
 #!/usr/bin/env python
+import os
+
 from Gaudi.Configuration import *
 
+NTupleSvc().Output = ["MyTuples DATAFILE='test.root' OPT='NEW' TYP='ROOT'"]
+
 from Configurables import k4DataSvc
 dsvc = k4DataSvc("EventDataSvc")
 
@@ -160,6 +164,8 @@ digiFTD.UsePlanarTag = True
 from Configurables import DCHDigiAlg
 digiDC = DCHDigiAlg("DCHDigi")
 digiDC.DigiDCHitCollection = dchitname
+# TODO: DCHDigiAlg need fixed, only WriteAna = True can run
+digiDC.WriteAna = True
 #digiDC.OutputLevel = DEBUG
 
 # two strip tracker hits -> one space point
diff --git a/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py b/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py
index 1386affd7623cda211e7d1d8f983fa749b26b9f3..c2d88fdebb76f8b3a70d029979009f2bc2212365 100644
--- a/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py
+++ b/Detector/DetCRD/scripts/Standalone-Sim-RotCrystal.py
@@ -1,4 +1,6 @@
 #!/usr/bin/env python
+import os
+
 from Gaudi.Configuration import *
 
 from Configurables import k4DataSvc
diff --git a/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp
index 4ba45b249f46c9bd815ac60b21f3a32f385a51cf..e161fedfafc3c2c98902508b69bdea1b0deae759 100644
--- a/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp
+++ b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp
@@ -46,29 +46,33 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
   double Z0 = theDetector.constant<double>("ecalbarrel_zlength");
   double barx = theDetector.constant<double>("bar_x");   //Crystal size in R direction. 
   double bary = theDetector.constant<double>("bar_y");   //Crystal size in z/phi direction (z for odd layer, phi for even layer).
-  
-  double dim_x1 = R0*tan(22.5*degree) + sqrt(2)*h0/2.;
-  double dim_x2 = dim_x1 - h0;
+  //int Nsymm = theDetector.constant<int>("n_symm");    //Only support 8 and 12 now. 
+  //double rotAngle = 360./Nsymm;  
+  int Nsymm = 8;    //Only support 8 and 12 now. 
+  double rotAngle = 45.;  
+
+  double dim_x1 = R0*tan(rotAngle*degree/2.) + h0/(2.*sin(rotAngle*degree));
+  double dim_x2 = dim_x1 - h0/tan(rotAngle*degree);
   double dim_y = Z0/2.;
   double dim_z = h0/2.;		                 
-  double dx = dim_x1 - R0*tan(22.5*degree);  //transport distance in x-axis
-  double r0 = R0+h0/2.;                      //rotation radius 
+  double dx = dim_x1 - R0*tan(rotAngle*degree/2.);  //transport distance in x-axis
+  double r0 = R0+h0/2.;                             //rotation radius 
   
   //Crystal bar size
-  int Nlayers = (int)h0/(2*barx);         //14 double-layers. 
-  int Nblock_z   = 11;                    //block number in z direction
-  int Nblock_phi = 4;                     //block number in phi direction
-  double barz_s0;                         //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. 
-  double barz_s1 = Z0/Nblock_z;           //Crystal bar lenghth in sub-layer 1(z direction, 46cm).
-  int Nbar_phi;                           //Crystal bar number in each block, in phi direction.
-  int Nbar_z = (int)barz_s1/bary;         //Crystal bar number in each block, in z direction.
+  int Nlayers = (int)h0/(2*barx);                             //14 double-layers. 
+  int Nblock_z = theDetector.constant<int>("Nblock_z");       //block number in z direction
+  int Nblock_phi = theDetector.constant<int>("Nblock_phi");   //block number in phi direction
+  double barz_s0;                                             //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. 
+  double barz_s1 = Z0/Nblock_z;                               //Crystal bar lenghth in sub-layer 1(z direction, ~60cm).
+  int Nbar_phi;                                               //Crystal bar number in each block, in phi direction.
+  int Nbar_z = (int)barz_s1/bary;                             //Crystal bar number in each block, in z direction.
   
   //Define detector and motherVolume(world)
   dd4hep::DetElement ECAL(det_name, detid);
   dd4hep::Volume motherVol = theDetector.pickMotherVolume(ECAL);
   
   // Create a Tube-like envelope representing the whole detector volume
-  dd4hep::PolyhedraRegular envelope(8, 22.5*degree, R0, (R0+h0), Z0);
+  dd4hep::PolyhedraRegular envelope(Nsymm, rotAngle/2.*degree, R0, (R0+h0), Z0);
   dd4hep::Material	air(theDetector.material("Air"));
   dd4hep::Volume	   envelopeVol(det_name, envelope, air);
   dd4hep::PlacedVolume	envelopePlv = motherVol.placeVolume(envelopeVol, Position(0,0,0));
@@ -107,8 +111,8 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
   }
 
   caloData->layoutType = LayeredCalorimeterData::BarrelLayout ;
-  caloData->inner_symmetry = 8  ;
-  caloData->outer_symmetry = 8  ;
+  caloData->inner_symmetry = Nsymm  ;
+  caloData->outer_symmetry = Nsymm  ;
   caloData->phi0 = 0 ; // hardcoded
 
   // extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in mm.
@@ -141,7 +145,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
     
         //sub-layer 0: bars along phi. length=barz_s0. Bar num=Nbar_z
       for(int ibar0=1;ibar0<=Nbar_z;ibar0++){
-    	    dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0,(2*ibar0-1)*bary/2-barz_s1/2, -barx/2));
+    	    dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0, barz_s1/2-(2*ibar0-1)*bary/2, -barx/2));
     	    plv_bar0.addPhysVolID("slayer",0).addPhysVolID("bar",ibar0);
     	    std::string barname0 = "CrystalBar_s0_"+std::to_string(ibar0);	
     	    dd4hep::DetElement bardet0(sd, barname0, detid);
@@ -150,7 +154,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
     
     	  //sub-layer1 
     	  for(int ibar1=1;ibar1<=Nbar_phi;ibar1++){
-    	    dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position((2*ibar1-1)*bary/2-barz_s0/2, 0, barx/2));
+    	    dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position( barz_s0/2-(2*ibar1-1)*bary/2, 0, barx/2));
     	  	 plv_bar1.addPhysVolID("slayer",1).addPhysVolID("bar",ibar1);
     	  	 std::string barname1 = "CrystalBar_s1_"+std::to_string(ibar1);
     	  	 dd4hep::DetElement bardet1(sd, barname1, detid);
@@ -166,21 +170,21 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
     }
 
   for(int iz=1; iz<=Nblock_z; iz++){
-    dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, (2*iz-1)*barz_s1/2-dim_y, 0) );
+    dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, dim_y-(2*iz-1)*barz_s1/2, 0) );
     plv.addPhysVolID("stave", iz);
     DetElement sd(stavedet, _toString(iz,"stave%3d"), detid);
     sd.setPlacement(plv);    
   }
   
-  for(int i=0;i<8;i++){
-    double rotAngle = 45*i*degree;
-    double posx = -r0*sin(rotAngle) - dx*cos(rotAngle);
-  	 double posy = r0*cos(rotAngle) - dx*sin(rotAngle);
-  	 dd4hep::Transform3D transform(dd4hep::RotationZ(rotAngle)*dd4hep::RotationX(-90*degree),  dd4hep::Position(posx, posy, 0.));
-  	 dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform);
-  	 plv.addPhysVolID("module", i);
-  	 DetElement sd(ECAL, _toString(i,"trap%3d"), detid);
-  	 sd.setPlacement(plv);
+  for(int i=0;i<Nsymm;i++){
+    double m_rot = rotAngle*i*degree;
+    double posx = -r0*sin(m_rot) - dx*cos(m_rot);
+    double posy = r0*cos(m_rot) - dx*sin(m_rot);
+    dd4hep::Transform3D transform(dd4hep::RotationZ(m_rot)*dd4hep::RotationX(-90*degree),  dd4hep::Position(posx, posy, 0.));
+    dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform);
+    plv.addPhysVolID("module", i);
+    DetElement sd(ECAL, _toString(i,"trap%3d"), detid);
+    sd.setPlacement(plv);
   }
 
   sens.setType("calorimeter");
diff --git a/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp b/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp
index 1b1b2a813e716632189dd6b2d54e7df3ade4ad54..d3e09afff32fe074fea7af05240d0d4f3315bab7 100644
--- a/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp
+++ b/Detector/DetCRD/src/Other/CRDBeamPipe_v01_geo.cpp
@@ -160,7 +160,7 @@ static Ref_t create_detector(Detector& theDetector,
 	envelope.placeVolume(subLayerLog,  transformer);
 	envelope.placeVolume(subLayerLog,  transmirror);
 	
-        if(material.radLength()<10000*dd4hep::mm){
+        if(type==CEPC::kCenter && material.radLength()<10000*dd4hep::mm){
           double tEff    = thickness/material.radLength()*theDetector.material("G4_Be").radLength();
 	  double tEffEnd = thicknessEnd/material.radLength()*theDetector.material("G4_Be").radLength();
           if(pipeRadius==0)    pipeRadius    = radius;
diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml
index 3c86627d3bde171386776eb74904f81129f0fe51..407378ece108abf1c3d582fd4973e28f9d4f001a 100644
--- a/Detector/DetDriftChamber/compact/det.xml
+++ b/Detector/DetDriftChamber/compact/det.xml
@@ -16,7 +16,10 @@
   </includes>
 
   <define>
-    <constant name="world_size" value="2990*mm"/>
+    <constant name="tracker_region_rmax" value="1723*mm" />
+    <constant name="tracker_region_zmax" value="3050*mm" />
+    <constant name="world_size" value="2226*mm"/>
+
     <constant name="world_x" value="world_size"/>
     <constant name="world_y" value="world_size"/>
     <constant name="world_z" value="world_size"/>
diff --git a/Detector/GeomSvc/src/GeomSvc.cpp b/Detector/GeomSvc/src/GeomSvc.cpp
index f7ae4a2bd6c04f6f728e51a8c251e1cd9a31575e..31443757ef16cb43bd2115d1de4c28929b7bb836 100644
--- a/Detector/GeomSvc/src/GeomSvc.cpp
+++ b/Detector/GeomSvc/src/GeomSvc.cpp
@@ -44,6 +44,9 @@ GeomSvc::initialize() {
 StatusCode
 GeomSvc::finalize() {
   StatusCode sc;
+
+  dd4hep::Detector::destroyInstance();
+
   return sc;
 }
 
diff --git a/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp b/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp
index 2eb352e4912a7d63eb797104beab25f59ec706ec..35bd036f4055cbc3a7264c25cd569bb680236254 100644
--- a/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp
+++ b/Detector/MagneticFieldMap/src/FieldMapFileProvider.cpp
@@ -209,6 +209,13 @@ bool FieldMapFileProvider::loadCSV(const std::string& fn,
     std::ifstream input(fn);
     std::string tmpline;
 
+    if (!input) {
+      std::cout << "Open file failure: please check file name and path! " << std::endl;
+      std::cout << "Notice: need absolute path or relative to path to run job!" << std::endl;
+      std::string error_msg = "[ERROR] FieldMapFileProvider: Cannot open " + fn;
+      throw std::runtime_error(error_msg);
+    }
+
     ncol = 0;
     nrow = 0;
 
diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
index 9b3218b3c2f47521c892e854e2732728cb7e7a72..4d6a9306b215de904c996ba134325fa114377e84 100644
--- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
@@ -19,10 +19,14 @@ void GenericBFieldMapBrBz::fieldComponents(const double* pos, double* field) {
         throw std::runtime_error(error_msg); 
     }
 
+    if (m_length_unit<=0||m_bfield_unit<=0) {
+      std::string error_msg = "[ERROR] GenericBFieldMapBrBz: Not set units or error (<0)! ";
+      throw std::runtime_error(error_msg);
+    }
     // convert pos to r/z
-    double x = pos[0] / dd4hep::m; // convert to meter
-    double y = pos[1] / dd4hep::m;
-    double z = pos[2] / dd4hep::m;
+    double x = pos[0] / m_length_unit; // convert to length unit from input
+    double y = pos[1] / m_length_unit;
+    double z = pos[2] / m_length_unit;
     double r = sqrt(x*x+y*y);
     double phi = atan2(y, x);
 
@@ -98,9 +102,9 @@ void GenericBFieldMapBrBz::fieldComponents(const double* pos, double* field) {
               +        rn  *        zn  * Bz_r1z1;
 
     // update the global field
-    field[0] += Br*cos(phi);
-    field[1] += Br*sin(phi);
-    field[2] += Bz;
+    field[0] += Br*cos(phi)*m_bfield_unit; // convert to input unit
+    field[1] += Br*sin(phi)*m_bfield_unit;
+    field[2] += Bz*m_bfield_unit;
 
     return;
 }
@@ -116,3 +120,9 @@ void GenericBFieldMapBrBz::init_provider(const std::string& provider, const std:
         throw std::runtime_error(error_msg); 
     }
 }
+
+void GenericBFieldMapBrBz::init_unit(double l, double b) {
+  m_length_unit = l;
+  m_bfield_unit = b;
+  std::cout << "Initialize units to l = " << m_length_unit/dd4hep::m << " m" << ", b = " << m_bfield_unit/dd4hep::tesla << " tesla" << std::endl;
+}
diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
index 93abfcfbbb5650d5e5945b774280e6586b1c17c3..1907b0ae154733c6caf6ece78967416d745f8b4c 100644
--- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
@@ -26,9 +26,15 @@ public:
     // following are interfaces to configure this field map
     void init_provider(const std::string& provider, const std::string& url);
 
+    // set unit
+    void init_unit(double l, double b);
+
 private:
 
     IFieldMapProvider* m_provider;
+
+    double m_length_unit = 0;
+    double m_bfield_unit = 0;
 };
 
 #endif
diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp
index d7d9fe302d75e214e290f52ebf2382441df305c0..28d6fe24f04e3ff631722b59ae630a1dfa608808 100644
--- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp
@@ -70,6 +70,19 @@ static dd4hep::Ref_t create_GenericBFieldMapBrBz(dd4hep::Detector& ,
 
     ptr->init_provider(provider, url);
 
+    // set unit, default values will be m and tesla
+    double lunit = dd4hep::m;
+    double bunit = dd4hep::tesla;
+    bool hasLunit = xmlParameter.hasAttr(_Unicode(lunit));
+    if (hasLunit) {
+      lunit = xmlParameter.attr<double>(_Unicode(lunit));
+    }
+    bool hasBunit = xmlParameter.hasAttr(_Unicode(bunit));
+    if (hasBunit) {
+      bunit = xmlParameter.attr<double>(_Unicode(bunit));
+    }
+    ptr->init_unit(lunit, bunit);
+
     obj.assign(ptr, xmlParameter.nameStr(), xmlParameter.typeStr());
 
     return obj;
diff --git a/Digitisers/SimpleDigi/CMakeLists.txt b/Digitisers/SimpleDigi/CMakeLists.txt
index 4e2687bc123eeb14f5b013af3cf0461ec48605db..28c8ea89d61d17c7d123b9d1366e94f49ac7aa29 100644
--- a/Digitisers/SimpleDigi/CMakeLists.txt
+++ b/Digitisers/SimpleDigi/CMakeLists.txt
@@ -3,6 +3,7 @@ gaudi_add_module(SimpleDigi
                  SOURCES src/PlanarDigiAlg.cpp
                          src/TPCDigiAlg.cpp
                          src/voxel.cpp
+                         src/CylinderDigiAlg.cpp
                  LINK GearSvc
                       EventSeeder
                       TrackSystemSvcLib
diff --git a/Digitisers/SimpleDigi/src/CylinderDigiAlg.cpp b/Digitisers/SimpleDigi/src/CylinderDigiAlg.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d3c67e60c89c427ce12a7c4bc27561b1b971f120
--- /dev/null
+++ b/Digitisers/SimpleDigi/src/CylinderDigiAlg.cpp
@@ -0,0 +1,119 @@
+#include "CylinderDigiAlg.h"
+
+#include "edm4hep/Vector3f.h"
+
+#include "DD4hep/Detector.h"
+#include <DD4hep/Objects.h>
+#include "DD4hep/DD4hepUnits.h"
+#include "DDRec/Vector3D.h"
+
+#include "GaudiKernel/INTupleSvc.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/IRndmGen.h"
+#include "GaudiKernel/IRndmGenSvc.h"
+#include "GaudiKernel/RndmGenerators.h"
+
+DECLARE_COMPONENT( CylinderDigiAlg )
+
+CylinderDigiAlg::CylinderDigiAlg(const std::string& name, ISvcLocator* svcLoc)
+: GaudiAlgorithm(name, svcLoc){
+  // Input collections
+  declareProperty("InputSimTrackerHitCollection", m_inputColHdls, "Handle of the Input SimTrackerHit collection");
+
+  // Output collections
+  declareProperty("OutputTrackerHitCollection", m_outputColHdls, "Handle of the output TrackerHit collection");
+  declareProperty("TrackerHitAssociationCollection", m_assColHdls, "Handle of the Association collection between SimTrackerHit and TrackerHit");
+}
+
+StatusCode CylinderDigiAlg::initialize(){
+  m_geosvc = service<IGeomSvc>("GeomSvc");
+  if(!m_geosvc){
+    error() << "Failed to get the GeomSvc" << endmsg;
+    return StatusCode::FAILURE;
+  }
+  auto detector = m_geosvc->lcdd();
+  if(!detector){
+    error() << "Failed to get the Detector from GeomSvc" << endmsg;
+    return StatusCode::FAILURE;
+  }
+  std::string name = m_inputColHdls.objKey(); 
+  debug() << "Readout name: " << name << endmsg;
+  m_decoder = m_geosvc->getDecoder(name);
+  if(!m_decoder){
+    error() << "Failed to get the decoder. " << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  info() << "CylinderDigiAlg::initialized" << endmsg;
+  return GaudiAlgorithm::initialize();
+}
+
+
+StatusCode CylinderDigiAlg::execute(){
+  auto trkhitVec = m_outputColHdls.createAndPut();
+  auto assVec = m_assColHdls.createAndPut();
+
+  const edm4hep::SimTrackerHitCollection* STHCol = nullptr;
+  try {
+    STHCol = m_inputColHdls.get();
+  }
+  catch(GaudiException &e){
+    debug() << "Collection " << m_inputColHdls.fullKey() << " is unavailable in event " << m_nEvt << endmsg;
+    return StatusCode::SUCCESS;
+  }
+  if(STHCol->size()==0) return StatusCode::SUCCESS;
+  debug() << m_inputColHdls.fullKey() << " has SimTrackerHit "<< STHCol->size() << endmsg;
+  
+  for(auto simhit : *STHCol){
+    auto particle = simhit.getMCParticle();
+    if(!particle.isAvailable()) continue;
+    
+    auto& mom0 = particle.getMomentum();
+    double pt = sqrt(mom0.x*mom0.x+mom0.y*mom0.y);
+    if(particle.isCreatedInSimulation()&&pt<0.01&&particle.isStopped()) continue;
+
+    auto cellId = simhit.getCellID();
+    int system  = m_decoder->get(cellId, "system");
+    int chamber = m_decoder->get(cellId, "chamber");
+    int layer   = m_decoder->get(cellId, "layer"  );
+    auto& pos   = simhit.getPosition();
+    auto& mom   = simhit.getMomentum();
+    
+    double phi = atan2(pos[1], pos[0]);
+    double r   = sqrt(pos[0]*pos[0]+pos[1]*pos[1]);
+    double dphi = m_resRPhi/r;
+    phi += randSvc()->generator(Rndm::Gauss(0, dphi))->shoot();
+    double smearedX = r*cos(phi);
+    double smearedY = r*sin(phi);
+    double smearedZ = pos[2] + randSvc()->generator(Rndm::Gauss(0, m_resZ))->shoot();
+
+    auto trkHit = trkhitVec->create();
+    trkHit.setCellID(cellId);
+    trkHit.setTime(simhit.getTime());
+    trkHit.setEDep(simhit.getEDep());
+    trkHit.setPosition (edm4hep::Vector3d(smearedX, smearedY, smearedZ));
+    trkHit.setCovMatrix(std::array<float, 6>{m_resRPhi*m_resRPhi/2, 0, m_resRPhi*m_resRPhi/2, 0, 0, m_resZ*m_resZ});
+    //trkHit.setType(CEPC::CYLINDER);
+    trkHit.addToRawHits(simhit.getObjectID());
+    debug() << "Hit " << simhit.id() << ": " << pos << " -> " << trkHit.getPosition() << "s:" << system << " c:" << chamber << " l:" << layer
+	    << " pt = " << pt << " " << mom.x << " " << mom.y << " " << mom.z << endmsg;
+
+    auto ass = assVec->create();
+
+    float weight = 1.0;
+
+    debug() <<" Set relation between " << " sim hit " << simhit.id() << " to tracker hit " << trkHit.id() << " with a weight of " << weight << endmsg;
+    ass.setSim(simhit);
+    ass.setRec(trkHit);
+    ass.setWeight(weight);
+  }
+
+  m_nEvt++;
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode CylinderDigiAlg::finalize(){
+  info() << "Processed " << m_nEvt << " events " << endmsg;
+  return GaudiAlgorithm::finalize();
+}
diff --git a/Digitisers/SimpleDigi/src/CylinderDigiAlg.h b/Digitisers/SimpleDigi/src/CylinderDigiAlg.h
new file mode 100644
index 0000000000000000000000000000000000000000..af3ffe2100f8151e0076c7ff4643f369f9f836ab
--- /dev/null
+++ b/Digitisers/SimpleDigi/src/CylinderDigiAlg.h
@@ -0,0 +1,39 @@
+#ifndef CylinderDigiAlg_H
+#define CylinderDigiAlg_H
+
+#include "k4FWCore/DataHandle.h"
+#include "GaudiKernel/NTuple.h"
+#include "GaudiAlg/GaudiAlgorithm.h"
+#include "edm4hep/SimTrackerHitCollection.h"
+#include "edm4hep/TrackerHitCollection.h"
+#include "edm4hep/MCRecoTrackerAssociationCollection.h"
+
+#include <DDRec/DetectorData.h>
+#include "DetInterface/IGeomSvc.h"
+
+class CylinderDigiAlg : public GaudiAlgorithm{
+ public:
+  
+  CylinderDigiAlg(const std::string& name, ISvcLocator* svcLoc);
+ 
+  virtual StatusCode initialize() ;
+  virtual StatusCode execute() ; 
+  virtual StatusCode finalize() ;
+ 
+protected:
+  
+  SmartIF<IGeomSvc> m_geosvc;
+  dd4hep::DDSegmentation::BitFieldCoder* m_decoder;
+
+  // Input collections
+  DataHandle<edm4hep::SimTrackerHitCollection>            m_inputColHdls{"DriftChamberHitsCollection", Gaudi::DataHandle::Reader, this};
+  // Output collections
+  DataHandle<edm4hep::TrackerHitCollection>               m_outputColHdls{"DCTrackerHits", Gaudi::DataHandle::Writer, this};
+  DataHandle<edm4hep::MCRecoTrackerAssociationCollection> m_assColHdls{"DCTrackerHitAssociationCollection", Gaudi::DataHandle::Writer, this};
+
+  Gaudi::Property<float> m_resRPhi{this, "ResRPhi", 0.1};
+  Gaudi::Property<float> m_resZ   {this, "ResZ", 2.828};
+
+  int m_nEvt=0;
+};
+#endif
diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
index 09fb7eecd86948cf36f45dcdda81b35d48118cc9..730f61e34df936eab5d54bb4e84fff1ca6866a05 100644
--- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
+++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
@@ -54,13 +54,20 @@ PlanarDigiAlg::PlanarDigiAlg(const std::string& name, ISvcLocator* svcLoc)
 
 StatusCode PlanarDigiAlg::initialize()
 {
+  if (_parameterize) {
+    if (_parU.size()!=10 || _parV.size()!=10) {
+      fatal() << "parameters number must be 10! now " << _parU.size() << " for U and " << _parV.size() << " for V" << endmsg;
+      return StatusCode::FAILURE;
+    }
+  }
+  else {
+    if (_resU.size() !=  _resV.size()) {
+      fatal() << "Inconsistent number of resolutions given for U and V coordinate: " 
+              << "ResolutionU  :" <<   _resU.size() << " != ResolutionV : " <<  _resV.size()
+              << endmsg;
 
-  if( _resU.size() !=  _resV.size() ) {
-    fatal() << "Inconsistent number of resolutions given for U and V coordinate: " 
-      << "ResolutionU  :" <<   _resU.size() << " != ResolutionV : " <<  _resV.size()
-      << endmsg;
-
-    return StatusCode::FAILURE;
+      return StatusCode::FAILURE;
+    }
   }
 
   // get the GEAR manager
@@ -85,7 +92,7 @@ StatusCode PlanarDigiAlg::initialize()
   //TODO:trksystem->init() ;
   //FIXME:SJA gear surface store has now been filled so we can dispose of the MarlinTrkSystem
   //TODO:delete trksystem;
-  
+  // fucd: fix TODO - surface store is needed to fill once always if does not handle tracking algorithm in job
   auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc");
   if ( !_trackSystemSvc ) {
     error() << "Failed to find TrackSystemSvc ..." << endmsg;
@@ -166,6 +173,8 @@ StatusCode PlanarDigiAlg::execute()
 
   int i = 0;
   for( auto SimTHit : *STHcol ) {
+    if (SimTHit.getEDep()<=_eThreshold) continue;
+    debug() << "MCParticle id " << SimTHit.getMCParticle().id() << endmsg;
 
     const int celId = SimTHit.getCellID() ;
 
@@ -205,28 +214,60 @@ StatusCode PlanarDigiAlg::execute()
     //                << endmsg;
     //        continue;
     //      }
-    if( (_resU.size() > 1 && layer > _resU.size()-1) || (_resV.size() > 1 && layer > _resV.size()-1) ) {
-      fatal() << "layer exceeds resolution vector, please check input parameters ResolutionU and ResolutionV" << endmsg;
-      return StatusCode::FAILURE;
-    }
+    gear::MeasurementSurface const* ms = _GEAR->getMeasurementSurfaceStore().GetMeasurementSurface( encoder.lowWord() );
+    gear::CartesianCoordinateSystem* cartesian = dynamic_cast< gear::CartesianCoordinateSystem* >( ms->getCoordinateSystem() );
+    CLHEP::Hep3Vector uVec = cartesian->getLocalXAxis();
+    CLHEP::Hep3Vector vVec = cartesian->getLocalYAxis();
 
-    float resU = ( _resU.size() > 1 ?   _resU.value().at(  layer )     : _resU.value().at(0)   )  ;
-    float resV = ( _resV.size() > 1 ?   _resV.value().at(  layer )     : _resV.value().at(0)   )  ; 
+    float u_direction[2] ;
+    u_direction[0] = uVec.theta();
+    u_direction[1] = uVec.phi();
+    
+    float v_direction[2] ;
+    v_direction[0] = vVec.theta();
+    v_direction[1] = vVec.phi();
+    
+    debug() << " U[0] = "<< u_direction[0] << " U[1] = "<< u_direction[1]
+            << " V[0] = "<< v_direction[0] << " V[1] = "<< v_direction[1]
+            << endmsg ;
+    
+    float resU(0), resV(0);
+
+    if (!_parameterize) {
+      if( (_resU.size() > 1 && layer > _resU.size()-1) || (_resV.size() > 1 && layer > _resV.size()-1) ) {
+        fatal() << "layer exceeds resolution vector, please check input parameters ResolutionU and ResolutionV" << endmsg;
+        return StatusCode::FAILURE;
+      }
+
+      resU = ( _resU.size() > 1 ?   _resU.value().at(  layer )     : _resU.value().at(0)   )  ;
+      resV = ( _resV.size() > 1 ?   _resV.value().at(  layer )     : _resV.value().at(0)   )  ; 
+    }
+    else { // Riccardo's parameterized model
+      auto mom = SimTHit.getMomentum();
+      CLHEP::Hep3Vector momVec(mom[0], mom[1], mom[2]);
+      const double alpha = uVec.azimAngle(momVec, vVec);
+      const double cotanAlpha = 1./tan(alpha);
+      // TODO: title angle (PI/2), magnetic field (3) 
+      const double tanLorentzAngle = (side==0) ? 0. : 0.053 * 3 * cos(M_PI/2.);
+      const double x = fabs(-cotanAlpha - tanLorentzAngle);
+      resU = _parU[0] + _parU[1] * x + _parU[2] * exp(-_parU[9] * x) * cos(_parU[3] * x + _parU[4])
+        + _parU[5] * exp(-0.5 * pow(((x - _parU[6]) / _parU[7]), 2)) + _parU[8] * pow(x, 0.5);
+      
+      const double beta = vVec.azimAngle(momVec, uVec);
+      const double cotanBeta = 1./tan(beta);
+      const double y = fabs(-cotanBeta);
+      resV = _parV[0] + _parV[1] * y + _parV[2] * exp(-_parV[9] * y) * cos(_parV[3] * y + _parV[4])
+        + _parV[5] * exp(-0.5 * pow(((y - _parV[6]) / _parV[7]), 2)) + _parV[8] * pow(y, 0.5);
+    }
 
     debug() << " --- will smear hit with resU = " << resU << " and resV = " << resV << endmsg;
 
     auto& pos =  SimTHit.getPosition() ;  
 
-    //edm4hep::Vector3d smearedPos;
-
-    //GearSurfaces::MeasurementSurface* ms = _GEAR->getMeasurementSurfaceStore().GetMeasurementSurface( SimTHit->getCellID0() );
-    
-    gear::MeasurementSurface const* ms = _GEAR->getMeasurementSurfaceStore().GetMeasurementSurface( encoder.lowWord() );;
     CLHEP::Hep3Vector globalPoint(pos[0],pos[1],pos[2]);
     CLHEP::Hep3Vector localPoint = ms->getCoordinateSystem()->getLocalPoint(globalPoint);
     CLHEP::Hep3Vector localPointSmeared = localPoint;
 
-
     debug() << std::setprecision(8) << "Position of hit before smearing global: ( "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<< " ) "
             << "local: ( " << localPoint.x() << " " << localPoint.y() << " " << localPoint.z() << " )" << endmsg;
 
@@ -252,11 +293,13 @@ StatusCode PlanarDigiAlg::execute()
                 << " sensor" << sensor << " : retries " << tries << endmsg;
       }
 
-      localPointSmeared.setX( localPoint.x() + gsl_ran_gaussian(_rng, resU) );
-      localPointSmeared.setY( localPoint.y() + gsl_ran_gaussian(_rng, resV) );
+      double dx = gsl_ran_gaussian(_rng, resU);
+      double dy = gsl_ran_gaussian(_rng, resV);
+      localPointSmeared.setX( localPoint.x() + dx );
+      localPointSmeared.setY( localPoint.y() + dy );
 
       //check if hit is in boundaries
-      if ( ms->isLocalInBoundary( localPointSmeared ) ) {
+      if ( ms->isLocalInBoundary( localPointSmeared ) && fabs(dx)<=_maxPull*resU && fabs(dy)<=_maxPull*resV ) {
         accept_hit = true;
         break;
       }
@@ -281,10 +324,6 @@ StatusCode PlanarDigiAlg::execute()
             << localPointSmeared.x() << " " << localPointSmeared.y() << " " << localPointSmeared.z() << " )"
             << endmsg;
     
-    //smearedPos[0] = globalPointSmeared.x();
-    //smearedPos[1] = globalPointSmeared.y();
-    //smearedPos[2] = globalPointSmeared.z();
-
     //make the TrackerHitPlaneImpl
     auto trkHit = trkhitVec->create();
 
@@ -292,7 +331,7 @@ StatusCode PlanarDigiAlg::execute()
 
     edm4hep::Vector3d smearedPos(globalPointSmeared.x(), globalPointSmeared.y(), globalPointSmeared.z());
     trkHit.setPosition( smearedPos ) ;
-
+    /*
     gear::CartesianCoordinateSystem* cartesian = dynamic_cast< gear::CartesianCoordinateSystem* >( ms->getCoordinateSystem() ); 
     CLHEP::Hep3Vector uVec = cartesian->getLocalXAxis();
     CLHEP::Hep3Vector vVec = cartesian->getLocalYAxis();
@@ -308,6 +347,7 @@ StatusCode PlanarDigiAlg::execute()
     debug() << " U[0] = "<< u_direction[0] << " U[1] = "<< u_direction[1]
             << " V[0] = "<< v_direction[0] << " V[1] = "<< v_direction[1]
             << endmsg ;
+    */
     // fucd: next TODO: cov[0] = resU*reU, cov[2] = resV*resV, cov[5] = 0
     if(_usePlanarTag){
       std::array<float, 6> cov;
@@ -339,7 +379,7 @@ StatusCode PlanarDigiAlg::execute()
         trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ;
     }
     trkHit.setEDep( SimTHit.getEDep() );
-
+    trkHit.setTime( SimTHit.getTime() );
     // make the relation
     auto rel = relCol->create();
 
@@ -374,5 +414,8 @@ StatusCode PlanarDigiAlg::execute()
 StatusCode PlanarDigiAlg::finalize()
 {
   info() << "Processed " << _nEvt << " events " << endmsg;
+
+  if(_rng) gsl_rng_free(_rng);
+
   return GaudiAlgorithm::finalize();
 }
diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
index 10ddd9dd4bc3216348518ea0df14ebe9cb000684..981a171c2a8f6503242f82894db75ff0e8b5735a 100644
--- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
+++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
@@ -82,13 +82,18 @@ protected:
   // whether use Planar tag for type and cov, if true, CEPCConf::TrkHitTypeBit::PLANAR bit is set as true
   // cov[0]=thetaU, cov[1]=phiU, cov[2]=resU, cov[0]=thetaV, cov[1]=phiV, cov[2]=resV
   Gaudi::Property<bool> _usePlanarTag{ this, "UsePlanarTag", true };
+  Gaudi::Property<float> _eThreshold{ this, "EnergyThreshold", 0 };
+  Gaudi::Property<float> _maxPull{ this, "PullCutToRetry", 1000. };
+  Gaudi::Property<bool> _parameterize{ this, "ParameterizeResolution", false};
+  Gaudi::Property<FloatVec> _parU{ this, "ParametersU", {0} };
+  Gaudi::Property<FloatVec> _parV{ this, "ParametersV", {0} };
 
   // Input collections
   DataHandle<edm4hep::EventHeaderCollection> _headerCol{"EventHeaderCol", Gaudi::DataHandle::Reader, this};
   DataHandle<edm4hep::SimTrackerHitCollection> _inColHdl{"VXDCollection", Gaudi::DataHandle::Reader, this};
   // Output collections
   DataHandle<edm4hep::TrackerHitCollection> _outColHdl{"VXDTrackerHits", Gaudi::DataHandle::Writer, this};
-  DataHandle<edm4hep::MCRecoTrackerAssociationCollection> _outRelColHdl{"VTXTrackerHitRelations", Gaudi::DataHandle::Writer, this};
+  DataHandle<edm4hep::MCRecoTrackerAssociationCollection> _outRelColHdl{"VXDTrackerHitRelations", Gaudi::DataHandle::Writer, this};
 };
 
 #endif
diff --git a/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp b/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp
index 44f43fc77144d3467a795c195a7da9bbba1e13f9..c6057e548414e27ed26ac1c683964a15bb497c60 100644
--- a/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp
+++ b/Digitisers/SimpleDigi/src/TPCDigiAlg.cpp
@@ -590,7 +590,7 @@ StatusCode TPCDigiAlg::execute()
       if(mcp.isAvailable()){
 
         // get the pt of the MCParticle, this will used later to uses nominal smearing for low momentum rubish
-        const edm4hep::Vector3f momentumMC= mcp.getMomentum() ;
+        const auto& momentumMC= mcp.getMomentum() ;
         ptSqrdMC = momentumMC[0]*momentumMC[0]+momentumMC[1]*momentumMC[1] ;
         
         debug() << " mcp id = " << mcp.id() 
@@ -1057,7 +1057,7 @@ StatusCode TPCDigiAlg::execute()
         auto mcp = (_tpcHitMap[ seed_hit ]).getMCParticle() ;
         if(mcp.isAvailable()) {
           ++_NLostPhysicsTPCHits;
-          const edm4hep::Vector3f mom= mcp.getMomentum() ;
+          const auto& mom= mcp.getMomentum() ;
           double ptSQRD = mom[0]*mom[0]+mom[1]*mom[1] ;
           if( ptSQRD > (0.2*0.2) ) ++_NLostPhysicsAbove02GeVPtTPCHits ;
           if( ptSQRD > 1.0 )  ++_NLostPhysicsAbove1GeVPtTPCHits ;
diff --git a/Examples/options/LCIO_read.py b/Examples/options/LCIO_read.py
index 8beafb9314a4fbf300b567ded81cecd3d8204715..f0d34348140c2660f5b1e636687ada049c0cf19b 100644
--- a/Examples/options/LCIO_read.py
+++ b/Examples/options/LCIO_read.py
@@ -1,61 +1,58 @@
 #!/usr/bin/env python
 
 from Gaudi.Configuration import *
+from Configurables import k4DataSvc
+dsvc = k4DataSvc("EventDataSvc")
 
-from Configurables import LCIODataSvc, CEPCDataSvc
-
-svcname = "LCIODataSvc"
-rsvc = LCIODataSvc(svcname, inputs = [
-"/cefs/data/FullSim/CEPC240/CEPC_v4/higgs/smart_final_states/E240.Pffh_invi.e0.p0.whizard195//ffh_inv.e0.p0.00001_1000_sim.slcio"
-])
-
-wsvc = CEPCDataSvc("EventDataSvc")
-
-from Configurables import PlcioReadAlg
-alg = PlcioReadAlg("PlcioReadAlg")
-alg.InputCol.Path = "MCParticle"
-alg.HeaderCol.Path = "EventHeader"
-
+# read LCIO files
 from Configurables import LCIOInput
-lcioinput = LCIOInput("LCIOReader", collections=[
-    "EventHeader",
-    "MCParticle",
-    "TPCCollection"
-    #"EventHeader",
-    #"MCParticle",
-    #"COILCollection",
-    #"EcalBarrelSiliconCollection",
-    #"EcalBarrelSiliconPreShowerCollection",
-    #"EcalEndcapRingCollection",
-    #"EcalEndcapRingPreShowerCollection",
-    #"EcalEndcapSiliconCollection",
-    #"EcalEndcapSiliconPreShowerCollection",
-    #"FTD_PIXELCollection",
-    #"FTD_STRIPCollection",
-    #"HcalBarrelCollection",
-    #"HcalEndCapRingsCollection",
-    #"HcalEndCapsCollection",
-    #"LumiCalCollection",
-    #"MuonBarrelCollection",
-    #"MuonEndCapCollection",
-    #"SETCollection",
-    #"SITCollection",
-    #"TPCCollection",
-    #"TPCSpacePointCollection",
-    #"VXDCollection"
-    ])
-lcioinput.DataSvc = svcname
+read = LCIOInput("read")
+read.inputs = [
+"/cefs/data/FullSim/CEPC240/CEPC_v4/higgs/smart_final_states/E240.Pffh_invi.e0.p0.whizard195/ffh_inv.e0.p0.00001_1000_sim.slcio"
+]
+read.collections = [
+        "MCParticle:MCParticle",
+        "SimCalorimeterHit:EcalBarrelSiliconCollection",
+        #"CalorimeterHit:ECALBarrel",
+        #"CalorimeterHit:ECALEndcap",
+        #"CalorimeterHit:ECALOther" ,
+        ########## HCAL will effect the reco efficiency close to gap region ######
+        #"CalorimeterHit:HCALBarrel",
+        #"CalorimeterHit:HCALEndcap",
+        #"CalorimeterHit:HCALOther",
+        ##"TrackerHit:VXDTrackerHits",
+        ##"TrackerHit:SITTrackerHits",
+        #"TrackerHit:SITSpacePoints",
+        #"TrackerHit:TPCTrackerHits",
+        ##"TrackerHit:SETTrackerHits",
+        #"TrackerHit:SETSpacePoints",
+        ##"TrackerHit:FTDStripTrackerHits",
+        #"TrackerHit:FTDSpacePoints",
+        ##"TrackerHit:FTDPixelTrackerHits",
+        #"Track:ClupatraTrackSegments", 
+        #"Track:ClupatraTracks", 
+        #"Track:ForwardTracks", 
+        #"Track:SiTracks", 
+        #"Track:SubsetTracks",
+        #"Track:MarlinTrkTracks", 
+        #"Vertex:KinkVertices",
+        #"Vertex:ProngVertices",
+        #"Vertex:V0Vertices",
+        #"ReconstructedParticle:KinkRecoParticles",
+        #"ReconstructedParticle:ProngRecoParticles",
+        #"ReconstructedParticle:V0RecoParticles"
+]
 
 from Configurables import PodioOutput
-plcioout = PodioOutput("PlcioWriter")
-plcioout.filename = "lcio2plcio.root"
-plcioout.outputCommands = ["keep *"]
+write = PodioOutput("write")
+write.filename = "lcio2plcio.root"
+write.outputCommands = ["keep *"]
 
 # ApplicationMgr
 from Configurables import ApplicationMgr
-ApplicationMgr( TopAlg = [lcioinput, alg, plcioout],
+ApplicationMgr( TopAlg = [read, write],
                 EvtSel = 'NONE',
                 EvtMax = 10,
-                ExtSvc = [rsvc, wsvc],
+                ExtSvc = [dsvc],
                 OutputLevel=DEBUG
 )
diff --git a/Examples/options/dump_simhit.py b/Examples/options/dump_simhit.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c699b7a4f98ca5860e6f7a77763f2c91e16eb07
--- /dev/null
+++ b/Examples/options/dump_simhit.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+from Gaudi.Configuration import *
+
+##############################################################################
+# Geometry Svc
+##############################################################################
+
+# geometry_option = "CepC_v4-onlyTracker.xml"
+# geometry_option = "CepC_v4-onlyVXD.xml"
+geometry_option = "CepC_v4.xml"
+
+if not os.getenv("DETCEPCV4ROOT"):
+    print("Can't find the geometry. Please setup envvar DETCEPCV4ROOT." )
+    sys.exit(-1)
+
+geometry_path = os.path.join(os.getenv("DETCEPCV4ROOT"), "compact", geometry_option)
+if not os.path.exists(geometry_path):
+    print("Can't find the compact geometry file: %s"%geometry_path)
+    sys.exit(-1)
+
+from Configurables import GeomSvc
+geosvc = GeomSvc("GeomSvc")
+geosvc.compact = geometry_path
+
+##############################################################################
+# Event Data Svc
+##############################################################################
+
+from Configurables import k4DataSvc
+dsvc = k4DataSvc("EventDataSvc", input="test-detsim10.root")
+
+##############################################################################
+# NTuple Svc
+##############################################################################
+
+from Configurables import NTupleSvc
+ntsvc = NTupleSvc("NTupleSvc")
+ntsvc.Output = ["MyTuples DATAFILE='result.root' OPT='NEW' TYP='ROOT'"]
+
+##############################################################################
+# DumpAlg
+##############################################################################
+
+from Configurables import DumpSimHitAlg
+alg = DumpSimHitAlg("DumpSimHitAlg")
+
+from Configurables import PodioInput
+podioinput = PodioInput("PodioReader", collections=[
+        "MCParticle",
+        "VXDCollection"
+    ])
+
+# ApplicationMgr
+from Configurables import ApplicationMgr
+ApplicationMgr( TopAlg = [podioinput, alg],
+                EvtSel = 'NONE',
+                EvtMax = -1,
+                ExtSvc = [dsvc, ntsvc],
+                HistogramPersistency = "ROOT",
+                # OutputLevel=DEBUG
+)
diff --git a/Examples/options/dumpid.py b/Examples/options/dumpid.py
index e8ce40f764767539d876251695f7999c5640c3b8..ef9a45ce18c6fbb86fb1dc8ed2dc79f4cf32dc88 100644
--- a/Examples/options/dumpid.py
+++ b/Examples/options/dumpid.py
@@ -9,7 +9,7 @@ from Gaudi.Configuration import *
 # geometry_option = "CepC_v4-onlyTracker.xml"
 # geometry_option = "CepC_v4-onlyVXD.xml"
 geometry_option = "CepC_v4-onlyECAL.xml"
-
+import os
 if not os.getenv("DETCEPCV4ROOT"):
     print("Can't find the geometry. Please setup envvar DETCEPCV4ROOT." )
     sys.exit(-1)
diff --git a/Examples/options/sim-rec-trackerecal.py b/Examples/options/sim-rec-trackerecal.py
index 1117e414ab57dbc65ee71160ee28c5d3ca61af95..49e79a931fdc1350f51dd89de6f88fcc9700a78b 100644
--- a/Examples/options/sim-rec-trackerecal.py
+++ b/Examples/options/sim-rec-trackerecal.py
@@ -2,6 +2,8 @@
 
 from Gaudi.Configuration import *
 
+import os
+
 NTupleSvc().Output = ["MyTuples DATAFILE='sim-rec-trackerEcal.root' OPT='NEW' TYP='ROOT'"]
 
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
@@ -79,7 +81,7 @@ tpc_sensdettool.TypeOption = 1
 
 from Configurables import GearSvc
 gearsvc = GearSvc("GearSvc")
-gearsvc.GearXMLFile = "Detector/DetCEPCv4/compact/FullDetGear.xml"
+#gearsvc.GearXMLFile = "Detector/DetCEPCv4/compact/FullDetGear.xml"
 
 from Configurables import TrackSystemSvc
 tracksystemsvc = TrackSystemSvc("TrackSystemSvc")
@@ -331,7 +333,7 @@ ApplicationMgr(
     TopAlg = [genalg, detsimalg, digiVXD, digiSIT, digiSET, digiFTD, spSIT, spFTD, digiTPC, clupatra, tracking, forward, subset, full, simHitMerge, caloDigi, pandoralg, write],
     EvtSel = 'NONE',
     EvtMax = 10,
-    ExtSvc = [rndmengine, dsvc, evtseeder, gearsvc, geosvc, tracksystemsvc],
+    ExtSvc = [rndmengine, dsvc, evtseeder, geosvc, gearsvc, tracksystemsvc],
     HistogramPersistency='ROOT',
     OutputLevel=INFO
 )
diff --git a/Examples/options/tut_detsim_SDT_Heed.py b/Examples/options/tut_detsim_SDT_Heed.py
new file mode 100644
index 0000000000000000000000000000000000000000..d994ae61418c40c14afcd40640223c872ba810c9
--- /dev/null
+++ b/Examples/options/tut_detsim_SDT_Heed.py
@@ -0,0 +1,206 @@
+#!/usr/bin/env python
+
+import os
+import sys
+# sys.exit(0)
+
+from Gaudi.Configuration import *
+
+##############################################################################
+# Random Number Svc
+##############################################################################
+from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
+
+seed = [42]
+
+# rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
+rndmengine.SetSingleton = True
+rndmengine.Seeds = seed
+
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
+
+
+##############################################################################
+# Event Data Svc
+##############################################################################
+from Configurables import k4DataSvc
+dsvc = k4DataSvc("EventDataSvc")
+
+
+##############################################################################
+# Geometry Svc
+##############################################################################
+
+# geometry_option = "CepC_v4-onlyTracker.xml"
+geometry_option = "det.xml"
+#geometry_option = "CepC_v4.xml"
+det_root = "DETDRIFTCHAMBERROOT"
+#det_root = "DETCEPCV4ROOT"#"DETDRIFTCHAMBERROOT"
+if not os.getenv(det_root):
+    print("Can't find the geometry. Please setup envvar %s."%det_root )
+    sys.exit(-1)
+
+geometry_path = os.path.join(os.getenv(det_root), "compact", geometry_option)
+if not os.path.exists(geometry_path):
+    print("Can't find the compact geometry file: %s"%geometry_path)
+    sys.exit(-1)
+
+from Configurables import GeomSvc
+geosvc = GeomSvc("GeomSvc")
+print('geometry_path=',geometry_path)
+geosvc.compact = geometry_path
+
+##############################################################################
+# Physics Generator
+##############################################################################
+from Configurables import GenAlgo
+from Configurables import GtGunTool
+from Configurables import StdHepRdr
+from Configurables import SLCIORdr
+from Configurables import HepMCRdr
+from Configurables import GenPrinter
+
+gun = GtGunTool("GtGunTool")
+# gun.Particles = ["pi+"]
+# gun.EnergyMins = [100.] # GeV
+# gun.EnergyMaxs = [100.] # GeV
+
+gun.Particles = ["e-"]
+
+# gun.PositionXs = [100.] # mm
+# gun.PositionYs = [100.] # mm
+# gun.PositionZs = [0.] # mm
+
+
+gun.EnergyMins = [10] # GeV
+gun.EnergyMaxs = [10] # GeV
+
+gun.ThetaMins = [80] # rad; 45deg
+gun.ThetaMaxs = [90.] # rad; 45deg
+
+gun.PhiMins = [0] # rad; 0deg
+gun.PhiMaxs = [360.] # rad; 360deg
+
+# stdheprdr = StdHepRdr("StdHepRdr")
+# stdheprdr.Input = "/cefs/data/stdhep/CEPC250/2fermions/E250.Pbhabha.e0.p0.whizard195/bhabha.e0.p0.00001.stdhep"
+
+# lciordr = SLCIORdr("SLCIORdr")
+# lciordr.Input = "/cefs/data/stdhep/lcio250/signal/Higgs/E250.Pbbh.whizard195/E250.Pbbh_X.e0.p0.whizard195/Pbbh_X.e0.p0.00001.slcio"
+
+# hepmcrdr = HepMCRdr("HepMCRdr")
+# hepmcrdr.Input = "example_UsingIterators.txt"
+
+genprinter = GenPrinter("GenPrinter")
+
+genalg = GenAlgo("GenAlgo")
+genalg.GenTools = ["GtGunTool"]
+# genalg.GenTools = ["StdHepRdr"]
+# genalg.GenTools = ["StdHepRdr", "GenPrinter"]
+# genalg.GenTools = ["SLCIORdr", "GenPrinter"]
+# genalg.GenTools = ["HepMCRdr", "GenPrinter"]
+
+##############################################################################
+# Detector Simulation
+##############################################################################
+from Configurables import DetSimSvc
+
+detsimsvc = DetSimSvc("DetSimSvc")
+
+# from Configurables import ExampleAnaElemTool
+# example_anatool = ExampleAnaElemTool("ExampleAnaElemTool")
+
+from Configurables import DetSimAlg
+
+detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
+
+if int(os.environ.get("VIS", 0)):
+    detsimalg.VisMacs = ["vis.mac"]
+
+detsimalg.RunCmds = [
+#    "/tracking/verbose 1",
+]
+
+from Configurables import DummyFastSimG4Tool
+dummy_fastsim_tool = DummyFastSimG4Tool("DummyFastSimG4Tool")
+
+detsimalg.FastSimG4Tools = [
+#    "DummyFastSimG4Tool"
+]
+
+detsimalg.AnaElems = [
+    # example_anatool.name()
+    # "ExampleAnaElemTool"
+    "Edm4hepWriterAnaElemTool"
+]
+detsimalg.RootDetElem = "WorldDetElemTool"
+
+from Configurables import AnExampleDetElemTool
+example_dettool = AnExampleDetElemTool("AnExampleDetElemTool")
+
+from Configurables import CalorimeterSensDetTool
+from Configurables import DriftChamberSensDetTool
+
+calo_sensdettool = CalorimeterSensDetTool("CalorimeterSensDetTool")
+driftchamber_sensdettool = DriftChamberSensDetTool("DriftChamberSensDetTool")
+
+#dedxoption = "DummyDedxSimTool"
+#dedxoption = "BetheBlochEquationDedxSimTool"
+dedxoption = "TrackHeedSimTool"
+
+driftchamber_sensdettool.DedxSimTool = dedxoption
+
+from Configurables import DummyDedxSimTool
+from Configurables import BetheBlochEquationDedxSimTool
+from Configurables import TrackHeedSimTool
+
+if dedxoption == "DummyDedxSimTool":
+    dedx_simtool = DummyDedxSimTool("DummyDedxSimTool")
+elif dedxoption == "BetheBlochEquationDedxSimTool":
+    dedx_simtool = BetheBlochEquationDedxSimTool("BetheBlochEquationDedxSimTool")
+    dedx_simtool.material_Z = 2
+    dedx_simtool.material_A = 4
+    dedx_simtool.scale = 10
+    dedx_simtool.resolution = 0.0001
+elif dedxoption == "TrackHeedSimTool":
+    dedx_simtool = TrackHeedSimTool("TrackHeedSimTool")
+    dedx_simtool.only_primary = False#True
+    dedx_simtool.use_max_step = True#True
+    dedx_simtool.max_step = 1#mm
+    #dedx_simtool.he   = 50
+    #dedx_simtool.isob = 50
+    #dedx_simtool.gas_file ="/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/He_50_isobutane_50.gas" 
+    dedx_simtool.he   = 90
+    dedx_simtool.isob = 10
+    #dedx_simtool.gas_file ="/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/he_90_isobutane_10.gas" 
+    #dedx_simtool.IonMobility_file ="/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/IonMobility_He+_He.txt" 
+    dedx_simtool.gas_file         ="he_90_isobutane_10.gas"
+    dedx_simtool.IonMobility_file ="IonMobility_He+_He.txt"
+    dedx_simtool.save_mc = True
+    dedx_simtool.debug = False
+    dedx_simtool.sim_pulse = True
+    #dedx_simtool.model='/junofs/users/wxfang/MyGit/tmp/fork_cepcsw_20220418/CEPCSW/Digitisers/SimCurrentONNX/src/model_90He10C4H10_18mm.onnx'
+    dedx_simtool.model='model_90He10C4H10_18mm.onnx'
+    dedx_simtool.batchsize = 100
+
+##############################################################################
+# POD I/O
+##############################################################################
+from Configurables import PodioOutput
+out = PodioOutput("outputalg")
+out.filename = "detsim_heed.root"
+out.outputCommands = ["keep *"]
+
+##############################################################################
+# ApplicationMgr
+##############################################################################
+
+from Configurables import ApplicationMgr
+ApplicationMgr( TopAlg = [genalg, detsimalg, out],
+                EvtSel = 'NONE',
+                EvtMax = 20,
+                ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc],
+                OutputLevel=INFO
+)
diff --git a/Generator/CMakeLists.txt b/Generator/CMakeLists.txt
index 6169e415c23b9ec0ea47b9458f8b436a4194932c..e3f20777700086d01008e78756ec53a5bd1cafc9 100644
--- a/Generator/CMakeLists.txt
+++ b/Generator/CMakeLists.txt
@@ -10,14 +10,15 @@ gaudi_add_module(GenAlgo
                          src/GenReader.cpp 
                          src/StdHepRdr.cpp 
                          src/GenPrinter.cpp
-                         # src/LCAscHepRdr.cc
-                         # src/HepevtRdr.cpp
+                         src/LCAscHepRdr.cc
+                         src/HepevtRdr.cpp
                          src/SLCIORdr.cpp
                          src/HepMCRdr.cpp
                          src/GtGunTool.cpp
                          # ------- Beam Background -------
                          src/GtBeamBackgroundTool.cpp
                          src/BeamBackgroundFileParserV0.cpp
+                         src/GuineaPigPairsFileParser.cpp
                  LINK ${ROOT_LIBRARIES}
                       k4FWCore::k4FWCore 
                       Gaudi::GaudiAlgLib
diff --git a/Generator/src/GenAlgo.cpp b/Generator/src/GenAlgo.cpp
index 58f9d4e8b438085a5322e565f778506830e7ec14..2d8ec8972668e5565960654176bd71d3d11d870c 100644
--- a/Generator/src/GenAlgo.cpp
+++ b/Generator/src/GenAlgo.cpp
@@ -13,19 +13,12 @@
 
 #include "IGenTool.h"
 #include "GenEvent.h"
-// #include "StdHepRdr.h"
-// #include "HepevtRdr.h"// not correct still
-// #include "SLCIORdr.h"
-// #include "HepMCRdr.h"
-// #include "GenPrinter.h"
-// #include "GenWriter.h"
 
-using namespace std;
 
 DECLARE_COMPONENT(GenAlgo)
 
 GenAlgo::GenAlgo(const std::string& name, ISvcLocator* pSvcLocator): GaudiAlgorithm(name, pSvcLocator) {
-    declareProperty("MCParticle", m_hdl, "MCParticle collection (output)");
+    declareProperty("MCParticleGen", m_hdl, "MCParticle collection (at Generator phase)");
     declareProperty("GenTools", m_genToolNames, "List of GenTools");
     m_evtid = 0;
 
@@ -42,25 +35,6 @@ GenAlgo::initialize() {
         m_genTools.push_back(gtname);
     }
     
-    // cout << "initialize start" << endl; 
-    // string generatorName = m_input_file.value();
-    // string outputName    = m_output_file.value();
-    // string format        = m_input_format.value();
-    // IGenTool* gen_reader;
-    // if(format=="stdhep") gen_reader  = new StdHepRdr(generatorName);    
-    // else if(format=="slcio") gen_reader  = new SLCIORdr(generatorName);    
-    // else if(format=="hepmc") gen_reader  = new HepMCRdr(generatorName);    
-    // else{cout << "Error : unsupport format for generator input file" << endl; return StatusCode::FAILURE; }
-    // //IGenTool* gen_reader  = new HepevtRdr(generatorName);    
-    // m_genTools.push_back(gen_reader);
-    // if(m_print.value()) {
-    //     IGenTool* gen_printer = new GenPrinter(generatorName);    
-    //     m_genTools.push_back(gen_printer);
-    // }
-    //IGenTool* gen_writer  = new GenWriter (outputName);    
-    //m_genTools.push_back(gen_writer);
-
-    // cout << "initialize done" << endl; 
     return StatusCode::SUCCESS;
 
 }
@@ -74,16 +48,16 @@ GenAlgo::execute() {
     for(auto gentool: m_genTools) {
         if (gentool->mutate(m_event)) {} 
         else {
-            cout << "Have read all events, stop now." << endl; 
+            warning() << "Have read all events, stop now." << endmsg; 
             auto ep = serviceLocator()->as<IEventProcessor>();
             if ( !ep ) {
-            error() << "Cannot get IEventProcessor" << endmsg;
-            return StatusCode::FAILURE;
+                error() << "Cannot get IEventProcessor" << endmsg;
+                return StatusCode::FAILURE;
             }
             ep->stopRun();
             return StatusCode::SUCCESS;
             
-             }
+        }
     }
 
     return StatusCode::SUCCESS;
@@ -92,10 +66,5 @@ GenAlgo::execute() {
 
 StatusCode
 GenAlgo::finalize() {
-    // cout << "finalize" << endl; 
-    // for(auto gentool: m_genTools) {
-    //     if (gentool->finish()) {} 
-    //     else {cout << "finish Failed" << endl; return StatusCode::FAILURE; }
-    // }
     return StatusCode::SUCCESS;
 }
diff --git a/Generator/src/GenAlgo.h b/Generator/src/GenAlgo.h
index 2eb6ac616f0a54f9acca641d197016b0fadf6b1f..2fa42bfa2af8eb4e9615ec3663fff798083373bf 100644
--- a/Generator/src/GenAlgo.h
+++ b/Generator/src/GenAlgo.h
@@ -12,12 +12,6 @@
 #include "GenEvent.h"
 
 class IGenTool;
-namespace plcio {
-    class MCParticleCollection;
-}
-
-
-using namespace std;
 
 class GenAlgo: public GaudiAlgorithm {
 
@@ -42,7 +36,7 @@ private:
     int m_evtid;                               
     int m_evtMax;
     //MyHepMC::GenEvent m_event;
-    DataHandle<edm4hep::MCParticleCollection> m_hdl{"MCParticle", Gaudi::DataHandle::Writer, this};
+    DataHandle<edm4hep::MCParticleCollection> m_hdl{"MCParticleGen", Gaudi::DataHandle::Writer, this};
 
 
 };
diff --git a/Generator/src/GenPrinter.cpp b/Generator/src/GenPrinter.cpp
index 48c6d499451ec24b1eb9b0874b971cdc0678f3b2..359f26dee192363cb2f5410332fd527577a1d640 100644
--- a/Generator/src/GenPrinter.cpp
+++ b/Generator/src/GenPrinter.cpp
@@ -4,28 +4,48 @@
 DECLARE_COMPONENT(GenPrinter)
 
 bool GenPrinter::mutate(MyHepMC::GenEvent& event){
+    auto msglevel = msgLevel();
+
+    // only print when current msglevel is MSG::DEBUG/VERBOSE
+    if (msglevel != MSG::NIL && msglevel != MSG::VERBOSE && msglevel != MSG::DEBUG) {
+        return true;
+    }
+
     std::cout << "print mc info for event "<< event.getID() << ", mc size ="<< event.m_mc_vec.size() <<  std::endl;
     for ( int i =0; i < event.m_mc_vec.size(); i++ ) {
-    auto p = event.m_mc_vec.at(i); 
-    std::cout<< "PDG      :"<< p.getPDG               ()<<std::endl 
-    << "id                :"<< p.id                   ()<<std::endl 
-    << "ID                :"<< p.getObjectID().index    <<std::endl 
-    << "GeneratorStatus   :"<< p.getGeneratorStatus   ()<<std::endl 
-    << "SimulatorStatus   :"<< p.getSimulatorStatus   ()<<std::endl 
-    << "Charge            :"<< p.getCharge            ()<<std::endl 
-    << "Time              :"<< p.getTime              ()<<std::endl 
-    << "Mass              :"<< p.getMass              ()<<std::endl 
-    << "Vertex            :"<< p.getVertex            ()<<std::endl 
-    << "Endpoint          :"<< p.getEndpoint          ()<<std::endl 
-    << "Momentum          :"<< p.getMomentum          ()<<std::endl 
-    << "MomentumAtEndpoint:"<< p.getMomentumAtEndpoint()<<std::endl 
-    << "Spin              :"<< p.getSpin              ()<<std::endl 
-    << "ColorFlow         :"<< p.getColorFlow         ()<<std::endl 
-    << "Parent size       :"<< p.parents_size         ()<<std::endl 
-    << "Daughter size     :"<< p.daughters_size       ()<<std::endl; 
-    //for(unsigned int j=0; j<p.parents_size(); j++) std::cout << " for parent: "<< j << ",PDG="<< p.getParents(j).getPDG() << ",id=:"<< p.getParents(j).id()<<std::endl;
-    for (auto it = p.parents_begin(), end = p.parents_end(); it != end ; ++it ) std::cout << " for parent ,PDG="<< it->getPDG() << ",id=:"<< it->getObjectID().index<<std::endl;
+        auto p = event.m_mc_vec.at(i); 
+        std::cout<< "PDG               :"<< p.getPDG               ()<<std::endl 
+                 << "id                :"<< p.id                   ()<<std::endl 
+                 << "ID                :"<< p.getObjectID().index    <<std::endl 
+                 << "GeneratorStatus   :"<< p.getGeneratorStatus   ()<<std::endl 
+                 << "SimulatorStatus   :"<< p.getSimulatorStatus   ()<<std::endl 
+                 << "Charge            :"<< p.getCharge            ()<<std::endl 
+                 << "Time              :"<< p.getTime              ()<<std::endl 
+                 << "Mass              :"<< p.getMass              ()<<std::endl 
+                 << "Vertex            :"<< p.getVertex            ()<<std::endl 
+                 << "Endpoint          :"<< p.getEndpoint          ()<<std::endl 
+                 << "Momentum          :"<< p.getMomentum          ()<<std::endl 
+                 << "MomentumAtEndpoint:"<< p.getMomentumAtEndpoint()<<std::endl 
+                 << "Spin              :"<< p.getSpin              ()<<std::endl 
+                 << "ColorFlow         :"<< p.getColorFlow         ()<<std::endl 
+                 << "Parent size       :"<< p.parents_size         ()<<std::endl 
+                 << "Daughter size     :"<< p.daughters_size       ()<<std::endl; 
+        //for(unsigned int j=0; j<p.parents_size(); j++) std::cout << " for parent: "<< j << ",PDG="<< p.getParents(j).getPDG() << ",id=:"<< p.getParents(j).id()<<std::endl;
+        for (auto it = p.parents_begin(), end = p.parents_end(); it != end ; ++it ) {
+            std::cout << " - parent, PDG=" << it->getPDG() 
+                      << ", id=" << it->id()
+                      << ", ID=" << it->getObjectID().index
+                      << std::endl;
+        }
+
+        for (auto it = p.daughters_begin(), end = p.daughters_end(); it != end ; ++it ) {
+            std::cout << " - daughter, PDG=" << it->getPDG() 
+                      << ", id=" << it->id()
+                      << ", ID=" << it->getObjectID().index
+                      << std::endl;
+        }
     }
+
     return true;
 }
 
diff --git a/Generator/src/GenWriter.cpp b/Generator/src/GenWriter.cpp
deleted file mode 100644
index f1f93a571dabc98f710c660754ae6507248c0212..0000000000000000000000000000000000000000
--- a/Generator/src/GenWriter.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "GenWriter.h"
-#include "GenEvent.h"
-
-#include "podio/EventStore.h" //podio
-#include "podio/ROOTWriter.h"
-
-
-#include "plcio/MCParticleCollection.h"//plico
-#include "plcio/EventHeaderCollection.h"
-
-
-GenWriter::GenWriter(string name){
-    m_output_name = name;
-    store  = new podio::EventStore();
-    writer = new podio::ROOTWriter(m_output_name, store);
-    ehc   =  &store->create<plcio::EventHeaderCollection>("EvtHeaders");
-    mcc   =  &store->create<plcio::MCParticleCollection>("MCParticles");
-
-    writer->registerForWrite("EvtHeaders");
-    writer->registerForWrite("MCParticles");
-}
-
-GenWriter::~GenWriter(){
-}
-
-bool GenWriter::mutate(MyHepMC::GenEvent& event){
-    std::cout << "write mc info for event "<< event.getID() << ", mc size ="<< event.m_mc_vec.size() <<  std::endl;
-    mcc=&event.m_mc_vec;
-    auto header = plcio::EventHeader(event.getID(), event.getRun(), event.getTime(), event.getName());
-    ehc->push_back(header);
-    writer->writeEvent();
-    store->clearCollections();
-    return true;
-}
-
-bool GenWriter::configure(){
-return true;
-}
-
-bool GenWriter::finish(){
-    writer->finish();
-    std::cout<<"Saved root "<<m_output_name<<std::endl;
-    return true;
-}
diff --git a/Generator/src/GenWriter.h b/Generator/src/GenWriter.h
deleted file mode 100644
index 30e6db4365343c44f0f7de97781774f0e5700db3..0000000000000000000000000000000000000000
--- a/Generator/src/GenWriter.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef GenWriter_h
-#define GenWriter_h 1
-
-#include "GenEvent.h"
-#include "IGenTool.h"
-
-#include "podio/EventStore.h" //podio
-#include "podio/ROOTWriter.h"
-
-
-#include "plcio/MCParticleCollection.h"//plico
-#include "plcio/EventHeaderCollection.h"
-
-
-
-using namespace std;
-
-class GenWriter: public IGenTool{
-
-    public:
-        GenWriter(string name);
-        ~GenWriter();
-        bool configure() override;               
-        bool mutate(MyHepMC::GenEvent& event) override;    
-        bool finish() override;
-    private:
-        string m_output_name;
-        podio::EventStore* store ;
-        podio::ROOTWriter* writer;
-        plcio::EventHeaderCollection*  ehc  ;
-        plcio::MCParticleCollection*   mcc  ;
-
-};
-
-#endif
diff --git a/Generator/src/GtBeamBackgroundTool.cpp b/Generator/src/GtBeamBackgroundTool.cpp
index 1fe4797b5e42b8ded7f5a049e5d938ecd7e4acd6..fba5b0b4da7c995d8c09ceb7581cfdbf9de79ba0 100644
--- a/Generator/src/GtBeamBackgroundTool.cpp
+++ b/Generator/src/GtBeamBackgroundTool.cpp
@@ -1,6 +1,8 @@
 #include "GtBeamBackgroundTool.h"
 #include "IBeamBackgroundFileParser.h"
+
 #include "BeamBackgroundFileParserV0.h"
+#include "GuineaPigPairsFileParser.h"
 
 #include "TVector3.h" // for rotation
 DECLARE_COMPONENT(GtBeamBackgroundTool)
@@ -11,17 +13,21 @@ StatusCode GtBeamBackgroundTool::initialize() {
     // create the instances of the background parsers
 
     for (auto& [label, inputfn]: m_inputmaps) {
-        double beamE = 120.;
-        auto itBeamE = m_Ebeammaps.find(label);
-        if (itBeamE != m_Ebeammaps.end()) {
-            beamE = itBeamE->second;
+        std::string format = "BeamBackgroundFileParserV0";
+
+        auto itFormat = m_formatmaps.find(label);
+        if (itFormat != m_formatmaps.end()) {
+            format = itFormat->second;
+        }
+
+        if (format == "BeamBackgroundFileParserV0") {
+            init_BeamBackgroundFileParserV0(label, inputfn);
+        } else if (format == "GuineaPigPairsFileParser") {
+            init_GuineaPigPairsFileParser(label, inputfn);
+        } else {
+            init_BeamBackgroundFileParserV0(label, inputfn);
         }
-        info() << "Initializing beam background ... "
-               << label << " "
-               << beamE << " "
-               << inputfn
-               << endmsg;
-        m_beaminputs[label] = std::make_shared<BeamBackgroundFileParserV0>(inputfn, 11, beamE);
+        
     }
 
     // check the size
@@ -89,3 +95,28 @@ bool GtBeamBackgroundTool::configure_gentool() {
 
     return true;
 }
+
+bool GtBeamBackgroundTool::init_BeamBackgroundFileParserV0(const std::string& label,
+                                                           const std::string& inputfn) {
+    double beamE = 120.;
+    auto itBeamE = m_Ebeammaps.find(label);
+    if (itBeamE != m_Ebeammaps.end()) {
+        beamE = itBeamE->second;
+    }
+    info() << "Initializing beam background ... "
+           << label << " "
+           << beamE << " "
+           << inputfn
+           << endmsg;
+    m_beaminputs[label] = std::make_shared<BeamBackgroundFileParserV0>(inputfn, 11, beamE);
+
+    return true;
+}
+
+bool GtBeamBackgroundTool::init_GuineaPigPairsFileParser(const std::string& label,
+                                                         const std::string& inputfn) {
+
+    m_beaminputs[label] = std::make_shared<GuineaPigPairsFileParser>(inputfn);
+
+    return true;
+}
diff --git a/Generator/src/GtBeamBackgroundTool.h b/Generator/src/GtBeamBackgroundTool.h
index 8e0af8e5777a834e7b42f441f2de5e8766e463bc..632f3851fea0e8468d53d9e63ccc42ad34b65dff 100644
--- a/Generator/src/GtBeamBackgroundTool.h
+++ b/Generator/src/GtBeamBackgroundTool.h
@@ -46,9 +46,14 @@ public:
     bool finish() override;
     bool configure_gentool() override;
 
+
+private:
+    bool init_BeamBackgroundFileParserV0(const std::string& label, const std::string& inputfn);
+    bool init_GuineaPigPairsFileParser(const std::string& label, const std::string& inputfn);
+
 private:
     Gaudi::Property<std::map<std::string, std::string>> m_inputmaps{this, "InputFileMap"};
-    Gaudi::Property<std::map<std::string, std::string>> m_fomatmaps{this, "InputFormatMap"};
+    Gaudi::Property<std::map<std::string, std::string>> m_formatmaps{this, "InputFormatMap"};
     Gaudi::Property<std::map<std::string, double>>      m_ratemaps {this, "InputRateMap"};
 
     // unit of beam energy: GeV
diff --git a/Generator/src/GtGunTool.cpp b/Generator/src/GtGunTool.cpp
index af2a98dd9fe5397312b31701cdb92c4cb1eb48a7..7f9b56a3a13c63d0f0b41ce9212b9e89371eace0 100644
--- a/Generator/src/GtGunTool.cpp
+++ b/Generator/src/GtGunTool.cpp
@@ -32,6 +32,39 @@ GtGunTool::initialize() {
         error() << "Mismatched PositionZs and particles." << endmsg;
         return StatusCode::FAILURE;
     }
+
+
+    if (m_posZmins.value().size()
+        && m_posZmins.value().size() != m_particles.value().size()) {
+        error() << "Mismatched PosZmins and particles." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    if (m_posZmaxs.value().size()
+        && m_posZmaxs.value().size() != m_particles.value().size()) {
+        error() << "Mismatched PosZmaxs and particles." << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    if (m_posZmins.value().size() != m_posZmaxs.value().size()) {
+        error() << "Mismatched PosZmins and PosZmaxs." << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    if (m_posRmins.value().size()
+        && m_posRmins.value().size() != m_particles.value().size()) {
+        error() << "Mismatched PosRmins and particles." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    if (m_posRmaxs.value().size()
+        && m_posRmaxs.value().size() != m_particles.value().size()) {
+        error() << "Mismatched PosRmaxs and particles." << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    if (m_posRmins.value().size() != m_posRmaxs.value().size()) {
+        error() << "Mismatched PosRmins and PosRmaxs." << endmsg;
+        return StatusCode::FAILURE;
+    }
     
     // Energy
     if (m_energymins.value().size() != m_particles.value().size()) {
@@ -137,10 +170,41 @@ GtGunTool::mutate(MyHepMC::GenEvent& event) {
         double x = 0;
         double y = 0;
         double z = 0;
+
+        // ==================================
+        // 1. if there is fixed positions
+        // ==================================
         if (i<m_positionXs.value().size()) { x = m_positionXs.value()[i]; }
         if (i<m_positionYs.value().size()) { y = m_positionYs.value()[i]; }
         if (i<m_positionZs.value().size()) { z = m_positionZs.value()[i]; }
 
+        // ==================================
+        // 2. if there are varied positions
+        // ==================================
+        if (i<m_posZmins.value().size() and i<m_posZmaxs.value().size()) {
+            double zmin = m_posZmins.value()[i];
+            double zmax = m_posZmaxs.value()[i];
+            z = CLHEP::RandFlat::shoot(zmin, zmax);
+        }
+
+        if (i<m_posRmins.value().size() and i<m_posRmaxs.value().size()) {
+            double rmin = fabs(m_posRmins.value()[i]);
+            double rmax = fabs(m_posRmaxs.value()[i]);
+
+            while (true) {
+                double x_ = CLHEP::RandFlat::shoot(-rmax, rmax);
+                double y_ = CLHEP::RandFlat::shoot(-rmax, rmax);
+                double r_ = std::sqrt(x_*x_+y_*y_);
+
+                if (rmin <= r_ && r_ <= rmax) {
+                    x = x_;
+                    y = y_;
+                    break;
+                }
+            }
+        }
+
+
         mcp.setVertex(edm4hep::Vector3d(x,y,z)); 
         // mcp.setEndpoint();
 
diff --git a/Generator/src/GtGunTool.h b/Generator/src/GtGunTool.h
index fa4f887007a824d63445cbe940369f48e237b6b6..d4b8d9f81311ebac756836ba656cdc786d7857d0 100644
--- a/Generator/src/GtGunTool.h
+++ b/Generator/src/GtGunTool.h
@@ -34,14 +34,23 @@ private:
 
     Gaudi::Property<std::vector<std::string>> m_particles{this, "Particles"};
 
+    // For fixed positions
     Gaudi::Property<std::vector<double>> m_positionXs{this, "PositionXs"};
     Gaudi::Property<std::vector<double>> m_positionYs{this, "PositionYs"};
     Gaudi::Property<std::vector<double>> m_positionZs{this, "PositionZs"};
 
+    // For positions
+    Gaudi::Property<std::vector<double>> m_posZmins{this, "PosZMins"};
+    Gaudi::Property<std::vector<double>> m_posZmaxs{this, "PosZMaxs"};
 
+    Gaudi::Property<std::vector<double>> m_posRmins{this, "PosRMins"};
+    Gaudi::Property<std::vector<double>> m_posRmaxs{this, "PosRMaxs"};
+
+    // For energies
     Gaudi::Property<std::vector<double>> m_energymins{this, "EnergyMins"};
     Gaudi::Property<std::vector<double>> m_energymaxs{this, "EnergyMaxs"};
 
+    // For directions
     Gaudi::Property<std::vector<double>> m_thetamins{this, "ThetaMins"};
     Gaudi::Property<std::vector<double>> m_thetamaxs{this, "ThetaMaxs"};
 
diff --git a/Generator/src/GuineaPigPairsFileParser.cpp b/Generator/src/GuineaPigPairsFileParser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..13df7f2344679e967cdcf765368f96f2316fc165
--- /dev/null
+++ b/Generator/src/GuineaPigPairsFileParser.cpp
@@ -0,0 +1,62 @@
+#include "GuineaPigPairsFileParser.h"
+#include <sstream>
+#include <cmath>
+
+GuineaPigPairsFileParser::GuineaPigPairsFileParser(const std::string& filename) {
+    m_input.open(filename.c_str());
+}
+
+bool GuineaPigPairsFileParser::load(IBeamBackgroundFileParser::BeamBackgroundData& result) {
+    if (not m_input.good()) {
+        return false;
+    }
+
+    // read one record
+    std::string tmpline;
+    // the format
+    double energy; // unit: GeV
+    double vx; // unit: c
+    double vy; // unit: c
+    double vz; // unit: c
+    double x; // unit: nm
+    double y; // unit: nm
+    double z; // unit: nm
+    int process;
+
+    while(m_input.good()) {
+        std::getline(m_input, tmpline);
+        std::stringstream ss;
+        ss << tmpline;
+        ss >> energy;           if (ss.fail()) { continue; }
+        ss >> vx;               if (ss.fail()) { continue; }
+        ss >> vy;               if (ss.fail()) { continue; }
+        ss >> vz;               if (ss.fail()) { continue; }
+        ss >> x;                if (ss.fail()) { continue; }
+        ss >> y;                if (ss.fail()) { continue; }
+        ss >> z;                if (ss.fail()) { continue; }
+        ss >> process;          if (ss.fail()) { continue; }
+
+        int pdgid = 11; // 11: electron; -11: positron
+        if (energy<0) pdgid = -11;
+
+        double p = std::fabs(energy);
+        double v = sqrt(vx*vx+vy*vy+vz*vz);
+
+        // Now, we get a almost valid data
+        const double nm2mm = 1e-6; // convert from nm to mm
+        result.pdgid = pdgid;
+        result.x     = x * nm2mm; 
+        result.y     = y * nm2mm; 
+        result.z     = z * nm2mm;
+
+        result.px    = p * vx/v;
+        result.py    = p * vy/v;
+        result.pz    = p * vz/v;
+
+        result.mass  = 0.000511; // assume e-/e+, mass is 0.511 MeV
+
+        return true;
+    }
+    return false;
+
+}
diff --git a/Generator/src/GuineaPigPairsFileParser.h b/Generator/src/GuineaPigPairsFileParser.h
new file mode 100644
index 0000000000000000000000000000000000000000..078a38a0c7a62f5dc4fc9ef70e7655353405c306
--- /dev/null
+++ b/Generator/src/GuineaPigPairsFileParser.h
@@ -0,0 +1,32 @@
+#ifndef GuineaPigPairsFileParser_h
+#define GuineaPigPairsFileParser_h
+
+#include "IBeamBackgroundFileParser.h"
+#include <fstream>
+
+/* Format of Guinea-Pig Pairs:
+ *
+ *   E vx vy vz x y z process
+ *
+ * Notes:
+ *   - E (GeV). If E>0, it is electron. If E<0, it is positron
+ *   - vx/vy/vz (speed of light)
+ *   - x/y/z (nm)
+ *   - process
+ *     - 0: Breit-Wheeler
+ *     - 1: Bethe-Heitler
+ *     - 2: Landau-Lifschitz
+ *
+ */
+
+class GuineaPigPairsFileParser: public IBeamBackgroundFileParser {
+public:
+    GuineaPigPairsFileParser(const std::string& filename);
+
+    bool load(IBeamBackgroundFileParser::BeamBackgroundData&);
+
+private:
+    std::ifstream m_input;
+};
+
+#endif
diff --git a/Generator/src/HepevtRdr.cpp b/Generator/src/HepevtRdr.cpp
index 7f036e2e970d5af1292d0ac22bcfc8769748862c..faf5ad9e0c009cccc8acee12f4e20d8dec16f1fb 100644
--- a/Generator/src/HepevtRdr.cpp
+++ b/Generator/src/HepevtRdr.cpp
@@ -7,12 +7,10 @@
 #include "IMPL/MCParticleImpl.h"
 
 
-#include "plcio/MCParticle.h" //plcio
-#include "plcio/MCParticleObj.h"
-#include "plcio/MCParticleCollection.h"
-#include "plcio/DoubleThree.h"
-#include "plcio/FloatThree.h"
-#include "plcio/EventHeaderCollection.h"
+#include "edm4hep/MCParticle.h" //edm4hep
+#include "edm4hep/MCParticleObj.h"
+#include "edm4hep/MCParticleCollection.h"
+#include "edm4hep/EventHeaderCollection.h"
 
 
 
@@ -23,7 +21,7 @@
 
 using namespace lcio;
 using namespace IMPL;
-using namespace plcio;
+using namespace edm4hep;
 using namespace std;
 
 typedef enum HEPFILEFORMATS
@@ -35,28 +33,57 @@ typedef enum HEPFILEFORMATS
 }  HEPFILEFORMAT;
 
 
-HepevtRdr::HepevtRdr(string name){
+DECLARE_COMPONENT(HepevtRdr)
 
-m_hepevt_rdr = new UTIL::LCAscHepRdr(name.c_str(), hepevt);
-m_processed_event=0;
-std::cout<<"initial hepevt_rdr"<<std::endl;
+HepevtRdr::~HepevtRdr(){
+    delete m_hepevt_rdr;
 }
 
-HepevtRdr::~HepevtRdr(){
-delete m_hepevt_rdr;
+StatusCode HepevtRdr::initialize() {
+    StatusCode sc;
+    if (not configure_gentool()) {
+        error() << "failed to initialize." << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    return sc;
+}
+
+StatusCode HepevtRdr::finalize() {
+    StatusCode sc;
+    if (not finish()) {
+        error() << "Failed to finalize." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    return sc;
+}
+
+
+bool HepevtRdr::configure_gentool(){
+    int format = hepevt;
+    if (m_format == "HEPEvt") {
+        format = HEPEvt;
+    } else if (m_format == "hepevt") {
+        format = hepevt;
+    }
+
+    m_hepevt_rdr = new UTIL::LCAscHepRdr(m_filename.value().c_str(), format);
+    m_processed_event=0;
+    std::cout<<"initial hepevt_rdr"<<std::endl;
+    return true;
 }
 
 bool HepevtRdr::mutate(MyHepMC::GenEvent& event){
     LCCollectionVec* mc_vec = m_hepevt_rdr->readEvent();
     if(mc_vec==nullptr) return false;
     m_processed_event ++;
-    int n_mc = mc_vec->getNumberOfElements();
+    int n_mc = mc_vec->size();
     std::cout<<"Read event :"<< m_processed_event <<", mc size :"<< n_mc <<std::endl;
     std::map<int, int> pmcid_lmcid;
     for (int i=0; i < n_mc; i++){
         MCParticleImpl* mc = (MCParticleImpl*) mc_vec->getElementAt(i);
-        //std::cout<<"At mc :"<< i <<std::endl;
-        plcio::MCParticle mcp = event.m_mc_vec.create();
+        // std::cout<<"At mc :"<< i <<std::endl;
+        auto mcp = event.m_mc_vec.create();
         pmcid_lmcid.insert(std::pair<int, int>(mc->id(),i));
         //std::cout<<"map<id,i>:"<<mc->id()<<","<< i <<std::endl;
                                  
@@ -68,8 +95,8 @@ bool HepevtRdr::mutate(MyHepMC::GenEvent& event){
         mcp.setMass               (mc->getMass());
         mcp.setVertex             (mc->getVertex()); 
         mcp.setEndpoint           (mc->getEndpoint());
-        mcp.setMomentum           (FloatThree(float(mc->getMomentum()[0]), float(mc->getMomentum()[1]), float(mc->getMomentum()[2]) ));
-        mcp.setMomentumAtEndpoint (FloatThree(float(mc->getMomentumAtEndpoint()[0]), float(mc->getMomentumAtEndpoint()[1]), float(mc->getMomentumAtEndpoint()[2]) ));
+        mcp.setMomentum           (edm4hep::Vector3f(float(mc->getMomentum()[0]), float(mc->getMomentum()[1]), float(mc->getMomentum()[2]) ));
+        mcp.setMomentumAtEndpoint (edm4hep::Vector3f(float(mc->getMomentumAtEndpoint()[0]), float(mc->getMomentumAtEndpoint()[1]), float(mc->getMomentumAtEndpoint()[2]) ));
         mcp.setSpin               (mc->getSpin());
         mcp.setColorFlow          (mc->getColorFlow());
     }
@@ -79,16 +106,16 @@ bool HepevtRdr::mutate(MyHepMC::GenEvent& event){
         MCParticleImpl* mc = (MCParticleImpl*) mc_vec->getElementAt(i);
         const MCParticleVec & mc_parents = mc->getParents();
         const MCParticleVec & mc_daughters = mc->getDaughters();
-        plcio::MCParticle pmc = event.m_mc_vec.at(i);
+        auto pmc = event.m_mc_vec.at(i);
         //std::cout<<"mc at "<< i<<", parent size "<<mc_parents.size() <<std::endl;
         for(unsigned int j=0; j< mc_parents.size(); j++){int p_id = mc_parents.at(j)->id();
                                                  //std::cout<<"parent id "<<p_id<<std::endl;
-                                                 pmc.addParent( event.m_mc_vec.at( pmcid_lmcid.at(p_id) ) );
+                                                 pmc.addToParents( event.m_mc_vec.at( pmcid_lmcid.at(p_id) ) );
                                                 }
         //std::cout<<"mc at "<< i<<", daughter size "<<mc_daughters.size() <<std::endl;
         for(unsigned int j=0; j< mc_daughters.size(); j++){int d_id = mc_daughters.at(j)->id();
                                                  //std::cout<<"daughter id "<<d_id<<std::endl;
-                                                 pmc.addDaughter( event.m_mc_vec.at( pmcid_lmcid.at(d_id) ) );
+                                                 pmc.addToDaughters( event.m_mc_vec.at( pmcid_lmcid.at(d_id) ) );
                                                 }
     }
      
@@ -98,13 +125,9 @@ bool HepevtRdr::mutate(MyHepMC::GenEvent& event){
 }
 
 bool HepevtRdr::isEnd(){
-return false;
-}
-
-bool HepevtRdr::configure(){
-return true;
+    return false;
 }
 
 bool HepevtRdr::finish(){
-return true;
+    return true;
 }
diff --git a/Generator/src/HepevtRdr.h b/Generator/src/HepevtRdr.h
index 9ee2d7fd411f554fdc2114ca854f2fc52f8e7a62..7a1de27f7cebe2da2ecf19161575156172618bfc 100644
--- a/Generator/src/HepevtRdr.h
+++ b/Generator/src/HepevtRdr.h
@@ -1,6 +1,8 @@
 #ifndef HepevtRdr_h
 #define HepevtRdr_h 1
 
+#include "GaudiKernel/AlgTool.h"
+
 #include "GenReader.h"
 #include "GenEvent.h"
 
@@ -8,19 +10,27 @@
 #include "EVENT/LCIO.h"
 #include "LCAscHepRdr.h"
 
-class HepevtRdr: public GenReader{
+class HepevtRdr: public extends<AlgTool, GenReader> {
 
     public:
-        HepevtRdr(string name);
+        using extends::extends;
         ~HepevtRdr();
-        bool configure();               
+
+        StatusCode initialize() override;
+        StatusCode finalize() override;    
+
+        bool configure_gentool();               
         bool mutate(MyHepMC::GenEvent& event);    
         bool finish();
         bool isEnd();
     private:
-        UTIL::LCAscHepRdr* m_hepevt_rdr;
-        long m_total_event;
-        long m_processed_event;
+        UTIL::LCAscHepRdr* m_hepevt_rdr = nullptr;
+        long m_total_event = -1;
+        long m_processed_event = -1;
+
+        // input file name
+        Gaudi::Property<std::string> m_filename{this, "Input"};
+        Gaudi::Property<std::string> m_format{this, "Format"};
 };
 
 #endif
diff --git a/Generator/src/LCAscHepRdr.cc b/Generator/src/LCAscHepRdr.cc
index eabca0bb170238264887b321795fcc401b36f777..ac99d8f22ac895b5b49f31766453ffd7a9b639a6 100644
--- a/Generator/src/LCAscHepRdr.cc
+++ b/Generator/src/LCAscHepRdr.cc
@@ -56,11 +56,16 @@ namespace UTIL{
     //
     //  Read the event, check for errors
     //
-    int NHEP;  // number of entries
-    int NOUT ;   // number of outgoing particles
-    int BRE ;   // beam remnants
-    double WEIGHT ;   // weight
-    inputFile >> NHEP >> NOUT >> BRE >> WEIGHT; 
+    int NHEP = -1;  // number of entries
+    int NOUT = -1;   // number of outgoing particles
+    int BRE = -1;   // beam remnants
+    double WEIGHT = -1;   // weight
+
+    std::string line; // modified by Tao
+    std::getline(inputFile, line);
+    std::stringstream ss_(line);
+    ss_ >>  NHEP >> NOUT >> BRE >> WEIGHT; 
+    // std::cout << "NHEP: " << NHEP << std::endl;
     if( inputFile.eof() ) 
       {
 	//
@@ -74,6 +79,7 @@ namespace UTIL{
     //  Create a Collection Vector
     //
     mcVec = new IMPL::LCCollectionVec(LCIO::MCPARTICLE);
+    // std::cout << "mc size: " << mcVec->size() << std::endl;
     MCParticleImpl* p;
     MCParticleImpl* d;
     
@@ -101,12 +107,18 @@ namespace UTIL{
 
     for( int IHEP=0; IHEP<NHEP; IHEP++ )
       {
-	//if ( theFileFormat == HEPEvt)
-	if ( false)
-	  inputFile >> ISTHEP >> IDHEP >> JDAHEP1 >> JDAHEP2
+        std::getline(inputFile, line);
+	if(inputFile.eof())
+		return nullptr;	
+
+        // std::cout << "LINE: " << line << std::endl;
+        std::stringstream ss(line);
+
+	if ( theFileFormat == HEPEvt)
+	  ss >> ISTHEP >> IDHEP >> JDAHEP1 >> JDAHEP2
 		  >> PHEP1 >> PHEP2 >> PHEP3 >> PHEP5;
 	else
-	  inputFile >> ISTHEP >> IDHEP 
+	  ss >> ISTHEP >> IDHEP 
 		    >> JMOHEP1 >> JMOHEP2
 		    >> JDAHEP1 >> JDAHEP2
 		    >> PHEP1 >> PHEP2 >> PHEP3 
@@ -114,8 +126,8 @@ namespace UTIL{
 		    >> VHEP1 >> VHEP2 >> VHEP3
 		    >> VHEP4;
 
-	if(inputFile.eof())
-		return nullptr;	
+        // std::cout << "ISTHEP: " << ISTHEP << std::endl;
+
 	//
 	//  Create a MCParticle and fill it from stdhep info
 	//
@@ -124,6 +136,7 @@ namespace UTIL{
 	//  PDGID
 	//
 	mcp->setPDG(IDHEP);
+        // std::cout << "PDG: " << IDHEP << std::endl;
 	//
 	//  Momentum vector
 	//
@@ -221,6 +234,7 @@ namespace UTIL{
 //
     for( int IHEP=0; IHEP<NHEP; IHEP++ )
       {
+          // continue;
 	//
 	//  Get the MCParticle
 	//
diff --git a/Generator/src/StdHepRdr.cpp b/Generator/src/StdHepRdr.cpp
index b56342b0bfb25de4eb4ceee6b6d6362004bcb1bd..4255e4bd314f3549f0bea3f56be3d4e470221c5a 100644
--- a/Generator/src/StdHepRdr.cpp
+++ b/Generator/src/StdHepRdr.cpp
@@ -36,13 +36,13 @@ bool StdHepRdr::mutate(MyHepMC::GenEvent& event){
     m_processed_event ++;
     int n_mc = mc_vec->getNumberOfElements();
     //std::cout<<"Debug: Read event :"<< m_processed_event <<", mc size :"<< n_mc <<std::endl;
-    std::map<int, int> pmcid_lmcid;
+    std::map<int, int> pmcid_lmcid; // mapping between the obj idx in edm4hep and the idx in stdhep
     for (int i=0; i < n_mc; i++){
         MCParticleImpl* mc = (MCParticleImpl*) mc_vec->getElementAt(i);
         //std::cout<<"At mc :"<< i <<std::endl;
         auto mcp = event.m_mc_vec.create();
         pmcid_lmcid.insert(std::pair<int, int>(mc->id(),i));
-        //std::cout<<"map<id,i>:"<<mc->id()<<","<< i <<std::endl;
+        // std::cout<<"map<id,i>:"<<mc->id()<<","<< i <<std::endl;
                                  
         mcp.setPDG                (mc->getPDG());  
         mcp.setGeneratorStatus    (mc->getGeneratorStatus());
diff --git a/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc b/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc
index d97a82d6e86aa8b2d97b52b6504011d571c6f172..6a1e0cc20da795c05f1e7bc328060f5b232f91a8 100644
--- a/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc
+++ b/Reconstruction/PFA/Arbor/src/ArborToolLCIO.cc
@@ -35,6 +35,8 @@
 #include <DDRec/CellIDPositionConverter.h>
 #include "DetInterface/IGeomSvc.h"
 
+#include "podio/podioVersion.h"
+
 using namespace std;
 /* 
 void ClusterBuilding( LCEvent * evtPP, std::string Name, std::vector<CalorimeterHit*> Hits, std::vector< std::vector<int> > BranchOrder, int DHCALFlag )
@@ -859,7 +861,12 @@ edm4hep::ClusterCollection* ArborToolLCIO::ClusterVecMerge( std::vector<edm4hep:
 	edm4hep::Cluster Mergebranch_A;
 	edm4hep::Cluster Mergebranch_B;
 	edm4hep::Cluster tmpMergebranch;
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
 	edm4hep::Cluster Mainbranch (0);
+#else
+	auto Mainbranch = edm4hep::Cluster::makeEmpty();
+#endif
+
 
 	TVector3 tmpClusterSeedPos, MBSeedPos;	
 
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp
index 1912eee92592f0b8071fcabed38259a61c049f87..48908a6439a27cc352020a83572640803034f777 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/MCParticleCreator.cpp
@@ -53,7 +53,7 @@ pandora::StatusCode MCParticleCreator::CreateMCParticles(const CollectionMaps& c
                     mcParticleParameters.m_particleId = pMcParticle.getPDG();
                     mcParticleParameters.m_mcParticleType = pandora::MC_3D;
                     mcParticleParameters.m_pParentAddress = &pMcParticle;
-                    unsigned int p_id = pMcParticle.id();
+                    unsigned int p_id = pMcParticle.id().index;
                     //auto p_mc = const_cast<edm4hep::MCParticle*>(&pMcParticle);
                     auto p_mc = &pMcParticle;
                     (*m_id_pMC_map) [p_id]   = p_mc;
@@ -131,8 +131,8 @@ pandora::StatusCode MCParticleCreator::CreateCaloHitToMCParticleRelationships(co
                             auto conb = pSimHit.getContributions(iCont);
                             auto ipa = conb.getParticle();
                             float  ien = conb.getEnergy();
-                            if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue;
-                            auto p_tmp = (*m_id_pMC_map)[ipa.id()]; 
+                            if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue;
+                            auto p_tmp = (*m_id_pMC_map)[ipa.id().index];
                             mcParticleToEnergyWeightMap[p_tmp] += ien;
                         }
                         
@@ -190,13 +190,13 @@ pandora::StatusCode MCParticleCreator::CreateTrackToMCParticleRelationships(cons
                         if( pMCRecoTrackerAssociationCollection.at(ic).getRec().id() != pTrack->getTrackerHits(ith).id() ) continue;
                         auto pSimHit = pMCRecoTrackerAssociationCollection.at(ic).getSim();
                         auto ipa = pSimHit.getMCParticle();
-                        if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue;
+                        if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue;
                         const float trueMomentum(pandora::CartesianVector(ipa.getMomentum()[0], ipa.getMomentum()[1], ipa.getMomentum()[2]).GetMagnitude());
                         const float deltaMomentum(std::fabs(recoMomentum - trueMomentum));
                         if (deltaMomentum < bestDeltaMomentum)
                         {
                             //pBestMCParticle =((*m_id_pMC_map)[ipa.id()]);
-                            best_mc_id = ipa.id() ;
+                            best_mc_id = ipa.id().index ;
                             bestDeltaMomentum = deltaMomentum;
                         }
                     }
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp
index cfe8f2f25f1906723527534f6ec3154616c752c7..a95ea9c70b872d0731245f911af378d8e8a6dc30 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp
@@ -669,9 +669,9 @@ StatusCode PandoraPFAlg::CreateMCRecoParticleAssociation()
                         if(it->getRec().id() != hit.id()) continue;
                         for(auto itc = it->getSim().contributions_begin(); itc != it->getSim().contributions_end(); itc++)
                         {
-                            if(mc_map.find(itc->getParticle().id()) == mc_map.end()) mc_map[itc->getParticle().id()] = itc->getParticle() ;
-                            if(id_edep_map.find(itc->getParticle().id()) != id_edep_map.end()) id_edep_map[itc->getParticle().id()] = id_edep_map[itc->getParticle().id()] + itc->getEnergy() ;
-                            else                                                               id_edep_map[itc->getParticle().id()] = itc->getEnergy() ;
+                            if(mc_map.find(itc->getParticle().id().index) == mc_map.end()) mc_map[itc->getParticle().id().index] = itc->getParticle() ;
+                            if(id_edep_map.find(itc->getParticle().id().index) != id_edep_map.end()) id_edep_map[itc->getParticle().id().index] = id_edep_map[itc->getParticle().id().index] + itc->getEnergy() ;
+                            else                                                               id_edep_map[itc->getParticle().id().index] = itc->getEnergy() ;
                             tot_en += itc->getEnergy() ;
                         }
                     }
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp
index 940d116f14d5682f6adfdd530deba7777a0c9d0d..8ebe8e239504f3475fa07c64db0199a72ea2e72b 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp
@@ -10,6 +10,14 @@
 #include "edm4hep/Vertex.h"
 #include "edm4hep/Vector3f.h"
 #include "edm4hep/ReconstructedParticle.h"
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
 
 #include "gear/BField.h"
 #include "gear/CalorimeterParameters.h"
@@ -313,7 +321,7 @@ pandora::StatusCode TrackCreator::ExtractKinks(const CollectionMaps& collectionM
                     for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack)
                     {
                         auto pTrack = pReconstructedParticle.getTracks(iTrack);
-                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id());
+                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index);
 
                         int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE;
 
@@ -413,7 +421,7 @@ pandora::StatusCode TrackCreator::ExtractProngsAndSplits(const CollectionMaps& c
                     for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack)
                     {
                         edm4hep::Track pTrack = pReconstructedParticle.getTracks(iTrack);
-                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id());
+                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index);
 
                         if (0 == m_settings.m_shouldFormTrackRelationships) continue;
 
@@ -482,7 +490,7 @@ pandora::StatusCode TrackCreator::ExtractV0s(const CollectionMaps& collectionMap
                     for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack)
                     {
                         edm4hep::Track pTrack = pReconstructedParticle.getTracks(iTrack);
-                        m_v0TrackList.insert(pTrack.id());
+                        m_v0TrackList.insert(pTrack.id().index);
 
                         int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE;
 
@@ -538,7 +546,7 @@ bool TrackCreator::IsConflictingRelationship(const edm4hep::ReconstructedParticl
     for (unsigned int iTrack = 0, nTracks = Particle.tracks_size(); iTrack < nTracks; ++iTrack)
     {
         edm4hep::Track pTrack = Particle.getTracks(iTrack) ;
-        unsigned int pTrack_id = pTrack.id() ;
+        unsigned int pTrack_id = pTrack.id().index ;
 
         if (this->IsDaughter(pTrack_id) || this->IsParent(pTrack_id) || this->IsV0(pTrack_id))
             return true;
@@ -851,7 +859,7 @@ void TrackCreator::DefineTrackPfoUsage(const edm4hep::Track *const pTrack, Pando
     bool canFormPfo(false);
     bool canFormClusterlessPfo(false);
 
-    if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id()))
+    if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id().index))
     {
         const float d0(std::fabs(pTrack->getTrackStates(0).D0)), z0(std::fabs(pTrack->getTrackStates(0).Z0));
 
@@ -880,8 +888,8 @@ void TrackCreator::DefineTrackPfoUsage(const edm4hep::Track *const pTrack, Pando
             const float zCutForNonVertexTracks(m_tpcInnerR * std::fabs(pZ / pT) + m_settings.m_zCutForNonVertexTracks);
             const bool passRzQualityCuts((zMin < zCutForNonVertexTracks) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance));
 
-            const bool isV0(this->IsV0(pTrack->id()));
-            const bool isDaughter(this->IsDaughter(pTrack->id()));
+            const bool isV0(this->IsV0(pTrack->id().index));
+            const bool isDaughter(this->IsDaughter(pTrack->id().index));
 
             // Decide whether track can be associated with a pandora cluster and used to form a charged PFO
             if ((d0 < m_settings.m_d0TrackCut) && (z0 < m_settings.m_z0TrackCut) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance))
@@ -918,7 +926,7 @@ void TrackCreator::DefineTrackPfoUsage(const edm4hep::Track *const pTrack, Pando
                 }
             }
         }
-        else if (this->IsDaughter(pTrack->id()) || this->IsV0(pTrack->id()))
+        else if (this->IsDaughter(pTrack->id().index) || this->IsV0(pTrack->id().index))
         {
             std::cout<<"WARNING Recovering daughter or v0 track " << trackParameters.m_momentumAtDca.Get().GetMagnitude() << std::endl;
             canFormPfo = true;
@@ -1020,9 +1028,15 @@ int TrackCreator::GetNTpcHits(const edm4hep::Track *const pTrack) const
         //According to FG: [ 2 * lcio::ILDDetID::TPC - 2 ] is the first number and it is supposed to
         //be the number of hits in the fit and this is what should be used !
         // at least for DD4hep/DDSim
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+        return pTrack->getSubdetectorHitNumbers(3);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L483
+    }
+    else return pTrack->getSubdetectorHitNumbers(2 * 4 - 1);// lcio::ILDDetID::TPC=4, still use LCIO code now
+#else
         return pTrack->getSubDetectorHitNumbers(3);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L483
     }
     else return pTrack->getSubDetectorHitNumbers(2 * 4 - 1);// lcio::ILDDetID::TPC=4, still use LCIO code now
+#endif
 }
 
 //------------------------------------------------------------------------------------------------------------------------------------------
@@ -1036,9 +1050,16 @@ int TrackCreator::GetNFtdHits(const edm4hep::Track *const pTrack) const
     // ---- use hitsInFit :
     //return pTrack->getSubdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 1 ];
     if(m_settings.m_use_dd4hep_geo){
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+        return pTrack->getSubdetectorHitNumbers(1);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L481
+    }
+    else return pTrack->getSubdetectorHitNumbers( 2 * 3 - 1 );// lcio::ILDDetID::FTD=3
+#else
         return pTrack->getSubDetectorHitNumbers(1);//FIXME https://github.com/wenxingfang/CEPCSW/blob/master/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp#L481
     }
     else return pTrack->getSubDetectorHitNumbers( 2 * 3 - 1 );// lcio::ILDDetID::FTD=3
+
+#endif
 }
 
 //------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp b/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp
index 40f44d1a4a5a3f76cf8f527c704d855eeb709ddb..2da13168523268d37056960708474d8891c12ad2 100644
--- a/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp
+++ b/Reconstruction/PFA/Pandora/MatrixPandora/src/MCParticleCreator.cpp
@@ -57,7 +57,7 @@ pandora::StatusCode MCParticleCreator::CreateMCParticles(const CollectionMaps& c
                     mcParticleParameters.m_particleId = pMcParticle.getPDG();
                     mcParticleParameters.m_mcParticleType = pandora::MC_3D;
                     mcParticleParameters.m_pParentAddress = &pMcParticle;
-                    unsigned int p_id = pMcParticle.id();
+                    unsigned int p_id = pMcParticle.id().index;
                     auto p_mc = &pMcParticle;
                     (*m_id_pMC_map) [p_id]   = p_mc;
                     mcParticleParameters.m_momentum = pandora::CartesianVector(pMcParticle.getMomentum()[0], pMcParticle.getMomentum()[1],
@@ -271,8 +271,8 @@ pandora::StatusCode MCParticleCreator::CreateCaloHitToMCParticleRelationships(co
                             edm4hep::CaloHitContribution conb = pSimHit.getContributions(iCont);
                             auto ipa = conb.getParticle();
                             float  ien = conb.getEnergy();
-                            if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue;
-                            auto p_tmp = (*m_id_pMC_map)[ipa.id()]; 
+                            if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue;
+                            auto p_tmp = (*m_id_pMC_map)[ipa.id().index];
                             mcParticleToEnergyWeightMap[p_tmp] += ien;
                         }
                         
@@ -331,12 +331,12 @@ pandora::StatusCode MCParticleCreator::CreateTrackToMCParticleRelationships(cons
                         if( pMCRecoTrackerAssociationCollection.at(ic).getRec().id() != pTrack->getTrackerHits(ith).id() ) continue;
                         auto pSimHit = pMCRecoTrackerAssociationCollection.at(ic).getSim();
                         auto ipa = pSimHit.getMCParticle();
-                        if( m_id_pMC_map->find(ipa.id()) == m_id_pMC_map->end() ) continue;
+                        if( m_id_pMC_map->find(ipa.id().index) == m_id_pMC_map->end() ) continue;
                         const float trueMomentum(pandora::CartesianVector(ipa.getMomentum()[0], ipa.getMomentum()[1], ipa.getMomentum()[2]).GetMagnitude());
                         const float deltaMomentum(std::fabs(recoMomentum - trueMomentum));
                         if (deltaMomentum < bestDeltaMomentum)
                         {
-                            pBestMCParticle = ((*m_id_pMC_map)[ipa.id()]);
+                            pBestMCParticle = ((*m_id_pMC_map)[ipa.id().index]);
                             bestDeltaMomentum = deltaMomentum;
                         }
                     }
diff --git a/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp b/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp
index b0a1d7ca4fd4c57807960672cc588f5f3576cf7e..16996f6ca34d503c97f67350c1262ac7343bf45d 100644
--- a/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp
+++ b/Reconstruction/PFA/Pandora/MatrixPandora/src/PandoraMatrixAlg.cpp
@@ -591,7 +591,7 @@ StatusCode PandoraMatrixAlg::Ana()
         {
             if(reco_associa_col->at(j).getRec().id() != pReco.id() ) continue;
             std::cout<<"MC pid ="<<reco_associa_col->at(j).getSim().getPDG()<<",weight="<<reco_associa_col->at(j).getWeight()<<", px="<<reco_associa_col->at(j).getSim().getMomentum()[0]<<", py="<<reco_associa_col->at(j).getSim().getMomentum()[1]<<",pz="<<reco_associa_col->at(j).getSim().getMomentum()[2]<<std::endl;
-            tmp_mc_id    .push_back(reco_associa_col->at(j).getSim().id());
+            tmp_mc_id    .push_back(reco_associa_col->at(j).getSim().id().index);
             tmp_mc_weight.push_back(reco_associa_col->at(j).getWeight());
         }
         m_pReco_mc_id    .push_back(tmp_mc_id);
@@ -604,7 +604,7 @@ StatusCode PandoraMatrixAlg::Ana()
     { 
         for(unsigned int i=0 ; i< MCParticle->size(); i++)
         {
-            m_mc_id    .push_back(MCParticle->at(i).id());
+            m_mc_id    .push_back(MCParticle->at(i).id().index);
             m_mc_p_size.push_back(MCParticle->at(i).parents_size());
             m_mc_pid   .push_back(MCParticle->at(i).getPDG());
             m_mc_mass  .push_back(MCParticle->at(i).getMass());
@@ -655,9 +655,9 @@ StatusCode PandoraMatrixAlg::CreateMCRecoParticleAssociation()
                         if(it->getRec().id() != hit.id()) continue;
                         for(auto itc = it->getSim().contributions_begin(); itc != it->getSim().contributions_end(); itc++)
                         {
-                            if(mc_map.find(itc->getParticle().id()) == mc_map.end()) mc_map[itc->getParticle().id()] = itc->getParticle() ;
-                            if(id_edep_map.find(itc->getParticle().id()) != id_edep_map.end()) id_edep_map[itc->getParticle().id()] = id_edep_map[itc->getParticle().id()] + itc->getEnergy() ;
-                            else                                                               id_edep_map[itc->getParticle().id()] = itc->getEnergy() ;
+                            if(mc_map.find(itc->getParticle().id().index) == mc_map.end()) mc_map[itc->getParticle().id().index] = itc->getParticle() ;
+                            if(id_edep_map.find(itc->getParticle().id().index) != id_edep_map.end()) id_edep_map[itc->getParticle().id().index] = id_edep_map[itc->getParticle().id().index] + itc->getEnergy() ;
+                            else                                                               id_edep_map[itc->getParticle().id().index] = itc->getEnergy() ;
                             tot_en += itc->getEnergy() ;
                         }
                     }
diff --git a/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp b/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp
index dd633f076d472d602dcf1406e37e68df69a50d32..c290e069311e26d5294033c7eaddf8bebdde34d9 100644
--- a/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp
+++ b/Reconstruction/PFA/Pandora/MatrixPandora/src/TrackCreator.cpp
@@ -10,6 +10,14 @@
 
 #include "edm4hep/Vertex.h"
 #include "edm4hep/ReconstructedParticle.h"
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
 
 #include "gear/BField.h"
 #include "gear/CalorimeterParameters.h"
@@ -177,7 +185,7 @@ pandora::StatusCode TrackCreator::ExtractKinks(const CollectionMaps& collectionM
                     for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack)
                     {
                         auto pTrack = pReconstructedParticle.getTracks(iTrack);
-                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id());
+                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index);
 
                         int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE;
 
@@ -277,7 +285,7 @@ pandora::StatusCode TrackCreator::ExtractProngsAndSplits(const CollectionMaps& c
                     for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack)
                     {
                         auto pTrack = pReconstructedParticle.getTracks(iTrack);
-                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id()) : m_daughterTrackList.insert(pTrack.id());
+                        (0 == iTrack) ? m_parentTrackList.insert(pTrack.id().index) : m_daughterTrackList.insert(pTrack.id().index);
 
                         if (0 == m_settings.m_shouldFormTrackRelationships) continue;
 
@@ -346,7 +354,7 @@ pandora::StatusCode TrackCreator::ExtractV0s(const CollectionMaps& collectionMap
                     for (unsigned int iTrack = 0, nTracks = pReconstructedParticle.tracks_size(); iTrack < nTracks; ++iTrack)
                     {
                         auto pTrack = pReconstructedParticle.getTracks(iTrack);
-                        m_v0TrackList.insert(pTrack.id());
+                        m_v0TrackList.insert(pTrack.id().index);
 
                         int trackPdgCode = pandora::UNKNOWN_PARTICLE_TYPE;
 
@@ -401,7 +409,7 @@ bool TrackCreator::IsConflictingRelationship(const edm4hep::ReconstructedParticl
     for (unsigned int iTrack = 0, nTracks = Particle.tracks_size(); iTrack < nTracks; ++iTrack)
     {
         edm4hep::Track pTrack = Particle.getTracks(iTrack) ;
-        unsigned int pTrack_id = pTrack.id() ;
+        unsigned int pTrack_id = pTrack.id().index ;
 
         if (this->IsDaughter(pTrack_id) || this->IsParent(pTrack_id) || this->IsV0(pTrack_id))
             return true;
@@ -712,7 +720,7 @@ void TrackCreator::DefineTrackPfoUsage(edm4hep::Track *const pTrack, PandoraApi:
     bool canFormPfo(false);
     bool canFormClusterlessPfo(false);
 
-    if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id()))
+    if (trackParameters.m_reachesCalorimeter.Get() && !this->IsParent(pTrack->id().index))
     {
         const float d0(std::fabs(pTrack->getTrackStates(0).D0)), z0(std::fabs(pTrack->getTrackStates(0).Z0));
 
@@ -740,8 +748,8 @@ void TrackCreator::DefineTrackPfoUsage(edm4hep::Track *const pTrack, PandoraApi:
             const float zCutForNonVertexTracks(m_tpcInnerR * std::fabs(pZ / pT) + m_settings.m_zCutForNonVertexTracks);
             const bool passRzQualityCuts((zMin < zCutForNonVertexTracks) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance));
 
-            const bool isV0(this->IsV0(pTrack->id()));
-            const bool isDaughter(this->IsDaughter(pTrack->id()));
+            const bool isV0(this->IsV0(pTrack->id().index));
+            const bool isDaughter(this->IsDaughter(pTrack->id().index));
 
             // Decide whether track can be associated with a pandora cluster and used to form a charged PFO
             if ((d0 < m_settings.m_d0TrackCut) && (z0 < m_settings.m_z0TrackCut) && (rInner < m_tpcInnerR + m_settings.m_maxTpcInnerRDistance))
@@ -778,7 +786,7 @@ void TrackCreator::DefineTrackPfoUsage(edm4hep::Track *const pTrack, PandoraApi:
                 }
             }
         }
-        else if (this->IsDaughter(pTrack->id()) || this->IsV0(pTrack->id()))
+        else if (this->IsDaughter(pTrack->id().index) || this->IsV0(pTrack->id().index))
         {
             std::cout<<"WARNING Recovering daughter or v0 track " << trackParameters.m_momentumAtDca.Get().GetMagnitude() << std::endl;
             canFormPfo = true;
@@ -870,14 +878,22 @@ bool TrackCreator::PassesQualityCuts(edm4hep::Track *const pTrack, const Pandora
 
 int TrackCreator::GetNTpcHits(edm4hep::Track *const pTrack) const
 {
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+    return pTrack->getSubdetectorHitNumbers(2 * lcio::ILDDetID::TPC - 1);// still use LCIO code now
+#else
     return pTrack->getSubDetectorHitNumbers(2 * lcio::ILDDetID::TPC - 1);// still use LCIO code now
+#endif
 }
 
 //------------------------------------------------------------------------------------------------------------------------------------------
 
 int TrackCreator::GetNFtdHits(edm4hep::Track *const pTrack) const
 {
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+    return pTrack->getSubdetectorHitNumbers( 2 * lcio::ILDDetID::FTD - 1 );
+#else
     return pTrack->getSubDetectorHitNumbers( 2 * lcio::ILDDetID::FTD - 1 );
+#endif
 }
 
 //------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp
index 1b154b957586939bffcfb4492eb1fb18fc5da86e..f16513c0cb401be80e26bcf5ff25948b0b0214fc 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp
+++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp
@@ -58,6 +58,7 @@
 
 //cpp
 #include <cfloat>
+#include <type_traits>
 
 #undef GENFIT_MY_DEBUG
 //#define GENFIT_MY_DEBUG 1
@@ -1639,3 +1640,4 @@ GenfitHit* GenfitTrack::makeAGenfitHit(edm4hep::TrackerHit* trackerHit,
     }
     return genfitHit;
 }
+
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
index 27ef200b6153e0354b80d67067e238d4ec664c2b..29b4394d1d246fa3b11dec0cc4161be6f2872f9c 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
+++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
@@ -144,6 +144,7 @@ class GenfitTrack {
             std::vector<double>& Res);
 
     ///A tool to convert track to the first layer of DC
+  
     void pivotToFirstLayer(const edm4hep::Vector3d& pos,
             const edm4hep::Vector3f& mom, edm4hep::Vector3d& firstPos,
             edm4hep::Vector3f& firstMom);
diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp
index 6619c418ebd22f4dc7d21d1be1a52327e8dd2a7d..8dc13f65c0317fed845dd12d82395c21fdd99c93 100644
--- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp
+++ b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp
@@ -397,7 +397,7 @@ void RecGenfitAlgDC::debugEvent()
     m_mcIndex=iHit;
     int iMcParticle=0;
     for(auto mcParticle : *mcParticleCol){
-        edm4hep::Vector3f mcPocaMom = mcParticle.getMomentum();//GeV
+        const auto& mcPocaMom = mcParticle.getMomentum();//GeV
         float px=mcPocaMom.x;
         float py=mcPocaMom.y;
         float pz=mcPocaMom.z;
diff --git a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
index df95acc6cbe9cfa3fe53902b659792f367b5c558..3eb06e29713317bc809ef615a31e801259e8fd56 100644
--- a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
@@ -6,6 +6,14 @@
 #include "edm4hep/TrackerHit.h"
 #include "edm4hep/TrackerHit.h"
 #include "edm4hep/Track.h"
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
 
 #include "UTIL/ILDConf.h"
 
@@ -1001,13 +1009,21 @@ void ForwardTrackingAlg::finaliseTrack( edm4hep::MutableTrack* trackImpl ){
   //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]);
+  trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]);
+  trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]);
+  trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]);
+  trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]);
+#else
   trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]);
   trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]);
   trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]);
   trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]);
   trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]);
   trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]);
-     
+#endif
   return;
 }
 
diff --git a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
index f9b6a5466aba7cf08527d77d2f3b6c5d429ba3d8..1ef104fa4b479dde6ce3be62b98ad6a6feb31b4a 100644
--- a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
@@ -9,6 +9,14 @@
 //#include "edm4hep/TrackerHitPlane.h"
 #include "edm4hep/Track.h"
 #include "edm4hep/TrackState.h"
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
 
 #include <iostream>
 #include <algorithm>
@@ -2833,10 +2841,15 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) {
       MarlinTrk::addHitNumbersToTrack(&track, all_hits, false, cellID_encoder);
       
       delete marlinTrk;
-
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+      int nhits_in_vxd = track.getSubdetectorHitNumbers(0);
+      int nhits_in_ftd = track.getSubdetectorHitNumbers(1);
+      int nhits_in_sit = track.getSubdetectorHitNumbers(2);
+#else
       int nhits_in_vxd = track.getSubDetectorHitNumbers(0);
       int nhits_in_ftd = track.getSubDetectorHitNumbers(1);
       int nhits_in_sit = track.getSubDetectorHitNumbers(2);
+#endif
       
       //debug() << " Hit numbers for Track "<< track.id() << ": "
       debug() << " Hit numbers for Track "<< iTrk <<": "
diff --git a/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp b/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp
index 05d12daeb2d9f5367e8e0f1c5bde76f490a8d114..d218e041b47024844daf858f9abf23d77693143f 100644
--- a/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp
+++ b/Reconstruction/Tracking/src/Clupatra/ClupatraAlg.cpp
@@ -799,7 +799,7 @@ StatusCode ClupatraAlg::execute() {
 	//===============================================================================================
 
 	// FIXME Mingrui
-	debug()  << " ===========    refitting final " << cluList.size() << " track segments  "   << endmsg ;
+	debug()  << " =========== refitting final " << cluList.size() << " track segments chi2 cut = " << _dChi2Max << endmsg ;
 
 	//---- refit cluster tracks individually to save memory ( KalTest tracks have ~1MByte each)
 
@@ -811,10 +811,12 @@ StatusCode ClupatraAlg::execute() {
 			continue ;
 
 		MarlinTrk::IMarlinTrack* trk = fit( *icv ) ;
-		trk->smooth() ;
-		edm4hep::MutableTrack edm4hepTrk = converter( *icv ) ;
-		tsCol_tmp.push_back( new ClupaPlcioTrack(edm4hepTrk) ) ;
-		MarTrk_of_edm4hepTrack(edm4hepTrk) = 0 ;
+		if(trk){
+		  trk->smooth() ;
+		  edm4hep::MutableTrack edm4hepTrk = converter( *icv ) ;
+		  tsCol_tmp.push_back( new ClupaPlcioTrack(edm4hepTrk) ) ;
+		  MarTrk_of_edm4hepTrack(edm4hepTrk) = 0 ;
+		}
 		delete trk ;
 	}
 
@@ -883,14 +885,13 @@ StatusCode ClupatraAlg::execute() {
 
 			nntrkclu.cluster( incSegVec.begin() , incSegVec.end() , std::back_inserter( incSegCluVec ), trkMerge , 2  ) ;
 
-			// FIXME: Mingrui
-			// streamlog_out( DEBUG4 ) << " ===== merged track segments - # cluster: " << incSegCluVec.size()
-			//  << " from " << incSegVec.size() << " incomplete track segments "    << "  ============================== " << std::endl ;
+			debug() << " ===== merged track segments - # cluster: " << incSegCluVec.size()
+				<< " from " << incSegVec.size() << " incomplete track segments =====" << endmsg;
 
 			for(  TrackClusterer::cluster_vector::iterator it= incSegCluVec.begin() ; it != incSegCluVec.end() ; ++it) {
 
 				// FIXME: Mingrui
-				// streamlog_out( DEBUG4 ) <<  edm4hep::header<edm4hep::Track>() << std::endl ;
+                                // streamlog_out( DEBUG4 ) <<  edm4hep::header<edm4hep::Track>() << std::endl ;
 
 				TrackClusterer::cluster_type*  incSegClu = *it ;
 
@@ -951,8 +952,7 @@ StatusCode ClupatraAlg::execute() {
 				delete mTrk ;
 				computeTrackInfo( track ) ;
 
-				// FIXME: Mingrui
-				// streamlog_out( DEBUG4 ) << "   ******  created new track : " << " : " << lcshort( (Track*) track )  << std::endl ;
+				debug() << "   ******  created new track : " << " : " << track.id() << endmsg;
 
 			}
 		}// loop over l
diff --git a/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp b/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp
index 9ecee56418ae4387e73572d73b42b757a92bd2b2..17a8dcbb43eae981f3341775b1e3ed363c4459f8 100644
--- a/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp
+++ b/Reconstruction/Tracking/src/Clupatra/clupatra_new.cpp
@@ -19,6 +19,9 @@
 #include "k4FWCore/DataHandle.h"
 #include "GaudiAlg/GaudiAlgorithm.h"
 #include "GearSvc/IGearSvc.h"
+
+#include "podio/podioVersion.h"
+
 using namespace MarlinTrk ;
 
 namespace lcio{
@@ -287,7 +290,12 @@ namespace clupatra_new{
 		UTIL::BitField64 encoder( UTIL::ILDCellID0::encoder_string ) ;
 		encoder[UTIL::ILDCellID0::subdet] = UTIL::ILDDetID::TPC ;
 
-		edm4hep::TrackerHit firstHit; // =  0 ;
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
+		edm4hep::TrackerHit firstHit = 0;
+#else
+		auto firstHit = edm4hep::TrackerHit::makeEmpty();
+#endif
+		// = 0 equal to unlink()
                 //firstHit.unlink();
 
 		IMarlinTrack* bwTrk = 0 ;
@@ -1409,7 +1417,11 @@ start:
 #if use_fit_at_last_hit
 				code = mtrk->getTrackState( lHit, tsLH, chi2, ndf ) ;
 #else     // get the track state at the last hit by propagating from the last(first) constrained fit position (a la MarlinTrkUtils)
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
 				edm4hep::TrackerHit last_constrained_hit(0);
+#else
+				auto last_constrained_hit = edm4hep::TrackerHit::makeEmpty();
+#endif
 				code = mtrk->getTrackerHitAtPositiveNDF( last_constrained_hit );
 				//code = mtrk->smooth() ;
 				if( code != MarlinTrk::IMarlinTrack::success ){
diff --git a/Reconstruction/Tracking/src/Clupatra/clupatra_new.h b/Reconstruction/Tracking/src/Clupatra/clupatra_new.h
index 6ace630a7dcf6bdc552426f519f62c51a992da1a..af946bf255dc92e465d830ea1f71d149e01d32b2 100644
--- a/Reconstruction/Tracking/src/Clupatra/clupatra_new.h
+++ b/Reconstruction/Tracking/src/Clupatra/clupatra_new.h
@@ -30,6 +30,8 @@
 #include "TrackSystemSvc/IMarlinTrack.h"
 #include "TrackSystemSvc/IMarlinTrkSystem.h"
 
+#include "podio/podioVersion.h"
+
 // ----- include for verbosity dependend logging ---------
 // #include "marlin/VerbosityLevels.h"
 
@@ -57,7 +59,11 @@ namespace clupatra_new{
 		ClupaHit() :layer(-1),
 		zIndex(-1),
 		phiIndex(-1),
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
 		edm4hepHit(0),
+#else
+		edm4hepHit(edm4hep::TrackerHit::makeEmpty()),
+#endif
 		pos(0.,0.,0.) {}
 		int layer ;
 		int zIndex ;
diff --git a/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp b/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp
index 08e1fb022fdfc240dd127957085fb954ca2edf54..ee5f1feb25c5cda5c95f0f4d9dab9801e943db04 100755
--- a/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp
+++ b/Reconstruction/Tracking/src/FullLDCTracking/FullLDCTrackingAlg.cpp
@@ -8,6 +8,14 @@
 #include <edm4hep/TrackerHit.h>
 #include <edm4hep/TrackerHit.h>
 #include <edm4hep/Track.h>
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
 
 #include <iostream>
 #include <algorithm>
@@ -513,11 +521,19 @@ void FullLDCTrackingAlg::AddTrackColToEvt(TrackExtendedVec & trkVec, edm4hep::Tr
     float z0TrkCand = trkCand->getZ0();
     //    float phi0TrkCand = trkCand->getPhi();
     // FIXME, fucd
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+    int nhits_in_vxd = track.getSubdetectorHitNumbers(0);
+    int nhits_in_ftd = track.getSubdetectorHitNumbers(1);
+    int nhits_in_sit = track.getSubdetectorHitNumbers(2);
+    int nhits_in_tpc = track.getSubdetectorHitNumbers(3);
+    int nhits_in_set = track.getSubdetectorHitNumbers(4);
+#else
     int nhits_in_vxd = track.getSubDetectorHitNumbers(0);
     int nhits_in_ftd = track.getSubDetectorHitNumbers(1);
     int nhits_in_sit = track.getSubDetectorHitNumbers(2);
     int nhits_in_tpc = track.getSubDetectorHitNumbers(3);
     int nhits_in_set = track.getSubDetectorHitNumbers(4);
+#endif
     //int nhits_in_vxd = Track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - 2 ];
     //int nhits_in_ftd = Track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 2 ];
     //int nhits_in_sit = Track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SIT - 2 ];
@@ -1150,13 +1166,18 @@ void FullLDCTrackingAlg::prepareVectors() {
       trackExt->setNDF(tpcTrack.getNdf());
       trackExt->setChi2(tpcTrack.getChi2());
       for (int iHit=0;iHit<nHits;++iHit) {
-	edm4hep::TrackerHit hit = tpcTrack.getTrackerHits(iHit);//hitVec[iHit];
-	if(!hit.isAvailable()) error() << "Tracker hit not available" << endmsg;
+	edm4hep::TrackerHit hit = tpcTrack.getTrackerHits(iHit);
+	if (!hit.isAvailable()) {
+	  error() << "Tracker hit not available" << endmsg;
+	  continue;
+	}
 	//info() << "hit " << hit.id() << " " << hit.getCellID() << " " << hit.getPosition()[0] << " " << hit.getPosition()[1] << " " << hit.getPosition()[2] << endmsg;
 	auto it = mapTrackerHits.find(hit);
-	if(it==mapTrackerHits.end()) error() << "Cannot find hit " << hit.id() << " in map" << endmsg;
-	else continue;
-        TrackerHitExtended * hitExt = it->second;
+	if (it==mapTrackerHits.end()) {
+	  error() << "Cannot find hit " << hit.id() << " in map" << endmsg;
+	  continue;
+	}
+        TrackerHitExtended* hitExt = it->second;
 	//info() << hit.id() << " " << hitExt << endmsg;
         hitExt->setTrackExtended( trackExt );
         trackExt->addTrackerHitExtended( hitExt );
@@ -1215,8 +1236,17 @@ void FullLDCTrackingAlg::prepareVectors() {
       char strg[200];
       HelixClass helixSi;
       for (int iHit=0;iHit<nHits;++iHit) {
-	edm4hep::TrackerHit hit = siTrack.getTrackerHits(iHit);//hitVec[iHit];
-        TrackerHitExtended * hitExt = mapTrackerHits[hit];
+	edm4hep::TrackerHit hit = siTrack.getTrackerHits(iHit);
+	if (!hit.isAvailable()) {
+	  error() << "Tracker hit not available" << endmsg;
+	  continue;
+	}
+	auto it = mapTrackerHits.find(hit);
+        if (it==mapTrackerHits.end()) {
+	  error() << "Cannot find hit " << hit.id() << " in map" << endmsg;
+	  continue;
+	}
+        TrackerHitExtended* hitExt = it->second;
         hitExt->setTrackExtended( trackExt );
         
         trackExt->addTrackerHitExtended( hitExt );
@@ -1518,8 +1548,8 @@ TrackExtended * FullLDCTrackingAlg::CombineTracks(TrackExtended * tpcTrack, Trac
   int nTPCHits = int(tpcHitVec.size());
   int nHits = nTPCHits + nSiHits;
   
-  //std::cout << "FullLDCTrackingAlg::CombineTracks nSiHits = " << nSiHits << endmsg;
-  //std::cout << "FullLDCTrackingAlg::CombineTracks nTPCHits = " << nTPCHits << endmsg;
+  //debug() << "FullLDCTrackingAlg::CombineTracks nSiHits = " << nSiHits << endmsg;
+  //debug() << "FullLDCTrackingAlg::CombineTracks nTPCHits = " << nTPCHits << endmsg;
   
   TrackerHitVec trkHits;
   trkHits.reserve(nHits);
@@ -1732,7 +1762,7 @@ TrackExtended * FullLDCTrackingAlg::CombineTracks(TrackExtended * tpcTrack, Trac
       tpcHitInFit.push_back(tpcHitVec[i]);
     }
   }
-  
+
   debug() << "FullLDCTrackingAlg::CombineTracks: Check for Silicon Hit rejections ... " << endmsg;
   
   if ( (int)siOutliers.size() > _maxAllowedSiHitRejectionsForTrackCombination ) {
diff --git a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp
index 28eabd34273659c5ede08e46833c5a13136a9702..611b7789d2c5382a9c25a6dcb7cacb69351b156d 100644
--- a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp
+++ b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp
@@ -418,7 +418,9 @@ void TruthTrackerAlg::getTrackStateFromMcParticle(
         mcParticleVertexSmeared.z=
             CLHEP::RandGauss::shoot(mcParticleVertex.z,m_resVertexZ);
         ///Momentum
+
         const edm4hep::Vector3f mcParticleMom=mcParticle.getMomentum();//GeV
+
         double mcParticlePt=sqrt(mcParticleMom.x*mcParticleMom.x+
                 mcParticleMom.y*mcParticleMom.y);
         //double mcParticlePtSmeared=
diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp
index e96ae681694de49f30b430dedf1ec1ac9568f0e3..695e455499efff51aeca796bb0ee45bd1d8b7020 100644
--- a/Service/GearSvc/src/GearSvc.cpp
+++ b/Service/GearSvc/src/GearSvc.cpp
@@ -135,7 +135,7 @@ StatusCode GearSvc::initialize()
     m_gearMgr->setYokeBarrelParameters(barrelYokeParam) ;
     m_gearMgr->setYokeEndcapParameters(endcapYokeParam) ;
     m_gearMgr->setYokePlugParameters(plugYokeParam) ;
-    gear::TiXmlDocument* doc = new gear::TiXmlDocument ;
+
     gear::GearXML::createXMLFile(m_gearMgr, "test.xml");
   }
   
diff --git a/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc b/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc
index ffedd64edb8558338e69a028ddcdcbf8021d42e1..3ca601461c16443ca6352740f3358c3a4eb499cb 100644
--- a/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc
+++ b/Service/TrackSystemSvc/src/MarlinKalTestTrack.cc
@@ -26,6 +26,8 @@
 #include "gear/GEAR.h"
 #include "gear/BField.h"
 
+#include "podio/podioVersion.h"
+
 //#include "streamlog/streamlog.h"
 
 
@@ -76,8 +78,12 @@ namespace MarlinTrk {
   
   
   MarlinKalTestTrack::MarlinKalTestTrack(MarlinKalTest* ktest) 
-    : _ktest(ktest), _trackHitAtPositiveNDF(edm4hep::TrackerHit(0)) {
-    
+    : _ktest(ktest),
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
+      _trackHitAtPositiveNDF(edm4hep::TrackerHit(0)) {
+#else
+      _trackHitAtPositiveNDF(edm4hep::TrackerHit::makeEmpty()) {
+#endif
     _kaltrack = new TKalTrack() ;
     _kaltrack->SetOwner() ;
     
diff --git a/Service/TrackSystemSvc/src/MarlinTrkUtils.cc b/Service/TrackSystemSvc/src/MarlinTrkUtils.cc
index ffa0f7f9395accd360f1efce633308447873d258..fcacb19cf8fead3e3204d70af7517f286372faef 100644
--- a/Service/TrackSystemSvc/src/MarlinTrkUtils.cc
+++ b/Service/TrackSystemSvc/src/MarlinTrkUtils.cc
@@ -16,6 +16,15 @@
 #include "edm4hep/Track.h"
 #include "edm4hep/MutableTrack.h"
 
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
+
 #include <UTIL/BitField64.h>
 #include <UTIL/ILDConf.h>
 #include <UTIL/BitSet32.h>
@@ -24,6 +33,8 @@
 
 #include "TMatrixD.h"
 
+#include "podio/podioVersion.h"
+
 #define MIN_NDF 6
 
 namespace MarlinTrk {
@@ -258,7 +269,9 @@ namespace MarlinTrk {
     // set the initial track parameters  
     ///////////////////////////////////////////////////////
     
-    return_error = marlinTrk->initialise( *pre_fit, bfield_z, IMarlinTrack::backward ) ;
+    //return_error = marlinTrk->initialise( *pre_fit, bfield_z, IMarlinTrack::backward ) ;
+    // fucd: previous fixed as IMarlinTrack::backward, can not change? using input value now
+    return_error = marlinTrk->initialise( *pre_fit, bfield_z, fit_backwards ) ;
     if (return_error != IMarlinTrack::success) {
       
       std::cout << "MarlinTrk::createFit Initialisation of track fit failed with error : " << return_error << std::endl;
@@ -388,10 +401,10 @@ namespace MarlinTrk {
     return_error = marlintrk->getNDF(ndf);
 
     if ( return_error != IMarlinTrack::success) {
-      //streamlog_out(DEBUG3) << "MarlinTrk::finaliseLCIOTrack: getNDF returns " << return_error << std::endl;
+      //std::cout << "MarlinTrk::finaliseLCIOTrack: getNDF returns " << return_error << std::endl;
       return return_error;
     } else if( ndf < 0 ) {
-      //streamlog_out(DEBUG2) << "MarlinTrk::finaliseLCIOTrack: number of degrees of freedom less than 0 track dropped : NDF = " << ndf << std::endl;
+      //std::cout << "MarlinTrk::finaliseLCIOTrack: number of degrees of freedom less than 0 track dropped : NDF = " << ndf << std::endl;
       return IMarlinTrack::error;
     } else {
       //streamlog_out(DEBUG1) << "MarlinTrk::finaliseLCIOTrack: NDF = " << ndf << std::endl;
@@ -481,9 +494,14 @@ namespace MarlinTrk {
     ///////////////////////////////////////////////////////
     
     edm4hep::TrackState* trkStateAtLastHit = new edm4hep::TrackState() ;
+
     edm4hep::TrackerHit lastHit = hits_in_fit.front().first;
           
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
     edm4hep::TrackerHit last_constrained_hit(0);// = 0 ;
+#else
+		auto last_constrained_hit = edm4hep::TrackerHit::makeEmpty();
+#endif
     marlintrk->getTrackerHitAtPositiveNDF(last_constrained_hit);
 
     return_error = marlintrk->smooth(lastHit);
@@ -543,7 +561,6 @@ namespace MarlinTrk {
       track->addToTrackStates(*trkStateAtFirstHit);
     } else {
       //streamlog_out( WARNING ) << "  >>>>>>>>>>> MarlinTrk::finaliseLCIOTrack:  could not get TrackState at First Hit " << firstHit << std::endl ;
-      delete trkStateAtFirstHit;
     }
     
     double r_first = firstHit.getPosition()[0]*firstHit.getPosition()[0] + firstHit.getPosition()[1]*firstHit.getPosition()[1];
@@ -569,7 +586,7 @@ namespace MarlinTrk {
         track->addToTrackStates(*trkStateAtLastHit);
       } else {
 	std::cout << "ERROR>>>>>>>>>>> MarlinTrk::finaliseLCIOTrack:  could not get TrackState at Last Hit " << last_constrained_hit.id() << std::endl ;
-        delete trkStateAtLastHit;
+        //delete trkStateAtLastHit;
       }
       
 //      const EVENT::FloatVec& ma = trkStateAtLastHit->getCovMatrix();
@@ -587,17 +604,22 @@ namespace MarlinTrk {
 //      return_error = createTrackStateAtCaloFace(marlintrk, trkStateCalo, lastHit, tanL_is_positive);
       
       if ( return_error == 0 ) {
+	//std::cout << "fucdout referencePoint " << trkStateCalo.referencePoint << std::endl;
         trkStateCalo.location = MarlinTrk::Location::AtCalorimeter;
         track->addToTrackStates(trkStateCalo);
       } else {
-        //streamlog_out( WARNING ) << "  >>>>>>>>>>> MarlinTrk::finaliseLCIOTrack:  could not get TrackState at Calo Face "  << std::endl ;
+	std::cout << "  >>>>>>>>>>> MarlinTrk::finaliseLCIOTrack:  could not get TrackState at Calo Face "  << std::endl ;
         //delete trkStateCalo;
       }
     } else {
       track->addToTrackStates(*atLastHit);
       track->addToTrackStates(*atCaloFace);
+      //delete trkStateAtLastHit;
     }
-    
+
+    if(trkStateAtFirstHit) delete trkStateAtFirstHit;
+    if(trkStateAtLastHit)  delete trkStateAtLastHit;
+    if(trkStateIP)         delete trkStateIP;
     ///////////////////////////////////////////////////////
     // done
     ///////////////////////////////////////////////////////
@@ -688,12 +710,21 @@ namespace MarlinTrk {
     if ( hits_in_fit == false ) { // all hit atributed by patrec
       offset = 1 ;
     }
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]);
+#else
     track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]);
     track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]);
     track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]);
     track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]);
     track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]);
     track->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]);
+#endif
     //track->subdetectorHitNumbers().resize(2 * lcio::ILDDetID::ETD);
     //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - offset ] = hitNumbers[lcio::ILDDetID::VXD];
     //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - offset ] = hitNumbers[lcio::ILDDetID::FTD];
@@ -732,12 +763,21 @@ namespace MarlinTrk {
     if ( hits_in_fit == false ) { // all hit atributed by patrec
       offset = 1 ;
     }
+#if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::FTD]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::TPC]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]);
+    track->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]);
+#else
     track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::VXD]);
     track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::FTD]);
     track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::SIT]);
     track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::TPC]);
     track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::SET]);
     track->addToSubDetectorHitNumbers(hitNumbers[lcio::ILDDetID::ETD]);
+#endif
     //track->subdetectorHitNumbers().resize(2 * lcio::ILDDetID::ETD);
     //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - offset ] = hitNumbers[lcio::ILDDetID::VXD];
     //track->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - offset ] = hitNumbers[lcio::ILDDetID::FTD];
diff --git a/Simulation/DetSimAna/CMakeLists.txt b/Simulation/DetSimAna/CMakeLists.txt
index 883dfd8215c9ccfd9e88b7d1713c442de1f5e151..b1bd935f32e1de1bb87d8c490f5967960deda351 100644
--- a/Simulation/DetSimAna/CMakeLists.txt
+++ b/Simulation/DetSimAna/CMakeLists.txt
@@ -5,12 +5,17 @@ include(${Geant4_USE_FILE})
 gaudi_add_module(DetSimAna
                  SOURCES src/Edm4hepWriterAnaElemTool.cpp
                  LINK DetSimInterface
+                      DetSimSDLib
                       ${DD4hep_COMPONENT_LIBRARIES} 
                       Gaudi::GaudiKernel
                       EDM4HEP::edm4hep EDM4HEP::edm4hepDict
                       k4FWCore::k4FWCore
 )
 
+target_include_directories(DetSimAna PUBLIC
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>/include
+  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+
 install(TARGETS DetSimAna
   EXPORT CEPCSWTargets
   RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp
index b05e7994b44cc54d2dbda14039a3700348fcc704..0c687f82701832b673c49e2a744566aa1d76b061 100644
--- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp
+++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp
@@ -1,5 +1,6 @@
 #include "Edm4hepWriterAnaElemTool.h"
 
+#include "G4Step.hh"
 #include "G4Event.hh"
 #include "G4THitsCollection.hh"
 #include "G4EventManager.hh"
@@ -12,13 +13,36 @@
 #include "DDG4/Geant4Mapping.h"
 #include "DDG4/Geant4HitCollection.h"
 #include "DDG4/Geant4Data.h"
-#include "DDG4/Geant4Hits.h"
+#include "DetSimSD/Geant4Hits.h"
 
 DECLARE_COMPONENT(Edm4hepWriterAnaElemTool)
 
 void
 Edm4hepWriterAnaElemTool::BeginOfRunAction(const G4Run*) {
+    auto msglevel = msgLevel();
+    if (msglevel == MSG::VERBOSE || msglevel == MSG::DEBUG) {
+        verboseOutput = true;
+    }
+
     G4cout << "Begin Run of detector simultion..." << G4endl;
+
+    // access geometry service
+    m_geosvc = service<IGeomSvc>("GeomSvc");
+    if (m_geosvc) {
+        dd4hep::Detector* dd4hep_geo = m_geosvc->lcdd();
+        // try to get the constants
+        R = dd4hep_geo->constant<double>("tracker_region_rmax")/dd4hep::mm*CLHEP::mm;
+        Z = dd4hep_geo->constant<double>("tracker_region_zmax")/dd4hep::mm*CLHEP::mm;
+
+        info() << "Tracker Region "
+               << " R: " << R
+               << " Z: " << Z
+               << endmsg;
+
+    } else {
+        error() << "Failed to find GeomSvc." << endmsg;
+    }
+
 }
 
 void
@@ -30,6 +54,15 @@ void
 Edm4hepWriterAnaElemTool::BeginOfEventAction(const G4Event* anEvent) {
     msg() << "Event " << anEvent->GetEventID() << endmsg;
 
+    // event info
+    m_userinfo = nullptr;
+    if (anEvent->GetUserInformation()) {
+        m_userinfo = dynamic_cast<CommonUserEventInfo*>(anEvent->GetUserInformation());
+        if (verboseOutput) {
+            m_userinfo->dumpIdxG4Track2Edm4hep();
+        }
+    }
+
     auto mcGenCol = m_mcParGenCol.get();
     mcCol = m_mcParCol.createAndPut();
 
@@ -50,17 +83,18 @@ Edm4hepWriterAnaElemTool::BeginOfEventAction(const G4Event* anEvent) {
         newparticle.setColorFlow      (mcGenParticle.getColorFlow());
     }
     
-    msg() << "mcCol size: " << mcCol->size() << endmsg;
+    msg() << "mcCol size (original) : " << mcCol->size() << endmsg;
 
     // reset
     m_track2primary.clear();
-
+ 
 }
 
 void
 Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) {
-    // save all data
 
+    msg() << "mcCol size (after simulation) : " << mcCol->size() << endmsg;
+    // save all data
     // create collections.
     auto trackercols = m_trackerCol.createAndPut();
     auto calorimetercols = m_calorimeterCol.createAndPut();
@@ -257,7 +291,12 @@ Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) {
                         pritrkid = 1;
                     }
 
-                    edm_trk_hit.setMCParticle(mcCol->at(pritrkid-1));
+                    if (m_userinfo) {
+                        auto idxedm4hep =  m_userinfo->idxG4Track2Edm4hep(pritrkid);
+                        if (idxedm4hep != -1) {
+                            edm_trk_hit.setMCParticle(mcCol->at(idxedm4hep));
+                        }
+                    }
 
                     if (pritrkid != trackID) {
                         // If the track is a secondary, then the primary track id and current track id is different
@@ -297,7 +336,12 @@ Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) {
                             pritrkid = 1;
                         }
 
-                        edm_calo_contrib.setParticle(mcCol->at(pritrkid-1)); // todo
+                        if (m_userinfo) {
+                            auto idxedm4hep =  m_userinfo->idxG4Track2Edm4hep(pritrkid);
+                            if (idxedm4hep != -1) {
+                                edm_calo_contrib.setParticle(mcCol->at(idxedm4hep)); // todo
+                            }
+                        }
                         edm_calo_hit.addToContributions(edm_calo_contrib);
                     }
                 }
@@ -345,17 +389,27 @@ void
 Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) {
     int curtrkid = track->GetTrackID(); // starts from 1
     int curparid = track->GetParentID();
+    int idxedm4hep = -1;
 
-    if (curparid == 0) {
+    if (m_userinfo) {
+        idxedm4hep =  m_userinfo->idxG4Track2Edm4hep(curtrkid);
+    }
+
+    if (curparid == 0) { // Primary Track
         // select the primary tracks (parentID == 0)
         // auto mcCol = m_mcParCol.get();
 
-        if (curtrkid-1>=mcCol->size()) {
+        if (idxedm4hep == -1) {
+            error () << "Failed to get idxedm4hep according to the g4track id " << curtrkid << endmsg;
+            return;
+        }
+
+        if (idxedm4hep>=mcCol->size()) {
             error() << "out of range: curtrkid is " << curtrkid
                     << " while the MCParticle size is " << mcCol->size() << endmsg;
             return;
         }
-        auto primary_particle = mcCol->at(curtrkid-1);
+        auto primary_particle = mcCol->at(idxedm4hep);
 
         const G4ThreeVector& stop_pos  = track->GetPosition();
         edm4hep::Vector3d endpoint(stop_pos.x()/CLHEP::mm,
@@ -407,14 +461,14 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) {
 
                 // select the necessary processes
                 if (creatorProcess==proc_decay) {
-                    info() << "Creator Process is Decay for secondary particle: "
-                           << " idx: " << i
-                           << " trkid: " << sectrk->GetTrackID() // not valid until track
-                           << " particle: " << secparticle->GetParticleName()
-                           << " pdg: " << secparticle->GetPDGEncoding()
-                           << " at position: " << sectrk->GetPosition() //
-                           << " time: " << sectrk->GetGlobalTime()
-                           << " momentum: " << sectrk->GetMomentum() // 
+                    debug() << "Creator Process is Decay for secondary particle: "
+                            << " idx: " << i
+                            << " trkid: " << sectrk->GetTrackID() // not valid until track
+                            << " particle: " << secparticle->GetParticleName()
+                            << " pdg: " << secparticle->GetPDGEncoding()
+                            << " at position: " << sectrk->GetPosition() //
+                            << " time: " << sectrk->GetGlobalTime()
+                            << " momentum: " << sectrk->GetMomentum() // 
                            << endmsg;
                     is_decay = true;
 
@@ -445,6 +499,15 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) {
 
                     mcp.addToParents(primary_particle);
                     primary_particle.addToDaughters(mcp);
+
+                    // store the edm4hep obj idx in track info.
+                    // using this idx, the MCParticle object could be modified later. 
+                    auto trackinfo = new CommonUserTrackInfo();
+                    trackinfo->setIdxEdm4hep(mcp.getObjectID().index);
+                    sectrk->SetUserInformation(trackinfo);
+                    debug() << " Appending MCParticle: (id: " 
+                            << mcp.getObjectID().index << ")"
+                            << endmsg;
                 }
             }
         }
@@ -462,8 +525,36 @@ Edm4hepWriterAnaElemTool::PostUserTrackingAction(const G4Track* track) {
 }
 
 void
-Edm4hepWriterAnaElemTool::UserSteppingAction(const G4Step*) {
-
+Edm4hepWriterAnaElemTool::UserSteppingAction(const G4Step* aStep) {
+    auto aTrack = aStep->GetTrack();
+    // try to get user track info
+    auto trackinfo = dynamic_cast<CommonUserTrackInfo*>(aTrack->GetUserInformation());
+
+    // ========================================================================
+    // Note:
+    // if there is no track info, then do nothing. 
+    // ========================================================================
+    if (trackinfo) {
+        // back scattering is defined as following:
+        // - pre point is not in tracker
+        // - post point is in tracker
+        // For details, look at Mokka's source code:
+        //   https://llrforge.in2p3.fr/trac/Mokka/browser/trunk/source/Kernel/src/SteppingAction.cc
+        const auto& pre_pos = aStep->GetPreStepPoint()->GetPosition();
+        const auto& post_pos = aStep->GetPostStepPoint()->GetPosition();
+
+        bool is_pre_in_tracker = pre_pos.perp() < R && std::fabs(pre_pos.z()) < Z;
+        bool is_post_in_tracker = post_pos.perp() < R && std::fabs(post_pos.z()) < Z;
+
+        if ((!is_pre_in_tracker) and is_post_in_tracker) {
+            // set back scattering
+            auto idxedm4hep = trackinfo->idxEdm4hep();
+            mcCol->at(idxedm4hep).setBackscatter(true);
+            debug() << " set back scatter for MCParticle "
+                    << " (ID: " << idxedm4hep << ")"
+                    << endmsg;
+        }
+    }
 }
 
 StatusCode
diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
index 7b992d3076c0ddfa7b7bd9f5d8639274ba0538b1..e4415b17899012530817186c0428581b585bad62 100644
--- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
+++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
@@ -6,6 +6,10 @@
 #include "GaudiKernel/AlgTool.h"
 #include "k4FWCore/DataHandle.h"
 #include "DetSimInterface/IAnaElemTool.h"
+#include "DetSimInterface/CommonUserEventInfo.hh"
+#include "DetSimInterface/CommonUserTrackInfo.hh"
+
+#include "DetInterface/IGeomSvc.h"
 
 #include "edm4hep/MCParticleCollection.h"
 #include "edm4hep/SimTrackerHitCollection.h"
@@ -42,10 +46,10 @@ public:
 private:
     // In order to associate MCParticle with contribution, we need to access MC Particle.
     // - collection MCParticle: the particles in Generator
-    DataHandle<edm4hep::MCParticleCollection> m_mcParGenCol{"MCParticle", 
+    DataHandle<edm4hep::MCParticleCollection> m_mcParGenCol{"MCParticleGen", 
             Gaudi::DataHandle::Writer, this};
     // - collection MCParticleG4: the simulated particles in Geant4
-    DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticleG4", 
+    DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticle", 
             Gaudi::DataHandle::Writer, this};
     edm4hep::MCParticleCollection* mcCol;
 
@@ -140,6 +144,14 @@ private:
 
     std::map<int, int> m_track2primary;
 
+    CommonUserEventInfo* m_userinfo = nullptr;
+
+    // get the limitation of R/Z in tracker
+    SmartIF<IGeomSvc> m_geosvc;
+    double R = 0;
+    double Z = 0;
+
+    bool verboseOutput = false;
 };
 
 #endif
diff --git a/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp b/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp
index d912414d4108a8f45efdb394d26ddcfab5fc0d21..1e11da48b5c8872ff1553c95025597a2a7db251c 100644
--- a/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp
+++ b/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp
@@ -9,7 +9,7 @@
 #include "DDG4/Geant4Mapping.h"
 #include "DDG4/Geant4HitCollection.h"
 #include "DDG4/Geant4Data.h"
-#include "DDG4/Geant4Hits.h"
+#include "DetSimSD/Geant4Hits.h"
 
 DECLARE_COMPONENT(ExampleAnaElemTool)
 
diff --git a/Simulation/DetSimCore/src/DetSimSvc.cpp b/Simulation/DetSimCore/src/DetSimSvc.cpp
index dd26f3bb580d38e6f35b852e05e996865eaeca27..7bd32614fa2b400009afc0f35eb28c7bcb31ec74 100644
--- a/Simulation/DetSimCore/src/DetSimSvc.cpp
+++ b/Simulation/DetSimCore/src/DetSimSvc.cpp
@@ -39,7 +39,7 @@ DetSimSvc::simulateEvent(int i_event) {
     StatusCode sc;
 
     m_runmgr->ProcessOneEvent(i_event);
-
+    m_runmgr->TerminateOneEvent();
     return sc;
 }
 
diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
index c756412f62dccf71d5628191b10f4a4e6f555e26..9e027750383bbb8c856248f4736275a730b843e0 100644
--- a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
+++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
@@ -5,24 +5,43 @@
 #include "G4IonTable.hh"
 #include "G4ParticleDefinition.hh"
 
+#include "DetSimInterface/CommonUserEventInfo.hh"
+
 DECLARE_COMPONENT(G4PrimaryCnvTool)
 
 bool G4PrimaryCnvTool::mutate(G4Event* anEvent) {
 
+    // create a event info
+    auto eventinfo = new CommonUserEventInfo();
+    anEvent->SetUserInformation(eventinfo);
+
+    int idxG4 = 0;       // valid: [1, N+1)
+    int idxEdm4hep = -1; // valid: [0, N)
+
     auto mcCol = m_mcParCol.get();
-    info() << "Start a new event: " << endmsg;
+    info() << "Start a new event " << anEvent->GetEventID() << endmsg;
     for ( auto p : *mcCol ) {
-        info() << p.getObjectID().index << " : [";
+        debug() << " gen track: " << p.getObjectID().index 
+                << " : (status: " << p.getGeneratorStatus() << ")"
+                << " : (daughters: [";
         for ( auto it = p.daughters_begin(), end = p.daughters_end(); it != end; ++it ) {
-            info() << " " << it->getObjectID().index;
+            debug() << " " << it->getObjectID().index;
         }
-        info() << " ]; " << endmsg;
+        debug() << " ]); " << endmsg;
+
+        // idx in mc particle collection
+        ++idxEdm4hep;
 
         // only the GeneratorStatus == 1 is used.
         if (p.getGeneratorStatus() != 1) {
             continue;
         }
 
+        // idx in g4 collection
+        ++idxG4;
+
+        eventinfo->setIdxG4Track2Edm4hep(idxG4, idxEdm4hep);
+
         // vertex
         const edm4hep::Vector3d& vertex = p.getVertex();
         double t = p.getTime()*CLHEP::ns;
@@ -31,11 +50,11 @@ bool G4PrimaryCnvTool::mutate(G4Event* anEvent) {
                                                      vertex.z*CLHEP::mm,
                                                      t);
 
-        info() << "Geant4 Primary Vertex: ("
-               << vertex.x*CLHEP::mm << ","
-               << vertex.y*CLHEP::mm << ","
-               << vertex.z*CLHEP::mm << ")"
-               << endmsg;
+        debug() << "--> Creating Geant4 Primary Vertex: ("
+                << vertex.x*CLHEP::mm << ","
+                << vertex.y*CLHEP::mm << ","
+                << vertex.z*CLHEP::mm << ")"
+                << endmsg;
 
         // pdg/particle
         int pdgcode = p.getPDG();
@@ -53,7 +72,7 @@ bool G4PrimaryCnvTool::mutate(G4Event* anEvent) {
             particle_def = particletbl->FindParticle(pdgcode);
         }
         // momentum
-        const edm4hep::Vector3f& momentum = p.getMomentum();
+        const auto& momentum = p.getMomentum();
         G4PrimaryParticle* g4prim = new G4PrimaryParticle(particle_def,
                                                           momentum.x*CLHEP::GeV,
                                                           momentum.y*CLHEP::GeV,
diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.h b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h
index 1e47772177fd0c5f2e57029bae512a2c12f7813e..70b143fc57409b0f1010a86636b5db84d3391855 100644
--- a/Simulation/DetSimCore/src/G4PrimaryCnvTool.h
+++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h
@@ -16,7 +16,7 @@ public:
     bool mutate(G4Event* anEvent) override;
 
 private:
-    DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticle", Gaudi::DataHandle::Reader, this};
+    DataHandle<edm4hep::MCParticleCollection> m_mcParCol{"MCParticleGen", Gaudi::DataHandle::Reader, this};
 
     Gaudi::Property<double> m_chargedgeantino_mass{this, "ChargedGeantinoMass"};
 };
diff --git a/Simulation/DetSimDedx/CMakeLists.txt b/Simulation/DetSimDedx/CMakeLists.txt
index fb8e4d3a65429de7514834b96268b8cae7b611fb..867ff20cd4b6ed8f04919b89340901dccbb12272 100644
--- a/Simulation/DetSimDedx/CMakeLists.txt
+++ b/Simulation/DetSimDedx/CMakeLists.txt
@@ -1,15 +1,31 @@
 
 find_package(Geant4 REQUIRED ui_all vis_all)
 include(${Geant4_USE_FILE})
+find_package(Garfield REQUIRED)
+message(Garfield::Garfield)
+message("libonnxruntime ${OnnxRuntime_LIBRARY}")
+message("libonnxruntime include ${OnnxRuntime_INCLUDE_DIR}")
+find_package(OnnxRuntime REQUIRED)
 
+message("libonnxruntime ${OnnxRuntime_LIBRARY}")
 gaudi_add_module(DetSimDedx
                  SOURCES src/DummyDedxSimTool.cpp
                          src/BetheBlochEquationDedxSimTool.cpp
                          src/GFDndxSimTool.cpp
+                         src/TrackHeedSimTool.cpp
 
                  LINK DetSimInterface
+                      DetInterface
+                      DetSegmentation
                       ${DD4hep_COMPONENT_LIBRARIES}
                       Gaudi::GaudiKernel
                       EDM4HEP::edm4hep EDM4HEP::edm4hepDict
+                      k4FWCore::k4FWCore
+                      Garfield::Garfield
+                      OnnxRuntime
+                      #${OnnxRuntime_LIBRARY}
+                      #/cvmfs/sft.cern.ch/lcg/views/LCG_103/x86_64-centos7-gcc11-opt/lib/libonnxruntime.so
+                      ${CLHEP_LIBRARIES}
+ 
 )
 
diff --git a/Simulation/DetSimDedx/src/TrackHeedSimTool.cpp b/Simulation/DetSimDedx/src/TrackHeedSimTool.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f66c582b2a90d19ad86ede717d7e538ca51d9de0
--- /dev/null
+++ b/Simulation/DetSimDedx/src/TrackHeedSimTool.cpp
@@ -0,0 +1,659 @@
+#include "TrackHeedSimTool.h"
+#include "G4Step.hh"
+#include "G4SystemOfUnits.hh"
+#include <G4VProcess.hh>
+#include "G4TransportationManager.hh"
+#include "G4Navigator.hh"
+#include "G4VPhysicalVolume.hh"
+#include "G4LogicalVolume.hh"
+#include <G4VTouchable.hh>
+#include "DDG4/Geant4Converter.h"
+#include "DetSegmentation/GridDriftChamber.h"
+
+
+#include <math.h>
+#include <cmath>
+#include <iostream>
+#include <time.h>
+#include "CLHEP/Random/RandGauss.h"
+
+
+DECLARE_COMPONENT(TrackHeedSimTool)
+
+double TrackHeedSimTool::dedx(const edm4hep::MCParticle& mc) {return 0;}
+double TrackHeedSimTool::dndx(double betagamma) {return 0;}
+
+double TrackHeedSimTool::dedx(const G4Step* Step)
+{
+    if(m_beginEvt){
+        m_SimPrimaryIonizationCol =  m_SimPrimaryIonizationColWriter.createAndPut();
+        m_beginEvt = false;
+    }
+    clock_t t0 = clock();
+    double de = 0;
+    float cm_to_mm = 10; 
+    G4Step* aStep = const_cast<G4Step*>(Step);
+    G4Track* g4Track  =  aStep->GetTrack();
+    int pdg_code        = g4Track->GetParticleDefinition()->GetPDGEncoding();
+    G4double pdg_mass   = g4Track->GetParticleDefinition()->GetPDGMass();
+    G4double pdg_charge = g4Track->GetParticleDefinition()->GetPDGCharge();
+    const G4VProcess* creatorProcess = g4Track->GetCreatorProcess();
+    const G4String tmp_str_pro = (creatorProcess !=0) ? creatorProcess->GetProcessName() : "normal";
+    G4double gammabeta=aStep->GetPreStepPoint()->GetBeta() * aStep->GetPreStepPoint()->GetGamma();
+    if(g4Track->GetParticleDefinition()->GetPDGCharge() ==0) return 0;//skip neutral particle 
+    if(gammabeta<0.01)return m_eps;//too low momentum
+    if(m_only_primary.value() && g4Track->GetParentID() != 0) return m_eps;
+    if(g4Track->GetKineticEnergy() <=0) return 0;
+    if(pdg_code == 11 && (tmp_str_pro=="phot" || tmp_str_pro=="hIoni" || tmp_str_pro=="eIoni" || tmp_str_pro=="muIoni" || tmp_str_pro=="ionIoni" ) ) return m_eps;//skip the electron produced by Ioni, because it is already simulated by TrackHeed
+    if(m_particle_map.find(pdg_code) == m_particle_map.end() ) return m_eps;
+    edm4hep::MCParticleCollection* mcCol = nullptr;
+    try{
+        mcCol = const_cast<edm4hep::MCParticleCollection*>(m_mc_handle.get());
+    }
+    catch(...){
+        G4cout<<"Error! Can't find MCParticle collection in event, please check it have been createAndPut() in Begin of event"<<G4endl;
+        throw "stop here!";
+    }
+
+    G4double track_KE   = aStep->GetPreStepPoint()->GetKineticEnergy();
+    G4double track_time = aStep->GetPreStepPoint()->GetGlobalTime();
+    G4double track_dx     = aStep->GetPreStepPoint()->GetMomentumDirection ().x();
+    G4double track_dy     = aStep->GetPreStepPoint()->GetMomentumDirection ().y();
+    G4double track_dz     = aStep->GetPreStepPoint()->GetMomentumDirection ().z();
+    G4double track_length = aStep->GetStepLength();
+    G4double position_x   = aStep->GetPreStepPoint()->GetPosition().x();
+    G4double position_y   = aStep->GetPreStepPoint()->GetPosition().y();
+    G4double position_z   = aStep->GetPreStepPoint()->GetPosition().z();
+    int track_ID = g4Track->GetTrackID();
+    int Parent_ID = g4Track->GetParentID();
+    bool update_ke = true;
+    if(m_use_max_step.value()){
+        bool do_sim = false;
+        if(m_isFirst){
+            m_pre_x  = aStep->GetPreStepPoint()->GetPosition().x();
+            m_pre_y  = aStep->GetPreStepPoint()->GetPosition().y();
+            m_pre_z  = aStep->GetPreStepPoint()->GetPosition().z();
+            m_pre_dx = aStep->GetPreStepPoint()->GetMomentumDirection().x();
+            m_pre_dy = aStep->GetPreStepPoint()->GetMomentumDirection().y();
+            m_pre_dz = aStep->GetPreStepPoint()->GetMomentumDirection().z();
+            m_pre_t  = aStep->GetPreStepPoint()->GetGlobalTime();
+            m_post_point = aStep->GetPostStepPoint();
+            m_total_range += track_length;
+            m_current_track_ID = g4Track->GetTrackID();
+            m_current_Parent_ID = g4Track->GetParentID();
+            m_pdg_code = g4Track->GetParticleDefinition()->GetPDGEncoding(); 
+            m_isFirst = false;    
+            m_pa_KE =  aStep->GetPreStepPoint()->GetKineticEnergy();
+        }
+        else{
+        
+            if(g4Track->GetTrackID() != m_current_track_ID){
+                do_sim = true;
+                m_change_track = true;
+                update_ke = false;
+            }
+            else{
+                m_post_point = aStep->GetPostStepPoint();
+                m_total_range += track_length;
+            }
+        }
+        if(m_total_range/CLHEP::mm >= m_max_step.value()){
+            do_sim = true;
+        }
+        if(do_sim){
+            track_KE = m_pa_KE;
+            pdg_code = m_pdg_code;
+            track_length = m_total_range;
+            track_time = m_pre_t;
+            track_dx = m_pre_dx;
+            track_dy = m_pre_dy;
+            track_dz = m_pre_dz;
+            position_x = m_pre_x;
+            position_y = m_pre_y;
+            position_z = m_pre_z;
+            track_ID = m_current_track_ID;
+            Parent_ID = m_current_Parent_ID;
+            if(m_change_track){
+                m_pre_x  = aStep->GetPreStepPoint()->GetPosition().x();
+                m_pre_y  = aStep->GetPreStepPoint()->GetPosition().y();
+                m_pre_z  = aStep->GetPreStepPoint()->GetPosition().z();
+                m_pre_dx = aStep->GetPreStepPoint()->GetMomentumDirection().x();
+                m_pre_dy = aStep->GetPreStepPoint()->GetMomentumDirection().y();
+                m_pre_dz = aStep->GetPreStepPoint()->GetMomentumDirection().z();
+                m_pre_t  = aStep->GetPreStepPoint()->GetGlobalTime();
+                m_post_point = aStep->GetPostStepPoint(); 
+                m_total_range = aStep->GetStepLength();
+                m_current_track_ID = g4Track->GetTrackID();
+                m_current_Parent_ID = g4Track->GetParentID();
+                m_pdg_code = g4Track->GetParticleDefinition()->GetPDGEncoding(); 
+                m_change_track = false;
+            }
+            else{
+                m_pre_x  = aStep->GetPostStepPoint()->GetPosition().x();
+                m_pre_y  = aStep->GetPostStepPoint()->GetPosition().y();
+                m_pre_z  = aStep->GetPostStepPoint()->GetPosition().z();
+                m_pre_dx = aStep->GetPostStepPoint()->GetMomentumDirection().x();
+                m_pre_dy = aStep->GetPostStepPoint()->GetMomentumDirection().y();
+                m_pre_dz = aStep->GetPostStepPoint()->GetMomentumDirection().z();
+                m_pre_t  = aStep->GetPostStepPoint()->GetGlobalTime();
+                m_total_range = 0;
+            }
+        }
+        else return m_eps;
+    }
+
+    float init_x = 10;//cm
+    float init_y = -10;//cm
+    /*
+    if(pdg_code == 11 && track_KE/CLHEP::keV < m_delta_threshold.value()){
+        int nc = 0, ni=0;
+        m_track->TransportDeltaElectron(init_x, init_y, 0, track_time/CLHEP::ns, track_KE/CLHEP::eV, track_dx, track_dy, track_dz, nc, ni);
+        for (int j = 0; j < nc; ++j) {
+            double xe = 0., ye = 0., ze = 0., te = 0., ee = 0.;
+            double dx = 0., dy = 0., dz = 0.;
+            m_track->GetElectron(j, xe, ye, ze, te, ee, dx, dy, dz);
+            auto ehit  = SimIonizationCol->create();
+            ehit.setTime(te);
+            double epos[3] = { cm_to_mm*( (xe - init_x)+position_x/CLHEP::cm) , cm_to_mm*((ye - init_y)+position_y/CLHEP::cm), cm_to_mm*(ze + position_z/CLHEP::cm)};
+            ehit.setPosition(edm4hep::Vector3d(epos));
+            ehit.setType(11);
+        }
+        g4Track->SetTrackStatus(fStopAndKill);
+        return 0;
+    }
+    */
+    clock_t t01 = clock();
+    //cmp.SetMagneticField(0., 0., -3.);
+    m_track->SetParticle(m_particle_map[pdg_code]);
+    
+    bool change_KE = false;
+    if( abs(m_previous_KE -(track_KE/CLHEP::eV) )/(track_KE/CLHEP::eV) > m_change_threshold.value()) {
+        change_KE = true;
+        m_previous_KE = track_KE/CLHEP::eV;
+    }
+    
+    bool change_ID = false;
+    if(m_previous_track_ID != track_ID ){
+        change_ID = true;
+        m_previous_track_ID = track_ID; 
+        m_previous_KE = track_KE/CLHEP::eV;
+    }
+    if(change_ID || change_KE ){
+        m_track->SetKineticEnergy(track_KE/CLHEP::eV);
+    }
+    
+  
+    m_track->EnableOneStepFly(true);
+    m_track->SetSteppingLimits( track_length/CLHEP::cm, 1000, 0.1, 0.2);
+    clock_t t012 = clock();
+    m_track->NewTrack(init_x, init_y, 0, track_time/CLHEP::ns, track_dx, track_dy, track_dz);//cm
+    double xc = 0., yc = 0., zc = 0., tc = 0., ec = 0., extra = 0.;
+    int nc = 0;
+    int ic = 0;
+    int first=true;
+    clock_t t02 = clock();
+    while (m_track->GetCluster(xc, yc, zc, tc, nc, ec, extra)) {
+        //auto chit = SimHitCol->create();
+        //auto chit = SimPrimaryIonizationCol->create();
+        auto chit = m_SimPrimaryIonizationCol->create();
+        chit.setTime(tc);
+        double cpos[3] = { cm_to_mm*( (xc - init_x)+position_x/CLHEP::cm) , cm_to_mm*((yc - init_y)+position_y/CLHEP::cm), cm_to_mm*(zc + position_z/CLHEP::cm)};
+        chit.setPosition(edm4hep::Vector3d(cpos));
+        //float cmom[3]  = {0,0,0};
+        //getMom(ec, 1, 0, 0, cmom);//FIXME direction is not important?
+        chit.setType(0);//default
+        if(m_save_cellID) chit.setCellID( getCellID(cpos[0], cpos[1], cpos[2]) );
+        if(m_save_mc && Parent_ID == 0 && track_ID <= mcCol->size() && mcCol ){ 
+            chit.setMCParticle(  mcCol->at(track_ID-1) );
+            //std::cout<<"mc obj index="<<mcCol->at(track_ID-1).getObjectID().index<<std::endl;
+            //std::cout<<"mc obj index1="<<chit.getMCParticle().getObjectID().index<<std::endl;
+        }
+        de += ec;
+        for (int j = 0; j < nc; ++j) {
+            double xe = 0., ye = 0., ze = 0., te = 0., ee = 0.;
+            double dx = 0., dy = 0., dz = 0.;
+            m_track->GetElectron(j, xe, ye, ze, te, ee, dx, dy, dz);
+            //auto ehit = SimHitCol->create();
+            //auto ehit = SimIonizationCol->create();
+            //ehit.setPrimaryIonization(chit);
+            chit.addToElectronTime(te);
+            //ehit.setTime(te);
+            double epos[3] = { cm_to_mm*( (xe - init_x)+position_x/CLHEP::cm) , cm_to_mm*((ye - init_y)+position_y/CLHEP::cm), cm_to_mm*(ze + position_z/CLHEP::cm)};
+            //ehit.setPosition(edm4hep::Vector3d(epos));
+            //ehit.setPosition(edm4hep::Vector3d(epos));
+            chit.addToElectronPosition(edm4hep::Vector3d(epos));
+            //if(m_save_mc && Parent_ID == 0 && track_ID <= mcCol->size() && mcCol ){ 
+            //    ehit.setMCParticle(  mcCol->at(track_ID-1) );
+                //ehit.setMcParticleObjID( mcCol->at(track_ID-1).id() );
+                //ehit.setMcParticleColID( mcCol->at(track_ID-1).getObjectID().collectionID );
+            //}
+            /* //no sense of conductor electron
+            float emom[3] = {0,0,0};
+            getMom(ee, dx, dy, dz, emom); 
+            ehit.setMomentum(edm4hep::Vector3f(emom));
+            */
+            //if(m_save_cellID) ehit.setCellID( getCellID(epos[0], epos[1], epos[2]) );
+            if(m_save_cellID) chit.addToElectronCellID( getCellID(epos[0], epos[1], epos[2]) );
+            //ehit.setQuality(2);
+            //ehit.setType(0);//default
+        }
+    }
+    double Dedx = (de*1e-6/(track_length/CLHEP::cm) ) ;//MeV/cm
+    double new_KE = track_KE/CLHEP::MeV - de*1e-6; 
+    if( update_ke ){
+        g4Track->SetKineticEnergy ( new_KE*CLHEP::MeV );
+        aStep->GetPostStepPoint()->SetKineticEnergy ( new_KE*CLHEP::MeV );
+        m_pa_KE = new_KE;
+    }
+    else{
+        m_pa_KE = aStep->GetPreStepPoint()->GetKineticEnergy(); 
+    }
+    m_tot_edep += de;
+    m_tot_length += track_length;
+    return Dedx;
+}
+
+
+long long TrackHeedSimTool::getCellID(float x, float y, float z)
+{
+    float MM_2_CM = 0.1;
+    G4Navigator* gNavigator = G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking();
+    G4ThreeVector global(x,y,z);
+    dd4hep::sim::Geant4VolumeManager volMgr = dd4hep::sim::Geant4Mapping::instance().volumeManager();
+    G4VPhysicalVolume* pv = gNavigator->LocateGlobalPointAndSetup( global, 0, true);
+    if(!pv) return 0;
+    G4TouchableHistory *hist = gNavigator->CreateTouchableHistory();
+    dd4hep::VolumeID volID  = volMgr.volumeID(hist);
+    const G4AffineTransform & affine = gNavigator->GetGlobalToLocalTransform();
+    G4ThreeVector local = affine.TransformPoint(global);
+    dd4hep::Position loc(local.x()*MM_2_CM, local.y()*MM_2_CM, local.z()*MM_2_CM);
+    dd4hep::Position glob(global.x()*MM_2_CM, global.y()*MM_2_CM, global.z()*MM_2_CM);
+    dd4hep::VolumeID cID = m_segmentation->cellID(loc,glob,volID);
+    
+    if(m_debug){
+        TVector3 Wstart(0,0,0);
+        TVector3 Wend  (0,0,0);
+        m_segmentation->cellposition(cID, Wstart, Wend);
+        std::cout<<"Name="<<pv->GetName()<<",CopyNo="<<pv->GetCopyNo()<<",cID="<<cID<<",volID="<<volID<<",glob="<<glob<<",loc="<<loc<<",ws_x="<<Wstart.X()<<",y="<<Wstart.Y()<<",z="<<Wstart.Z()<<",we_x="<<Wend.X()<<",y="<<Wend.Y()<<",z="<<Wend.Z()<<std::endl;
+    }
+    delete hist;
+    return cID;
+}
+
+void TrackHeedSimTool::getMom(float ee, float dx, float dy,float dz, float mom[3])
+{
+    double tot_E = 0.511*1e6 + ee;//eV
+    double Mom = sqrt(tot_E*tot_E - pow(0.511*1e6,2) );
+    double mom_direction =  sqrt(dx*dx + dy*dy + dz*dz);
+    if (mom_direction == 0){
+        mom[0] = 0;
+        mom[1] = 0;
+        mom[2] = 0;
+    }
+    else{
+        double scale = Mom/mom_direction;
+        mom[0] = scale*dx/1e9;
+        mom[1] = scale*dy/1e9;
+        mom[2] = scale*dz/1e9;
+    }
+}
+
+StatusCode TrackHeedSimTool::initialize()
+{
+
+  m_geosvc = service<IGeomSvc>("GeomSvc");
+  if ( !m_geosvc )  throw "TrackHeedSimTool :Failed to find GeomSvc ...";
+  m_dd4hep = m_geosvc->lcdd();
+  if ( !m_dd4hep )  throw "TrackHeedSimTool :Failed to get dd4hep::Detector ...";
+  m_readout = new dd4hep::Readout( m_dd4hep->readout(m_readout_name) );
+  if ( !m_readout )  throw "TrackHeedSimTool :Failed to get readout ...";
+  m_segmentation = dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*>(m_readout->segmentation().segmentation());
+  if ( !m_segmentation )  throw "TrackHeedSimTool :Failed to get segmentation ...";
+
+  m_particle_map[ 11] = "e-";
+  m_particle_map[-11] = "e+";
+  m_particle_map[ 13] = "mu-";
+  m_particle_map[-13] = "mu+";
+  m_particle_map[ 211] = "pi+";
+  m_particle_map[-211] = "pi-";
+  m_particle_map[ 321] = "K+";
+  m_particle_map[-321] = "K-";
+  m_particle_map[2212] = "p";
+  m_particle_map[-2212] = "pbar";
+  m_particle_map[700201] = "d";
+  m_particle_map[700202] = "alpha";
+
+  m_gas.SetComposition("he", m_he,"isobutane", m_isob);
+  m_gas.SetTemperature(293.15);
+  m_gas.SetPressure(760.0);
+  m_gas.SetMaxElectronEnergy(200.);
+  m_gas.EnablePenningTransfer(0.44, 0.0, "He");
+  m_gas.LoadGasFile(m_gas_file.value());
+  m_gas.LoadIonMobility(m_IonMobility.value());
+  //std::this_thread::sleep_for(std::chrono::milliseconds(m_delay_time));
+  //m_gas.LoadGasFile("/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/He_50_isobutane_50.gas");
+  //m_gas.LoadIonMobility("/junofs/users/wxfang/MyGit/tmp/check_G4FastSim_20210121/CEPCSW/Digitisers/DigiGarfield/IonMobility_He+_He.txt");
+  /*
+  m_gas.SetComposition("he", 90.,"isobutane", 10.);  // cepc gas
+  m_gas.SetPressure(760.0);
+  m_gas.SetTemperature(293.15);
+  m_gas.SetFieldGrid(100., 100000., 20, true);
+  m_gas.GenerateGasTable(10);
+  m_gas.WriteGasFile("he_90_isobutane_10.gas");
+  */
+
+  cmp.SetMedium(&m_gas);
+  // Field Wire radius [cm]
+  const double rFWire = 110.e-4;
+  // Signa Wire radius [cm]
+  const double rSWire = 25.e-4;
+  // Cell radius [cm]
+  float rCell = 50;//As the ionization process is almost not effected by cell geometry and wire voltage. Here the radius is to make sure the ionization process is completed.
+  // Voltages
+  const double vSWire = 2000.;
+  const double vFWire = 0.;
+  // Add the signal wire in the centre.
+  cmp.AddWire(0, 0, 2 * rSWire, vSWire, "s");
+  // Add the field wire around the signal wire.
+  cmp.AddWire(-rCell, -rCell, 2 * rFWire, vFWire, "f");
+  cmp.AddWire(    0., -rCell, 2 * rFWire, vFWire, "f");
+  cmp.AddWire( rCell, -rCell, 2 * rFWire, vFWire, "f");
+  cmp.AddWire(-rCell,     0., 2 * rFWire, vFWire, "f");
+  cmp.AddWire( rCell,     0., 2 * rFWire, vFWire, "f");
+  cmp.AddWire(-rCell,  rCell, 2 * rFWire, vFWire, "f");
+  cmp.AddWire(    0.,  rCell, 2 * rFWire, vFWire, "f");
+  cmp.AddWire( rCell,  rCell, 2 * rFWire, vFWire, "f");
+  if(m_BField !=0 ) cmp.SetMagneticField(0., 0., m_BField);
+  cmp.AddReadout("s");
+
+  
+  ///
+  /// Make a sensor.
+  ///
+  m_sensor = new Sensor(); 
+  m_sensor->AddComponent(&cmp);
+  m_sensor->AddElectrode(&cmp, "s");
+  // Set the signal time window. [ns]
+  const double tstep = 0.5;
+  const double tmin = -0.5 * 0.5;
+  const unsigned int nbins = 1000;
+  m_sensor->SetTimeWindow(tmin, tstep, nbins);
+  m_sensor->ClearSignal();
+
+
+
+  m_track = new Garfield::TrackHeed();
+  //track->EnableDebugging();
+  m_track->SetSensor(m_sensor);
+  m_track->EnableDeltaElectronTransport();
+  //track->DisableDeltaElectronTransport();
+  m_track->EnableMagneticField();
+  m_track->EnableElectricField();//almost no effect here
+
+  m_current_track_ID = 0;
+  m_previous_track_ID =0;
+  m_previous_KE = 0;
+  m_current_Parent_ID = -1;
+  m_change_track = false;
+  m_total_range = 0;
+  m_isFirst = true;
+  m_beginEvt = true;
+  m_tot_edep = 0;
+  m_tot_length = 0;
+  m_pa_KE =0;
+  m_pdg_code = 0;
+  m_pre_x  = 0;
+  m_pre_y  = 0;
+  m_pre_z  = 0;
+  m_pre_dx = 0;
+  m_pre_dy = 0;
+  m_pre_dz = 0;
+  m_pre_t  = 0;
+
+
+   // for NN pulse simulation//
+   m_env = std::make_shared<Ort::Env>(ORT_LOGGING_LEVEL_WARNING, "ENV");
+   m_seesion_options = std::make_shared<Ort::SessionOptions>();
+   m_seesion_options->SetIntraOpNumThreads(m_intra_op_nthreads);
+   m_seesion_options->SetInterOpNumThreads(m_inter_op_nthreads);
+   if(m_debug) std::cout << "before load model " << m_model_file.value() << std::endl;
+   m_session = std::make_shared<Ort::Session>(*m_env, m_model_file.value().c_str(), *m_seesion_options);
+   if(m_debug) std::cout << "after load model " << m_model_file.value() << std::endl;
+   // lambda function to print the dims.
+   auto dims_str = [&](const auto& dims) {
+      return std::accumulate(dims.begin(), dims.end(), std::to_string(dims[0]),
+                             [](const std::string& a, int64_t b){
+                                 return a + "x" + std::to_string(b);
+                             });
+   };
+   // prepare the input
+   auto num_input_nodes = m_session->GetInputCount();
+   if(m_debug) std::cout << "num_input_nodes: " << num_input_nodes << std::endl;
+   for (size_t i = 0; i < num_input_nodes; ++i) {
+      #if (ORT_API_VERSION >=13)
+      auto name = m_session->GetInputNameAllocated(i, m_allocator);
+      m_inputNodeNameAllocatedStrings.push_back(std::move(name));
+      m_input_node_names.push_back(m_inputNodeNameAllocatedStrings.back().get());
+      #else
+      auto name = m_session->GetInputName(i, m_allocator);
+      m_inputNodeNameAllocatedStrings.push_back(name);
+      m_input_node_names.push_back(m_inputNodeNameAllocatedStrings.back());
+      #endif
+
+      Ort::TypeInfo type_info  = m_session->GetInputTypeInfo(i);
+      auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
+      auto dims = tensor_info.GetShape();
+      //dims[0] = 1; //wxfang, FIXME, if it is -1 (dynamic axis), need overwrite it manually
+      dims[0] = 10; //wxfang, FIXME, if it is -1 (dynamic axis), need overwrite it manually
+      m_input_node_dims.push_back(dims);
+
+
+      if(m_debug) std::cout<< "[" << i << "]"
+      #if (ORT_API_VERSION >=13)
+              << " input_name: " << m_inputNodeNameAllocatedStrings.back().get()
+      #else
+              << " input_name: " << m_inputNodeNameAllocatedStrings.back()
+      #endif
+              << " ndims: " << dims.size()
+              << " dims: " << dims_str(dims)
+              << std::endl;
+   }
+   // prepare the output
+   size_t num_output_nodes = m_session->GetOutputCount();
+   for(std::size_t i = 0; i < num_output_nodes; i++) {
+       #if (ORT_API_VERSION >=13)
+       auto output_name = m_session->GetOutputNameAllocated(i, m_allocator);
+       m_outputNodeNameAllocatedStrings.push_back(std::move(output_name));
+       m_output_node_names.push_back(m_outputNodeNameAllocatedStrings.back().get());
+       #else
+       auto output_name = m_session->GetOutputName(i, m_allocator);
+       m_outputNodeNameAllocatedStrings.push_back(output_name);
+       m_output_node_names.push_back(m_outputNodeNameAllocatedStrings.back());
+       #endif
+       Ort::TypeInfo type_info        = m_session->GetOutputTypeInfo(i);
+       auto tensor_info               = type_info.GetTensorTypeAndShapeInfo();
+       ONNXTensorElementDataType type = tensor_info.GetElementType();
+       m_output_node_dims               = tensor_info.GetShape();
+       if(m_debug) std::cout << "[" << i << "]"
+      #if (ORT_API_VERSION >=13)
+               << " output_name: " << m_outputNodeNameAllocatedStrings.back().get()
+      #else
+               << " output_name: " << m_outputNodeNameAllocatedStrings.back()
+      #endif
+               << " ndims: " << m_output_node_dims.size()
+               << " dims: " << dims_str(m_output_node_dims)
+               << std::endl;
+
+   }
+
+  return StatusCode::SUCCESS;
+}
+
+void TrackHeedSimTool::wire_xy(float x1, float y1, float z1, float x2, float y2, float z2, float z, float &x, float &y){
+    //linear function: 
+    //(x-x1)/(x2-x1)=(y-y1)/(y2-y1)=(z-z1)/(z2-z1)
+    x = x1+(x2-x1)*(z-z1)/(z2-z1);
+    y = y1+(y2-y1)*(z-z1)/(z2-z1);
+}
+
+float TrackHeedSimTool::xy2phi(float x, float y){
+    float phi = acos(x/sqrt(x*x+y*y));
+    if(y < 0) phi = 2*M_PI-phi;
+    return phi; 
+}
+void TrackHeedSimTool::getLocal(float x1, float y1, float x2, float y2, float& dx, float& dy){
+    /*  .    
+        .     *(x2,y2)
+        .   .
+        . .    
+        *(x1, y1)        
+        .  
+        .  
+        . 
+        o   
+    */
+    float mo1 = sqrt(x1*x1+y1*y1);
+    float mo2 = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1) );
+    float costheta = (x1*(x2-x1)+y1*(y2-y1))/(mo1*mo2);
+    dy = mo2*costheta;
+    dx = xy2phi(x2,y2)>xy2phi(x1,y1) ? mo2*sqrt(1-costheta*costheta) : -mo2*sqrt(1-costheta*costheta) ;
+}
+
+float* TrackHeedSimTool::NNPred(std::vector<float>& inputs)
+{
+
+
+    std::vector<Ort::Value> input_tensors;
+    auto& dims = m_input_node_dims[0];
+    //std::cout << "inputs.size()="<<inputs.size() << std::endl;
+    dims[0] = int(inputs.size()/3);
+    Ort::MemoryInfo info("Cpu", OrtDeviceAllocator, 0, OrtMemTypeDefault);
+    // prepare a dummy input for the model
+    
+    
+    auto input_tensor = Ort::Value::CreateTensor(info,
+                                                 inputs.data(),
+                                                 inputs.size(),
+                                                 dims.data(),
+                                                 dims.size());
+    
+    input_tensors.push_back(std::move(input_tensor));
+    auto output_tensors = m_session->Run(Ort::RunOptions{ nullptr }, m_input_node_names.data(), input_tensors.data(), input_tensors.size(), m_output_node_names.data(), m_output_node_names.size());
+    //const auto& output_tensor = output_tensors[0];
+    auto& output_tensor = output_tensors[0];
+    int num_elements = output_tensor.GetTensorTypeAndShapeInfo().GetElementCount();
+    //std::cout << "output_tensor num_elements=" << num_elements<< std::endl;
+
+    float* vec2 = new float[num_elements];
+    std::memcpy(vec2, output_tensor.GetTensorMutableData<float>(), num_elements * sizeof(float));
+    /*
+    for (int k=0;k<num_elements;k++){
+       std::cout<<"k="<<k<< ",v=" <<vec2[k]<< std::endl;
+    }
+    */ 
+    return vec2;
+}
+
+
+void TrackHeedSimTool::endOfEvent() {
+    if(m_sim_pulse){
+        if(m_debug) G4cout<<"SimPrimaryIonizationCol size="<<m_SimPrimaryIonizationCol->size()<<G4endl;
+        clock_t t01 = clock();
+        std::vector<float> inputs;
+        std::vector<unsigned long> indexs_c;
+        std::vector<unsigned long> indexs_i;
+        std::map<unsigned long long, std::vector<std::pair<float, float> > > id_pulse_map;
+        for (unsigned long z=0; z<m_SimPrimaryIonizationCol->size(); z++) {
+            for (unsigned long k=0; k<m_SimPrimaryIonizationCol->at(z).electronCellID_size(); k++) {
+                auto position = m_SimPrimaryIonizationCol->at(z).getElectronPosition(k);//mm
+                auto cellId = m_SimPrimaryIonizationCol->at(z).getElectronCellID(k);
+                TVector3 Wstart(0,0,0);
+                TVector3 Wend  (0,0,0);
+                m_segmentation->cellposition(cellId, Wstart, Wend);
+                float dd4hep_mm = dd4hep::mm;
+                Wstart =(1/dd4hep_mm)* Wstart;// from DD4HEP cm to mm
+                Wend   =(1/dd4hep_mm)* Wend  ;
+                //std::cout<<"cellid="<<cellId<<",s_x="<<Wstart.x()<<",s_y="<<Wstart.y()<<",s_z="<<Wstart.z()<<",E_x="<<Wend.x()<<",E_y="<<Wend.y()<<",E_z="<<Wend.z()<<std::endl;
+                float wire_x = 0;
+                float wire_y = 0;
+                double pos_z = position[2];
+                wire_xy(Wend.x(), Wend.y(), Wend.z(), Wstart.x(), Wstart.y(), Wstart.z(), pos_z, wire_x, wire_y);
+                float local_x = 0;
+                float local_y = 0;
+                getLocal(wire_x, wire_y, position[0], position[1], local_x, local_y);
+                //std::cout<<"pos_z="<<pos_z<<",wire_x="<<wire_x<<",wire_y="<<wire_y<<",position[0]="<<position[0]<<",position[1]="<<position[1]<<",local_x="<<local_x<<",local_y="<<local_y<<",dr="<<sqrt(local_x*local_x+local_y*local_y)<<",dr1="<<sqrt( (wire_x-position[0])*(wire_x-position[0])+(wire_y-position[1])*(wire_y-position[1]) )<<std::endl;
+                //float ext_x_scale = 1;//TODO, default is 18mm x 18mm, the real cell size maybe a bit different. need konw size of cell for each layer, and do normalization using ext_x_scale
+                //float ext_y_scale = 1;
+                local_x = local_x/m_x_scale;
+                local_y = local_y/m_y_scale;
+                float noise = CLHEP::RandGauss::shoot(0,1);
+                inputs.push_back(local_x);
+                inputs.push_back(local_y);
+                inputs.push_back(noise  );
+                indexs_c.push_back(z);
+                indexs_i.push_back(k);
+                if(indexs_c.size()==m_batchsize){
+                    float* res = NNPred(inputs);
+                    for(unsigned int i=0; i<m_batchsize; i++){
+                        float tmp_time = res[i*2  ]*m_time_scale + m_time_shift;// in ns
+                        float tmp_amp  = res[i*2+1]*m_amp_scale  + m_amp_shift ;
+                        //unsigned long tmp_index = indexs.at(i);
+                        //tmp_pluse.setCellID(SimIonizationCol->at(tmp_index).getCellID());
+                        //tmp_pluse.setTime(tmp_time + SimIonizationCol->at(tmp_index).getTime());//ns
+                        //tmp_pluse.setValue(tmp_amp);
+                        //tmp_pluse.setType(SimIonizationCol->at(tmp_index).getType());
+                        //tmp_pluse.setSimIonization(SimIonizationCol->at(tmp_index));
+                        auto ion_time = m_SimPrimaryIonizationCol->at(indexs_c.at(i)).getElectronTime(indexs_i.at(i));
+                        id_pulse_map[indexs_c.at(i)].push_back(std::make_pair(tmp_time+ion_time,tmp_amp) );
+                    }
+                    inputs.clear();
+                    indexs_c.clear();
+                    indexs_i.clear();
+                    delete [] res;
+                }
+            } //end of k
+        }//end of z
+        if(indexs_c.size()!=0){
+            float* res = NNPred(inputs);
+            for(unsigned int i=0; i<indexs_c.size(); i++){
+                float tmp_time = res[i*2  ]*m_time_scale + m_time_shift;
+                float tmp_amp  = res[i*2+1]*m_amp_scale  + m_amp_shift ;
+                //tmp_pluse.setCellID(SimIonizationCol->at(tmp_index).getCellID());
+                //tmp_pluse.setTime(tmp_time + SimIonizationCol->at(tmp_index).getTime());//ns
+                //tmp_pluse.setValue(tmp_amp);
+                //tmp_pluse.setType(SimIonizationCol->at(tmp_index).getType());
+                //tmp_pluse.setSimIonization(SimIonizationCol->at(tmp_index));
+                //id_pulse_map[SimIonizationCol->at(tmp_index).getCellID()].push_back(std::make_pair(tmp_pluse.getTime(), tmp_pluse.getValue() ) );
+                auto ion_time = m_SimPrimaryIonizationCol->at(indexs_c.at(i)).getElectronTime(indexs_i.at(i));
+                id_pulse_map[indexs_c.at(i)].push_back(std::make_pair(tmp_time+ion_time,tmp_amp) );
+            }
+            inputs.clear();
+            indexs_c.clear();
+            indexs_i.clear();
+            delete [] res;
+        }
+        for(auto iter = id_pulse_map.begin(); iter != id_pulse_map.end(); iter++){
+            edm4hep::MutableSimPrimaryIonizationCluster dcIonCls = m_SimPrimaryIonizationCol->at(iter->first); 
+            for(unsigned int i=0; i< iter->second.size(); i++){
+                auto tmp_time = iter->second.at(i).first ;
+                auto tmp_amp  = iter->second.at(i).second;
+                dcIonCls.addToPulseTime(tmp_time);  
+                dcIonCls.addToPulseAmplitude(tmp_amp);  
+            }
+            if(dcIonCls.electronPosition_size() != dcIonCls.pulseTime_size()){
+                G4cout<<"Error: ion size != pulse size"<<G4endl;
+                throw "stop here!";
+            }
+        }
+        clock_t t02 = clock();
+        if(m_debug) std::cout<<"time for Pulse Simulation=" << (double)(t02 - t01) / CLOCKS_PER_SEC <<" seconds"<< std::endl;
+    }
+    reset();
+}
+
+StatusCode TrackHeedSimTool::finalize()
+{
+    //if(m_debug)std::cout << "m_tot_edep="<<m_tot_edep<<" eV"<<std::endl;
+    //std::cout << "m_tot_length="<<m_tot_length<<" mm"<<std::endl;
+    return StatusCode::SUCCESS;
+}
diff --git a/Simulation/DetSimDedx/src/TrackHeedSimTool.h b/Simulation/DetSimDedx/src/TrackHeedSimTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..4568c4f9016842d9aa5d8ab017a88e7cdfc90447
--- /dev/null
+++ b/Simulation/DetSimDedx/src/TrackHeedSimTool.h
@@ -0,0 +1,163 @@
+#ifndef TrackHeedSimTool_h
+#define TrackHeedSimTool_h
+
+#include "k4FWCore/DataHandle.h"
+#include "GaudiKernel/MsgStream.h"
+#include "DetSimInterface/IDedxSimTool.h"
+#include <GaudiKernel/AlgTool.h>
+#include "edm4hep/MCParticle.h"
+#include "edm4hep/MCParticleCollection.h"
+#include "edm4hep/SimPrimaryIonizationClusterCollection.h"
+#include "TVector3.h"
+#include <G4StepPoint.hh>
+
+#include "DD4hep/Segmentations.h"
+#include "DD4hep/Printout.h"
+#include "DD4hep/Detector.h"
+#include "DetInterface/IGeomSvc.h"
+#include "DetSegmentation/GridDriftChamber.h"
+
+
+#include "Garfield/ViewCell.hh"
+#include "Garfield/ViewDrift.hh"
+#include "Garfield/ViewSignal.hh"
+#include "Garfield/ViewMedium.hh"
+#include "Garfield/ComponentAnalyticField.hh"
+#include "Garfield/MediumMagboltz.hh"
+#include "Garfield/Sensor.hh"
+#include "Garfield/DriftLineRKF.hh"
+#include "Garfield/AvalancheMicroscopic.hh"
+#include "Garfield/AvalancheMC.hh"
+#include "Garfield/TrackHeed.hh"
+#include "Garfield/ComponentNeBem3d.hh"
+#include "Garfield/SolidWire.hh"
+#include "Garfield/GeometrySimple.hh"
+#include "Garfield/MediumConductor.hh"
+#include "Garfield/ViewField.hh"
+
+#include <map>
+#include <string>
+
+#include "core/session/onnxruntime_cxx_api.h"
+#include "core/session/onnxruntime_c_api.h"
+using namespace Garfield;
+
+class TrackHeedSimTool: public extends<AlgTool, IDedxSimTool> {
+    public:
+        using extends::extends;
+
+        StatusCode initialize() override;
+        StatusCode finalize() override;
+        double dedx(const G4Step* Step) override;
+        double dedx(const edm4hep::MCParticle& mc) override;
+        double dndx(double betagamma) override;
+        void getMom(float ee, float dx, float dy,float dz, float mom[3] );
+        void reset(){ 
+            m_beginEvt = true;
+            m_isFirst = true;
+            m_previous_track_ID = 0;
+            m_previous_KE = 0;
+            m_tot_edep = 0;
+            m_tot_length = 0;
+        }
+        void endOfEvent();
+        long long getCellID(float x, float y, float z);
+        void wire_xy(float x1, float y1, float z1, float x2, float y2, float z2, float z, float &x, float &y);
+        float* NNPred(std::vector<float>& inputs);
+        float xy2phi(float x, float y);
+        void getLocal(float x1, float y1, float x2, float y2, float& dx, float& dy);
+    private:
+        //ServiceHandle<IDataProviderSvc> m_eds;
+        SmartIF<IGeomSvc> m_geosvc;
+        dd4hep::Detector* m_dd4hep; 
+        dd4hep::Readout* m_readout;
+        dd4hep::DDSegmentation::GridDriftChamber* m_segmentation;
+        Gaudi::Property<std::string> m_readout_name{ this, "readout", "DriftChamberHitsCollection"};//readout for getting segmentation
+        Gaudi::Property<std::string> m_gas_file{ this, "gas_file", "He_50_isobutane_50.gas"};//gas
+        Gaudi::Property<std::string> m_IonMobility{ this, "IonMobility_file", "IonMobility_He+_He.txt"};
+        Gaudi::Property<float> m_isob  {this, "isob", 50, ""};
+        Gaudi::Property<float> m_he    {this, "he", 50, ""};
+        Gaudi::Property<bool> m_debug{this, "debug", false};
+        Gaudi::Property<bool> m_use_max_step{this, "use_max_step", false};
+        Gaudi::Property<bool> m_update_KE{this, "update_KE", true};
+        Gaudi::Property<float> m_max_step   {this, "max_step", 1};//mm
+        Gaudi::Property<bool> m_only_primary{this, "only_primary", false};
+        Gaudi::Property<bool> m_save_mc{this, "save_mc", false};
+        Gaudi::Property<bool> m_save_cellID{this, "save_cellID", true};
+        Gaudi::Property<float> m_delta_threshold{this, "delta_threshold", 50};//keV
+        Gaudi::Property<float> m_change_threshold {this, "change_threshold", 0.05};
+        Gaudi::Property<float> m_BField   {this, "BField", -3};
+        Gaudi::Property<float> m_eps     { this, "eps"   , 1e-6  };//very small value, it is returned dedx for unsimulated step (may needed for SimTrackerHit)
+        // Output collections
+        DataHandle<edm4hep::SimPrimaryIonizationClusterCollection>    m_SimPrimaryIonizationColWriter{"SimPrimaryIonizationClusterCollection", Gaudi::DataHandle::Writer, this};
+        edm4hep::SimPrimaryIonizationClusterCollection* m_SimPrimaryIonizationCol;
+        // In order to associate MCParticle with contribution, we need to access MC Particle.
+        DataHandle<edm4hep::MCParticleCollection> m_mc_handle{"MCParticle", Gaudi::DataHandle::Writer, this};
+
+        TrackHeed* m_track;
+        ComponentNeBem3d m_nebem;
+        ComponentAnalyticField cmp;
+        GeometrySimple m_geo;
+        MediumConductor m_metal;
+        MediumMagboltz m_gas;
+        Sensor* m_sensor;
+        std::map<int, std::string> m_particle_map;
+        
+        int m_previous_track_ID;
+        float m_previous_KE;
+        int m_current_track_ID;
+        int m_current_Parent_ID;
+        int m_pdg_code;
+        G4StepPoint* m_pre_point;
+        G4StepPoint* m_post_point;
+        G4double m_total_range;
+        bool m_isFirst;
+        bool m_beginEvt;
+        bool m_change_track;
+        edm4hep::MCParticle m_mc_paricle; 
+        float m_tot_edep;
+        float m_tot_length;
+        float m_pa_KE;
+  
+        G4double m_pre_x  ;
+        G4double m_pre_y  ;
+        G4double m_pre_z  ;
+        G4double m_pre_dx ;
+        G4double m_pre_dy ;
+        G4double m_pre_dz ;
+        G4double m_pre_t  ;
+  
+        //// sim pulse from NN /// 
+        Gaudi::Property<int> m_intra_op_nthreads{ this, "intraOpNumThreads", 1};
+        Gaudi::Property<int> m_inter_op_nthreads{ this, "interOpNumThreads", 1};
+        std::shared_ptr<Ort::Env> m_env;
+        std::shared_ptr<Ort::SessionOptions> m_seesion_options;
+        std::shared_ptr<Ort::Session> m_session;
+        Ort::AllocatorWithDefaultOptions m_allocator;
+        std::vector<const char*> m_input_node_names;
+        std::vector<std::vector<int64_t>> m_input_node_dims;
+        std::vector<const char*> m_output_node_names;
+        std::vector<int64_t> m_output_node_dims;
+        #if (ORT_API_VERSION >=13)
+        std::vector<Ort::AllocatedStringPtr> m_inputNodeNameAllocatedStrings;
+        std::vector<Ort::AllocatedStringPtr> m_outputNodeNameAllocatedStrings;
+        #else
+        std::vector<const char*> m_inputNodeNameAllocatedStrings;
+        std::vector<const char*> m_outputNodeNameAllocatedStrings;
+        #endif
+  
+        Gaudi::Property<bool> m_sim_pulse    { this, "sim_pulse"   , true  };
+        Gaudi::Property<std::string> m_model_file{ this, "model", "model_test.onnx"};
+        Gaudi::Property<int> m_batchsize     { this, "batchsize", 100};
+        Gaudi::Property<float> m_time_scale  { this, "time_scale", 503.0};
+        Gaudi::Property<float> m_time_shift  { this, "time_shift", 814.0};
+        Gaudi::Property<float> m_amp_scale   { this, "amp_scale" , 1.15 };
+        Gaudi::Property<float> m_amp_shift   { this, "amp_shift" , 0.86 };
+        Gaudi::Property<float> m_x_scale     { this, "x_scale"   , 9.  };// in mm
+        Gaudi::Property<float> m_y_scale     { this, "y_scale"   , 9.  };// in mm
+  
+  
+
+};
+
+#endif
diff --git a/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp b/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp
index fb2c1126b79293482e3c66c6ebb3ffe9681302d7..00c84c75eaebcedad22265694d9c08ca6d081988 100644
--- a/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp
+++ b/Simulation/DetSimGeom/src/AnExampleDetElemTool.cpp
@@ -180,10 +180,12 @@ AnExampleDetElemTool::ConstructSDandField() {
                 throw std::runtime_error("ConstructSDandField: Failed to access G4LogicalVolume for SD " + nam + " of type " +
                                          typ + ".");
             }
-            info() << " -> Adding " << g4v->GetName() << endmsg;
+            debug() << " -> Adding " << g4v->GetName() << endmsg;
             G4SDManager::GetSDMpointer()->AddNewDetector(g4sd);
             g4v->SetSensitiveDetector(g4sd);
         }
+        info() << "-> Total " << sens_vols.size()
+               << " senstive volumes are registered. " << endmsg;
     }
 
     // =======================================================================
diff --git a/Simulation/DetSimInterface/CMakeLists.txt b/Simulation/DetSimInterface/CMakeLists.txt
index ed99eead6c48943bbe639731e2705a8e70423d31..21963df1a8e0fd3289849181995d25908f69641e 100644
--- a/Simulation/DetSimInterface/CMakeLists.txt
+++ b/Simulation/DetSimInterface/CMakeLists.txt
@@ -4,7 +4,10 @@
 
 gaudi_add_library(DetSimInterface
                  SOURCES src/IDetSimSvc.cpp
+                         src/CommonUserEventInfo.cc
+                         src/CommonUserTrackInfo.cc
                  LINK Gaudi::GaudiKernel
+                      ${Geant4_LIBRARIES}
 )
 
 install(TARGETS DetSimInterface
diff --git a/Simulation/DetSimInterface/include/DetSimInterface/CommonUserEventInfo.hh b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserEventInfo.hh
new file mode 100644
index 0000000000000000000000000000000000000000..3319598a270d0d4cb38607d87b6c4fd3b2a85ad4
--- /dev/null
+++ b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserEventInfo.hh
@@ -0,0 +1,39 @@
+#ifndef CommonUserEventInfo_hh
+#define CommonUserEventInfo_hh
+
+/*
+ * Description:
+ *   This class is a part of simulation framework to allow users to extend the G4Event.
+ *
+ *   For example, when G4 converts the EDM4hep/G4 primary vertex/particle to G4 track, 
+ *   the relationship between the EDM4hep track and G4 track is missing. 
+ *   So a map is used as a bookkeeping.
+ *
+ * Author:
+ *   Tao Lin <lintao AT ihep.ac.cn>
+ */
+
+#include "G4VUserEventInformation.hh"
+#include <map>
+
+class CommonUserEventInfo: public G4VUserEventInformation {
+public:
+
+    CommonUserEventInfo();
+    virtual ~CommonUserEventInfo();
+
+public:
+    virtual void Print() const;
+
+    // set the relationship between idx in geant4 and idx in mc particle collection.
+    // idxG4: G4 track ID (starts from 1)
+    // idxEdm4hep: index in MC Particle collection (starts from 0)
+    bool setIdxG4Track2Edm4hep(int idxG4, int idxEdm4hep);
+    int idxG4Track2Edm4hep(int idxG4) const;
+    void dumpIdxG4Track2Edm4hep() const;
+
+private:
+    std::map<int, int> m_g4track_to_edm4hep;
+};
+
+#endif
diff --git a/Simulation/DetSimInterface/include/DetSimInterface/CommonUserTrackInfo.hh b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserTrackInfo.hh
new file mode 100644
index 0000000000000000000000000000000000000000..ce63e602d26267dd87465406d454c7d558eb83ad
--- /dev/null
+++ b/Simulation/DetSimInterface/include/DetSimInterface/CommonUserTrackInfo.hh
@@ -0,0 +1,35 @@
+#ifndef CommonUserTrackInfo_hh
+#define CommonUserTrackInfo_hh
+
+/* Description:
+ *   This class is a part of simulation framework to extend the G4Track.
+ *
+ *   Some secondaries are created due to decay. However, their G4 Track IDs are
+ *   not valid until the tracks are tracking by geant4. In order to associate
+ *   these tracks and their edm4hep MC particle, we use the track information
+ *   to record the extra track information.
+ *
+ * Author:
+ *   Tao Lin <lintao AT ihep.ac.cn>
+ */
+
+#include "G4VUserTrackInformation.hh"
+
+class CommonUserTrackInfo: public G4VUserTrackInformation {
+public:
+    CommonUserTrackInfo();
+    ~CommonUserTrackInfo();
+
+public:
+
+    virtual void Print() const;
+
+    // get the idx in the EDM4hep MC particle collection
+    bool setIdxEdm4hep(int idxEdm4hep);
+    int idxEdm4hep() const;
+
+private:
+    int m_idxEdm4hep = -1;
+};
+
+#endif
diff --git a/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h b/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h
index 8c804500a7b4322e1998a04a7a8a43f46ba3f499..4da01d532a69f4cba7078d82fb161fcc34a1634c 100644
--- a/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h
+++ b/Simulation/DetSimInterface/include/DetSimInterface/IDedxSimTool.h
@@ -28,6 +28,7 @@ public:
     virtual double dedx(const G4Step* aStep) = 0;
     virtual double dedx(const edm4hep::MCParticle& mc) = 0;
     virtual double dndx(double betagamma) = 0;
+    virtual void endOfEvent() {}
 
 };
 
diff --git a/Simulation/DetSimInterface/src/CommonUserEventInfo.cc b/Simulation/DetSimInterface/src/CommonUserEventInfo.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7992c69c897967e728040b3602a472663f604c6f
--- /dev/null
+++ b/Simulation/DetSimInterface/src/CommonUserEventInfo.cc
@@ -0,0 +1,53 @@
+#include "DetSimInterface/CommonUserEventInfo.hh"
+#include <iostream>
+
+CommonUserEventInfo::CommonUserEventInfo() {
+
+}
+
+CommonUserEventInfo::~CommonUserEventInfo() {
+
+}
+
+void
+CommonUserEventInfo::Print() const {
+
+}
+
+bool
+CommonUserEventInfo::setIdxG4Track2Edm4hep(int idxG4, int idxEdm4hep) {
+    auto it = m_g4track_to_edm4hep.find(idxG4);
+
+    // if already exists, return false
+    if (it != m_g4track_to_edm4hep.end()) {
+        return false;
+    }
+
+    m_g4track_to_edm4hep[idxG4] = idxEdm4hep;
+
+    return true;
+}
+
+int
+CommonUserEventInfo::idxG4Track2Edm4hep(int idxG4) const {
+    int ret = -1;
+
+    auto it = m_g4track_to_edm4hep.find(idxG4);
+
+    // if found
+    if (it != m_g4track_to_edm4hep.end()) {
+        ret = it->second;
+    }
+
+    return ret;
+}
+
+void
+CommonUserEventInfo::dumpIdxG4Track2Edm4hep() const {
+    std::cout << "---- Dumping IdxG4Track2Edm4hep: "
+              << " total size: " << m_g4track_to_edm4hep.size()
+              << std::endl;
+    for (auto [idxG4, idxE4]: m_g4track_to_edm4hep) {
+        std::cout << " - " << idxG4 << " -> " << idxE4 << std::endl;
+    }
+}
diff --git a/Simulation/DetSimInterface/src/CommonUserTrackInfo.cc b/Simulation/DetSimInterface/src/CommonUserTrackInfo.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9a923a35a22e7fafe496c827e066e591864f3c50
--- /dev/null
+++ b/Simulation/DetSimInterface/src/CommonUserTrackInfo.cc
@@ -0,0 +1,22 @@
+#include "DetSimInterface/CommonUserTrackInfo.hh"
+#include <iostream>
+
+CommonUserTrackInfo::CommonUserTrackInfo() {
+
+}
+
+CommonUserTrackInfo::~CommonUserTrackInfo() {
+
+}
+
+void CommonUserTrackInfo::Print() const {
+
+}
+
+bool CommonUserTrackInfo::setIdxEdm4hep(int idxEdm4hep) {
+    m_idxEdm4hep = idxEdm4hep;
+}
+
+int CommonUserTrackInfo::idxEdm4hep() const {
+    return m_idxEdm4hep;
+}
diff --git a/Simulation/DetSimSD/CMakeLists.txt b/Simulation/DetSimSD/CMakeLists.txt
index fa8ba9ef3e13d27da31d8c25763278ba795ef47c..f3a9618ac625fce03d1c277bcef6be28e355628e 100644
--- a/Simulation/DetSimSD/CMakeLists.txt
+++ b/Simulation/DetSimSD/CMakeLists.txt
@@ -2,20 +2,34 @@
 find_package(Geant4 REQUIRED ui_all vis_all)
 include(${Geant4_USE_FILE})
 
+gaudi_add_library(DetSimSDLib
+                  SOURCES src/Geant4Hits.cpp
+                          src/DDG4SensitiveDetector.cpp
+                          src/CaloSensitiveDetector.cpp
+                          src/DriftChamberSensitiveDetector.cpp
+                          src/TimeProjectionChamberSensitiveDetector.cpp
+                          src/GenericTrackerSensitiveDetector.cpp
+                          src/TrackerCombineSensitiveDetector.cpp
+                  LINK DetSimInterface
+                       DetInterface
+                       ${DD4hep_COMPONENT_LIBRARIES}
+)
+target_include_directories(DetSimSDLib PUBLIC
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>/include
+  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+install(TARGETS DetSimSDLib
+  EXPORT CEPCSWTargets
+  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
+  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
+  COMPONENT dev)
+
 gaudi_add_module(DetSimSD 
                  SOURCES src/CalorimeterSensDetTool.cpp
-                         src/DDG4SensitiveDetector.cpp
-                         src/CaloSensitiveDetector.cpp
-
                          src/DriftChamberSensDetTool.cpp
-                         src/DriftChamberSensitiveDetector.cpp
-
                          src/TimeProjectionChamberSensDetTool.cpp
-                         src/TimeProjectionChamberSensitiveDetector.cpp
-
                          src/GenericTrackerSensDetTool.cpp
-                         src/GenericTrackerSensitiveDetector.cpp
                  LINK DetSimInterface
+                      DetSimSDLib
                       DetInterface
                       ${DD4hep_COMPONENT_LIBRARIES} 
                       Gaudi::GaudiKernel
diff --git a/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h b/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h
index 687771e344b9f12ae553e56888b1222288fefbaf..c4a29eb3983d0e1f240059eb1c767b8fc0773c15 100644
--- a/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h
+++ b/Simulation/DetSimSD/include/DetSimSD/DDG4SensitiveDetector.h
@@ -15,7 +15,7 @@
 
 
 #include "DD4hep/Detector.h"
-#include "DDG4/Geant4Hits.h"
+#include "DetSimSD/Geant4Hits.h"
 
 #include "G4Step.hh"
 #include "G4HCofThisEvent.hh"
diff --git a/Simulation/DetSimSD/include/DetSimSD/Geant4Hits.h b/Simulation/DetSimSD/include/DetSimSD/Geant4Hits.h
new file mode 100644
index 0000000000000000000000000000000000000000..60fc18d4792876eac5b8ebe6c558c74447a4f6c3
--- /dev/null
+++ b/Simulation/DetSimSD/include/DetSimSD/Geant4Hits.h
@@ -0,0 +1,201 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+// Author     : M.Frank
+//
+//==========================================================================
+
+#ifndef DDG4_GEANT4HITS_H
+#define DDG4_GEANT4HITS_H
+
+// Framework include files
+#include "DD4hep/Objects.h"
+#include "DDG4/Geant4StepHandler.h"
+
+// Geant4 include files
+#include "G4VHit.hh"
+#include "G4Step.hh"
+#include "G4StepPoint.hh"
+
+/// Namespace for the AIDA detector description toolkit
+namespace dd4hep {
+
+  /// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit
+  namespace sim {
+
+    // Forward declarations;
+    class Geant4Hit;
+    class Geant4TrackerHit;
+    class Geant4CalorimeterHit;
+
+    /// Deprecated:  Base class for hit comparisons.
+    /** @class HitCompare Geant4Hits.h DDG4/Geant4Hits.h
+     *
+     * @author  M.Frank
+     * @version 1.0
+     */
+    template <class HIT> class HitCompare {
+    public:
+      /// Default destructor
+      virtual ~HitCompare() {}
+      /// Comparison function
+      virtual bool operator()(const HIT* h) const = 0;
+    };
+
+    /// Deprecated: Seek the hits of an arbitrary collection for the same position.
+    /** @class HitPositionCompare Geant4Hits.h DDG4/Geant4Hits.h
+     *
+     * @author  M.Frank
+     * @version 1.0
+     */
+    template <class HIT> struct HitPositionCompare: public HitCompare<HIT> {
+      /// Reference to the hit position
+      const Position& pos;
+      /// Constructor
+      HitPositionCompare(const Position& p) : pos(p) {}
+      /// Default destructor
+      virtual ~HitPositionCompare() {}
+      /// Comparison function
+      virtual bool operator()(const HIT* h) const {
+        return pos == h->position;
+      }
+    };
+
+    /// Deprecated: basic geant4 hit class for deprecated sensitive detectors
+    /** @class Geant4Hit Geant4Hits.h DDG4/Geant4Hits.h
+     *
+     * Geant4 hit base class. Here only the basic
+     * quantites are stored such as the energy deposit and
+     * the time stamp.
+     *
+     * @author  M.Frank
+     * @version 1.0
+     */
+    class Geant4Hit: public G4VHit {
+    public:
+
+      // cellID
+      unsigned long cellID = 0;
+
+      /// Deprecated!!!
+      struct MonteCarloContrib {
+        /// Geant 4 Track identifier
+        int trackID = -1;
+        /// Particle ID from the PDG table
+        int pdgID = -1;
+        /// Total energy deposit in this hit
+        double deposit = 0.0;
+        /// Timestamp when this energy was deposited
+        double time = 0.0;
+        /// Default constructor
+        MonteCarloContrib() = default;
+        /// Copy constructor
+        MonteCarloContrib(const MonteCarloContrib& c) = default;
+        /// Initializing constructor
+        MonteCarloContrib(int track_id, double dep, double time_stamp)
+          : trackID(track_id), pdgID(-1), deposit(dep), time(time_stamp) {}
+        /// Initializing constructor
+        MonteCarloContrib(int track_id, int pdg, double dep, double time_stamp)
+          : trackID(track_id), pdgID(pdg), deposit(dep), time(time_stamp) {}
+        /// Assignment operator
+        MonteCarloContrib& operator=(const MonteCarloContrib& c) = default;
+        /// Clear data
+        void clear() {
+          time = deposit = 0.0;
+          pdgID = trackID = -1;
+        }
+      };
+      typedef MonteCarloContrib Contribution;
+      typedef std::vector<MonteCarloContrib> Contributions;
+
+    public:
+      /// Standard constructor
+      Geant4Hit() = default;
+      /// Default destructor
+      virtual ~Geant4Hit() { }
+      /// Check if the Geant4 track is a Geantino
+      static bool isGeantino(G4Track* track);
+      /// Extract the MC contribution for a given hit from the step information
+      static Contribution extractContribution(G4Step* step);
+    };
+
+    /// Deprecated: Geant4 tracker hit class for deprecated sensitive detectors
+    /** @class Geant4TrackerHit Geant4Hits.h DDG4/Geant4Hits.h
+     *
+     * Geant4 tracker hit class. Tracker hits contain the momentum
+     * direction as well as the hit position.
+     *
+     * @author  M.Frank
+     * @version 1.0
+     */
+    class Geant4TrackerHit: public Geant4Hit {
+    public:
+      /// Hit position
+      Position position;
+      /// Hit direction
+      Direction momentum;
+      /// Length of the track segment contributing to this hit
+      double length;
+      /// Monte Carlo / Geant4 information
+      Contribution truth;
+      /// Energy deposit of the hit
+      double energyDeposit;
+
+    public:
+      /// Default constructor
+      Geant4TrackerHit();
+      /// Standard initializing constructor
+      Geant4TrackerHit(int track_id, int pdg_id, double deposit, double time_stamp);
+      /// Default destructor
+      virtual ~Geant4TrackerHit() {}
+      /// Clear hit content
+      Geant4TrackerHit& clear();
+      /// Store Geant4 point and step information into tracker hit structure.
+      Geant4TrackerHit& storePoint(G4Step* step, G4StepPoint* point);
+
+      /// Assignment operator
+      Geant4TrackerHit& operator=(const Geant4TrackerHit& c);
+      /// Geant4 required object allocator
+      void *operator new(size_t);
+      /// Geat4 required object destroyer
+      void operator delete(void *ptr);
+    };
+
+    /// Deprecated: Geant4 calorimeter hit class for deprecated sensitive detectors
+    /** @class Geant4CalorimeterHit Geant4Hits.h DDG4/Geant4Hits.h
+     *
+     * Geant4 calorimeter hit class. Calorimeter hits contain the momentum
+     * direction as well as the hit position.
+     *
+     * @author  M.Frank
+     * @version 1.0
+     */
+    class Geant4CalorimeterHit: public Geant4Hit {
+    public:
+      /// Hit position
+      Position position;
+      /// Hit contributions by individual particles
+      Contributions truth;
+      /// Total energy deposit
+      double energyDeposit;
+    public:
+      /// Standard constructor
+      Geant4CalorimeterHit(const Position& cell_pos);
+      /// Default destructor
+      virtual ~Geant4CalorimeterHit() { }
+      /// Geant4 required object allocator
+      void *operator new(size_t);
+      /// Geat4 required object destroyer
+      void operator delete(void *ptr);
+    };
+
+  }    // End namespace sim
+}      // End namespace dd4hep
+
+#endif // DDG4_GEANT4HITS_H
diff --git a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp
index a1698ee3cd3cbe43b6ae856112a2edb2f9f20ed0..3d16e02be94bc3ecfe30e161e81b80bb683892f7 100644
--- a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp
+++ b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp
@@ -1,7 +1,6 @@
 #include "DetSimSD/DDG4SensitiveDetector.h"
 
 #include "DDG4/Geant4Converter.h"
-#include "DDG4/Geant4Hits.h"
 #include "DD4hep/Segmentations.h"
 
 #include "DD4hep/Printout.h"
diff --git a/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp b/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp
index 43dfa17828453c1545318eea45c0aec7e271976e..58c49d6c62e5d3646348995b52e815a2bc42b31f 100644
--- a/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp
+++ b/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp
@@ -5,7 +5,7 @@
 #include "DD4hep/Detector.h"
 
 #include "DriftChamberSensitiveDetector.h"
-
+#include "TrackerCombineSensitiveDetector.h"
 DECLARE_COMPONENT(DriftChamberSensDetTool)
 
 StatusCode DriftChamberSensDetTool::initialize() {
@@ -22,7 +22,6 @@ StatusCode DriftChamberSensDetTool::initialize() {
         error() << "Failed to find dedx simtoo." << endmsg;
         return StatusCode::FAILURE;
     }
-
     return sc;
 }
 
@@ -39,12 +38,19 @@ DriftChamberSensDetTool::createSD(const std::string& name) {
     G4VSensitiveDetector* sd = nullptr;
 
     if (name == "DriftChamber") {
-        DriftChamberSensitiveDetector* dcsd = new DriftChamberSensitiveDetector(name, *dd4hep_geo);
-        dcsd->setDedxSimTool(m_dedx_simtool);
-
-        sd = dcsd;
+      auto sens = dd4hep_geo->sensitiveDetector(name);
+      if(!sens.combineHits()){
+	DriftChamberSensitiveDetector* dcsd = new DriftChamberSensitiveDetector(name, *dd4hep_geo);
+	dcsd->setDedxSimTool(m_dedx_simtool);
+	sd = dcsd;
+      }
+      else{
+	sd = new TrackerCombineSensitiveDetector(name, *dd4hep_geo);
+      }
+    }
+    else{
+      warning() << "The SD " << name << " want to use SD for DriftChamber" << endmsg;
     }
-
 
     return sd;
 }
diff --git a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
index c6ff3db08209c3307b8fd2c954ee9c97f5c015cc..44bf01d1016ae3578ef192f609a3163b6ea6b483 100644
--- a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
+++ b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
@@ -71,5 +71,5 @@ DriftChamberSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*) {
 
 void
 DriftChamberSensitiveDetector::EndOfEvent(G4HCofThisEvent* HCE) {
-
+    m_dedx_simtool->endOfEvent();
 }
diff --git a/Simulation/DetSimSD/src/Geant4Hits.cpp b/Simulation/DetSimSD/src/Geant4Hits.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0358bf019d8222bc8a92ab02bc4fb2022e60b1cf
--- /dev/null
+++ b/Simulation/DetSimSD/src/Geant4Hits.cpp
@@ -0,0 +1,135 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+// Author     : M.Frank
+//
+//==========================================================================
+
+// Framework include files
+#include "DetSimSD/Geant4Hits.h"
+
+// Geant4 include files
+#include "G4Allocator.hh"
+#include "G4ParticleDefinition.hh"
+#include "G4ChargedGeantino.hh"
+#include "G4OpticalPhoton.hh"
+#include "G4Geantino.hh"
+
+// C/C++ include files
+#include <iostream>
+
+using namespace std;
+using namespace dd4hep::sim;
+
+G4ThreadLocal G4Allocator<Geant4TrackerHit>* TrackerHitAllocator = 0;
+G4ThreadLocal G4Allocator<Geant4CalorimeterHit>* CalorimeterHitAllocator = 0;
+
+
+/// Check if the Geant4 track is a Geantino
+bool Geant4Hit::isGeantino(G4Track* track) {
+  if (track) {
+    G4ParticleDefinition* def = track->GetDefinition();
+    if (def == G4ChargedGeantino::Definition())
+      return true;
+    if (def == G4Geantino::Definition()) {
+      return true;
+    }
+  }
+  return false;
+}
+
+Geant4Hit::Contribution Geant4Hit::extractContribution(G4Step* step) {
+  G4Track* trk = step->GetTrack();
+  double energy_deposit =
+    (trk->GetDefinition() == G4OpticalPhoton::OpticalPhotonDefinition()) ?
+    trk->GetTotalEnergy() : step->GetTotalEnergyDeposit();
+  Contribution contrib(trk->GetTrackID(), trk->GetDefinition()->GetPDGEncoding(), energy_deposit, trk->GetGlobalTime());
+  return contrib;
+}
+
+/// Default constructor
+Geant4TrackerHit::Geant4TrackerHit()
+  : Geant4Hit(), position(), momentum(), length(0.0), truth(), energyDeposit(0.0) {
+}
+
+/// Standard initializing constructor
+Geant4TrackerHit::Geant4TrackerHit(int track_id, int pdg_id, double deposit, double time_stamp)
+  : Geant4Hit(), position(), momentum(), length(0.0), truth(track_id, pdg_id, deposit, time_stamp), energyDeposit(deposit) {
+}
+
+/// Assignment operator
+Geant4TrackerHit& Geant4TrackerHit::operator=(const Geant4TrackerHit& c) {
+  if ( this != &c )  {
+    position = c.position;
+    momentum = c.momentum;
+    length = c.length;
+    truth = c.truth;
+    energyDeposit = c.energyDeposit;
+  }
+  return *this;
+}
+
+/// Clear hit content
+Geant4TrackerHit& Geant4TrackerHit::clear() {
+  position.SetXYZ(0, 0, 0);
+  momentum.SetXYZ(0, 0, 0);
+  length = 0.0;
+  truth.clear();
+  energyDeposit = 0.0;
+  return *this;
+}
+
+/// Store Geant4 point and step information into tracker hit structure.
+Geant4TrackerHit& Geant4TrackerHit::storePoint(G4Step* step, G4StepPoint* pnt) {
+  G4Track* trk = step->GetTrack();
+  G4ThreeVector pos = pnt->GetPosition();
+  G4ThreeVector mom = pnt->GetMomentum();
+
+  truth.trackID = trk->GetTrackID();
+  truth.pdgID = trk->GetDefinition()->GetPDGEncoding();
+  truth.deposit = step->GetTotalEnergyDeposit();
+  truth.time = trk->GetGlobalTime();
+  energyDeposit = step->GetTotalEnergyDeposit();
+  position.SetXYZ(pos.x(), pos.y(), pos.z());
+  momentum.SetXYZ(mom.x(), mom.y(), mom.z());
+  length = 0;
+  return *this;
+}
+
+/// Geant4 required object allocator
+void* Geant4TrackerHit::operator new(size_t) {
+  if ( TrackerHitAllocator )
+    return TrackerHitAllocator->MallocSingle();
+  TrackerHitAllocator = new G4Allocator<Geant4TrackerHit>;
+  return TrackerHitAllocator->MallocSingle();
+}
+
+/// Geat4 required object destroyer
+void Geant4TrackerHit::operator delete(void *p) {
+  TrackerHitAllocator->FreeSingle((Geant4TrackerHit*) p);
+}
+
+/// Standard constructor
+Geant4CalorimeterHit::Geant4CalorimeterHit(const Position& pos)
+  : Geant4Hit(), position(pos), truth(), energyDeposit(0) {
+}
+
+/// Geant4 required object allocator
+void* Geant4CalorimeterHit::operator new(size_t) {
+  if ( CalorimeterHitAllocator )
+    return CalorimeterHitAllocator->MallocSingle();
+  CalorimeterHitAllocator = new G4Allocator<Geant4CalorimeterHit>;
+  return CalorimeterHitAllocator->MallocSingle();
+}
+
+/// Geat4 required object destroyer
+void Geant4CalorimeterHit::operator delete(void *p) {
+  CalorimeterHitAllocator->FreeSingle((Geant4CalorimeterHit*) p);
+}
+
diff --git a/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp b/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp
index 480f509aa57c563e90c032aac64abcaca4957a31..edb275a8d76e4d0710368611e916f4c026837e12 100644
--- a/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp
+++ b/Simulation/DetSimSD/src/GenericTrackerSensDetTool.cpp
@@ -5,6 +5,7 @@
 #include "DD4hep/Detector.h"
 
 #include "GenericTrackerSensitiveDetector.h"
+#include "TrackerCombineSensitiveDetector.h"
 
 #include "CLHEP/Units/SystemOfUnits.h"
 
@@ -33,8 +34,14 @@ G4VSensitiveDetector* GenericTrackerSensDetTool::createSD(const std::string& nam
   debug() << "createSD for " << name << endmsg;
   
   dd4hep::Detector* dd4hep_geo = m_geosvc->lcdd();
-
-  G4VSensitiveDetector* sd = new GenericTrackerSensitiveDetector(name, *dd4hep_geo);
+  auto sens = dd4hep_geo->sensitiveDetector(name);
+  G4VSensitiveDetector* sd = nullptr;
+  if(sens.combineHits()){
+    sd = new TrackerCombineSensitiveDetector(name, *dd4hep_geo);
+  }
+  else{
+    sd = new GenericTrackerSensitiveDetector(name, *dd4hep_geo);
+  }
 
   return sd;
 }
diff --git a/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp b/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp
index d250079ef0a8aa5f15e50fb801b1de90c46d3a17..5e9ba1a6af4cf2dbe994a1bf7d686f3bfcbf19f7 100644
--- a/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp
+++ b/Simulation/DetSimSD/src/GenericTrackerSensitiveDetector.cpp
@@ -23,10 +23,11 @@ void GenericTrackerSensitiveDetector::Initialize(G4HCofThisEvent* HCE){
 }
 
 G4bool GenericTrackerSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*){
-  
   G4TouchableHandle touchPost = step->GetPostStepPoint()->GetTouchableHandle(); 
   G4TouchableHandle touchPre  = step->GetPreStepPoint()->GetTouchableHandle(); 
   dd4hep::sim::Geant4StepHandler h(step);
+  if (fabs(h.trackDef()->GetPDGCharge()) < 0.01) return true;
+
   dd4hep::Position prePos    = h.prePos();
   dd4hep::Position postPos   = h.postPos();
   dd4hep::Position direction = postPos - prePos;
diff --git a/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.cpp b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..591c3cf3273a872f8533a8d11f3301fe60a408eb
--- /dev/null
+++ b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.cpp
@@ -0,0 +1,58 @@
+#include "TrackerCombineSensitiveDetector.h"
+
+#include "G4Step.hh"
+#include "G4VProcess.hh"
+#include "G4SDManager.hh"
+#include "DD4hep/DD4hepUnits.h"
+
+TrackerCombineSensitiveDetector::TrackerCombineSensitiveDetector(const std::string& name,
+								 dd4hep::Detector& description)
+  : DDG4SensitiveDetector(name, description),
+    m_hc(nullptr){
+  G4String CollName = m_sensitive.hitsCollection();
+  collectionName.insert(CollName);
+}
+
+void TrackerCombineSensitiveDetector::Initialize(G4HCofThisEvent* HCE){
+  userData.e_cut = m_sensitive.energyCutoff();
+
+  m_hc = new HitCollection(GetName(), collectionName[0]);
+  int HCID = G4SDManager::GetSDMpointer()->GetCollectionID(m_hc);
+  HCE->AddHitsCollection( HCID, m_hc ); 
+}
+
+G4bool TrackerCombineSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*){
+  dd4hep::sim::Geant4StepHandler h(step);
+  if (fabs(h.trackDef()->GetPDGCharge()) < 0.01) return true;
+
+  bool return_code = false;
+  if ( userData.current == -1 ) userData.start(getCellID(step), step, h.pre);
+  else if ( !userData.track || userData.current != h.track->GetTrackID() ) {
+    return_code = userData.extractHit(m_hc) != 0;
+    userData.start(getCellID(step), step, h.pre);
+  }
+
+  // ....update .....
+  userData.update(step);
+
+  void *prePV = h.volume(h.pre), *postPV = h.volume(h.post);
+  if ( prePV != postPV ) {
+    return_code = userData.extractHit(m_hc) != 0;
+    void* postSD = h.sd(h.post);
+    if ( 0 != postSD )   {
+      void* preSD = h.sd(h.pre);
+      if ( preSD == postSD ) {
+	// fucd: getCellID(step) for preVolume not postVolume, so should start at next step 
+	//userData.start(getCellID(step), step, h.post);
+      }
+    }
+  }
+  else if ( userData.track->GetTrackStatus() == fStopAndKill ) {
+    return_code = userData.extractHit(m_hc) != 0;
+  }
+  return return_code;
+}
+
+void TrackerCombineSensitiveDetector::EndOfEvent(G4HCofThisEvent* HCE){
+  userData.clear();
+}
diff --git a/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.h b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.h
new file mode 100644
index 0000000000000000000000000000000000000000..cf0cb844eb64a076d8c39477c94a6fd62f677402
--- /dev/null
+++ b/Simulation/DetSimSD/src/TrackerCombineSensitiveDetector.h
@@ -0,0 +1,95 @@
+// *********************************************************
+//
+// $Id: TrackerCombineSensitiveDetector.hh,v 1.0 2022/03/27
+
+#ifndef TrackerCombineSensitiveDetector_h
+#define TrackerCombineSensitiveDetector_h
+
+#include "DetSimSD/DDG4SensitiveDetector.h"
+#include "DDG4/Defs.h"
+
+namespace dd4hep {
+  namespace sim {
+    struct TrackerCombine {
+      Geant4TrackerHit  pre;
+      Geant4TrackerHit  post;
+      G4Track*          track;
+      double            e_cut;
+      int               current;
+      long long int     cellID;
+      TrackerCombine() : pre(), post(), track(0), e_cut(0.0), current(-1), cellID(0)  {}
+      void start(long long int cell, G4Step* step, G4StepPoint* point)   {
+	pre.storePoint(step,point);
+	current = pre.truth.trackID;
+	track   = step->GetTrack();
+	cellID  = cell;
+	post    = pre;
+	//std::cout << "start: " << cellID << " " << pre.position << " current = " << current << std::endl;
+      }
+      void update(G4Step* step) {
+	post.storePoint(step,step->GetPostStepPoint());
+	pre.truth.deposit += post.truth.deposit;
+	//std::cout << "update: " << cellID << " " << post.position << " current = " << current << std::endl;
+      }
+      void clear()   {
+	pre.truth.clear();
+	current = -1;
+	track = 0;
+      }
+      Geant4TrackerHit* extractHit(DDG4SensitiveDetector::HitCollection* c) {
+	//std::cout << "create Geant4TrackerHit: " << cellID << " current = " << current << " track = " << track << " de = " << pre.truth.deposit << std::endl;  
+	if ( current == -1 || !track ) {
+	  return 0;
+	}
+	else if ( pre.truth.deposit <= e_cut && !Geant4Hit::isGeantino(track) ) {
+	  clear();
+	  return 0;
+	}
+	double rho1 = pre.position.Rho();
+	double rho2 = post.position.Rho();
+	double rho = 0.5*(rho1+rho2);
+	Position pos = 0.5 * (pre.position + post.position);
+	double z = pos.z();
+	double r = sqrt(rho*rho+z*z);
+	Position path = post.position - pre.position;
+	double angle_O_pre_post = acos(-pre.position.Unit().Dot(path.Unit()));
+	double angle_O_post_pre = acos(post.position.Unit().Dot(path.Unit()));
+	double angle_O_P_pre = asin(pre.position.R()*sin(angle_O_pre_post)/r);
+	if(angle_O_pre_post>dd4hep::halfpi||angle_O_post_pre>dd4hep::halfpi){
+	  bool backward = angle_O_post_pre>angle_O_pre_post;
+	  double angle_O_P_pre = backward ? dd4hep::pi - asin(pre.position.R()*sin(angle_O_pre_post)/r) : asin(pre.position.R()*sin(angle_O_pre_post)/r);
+	  double pre2P = r/sin(angle_O_pre_post)*sin(angle_O_pre_post+angle_O_P_pre);
+	  pos = pre.position + pre2P*path.Unit();
+	}
+	Momentum mom = 0.5 * (pre.momentum + post.momentum);
+	Geant4TrackerHit* hit = new Geant4TrackerHit(pre.truth.trackID,
+						     pre.truth.pdgID,
+						     pre.truth.deposit,
+						     pre.truth.time);
+	hit->cellID   = cellID;
+	hit->position = pos;
+	hit->momentum = mom;
+	hit->length   = path.R();;
+	clear();
+	c->insert(hit);
+	return hit;
+      }
+    };
+  }
+}
+
+class TrackerCombineSensitiveDetector: public DDG4SensitiveDetector {
+ public:
+  TrackerCombineSensitiveDetector(const std::string& name, dd4hep::Detector& description);
+  
+  void Initialize(G4HCofThisEvent* HCE);
+  G4bool ProcessHits(G4Step* step, G4TouchableHistory* history);
+  void EndOfEvent(G4HCofThisEvent* HCE);
+  
+ protected:
+  HitCollection* m_hc = nullptr;
+
+ private:
+  dd4hep::sim::TrackerCombine userData;
+};
+#endif
diff --git a/Utilities/DataHelper/include/DataHelper/Navigation.h b/Utilities/DataHelper/include/DataHelper/Navigation.h
index 87ca762b9de7ad7dc499929dcad740033fea936b..6fbf6cca04106c292ed5477dcbaaf1881cba7470 100644
--- a/Utilities/DataHelper/include/DataHelper/Navigation.h
+++ b/Utilities/DataHelper/include/DataHelper/Navigation.h
@@ -5,6 +5,15 @@
 #include "edm4hep/TrackerHitCollection.h"
 #include <map>
 
+#if __has_include("edm4hep/EDM4hepVersion.h")
+#include "edm4hep/EDM4hepVersion.h"
+#else
+// Copy the necessary parts from  the header above to make whatever we need to work here
+#define EDM4HEP_VERSION(major, minor, patch) ((UINT64_C(major) << 32) | (UINT64_C(minor) << 16) | (UINT64_C(patch)))
+// v00-09 is the last version without the capitalization change of the track vector members
+#define EDM4HEP_BUILD_VERSION EDM4HEP_VERSION(0, 9, 0)
+#endif
+
 class Navigation{
  public:
   static Navigation* Instance();
@@ -17,9 +26,15 @@ class Navigation{
   void AddTrackerHitCollection(const edm4hep::TrackerHitCollection* col){m_hitColVec.push_back(col);};
   void AddTrackerAssociationCollection(const edm4hep::MCRecoTrackerAssociationCollection* col){m_assColVec.push_back(col);};
 
+#if EDM4HEP_BUILD_VERSION <= EDM4HEP_VERSION(0, 10, 5)
   edm4hep::TrackerHit GetTrackerHit(const edm4hep::ObjectID& id, bool delete_by_caller=true);
   std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const edm4hep::ObjectID& id);
+#else
+  edm4hep::TrackerHit GetTrackerHit(const podio::ObjectID& id, bool delete_by_caller=true);
+  std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const podio::ObjectID& id);
+#endif
   std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const edm4hep::TrackerHit& hit);
+  std::vector<edm4hep::SimTrackerHit> GetRelatedTrackerHit(const edm4hep::TrackerHit& hit, const edm4hep::MCRecoTrackerAssociationCollection* col);
   
   //static Navigation* m_fNavigation;
  private:
diff --git a/Utilities/DataHelper/src/Navigation.cpp b/Utilities/DataHelper/src/Navigation.cpp
index cc81b7f0e01d514fc0cd158af6034476198560f6..a7ba56f921c6273936f2cedea04a1beaa870f8c7 100644
--- a/Utilities/DataHelper/src/Navigation.cpp
+++ b/Utilities/DataHelper/src/Navigation.cpp
@@ -25,7 +25,11 @@ void Navigation::Initialize(){
   m_trkHits.clear();
 }
 
+#if EDM4HEP_BUILD_VERSION <= EDM4HEP_VERSION(0, 10, 5)
 edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, bool delete_by_caller){
+#else
+edm4hep::TrackerHit Navigation::GetTrackerHit(const podio::ObjectID& obj_id, bool delete_by_caller){
+#endif
   int id = obj_id.collectionID * 10000000 + obj_id.index;
   if(!delete_by_caller){
     if(m_trkHits.find(id)!=m_trkHits.end()) return m_trkHits[id];
@@ -33,7 +37,7 @@ edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, b
   /*
   for(int i=0;i<m_assColVec.size();i++){
     for(auto ass : *m_assColVec[i]){
-      edm4hep::ObjectID rec_id = ass.getRec().getObjectID();
+      auto rec_id = ass.getRec().getObjectID();
       if(rec_id.collectionID!=id.collectionID)break;
       else if(rec_id.index==id.index){
 	m_trkHits.push_back(ass.getRec());
@@ -44,7 +48,7 @@ edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, b
   */
   for(int i=0;i<m_hitColVec.size();i++){
     for(auto hit : *m_hitColVec[i]){
-      edm4hep::ObjectID this_id = hit.getObjectID();
+      auto this_id = hit.getObjectID();
       if(this_id.collectionID!=obj_id.collectionID)break;
       else if(this_id.index==obj_id.index){
 	edm4hep::TrackerHit hit_copy = edm4hep::TrackerHit(hit);
@@ -57,11 +61,15 @@ edm4hep::TrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, b
   throw std::runtime_error("Not found TrackerHit");
 }
 
+#if EDM4HEP_BUILD_VERSION <= EDM4HEP_VERSION(0, 10, 5)
 std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const edm4hep::ObjectID& id){
+#else
+std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const podio::ObjectID& id){
+#endif
   std::vector<edm4hep::SimTrackerHit> hits;
   for(int i=0;i<m_assColVec.size();i++){
     for(auto ass : *m_assColVec[i]){
-      edm4hep::ObjectID this_id = ass.getRec().getObjectID();
+      auto this_id = ass.getRec().getObjectID();
       if(this_id.collectionID!=id.collectionID)break;
       else if(this_id.index==id.index) hits.push_back(ass.getSim()); 
     }
@@ -79,3 +87,12 @@ std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const edm4h
   }
   return hits;
 }
+
+std::vector<edm4hep::SimTrackerHit> Navigation::GetRelatedTrackerHit(const edm4hep::TrackerHit& hit, const edm4hep::MCRecoTrackerAssociationCollection* col){
+  std::vector<edm4hep::SimTrackerHit> hits;
+  for(auto ass : *col){
+    if(ass.getRec().getObjectID().collectionID != hit.getObjectID().collectionID) break;
+    else if(ass.getRec()==hit) hits.push_back(ass.getSim());
+  }
+  return hits;
+}
diff --git a/Utilities/DataHelper/src/TrackExtended.cc b/Utilities/DataHelper/src/TrackExtended.cc
index edf9d43bb06afc488e8ae6b3cacf08e874c2e39c..7a2bf72dde5e13174d9c25d5e38516c22a666590 100644
--- a/Utilities/DataHelper/src/TrackExtended.cc
+++ b/Utilities/DataHelper/src/TrackExtended.cc
@@ -1,10 +1,18 @@
 #include "DataHelper/ClusterExtended.h"
 #include "DataHelper/TrackerHitExtended.h"
 #include "DataHelper/TrackExtended.h"
+
+#include "podio/podioVersion.h"
+
 #include <math.h>
+#include <iostream>
 
 TrackExtended::TrackExtended( ) {
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
     _track = NULL;
+#else
+    _track = edm4hep::Track::makeEmpty();
+#endif
     _superCluster = NULL;
     _trackerHitVector.clear();
     _clusterVec.clear();
@@ -23,7 +31,11 @@ TrackExtended::TrackExtended(Track track) {
 TrackExtended::TrackExtended( TrackerHitExtended * trackerhit) {
     _trackerHitVector.clear();
     _trackerHitVector.push_back(trackerhit);
+#if PODIO_BUILD_VERSION < PODIO_VERSION(0, 17, 4)
     _track = NULL;
+#else
+    _track = edm4hep::Track::makeEmpty();
+#endif
     _superCluster = NULL;
     _clusterVec.clear();
     _group = NULL;
diff --git a/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx b/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx
index 5f8c643d242d5289b0f8170e2153819cc6ede1ab..0ff61c7073b50eea9ce7f33d1397f0b21b7bcaae 100644
--- a/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx
+++ b/Utilities/KalTest/src/kaltracklib/TKalDetCradle.cxx
@@ -29,6 +29,7 @@
 #include "TVSurface.h"       // from GeomLib
 #include <memory>            // from STL
 #include <iostream>          // from STL
+#include <map>
 
 ClassImp(TKalDetCradle)
 
@@ -45,6 +46,19 @@ fDone(kFALSE), fIsClosed(kFALSE)
 
 TKalDetCradle::~TKalDetCradle()
 {
+  //std::cout << "TKalDetCradle::~TKalDetCradle() " << this << " " << GetEntries() << std::endl;
+  std::map<TAttElement*, int> det_nelement;
+
+  TIter next(this);
+  TObject *mlp = 0;
+  while ((mlp = next())) {
+    TAttElement* det = const_cast<TAttElement*>(&(dynamic_cast<TAttElement *>(mlp)->GetParent(kFALSE)));
+    if(det_nelement.find(det)!=det_nelement.end()) det_nelement[det]++;
+    else det_nelement[det] = 1;
+  }
+  for (auto it : det_nelement) {
+    delete it.first;
+  }
 }
 
 //_________________________________________________________________________
@@ -71,6 +85,8 @@ void TKalDetCradle::Install(TVKalDetector &det)
     dynamic_cast<TAttElement *>(mlp)->SetParentPtr(&det);
     det.SetParentPtr(this);
   }
+  det.SetOwner(kFALSE);
+
   fDone = kFALSE;
 }
 
diff --git a/build-k4.sh b/build-k4.sh
index a483d8993ef03f377d1fdd74fecf76d4f1d6adbe..4570c559aca12e47b9e7cc603af30ab9cd259d59 100755
--- a/build-k4.sh
+++ b/build-k4.sh
@@ -104,12 +104,16 @@ function run-make() {
     cmake --build .
 }
 
+function run-install() {
+    cmake --install .
+}
+
 ##############################################################################
 # Parse the command line options
 ##############################################################################
 
 # The current default platform
-k4_platform=x86_64-linux-gcc9-opt
+k4_platform=x86_64-linux-gcc11-opt
 k4_version=master
 bldtool=${CEPCSW_BLDTOOL} # make, ninja # set in env var
 
@@ -120,3 +124,5 @@ check-working-builddir || exit -1
 run-cmake || exit -1
 
 run-make || exit -1
+
+run-install || exit -1
diff --git a/build.sh b/build.sh
index 337287fe081bdbf364c5fa2b856dc0a4534aa9df..5c7393d169fd5b35240df699e7c1314b5cc783a3 100755
--- a/build.sh
+++ b/build.sh
@@ -83,7 +83,12 @@ function run-cmake() {
 }
 
 function run-make() {
-    cmake --build .
+    local njobs=-j$(nproc)
+    cmake --build . $njobs
+}
+
+function run-install() {
+    cmake --install .
 }
 
 ##############################################################################
@@ -91,8 +96,8 @@ function run-make() {
 ##############################################################################
 
 # The current default platform
-lcg_platform=x86_64-centos7-gcc8-opt
-lcg_version=101.0.1
+lcg_platform=x86_64-centos7-gcc11-opt
+lcg_version=103.0.2
 
 bldtool=${CEPCSW_BLDTOOL} # make, ninja # set in env var
 
@@ -103,3 +108,5 @@ check-working-builddir || exit -1
 run-cmake || exit -1
 
 run-make || exit -1
+
+run-install || exit -1
diff --git a/cmake/CEPCSWConfig.cmake b/cmake/CEPCSWConfig.cmake
index c008c2f82eae85e547b939a54d87cb190073bdfa..4f9445ac3683765653b333811ce5ca8803cec5c6 100644
--- a/cmake/CEPCSWConfig.cmake
+++ b/cmake/CEPCSWConfig.cmake
@@ -2,7 +2,6 @@ include(CMakeFindDependencyMacro)
 find_dependency(podio REQUIRED)
 find_dependency(Gaudi REQUIRED)
 find_dependency(k4FWCore REQUIRED)
-find_dependency(k4LCIOReader REQUIRED)
 find_dependency(EDM4HEP REQUIRED)
 find_dependency(ROOT REQUIRED)
 
diff --git a/cmake/FindOnnxRuntime.cmake b/cmake/FindOnnxRuntime.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..5a9db01ce9b30c9d3f40e7d17c263a469e647d90
--- /dev/null
+++ b/cmake/FindOnnxRuntime.cmake
@@ -0,0 +1,35 @@
+# Find the ONNX Runtime include directory and library.
+#
+# This module defines the `onnxruntime` imported target that encodes all
+# necessary information in its target properties.
+
+find_library(
+  OnnxRuntime_LIBRARY
+  NAMES onnxruntime
+  PATH_SUFFIXES lib lib32 lib64
+  DOC "The ONNXRuntime library")
+  
+if(NOT OnnxRuntime_LIBRARY)
+  message(FATAL_ERROR "onnxruntime library not found")
+endif()
+
+find_path(
+  OnnxRuntime_INCLUDE_DIR
+  NAMES core/session/onnxruntime_cxx_api.h
+  PATH_SUFFIXES include include/onnxruntime
+  DOC "The ONNXRuntime include directory")
+  
+if(NOT OnnxRuntime_INCLUDE_DIR)
+  message(FATAL_ERROR "onnxruntime includes not found")
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+  OnnxRuntime
+  REQUIRED_VARS OnnxRuntime_LIBRARY OnnxRuntime_INCLUDE_DIR)
+
+add_library(OnnxRuntime SHARED IMPORTED)
+set_property(TARGET OnnxRuntime PROPERTY IMPORTED_LOCATION ${OnnxRuntime_LIBRARY})
+set_property(TARGET OnnxRuntime PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${OnnxRuntime_INCLUDE_DIR})
+
+mark_as_advanced(OnnxRuntime_FOUND OnnxRuntime_INCLUDE_DIR OnnxRuntime_LIBRARY)
diff --git a/run.sh b/run.sh
index bb42b5c8d3b22959ff6e0ffa15306f6fdad1fa19..461f88885e1fcac08fd648eadced5f942f60976b 100755
--- a/run.sh
+++ b/run.sh
@@ -66,8 +66,9 @@ function run-job() {
 ##############################################################################
 
 # The current default platform
-lcg_platform=x86_64-centos7-gcc8-opt
-lcg_version=101.0.1
+lcg_platform=x86_64-centos7-gcc11-opt
+lcg_version=103.0.2
+
 
 bldtool=${CEPCSW_BLDTOOL} # make, ninja # set in env var
 
diff --git a/setup.sh b/setup.sh
index a75d5f39d2d3fca4d0501c970c74648b69229014..3e09a68fff76f3d16300423d10bd8aba3d713317 100644
--- a/setup.sh
+++ b/setup.sh
@@ -9,6 +9,8 @@
 # Author: Tao Lin <lintao@ihep.ac.cn>
 ##############################################################################
 
+THISSCRITDIR=$(dirname $(readlink -e "${BASH_SOURCE[0]}" 2>/dev/null) 2>/dev/null) # Darwin readlink doesnt accept -e
+
 function info:() {
     echo "INFO: $*" 1>&2
 }
@@ -41,6 +43,25 @@ function setup-external() {
 
 }
 
+function setup-install-area() {
+    local installarea=$THISSCRITDIR/InstallArea
+    if [ ! -d "$installarea" ]; then
+        return
+    fi
+
+    export PATH=$installarea/bin:$PATH
+    export LD_LIBRARY_PATH=$installarea/lib:$LD_LIBRARY_PATH
+    export PYTHONPATH=$installarea/lib:$PYTHONPATH
+    export PYTHONPATH=$installarea/python:$PYTHONPATH
+    export ROOT_INCLUDE_PATH=$installarea/include:$ROOT_INCLUDE_PATH
+
+    local extrasetupscript=$installarea/setup.sh
+    if [ -f "$extrasetupscript" ]; then
+        source $extrasetupscript
+    fi
+
+    info: "Setup CEPCSW: $installarea"
+}
 
 ##############################################################################
 # Parse the command line options
@@ -49,8 +70,9 @@ function setup-external() {
 # CEPCSW_LCG_VERSION=${1}; shift
 
 if [ -z "$CEPCSW_LCG_VERSION" ]; then
-    CEPCSW_LCG_VERSION=101.0.1
+    CEPCSW_LCG_VERSION=103.0.2
 fi
 export CEPCSW_LCG_VERSION
 
 setup-external
+setup-install-area