From 004a854da82cdf854a2a7c88d3b57e19fc03f208 Mon Sep 17 00:00:00 2001
From: "myliu@ihep.ac.cn" <myliu@ihep.ac.cn>
Date: Mon, 29 Apr 2024 14:06:06 +0000
Subject: [PATCH] Add Tracking algorithm based on CKF

---
 CMakeLists.txt                                |   2 +-
 .../CRD_common_v01/DC_Simple_v01_06.xml       |  79 ++
 .../CRD_o1_v01/CRD_Dimensions_v01_01.xml      |   6 +-
 .../CRD_o1_v01/CRD_o1_v01-onlyTracker.xml     |   2 +-
 .../TDR_o2_v01/TDR_Dimensions_v02_01.xml      |  20 +-
 .../TDR_o2_v01/TDR_o2_v01-onlyTracker.xml     |   2 +-
 .../DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml  |   2 +-
 .../TDR_o2_v02/TDR_Dimensions_v02_02.xml      |  17 +
 .../TDR_o2_v02/TDR_o2_v02-onlyTracker.xml     |   2 +-
 .../DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml  |   2 +-
 Detector/DetDriftChamber/compact/det.xml      |  14 +-
 Detector/DetSegmentation/CMakeLists.txt       |   1 +
 .../DetSegmentation/GridDriftChamber.h        |  17 +-
 .../DetSegmentation/src/GridDriftChamber.cpp  | 107 ++-
 Digitisers/DCHDigi/CMakeLists.txt             |   2 +-
 Digitisers/DCHDigi/src/DCHDigiAlg.cpp         | 132 ++-
 Digitisers/DCHDigi/src/DCHDigiAlg.h           |  38 +-
 Reconstruction/RecGenfitAlg/CMakeLists.txt    |   8 +-
 .../RecGenfitAlg/src/DCTrackFinding.cpp       | 668 +++++++++++++
 .../RecGenfitAlg/src/DCTrackFinding.h         | 213 ++++
 .../RecGenfitAlg/src/GenfitFitter.cpp         |  22 +
 .../RecGenfitAlg/src/GenfitFitter.h           |   2 +
 Reconstruction/RecGenfitAlg/src/GenfitHit.cpp |   4 +-
 .../RecGenfitAlg/src/GenfitTrack.cpp          | 632 +++++++++++-
 Reconstruction/RecGenfitAlg/src/GenfitTrack.h |  69 +-
 .../RecGenfitAlg/src/RecGenfitAlgDC.cpp       | 409 --------
 .../RecGenfitAlg/src/RecGenfitAlgDC.h         | 190 ----
 .../RecGenfitAlg/src/RecGenfitAlgSDT.cpp      | 308 ++++--
 .../RecGenfitAlg/src/RecGenfitAlgSDT.h        | 309 +++---
 .../RecGenfitAlg/src/WireMeasurementDC.cpp    |   9 +-
 .../RecGenfitAlg/src/WireMeasurementDC.h      |  18 +-
 .../src/TruthTracker/TruthTrackerAlg.cpp      | 907 +++++++++---------
 .../src/TruthTracker/TruthTrackerAlg.h        | 128 +--
 Utilities/DataHelper/CMakeLists.txt           |  18 +-
 .../include/DataHelper/GeomeryHelper.h        |  55 ++
 .../include/DataHelper/TrackHelper.h          |  11 +
 .../include/DataHelper/TrackerHitHelper.h     |  15 +-
 Utilities/DataHelper/src/GeomeryHelper.cpp    |  58 ++
 Utilities/DataHelper/src/TrackHelper.cc       |  34 +-
 Utilities/DataHelper/src/TrackerHitHelper.cpp |  29 +-
 cmake/CEPCSWDependencies.cmake                |   2 +
 41 files changed, 3075 insertions(+), 1488 deletions(-)
 create mode 100644 Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml
 create mode 100644 Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp
 create mode 100644 Reconstruction/RecGenfitAlg/src/DCTrackFinding.h
 delete mode 100644 Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp
 delete mode 100644 Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h
 create mode 100644 Utilities/DataHelper/include/DataHelper/GeomeryHelper.h
 create mode 100644 Utilities/DataHelper/src/GeomeryHelper.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8c8290cc..a42be1e5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,7 +9,7 @@ include(cmake/CEPCSWEnv.cmake)
 find_package(ROOT COMPONENTS RIO Tree)
 
 find_package(Gaudi)
-
+find_package(Eigen3)
 
 include(GNUInstallDirs)
 include(CTest)
diff --git a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml
new file mode 100644
index 00000000..4f7045ab
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd>
+
+  <info name="DriftChamber"
+    title="Test with Drift Chamber"
+    author="Tao Lin"
+    url="http://github.com/cepc/CEPCSW"
+    status="development"
+    version="v0">
+    <comment>Test with Drift Chamber</comment>
+  </info>
+
+  <define>
+
+    <constant name="DC_layer_number" value="66"/>
+    <constant name="Alpha" value="12*deg"/>
+    <constant name="Gas_radius_min" value="DC_rbegin+DC_inner_wall_thickness+DC_safe_distance"/>
+    <constant name="Gas_half_length" value="DC_half_length-DC_Endcap_dz-DC_safe_distance"/>
+    <constant name="Gas_length" value="Gas_half_length*2"/>
+    <constant name="DC_cell_width" value="18*mm"/>
+    <constant name="DC_inner_wall_radius_min" value="DC_rbegin"/>
+    <constant name="DC_inner_wall_radius_max" value="DC_rbegin+DC_inner_wall_thickness"/>
+    <constant name="DC_Endcap_rmin" value="DC_rbegin"/>
+    <constant name="DC_Endcap_rmax" value="DC_rend"/>
+
+    <constant name="DC_construct_wire" value="0"/>
+
+    <constant name="DC_layer_width" value="18*mm"/>
+
+  </define>
+
+  <limits>
+    <limitset name="DC_limits">
+      <limit name="step_length_max" particles="*" value="0.1" unit="mm" />
+    </limitset>
+  </limits>
+
+  <regions>
+    <region name="DriftChamberRegion">
+    </region>
+  </regions>
+
+  <detectors>
+    <detector id="DetID_DC" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="DCVis" sensitive="true" limits="DC_limits">
+      <material name="Air"/>
+      <chamber id="0" material="GasHe_90Isob_10"/>
+      <side material="CarbonFiber"/>
+      <envelope vis="SeeThrough">
+        <shape type="BooleanShape" operation="Union" material="Air">
+          <shape type="Tube" rmin="DC_rbegin" rmax="DC_rend" dz="DC_half_length" />
+        </shape>
+      </envelope>
+
+      <module id="0" name="SignalWire" type="Tube" rmin="0*mm" rmax="0.01*mm" vis="RedVis">
+          <tubs name="W" type="Tube" rmin="0*mm" rmax="0.007*mm" material="Tungsten"/>
+          <tubs name="Au" type="Tube" rmin="0.007*mm" rmax="0.01*mm" material="Gold"/>
+      </module>
+
+      <module id="1" name="FieldWire" type="Tube" rmin="0*mm" rmax="0.03*mm" vis="GreenVis">
+          <tubs name="Al" type="Tube" rmin="0*mm" rmax="0.027*mm" material="Aluminum"/>
+          <tubs name="Ag" type="Tube" rmin="0.027*mm" rmax="0.03*mm" material="Silver"/>
+      </module>
+
+      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_GASEOUS + DetType_WIRE"/>
+      <!-- Use cm as unit if you want to use Pandora for reconstruction -->
+     <sensitive type="SimpleDriftChamber"/>
+     </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="DriftChamberHitsCollection">
+      <segmentation type="GridDriftChamber" cell_size="DC_cell_width" detector_length="Gas_length" identifier_phi="cellID" layerID="layer" DC_rbegin="DC_rbegin" DC_rend="DC_rend" layer_width="DC_layer_width"/>
+
+
+      <id>system:5,layer:7:9,chamber:8,cellID:32:16</id>
+    </readout>
+  </readouts>
+
+</lccdd>
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 9a79f6fb..63686bcc 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
@@ -85,14 +85,14 @@
     <constant name="Vertex_Side_rmin"    value="BeamPipe_VertexRegion_rmax"/>
 
     <!-- Parameters of single drift chamber  -->
-    <constant name="DC_rbegin" value="800*mm"/>
+    <constant name="DC_rbegin" value="600*mm"/>
     <constant name="DC_rend" value="1800*mm"/>
 
     <constant name="DC_Endcap_dz" value="0.1*mm"/>
-    <constant name="DC_half_length"  value="2980*mm" />
+    <constant name="DC_half_length"  value="2900*mm" />
     <constant name="DC_safe_distance" value="0.02*mm"/>
     <constant name="DC_inner_wall_thickness" value="0.2*mm"/>
-    <constant name="DC_outer_wall_thickness" value="2.8*mm"/>
+    <constant name="DC_outer_wall_thickness" value="0.3*mm"/>
     <constant name="MainTracker_half_length"  value="DC_half_length"/>
 
     <!--obselete for single drift chamber-->
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 d80301fb..738e55c4 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
@@ -31,7 +31,7 @@
   <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_05.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/>
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
   
   <fields>
diff --git a/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml b/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml
index 368a017e..85c18ce0 100644
--- a/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml
+++ b/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml
@@ -34,6 +34,7 @@
     <constant name="DetID_TPC"          value="  4"/>
     <constant name="DetID_SET"          value="  5"/>
     <constant name="DetID_ETD"          value="  6"/>
+    <constant name="DetID_DC"           value="  4"/>
     
     <constant name="DetID_ECAL"         value=" 20"/>
     <constant name="DetID_ECAL_PLUG"    value=" 21"/>
@@ -90,10 +91,21 @@
 	   +(BeamPipe_FirstExpand_width/2-BeamPipe_Central_inner_radius)/(BeamPipe_ExpandAl_zmax-BeamPipe_CentralAl_zmax)*(Vertex_half_length-BeamPipe_CentralAl_zmax)"/>
     <constant name="Vertex_Side_rmin"    value="BeamPipe_VertexRegion_rmax"/>
 
-    <constant name="DC_inner_radius" value="600*mm"/>
-    <constant name="DC_outer_radius" value="1800*mm"/>
-    <constant name="DC_half_length"  value="2905*mm"/>
-    <constant name="OuterTracker_half_length" value="DC_half_length"/>
+    <!-- Parameters of single drift chamber  -->
+    <constant name="DC_rbegin" value="600*mm"/>
+    <constant name="DC_rend" value="1800*mm"/>
+
+    <constant name="DC_Endcap_dz" value="0.1*mm"/>
+    <constant name="DC_half_length"  value="2900*mm" />
+    <constant name="DC_safe_distance" value="0.02*mm"/>
+    <constant name="DC_inner_wall_thickness" value="0.2*mm"/>
+    <constant name="DC_outer_wall_thickness" value="0.3*mm"/>
+    <constant name="MainTracker_half_length"  value="DC_half_length"/>
+
+    <!--obselete for single drift chamber-->
+    <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"/>
 
     <constant name="SIT1_inner_radius"   value="150*mm"/>
     <constant name="SIT2_inner_radius"   value="360*mm"/>
diff --git a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml
index f707fdc8..0c7e65ac 100644
--- a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml
+++ b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml
@@ -33,7 +33,7 @@
   <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/>
   <include ref="../CRD_common_v01/FTD_SkewRing_v01_02.xml"/>
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/>
-  <!--TODO: DC/-->
+  <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/>
 
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
   
diff --git a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml
index 6a0fbaf8..76701836 100644
--- a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml
+++ b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml
@@ -33,7 +33,7 @@
   <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/>
   <include ref="../CRD_common_v01/FTD_SkewRing_v01_02.xml"/>
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/>
-  <!--TODO: DC/-->
+  <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/>
 
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
   <!--TODO: Ecal and Hcal/-->
diff --git a/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml b/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml
index 94a77c81..44643fa8 100644
--- a/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml
+++ b/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml
@@ -34,6 +34,7 @@
     <constant name="DetID_TPC"          value="  4"/>
     <constant name="DetID_SET"          value="  5"/>
     <constant name="DetID_ETD"          value="  6"/>
+    <constant name="DetID_DC"          value="   4"/>
     
     <constant name="DetID_ECAL"         value=" 20"/>
     <constant name="DetID_ECAL_PLUG"    value=" 21"/>
@@ -95,6 +96,22 @@
     <constant name="TPC_half_length"  value="2905*mm"/>
     <constant name="OuterTracker_half_length" value="TPC_half_length"/>
 
+    <!-- Parameters of single drift chamber  -->
+    <constant name="DC_rbegin" value="600*mm"/>
+    <constant name="DC_rend" value="1800*mm"/>
+
+    <constant name="DC_Endcap_dz" value="0.1*mm"/>
+    <constant name="DC_half_length"  value="2900*mm" />
+    <constant name="DC_safe_distance" value="0.02*mm"/>
+    <constant name="DC_inner_wall_thickness" value="0.2*mm"/>
+    <constant name="DC_outer_wall_thickness" value="0.3*mm"/>
+    <constant name="MainTracker_half_length"  value="DC_half_length"/>
+
+    <!--obselete for single drift chamber-->
+    <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"/>
+
     <constant name="SIT1_inner_radius"   value="100*mm"/>
     <constant name="SIT2_inner_radius"   value="300*mm"/>
     <constant name="SIT3_inner_radius"   value="580*mm"/>
diff --git a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml
index 7cea5e89..6e955313 100644
--- a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml
+++ b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml
@@ -33,7 +33,7 @@
   <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_02.xml"/>
   <include ref="../CRD_common_v02/FTD_SkewRing_v01_04.xml"/>
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/>
-  <!--TODO: DC/-->
+  <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/>
 
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
   
diff --git a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml
index 494b42fe..ad6767ac 100644
--- a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml
+++ b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml
@@ -33,7 +33,7 @@
   <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_02.xml"/>
   <include ref="../CRD_common_v02/FTD_SkewRing_v01_04.xml"/>
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/>
-  <!--TODO: DC/-->
+  <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/>
 
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
   <!--TODO: Ecal and Hcal/-->
diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml
index 22548148..fa353ba5 100644
--- a/Detector/DetDriftChamber/compact/det.xml
+++ b/Detector/DetDriftChamber/compact/det.xml
@@ -30,19 +30,19 @@
     <constant name="DC_safe_distance" value="0.02*mm"/>
 
     <constant name="DC_inner_wall_thickness" value="0.2*mm"/>
-    <constant name="DC_outer_wall_thickness" value="2.8*mm"/>
+    <constant name="DC_outer_wall_thickness" value="0.3*mm"/>
 
-    <constant name="DC_rbegin" value="800*mm"/>
+    <constant name="DC_rbegin" value="600*mm"/>
     <constant name="DC_rend" value="1800*mm"/>
 
-    <constant name="DC_layer_number" value="55"/>
+    <constant name="DC_layer_number" value="66"/>
     <constant name="Alpha" value="12*deg"/>
 
     <constant name="Gas_radius_min" value="DC_rbegin+DC_inner_wall_thickness+DC_safe_distance"/>
 
     <constant name="DC_Endcap_dz" value="0.1*mm"/>
 
-    <constant name="DC_half_length" value="2980*mm"/>
+    <constant name="DC_half_length" value="2900*mm"/>
 
     <constant name="Gas_half_length" value="DC_half_length-DC_Endcap_dz-DC_safe_distance"/>
     <constant name="Gas_length" value="Gas_half_length*2"/>
@@ -97,9 +97,9 @@
           <tubs name="Au" type="Tube" rmin="0.007*mm" rmax="0.01*mm" material="Gold"/>
       </module>
 
-      <module id="1" name="FieldWire" type="Tube" rmin="0*mm" rmax="0.02*mm" vis="VisibleGreen">
-          <tubs name="Al" type="Tube" rmin="0*mm" rmax="0.017*mm" material="Aluminum"/>
-          <tubs name="Ag" type="Tube" rmin="0.017*mm" rmax="0.02*mm" material="Silver"/>
+      <module id="1" name="FieldWire" type="Tube" rmin="0*mm" rmax="0.03*mm" vis="VisibleGreen">
+          <tubs name="Al" type="Tube" rmin="0*mm" rmax="0.027*mm" material="Aluminum"/>
+          <tubs name="Ag" type="Tube" rmin="0.027*mm" rmax="0.03*mm" material="Silver"/>
       </module>
 
       <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_GASEOUS + DetType_WIRE"/>
diff --git a/Detector/DetSegmentation/CMakeLists.txt b/Detector/DetSegmentation/CMakeLists.txt
index 9b027334..09e060a9 100644
--- a/Detector/DetSegmentation/CMakeLists.txt
+++ b/Detector/DetSegmentation/CMakeLists.txt
@@ -12,6 +12,7 @@ gaudi_add_library(DetSegmentation
                   LINK Gaudi::GaudiKernel
                        ${DD4hep_COMPONENT_LIBRARIES}
                        ${ROOT_LIBRARIES}
+                       BelleIICKF::CKFDataobjects
 )
 
 gaudi_add_module(DetSegmentationPlugin
diff --git a/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h b/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h
index 77e9bfa5..4b36c832 100644
--- a/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h
+++ b/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h
@@ -2,6 +2,7 @@
 #define DETSEGMENTATION_GRIDDRIFTCHAMBER_H
 
 #include "DDSegmentation/Segmentation.h"
+#include "IDCSegmentation.h"
 
 #include "TVector3.h"
 #include <cmath>
@@ -45,7 +46,7 @@ inline bool operator < (const struct CID &c1, const struct CID &c2) {
 
 namespace dd4hep {
 namespace DDSegmentation {
-class GridDriftChamber : public Segmentation {
+class GridDriftChamber : public Belle2::IDCSegmentation,public Segmentation {
 public:
   /// default constructor using an arbitrary type
   GridDriftChamber(const std::string& aCellEncoding);
@@ -61,15 +62,25 @@ public:
   virtual double distanceTrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const;
   virtual double distanceTrackWire2(const CellID& cID, const TVector3& hit_pos) const;
   virtual void cellposition(const CellID& cID, TVector3& Wstart, TVector3& Wend) const;
-  virtual void cellposition2(int chamber, int layer, int cell, TVector3& Wstart, TVector3& Wend) const;
+  int maxWireID(int chamber,int layer) override;
+  virtual int GobalWireID(int layer,int cellID) const;
+  void cellposition2(int chamber, int layer, int cell,
+          TVector3& Wstart, TVector3& Wend) override ;
   TVector3 LineLineIntersect(TVector3& p1, TVector3& p2, TVector3& p3, TVector3& p4) const;
   virtual TVector3 distanceClosestApproach(const CellID& cID, const TVector3& hitPos, TVector3& PCA) const;
   virtual TVector3 Line_TrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const;
   virtual TVector3 IntersectionTrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const;
   virtual TVector3 wirePos_vs_z(const CellID& cID, const double& zpos) const;
-  virtual double Distance(const CellID& cID, const TVector3& pointIn, const TVector3& pointOut, TVector3& hitPosition, TVector3& PCA) const;
+  virtual TVector3 wirePos_vs_z2(const int layerID,const int wireID,
+          const double& zpos) const;
+  virtual double Distance(const CellID& cID, const TVector3& pointIn,
+          const TVector3& pointOut, TVector3& hitPosition, TVector3& PCA) const;
   virtual TVector3 returnPhi0(int chamber,int layer, double z) const;
+  virtual void cellpositionZ(int layerID, int cellID,double z,TVector3& cellPos) const;
 
+  int wireID_Z(int chamberID,int layerID,TVector3 posz) override;
+  int layerNum() override;
+  int wireAllNum() override;
 
 //  double phi(const CellID& cID) const;
   inline double cell_Size() const { return m_cellSize; }
diff --git a/Detector/DetSegmentation/src/GridDriftChamber.cpp b/Detector/DetSegmentation/src/GridDriftChamber.cpp
index 5c59f200..e35e1105 100644
--- a/Detector/DetSegmentation/src/GridDriftChamber.cpp
+++ b/Detector/DetSegmentation/src/GridDriftChamber.cpp
@@ -1,4 +1,5 @@
 #include "DetSegmentation/GridDriftChamber.h"
+#include "IDCSegmentation.h"
 #include <map>
 
 namespace dd4hep {
@@ -14,6 +15,9 @@ GridDriftChamber::GridDriftChamber(const std::string& cellEncoding) : Segmentati
   registerParameter("detector_length", "Length of the wire", m_detectorLength, 1., SegmentationParameter::LengthUnit);
   registerIdentifier("identifier_phi", "Cell ID identifier for phi", m_phiID, "cellID");
   registerIdentifier("layerID", "layer id", layer_id, "layer");
+  registerParameter("layer_width", "layer_width", m_layer_width, 0., SegmentationParameter::LengthUnit);
+  registerParameter("DC_rbegin", "DC_rbegin", m_DC_rbegin, 0., SegmentationParameter::LengthUnit);
+  registerParameter("DC_rend", "DC_rend", m_DC_rend, 0., SegmentationParameter::LengthUnit);
 }
 
 GridDriftChamber::GridDriftChamber(const BitFieldCoder* decoder) : Segmentation(decoder) {
@@ -69,6 +73,30 @@ CellID GridDriftChamber::cellID(const Vector3D& /*localPosition*/, const Vector3
   return cID;
 }
 
+int GridDriftChamber::wireID_Z(int chamberID,int layerID,TVector3 poca_onwire)
+{
+  
+    updateParams(chamberID,layerID);
+
+    TVector3 Phi0 = returnPhi0(chamberID,layerID,poca_onwire.Z());
+    double phi0 = phiFromXY2(Phi0);
+
+    double phi_hit = std::atan2(poca_onwire.Y(),poca_onwire.X());
+    if(phi_hit<0) phi_hit += 2 * M_PI;
+    double offsetphi= m_offset;
+    double _lphi;
+
+    _lphi = phi_hit - phi0 + _currentLayerphi/2.;
+    if(_lphi<0.){
+        _lphi+=2*M_PI;
+    }else if(_lphi>2*M_PI){
+        _lphi=fmod(_lphi,2*M_PI);
+    }
+    int cellID=floor(_lphi/_currentLayerphi);
+
+    return cellID;
+}
+
 double GridDriftChamber::phi(const CellID& cID) const {
     CellID phiValue = _decoder->get(cID, m_phiID);
     return binToPosition(phiValue, _currentLayerphi, m_offset);
@@ -88,6 +116,32 @@ void GridDriftChamber::cellposition(const CellID& cID, TVector3& Wstart,
     Wend = returnWirePosition(phi_end, 1);
 }
 
+//myliu:FIXME
+void GridDriftChamber::cellpositionZ(int layerID, int cellID,double z,
+        TVector3& cellPos) const{
+
+    int chamberID=0;
+    updateParams(chamberID,layerID);
+
+    TVector3 Phi0 = returnPhi0(chamberID,layerID,z);
+    double phi0 = phiFromXY2(Phi0);
+
+    double phi_hit = phi0+(cellID+0.5)*_currentLayerphi;
+    if(phi_hit<0.){
+        phi_hit+=2*M_PI;
+    }else if(phi_hit>2*M_PI){
+        phi_hit=fmod(phi_hit,2*M_PI);
+    }
+
+    double x = _currentRadius*std::cos(phi_hit);
+    double y = _currentRadius*std::sin(phi_hit);
+
+    cellPos.SetX(x);
+    cellPos.SetY(y);
+    cellPos.SetZ(z);
+
+}
+
 TVector3 GridDriftChamber::returnPhi0(int chamber,int layer, double z) const
 {
     updateParams(chamber,layer);
@@ -105,9 +159,21 @@ TVector3 GridDriftChamber::returnPhi0(int chamber,int layer, double z) const
     return TVector3(x_pos,y_pos,z);
 }
 
+int GridDriftChamber::maxWireID(int chamber,int layer)
+{
+    updateParams(chamber,layer);
+    //    std::cout << " maxWireID = " << (int) ((2*3.1415926/_currentLayerphi)+1)  << std::endl;
+    return (int) ((2*3.1415926/_currentLayerphi)+1);
+}
+
+int GridDriftChamber::GobalWireID(int layer,int cellID) const
+{
+    return layer*1000000+cellID;
+}
+
 
 void GridDriftChamber::cellposition2(int chamber,int layer, int cell,
-        TVector3& Wstart, TVector3& Wend) const {
+        TVector3& Wstart, TVector3& Wend){
     updateParams(chamber,layer);
     double phi_start = binToPosition(cell, _currentLayerphi, m_offset);
     double phi_end = phi_start + returnAlpha();
@@ -251,6 +317,29 @@ TVector3 GridDriftChamber::wirePos_vs_z(const CellID& cID, const double& zpos) c
     return wireCoord;
 }
 
+// Get the wire position for a z
+TVector3 GridDriftChamber::wirePos_vs_z2(const int layerID, const int wireID,
+        const double& zpos) const {
+
+    TVector3 Wstart = {0,0,0};
+    TVector3 Wend = {0,0,0};
+
+    updateParams(0,layerID);
+    double phi_start = binToPosition(wireID, _currentLayerphi, m_offset);
+    double phi_end = phi_start + returnAlpha();
+
+    Wstart = returnWirePosition(phi_start, -1);
+    Wend = returnWirePosition(phi_end, 1);
+
+    double t = (zpos - Wstart.Z())/(Wend.Z()-Wstart.Z());
+    double x = Wstart.X()+t*(Wend.X()-Wstart.X());
+    double y = Wstart.Y()+t*(Wend.Y()-Wstart.Y());
+
+    TVector3 wireCoord(x, y, zpos);
+    return wireCoord;
+}
+
+
 TVector3 GridDriftChamber::IntersectionTrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const {
     // Intersection between the particle track and the wire assuming that the track between hit_start and hit_end is linear
 
@@ -329,5 +418,21 @@ double GridDriftChamber::Distance(const CellID& cID, const TVector3& pointIn, co
     return distance;
 }
 
+int GridDriftChamber::layerNum() {
+
+    int num = (m_DC_rend-m_DC_rbegin)/m_layer_width;
+    return num;
+
+}
+
+int GridDriftChamber::wireAllNum() {
+
+    int nwire =0;
+    for(int i=0;i<layerNum();i++){
+        nwire = nwire + maxWireID(0,i);
+    }
+    return nwire;
+}
+
 }
 }
diff --git a/Digitisers/DCHDigi/CMakeLists.txt b/Digitisers/DCHDigi/CMakeLists.txt
index 8246da79..e494f226 100644
--- a/Digitisers/DCHDigi/CMakeLists.txt
+++ b/Digitisers/DCHDigi/CMakeLists.txt
@@ -3,13 +3,13 @@ gaudi_add_module(DCHDigi
                  SOURCES src/DCHDigiAlg.cpp
                  LINK DetInterface
                       DetSegmentation
+                      DataHelperLib
                       k4FWCore::k4FWCore 
                       Gaudi::GaudiKernel
                       Gaudi::GaudiAlgLib
                       ${CLHEP_LIBRARIES}
                       ${DD4hep_COMPONENT_LIBRARIES}
                       ${ROOT_LIBRARIES}
-                      DetSegmentation
                       EDM4HEP::edm4hep EDM4HEP::edm4hepDict
 )
 install(TARGETS DCHDigi
diff --git a/Digitisers/DCHDigi/src/DCHDigiAlg.cpp b/Digitisers/DCHDigi/src/DCHDigiAlg.cpp
index 21a84041..6e44d37b 100644
--- a/Digitisers/DCHDigi/src/DCHDigiAlg.cpp
+++ b/Digitisers/DCHDigi/src/DCHDigiAlg.cpp
@@ -21,6 +21,9 @@
 #include <algorithm>
 
 #include "time.h"
+#include <unordered_map>
+
+#include "DataHelper/HelixClass.h"
 
 DECLARE_COMPONENT( DCHDigiAlg )
 
@@ -34,6 +37,7 @@ DCHDigiAlg::DCHDigiAlg(const std::string& name, ISvcLocator* svcLoc)
   
   // Output collections
   declareProperty("DigiDCHitCollection", w_DigiDCHCol, "Handle of Digi DCHit collection");
+  declareProperty("SignalDigiDCHitCollection", w_SignalDigiDCHCol, "Handle of Signal Digi DCHit collection");
   
   declareProperty("AssociationCollection", w_AssociationCol, "Handle of Association collection");
    
@@ -89,8 +93,14 @@ StatusCode DCHDigiAlg::initialize()
             m_tuple->addItem( "poca_x"   , m_n_digi, m_poca_x    ).ignore();
             m_tuple->addItem( "poca_y"   , m_n_digi, m_poca_y    ).ignore();
             m_tuple->addItem( "hit_dE"   , m_n_digi,m_hit_dE    ).ignore();
-            m_tuple->addItem( "hit_dE_dx", m_n_digi,m_hit_dE_dx ).ignore();
             m_tuple->addItem( "truthlength", m_n_digi,m_truthlength).ignore();
+            m_tuple->addItem( "N_noise", m_n_noise, 0, 1000000 ).ignore();
+            m_tuple->addItem( "layer_noise", m_n_noise,m_noise_layer).ignore();
+            m_tuple->addItem( "cell_noise", m_n_noise,m_noise_cell).ignore();
+            m_tuple->addItem( "NoiseT", m_n_noise,m_noise_time).ignore();
+            m_tuple->addItem( "N_noiseCover", m_n_noiseCover, 0, 1000000 ).ignore();
+            m_tuple->addItem( "layer_noiseCover", m_n_noiseCover,m_noiseCover_layer).ignore();
+            m_tuple->addItem( "cell_noiseCover", m_n_noiseCover,m_noiseCover_cell).ignore();
           } else { // did not manage to book the N tuple....
             info() << "    Cannot book N-tuple:" << long( m_tuple ) << endmsg;
           }
@@ -108,6 +118,7 @@ StatusCode DCHDigiAlg::execute()
   info() << "Processing " << _nEvt << " events " << endmsg;
   if(m_WriteAna) m_evt = _nEvt;
   edm4hep::TrackerHitCollection* Vec   = w_DigiDCHCol.createAndPut();
+  edm4hep::TrackerHitCollection* SignalVec   = w_SignalDigiDCHCol.createAndPut();
   edm4hep::MCRecoTrackerAssociationCollection* AssoVec   = w_AssociationCol.createAndPut();
   const edm4hep::SimTrackerHitCollection* SimHitCol =  r_SimDCHCol.get();
   if (SimHitCol->size() == 0) {
@@ -129,7 +140,7 @@ StatusCode DCHDigiAlg::execute()
       if(SimHit.getEDep() <= m_edep_threshold) continue;
 
       //Wire efficiency
-      double hitProb = fRandom.Uniform(1.);
+      float hitProb = fRandom.Uniform(1.);
       if(hitProb > m_wireEff) continue;
 
       if ( id_hits_map.find(id) != id_hits_map.end()) id_hits_map[id].push_back(SimHit);
@@ -144,18 +155,25 @@ StatusCode DCHDigiAlg::execute()
       m_n_sim = 0;
       m_n_digi = 0 ;
   }
+
+  std::vector<TVector2> HitPosition2D;
+  bool ismixNoise[55] = {0};
+  std::cout << " id_hits_map  size = " << id_hits_map.size() << std::endl;
+
   for(auto iter = id_hits_map.begin(); iter != id_hits_map.end(); iter++)
   {
       unsigned long long wcellid = iter->first;
       auto trkHit = Vec->create();
+      auto SignaltrkHit = SignalVec->create();
       trkHit.setCellID(wcellid);
-      double tot_edep   = 0 ;
-      double tot_length = 0 ;
-      double pos_x = 0 ;
-      double pos_y = 0 ;
-      double pos_z = 0 ;
-      double momx,momy = 0;
-      int simhit_size = iter->second.size();
+      SignaltrkHit.setCellID(wcellid);
+      float tot_edep   = 0 ;
+      float tot_length = 0 ;
+      float pos_x = 0 ;
+      float pos_y = 0 ;
+      float pos_z = 0 ;
+      float momx,momy,momz = 0;
+      const int simhit_size = iter->second.size();
       for(unsigned int i=0; i< simhit_size; i++)
       {
           tot_edep += iter->second.at(i).getEDep();//GeV
@@ -173,16 +191,18 @@ StatusCode DCHDigiAlg::execute()
       float min_distance = 999 ;
       float sim_distance = 999 ;
       float tmp_distance =0;
-      float SMdca = 0;
-      float distance =0;
       TVector3 hitPosition;
       TVector3 PCA;
       for(unsigned int i=0; i< simhit_size; i++)
       {
           float sim_hit_mom = sqrt( iter->second.at(i).getMomentum()[0]*iter->second.at(i).getMomentum()[0] + iter->second.at(i).getMomentum()[1]*iter->second.at(i).getMomentum()[1] + iter->second.at(i).getMomentum()[2]*iter->second.at(i).getMomentum()[2] );//GeV
-          float sim_hit_pt = sqrt( iter->second.at(i).getMomentum()[0]*iter->second.at(i).getMomentum()[0] + iter->second.at(i).getMomentum()[1]*iter->second.at(i).getMomentum()[1] );//GeV
+          if(sim_hit_mom<1e-4) continue;
+
           TVector3  pos(iter->second.at(i).getPosition()[0]*dd4hep_mm, iter->second.at(i).getPosition()[1]*dd4hep_mm, iter->second.at(i).getPosition()[2]*dd4hep_mm);
 
+          float simpos[3] = {iter->second.at(i).getPosition()[0],iter->second.at(i).getPosition()[1],iter->second.at(i).getPosition()[2]};
+          float simmom[3] = {iter->second.at(i).getMomentum()[0],iter->second.at(i).getMomentum()[1],iter->second.at(i).getMomentum()[2]};
+
           TVector3 sim_mon(iter->second.at(i).getMomentum()[0],iter->second.at(i).getMomentum()[1],iter->second.at(i).getMomentum()[2]);
           float Steplength = iter->second.at(i).getPathLength();
           TVector3  pos_start = pos - 0.5 * Steplength * sim_mon.Unit();
@@ -191,7 +211,6 @@ StatusCode DCHDigiAlg::execute()
           tmp_distance = tmp_distance/dd4hep_mm; //mm
           sim_distance = tmp_distance;
 
-
           if(tmp_distance < min_distance){
               min_distance = tmp_distance;
               pos_x = hitPosition.x();     //pos.x();
@@ -205,7 +224,6 @@ StatusCode DCHDigiAlg::execute()
           asso.setRec(trkHit);
           asso.setSim(iter->second.at(i));
           asso.setWeight(iter->second.at(i).getEDep()/tot_edep);
-          //std::cout<<" asso setRec setSim "<<trkHit<<" "<<iter->second.at(i)<<std::endl;
 
           if(m_WriteAna && (nullptr!=m_tuple)) {
               m_simhit_x[m_n_sim] = pos.x();
@@ -219,12 +237,26 @@ StatusCode DCHDigiAlg::execute()
           }
       }
 
+      //Smear drift distance
+      if(m_smear){
+          float dd = min_distance + gRandom->Gaus(0,fabs(m_res_x));
+          if(dd>=0) min_distance = dd;
+          else min_distance = -dd;
+      }
+
       trkHit.setTime(min_distance*1e3/m_velocity);//m_velocity is um/ns, drift time in ns
+      trkHit.setQuality(1);//1:singal   0:noise of overlap singal  -1:noise
       trkHit.setEDep(tot_edep);// GeV
-      //trkHit.setEdx (tot_edep/tot_length); // GeV/mm
       trkHit.setPosition (edm4hep::Vector3d(pos_x, pos_y, pos_z));//position of closest sim hit
       trkHit.setCovMatrix(std::array<float, 6>{m_res_x, 0, m_res_y, 0, 0, m_res_z});//cov(x,x) , cov(y,x) , cov(y,y) , cov(z,x) , cov(z,y) , cov(z,z) in mm
 
+      //add noise every layer
+      if(m_mixNoise && !ismixNoise[layer]) mixNoise(layer,cellID,Vec,&trkHit,ismixNoise);
+
+      SignaltrkHit.setEDep(tot_edep);// GeV
+      SignaltrkHit.setPosition (edm4hep::Vector3d(pos_x, pos_y, pos_z));//position of closest sim hit
+      SignaltrkHit.setCovMatrix(std::array<float, 6>{m_res_x, 0, m_res_y, 0, 0, m_res_z});//cov(x,x) , cov(y,x) , cov(y,y) , cov(z,x) , cov(z,y) , cov(z,z) in mm
+
       if(m_WriteAna && (nullptr!=m_tuple)) {
           m_chamber  [m_n_digi] = chamber;
           m_layer    [m_n_digi] = layer  ;
@@ -242,7 +274,6 @@ StatusCode DCHDigiAlg::execute()
           m_poca_x   [m_n_digi] = PCA.x();
           m_poca_y   [m_n_digi] = PCA.y();
           m_hit_dE   [m_n_digi] = trkHit.getEDep();
-          //m_hit_dE_dx[m_n_digi] = trkHit.getEdx() ;
           m_truthlength[m_n_digi] = tot_length ;
           m_n_digi ++ ;
       }
@@ -271,3 +302,72 @@ StatusCode DCHDigiAlg::finalize()
     info() << "Processed " << _nEvt << " events " << endmsg;
     return GaudiAlgorithm::finalize();
 }
+
+void DCHDigiAlg::mixNoise(int layerID ,int wireID,
+        edm4hep::TrackerHitCollection* Vec,
+        edm4hep::MutableTrackerHit* trackerHitLayer,
+        bool ismixNoise[55]){
+
+    int maxCellID = m_segmentation->maxWireID(0,layerID);
+    int nNoiseHits = (int) maxCellID*m_noiseEff;
+
+    //loop over noise hits in this layer
+    for(int ic=0;ic<nNoiseHits;ic++){
+        int cellid = (int) maxCellID*fRandom.Uniform(1.);
+        float time = m_timeWindow*fRandom.Uniform(1.);
+        TVector3 Wstart,Wend;
+        m_segmentation->cellposition2(0,layerID,cellid,Wstart,Wend);
+        //found noise overlap with signal
+        if(!(cellid != wireID))
+        {
+            if(time<trackerHitLayer->getTime()){
+                //1. overlap with signal and time > signal time
+                if(!m_mixNoiseAndSkipOverlap){
+                    //set time
+                    trackerHitLayer->setTime(time);
+                    trackerHitLayer->setQuality(0);
+
+                    m_noiseCover_layer[m_n_noiseCover] = layerID;
+                    m_noiseCover_cell[m_n_noiseCover] = cellid;
+
+                    m_n_noiseCover++;
+
+                    m_noise_layer[m_n_noise] = layerID;
+                    m_noise_cell[m_n_noise] = cellid;
+                    m_noise_time[m_n_noise] = time;
+
+                    m_n_noise++;
+                } // end fo m_mixNoiseAndSkipOverlap
+            }else{
+                //2. overlap with signal and time > signal time
+                // TODO adc sum with signal
+                continue;
+            }
+        }else{ // not found noise overlap with signal
+            //3. create a noise hit
+            //create another trackerHit
+            if(!m_mixNoiseAndSkipNoOverlap){
+                auto trkNoiseHit = Vec->create();
+
+                dd4hep::rec::CellID ncellid;
+                m_decoder->set(ncellid,"chamber",0);
+                m_decoder->set(ncellid,"layer",layerID);
+                m_decoder->set(ncellid,"cellID",cellid);
+
+                trkNoiseHit.setCellID(ncellid);
+                trkNoiseHit.setTime(time);
+                trkNoiseHit.setQuality(-1);
+
+                m_noise_layer[m_n_noise] = layerID;
+                m_noise_cell[m_n_noise] = cellid;
+                m_noise_time[m_n_noise] = time;
+
+                m_n_noise++;
+
+            }// end of m_mixNoiseAndSkipNoOverlap
+        } // end of if
+
+
+    }// loop over noise hit
+    ismixNoise[layerID] = true;
+}//end of mixNoise
diff --git a/Digitisers/DCHDigi/src/DCHDigiAlg.h b/Digitisers/DCHDigi/src/DCHDigiAlg.h
index 946363c1..a9bf59bd 100644
--- a/Digitisers/DCHDigi/src/DCHDigiAlg.h
+++ b/Digitisers/DCHDigi/src/DCHDigiAlg.h
@@ -18,6 +18,11 @@
 #include "TVector3.h"
 #include "TRandom3.h"
 
+namespace dd4hep {
+    namespace rec{
+        class CellIDPositionConverter;
+    }
+}
 class DCHDigiAlg : public GaudiAlgorithm
 {
  
@@ -44,6 +49,13 @@ protected:
   typedef std::vector<float> FloatVec;
   int _nEvt ;
 
+  void addNoiseHit(edm4hep::TrackerHitCollection* Vec,double time, int chamber,
+          int layer, int cellID,unsigned long long wcellid);
+  void mixNoise(int layerID,int wireID,
+          edm4hep::TrackerHitCollection* Vec,
+          edm4hep::MutableTrackerHit* trackerHitLayer,
+          bool ismixNoise[55]);
+
   TRandom3 fRandom;
 
   NTuple::Tuple* m_tuple = nullptr ;
@@ -80,14 +92,23 @@ protected:
   NTuple::Array<float> m_hit_dE_dx ;
   NTuple::Array<double> m_truthlength ;
 
+  //Noise hit in cellID
+  NTuple::Item<long>   m_n_noise;
+  NTuple::Array<int>  m_noise_layer;
+  NTuple::Array<int>  m_noise_cell;
+  NTuple::Array<float>  m_noise_time;
+  NTuple::Item<long>   m_n_noiseCover;
+  NTuple::Array<int>  m_noiseCover_layer;
+  NTuple::Array<int>  m_noiseCover_cell;
+
   clock_t m_start,m_end;
 
   dd4hep::rec::CellIDPositionConverter* m_cellIDConverter;
   dd4hep::DDSegmentation::GridDriftChamber* m_segmentation;
   dd4hep::DDSegmentation::BitFieldCoder* m_decoder;
-  
+
   Gaudi::Property<std::string> m_readout_name{ this, "readout", "DriftChamberHitsCollection"};//readout for getting segmentation
- 
+
   Gaudi::Property<float> m_res_x     { this, "res_x", 0.11};//mm
   Gaudi::Property<float> m_res_y     { this, "res_y", 0.11};//mm
   Gaudi::Property<float> m_res_z     { this, "res_z", 1   };//mm
@@ -99,11 +120,24 @@ protected:
   Gaudi::Property<bool>  m_debug{ this, "debug", false};
   Gaudi::Property<double>  m_wireEff{ this, "wireEff", 1.0};
 
+  //Smear drift distance
+  Gaudi::Property<bool>  m_smear{ this, "smear", false};
+
+  //Mixed Noise
+  Gaudi::Property<bool>  m_mixNoise{ this, "mixNoise", false};
+  Gaudi::Property<bool>  m_mixNoiseAndSkipOverlap{ this, "mixNoiseAndSkipOverlapthis", false};
+  Gaudi::Property<bool>  m_mixNoiseAndSkipNoOverlap{ this, "mixNoiseAndSkipNoOverlapthis", false};
+  Gaudi::Property<double>  m_noiseEff{ this, "noiseEff", 0.0};
+  Gaudi::Property<double>  m_timeWindow{ this, "timeWindow", 2000.0}; //ns
+  Gaudi::Property<int>  m_layerNum{ this, "layerNum", 55}; //ns
+
   // Input collections
   DataHandle<edm4hep::SimTrackerHitCollection> r_SimDCHCol{"DriftChamberHitsCollection", Gaudi::DataHandle::Reader, this};
   // Output collections
   DataHandle<edm4hep::TrackerHitCollection>    w_DigiDCHCol{"DigiDCHitCollection", Gaudi::DataHandle::Writer, this};
   DataHandle<edm4hep::MCRecoTrackerAssociationCollection>    w_AssociationCol{"DCHitAssociationCollection", Gaudi::DataHandle::Writer, this};
+  // Output signal digiHits
+  DataHandle<edm4hep::TrackerHitCollection>    w_SignalDigiDCHCol{"SignalDigiDCHitCollection", Gaudi::DataHandle::Writer, this};
 };
 
 #endif
diff --git a/Reconstruction/RecGenfitAlg/CMakeLists.txt b/Reconstruction/RecGenfitAlg/CMakeLists.txt
index f7c5b696..389cd34b 100644
--- a/Reconstruction/RecGenfitAlg/CMakeLists.txt
+++ b/Reconstruction/RecGenfitAlg/CMakeLists.txt
@@ -11,6 +11,7 @@ gaudi_add_module(RecGenfitAlg
                 src/LSFitting.cpp
                 src/WireMeasurementDC.cpp
                 src/PlanarMeasurementSDT.cpp
+                src/DCTrackFinding.cpp
         LINK GearSvc
              Gaudi::GaudiAlgLib
              Gaudi::GaudiKernel
@@ -22,8 +23,11 @@ gaudi_add_module(RecGenfitAlg
              DataHelperLib
              EDM4HEP::edm4hep
              EDM4HEP::edm4hepDict
-             GenFit::genfit2
              k4FWCore::k4FWCore
+             GenFit::genfit2
+             BelleIICKF::CKFDataobjects
+             BelleIICKF::CKFFramework
+             BelleIICKF::CKFTracking
 )
 
 target_include_directories(RecGenfitAlg PUBLIC
@@ -32,6 +36,8 @@ target_include_directories(RecGenfitAlg PUBLIC
         $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
 )
 
+set_target_properties(RecGenfitAlg PROPERTIES POSITION_INDEPENDENT_CODE ON)
+
 install(TARGETS RecGenfitAlg
             EXPORT CEPCSWTargets
             RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
diff --git a/Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp
new file mode 100644
index 00000000..fd28e135
--- /dev/null
+++ b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp
@@ -0,0 +1,668 @@
+#include<stdlib.h>
+#include "DCTrackFinding.h"
+
+//belle_CKF
+#include "ckf/CDCCKFPath.h"
+#include "eventdata/CDCWireHit.h"
+#include "ckf/CKFToCDCFindlet.h"
+#include "topology/CDCWireTopology.h"
+#include "CDCWireGeo.h"
+
+//genfit
+#include "AbsKalmanFitter.h"
+#include "KalmanFitterRefTrack.h"
+#include "EventDisplay.h"
+#include "ReferenceStateOnPlane.h"
+#include "AbsMeasurement.h"
+#include "AbsTrackRep.h"
+#include "FitStatus.h"
+#include "KalmanFitterInfo.h"
+#include "KalmanFittedStateOnPlane.h"
+#include "RKTrackRep.h"
+//#include "PlanarMeasurement.h"
+#include "PlanarMeasurementSDT.h"
+#include "SpacepointMeasurement.h"
+#include "StateOnPlane.h"
+#include "RectangularFinitePlane.h"
+#include "Track.h"
+#include "TrackPoint.h"
+#include "MeasuredStateOnPlane.h"
+#include "WireMeasurementNew.h"
+#include "AbsMeasurement.h"
+#include "TrackPoint.h"
+
+//cepcsw
+#include "DetInterface/IGeomSvc.h"
+#include "DataHelper/HelixClass.h"
+#include "DataHelper/TrackHelper.h"
+#include "DataHelper/TrackerHitHelper.h"
+#include "DetSegmentation/GridDriftChamber.h"
+#include "UTIL/ILDConf.h"
+
+//externals
+#include "edm4hep/EventHeaderCollection.h"
+#include "edm4hep/MCParticle.h"
+#include "edm4hep/MCParticleCollection.h"
+#include "edm4hep/SimTrackerHitCollection.h"
+#include "edm4hep/TrackerHitCollection.h"
+#include "edm4hep/TrackCollection.h"
+#include "edm4hep/MCRecoTrackerAssociationCollection.h"
+#include "edm4hep/ReconstructedParticle.h"
+#include "edm4hep/ReconstructedParticleCollection.h"
+#include "edm4hep/Track.h"
+#include "edm4hep/TrackCollection.h"
+#include "DD4hep/DD4hepUnits.h"
+#include "DD4hep/Detector.h"
+#include "UTIL/BitField64.h"
+#include "DDSegmentation/Segmentation.h"
+#include "TRandom.h"
+#include "TLorentzVector.h"
+
+//ROOT
+#include "TLorentzVector.h"
+#include "TMatrixDSym.h"
+#include "TRandom.h"
+#include "TVector3.h"
+
+//stl
+#include <chrono>
+#include "time.h"
+#include <stdlib.h>
+#include <thread>
+#include <iostream>
+#include <fstream>
+
+#include <TTimeStamp.h>
+
+#include <ctime>
+#include <cstdlib>
+
+#include <array>
+
+#include "map"
+#include "DataHelper/GeomeryHelper.h"
+
+DECLARE_COMPONENT( DCTrackFinding )
+
+    /////////////////////////////////////////////////////////////////////
+    DCTrackFinding::DCTrackFinding(const std::string& name,
+            ISvcLocator* pSvcLocator):GaudiAlgorithm(name, pSvcLocator),
+    m_dd4hepDetector(nullptr),m_gridDriftChamber(nullptr),m_decoder(nullptr)
+{
+
+    // Rec Si Track
+    declareProperty("SubsetTracks", m_siSubsetTrackCol,
+            "Handle of silicon subset track collection");
+    //DC DigiHit SimHit DCAsso
+    declareProperty("DigiDCHitCollection", m_DCDigiCol,
+            "Handle of DC digi(TrakerHit) collection");
+    declareProperty("SignalDigiDCHitCollection", m_SignalDCDigiCol,
+            "Handle of Signal DC digi(TrakerHit) collection");
+    declareProperty("DCHitAssociationCollection", m_DCHitAssociationCol,
+            "Handle of DCsimTrackerHit and DCTrackerHit association collection");
+    declareProperty("SimTrackerHitCollection",m_simDCHitCol,
+            "Handle of the DCsimTrackerHit collection");
+    //SIT SimTrackHit DCHitAssociation
+    declareProperty("SITCollection",m_simSITHitCol,
+            "Handle of the SITsimTrackerHit collection");
+    declareProperty("SITTrackerHitAssociation",m_SITHitAssociationCol,
+            "Handle of SITsimTrackerHit and SITTrackerHit association collection");
+    //VXD SimTrackHit DCHitAssociation
+    declareProperty("VXDCollection",m_simVXDHitCol,
+            "Handle of the VXDsimTrackerHit collection");
+    declareProperty("VXDTrackerHitAssociation", m_VXDHitAssociationCol,
+            "Handle of VXD association collection");
+    //FTD SimTrackHit DCHitAssociation
+    declareProperty("FTDCollection",m_simFTDHitCol,
+            "Handle of the FTDsimTrackerHit collection");
+    declareProperty("FTDTrackerHitAssociation",m_FTDHitAssociationCol,
+            "Handle of FTDsimTrackerHit and FTDTrackerHit association collection");
+    //SET SimTrackHit DCHitAssociation
+    declareProperty("SETCollection",m_simSETHitCol,
+            "Handle of the SETsimTrackerHit collection");
+    declareProperty("SETTrackerHitAssociation",m_SETHitAssociationCol,
+            "Handle of SETsimTrackerHit and SETTrackerHit association collection");
+
+    // Output collections
+    declareProperty("DCTrackFindingHitCollection",w_DCTrackFindingCol,
+            "Handle of TrackFinding DCHit collection");
+
+    //SDTTrackCollection
+    declareProperty("SDTTrackCollection", m_SDTTrackCol,
+            "Handle of input silicon track collection");
+    //SDTTrackFindCollection
+    declareProperty("SDTTrackFindCollection", m_SDTTrackFindCol,
+            "Handle of input silicon track finding collection");
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+StatusCode DCTrackFinding::initialize()
+{
+    MsgStream log(msgSvc(), name());
+    info()<<" DCTrackFinding initialize()"<<endmsg;
+
+    m_eventNo=0;
+
+    ///Get GeomSvc
+    m_geomSvc=Gaudi::svcLocator()->service("GeomSvc");
+    if (nullptr==m_geomSvc) {
+        std::cout<<"Failed to find GeomSvc"<<std::endl;
+        return StatusCode::FAILURE;
+    }
+    ///Get Detector
+    m_dd4hepDetector=m_geomSvc->lcdd();
+
+    ///Get Field
+    m_dd4hepField=m_geomSvc->lcdd()->field();
+
+    ///Get Readout
+    dd4hep::Readout readout=m_dd4hepDetector->readout(m_readout_name);
+    ///Get Segmentation
+    m_gridDriftChamber=dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*>
+        (readout.segmentation().segmentation());
+    if(nullptr==m_gridDriftChamber){
+        error() << "Failed to get the GridDriftChamber" << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    //set BelleII segmentation
+    Belle2::TrackFindingCDC::CDCWireTopology::getInstance(m_gridDriftChamber);
+    Belle2::CDCWireGeo::getInstance(m_gridDriftChamber);
+
+    ///Get Decoder
+    m_decoder = m_geomSvc->getDecoder(m_readout_name);
+    if (nullptr==m_decoder) {
+        error() << "Failed to get the decoder" << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    /// New a genfit fitter
+    //m_genfitFitter = new genfit::KalmanFitterRefTrack();
+    m_genfitFitter=new GenfitFitter(m_fitterType.toString().c_str()); 
+    m_genfitField=new GenfitField(m_dd4hepField);
+    m_genfitFitter->setField(m_genfitField);
+    m_genfitFitter->setGeoMaterial(m_geomSvc->lcdd(),m_extMinDistCut,
+            m_skipWireMaterial);
+    m_genfitFitter->setEnergyLossBrems(m_correctBremsstrahlung);
+    m_genfitFitter->setNoiseBrems(m_correctBremsstrahlung);
+    if(m_noMaterialEffects) m_genfitFitter->setNoEffects(true);
+    if(m_fitterType=="DAF"||m_fitterType=="DafRef"){
+        m_genfitFitter->setMaxIterationsBetas(m_bStart,m_bFinal,m_maxIteration);
+    } else {
+        m_genfitFitter->setMaxIterations(m_maxIteration);
+    }
+    //print genfit parameters
+    if(""!=m_genfitHistRootName) m_genfitFitter->initHist(m_genfitHistRootName);
+
+    ///book tuple
+    NTuplePtr nt(ntupleSvc(), "DCTrackFinding/dcTrackFinding");
+    if(nt){
+        m_tuple=nt;
+    }else{
+        m_tuple=ntupleSvc()->book("DCTrackFinding/dcTrackFinding",
+                CLID_ColumnWiseTuple,"DCTrackFinding");
+        if(m_tuple){
+            StatusCode sc;
+            sc=m_tuple->addItem("N_SiTrack",m_n_N_SiTrack,0,100);
+            sc=m_tuple->addItem("N_DCTrackFinding",m_n_N_SiTrack,m_n_DCTrackFinding);
+            sc=m_tuple->addItem("CPUTime",m_n_N_SiTrack,m_CPUTime);
+            sc=m_tuple->addItem("layer",m_n_N_SiTrack,m_layer,100);
+            sc=m_tuple->addItem("cellID",m_n_N_SiTrack,m_cellID,100);
+            sc=m_tuple->addItem("NoiseFlag",m_n_N_SiTrack,m_NoiseFlag,100);
+            sc=m_tuple->addItem("isNoOverlap",m_n_N_SiTrack,m_isNoOverlap);
+            sc=m_tuple->addItem("N_digiOverlap",m_n_N_SiTrack,m_digiOverlap);
+            sc=m_tuple->addItem("hit_wx",m_n_N_SiTrack,m_hit_wx,100);
+            sc=m_tuple->addItem("hit_wy",m_n_N_SiTrack,m_hit_wy,100);
+            sc=m_tuple->addItem("hit_wz",m_n_N_SiTrack,m_hit_wz,100);
+            sc=m_tuple->addItem("hit_ex",m_n_N_SiTrack,m_hit_ex,100);
+            sc=m_tuple->addItem("hit_ey",m_n_N_SiTrack,m_hit_ey,100);
+            sc=m_tuple->addItem("hit_ez",m_n_N_SiTrack,m_hit_ez,100);
+            sc=m_tuple->addItem("recoPosX",m_n_N_SiTrack,m_recoPosX,100);
+            sc=m_tuple->addItem("recoPosY",m_n_N_SiTrack,m_recoPosY,100);
+            sc=m_tuple->addItem("recoPosZ",m_n_N_SiTrack,m_recoPosZ,100);
+            sc=m_tuple->addItem("cellPosX",m_n_N_SiTrack,m_cellPosX,100);
+            sc=m_tuple->addItem("cellPosY",m_n_N_SiTrack,m_cellPosY,100);
+            sc=m_tuple->addItem("cellPosZ",m_n_N_SiTrack,m_cellPosZ,100);
+            sc=m_tuple->addItem("radius",m_n_N_SiTrack,m_radius,100);
+            sc=m_tuple->addItem("arcLength",m_n_N_SiTrack,m_arcLength,100);
+            sc=m_tuple->addItem("hitDistance",m_n_N_SiTrack,m_hitDistance,100);
+            sc=m_tuple->addItem("doca",m_n_N_SiTrack,m_doca,100);
+            sc=m_tuple->addItem("ReconstructedZ",m_n_N_SiTrack,m_ReconstructedZ,100);
+            sc=m_tuple->addItem("trackParD0",m_n_N_SiTrack,m_trackParD0,100);
+            sc=m_tuple->addItem("trackParPhi0",m_n_N_SiTrack,m_trackParPhi0,100);
+            sc=m_tuple->addItem("trackParOmega",m_n_N_SiTrack,m_trackParOmega,100);
+            sc=m_tuple->addItem("trackParZ0",m_n_N_SiTrack,m_trackParZ0,100);
+            sc=m_tuple->addItem("trackParTanLambda",m_n_N_SiTrack,m_trackParTanLambda,100);
+            sc=m_tuple->addItem("CircleCenterX",m_n_N_SiTrack,m_centerX,100);
+            sc=m_tuple->addItem("CircleCenterY",m_n_N_SiTrack,m_centerY,100);
+            sc=m_tuple->addItem("N_Digi",m_n_Digi,0,100000);
+            sc=m_tuple->addItem("N_SignalDigi",m_n_SignalDigi,0,100000);
+            sc=m_tuple->addItem("N_match",m_n_N_SiTrack,m_n_match);
+            sc=m_tuple->addItem("match_hit_wx",m_n_N_SiTrack,m_match_hit_wx,100);
+            sc=m_tuple->addItem("match_hit_wy",m_n_N_SiTrack,m_match_hit_wy,200);
+            sc=m_tuple->addItem("match_hit_wz",m_n_N_SiTrack,m_match_hit_wz,200);
+            sc=m_tuple->addItem("match_hit_ex",m_n_N_SiTrack,m_match_hit_ex,200);
+            sc=m_tuple->addItem("match_hit_ey",m_n_N_SiTrack,m_match_hit_ey,200);
+            sc=m_tuple->addItem("match_hit_ez",m_n_N_SiTrack,m_match_hit_ez,200);
+        }else{
+            warning()<<"Tuple DCTrackFinding/dcTrackFinding not booked"<<endmsg;
+        }
+    } //end of book tuple 
+
+    return StatusCode::SUCCESS;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+StatusCode DCTrackFinding::execute()
+{
+    info()<<"DCTrackFinding in execute()"<<endmsg;
+
+    StatusCode sc=StatusCode::SUCCESS;
+
+    edm4hep::TrackerHitCollection* TrF = w_DCTrackFindingCol.createAndPut();
+    
+    edm4hep::TrackCollection* sdtTkFCol= m_SDTTrackFindCol.createAndPut();
+
+    const edm4hep::TrackCollection* siTrackCol=nullptr;
+    siTrackCol=m_siSubsetTrackCol.get();
+    if(nullptr==siTrackCol){
+        debug()<<"SDTTrackCollection is empty"<<endmsg;
+        return StatusCode::SUCCESS;
+    }else{
+        debug()<<"SiSubsetTrackCol size "<<siTrackCol->size()<<endmsg;
+        if(0==siTrackCol->size()){
+            return StatusCode::SUCCESS;
+        }
+    }
+
+    //DC
+    auto assoDCHitsCol=m_DCHitAssociationCol.get();
+    const edm4hep::TrackerHitCollection* dCDigiCol=nullptr;
+    dCDigiCol=m_DCDigiCol.get();
+
+    // Signal DC hit
+    const edm4hep::TrackerHitCollection* SignaldCDigiCol=m_SignalDCDigiCol.get();
+    int truthNumdc = SignaldCDigiCol->size();
+    m_n_SignalDigi = truthNumdc;
+   //VXDAssoHits
+    const edm4hep::MCRecoTrackerAssociationCollection* VXDAssoVec = m_VXDHitAssociationCol.get();
+    //SIT
+    auto assoSITHitsCol=m_SITHitAssociationCol.get();
+    const edm4hep::SimTrackerHitCollection* simSITHitCol=nullptr;
+    simSITHitCol=m_simSITHitCol.get();
+
+    //FTD
+    auto assoFTDHitsCol=m_FTDHitAssociationCol.get();
+    const edm4hep::SimTrackerHitCollection* simFTDHitCol=nullptr;
+    simFTDHitCol=m_simFTDHitCol.get();
+
+    //SDTtrackCollection
+    const edm4hep::TrackCollection* sdtTrackCol=nullptr;
+    if(m_SDTTrackCol.exist())sdtTrackCol=m_SDTTrackCol.get(); 
+    if(nullptr==sdtTrackCol || sdtTrackCol->size()<=0) {
+        std::cout<<"TrackCollection not found or sdtTrackCol size=0"<<std::endl;
+        return StatusCode::SUCCESS;
+    }
+
+    std::vector<std::vector<int>> truthDChit;
+    for(auto trudchit: *SignaldCDigiCol){
+        unsigned short iLayer=0;
+        unsigned short iWire=0;
+
+        unsigned long long dccellID=trudchit.getCellID();
+        iLayer = m_decoder->get(dccellID,"layer");
+        iWire = m_decoder->get(dccellID,"cellID");
+
+        std::vector<int> mid;
+        mid.push_back(iLayer);
+        mid.push_back(iWire);
+
+        truthDChit.push_back(mid);
+
+        mid.clear();
+
+    }
+
+    int siNum = 0;
+    for(auto sdtTk:*sdtTrackCol){
+
+        edm4hep::MutableTrack sdtTFk=sdtTkFCol->create();
+
+        edm4hep::TrackState trackStat=sdtTk.getTrackStates(0);
+        edm4hep::TrackerHit trackHit = sdtTk.getTrackerHits(0);
+        edm4hep::MCParticle mcParticle;
+        edm4hep::SimTrackerHit simTrackerHit;
+        CEPC::getAssoMCParticle(VXDAssoVec,trackHit,mcParticle,simTrackerHit);
+        TVector3 seedPos,seedMom;
+        TMatrixDSym seedCov;
+        double charge_double;
+        TVectorD seedState(6);
+        TMatrixDSym covMInit_6(6);
+        GenfitTrack::getTrackFromEDMTrackFinding(sdtTk,charge_double,seedState,covMInit_6,
+                seedPos,seedMom);
+
+        int charge = (int) charge_double;
+        int pdg = mcParticle.getPDG();
+
+        Belle2::RecoTrack *newRecoTrack = new Belle2::RecoTrack(seedPos,seedMom,charge);
+        Belle2::RecoTrackGenfitAccess *recoTrackGenfitAccess = new Belle2::RecoTrackGenfitAccess();
+        genfit::AbsTrackRep* RecoRep = recoTrackGenfitAccess->createOrReturnRKTrackRep(*newRecoTrack,pdg);
+
+        genfit::AbsTrackRep* rep;
+        rep = new genfit::RKTrackRep(pdg);
+        genfit::MeasuredStateOnPlane state(rep);
+        rep->setPosMom(state, seedPos, seedMom);
+
+        const TVector3 linePoint(0,0,0);
+        const TVector3 lineDirection(0,0,1);
+        const double R = 80.5;//cm
+
+        try { 
+            double L = rep->extrapolateToCylinder(state, R, linePoint, lineDirection, false);
+        }
+        catch (genfit::Exception& e) {
+            std::cerr << e.what();
+        }
+
+        std::vector<Belle2::TrackFindingCDC::CDCWireHit> bestElement2;
+
+        if(m_tuple) m_n_Digi = dCDigiCol->size();
+
+        // DC digi hit find MCParticle
+        int ndigi =0;
+        int detID = 7;
+        std::map < std::vector<int> , unsigned long long > findCellID;
+        edm4hep::TrackerHit digihits[66][1000];
+        for(auto dcDigi: *dCDigiCol){
+
+            if(0==dcDigi.getQuality()) m_digiOverlap[siNum]++;
+            TVectorD hitpos(3);
+            TMatrixDSym hitCov(3);
+
+            hitpos[0]=dcDigi.getPosition()[0];
+            hitpos[1]=dcDigi.getPosition()[1];
+            hitpos[2]=dcDigi.getPosition()[2];
+
+            hitCov(0,0)=dcDigi.getCovMatrix().at(0);
+            hitCov(1,1)=dcDigi.getCovMatrix().at(2);
+            hitCov(2,2)=dcDigi.getCovMatrix().at(5);
+
+            unsigned short tdcCount = dcDigi.getTime();
+            unsigned short adcCount = 0;
+            unsigned short iSuperLayer=0;
+
+            unsigned short iLayer=0;
+            unsigned short iWire=0;
+
+            genfit::TrackPoint* trackPoint =nullptr;
+            bool insertPoint =false;
+            unsigned long long dccellID=dcDigi.getCellID();
+            iLayer = m_decoder->get(dccellID,"layer");
+            iWire = m_decoder->get(dccellID,"cellID");
+
+            digihits[iLayer][iWire] = dcDigi;
+
+            std::vector<int> id;
+            id.push_back(iLayer);
+            id.push_back(iWire);
+
+            findCellID.insert(std::pair< std::vector<int> , int>(id,dccellID));
+
+            id.clear();
+
+            double driftDistance = 1e-4*m_driftVelocity*dcDigi.getTime(); //cm
+
+            TVector3 Wstart(0,0,0);
+            TVector3 Wend  (0,0,0);
+            m_gridDriftChamber->cellposition(dcDigi.getCellID(), Wstart, Wend);
+
+            if(1==dcDigi.getQuality()){
+                double hitphi = atan(hitpos[1]/hitpos[0]);
+                double wirephi = atan(Wstart.Y()/Wstart.X());
+            }
+
+            ndigi++;
+
+            Belle2::CDCHit * cdchit = new Belle2::CDCHit(tdcCount,adcCount,
+                    iSuperLayer,iLayer,iWire);
+
+            Belle2::TrackFindingCDC::CDCWireHit cdcWireHit(cdchit,
+                driftDistance,m_sigma,0,dcDigi.getTime());
+
+            bestElement2.push_back(cdcWireHit);
+        }
+        if(ndigi<1e-5) return StatusCode::SUCCESS;
+
+        Belle2::CKFToCDCFindlet::clearSeedRecoTrack();
+        Belle2::CKFToCDCFindlet::addSeedRecoTrack(newRecoTrack);
+
+        Belle2::CKFToCDCFindlet m_CKFToCDC;
+        std::vector< std::vector<unsigned short> > output;
+        std::vector<double> radius;
+        std::vector<double> arcLength;
+        std::vector<double> hitDistance;
+        std::vector<double> doca;
+        std::vector<double> reconstructedZ;
+        std::vector<TVector3> recoPos;
+        std::vector<std::vector<double>> trackParams;
+        std::vector<std::vector<double>> circleCenter;
+        m_CKFToCDC.beginEvent();
+        m_CKFToCDC.addMeasuredStateOnPlane(state);
+        m_CKFToCDC.setpathSelectFilterName(m_pathSelectFilterName);
+        m_CKFToCDC.setMaximalLayerJump(m_maximalLayerJump);
+
+
+        auto start = std::chrono::high_resolution_clock::now();
+        m_CKFToCDC.apply(bestElement2);
+
+        auto finish = std::chrono::high_resolution_clock::now();
+        std::chrono::duration<double> elapsed = finish - start;
+
+        m_CPUTime[siNum] = elapsed.count();
+
+        m_CKFToCDC.getResult(output,trackParams,
+                radius,circleCenter,arcLength,hitDistance,doca,
+                reconstructedZ,recoPos);
+        m_n_DCTrackFinding[siNum] = output.size();
+
+        for(int i=0;i<radius.size();i++) m_radius[siNum][i] = radius[i];
+        for(int i=0;i<arcLength.size();i++) m_arcLength[siNum][i] = arcLength[i];
+        for(int i=0;i<hitDistance.size();i++) m_hitDistance[siNum][i] = hitDistance[i];
+        for(int i=0;i<doca.size();i++) m_doca[siNum][i] = doca[i];
+        for(int i=0;i<reconstructedZ.size();i++) m_ReconstructedZ[siNum][i] = reconstructedZ[i];
+
+        for(int i=0;i<recoPos.size();i++){
+            m_recoPosX[siNum][i] = recoPos[i].X();
+            m_recoPosY[siNum][i] = recoPos[i].Y();
+            m_recoPosZ[siNum][i] = recoPos[i].Z();
+        }
+
+        for(int i=0;i<trackParams.size();i++){
+            m_trackParD0[siNum][i] = trackParams[i][0];
+            m_trackParPhi0[siNum][i] = trackParams[i][1];
+            m_trackParOmega[siNum][i] = trackParams[i][2];
+            m_trackParZ0[siNum][i] = trackParams[i][3];
+            m_trackParTanLambda[siNum][i] = trackParams[i][4];
+        }
+        for(int i=0;i<circleCenter.size();i++){
+            m_centerX[siNum][i] = circleCenter[i][0];
+            m_centerY[siNum][i] = circleCenter[i][1];
+        }
+
+        int num_match =0;
+        //add sdtTk To sdtTFk
+        sdtTFk.addToTrackStates(sdtTk.getTrackStates(0));
+        for(int i=0;i<sdtTk.trackerHits_size();i++){
+            sdtTFk.addToTrackerHits(sdtTk.getTrackerHits(i));
+        }
+
+        for(int i = 0;i<output.size();i++)
+        {
+            auto trkHit = TrF->create();
+            edm4hep::TrackerHit digihit = digihits[output[i].at(0)][output[i].at(1)];
+
+            TVector3 Wstart(0,0,0);
+            TVector3 Wend  (0,0,0);
+            m_gridDriftChamber->cellposition(digihit.getCellID(), Wstart, Wend);
+
+            TVector3 cellPos =  m_gridDriftChamber->wirePos_vs_z2(output[i].at(0),output[i].at(1),
+                    reconstructedZ[i]);
+
+            m_cellPosX[siNum][i] = cellPos.X();
+            m_cellPosY[siNum][i] = cellPos.Y();
+            m_cellPosZ[siNum][i] = cellPos.Z();
+
+            m_layer[siNum][i] = output[i].at(0);
+            m_cellID[siNum][i] = output[i].at(1);
+            m_NoiseFlag[siNum][i] = digihit.getQuality();
+
+            //match hit with truth hits
+            for(int j=0;j<truthDChit.size();j++){
+                if((output[i].at(0) == truthDChit[j].at(0)) && 
+                        (output[i].at(1) == truthDChit[j].at(1))){
+
+                    m_match_hit_wx[siNum][num_match] = Wstart.X();
+                    m_match_hit_wy[siNum][num_match] = Wstart.Y();
+                    m_match_hit_wz[siNum][num_match] = Wstart.Z();
+
+                    m_match_hit_ex[siNum][num_match] = Wend.X();
+                    m_match_hit_ey[siNum][num_match] = Wend.Y();
+                    m_match_hit_ez[siNum][num_match] = Wend.Z();
+                    if(1==digihit.getQuality())m_isNoOverlap[siNum]++;
+
+                    num_match++;
+                }
+            }
+
+            m_hit_wx[siNum][i] = Wstart.X();
+            m_hit_wy[siNum][i] = Wstart.Y();
+            m_hit_wz[siNum][i] = Wstart.Z();
+
+            m_hit_ex[siNum][i] = Wend.X();
+            m_hit_ey[siNum][i] = Wend.Y();
+            m_hit_ez[siNum][i] = Wend.Z();
+
+            trkHit.setCellID(digihit.getCellID());
+            trkHit.setQuality(digihit.getQuality());
+            trkHit.setTime(digihit.getTime());
+            trkHit.setEDep(digihit.getEDep());
+            trkHit.setPosition(digihit.getPosition());
+            trkHit.setCovMatrix(digihit.getCovMatrix());
+
+            sdtTFk.addToTrackerHits(trkHit);
+        }
+
+        m_n_match[siNum] = num_match;
+
+        delete newRecoTrack;
+        delete recoTrackGenfitAccess;
+
+        for(auto& it : bestElement2){
+            delete it.getHit();
+        }
+        bestElement2.clear();
+        siNum++;
+    }
+
+    m_n_N_SiTrack = siNum;
+    if(m_tuple) sc=m_tuple->write();
+
+    m_eventNo++;
+
+    return StatusCode::SUCCESS;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+StatusCode DCTrackFinding::finalize()
+{
+    MsgStream log(msgSvc(), name());
+    info()<< " DCTrackFinding in finalize()" << endmsg;
+    delete m_genfitFitter;
+
+    std::cout << " End of DCTrackFinding .... " << std::endl;
+    return StatusCode::SUCCESS;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+int DCTrackFinding::getNumPointsWithFittedInfo(genfit::Track genfitTrack,
+        int repID) const 
+{
+    int nHitWithFittedInfo = 0;
+    //check number of hit with fitter info
+    int nHit = genfitTrack.getNumPointsWithMeasurement();
+    //check number of hit with fitter info
+    for(int i=0; i<nHit; i++){
+        if(nullptr != genfitTrack.getPointWithFitterInfo(i,genfitTrack.getTrackRep(repID))){
+            nHitWithFittedInfo++;
+        }
+    }
+    return nHitWithFittedInfo;
+}
+
+int DCTrackFinding::getFittedState(genfit::Track genfitTrack,
+        TLorentzVector& pos, TVector3& mom,
+        TMatrixDSym& cov, int trackPointId, int repID, bool biased) const
+{
+    //check number of hit with fitter info
+    if(getNumPointsWithFittedInfo(genfitTrack,repID)<=2) return 1;
+
+    //get track rep
+    genfit::AbsTrackRep* rep = genfitTrack.getTrackRep(repID);
+    if(nullptr == rep) return 2;
+
+    //get first or last measured state on plane
+    genfit::MeasuredStateOnPlane mop;
+    try{
+        mop = genfitTrack.getFittedState(trackPointId,rep,biased);
+    }catch(genfit::Exception& e){
+        std::cout<<" getNumPointsWithFittedInfo="
+            <<getNumPointsWithFittedInfo(genfitTrack,repID)
+            <<" no TrackPoint with fitted info "<<std::endl;
+        return 3;
+    }
+
+    //get state
+    TVector3 p;
+    mop.getPosMomCov(p,mom,cov);
+    pos.SetVect(p);
+    pos.SetT(9999);//FIXME
+
+    return 0;//success
+}
+
+bool DCTrackFinding::getMOP(int hitID,genfit::MeasuredStateOnPlane& mop,
+        genfit::AbsTrackRep* trackRep,genfit::Track* track) const
+{
+    if(nullptr == trackRep) trackRep = getRep(0,track);
+    try{
+        mop = track->getFittedState(hitID,trackRep);
+    }catch(genfit::Exception& e){
+        e.what();
+        return false;
+    }
+    return true;
+}
+
+genfit::AbsTrackRep* DCTrackFinding::getRep(int id,genfit::Track* track) const
+{
+    return track->getTrackRep(id);
+}
+
+int DCTrackFinding::addHitsToTk(edm4hep::TrackerHitCollection *
+col, edm4hep::Track& track, const char* msg) const
+{
+    int nHit=0;
+    debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg;
+    //sort,FIXME
+    edm4hep::MutableTrack sdtTrack = track.clone();
+    for(auto hit:*col){
+        sdtTrack.addToTrackerHits(hit);
+        ++nHit;
+    }
+    track = sdtTrack;
+    return nHit;
+}
diff --git a/Reconstruction/RecGenfitAlg/src/DCTrackFinding.h b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.h
new file mode 100644
index 00000000..d90c71dd
--- /dev/null
+++ b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.h
@@ -0,0 +1,213 @@
+//////////////////////////////////////////////////////////////////////
+///
+/// This is an algorithm for track fitting for CEPC track with genfit.
+///
+/// In this file, including:
+///   An algorithm for combined silicon and drift chamber track fitting
+///   with genfit for 5 particle hypothesis
+///
+///   Units are following DD4hepUnits
+///
+/// Authors:
+///   Mengyao Liu(myliu@ihep.ac.cn)
+///
+/////////////////////////////////////////////////////////////////////
+
+#ifndef RECGENFITALG_DCTRACKFINDING_H
+#define RECGENFITALG_DCTRACKFINDING_H
+
+#include "GaudiAlg/GaudiAlgorithm.h"
+#include "GaudiKernel/NTuple.h"
+#include "k4FWCore/DataHandle.h"
+#include "DD4hep/Fields.h"
+#include <string>
+#include <vector>
+#include "AbsKalmanFitter.h"
+
+#include "DataHelper/GeomeryHelper.h"
+
+#include "GenfitTrack.h"
+#include "GenfitFitter.h"
+#include "GenfitField.h"
+#include "GenfitUnit.h"
+
+
+//ROOT
+#include "TVector3.h"
+#include "TVectorD.h"
+#include "TMatrixDSym.h"
+#include "TLorentzVector.h"
+
+class GenfitTrack;
+class GenfitFitter;
+class GenfitField;
+class IGeomSvc;
+
+namespace dd4hep {
+    class Detector;
+    namespace DDSegmentation{
+        class GridDriftChamber;
+        class BitFieldCoder;
+    }
+}
+namespace edm4hep{
+    class EventHeaderCollection;
+    class MCParticleCollection;
+    class SimTrackerHitCollection;
+    class TrackCollection;
+    class TrackerHitCollection;
+    class MCRecoTrackerAssociationCollection;
+    class ReconstructedParticle;
+    class ReconstructedParticleCollection;
+    class TrackerHit;
+    class Track;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+class DCTrackFinding:public GaudiAlgorithm {
+    public:
+        DCTrackFinding (const std::string& name,ISvcLocator* pSvcLocator);
+        StatusCode initialize() override; StatusCode execute() override; StatusCode finalize() override;
+
+    private:
+        GeomeryWire* geomery_wire;
+        GenfitFitter* m_genfitFitter;
+        const GenfitField* m_genfitField;
+        SmartIF<IGeomSvc> m_geomSvc;
+        dd4hep::OverlayedField m_dd4hepField;
+        dd4hep::Detector* m_dd4hepDetector;
+        
+        dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber;
+        dd4hep::DDSegmentation::BitFieldCoder* m_decoder;
+
+        Gaudi::Property<std::string> m_pathSelectFilterName{this,"pathSelectFilterName","distance"};
+        Gaudi::Property<int> m_maximalLayerJump{this,"MaximalLayerJump",1};
+
+        Gaudi::Property<double> m_extMinDistCut{this,"extMinDistCut",1e-4};
+        Gaudi::Property<bool> m_skipWireMaterial{this,
+            "skipWireMaterial",false};
+        Gaudi::Property<bool> m_correctBremsstrahlung{this,
+            "correctBremsstrahlung",true};
+        Gaudi::Property<std::string> m_fitterType{this,"fitterType","DAF"};
+        Gaudi::Property<bool> m_noMaterialEffects{this,
+            "noMaterialEffects",false};
+        Gaudi::Property<int> m_debugPid{this,"debugPid",-99};
+        Gaudi::Property<double> m_bStart{this,"bStart",100};
+        Gaudi::Property<double> m_bFinal{this,"bFinal",0.01};
+        Gaudi::Property<int> m_maxIteration{this,"maxIteration",20};
+        Gaudi::Property<std::string> m_genfitHistRootName{this,
+            "genfitHistRootName",""};
+        Gaudi::Property<double> m_driftVelocity{this,"driftVelocity",40};//um/ns
+        Gaudi::Property<bool> m_Smear{this,"Smear",false};
+        Gaudi::Property<float> m_resX{this,"resX",0.11};//mm
+        Gaudi::Property<double> m_Noiseff{this,"Noiseff",0.5};//um/ns
+        Gaudi::Property<double> m_sigma{this,"sigmaL",0.011};//0.011cm=110um
+        Gaudi::Property<std::string> m_readout_name{this,
+            "readout", "DriftChamberHitsCollection"};
+
+        // Rec Si Track
+        DataHandle<edm4hep::TrackCollection> m_siSubsetTrackCol{
+            "SubsetTracks" , Gaudi::DataHandle::Reader, this};
+        //DC DigiHit SimTrackHit DCHitAssociation
+        DataHandle<edm4hep::TrackerHitCollection> m_DCDigiCol{
+            "DigiDCHitCollection", Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::TrackerHitCollection> m_SignalDCDigiCol{
+            "SignalDigiDCHitCollection", Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::SimTrackerHitCollection> m_simDCHitCol{
+            "DriftChamberHitsCollection" , Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_DCHitAssociationCol{"DCHitAssociationCollection",
+                Gaudi::DataHandle::Reader, this};
+        //SIT SimTrackHit DCHitAssociation 
+        DataHandle<edm4hep::SimTrackerHitCollection> m_simSITHitCol{
+            "SITCollection", Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_SITHitAssociationCol{"SITTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
+        //VXD SimTrackHit DCHitAssociation 
+        DataHandle<edm4hep::SimTrackerHitCollection> m_simVXDHitCol{
+            "VXDCollection", Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_VXDHitAssociationCol{"VXDTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
+        //FTD SimTrackHit DCHitAssociation 
+        DataHandle<edm4hep::SimTrackerHitCollection> m_simFTDHitCol{
+            "FTDCollection", Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_FTDHitAssociationCol{"FTDTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
+        //SET SimTrackHit DCHitAssociation 
+        DataHandle<edm4hep::SimTrackerHitCollection> m_simSETHitCol{
+            "SETCollection", Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_SETHitAssociationCol{"SETTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
+
+        DataHandle<edm4hep::TrackCollection> m_SDTTrackCol{"SDTTrackCollection",
+            Gaudi::DataHandle::Reader, this};
+
+        DataHandle<edm4hep::TrackCollection> m_SDTTrackFindCol{"SDTTrackFindCollection",
+            Gaudi::DataHandle::Writer, this};
+
+        // Output collections
+        DataHandle<edm4hep::TrackerHitCollection>    w_DCTrackFindingCol{
+            "DCTrackFindingHitCollection", Gaudi::DataHandle::Writer, this};
+
+        int getNumPointsWithFittedInfo(genfit::Track genfitTrack,int repID) const;
+        int getFittedState(genfit::Track genfitTrack, 
+                TLorentzVector& pos, TVector3& mom, TMatrixDSym& cov,
+                int trackPointId=0, int repID=0, bool biased=true) const;
+        genfit::AbsTrackRep* getRep(int id,genfit::Track* track) const;
+        bool getMOP(int hitID, genfit::MeasuredStateOnPlane& mop,
+                genfit::AbsTrackRep* trackRep,genfit::Track* track) const;
+
+        int addHitsToTk(edm4hep::TrackerHitCollection* col, edm4hep::Track& track, const char* msg) const;
+        int m_eventNo;
+
+        /// tuples
+        NTuple::Tuple*  m_tuple;
+        NTuple::Item<int> m_n_N_SiTrack;
+        NTuple::Array<int> m_n_DCTrackFinding;
+        NTuple::Array<float> m_CPUTime;
+        NTuple::Item<int> m_n_Digi;
+        NTuple::Item<int> m_n_SignalDigi;
+        NTuple::Array<int> m_n_match;
+        NTuple::Matrix<int> m_layer;
+        NTuple::Matrix<int> m_cellID;
+        NTuple::Matrix<int> m_NoiseFlag;
+        NTuple::Array<int> m_isNoOverlap;
+        NTuple::Array<int> m_digiOverlap;
+        NTuple::Matrix<double> m_hit_wx;
+        NTuple::Matrix<double> m_hit_wy;
+        NTuple::Matrix<double> m_hit_wz;
+        NTuple::Matrix<double> m_hit_ex;
+        NTuple::Matrix<double> m_hit_ey;
+        NTuple::Matrix<double> m_hit_ez;
+        NTuple::Matrix<double> m_recoPosX;
+        NTuple::Matrix<double> m_recoPosY;
+        NTuple::Matrix<double> m_recoPosZ;
+        NTuple::Matrix<double> m_cellPosX;
+        NTuple::Matrix<double> m_cellPosY;
+        NTuple::Matrix<double> m_cellPosZ;
+        NTuple::Matrix<double> m_match_hit_wx;
+        NTuple::Matrix<double> m_match_hit_wy;
+        NTuple::Matrix<double> m_match_hit_wz;
+        NTuple::Matrix<double> m_match_hit_ex;
+        NTuple::Matrix<double> m_match_hit_ey;
+        NTuple::Matrix<double> m_match_hit_ez;
+        NTuple::Matrix<double> m_radius;
+        NTuple::Matrix<double> m_arcLength;
+        NTuple::Matrix<double> m_hitDistance;
+        NTuple::Matrix<double> m_doca;
+        NTuple::Matrix<double> m_ReconstructedZ;
+        NTuple::Matrix<double> m_trackParD0;
+        NTuple::Matrix<double> m_trackParPhi0;
+        NTuple::Matrix<double> m_trackParOmega;
+        NTuple::Matrix<double> m_trackParZ0;
+        NTuple::Matrix<double> m_trackParTanLambda;
+        NTuple::Matrix<double> m_centerX;
+        NTuple::Matrix<double> m_centerY;
+
+};
+#endif
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp b/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp
index 501b5af3..062b37d2 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp
+++ b/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp
@@ -191,6 +191,28 @@ int GenfitFitter::processTrack(GenfitTrack* track, bool resort)
     return true;
 } // End of ProcessTrack
 
+/// Fit a genfit::track from a candidate track
+int GenfitFitter::processTrack(genfit::Track* track, bool resort)
+{
+    if(m_debug>=2)std::cout<<"In ProcessTrack"<<std::endl;
+    if(track->getNumPoints()<=0){
+        if(m_debug>=2)std::cout<<"skip track w.o. hit"<<std::endl;
+        return false;
+    }
+    if(getDebug()>2) print("");
+
+    /// Do the fitting
+    try{
+        m_absKalman->processTrack(track,resort);
+    }catch(genfit::Exception& e){
+        if(m_debug>=2)std::cout<<"Genfit exception caught "<<std::endl;
+        e.what();
+        return false;
+    }
+    if(m_debug>=2)std::cout<<"End of ProcessTrack"<<std::endl;
+    return true;
+} // End of Process genfit::Track
+
 
 void GenfitFitter::setFitterType(const char* val)
 {
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitFitter.h b/Reconstruction/RecGenfitAlg/src/GenfitFitter.h
index 7b3363e6..dc8590a0 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitFitter.h
+++ b/Reconstruction/RecGenfitAlg/src/GenfitFitter.h
@@ -31,6 +31,7 @@ namespace genfit{
     class KalmanFitterRefTrack;
     class DAF;
     class MaterialEffects;
+    class Track;
 }
 namespace dd4hep{
     class OverlayedField;
@@ -54,6 +55,7 @@ class GenfitFitter{
 
         /// Main fitting function
         int processTrack(GenfitTrack* track, bool resort=true);
+        int processTrack(genfit::Track* track, bool resort=true);
 
         /// fitting with rep
         int processTrackWithRep(GenfitTrack* track,int repID=0,
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp b/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp
index 85af21fe..f3c6f26c 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp
+++ b/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp
@@ -26,8 +26,7 @@ GenfitHit::GenfitHit(const edm4hep::TrackerHit* trackerHit,
     m_driftDistanceErr=driftDistanceErr*GenfitUnit::cm;
     //driftVelocity um/ns
     m_driftDistanceTruth=m_trackerHit->getTime()*driftVelocity*GenfitUnit::um;
-    m_driftDistance=m_driftDistanceTruth*GenfitUnit::cm;
-//    if(driftDistanceErr>0) m_driftDistance+=gRandom->Gaus(0,fabs(driftDistanceErr*GenfitUnit::cm));//FIXME
+    m_driftDistance=fabs(m_driftDistanceTruth*GenfitUnit::cm);
 }
 
 unsigned long long GenfitHit::getCellID() const {
@@ -50,7 +49,6 @@ int GenfitHit::getLeftRightAmbig() const {
     TVector3 pocaOnWire=
         m_gridDriftChamber->wirePos_vs_z(getCellID(),pocaOnTrack.Z());
     TVector3 pocaDir=(pocaOnWire-pocaOnTrack).Unit();
-    //TVector3 a=pocaDir.Cross(trackDir);
     int lrAmbig=(pocaDir.Cross(trackDir))*wireDir;
     return fabs(lrAmbig)/lrAmbig;
 }
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp
index 19bb23c7..8b58400b 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp
+++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp
@@ -27,6 +27,7 @@
 #include "edm4hep/TrackerHit.h"
 #include "edm4hep/TrackerHitCollection.h"
 #include "edm4hep/MCParticle.h"
+#include "edm4hep/MCParticleCollection.h"
 #include "edm4hep/MCRecoTrackerAssociationCollection.h"
 #include "edm4hep/Vector3d.h"
 #include "GaudiKernel/SmartIF.h"
@@ -72,6 +73,7 @@ sortDCSimHit(edm4hep::SimTrackerHit hit1,edm4hep::SimTrackerHit hit2)
     bool isEarly=hit1.getTime()<hit2.getTime();
     return isEarly;
 }
+
     bool
 sortDCDigi(std::pair<double,edm4hep::TrackerHit*> hitPair1,std::pair<double,edm4hep::TrackerHit*> hitPair2)
 {
@@ -79,6 +81,13 @@ sortDCDigi(std::pair<double,edm4hep::TrackerHit*> hitPair1,std::pair<double,edm4
     return isEarly;
 }
 
+bool
+sortDCWireMeasurement(std::pair<int,WireMeasurementDC*> hitPair1,std::pair<int,WireMeasurementDC*> hitPair2)
+{
+    bool isEarly=hitPair1.first<hitPair2.first;
+    return isEarly;
+}
+
 GenfitTrack::GenfitTrack(const GenfitField* genfitField,
         const dd4hep::DDSegmentation::GridDriftChamber* seg,
         SmartIF<IGeomSvc> geom, const char* name)
@@ -133,6 +142,18 @@ bool GenfitTrack::createGenfitTrack(int pdgType,int charge,
     return true;
 }
 
+void GenfitTrack::getSeedStateCov(TVectorD& seedState, TMatrixDSym& covSeed)
+{
+    seedState = m_track->getStateSeed();
+    covSeed.Zero();
+    for(int i=0;i<3;i++) {
+        double posResolusion=1.;
+        covSeed(i,i)=posResolusion*posResolusion; //seed position
+        double momResolusion=5.;
+        covSeed(i+3,i+3)=momResolusion*momResolusion; //seed momentum
+    }
+}
+
 ///Create a Genfit track with MCParticle, unit conversion here
 bool GenfitTrack::createGenfitTrackFromMCParticle(int pidType,
         const edm4hep::MCParticle& mcParticle, double eventStartTime)
@@ -262,8 +283,8 @@ GenfitTrack::getISurface(edm4hep::TrackerHit* hit){
 
 /// Add a 1d strip or 2d pixel smeared by sigma
     bool
-GenfitTrack::addSiliconMeasurement(edm4hep::TrackerHit* hit,
-        float sigmaU,float sigmaV,int cellID,int hitID)
+GenfitTrack::addSiliconMeasurement(edm4hep::TrackerHit* hit,TVector3 pos,
+        TVector3 mom,float sigmaU,float sigmaV,int cellID,int hitID)
 {
     if(m_debug>0) std::cout<<"addSiliconMeasurement "<<*hit<<std::endl;
 
@@ -326,6 +347,14 @@ int GenfitTrack::addSiliconMeasurements(edm4hep::Track& track,
 {
     ///Get TrackerHit on Track
     int nHitAdd=0;
+
+    TVector3 pos;
+    TVector3 mom;
+    double charge;
+    TMatrixDSym cov;
+    double Bz=m_genfitField->getBz(TVector3{0.,0.,0.})/GenfitUnit::tesla;
+    CEPC::getPosMomFromTrackState(track.getTrackStates(0),Bz,pos,mom,charge,cov);
+
     for(unsigned int iHit=0;iHit<track.trackerHits_size();iHit++){
         edm4hep::TrackerHit* trackerHit=
           new edm4hep::TrackerHit(track.getTrackerHits(iHit));
@@ -333,7 +362,7 @@ int GenfitTrack::addSiliconMeasurements(edm4hep::Track& track,
         float sigmaU,sigmaV;
         int sigmaUID=getSigmas(cellID,sigmaUVec,sigmaVVec,sigmaU,sigmaV);
         if(0==sigmaUID) continue;//skip DC track
-        addSiliconMeasurement(trackerHit,sigmaU,sigmaV,cellID,nHitAdd++);
+        addSiliconMeasurement(trackerHit,pos,mom,sigmaU,sigmaV,cellID,nHitAdd++);
         GenfitHit* genfitHit=
             new GenfitHit(trackerHit,nullptr,nullptr,
             nullptr,0.,0.);
@@ -343,6 +372,36 @@ int GenfitTrack::addSiliconMeasurements(edm4hep::Track& track,
     return nHitAdd;
 }
 
+///Add WireMeasurements of hits on track
+bool GenfitTrack::addWireMeasurements(const edm4hep::TrackerHit& trackerHit,
+        edm4hep::SimTrackerHit simTrackerHitAsso,int dcID,float sigma){
+
+    //FIXME driftVelocity
+    double driftVelocity=40.;//um/ns;;;FIXME 
+    TVector3 end0(0,0,0);
+    TVector3 end1(0,0,0);
+    getEndPointsOfWire(trackerHit.getCellID(),end0,end1); 
+
+    int layer = m_decoderDC->get(trackerHit.getCellID(),"layer");
+    int wireID = m_decoderDC->get(trackerHit.getCellID(),"cellID");
+
+    WireMeasurementDC* wireMeasurementDC=
+        new WireMeasurementDC(1e-4*driftVelocity*trackerHit.getTime(),sigma,
+                end0,end1,getDetTypeID(trackerHit.getCellID()),dcID,nullptr);
+    wireMeasurementDC->setTrackerHitObj(trackerHit,layer,wireID,trackerHit.getTime());
+    //wireMeasurementDC->setLeftRightResolution(0);//FIXME
+    genfit::TrackPoint* trackPoint =
+        new genfit::TrackPoint(wireMeasurementDC,m_track);
+    m_track->insertPoint(trackPoint);
+    //m_track->insertPoint(new genfit::TrackPoint(wireMeasurementDC,m_track));
+    if(m_debug>2){
+        std::cout << " addWireMeasurements wireMeasurementDC : " << std::endl;
+        wireMeasurementDC->print();
+    }
+    return true;
+}
+
+
 //Add wire measurement on wire, unit conversion here
 int GenfitTrack::addWireMeasurementsFromListTrF(const edm4hep::TrackerHitCollection* trkHits,
         float sigma,int sortMethod)
@@ -368,15 +427,17 @@ int GenfitTrack::addWireMeasurementsFromListTrF(const edm4hep::TrackerHitCollect
 
         ///New a TrackPoint,create connection between meas. and trackPoint
         WireMeasurementDC* wireMeasurementDC=
-            new WireMeasurementDC(1e-3*driftVelocity*trackerHit->getTime(),sigma,
+            new WireMeasurementDC(1e-4*driftVelocity*trackerHit->getTime(),sigma,
                     end0,end1,getDetTypeID(trackerHit->getCellID()),nHitAdd,nullptr);
 
         int layer = m_decoderDC->get(trackerHit->getCellID(),"layer");
         int cellID = m_decoderDC->get(trackerHit->getCellID(),"cellID");
         const edm4hep::TrackerHit trackerHit_;
-        wireMeasurementDC->setTrackerHit(trackerHit_,layer,cellID);
+        wireMeasurementDC->setTrackerHit(trackerHit_,layer,cellID,trackerHit->getTime());
 
-        m_track->insertPoint(new genfit::TrackPoint(wireMeasurementDC,m_track));
+        genfit::TrackPoint* trackPoint =
+            new genfit::TrackPoint(wireMeasurementDC,m_track);
+        m_track->insertPoint(trackPoint);
         if(m_debug>=2){ std::cout<<nHitAdd-1; wireMeasurementDC->Print(); }
         nHitAdd++;
     }//end of loop over sotred hits
@@ -398,12 +459,12 @@ int GenfitTrack::addWireMeasurementsFromList(std::vector<edm4hep::TrackerHit*>&
         std::cout<<"n sortedTrackerHits "<<sortedTrackerHits.size()<<std::endl;
     }
     int nHitAdd=0;
-    for(auto trackerHit : sortedTrackerHits){
+    for(int i=0;i<sortedTrackerHits.size();i++){
         edm4hep::SimTrackerHit simTrackerHitAsso;
-        getAssoSimTrackerHit(assoHits,trackerHit,simTrackerHitAsso);
+        getAssoSimTrackerHit(assoHits,sortedTrackerHits[i],simTrackerHitAsso);
         //FIXME driftVelocity
         GenfitHit* genfitHit=
-            makeAGenfitHit(trackerHit,&simTrackerHitAsso,sigma,truthAmbig,
+            makeAGenfitHit(sortedTrackerHits[i],&simTrackerHitAsso,sigma,truthAmbig,
                     skipCorner,skipNear);
 
         if(nullptr==genfitHit) continue;
@@ -412,7 +473,9 @@ int GenfitTrack::addWireMeasurementsFromList(std::vector<edm4hep::TrackerHit*>&
         ///New a TrackPoint,create connection between meas. and trackPoint
         WireMeasurementDC* wireMeasurementDC=
             new WireMeasurementDC(genfitHit,nHitAdd++);
-        m_track->insertPoint(new genfit::TrackPoint(wireMeasurementDC,m_track));
+        genfit::TrackPoint* trackPoint =
+            new genfit::TrackPoint(wireMeasurementDC,m_track);
+        m_track->insertPoint(trackPoint);
         if(m_debug>=2){ std::cout<<nHitAdd-1; wireMeasurementDC->Print(); }
     }//end of loop over sotred hits
     return nHitAdd;
@@ -507,6 +570,11 @@ unsigned int GenfitTrack::getNumPoints() const
     return m_track->getNumPoints();
 }
 
+unsigned int GenfitTrack::getNumPointsWithMeasurement() const
+{
+    return m_track->getNumPointsWithMeasurement();
+}
+
 GenfitHit* GenfitTrack::GetHit(long unsigned int i) const {
     if(i>=m_genfitHitVec.size())return nullptr;
     return m_genfitHitVec[i];
@@ -622,6 +690,20 @@ void GenfitTrack::print( TLorentzVector pos, TVector3 mom,
     }
 }
 
+/// Print track information
+void GenfitTrack::print() const
+{
+    std::cout << "Genfit Track TrackRep: Num = " << m_track->getNumReps() << std::endl;
+    for(unsigned int i=0;i<m_track->getNumReps();i++){
+        m_track->getTrackRep(i)->Print();
+    }
+
+    std::cout << "Genfit Track TrackPoint: Num = " << m_track->getNumPoints() << std::endl;
+    for(unsigned int i=0; i<m_track->getNumPoints(); i++){
+        m_track->getPoint(i)->Print();
+    }
+}
+
 /// Get position, momentum, cov on plane of hitID-th hit
 bool GenfitTrack::getPosMomCovMOP(int hitID, TLorentzVector& pos,
         TVector3& mom, TMatrixDSym& cov,int repID) const
@@ -714,26 +796,174 @@ GenfitTrack::getFitStatus(int repID) const
 /// unit conversion here
 double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir,
         TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle,
-        int cellID, int repID, bool stopAtBoundary, bool calcJacobianNoise)const
+        HelixClass helix, unsigned long long cellID,
+        int repID, bool stopAtBoundary, bool calcJacobianNoise)
+{
+    int chargeId;
+    mcParticle.getCharge() >0 ? chargeId=0 : chargeId=1;//s_PDG[0]: positive particle
+
+    float refPos[3] = {0,0,0};
+    float Point[6] = {0,0,0};
+    float helixMom[3] = {0,0,0};
+    helix.getPointOnCircle(800,refPos,Point); //mm
+    helix.getExtrapolatedMomentum(Point,helixMom);//mm
+
+    TVector3 extraPos(0,0,0);
+    TVector3 extraMom(0,0,0);
+    extraPos.SetXYZ(Point[0]*GenfitUnit::mm,Point[1]*GenfitUnit::mm,Point[2]*GenfitUnit::mm);//cm
+    extraMom.SetXYZ(helixMom[0],helixMom[1],helixMom[2]);
+    if(m_debug>2){
+        std::cout << " extraPos: " << std::endl;
+        extraPos.Print();
+        std::cout << " extraMom: " << std::endl;
+        extraMom.Print();
+    }
+
+    //extrapolateToHit
+    double extraLength = 
+        extrapolateToHit(poca,pocaDir,pocaOnWire,doca,extraPos,extraMom,
+                chargeId,cellID,repID,stopAtBoundary,calcJacobianNoise);
+
+    return extraLength;
+}
+
+/// Extrapolate track to the cloest point of approach(POCA) to the wire of hit,
+/// return doca, poca on wire and track
+/// outputs poca [cm]
+/// unit conversion here
+double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir,
+        TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle,
+        unsigned long long cellID,
+        int repID, bool stopAtBoundary, bool calcJacobianNoise)
 {
     ///Get MCParticle and convert unit
-    TVector3 pos;
-    TVector3 mom;
+    TVector3 pos(0,0,0);
+    TVector3 mom(0,0,0);
     getPosMomFromMCPartile(mcParticle,pos,mom);
 
+    int chargeId;
+    mcParticle.getCharge() >0 ? chargeId=0 : chargeId=1;//s_PDG[0]: positive particle
+
+    //extrapolateToCylinder
+    double startRadius = 1;  // cm
+    const TVector3 linePoint(0,0,0);
+    const TVector3 lineDirection(0,0,1);
+
+    for(int i=0;i<81;i++){
+
+        double radius = startRadius+1*i; //cm
+        double length = extrapolateToCylinder(pos,mom,radius,linePoint,lineDirection);
+        if(m_debug){
+            std::cout<<"GenfitterTrack::extrapolateToHit before pos and mom " << __LINE__ 
+                <<" charge "<<(int)mcParticle.getCharge()<<" repID "<<repID
+                <<" pdg "<<s_PDG[chargeId][repID]<< " radius = " << radius <<std::endl;
+            pos.Print();
+            mom.Print();
+            std::cout << " GenfitTrack::extrapolateToHit length = " << length << std::endl;
+        }
+    }
+
+    //extrapolateToHit
+    double extraLength = 
+        extrapolateToHit(poca,pocaDir,pocaOnWire,doca,pos,mom,chargeId,cellID,
+                repID,stopAtBoundary,calcJacobianNoise);
+
+    return extraLength;
+}
+
+/// Extrapolate track to the cloest point of approach(POCA) to the wire of hit,
+/// return doca, poca on wire and track
+/// outputs poca [cm]
+/// unit conversion here
+double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir,
+        TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom,
+        unsigned long long cellID,int pdg, bool stopAtBoundary,
+        bool calcJacobianNoise)const
+{
+    ///Get MCParticle and convert unit
+    TVector3 pos=startPos;
+    TVector3 mom=startMom;
+
     TVector3 end0(0,0,0);
     TVector3 end1(0,0,0);
-    getEndPointsOfWire(cellID,end0,end1);
+    getEndPointsOfWire(cellID,end0,end1); //cm
+
+    genfit::RKTrackRep* rep = new genfit::RKTrackRep(pdg);
+    //std::cout << " s_PDG[chargeId][repID] = " << s_PDG[chargeId][repID] << std::endl;
+    //genfit::MeasuredStateOnPlane state(rep);
+    genfit::StateOnPlane state(rep);
+    rep->setPosMom(state, pos, mom);
+    TVector3 wireDir = (end1-end0).Unit();
+
+    if(m_debug){
+        std::cout<<"GenfitterTrack::extrapolateToHit before pos and mom "
+            <<" pdg "<<pdg<<std::endl;
+        pos.Print();
+        mom.Print();
+        std::cout<<" end point"<<std::endl;
+        end0.Print();
+        end1.Print();
+        std::cout<<" state "<<std::endl;
+        state.Print();
+        std::cout<<" wireDir: "<<std::endl;
+        wireDir.Print();
+        std::cout<<" stopAtBoundary "<<stopAtBoundary<<std::endl;
+        std::cout<<" calcJacobianNoise "<<calcJacobianNoise<<std::endl;
+    }
+
+    double extrapoLen=0.;
+    try {
+        extrapoLen = rep->extrapolateToLine(state,end0,wireDir,
+                stopAtBoundary,calcJacobianNoise);
+        poca = rep->getPos(state);
+        pocaDir = rep->getMom(state);
+        pocaDir = pocaDir.Unit();
+        pocaOnWire = end0 + wireDir*((poca - end0)*wireDir);
+    }catch(genfit::Exception& e) {
+        if(m_debug>=3)std::cout<<
+            "Exception in GenfitterTrack::extrapolateToHit"<<e.what()<<std::endl;
+        return extrapoLen/GenfitUnit::mm*dd4hep::mm;
+    }
+
+    doca = (pocaOnWire-poca).Mag();
+    if(m_debug>=2){
+        std::cout<< "extrapoLen= " << extrapoLen << " poca "<<poca.x()<<","<<poca.y()<<" "<<poca.z()
+            <<" pocaDir "<<pocaDir.x()<<","<<pocaDir.y()<<" "<<pocaDir.z()
+            <<" pocaOnWire "<<pocaOnWire.x()<<","<<pocaOnWire.y()<<" "<<pocaOnWire.z()
+            <<" doca "<<doca<<" cm " << " dd4hep::mm = " << dd4hep::mm << " dd4hep::cm = " << dd4hep::cm <<std::endl;
+    }
+
+    delete rep;
+    return extrapoLen/GenfitUnit::mm*dd4hep::mm;
+}//end of extrapolateToHit
+
+/// Extrapolate track to the cloest point of approach(POCA) to the wire of hit,
+/// return doca, poca on wire and track
+/// outputs poca [cm]
+/// unit conversion here
+double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir,
+        TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom,
+        int chargeId,unsigned long long cellID, int repID, bool stopAtBoundary,
+        bool calcJacobianNoise)const
+{
+    ///Get MCParticle and convert unit
+    TVector3 pos=startPos;
+    TVector3 mom=startMom;
+
+    TVector3 end0(0,0,0);
+    TVector3 end1(0,0,0);
+    getEndPointsOfWire(cellID,end0,end1); //cm
 
-    int chargeId;
-    mcParticle.getCharge() >0 ? chargeId=0 : chargeId=1;//s_PDG[0]: positive particle
     genfit::RKTrackRep* rep = new genfit::RKTrackRep(s_PDG[chargeId][repID]);
+    //std::cout << " s_PDG[chargeId][repID] = " << s_PDG[chargeId][repID] << std::endl;
+    //genfit::MeasuredStateOnPlane state(rep);
     genfit::StateOnPlane state(rep);
     rep->setPosMom(state, pos, mom);
+    TVector3 wireDir = (end1-end0).Unit();
 
     if(m_debug){
         std::cout<<"GenfitterTrack::extrapolateToHit before pos and mom "
-            <<" charge "<<(int)mcParticle.getCharge()<<" repID "<<repID
+            <<" charge "<< chargeId <<" repID "<<repID
             <<" pdg "<<s_PDG[chargeId][repID]<<std::endl;
         pos.Print();
         mom.Print();
@@ -742,15 +972,20 @@ double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir,
         end1.Print();
         std::cout<<" state "<<std::endl;
         state.Print();
+        std::cout<<" wireDir: "<<std::endl;
+        wireDir.Print();
         std::cout<<" stopAtBoundary "<<stopAtBoundary<<std::endl;
         std::cout<<" calcJacobianNoise "<<calcJacobianNoise<<std::endl;
     }
 
-
     double extrapoLen=0.;
     try {
-        extrapoLen = rep->extrapolateToLine(state,end0,end0-end1,
-                poca,pocaDir,pocaOnWire,stopAtBoundary,calcJacobianNoise);
+        extrapoLen = rep->extrapolateToLine(state,end0,wireDir,
+                stopAtBoundary,calcJacobianNoise);
+        poca = rep->getPos(state);
+        pocaDir = rep->getMom(state);
+        pocaDir = pocaDir.Unit();
+        pocaOnWire = end0 + wireDir*((poca - end0)*wireDir);
     }catch(genfit::Exception& e) {
         if(m_debug>=3)std::cout<<
             "Exception in GenfitterTrack::extrapolateToHit"<<e.what()<<std::endl;
@@ -769,6 +1004,30 @@ double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir,
     return extrapoLen/GenfitUnit::mm*dd4hep::mm;
 }//end of extrapolateToHit
 
+double GenfitTrack::extrapolateToPlane(TVector3 startPos,TVector3 startMom,
+        genfit::SharedPlanePtr plane,int pdg, bool stopAtBoundary,
+        bool calcJacobianNoise)const
+{
+    genfit::AbsTrackRep* rep;
+    rep = new genfit::RKTrackRep(pdg);
+
+    genfit::StateOnPlane state(rep);
+    rep->setPosMom(state, startPos, startMom);
+
+    genfit::SharedPlanePtr origPlane = state.getPlane();
+    genfit::StateOnPlane origState(state);
+
+    double extrapoLen = 1e9;
+    try {
+        extrapoLen = rep->extrapolateToPlane(state, plane);
+    }catch (genfit::Exception& e) {
+        if(m_debug>=3)std::cout<<
+            "Exception in GenfitterTrack::extrapolateToPlane"<<e.what()<<std::endl;
+        return extrapoLen/GenfitUnit::mm*dd4hep::mm;
+    }
+
+    return extrapoLen/GenfitUnit::mm*dd4hep::mm;
+}
 ///Add space point measurement of silicon from edm4hep::Track to genfit track
 int GenfitTrack::addSpacePointsSi(const edm4hep::Track& track,
         std::vector<float> sigmaU,std::vector<float> sigmaV)
@@ -1002,12 +1261,12 @@ bool GenfitTrack::debugDistance(const edm4hep::TrackerHitCollection* dCDigiCol,
                 dynamic_cast<WireMeasurementDC*>(absMea);
             if(dcMea){
                 const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit();
-                smearDistance.push_back(1e-3*driftVelocity*TrackerHit_->getTime());
+                smearDistance.push_back(1e-3*driftVelocity*TrackerHit_->getTime());//mm
                 DCHit++;
                 for(auto dcDigi: *dCDigiCol){
                     if(dcDigi.getCellID() == TrackerHit_->getCellID())
                     {
-                        truthDistance.push_back(1e-3*driftVelocity*(dcDigi.getTime()));
+                        truthDistance.push_back(1e-3*driftVelocity*(dcDigi.getTime()));//mm
                     }
                 }
             }
@@ -1039,11 +1298,30 @@ bool GenfitTrack::GetDocaRes(int hitID, double& DriftDis,double& fittedDoca,
     return true;
 }
 
+void GenfitTrack::setNewHitCov(int hitID) const
+{
+    std::cout << " setNewHitCov No." << hitID << " is running!!!" << std::endl;
+    genfit::TrackPoint* tp = m_track->getPoint(hitID);
+    genfit::AbsMeasurement * abs = tp->getRawMeasurement(0);
+
+    TMatrixDSym D = abs->getRawHitCov();
+    std::cout<< " setNewHitCov D:" << std::endl;
+    D.Print();
+
+    int dimCov = abs->getDim();
+    std::cout<< " setNewHitCov  dimCov = " << dimCov << std::endl;
+    TMatrixDSym DNew(1);
+    DNew(0,0)=9999.0;
+    if(dimCov<2){
+        abs->setRawHitCov(DNew);
+    }
+}
+
 bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle,
         edm4hep::MutableTrack& track,TVector3& pocaToOrigin_pos,
         TVector3& pocaToOrigin_mom,TMatrixDSym& pocaToOrigin_cov,
         // edm4hep::TrackState& trackState,
-        int pidType, int ndfCut, double chi2Cut,
+        int pidType, int ndfCut, double chi2Cut,int& nDC, int& nSDT,
         int& nFittedDC, int& nFittedSDT, int& ngenfitHit,
         std::vector<double>& trackL, std::vector<double>& hitMom,
         std::vector<float>& truthMomEdep,
@@ -1052,7 +1330,9 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle,
         std::vector<double>& FittedDoca,
         std::vector<double>& truthDoca,
         std::vector<double>& Res,
-        std::vector<double>& truthRes)
+        std::vector<double>& truthRes,std::vector<int>& isNoise,std::vector<int>& isFitNoise,
+        std::vector<int>& layerFit,std::vector<int>& wireIDFit,
+        std::vector<int>& layer,std::vector<int>& wireID,std::vector<double>& extrapoLen)
 {
 
     int id = 0;
@@ -1071,6 +1351,7 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle,
     while(1){
         genfit::TrackPoint* point = m_track->getPointWithFitterInfo(id);
         if(!point)break;
+        extrapoLen.push_back(point->getSortingParameter());
         id++;
         genfit::AbsMeasurement* absMea = point->getRawMeasurement();
 
@@ -1107,9 +1388,18 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle,
                 dynamic_cast<WireMeasurementDC*>(absMea);
             if(dcMea){
                 const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit();
-                if(nullptr==TrackerHit_) std::cout << __LINE__ << std::endl;
-                track.addToTrackerHits(*TrackerHit_);
-
+                edm4hep::TrackerHit TrackerHitObj_;
+                if(nullptr==TrackerHit_){
+                    TrackerHitObj_ = dcMea->getTrackerHitObj();
+                    TrackerHit_ = &TrackerHitObj_;
+                    track.addToTrackerHits(TrackerHitObj_);
+                }else {
+                    track.addToTrackerHits(*TrackerHit_);
+                    TrackerHitObj_ = *TrackerHit_;
+                }
+                isNoise.push_back(TrackerHit_->getQuality());
+                layer.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"layer"));
+                wireID.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"cellID"));
 
                 DCHit++;
                 if(flag)
@@ -1123,9 +1413,11 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle,
                     truthDoca.push_back(40*1e-3*TrackerHit_->getTime());
                     truthRes.push_back((40*1e-3*TrackerHit_->getTime())-10*fittedDoca);
                     Res.push_back(res);
-
-
+                    isFitNoise.push_back(TrackerHit_->getQuality());
                     dcFit++;
+
+                    layerFit.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"layer"));
+                    wireIDFit.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"cellID"));
                 }
             }
         }
@@ -1134,6 +1426,9 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle,
     nFittedDC = dcFit;
     nFittedSDT = SDTHit;
 
+    nDC = DCHit;
+    nSDT = SDTHit;
+
     if(fitid<1e-9) return false;
 
     if(m_debug>0)std::cout<<m_name<<" store track ndfCut "<<ndfCut<<" chi2Cut "
@@ -1322,15 +1617,28 @@ int GenfitTrack::getDetTypeID(unsigned long long cellID) const
     return encoder[lcio::ILDCellID0::subdet];
 }
 
+void GenfitTrack::getAssoSimTrackerHit2(
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        const edm4hep::TrackerHit& trackerHit,
+        edm4hep::SimTrackerHit& simTrackerHit) const
+{
+    for(int i =0;i<assoHits->size();i++){
+        if(assoHits->at(i).getRec()==trackerHit)
+        {
+            simTrackerHit=assoHits->at(i).getSim();
+
+        }
+    }
+}
 void GenfitTrack::getAssoSimTrackerHit(
-        const edm4hep::MCRecoTrackerAssociationCollection*& assoHits,
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
         edm4hep::TrackerHit* trackerHit,
         edm4hep::SimTrackerHit& simTrackerHit) const
 {
-    for(auto assoHit: *assoHits){
-        if(assoHit.getRec()==*trackerHit)
+    for(int i =0;i<assoHits->size();i++){
+        if(assoHits->at(i).getRec()==*trackerHit)
         {
-            simTrackerHit=assoHit.getSim();
+            simTrackerHit=assoHits->at(i).getSim();
 
         }
     }
@@ -1352,7 +1660,7 @@ void GenfitTrack::getSeedCov(TMatrixDSym& cov){
 }
 
 //unit conversion here
-void GenfitTrack::getEndPointsOfWire(int cellID,TVector3& end0,TVector3& end1) const{
+void GenfitTrack::getEndPointsOfWire(unsigned long long cellID,TVector3& end0,TVector3& end1) const{
     m_gridDriftChamber->cellposition(cellID,end0,end1);//dd4hep unit
     end0*=(1./dd4hep::cm*GenfitUnit::cm);
     end1*=(1./dd4hep::cm*GenfitUnit::cm);
@@ -1422,7 +1730,7 @@ void GenfitTrack::getTrackFromEDMTrackFinding(const edm4hep::Track& edm4HepTrack
     // FIXME
     double Bz=3*GenfitUnit::tesla;
     double charge_double;
-    CEPC::getPosMomFromTrackState(edm4HepTrack.getTrackStates(1),Bz,pos,mom,charge_double,cov);
+    CEPC::getPosMomFromTrackState(edm4HepTrack.getTrackStates(0),Bz,pos,mom,charge_double,cov);
 
     charge=(int) charge_double;
     trackParam[0]=pos[0]*GenfitUnit::mm;
@@ -1552,6 +1860,180 @@ void GenfitTrack::getSortedTrackerHitsTrF(
     return;
 }//end of getSortedTrackerHits
 
+double GenfitTrack::checkGenfitTrack(int& dcFitNum){
+
+    int id = 0;
+    int dcID=0;
+
+    unsigned int nPoints = m_track->getNumPoints();
+    unsigned int nPointsWithMea = m_track->getNumPointsWithMeasurement();
+
+    while(1){
+        genfit::TrackPoint* point = m_track->getPointWithFitterInfo(id);
+        if(!point)break;
+        id++;
+        genfit::AbsMeasurement* absMea = point->getRawMeasurement();
+
+        // getPoint FitterInfo
+        genfit::AbsFitterInfo* FitterInfo = point->getFitterInfo();
+        genfit::KalmanFitterInfo *KalmanfitterInfo =
+            dynamic_cast<genfit::KalmanFitterInfo*>(FitterInfo);
+
+        unsigned int nNumMea = KalmanfitterInfo->getNumMeasurements();
+
+        bool flag = false;
+        for(int i=0;i<nNumMea;i++)
+        {
+            genfit::MeasurementOnPlane* MeaOnPlane =
+                KalmanfitterInfo->getMeasurementOnPlane(i);
+            double weight = MeaOnPlane->getWeight();
+            if(weight>0.8) flag = true;
+        }
+
+        genfit::MeasurementOnPlane * Mea =
+            KalmanfitterInfo->getMeasurementOnPlane();
+
+        genfit::PlanarMeasurementSDT* sdtMea =
+            dynamic_cast<genfit::PlanarMeasurementSDT*>(absMea);
+        if(!sdtMea){
+            WireMeasurementDC* dcMea =
+                dynamic_cast<WireMeasurementDC*>(absMea);
+            if(dcMea){
+                if(flag) dcID++;
+                const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit();
+                edm4hep::TrackerHit TrackerHitObj_;
+                if(nullptr==TrackerHit_){
+                    TrackerHitObj_ = dcMea->getTrackerHitObj();
+                    TrackerHit_ = &TrackerHitObj_;
+                }else {
+                    TrackerHitObj_ = *TrackerHit_;
+                }
+            }
+        }
+    }
+
+    dcFitNum = dcID;
+    const genfit::FitStatus* fitState = getFitStatus();
+    double ndf = fitState->getNdf();
+    double chi2 = fitState->getChi2();
+    return (chi2/ndf);
+}
+
+int GenfitTrack::salvageHits(int PDG,
+        const edm4hep::MCParticleCollection* mcParticleCol,
+        const edm4hep::TrackerHitCollection* dCDigiCol,
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        double sigma,bool truthAmbig,double skipCorner,double skipNear,
+        double extraCut,double extraDocaCut,
+        std::vector<double>& docaTrack,std::vector<int>& isNoise,
+        int& nDC){
+
+    TVector3 seedPos(0,0,0);
+    TVector3 seedMom(0,0,0);
+
+    edm4hep::MCParticle mcParticle;
+    for(int i=0;i<mcParticleCol->size();i++){
+        if(PDG==mcParticleCol->at(i).getPDG()) mcParticle = mcParticleCol->at(i);
+    }
+    getPosMomFromMCPartile(mcParticle,seedPos,seedMom);
+    seedPos.SetXYZ(seedPos.X()/GenfitUnit::mm,seedPos.Y()/GenfitUnit::mm,
+            seedPos.Z()/GenfitUnit::mm);
+    double Bz = m_genfitField->getBz(TVector3{0.,0.,0.})/GenfitUnit::tesla;
+    int charge = (int)(mcParticle.getCharge());
+    HelixClass helix;
+    double xc,yc,helixR;
+    CEPC::getHelixFromPosMom(helix,xc,yc,helixR,Bz,seedPos,seedMom,charge);
+
+    TVector3 poca(0,0,0);
+    TVector3 pocaDir(0,0,0);
+    TVector3 pocaOnWire(0,0,0);
+    double doca = 0;
+
+    int id = 0;
+    int idAdd = 0;
+    int dcID=0;
+    std::vector<unsigned long long> fitcellID;
+
+    unsigned int nPoints = m_track->getNumPoints();
+    unsigned int nPointsWithMea = m_track->getNumPointsWithMeasurement();
+
+    while(1){
+        genfit::TrackPoint* point = m_track->getPointWithFitterInfo(id);
+        if(!point)break;
+        id++;
+        genfit::AbsMeasurement* absMea = point->getRawMeasurement();
+
+        // getPoint FitterInfo
+        genfit::AbsFitterInfo* FitterInfo = point->getFitterInfo();
+        genfit::KalmanFitterInfo *KalmanfitterInfo =
+            dynamic_cast<genfit::KalmanFitterInfo*>(FitterInfo);
+
+        unsigned int nNumMea = KalmanfitterInfo->getNumMeasurements();
+
+        bool flag = false;
+        for(int i=0;i<nNumMea;i++)
+        {
+            genfit::MeasurementOnPlane* MeaOnPlane =
+                KalmanfitterInfo->getMeasurementOnPlane(i);
+            double weight = MeaOnPlane->getWeight();
+            if(weight>0.8) flag = true;
+        }
+
+        genfit::MeasurementOnPlane * Mea =
+            KalmanfitterInfo->getMeasurementOnPlane();
+
+        genfit::PlanarMeasurementSDT* sdtMea =
+            dynamic_cast<genfit::PlanarMeasurementSDT*>(absMea);
+        if(!sdtMea){
+            WireMeasurementDC* dcMea =
+                dynamic_cast<WireMeasurementDC*>(absMea);
+            if(dcMea){
+                const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit();
+                if(nullptr==TrackerHit_) std::cout << __LINE__ << std::endl;
+                dcID++;
+                fitcellID.push_back(dcMea->getTrackerHit()->getCellID());
+            }
+        }
+    }
+    nDC = dcID;
+
+    int nAddHits=0;
+
+    for(int i=0;i<dCDigiCol->size();i++){
+        unsigned long long cellID = dCDigiCol->at(i).getCellID();
+        int layer = m_decoderDC->get(cellID,"layer");
+        int wireID = m_decoderDC->get(cellID,"cellID");
+
+
+        std::vector<unsigned long long>::iterator it;
+        it = find(fitcellID.begin(), fitcellID.end(), cellID);
+        if (it == fitcellID.end()){
+
+            double distance =
+                extrapolateToHit(poca,pocaDir,pocaOnWire,doca,
+                        mcParticle,helix,cellID);
+            double driftdis = 40*1e-4*dCDigiCol->at(i).getTime(); //fixed speed FIXME   &&  cm
+            if(abs(doca)>extraDocaCut) continue;
+            if(abs(driftdis-doca)>extraCut) continue;
+            edm4hep::SimTrackerHit simTrackerHit;
+            getAssoSimTrackerHit2(assoHits,dCDigiCol->at(i),simTrackerHit);
+            if(addWireMeasurements(dCDigiCol->at(i),simTrackerHit,dcID,sigma)){
+                dcID++;
+                nAddHits++;
+
+                docaTrack.push_back(doca);
+                isNoise.push_back(dCDigiCol->at(i).getQuality());
+            }
+        }
+    }// all DC digi hits
+    return nAddHits;
+}//end of salvageHits
+
+//Exclude the hits that may be noise
+//void GenfitTrack::Excludehits(){
+//
+//}//end of Excludehits
+
 void GenfitTrack::getSortedTrackerHits(
         std::vector<edm4hep::TrackerHit*>& trackerHits,
         const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
@@ -1622,3 +2104,83 @@ GenfitHit* GenfitTrack::makeAGenfitHit(edm4hep::TrackerHit* trackerHit,
     return genfitHit;
 }
 
+bool GenfitTrack::sortedHitOnTrack(int pdg){
+
+    TVectorD seedState(6);
+    seedState = m_track->getStateSeed();
+    TVector3 pos(seedState[0],seedState[1],seedState[2]);
+    TVector3 mom(seedState[3],seedState[4],seedState[5]);
+
+    //std::cout << " genfitTrack Seed: " << std::endl;
+    //pos.Print();
+    //mom.Print();
+
+    unsigned int nPoints = m_track->getNumPoints();
+    for(unsigned int i = 0; i<nPoints; i++){
+
+        double extrapoLen = 0;
+
+        genfit::TrackPoint* point = m_track->getPoint(i);
+        genfit::AbsMeasurement* absMea = point->getRawMeasurement(); 
+        genfit::PlanarMeasurementSDT* sdtMea =
+            dynamic_cast<genfit::PlanarMeasurementSDT*>(absMea);
+
+        if(sdtMea){
+            const edm4hep::TrackerHit* TrackerHit_ = sdtMea->getTrackerHit();
+            const dd4hep::rec::ISurface* iSurface =
+                getISurface(const_cast<edm4hep::TrackerHit*>(TrackerHit_));
+            if(nullptr==iSurface){
+                std::cout<<m_name<<" addSiliconMeasurement get surface ERROR!"<<std::endl;
+                return false;
+            }
+
+            TVector3 o,u,v;
+            double lengthU,lengthV;
+            getISurfaceOUV(iSurface,o,u,v,lengthU,lengthV);
+            genfit::SharedPlanePtr plane(new genfit::DetPlane(o,u,v));
+            extrapoLen = extrapolateToPlane(pos,mom,plane,pdg);
+
+            point->setSortingParameter(extrapoLen);
+            //std::cout << " sortedHitOnTrack PlanarMeasurementSDT trackLen = " << extrapoLen << std::endl;
+        } else {
+            WireMeasurementDC* dcMea =
+                dynamic_cast<WireMeasurementDC*>(absMea);
+            if(dcMea){
+                const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit();
+                edm4hep::TrackerHit TrackerHitObj_;
+                if(nullptr==TrackerHit_){
+                    TrackerHitObj_ = dcMea->getTrackerHitObj();
+                    TrackerHit_ = &TrackerHitObj_;
+                }else {
+                    TrackerHitObj_ = *TrackerHit_;
+                }
+
+                unsigned long long cellID = TrackerHit_->getCellID();
+                TVector3 poca;
+                TVector3 pocaDir;
+                TVector3 pocaOnWire;
+                double doca;
+                extrapoLen =
+                    extrapolateToHit(poca,pocaDir,pocaOnWire,doca,pos,mom,cellID,pdg);
+                point->setSortingParameter(extrapoLen);
+
+            }else {
+                std::cout << " sortedHitOnTrack WireMeasurementDC nllptr ERROR !!!!!!" << std::endl;
+                return false;
+            }
+        }
+
+    }
+
+    return true;
+}
+
+void GenfitTrack::checkTrackPoint(){
+
+    unsigned int nPoints = m_track->getNumPoints();
+    for(unsigned int i = 0; i<nPoints; i++){
+
+        genfit::TrackPoint* point = m_track->getPoint(i);
+        std::cout << " checkTrackPoint No." << i << " getSortingParameter = " << point->getSortingParameter() << std::endl;
+    }
+}
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
index 58f25014..47e85238 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
+++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
@@ -32,6 +32,10 @@
 //STL
 #include <vector>
 
+#include "DataHelper/HelixClass.h"
+#include "WireMeasurementDC.h"
+#include "PlanarMeasurementSDT.h"
+
 class TLorentzVector;
 class IGeomSvc;
 class WireMeasurementDC;
@@ -42,6 +46,7 @@ namespace genfit{
     class AbsTrackRep;
     class RKTrackRep;
     class KalmanFittedStateOnPlane;
+    class PlanarMeasurementSDT;
 }
 namespace edm4hep{
     class MCParticle;
@@ -57,6 +62,7 @@ namespace edm4hep{
     class Vector3d;
     class Vector3f;
     class TrackerHitCollection;
+    class MCParticleCollection;
 }
 namespace dd4hep {
     namespace DDSegmentation{
@@ -72,6 +78,9 @@ class GenfitTrack {
     friend int GenfitFitter::processTrack(
             GenfitTrack* track, bool resort);
     
+    friend int GenfitFitter::processTrack(
+            genfit::Track* track, bool resort);
+
     friend int GenfitFitter::processTrackWithRep(
             GenfitTrack* track, int repID, bool resort);
 
@@ -115,8 +124,13 @@ class GenfitTrack {
     virtual int addWireMeasurementsFromListTrF(const edm4hep::TrackerHitCollection* trkHits,
             float sigma,int sortMethod);
 
+    //Add salhits
+    bool addWireMeasurements(const edm4hep::TrackerHit& trackerHit,
+            edm4hep::SimTrackerHit simTrackerHitAsso,int dcID,float sigma);
+    double checkGenfitTrack(int& dcFitNum);
+
     ///Add one silicon hits
-    bool addSiliconMeasurement(edm4hep::TrackerHit* hit,
+    bool addSiliconMeasurement(edm4hep::TrackerHit* hit,TVector3 pos,TVector3 mom,
             float sigmaU,float sigmaV,int cellID,int hitID);
 
     ///Add silicon measurements, return number of hits on track
@@ -129,6 +143,7 @@ class GenfitTrack {
             std::vector<double>& truthDistance,double driftVelocity);
     bool GetDocaRes(int hitID,  double& DriftDis,double& fittedDoca,
             double& res,int repID=0, bool biased=true) const;
+    void setNewHitCov(int hitID) const;
 
     ///Store track to ReconstructedParticle
     bool storeTrack(edm4hep::MutableReconstructedParticle& recParticle,
@@ -136,7 +151,7 @@ class GenfitTrack {
             TVector3& pocaToOrigin_pos,
             TVector3& pocaToOrigin_mom,
             TMatrixDSym& pocaToOrigin_cov,
-            int pidType, int ndfCut, double chi2Cut,
+            int pidType, int ndfCut, double chi2Cut,int& nDC, int& nSDT,
             int& nFittedDC, int& nFittedSDT,int& ngenfitHit,
             std::vector<double>& trackL, std::vector<double>& hitMom,
             std::vector<float>& truthMomEdep,
@@ -145,10 +160,12 @@ class GenfitTrack {
             std::vector<double>& FittedDoca,
             std::vector<double>& truthDoca,
             std::vector<double>& Res,
-            std::vector<double>& truthRes);
+            std::vector<double>& truthRes, std::vector<int>& isNoise,
+            std::vector<int>& isFitNoise,
+            std::vector<int>& layerFit,std::vector<int>& wireIDFit,
+            std::vector<int>& layer,std::vector<int>& wireID,std::vector<double>& extrapoLen);
 
     ///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);
@@ -159,7 +176,24 @@ class GenfitTrack {
     //return dd4hep unit
     double extrapolateToHit(TVector3& poca, TVector3& pocaDir,
             TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle,
-            int cellID, int repID, bool stopAtBoundary, bool calcJacobianNoise)const;
+            unsigned long long cellID, int repID=1,
+            bool stopAtBoundary=false,
+            bool calcJacobianNoise=true);
+    //return dd4hep unit
+    double extrapolateToHit(TVector3& poca, TVector3& pocaDir,
+            TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle,
+            HelixClass helix,unsigned long long cellID, int repID=1,
+            bool stopAtBoundary=false,
+            bool calcJacobianNoise=true);
+    //return dd4hep unit
+    double extrapolateToHit(TVector3& poca, TVector3& pocaDir,
+            TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom,
+            int chargeId, unsigned long long cellID, int repID=1, bool stopAtBoundary=false,
+            bool calcJacobianNoise=true)const;
+    double extrapolateToHit(TVector3& poca, TVector3& pocaDir,
+            TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom,
+            unsigned long long cellID,int pdg, bool stopAtBoundary=false,
+            bool calcJacobianNoise=true)const;
     /// Extrapolate the track to the point
     /// Output: pos and mom of POCA point to point
     /// Input: genfitTrack,point,repID,stopAtBoundary and calcAverageState
@@ -177,6 +211,9 @@ class GenfitTrack {
             const TVector3 lineDirection, int hitID =0, int repID=0,
             bool stopAtBoundary=false, bool calcJacobianNoise=true);
 
+    double extrapolateToPlane(TVector3 startPos, TVector3 startMom,
+            genfit::SharedPlanePtr plane,int pdg,
+            bool stopAtBoundary = false, bool calcJacobianNoise = true) const;
 
     bool getPosMomCovMOP(int hitID, TLorentzVector& pos, TVector3& mom,
             TMatrixDSym& cov, int repID=0) const;
@@ -186,7 +223,9 @@ class GenfitTrack {
     const TVector3 getSeedStateMom() const;
     void getSeedStateMom(TLorentzVector& pos, TVector3& mom) const;
     unsigned int getNumPoints() const;
+    unsigned int getNumPointsWithMeasurement() const;
     unsigned int getNumPointsDet(int cellID) const;
+    void getSeedStateCov(TVectorD& seedState,TMatrixDSym& covSeed);
 
     /// get the fitted track status
     const genfit::FitStatus* getFitStatus(int repID=0) const;
@@ -206,6 +245,7 @@ class GenfitTrack {
     void printSeed() const;//print seed
     void printFitted(int repID=0) const;//print seed
     void print(TLorentzVector pos, TVector3 mom, const char* comment="") const;
+    void print() const;
 
     /// set and get debug level
     void setDebug(int debug){m_debug=debug;}
@@ -213,6 +253,9 @@ class GenfitTrack {
     void setDebugLocal(int debug);
     int getDebug(void) const { return m_debug;}
 
+    bool sortedHitOnTrack(int pdg);
+    void checkTrackPoint();
+
     /// get name of this object
     const char* getName() const {return m_name;}
     genfit::Track* getTrack() const{return m_track;}
@@ -226,6 +269,14 @@ class GenfitTrack {
     static void getTrackFromEDMTrackFinding(const edm4hep::Track& edm4HepTrack,
             double& charge, TVectorD& trackParam, TMatrixDSym& cov,TVector3& pos,
             TVector3& mom);
+    int salvageHits(int PDG,
+            const edm4hep::MCParticleCollection* mcParticleCol,
+            const edm4hep::TrackerHitCollection* dCDigiCol,
+            const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+            double sigma,bool truthAmbig,double skipCorner,double skipNear,
+            double extraCut,double extraDocaCut,
+            std::vector<double>& docaTrack,std::vector<int>& isNoise,
+            int& nDC);
     protected:
     //genfit::Track* getTrack() {return m_track;}
 
@@ -246,10 +297,14 @@ class GenfitTrack {
     const dd4hep::rec::ISurface* getISurface(edm4hep::TrackerHit* hit);
     void getSeedCov(TMatrixDSym& cov);
     void getAssoSimTrackerHit(
-            const edm4hep::MCRecoTrackerAssociationCollection*& assoHits,
+            const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
             edm4hep::TrackerHit* trackerHit,
             edm4hep::SimTrackerHit& simTrackerHit) const;
-    void getEndPointsOfWire(int cellID,TVector3& end0,TVector3& end1)const;
+    void getAssoSimTrackerHit2(
+            const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+            const edm4hep::TrackerHit& trackerHit,
+            edm4hep::SimTrackerHit& simTrackerHit) const;
+    void getEndPointsOfWire(unsigned long long cellID,TVector3& end0,TVector3& end1)const;
     void getTrackFromEDMTrack(const edm4hep::Track& edm4HepTrack,
             double& charge, TVectorD& trackParam, TMatrixDSym& cov) const;
     void getTrackFromMCPartile(const edm4hep::MCParticle mcParticle,
diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp
deleted file mode 100644
index 8dc13f65..00000000
--- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp
+++ /dev/null
@@ -1,409 +0,0 @@
-#include "RecGenfitAlgDC.h"
-#include "GenfitTrack.h"
-#include "GenfitFitter.h"
-#include "GenfitField.h"
-
-//genfit
-#include "EventDisplay.h"
-
-//cepcsw
-#include "DetInterface/IGeomSvc.h"
-#include "DataHelper/HelixClass.h"
-#include "DetSegmentation/GridDriftChamber.h"
-
-//externals
-#include "edm4hep/EventHeaderCollection.h"
-#include "edm4hep/MCParticle.h"
-#include "edm4hep/MCParticleCollection.h"
-#include "edm4hep/SimTrackerHitCollection.h"
-#include "edm4hep/TrackerHitCollection.h"
-#include "edm4hep/TrackCollection.h"
-#include "edm4hep/MCRecoTrackerAssociationCollection.h"
-#include "edm4hep/ReconstructedParticle.h"
-#include "edm4hep/ReconstructedParticleCollection.h"
-#include "edm4hep/Track.h"
-#include "edm4hep/TrackCollection.h"
-#include "DD4hep/DD4hepUnits.h"
-#include "DD4hep/Detector.h"
-#include "UTIL/BitField64.h"
-#include "DDSegmentation/Segmentation.h"
-#include "TRandom.h"
-#include "TLorentzVector.h"
-
-//stl
-#include "time.h"
-
-
-DECLARE_COMPONENT( RecGenfitAlgDC )
-
-/////////////////////////////////////////////////////////////////////
-RecGenfitAlgDC::RecGenfitAlgDC(const std::string& name, ISvcLocator* pSvcLocator):
-        GaudiAlgorithm(name, pSvcLocator),m_nPDG(5),m_dd4hep(nullptr),
-        m_gridDriftChamber(nullptr),m_decoder(nullptr)
-{
-    //declareProperty("EventHeaderCol", _headerCol);
-    declareProperty("MCParticle", m_mcParticleCol,
-            "Handle of the input MCParticle collection");
-    declareProperty("DriftChamberHitsCollection", m_simDCHitCol,
-            "Handle of the input SimHit collection");
-    declareProperty("DigiDCHitCollection", m_digiDCHitsCol,
-            "Handle of digi DCHit collection");
-    declareProperty("DCTrackCollection", m_dcTrackCol,
-            "Handle of DC track collection");
-    declareProperty("DCHitAssociationCollection", m_dcHitAssociationCol,
-            "Handle of simTrackerHit and TrackerHit association collection");
-    declareProperty("DCRecParticleCollection", m_dcRecParticleCol,
-            "Handle of drift chamber reconstructed particle collection");
-}
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-
-StatusCode RecGenfitAlgDC::initialize()
-{
-    MsgStream log(msgSvc(), name());
-    info()<<"RecGenfitAlgDC initialize()"<<endmsg;
-
-    ///Get GeomSvc
-    m_geomSvc=Gaudi::svcLocator()->service("GeomSvc");
-    if (nullptr==m_geomSvc) {
-        std::cout<<"Failed to find GeomSvc"<<std::endl;
-        return StatusCode::FAILURE;
-    }
-    ///Get Detector
-    m_dd4hep = m_geomSvc->lcdd();
-    ///Get Field
-    m_dd4hepField=m_geomSvc->lcdd()->field();
-
-    /// New a genfit fitter
-    m_genfitFitter=new GenfitFitter(m_fitterType.toString().c_str());
-    m_genfitField=new GenfitField(m_dd4hepField);
-    m_genfitFitter->setField(m_genfitField);
-    m_genfitFitter->setGeoMaterial(m_geomSvc->lcdd());
-    m_genfitFitter->setEnergyLossBrems(m_correctBremsstrahlung);
-    m_genfitFitter->setNoiseBrems(m_correctBremsstrahlung);
-    if(m_debug>10) m_genfitFitter->setDebug(m_debug-10);
-    if(m_noMaterialEffects) m_genfitFitter->setNoEffects(true);
-    if(-1==m_debugPid) m_genfitFitter->setNoEffects(true);
-    if(-1==m_debugPid) m_debugPid=0;//charged geantino with electron pid
-    if(m_fitterType=="DAF"||m_fitterType=="DafRef"){
-        m_genfitFitter->setMaxIterationsBetas(m_bStart,m_bFinal,m_maxIteration);
-    } else {
-        m_genfitFitter->setMaxIterations(m_maxIteration);
-    }
-    //print genfit parameters
-    if(m_debug) m_genfitFitter->print();
-    if(""!=m_genfitHistRootName) m_genfitFitter->initHist(m_genfitHistRootName);
-
-    //initialize member vairables
-    for(int i=0;i<5;i++) m_fitSuccess[i]=0;
-    m_nDCTrack=0;
-    ///Get Readout
-    dd4hep::Readout readout=m_dd4hep->readout(m_readout_name);
-    ///Get Segmentation
-    m_gridDriftChamber=dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*>
-        (readout.segmentation().segmentation());
-    if(nullptr==m_gridDriftChamber){
-        error() << "Failed to get the GridDriftChamber" << endmsg;
-        return StatusCode::FAILURE;
-    }
-    ///Get Decoder
-    m_decoder = m_geomSvc->getDecoder(m_readout_name);
-    if (nullptr==m_decoder) {
-        error() << "Failed to get the decoder" << endmsg;
-        return StatusCode::FAILURE;
-    }
-
-
-    ///book tuple
-    NTuplePtr nt(ntupleSvc(), "RecGenfitAlgDC/recGenfitAlgDC");
-    if(nt){
-        m_tuple=nt;
-    }else{
-        m_tuple=ntupleSvc()->book("RecGenfitAlgDC/recGenfitAlgDC",
-                CLID_ColumnWiseTuple,"RecGenfitAlgDC");
-        if(m_tuple){
-            StatusCode sc;
-            sc=m_tuple->addItem("run",m_run);
-            sc=m_tuple->addItem("evt",m_evt);
-            sc=m_tuple->addItem("tkId",m_tkId);
-            sc=m_tuple->addItem("mcIndex",m_mcIndex,0,100);//max. 100 particles
-            sc=m_tuple->addItem("truthPocaMc",m_mcIndex,m_truthPocaMc,3);
-            sc=m_tuple->addItem("pocaPosMc",m_mcIndex,m_pocaPosMc,3);
-            sc=m_tuple->addItem("pocaMomMc",m_mcIndex,m_pocaMomMc,3);
-            sc=m_tuple->addItem("pocaMomMcP",m_mcIndex,m_pocaMomMcP);
-            sc=m_tuple->addItem("pocaMomMcPt",m_mcIndex,m_pocaMomMcPt);
-            sc=m_tuple->addItem("pocaPosMdc",3,m_pocaPosMdc);
-            sc=m_tuple->addItem("pocaMomMdc",3,m_pocaMomMdc);
-            sc=m_tuple->addItem("index",m_pidIndex, 0, 5);
-            sc=m_tuple->addItem("firstPosKalP",5,3,m_firstPosKal);
-            sc=m_tuple->addItem("firstMomKalP",5,m_firstMomKalP);
-            sc=m_tuple->addItem("firstMomKalPt",5,m_firstMomKalPt);
-            sc=m_tuple->addItem("pocaPosKal",5,3,m_pocaPosKal);
-            sc=m_tuple->addItem("pocaMomKal",5,3,m_pocaMomKal);
-            sc=m_tuple->addItem("pocaMomKalP",5,m_pocaMomKalP);
-            sc=m_tuple->addItem("pocaMomKalPt",5,m_pocaMomKalPt);
-            sc=m_tuple->addItem("chargeKal",5,m_chargeKal);
-            sc=m_tuple->addItem("nDofKal",5,m_nDofKal);
-            sc=m_tuple->addItem("chi2Kal",5,m_chi2Kal);
-            sc=m_tuple->addItem("isFitted",5,m_isFitted);
-            sc=m_tuple->addItem("isFitConverged",5,m_isFitConverged);
-            sc=m_tuple->addItem("isFitConvergedFully",5,
-                    m_isFitConvergedFully);
-            sc=m_tuple->addItem("nHitFailedKal",5,m_nHitFailedKal);
-            sc=m_tuple->addItem("nHitFitted",5,m_nHitFitted);
-            sc=m_tuple->addItem("nDigi",m_nDigi);
-            sc=m_tuple->addItem("nHitMc",m_nHitMc);
-            sc=m_tuple->addItem("nHitKalInput",m_nHitKalInput);
-            sc=m_tuple->addItem("nHitWithFitInfo",5,m_nHitWithFitInfo);
-            sc=m_tuple->addItem("nSimDCHit",m_nSimDCHit,0,50000);
-            sc=m_tuple->addItem("mdcHitDriftT",m_nSimDCHit,m_mdcHitDriftT);
-            sc=m_tuple->addItem("mdcHitDriftDl",m_nSimDCHit,m_mdcHitDriftDl);
-            sc=m_tuple->addItem("mdcHitDriftDr",m_nSimDCHit,m_mdcHitDriftDr);
-            sc=m_tuple->addItem("mdcHitLr",m_nSimDCHit,m_mdcHitLr);
-            sc=m_tuple->addItem("mdcHitLayer",m_nSimDCHit,m_mdcHitLayer);
-            sc=m_tuple->addItem("mdcHitWire",m_nSimDCHit,m_mdcHitWire);
-            sc=m_tuple->addItem("mdcHitExpDoca",m_nSimDCHit,m_mdcHitExpDoca);
-            sc=m_tuple->addItem("mdcHitExpMcDoca",m_nSimDCHit,m_mdcHitExpMcDoca);
-            sc=m_tuple->addItem("mdcHitErr",m_nSimDCHit,m_mdcHitErr);
-            sc=m_tuple->addItem("time",5,m_time);
-            sc=m_tuple->addItem("mdcHitMcTkId",m_nSimDCHit,m_mdcHitMcTkId);
-            sc=m_tuple->addItem("mdcHitMcLr",m_nSimDCHit,m_mdcHitMcLr);
-            sc=m_tuple->addItem("mdcHitMcDrift",m_nSimDCHit,m_mdcHitMcDrift);
-            sc=m_tuple->addItem("mdcHitMcX",m_nSimDCHit,m_mdcHitMcX);
-            sc=m_tuple->addItem("mdcHitMcY",m_nSimDCHit,m_mdcHitMcY);
-            sc=m_tuple->addItem("mdcHitMcZ",m_nSimDCHit,m_mdcHitMcZ);
-            sc=m_tuple->addItem("mcPocaX",m_nSimDCHit,m_mdcHitExpMcPocaX);
-            sc=m_tuple->addItem("mcPocaY",m_nSimDCHit,m_mdcHitExpMcPocaY);
-            sc=m_tuple->addItem("mcPocaZ",m_nSimDCHit,m_mdcHitExpMcPocaZ);
-            sc=m_tuple->addItem("mcPocaWireX",m_nSimDCHit,m_mdcHitExpMcPocaWireX);
-            sc=m_tuple->addItem("mcPocaWireY",m_nSimDCHit,m_mdcHitExpMcPocaWireY);
-            sc=m_tuple->addItem("mcPocaWireZ",m_nSimDCHit,m_mdcHitExpMcPocaWireZ);
-            debug()<< "Book tuple RecGenfitAlgDC/genfit" << endmsg;
-        }else{
-            error()<< "Cannot book tuple RecGenfitAlgDC/genfit" << endmsg;
-        }
-    }//end of book tuple
-
-    //init genfit event display
-    //if(m_showDisplay) m_genfitDisplay = genfit::EventDisplay::getInstance();
-
-    return StatusCode::SUCCESS;
-}
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-
-StatusCode RecGenfitAlgDC::execute()
-{
-    StatusCode sc;
-    m_timer=clock();
-    info()<<"RecGenfitAlgDC in execute()"<<endmsg;
-
-    /////retrieve EventHeader
-    //auto header = _headerCol.get()->at(0);
-    //int evtNo = header.getEventNumber();
-    //int runNo = header.getRunNumber();
-
-    //std::cout<<"run "<<header.getEventNumber()
-    //  <<" "<<header.getRunNumber()<<std::endl;
-
-    ///retrieve Track and TrackHits
-    const edm4hep::TrackCollection* dcTrackCol=nullptr;
-    dcTrackCol=m_dcTrackCol.get();
-    if(nullptr==dcTrackCol) {
-        debug()<<"TrackCollection not found"<<endmsg;
-        return StatusCode::SUCCESS;
-    }
-    const edm4hep::TrackerHitCollection* didiDCHitsCol=nullptr;
-    didiDCHitsCol=m_digiDCHitsCol.get();
-    if(nullptr==didiDCHitsCol) {
-        debug()<<"DigiDCHitCollection not found"<<endmsg;
-        return StatusCode::SUCCESS;
-    }
-    ///retrieve DC Hit Association
-    auto assoDCHitsCol=m_dcHitAssociationCol.get();
-
-    edm4hep::ReconstructedParticleCollection* dcRecParticleCol=
-        m_dcRecParticleCol.createAndPut();
-
-    ///----------------------------------------------------
-    ///Loop over Track and do fitting for each track
-    ///----------------------------------------------------
-    debug()<<"DCTrackCol size="<<dcTrackCol->size()<<endmsg;
-    for(auto dcTrack: *dcTrackCol){
-        ///Loop over 5 particle hypothesis(0-4): e,mu,pi,K,p
-        ///-1 for chargedgeantino
-        for(unsigned int pidType=0;pidType<m_nPDG;pidType++){
-            if((m_debugPid>=0) && (m_debugPid!=pidType)) continue;
-            ///-----------------------------------
-            ///Create a GenFit track
-            ///-----------------------------------
-            GenfitTrack* genfitTrack=new GenfitTrack(m_genfitField,
-                    m_gridDriftChamber);
-            genfitTrack->setDebug(m_debug);
-            double eventStartTime=0;
-            if(!genfitTrack->createGenfitTrackFromEDM4HepTrack(pidType,dcTrack,
-                        eventStartTime)){
-                debug()<<"createGenfitTrackFromEDM4HepTrack failed!"<<endmsg;
-                return StatusCode::SUCCESS;
-            }
-            if(m_useTruthHit){
-                if(0==genfitTrack->addSimTrackerHits(dcTrack,assoDCHitsCol,
-                            m_sigmaHit.value(),m_smearHit)){
-                    debug()<<"addSimTrackerHits failed!"<<endmsg;
-                    return StatusCode::FAILURE;
-                }
-            }else{
-                if(0==genfitTrack->addWireMeasurementOnTrack(dcTrack,
-                            m_sigmaHit.value())){
-                    debug()<<"addWireMeasurementOnTrack failed!"<<endmsg;
-                    return StatusCode::FAILURE;
-                }
-            }
-            if(m_debug) genfitTrack->printSeed();
-
-            ///-----------------------------------
-            ///call genfit fitting procedure
-            ///-----------------------------------
-            m_genfitFitter->processTrack(genfitTrack,m_resortHits);
-            m_genfitFitter->setDebug(m_debug);
-
-            ///-----------------------------------
-            ///Store track
-            ///-----------------------------------
-            auto dcRecParticle=dcRecParticleCol->create();
-            genfitTrack->storeTrack(dcRecParticle,pidType,m_ndfCut,
-                    m_chi2Cut);
-            if(m_debug) genfitTrack->printSeed();
-
-            if(m_tuple) debugTrack(pidType,genfitTrack);
-            if(m_showDisplay) {
-                //m_genfitDisplay->addEvent(genfitTrack->getTrack());
-                //m_genfitDisplay->open();
-            }else{
-                delete genfitTrack;
-            }
-            ++m_fitSuccess[pidType];
-        }//end loop over particle type
-    }//end loop over a track
-
-    if(m_tuple) debugEvent();
-
-
-    //if(m_genfitDisplay) while(1){
-    //    std::cout<<"Press any key to finish..."<<std::endl;
-    //    //system ("pause");
-    //}
-
-    if(m_tuple) sc=m_tuple->write();
-
-    return StatusCode::SUCCESS;
-}
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-
-StatusCode RecGenfitAlgDC::finalize()
-{
-    MsgStream log(msgSvc(), name());
-    info()<< "RecGenfitAlgDC in finalize()" << endmsg;
-
-    m_genfitFitter->writeHist();
-    delete m_genfitFitter;
-    info()<<"RecGenfitAlgDC nRecTrack="<<m_nDCTrack<<" success e "
-        <<m_fitSuccess[0]<<" mu "<<m_fitSuccess[1]<<" pi "<<m_fitSuccess[2]
-        <<" K "<<m_fitSuccess[3]<<" p "<<m_fitSuccess[4]<<std::endl;
-    if(m_nDCTrack>0){
-        std::cout<<"RecGenfitAlgDC Success rate = "<<std::endl;
-        for (int i=0;i<5;i++){
-            std::cout<<Form("%d %2.2f",i,((float) m_fitSuccess[i])/m_nDCTrack)
-                <<std::endl;
-        }
-    }
-    return StatusCode::SUCCESS;
-}
-
-void RecGenfitAlgDC::debugTrack(int pidType,const GenfitTrack* genfitTrack)
-{
-    /// Get fit status
-    const genfit::FitStatus* fitState = genfitTrack->getFitStatus();
-    int charge= fitState->getCharge();
-
-    m_chargeKal[pidType]= charge;
-    m_nHitWithFitInfo[pidType]=genfitTrack->getNumPointsWithFittedInfo();
-    m_chi2Kal[pidType]=fitState->getChi2();
-    m_nDofKal[pidType]=fitState->getNdf();
-    m_isFitted[pidType]=(int)fitState->isFitted();
-    m_isFitConverged[pidType]=(int) fitState->isFitConverged();
-    m_isFitConvergedFully[pidType]=(int) fitState->isFitConvergedFully();
-
-    ///get fitted state of track
-    TMatrixDSym fittedCov;
-    TLorentzVector fittedPos;
-    TVector3 fittedMom;
-    int fittedState=genfitTrack->getFittedState(fittedPos,fittedMom,fittedCov);
-    HelixClass helix;//mm and GeV
-    float pos[3]={float(fittedPos.X()/dd4hep::mm),float(fittedPos.Y()/dd4hep::mm),
-        float(fittedPos.Z()/dd4hep::mm)};
-    float mom[3]={float(fittedMom.X()),float(fittedMom.Y()),float(fittedMom.Z())};
-    helix.Initialize_VP(pos,mom,charge,m_genfitField->getBz(fittedPos.Vect()));
-    m_pocaMomKalP[pidType]=fittedMom.Mag();
-
-    if(m_debug>0){
-        /// Get fit status
-        debug()<<"evt "<<m_evt<<" fit result: get status OK? pidType "
-            <<pidType<<" fittedState "<<fittedState<<" isFitted "
-            <<m_isFitted[pidType]<<" isConverged "<<m_isFitConverged[pidType]
-            <<" isFitConvergedFully "<<m_isFitConvergedFully[pidType]
-            <<" ndf "<<m_nDofKal[pidType]
-            <<" chi2 "<<m_chi2Kal[pidType]<<endmsg;
-        if((0!=fittedState)||(!m_isFitted[pidType])||(m_nDofKal[pidType]<m_ndfCut)){
-            debug()<<"fitting failed"<<endmsg;
-        }else{
-            debug()<<"evt "<<m_evt<<" fit result: Pos("<<
-                fittedPos.X()<<" "<<
-                fittedPos.Y()<<" "<<
-                fittedPos.Z()<<") mom("<<
-                fittedMom.X()<<" "<<
-                fittedMom.Y()<<" "<<
-                fittedMom.Z()<<") p_tot "<<
-                fittedMom.Mag()<<" pt "<<
-                fittedMom.Perp()<<endmsg;
-        }
-    }
-
-}
-
-void RecGenfitAlgDC::debugEvent()
-{
-    const edm4hep::MCParticleCollection* mcParticleCol = nullptr;
-    const edm4hep::SimTrackerHitCollection* simDCHitCol=nullptr;
-
-    m_pidIndex=5;
-
-    mcParticleCol=m_mcParticleCol.get();
-    simDCHitCol=m_simDCHitCol.get();
-    m_nSimDCHit=simDCHitCol->size();
-    int iHit=0;
-    for(auto simDCHit: *simDCHitCol){
-        edm4hep::Vector3d pos=simDCHit.getPosition();
-        TVectorD p(3);
-        p[0]=pos.x;//no unit conversion here
-        p[1]=pos.y;
-        p[2]=pos.z;
-        m_mdcHitMcX[iHit]=pos.x;
-        m_mdcHitMcY[iHit]=pos.y;
-        m_mdcHitMcZ[iHit]=pos.z;
-        iHit++;
-    }
-    m_mcIndex=iHit;
-    int iMcParticle=0;
-    for(auto mcParticle : *mcParticleCol){
-        const auto& mcPocaMom = mcParticle.getMomentum();//GeV
-        float px=mcPocaMom.x;
-        float py=mcPocaMom.y;
-        float pz=mcPocaMom.z;
-        debug()<<"   "<<px<<" "<<py<<" "<<pz<<endmsg;
-        m_pocaMomMcP[iMcParticle]=sqrt(px*px+py*py+pz*pz);
-        iMcParticle++;
-    }
-
-}
diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h
deleted file mode 100644
index 14922bc6..00000000
--- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h
+++ /dev/null
@@ -1,190 +0,0 @@
-//////////////////////////////////////////////////////////////////////
-///
-/// This is an algorithm for track fitting for CEPC track with genfit.
-///
-/// In this file, including:
-///   An algorithm for drift chamber track fitting with genfit with 5 hypothesis
-///
-///   Units are following DD4hepUnits
-///
-/// Authors:
-///   Yao ZHANG(zhangyao@ihep.ac.cn)
-///
-/////////////////////////////////////////////////////////////////////
-
-#ifndef RECGENFITALG_RECGENFITALGDC_H
-#define RECGENFITALG_RECGENFITALGDC_H
-
-#include "GaudiAlg/GaudiAlgorithm.h"
-#include "GaudiKernel/NTuple.h"
-#include "k4FWCore/DataHandle.h"
-#include "DD4hep/Fields.h"
-#include <string>
-
-class GenfitFitter;
-class GenfitField;
-class GenfitTrack;
-class IGeomSvc;
-class time;
-namespace genfit{
-    class EventDisplay;
-}
-namespace dd4hep {
-    class Detector;
-    //class rec::CellIDPositionConverter;
-    namespace DDSegmentation{
-        class GridDriftChamber;
-        class BitFieldCoder;
-    }
-}
-namespace edm4hep{
-    class EventHeaderCollection;
-    class MCParticleCollection;
-    class SimTrackerHitCollection;
-    class TrackCollection;
-    class TrackerHitCollection;
-    class MCRecoTrackerAssociationCollection;
-    class ReconstructedParticle;
-    class ReconstructedParticleCollection;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-
-class RecGenfitAlgDC:public GaudiAlgorithm {
-    public:
-        RecGenfitAlgDC (const std::string& name, ISvcLocator* pSvcLocator);
-        StatusCode initialize() override;
-        StatusCode execute() override;
-        StatusCode finalize() override;
-
-    private:
-        GenfitFitter* m_genfitFitter;//The pointer to a GenfitFitter
-        const GenfitField* m_genfitField;//The pointer to a GenfitField
-
-        void debugTrack(int pidType,const GenfitTrack* genfitTrack);
-        void debugEvent();
-
-        DataHandle<edm4hep::EventHeaderCollection> _headerCol{
-            "EventHeaderCol", Gaudi::DataHandle::Reader, this};
-        //Drift chamber rec hit and trac
-        DataHandle<edm4hep::TrackerHitCollection> m_digiDCHitsCol{
-            "DigiDCHitCollection", Gaudi::DataHandle::Reader, this};
-        DataHandle<edm4hep::TrackCollection> m_dcTrackCol{
-            "DCTrackCollection", Gaudi::DataHandle::Reader, this};
-        //Mc truth
-        DataHandle<edm4hep::MCParticleCollection> m_mcParticleCol{
-            "MCParticle", Gaudi::DataHandle::Reader, this};
-        DataHandle<edm4hep::SimTrackerHitCollection> m_simDCHitCol{
-            "DriftChamberHitsCollection" , Gaudi::DataHandle::Reader, this};
-
-        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
-            m_dcHitAssociationCol{"DCHitAssociationCollection",
-                Gaudi::DataHandle::Reader, this};
-        //output hits and particles
-        DataHandle<edm4hep::TrackerHitCollection> m_dcFitRecHitCol{
-            "DCFitRecHitsCollection", Gaudi::DataHandle::Writer, this};
-        DataHandle<edm4hep::ReconstructedParticleCollection> m_dcRecParticleCol{
-            "DCRecParticleCollection", Gaudi::DataHandle::Writer, this};
-
-        const unsigned int m_nPDG;//5:e,mu,pi,K,proton
-        SmartIF<IGeomSvc> m_geomSvc;
-        dd4hep::OverlayedField m_dd4hepField;
-        dd4hep::Detector* m_dd4hep;
-        dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber;
-        dd4hep::DDSegmentation::BitFieldCoder* m_decoder;
-        Gaudi::Property<std::string> m_readout_name{this,
-            "readout", "DriftChamberHitsCollection"};
-        Gaudi::Property<int> m_debug{this,"debug",false};
-        Gaudi::Property<bool> m_smearHit{this,"smearHit",true};
-        Gaudi::Property<float> m_sigmaHit{this,"sigmaHit",0.11};//mm
-        Gaudi::Property<float> m_nSigmaHit{this,"nSigmaHit",5};
-        Gaudi::Property<double> m_initCovResPos{this,"initCovResPos",1};
-        Gaudi::Property<double> m_initCovResMom{this,"initCovResMom",0.1};
-        //Fitter type default is DAFRef.
-        //Candidates are DAF,DAFRef,KalmanFitter and KalmanFitterRefTrack.
-        Gaudi::Property<std::string> m_fitterType{this,"fitterTyep","DAFRef"};
-        Gaudi::Property<bool> m_correctBremsstrahlung{this,
-            "correctBremsstrahlung",false};
-        Gaudi::Property<bool> m_noMaterialEffects{this,
-            "noMaterialEffects",false};
-        Gaudi::Property<int> m_maxIteration{this,"maxIteration",20};
-        Gaudi::Property<int> m_resortHits{this,"resortHits",true};
-        Gaudi::Property<double> m_bStart{this,"bStart",100};
-        Gaudi::Property<double> m_bFinal{this,"bFinal",0.01};
-        Gaudi::Property<double> m_dcCornerCuts{this,"dcCornerCuts",-999};
-        Gaudi::Property<double> m_ndfCut{this,"ndfCut",1};
-        Gaudi::Property<double> m_chi2Cut{this,"chi2Cut",1000};
-        //-1,chargedGeantino;0,1,2,3,4:e,mu,pi,K,proton
-        Gaudi::Property<int> m_debugPid{this,"debugPid",-99};
-        Gaudi::Property<bool> m_useTruthTrack{this,"useTruthTrack",true};
-        Gaudi::Property<bool> m_useTruthHit{this,"useTruthHit",true};
-        Gaudi::Property<std::string> m_genfitHistRootName{this,
-            "genfitHistRootName",""};
-        Gaudi::Property<bool> m_showDisplay{this,"showDisplay",false};
-        int m_fitSuccess[5];
-        int m_nDCTrack;
-        //bool m_useRecLRAmbig;
-
-        genfit::EventDisplay* m_genfitDisplay;
-        clock_t m_timer;
-
-        /// tuples
-        NTuple::Tuple*  m_tuple;
-        NTuple::Item<int> m_run;
-        NTuple::Item<int> m_evt;
-        NTuple::Item<int> m_tkId;
-        NTuple::Item<int> m_mcIndex;//number of navigated mcParicle
-        NTuple::Matrix<double> m_truthPocaMc;//2 dim matched particle and 3 pos.
-        NTuple::Matrix<double> m_pocaPosMc;//2 dim matched particle and 3 pos.
-        NTuple::Matrix<double> m_pocaMomMc;//2 dim matched particle and 3 mom.
-        NTuple::Array<double> m_pocaMomMcP;//2 dim matched particle and p
-        NTuple::Array<double> m_pocaMomMcPt;//2 dim matched particle and pt
-        NTuple::Array<double> m_pocaPosMdc;//pos 0:x,1:y,2:z
-        NTuple::Array<double> m_pocaMomMdc;//mom. 0:px,1:py,2:pz
-        NTuple::Item<int> m_pidIndex;
-        NTuple::Matrix<double> m_firstPosKal;//5 hyposis and pos. at first
-        NTuple::Array<double> m_firstMomKalP;//5 hyposis and mom. at first
-        NTuple::Array<double> m_firstMomKalPt;//5 hyposis and mom. at first
-        NTuple::Matrix<double> m_pocaPosKal;//5 hyposis and 3 mom.
-        NTuple::Matrix<double> m_pocaMomKal;//5 hyposis and 3 mom.
-        NTuple::Array<double> m_pocaMomKalP;//5 hyposis and p
-        NTuple::Array<double> m_pocaMomKalPt;//5 hyposis and pt
-        NTuple::Array<int> m_chargeKal;
-        NTuple::Array<double> m_chi2Kal;
-        NTuple::Array<double> m_nDofKal;
-        NTuple::Array<int> m_isFitConverged;
-        NTuple::Array<int> m_isFitConvergedFully;
-        NTuple::Array<int> m_isFitted;
-        NTuple::Item<int> m_nDigi;
-        NTuple::Item<int> m_nHitMc;
-        NTuple::Item<int> m_nSimDCHit;
-        NTuple::Array<int> m_nHitWithFitInfo;
-        NTuple::Item<int> m_nHitKalInput;
-        NTuple::Array<double> m_mdcHitDriftT;
-        NTuple::Array<double> m_mdcHitDriftDl;
-        NTuple::Array<double> m_mdcHitDriftDr;
-        NTuple::Array<int> m_mdcHitLr;
-        NTuple::Array<int> m_mdcHitLayer;
-        NTuple::Array<int> m_mdcHitWire;
-        NTuple::Array<double> m_mdcHitExpDoca;
-        NTuple::Array<double> m_mdcHitExpMcDoca;
-        NTuple::Array<double> m_mdcHitErr;
-        NTuple::Array<int> m_nHitFailedKal;
-        NTuple::Array<int> m_nHitFitted;
-        NTuple::Array<double> m_time;
-        //truth
-        NTuple::Array<int> m_mdcHitMcLr;
-        NTuple::Array<int> m_mdcHitMcTkId;
-        NTuple::Array<double> m_mdcHitMcDrift;
-        NTuple::Array<double> m_mdcHitMcX;
-        NTuple::Array<double> m_mdcHitMcY;
-        NTuple::Array<double> m_mdcHitMcZ;
-        NTuple::Array<double> m_mdcHitExpMcPocaX;
-        NTuple::Array<double> m_mdcHitExpMcPocaY;
-        NTuple::Array<double> m_mdcHitExpMcPocaZ;
-        NTuple::Array<double> m_mdcHitExpMcPocaWireX;
-        NTuple::Array<double> m_mdcHitExpMcPocaWireY;
-        NTuple::Array<double> m_mdcHitExpMcPocaWireZ;
-
-};
-#endif
diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp
index c15dee5e..f83653a9 100644
--- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp
+++ b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp
@@ -35,6 +35,12 @@
 #include "TRandom.h"
 #include "TLorentzVector.h"
 
+//DD4hep
+#include "DD4hep/DetElement.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/DD4hepUnits.h"
+#include "CLHEP/Units/SystemOfUnits.h"
+
 //stl
 #include <chrono>
 #include "time.h"
@@ -62,10 +68,14 @@ DECLARE_COMPONENT( RecGenfitAlgSDT )
             "Handle of the input MCParticle collection");
     declareProperty("DigiDCHitCollection", m_DCDigiCol,
             "Handle of DC digi(TrakerHit) collection");
+    declareProperty("SignalDigiDCHitCollection", m_SignalDCDigiCol,
+            "Handle of Signal DC digi(TrakerHit) collection");
     declareProperty("DCHitAssociationCollection", m_DCHitAssociationCol,
             "Handle of DCsimTrackerHit and DCTrackerHit association collection");
     declareProperty("SDTTrackCollection", m_SDTTrackCol,
             "Handle of input silicon track collection");
+    declareProperty("SDTTrackFindCollection", m_SDTTrackFindCol,
+            "Handle of input silicon track finding collection");
     declareProperty("SDTRecTrackCollection",m_SDTRecTrackCol,
             "Handle of input silicon rec. track collection");
     declareProperty("DCTrackCollection", m_dcTrackCol,
@@ -74,22 +84,21 @@ DECLARE_COMPONENT( RecGenfitAlgSDT )
             "Handle of silicon+drift chamber rec. particle collection");
 
     declareProperty("SimTrackerHitCollection",m_simVXDHitCol,
-             "Handle of the VXDsimTrackerHit collection");
+            "Handle of the VXDsimTrackerHit collection");
     declareProperty("SimTrackerHitCollection",m_simSETHitCol,
-             "Handle of the SETsimTrackerHit collection");
+            "Handle of the SETsimTrackerHit collection");
+    declareProperty("TrackerHitCollection",m_SETHitCol,
+            "Handle of the SETTrackerHit collection");
+    declareProperty("MCRecoTrackerAssociationCollection",m_SETHitAssociationCol,
+            "Handle of the SETTrackerHitAssociation collection");
     declareProperty("SimTrackerHitCollection",m_simSITHitCol,
-             "Handle of the SITsimTrackerHit collection");
+            "Handle of the SITsimTrackerHit collection");
     declareProperty("SimTrackerHitCollection",m_simFTDHitCol,
-             "Handle of the FTDsimTrackerHit collection");
+            "Handle of the FTDsimTrackerHit collection");
     declareProperty("SimTrackerHitCollection",m_simDCHitCol,
-             "Handle of the DCsimTrackerHit collection");
+            "Handle of the DCsimTrackerHit collection");
     declareProperty("SimTrackerHitCollection",m_simVXDHitCol,
              "Handle of the VXDsimTrackerHit collection");
-    declareProperty("NoiseDCHitAssociationCollection",r_NoiseAssociationCol,
-             "Handle of the DCSimTrackerHits and Noise TrackerHit collection");
-
-    declareProperty("SmearDCHitAssociationCollection", r_SmearAssociationCol,
-            "Handle of output smear simulationhit and TrackerHit collection");
 
     declareProperty("DCTrackFindingHitCollection", m_DCTrackFindingCol,
             "Handle of output TrackFinding TrackerHit collection");
@@ -125,7 +134,6 @@ StatusCode RecGenfitAlgSDT::initialize()
             m_skipWireMaterial);
     m_genfitFitter->setEnergyLossBrems(m_correctBremsstrahlung);
     m_genfitFitter->setNoiseBrems(m_correctBremsstrahlung);
-    //genfit::eMultipleMeasurementHandling(m_multipleMeasurementHandling.value()));
     if(m_debug>10) m_genfitFitter->setDebug(m_debug-10);
     if(m_noMaterialEffects) m_genfitFitter->setNoEffects(true);
     if(-1==m_debugPid) m_genfitFitter->setNoEffects(true);
@@ -196,9 +204,6 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("pocaPosMdc",m_mcIndex,m_pocaPosMdc,3);
             sc=m_tuple->addItem("pocaMomMdc",m_mcIndex,m_pocaMomMdc,3);
             sc=m_tuple->addItem("index",m_pidIndex, 0, 5);
-            //sc=m_tuple->addItem("firstPosKalP",5,3,m_firstPosKal);
-            //sc=m_tuple->addItem("firstMomKalP",5,m_firstMomKalP);
-            //sc=m_tuple->addItem("firstMomKalPt",5,m_firstMomKalPt);
 
             sc=m_tuple->addItem("ErrorcovMatrix6",m_mcIndex,m_ErrorcovMatrix6,6);
             sc=m_tuple->addItem("McErrCov",m_mcIndex,m_McErrCov,6);
@@ -210,6 +215,10 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("momy",m_mcIndex,m_momy);
             sc=m_tuple->addItem("momz",m_mcIndex,m_momz);
 
+            sc=m_tuple->addItem("fittedXc",m_mcIndex,m_fittedXc);
+            sc=m_tuple->addItem("fittedYc",m_mcIndex,m_fittedYc);
+            sc=m_tuple->addItem("fittedR",m_mcIndex,m_fittedR);
+
             sc=m_tuple->addItem("PosMcX",m_mcIndex,m_PosMcX);
             sc=m_tuple->addItem("PosMcY",m_mcIndex,m_PosMcY);
             sc=m_tuple->addItem("PosMcZ",m_mcIndex,m_PosMcZ);
@@ -235,6 +244,10 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("Z0",m_mcIndex,m_Z0);
             sc=m_tuple->addItem("tanLambda",m_mcIndex,m_tanLambda);
 
+            sc=m_tuple->addItem("trackXc",m_mcIndex,m_trackXc);
+            sc=m_tuple->addItem("trackYc",m_mcIndex,m_trackYc);
+            sc=m_tuple->addItem("trackR",m_mcIndex,m_trackR);
+
             sc=m_tuple->addItem("ErrorcovMatrix_Origin",m_mcIndex,m_ErrorcovMatrix_Origin,15);
             sc=m_tuple->addItem("D0_Origin",m_mcIndex,m_D0_Origin);
             sc=m_tuple->addItem("phi_Origin",m_mcIndex,m_phi_Origin);
@@ -248,6 +261,10 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("mcP_Z0",m_mcIndex,mcP_Z0);
             sc=m_tuple->addItem("mcP_tanLambda",m_mcIndex,mcP_tanLambda);
 
+            sc=m_tuple->addItem("mcP_Xc",m_mcIndex,mcP_Xc);
+            sc=m_tuple->addItem("mcP_Yc",m_mcIndex,mcP_Yc);
+            sc=m_tuple->addItem("mcP_R",m_mcIndex,mcP_R);
+
             sc=m_tuple->addItem("pocaPosKal",5,3,m_pocaPosKal);
             sc=m_tuple->addItem("pocaMomKal",5,3,m_pocaMomKal);
             sc=m_tuple->addItem("pocaMomKalP",m_mcIndex,m_pocaMomKalP,5);
@@ -256,6 +273,10 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("nDofKal",m_mcIndex,m_nDofKal,5);
             sc=m_tuple->addItem("chi2Kal",m_mcIndex,m_chi2Kal,5);
             sc=m_tuple->addItem("isFitted",m_mcIndex,m_isFitted,5);
+            sc=m_tuple->addItem("PDG",m_mcIndex,m_PDG);
+            sc=m_tuple->addItem("numDCOnTrack",m_mcIndex,m_numDCOnTrack);
+            sc=m_tuple->addItem("salDCHits",m_mcIndex,m_salDCHits);
+            sc=m_tuple->addItem("DCHitsCol",m_mcIndex,m_DCHitsCol);
             sc=m_tuple->addItem("isFitConverged",m_mcIndex,m_isFitConverged,5);
             sc=m_tuple->addItem("isFitConvergedFully",m_mcIndex,
                     m_isFitConvergedFully,5);
@@ -263,33 +284,11 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("nHitFailedKal",m_mcIndex,m_nHitFailedKal,5);
             sc=m_tuple->addItem("nHitFitted",m_mcIndex,m_nHitFitted,5);
             sc=m_tuple->addItem("nDCDigi",m_nDCDigi,0,50000);
-            sc=m_tuple->addItem("nTruthDCDigi",m_nTruthDCDigi,0,50000);
+            sc=m_tuple->addItem("nSignalDCDigi",m_nSignalDCDigi,0,50000);
             sc=m_tuple->addItem("nHitKalInput",m_nHitKalInput,0,300000);
             //10 is greater than # of tracking detectors
             sc=m_tuple->addItem("hitDetID",10,m_nHitDetType);
             sc=m_tuple->addItem("nHitWithFitInfo",m_mcIndex,m_nHitWithFitInfo,5);
-            sc=m_tuple->addItem("nSimDCHit",m_nSimDCHit,0,10000000);
-            sc=m_tuple->addItem("mdcHitDriftT",m_nSimDCHit,m_mdcHitDriftT);
-            sc=m_tuple->addItem("mdcHitDriftDl",m_nSimDCHit,m_mdcHitDriftDl);
-            sc=m_tuple->addItem("mdcHitDriftDr",m_nSimDCHit,m_mdcHitDriftDr);
-            sc=m_tuple->addItem("mdcHitLr",m_nSimDCHit,m_mdcHitLr);
-            sc=m_tuple->addItem("mdcHitLayer",m_nSimDCHit,m_mdcHitLayer);
-            sc=m_tuple->addItem("mdcHitWire",m_nSimDCHit,m_mdcHitWire);
-            sc=m_tuple->addItem("mdcHitExpDoca",m_nSimDCHit,m_mdcHitExpDoca);
-            sc=m_tuple->addItem("mdcHitExpMcDoca",m_nSimDCHit,m_mdcHitExpMcDoca);
-            sc=m_tuple->addItem("mdcHitErr",m_nSimDCHit,m_mdcHitErr);
-            sc=m_tuple->addItem("exeTime",m_exeTime);
-            sc=m_tuple->addItem("mdcHitMcTkId",m_nSimDCHit,m_mdcHitMcTkId);
-            sc=m_tuple->addItem("mdcHitMcLr",m_nSimDCHit,m_mdcHitMcLr);
-            sc=m_tuple->addItem("mdcHitMcDrift",m_nSimDCHit,m_mdcHitMcDrift);
-            sc=m_tuple->addItem("mdcHitMcX",m_nSimDCHit,m_mdcHitMcX);
-            sc=m_tuple->addItem("mdcHitMcY",m_nSimDCHit,m_mdcHitMcY);
-            sc=m_tuple->addItem("mdcHitMcZ",m_nSimDCHit,m_mdcHitMcZ);
-            sc=m_tuple->addItem("mcPocaX",m_nSimDCHit,m_mdcHitExpMcPocaX);
-            sc=m_tuple->addItem("mcPocaY",m_nSimDCHit,m_mdcHitExpMcPocaY);
-            sc=m_tuple->addItem("mcPocaZ",m_nSimDCHit,m_mdcHitExpMcPocaZ);
-            sc=m_tuple->addItem("mcPocaWireY",m_nSimDCHit,m_mdcHitExpMcPocaWireY);
-            sc=m_tuple->addItem("mcPocaWireZ",m_nSimDCHit,m_mdcHitExpMcPocaWireZ);
 
             sc=m_tuple->addItem("dcDigiChamber",m_nDCDigi,m_dcDigiChamber);
             sc=m_tuple->addItem("dcDigiLayer",m_nDCDigi,m_dcDigiLayer);
@@ -311,6 +310,8 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("dcDigiMcPosX",m_nDCDigi,m_dcDigiMcPosX);
             sc=m_tuple->addItem("dcDigiMcPosY",m_nDCDigi,m_dcDigiMcPosY);
             sc=m_tuple->addItem("dcDigiMcPosZ",m_nDCDigi,m_dcDigiMcPosZ);
+            sc=m_tuple->addItem("docaTrack",m_nDCDigi,m_docaTrack);
+            sc=m_tuple->addItem("isNoise",m_nDCDigi,m_isNoise);
             sc=m_tuple->addItem("firstMomMc",m_firstMomMc);
 
             sc=m_tuple->addItem("dcDigiDocaExt",m_nDCDigi,m_dcDigiDocaExt);
@@ -318,17 +319,9 @@ StatusCode RecGenfitAlgSDT::initialize()
             sc=m_tuple->addItem("dcDigiPocaExtY",m_nDCDigi,m_dcDigiPocaExtY);
             sc=m_tuple->addItem("dcDigiPocaExtZ",m_nDCDigi,m_dcDigiPocaExtZ);
 
-            sc=m_tuple->addItem("nTrackerHitDC",m_nTrackerHitDC,0,1000);
-            sc=m_tuple->addItem("trackLength",m_nTrackerHitDC,m_trackLength);
-            sc=m_tuple->addItem("hitMomEdep",m_nTrackerHitDC,m_hitMomEdep);
-            sc=m_tuple->addItem("truthMomedep",m_nTrackerHitDC,m_truthMomEdep);
-            sc=m_tuple->addItem("driftDis",m_nTrackerHitDC,m_driftDis);
-            sc=m_tuple->addItem("FittedDoca",m_nTrackerHitDC,m_FittedDoca);
-            sc=m_tuple->addItem("truthDoca",m_nTrackerHitDC,m_truthDoca);
-            sc=m_tuple->addItem("Res",m_nTrackerHitDC,m_Res);
-            sc=m_tuple->addItem("truthRes",m_nTrackerHitDC,m_truthRes);
-            sc=m_tuple->addItem("nTrackerHitSDT",m_nTrackerHitSDT);
-            sc=m_tuple->addItem("nGenFitTrackerHit",m_nGenFitTrackerHit);
+            sc=m_tuple->addItem("nTrackerHitDC",100,m_nTrackerHitDC);
+            sc=m_tuple->addItem("nTrackerFitHitDC",100,m_nTrackerFitHitDC);
+            sc=m_tuple->addItem("nTrackerHitSDT",100,m_nTrackerHitSDT);
             debug()<< "Book tuple RecGenfitAlgSDT/recGenfitAlgSDT" << endmsg;
         }else{
             warning()<<"Tuple RecGenfitAlgSDT/recGenfitAlgSDT not booked"<<endmsg;
@@ -355,19 +348,21 @@ StatusCode RecGenfitAlgSDT::execute()
 
     StatusCode sc=StatusCode::SUCCESS;
 
-    std::cout<<" RecGenfitAlgSDT execute eventNo  "<<m_eventNo<<std::endl;
     if(m_debug&&(abs(m_eventNoSelection)<1e8)&&m_eventNo!=m_eventNoSelection){
         ++m_eventNo;
         return sc;
     }
-    ++m_eventNo;
 
     std::chrono::time_point<std::chrono::high_resolution_clock> start;
     if(m_tuple) start=std::chrono::high_resolution_clock::now();
 
     ///retrieve silicon Track and TrackHits
     const edm4hep::TrackCollection* sdtTrackCol=nullptr;
-    if(m_SDTTrackCol.exist())sdtTrackCol=m_SDTTrackCol.get();
+    if(!m_useTrackFinding){
+        if(m_SDTTrackCol.exist())sdtTrackCol=m_SDTTrackCol.get();
+    } else {
+        if(m_SDTTrackFindCol.exist())sdtTrackCol=m_SDTTrackFindCol.get();
+    }
     if(nullptr==sdtTrackCol || sdtTrackCol->size()<=0) {
         debug()<<"TrackCollection not found or sdtTrackCol size=0"<<endmsg;
         return StatusCode::SUCCESS;
@@ -387,18 +382,21 @@ StatusCode RecGenfitAlgSDT::execute()
     }
     const edm4hep::MCParticleCollection* mcParticleCol=nullptr;
     mcParticleCol=m_mcParticleCol.get();//FIXME get error when call exist()
-    std::cout << " MCParticleCol size = " << mcParticleCol->size() << std::endl;
     if(nullptr==mcParticleCol){
         debug()<<"MCParticleCollection not found"<<endmsg;
         return StatusCode::SUCCESS;
     }
+
+    //SET SimTrackerHits
+    const edm4hep::TrackerHitCollection* SETHits = m_SETHitCol.get();
+
     ///----------------------------------------------------
     ///Loop over Track and do fitting for each track
     ///----------------------------------------------------
     m_firstTuple=true;
     debug()<<"SDTTrackCol size="<<sdtTrackCol->size()<<endmsg;
     int iSdtTrack = 0;
-    int nFittedSDT,nFittedDC,ngenfitHit;
+    int nDC,nSDT,nFittedSDT,nFittedDC,ngenfitHit;
     std::vector<double> trackL;
     std::vector<double> hitMom;
     std::vector<float> truthMomEdep;
@@ -407,16 +405,31 @@ StatusCode RecGenfitAlgSDT::execute()
     std::vector<double> truthDoca;
     std::vector<double> Res;
     std::vector<double> truthRes;
+    std::vector<int> isRecNoise;
+    std::vector<int> isRecFitNoise;
+    std::vector<int> layerFit;
+    std::vector<int> wireIDFit;
+    std::vector<int> layerIDRec;
+    std::vector<int> wireIDRec;
+    std::vector<double> extrapoLen;
+
+    std::vector<double> docaTrack;
+    std::vector<int> isNoise;
     for(auto sdtTrack: *sdtTrackCol)
     {
         if(sdtTrack.trackerHits_size()<1e-9) continue;
+
+        //------------------------------------
+        //Add SET hit
+        //------------------------------------
+        if(m_addSET) addSETHitsToTk(sdtTrack,m_SETHitAssociationCol.get(),SETHits);
+
         ///Loop over 5 particle hypothesis(0-4): e,mu,pi,K,p
         ///-1 for chargedgeantino
         for(unsigned int pidType=0;pidType<m_nPDG;pidType++)
         {
             if((m_debugPid>=0) && (m_debugPid!=pidType)) continue;
             debug()<<"processing pidType "<<pidType<<endmsg;
-            std::cout<<"processing pidType "<<pidType<<std::endl;
             ///-----------------------------------
             ///Create a GenFit track
             ///-----------------------------------
@@ -430,7 +443,6 @@ StatusCode RecGenfitAlgSDT::execute()
                 delete genfitTrack;
                 continue;
             }
-            //}
 
             ///-----------------------------------
             ///Add hits on track
@@ -460,15 +472,9 @@ StatusCode RecGenfitAlgSDT::execute()
                     std::vector<edm4hep::TrackerHit*> tmp;
                     selectedHits.swap(tmp);
                 }else{
-                    if(m_useNoiseDCHit){
-                        nHitAdded+=genfitTrack->addWireMeasurementsOnTrack(sdtTrack,
-                                m_sigmaHitU[0],r_NoiseAssociationCol.get(),m_sortMethod,m_truthAmbig,
-                                m_skipCorner,m_skipNear);//mm
-                     } else {
-                        nHitAdded+=genfitTrack->addWireMeasurementsOnTrack(sdtTrack,
-                                m_sigmaHitU[0],r_SmearAssociationCol.get(),m_sortMethod,m_truthAmbig,
-                                m_skipCorner,m_skipNear);//mm
-                     }
+                    nHitAdded+=genfitTrack->addWireMeasurementsOnTrack(sdtTrack,
+                            m_sigmaHitU[0],assoDCHitsCol,m_sortMethod,m_truthAmbig,
+                            m_skipCorner,m_skipNear);//mm
                 }
             }
 
@@ -488,6 +494,36 @@ StatusCode RecGenfitAlgSDT::execute()
             m_genfitFitter->setDebugGenfit(m_debugGenfit);
             m_genfitFitter->processTrack(genfitTrack,m_resortHits.value());
 
+            //------
+            //salvage hits
+            //single particle
+            //------
+            int nAddHits = 0;
+            int pdg = genfitTrack->getPDG();
+            m_PDG[iSdtTrack] = pdg;
+            int numDC;
+
+            if(m_useSalHits){
+                nAddHits = genfitTrack->salvageHits(pdg,mcParticleCol,dCDigiCol,
+                        assoDCHitsCol,m_sigmaHitU[0],m_truthAmbig,m_skipCorner,m_skipNear,
+                        m_extraCut,m_extraDocaCut,docaTrack,isNoise,numDC);
+                bool status = genfitTrack->sortedHitOnTrack(pdg);
+                m_genfitFitter->processTrackWithRep(genfitTrack,0,m_resortHits);
+
+                int iFiter =0;
+                int dcFitNum;
+                while(iFiter<m_iterFit){
+                    double chi2Fit = genfitTrack->checkGenfitTrack(dcFitNum);
+                    if(chi2Fit<m_chi2FitCut && dcFitNum > m_dcFitNum) break;
+                    m_genfitFitter->processTrackWithRep(genfitTrack,0,m_resortHits);
+                    iFiter++;
+                }
+            }
+
+            m_numDCOnTrack[iSdtTrack] = numDC;
+            m_salDCHits[iSdtTrack] = nAddHits;
+            m_DCHitsCol[iSdtTrack] = dCDigiCol->size();
+
             ///-----------------------------------
             ///Store track
             ///-----------------------------------
@@ -499,9 +535,10 @@ StatusCode RecGenfitAlgSDT::execute()
             edm4hep::TrackState pocaToOrigin_trackState;
             if(!genfitTrack->storeTrack(dcRecParticle,dcRecTrack,
                         pocaToOrigin_pos,pocaToOrigin_mom,pocaToOrigin_cov,
-                        pidType,m_ndfCut,m_chi2Cut,nFittedDC,nFittedSDT,
+                        pidType,m_ndfCut,m_chi2Cut,nDC,nSDT,nFittedDC,nFittedSDT,
                         ngenfitHit,trackL,hitMom,truthMomEdep,assoDCHitsCol,
-                        driftDis,FittedDoca,truthDoca,Res,truthRes)){
+                        driftDis,FittedDoca,truthDoca,Res,truthRes,isRecNoise,isRecFitNoise,
+                        layerFit,wireIDFit,layerIDRec,wireIDRec,extrapoLen)){
                 debug()<<"Fitting failed!"<<std::endl;
             }else{
                 ++m_fitSuccess[pidType];
@@ -520,31 +557,25 @@ StatusCode RecGenfitAlgSDT::execute()
                 delete genfitTrack;
             }
         }//end loop over particle type
+        if(m_tuple) {
+            m_nTrackerHitDC[iSdtTrack] = nDC;
+            m_nTrackerFitHitDC[iSdtTrack] = nFittedDC;
+            m_nTrackerHitSDT[iSdtTrack] = nSDT;
+        }
         ++iSdtTrack;
     }//end loop over a track
     m_nRecTrack++;
-
+    
     if(m_tuple) {
-        m_nTrackerHitDC = nFittedDC;
-        m_nTrackerHitSDT = nFittedSDT;
-        m_nGenFitTrackerHit = ngenfitHit;
-        for(int i=0;i<trackL.size();i++) m_trackLength[i] = trackL[i];
-        for(int i=0;i<hitMom.size();i++) m_hitMomEdep[i] = hitMom[i];
-        for(int i=0;i<truthMomEdep.size();i++) m_truthMomEdep[i] = truthMomEdep[i];
-        for(int i=0;i<driftDis.size();i++) m_driftDis[i] = driftDis[i];
-        for(int i=0;i<FittedDoca.size();i++) m_FittedDoca[i] = FittedDoca[i];
-        for(int i=0;i<truthDoca.size();i++) m_truthDoca[i] = truthDoca[i];
-        for(int i=0;i<Res.size();i++) m_Res[i] = Res[i];
-        for(int i=0;i<truthRes.size();i++) m_truthRes[i] = truthRes[i];
         auto finish = std::chrono::high_resolution_clock::now();
         std::chrono::duration<double> elapsed = finish - start;
         debug() << "Elapsed time: " << elapsed.count() << " s"<<endmsg;
-        m_exeTime=elapsed.count();
         debugEvent(sdtTrackCol,sdtRecTrackCol,eventStartTime,nFittedSDT);
     }
-
+    
     if(m_tuple) sc=m_tuple->write();
-
+    
+    ++m_eventNo;
     return StatusCode::SUCCESS;
 }
 
@@ -657,6 +688,7 @@ void RecGenfitAlgSDT::debugTrack(int iStrack,int pidType,const GenfitTrack* genf
     helix.Initialize_VP(pos,mom,charge,m_genfitField->getBz(fittedPos.Vect())/GenfitUnit::tesla);
     helix_origin.Initialize_VP(pocaToOrigin_Pos,pocaToOrigin_Mom,charge,m_genfitField->getBz(pocaToOrigin_POS.Vect())/GenfitUnit::tesla);
     m_pocaMomKalP[iStrack][pidType]=fittedMom.Mag();
+    m_pocaMomKalPt[iStrack][pidType]=fittedMom.Perp();
 
     TMatrixDSym covMatrix_6=pocaToOrigin_cov;
     for(int i=0;i<5;i++){
@@ -681,6 +713,10 @@ void RecGenfitAlgSDT::debugTrack(int iStrack,int pidType,const GenfitTrack* genf
     m_Z0_Origin[iStrack] = helix_origin.getZ0();
     m_tanLambda_Origin[iStrack] = helix_origin.getTanLambda();
 
+    m_fittedXc[iStrack] = helix.getXC();
+    m_fittedYc[iStrack] = helix.getYC();
+    m_fittedR[iStrack] = helix.getRadius();
+
     m_evt=m_eventNo;
     /// Get fit status
     if((0!=fittedState)||(!m_isFitted[pidType])||(m_nDofKal[iStrack][pidType]>m_ndfCut)){
@@ -779,6 +815,10 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol,
             mcP_Z0[iMcParticle] = helix_mcP.getZ0();
             mcP_tanLambda[iMcParticle] = helix_mcP.getTanLambda();
 
+            mcP_Xc[iMcParticle] = helix_mcP.getXC();
+            mcP_Yc[iMcParticle] = helix_mcP.getYC();
+            mcP_R[iMcParticle] = helix_mcP.getRadius();
+
             debug()<< "debugEvent Bz " << m_genfitField->getBz(mcPos)/GenfitUnit::tesla
                 << "Tesla mc d0= " << mcP_D0
                 << " phi0= " << mcP_phi
@@ -802,21 +842,6 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol,
         m_mcIndex=iMcParticle;
     }
 
-    int iHit=0;
-    simHitCol=m_simDCHitCol.get();
-    for(auto simHit: *simHitCol){
-        edm4hep::Vector3d pos=simHit.getPosition();
-        TVectorD p(3);
-        p[0]=pos.x;//no unit conversion here
-        p[1]=pos.y;
-        p[2]=pos.z;
-        m_mdcHitMcX[iHit]=pos.x;
-        m_mdcHitMcY[iHit]=pos.y;
-        m_mdcHitMcZ[iHit]=pos.z;
-        iHit++;
-    }
-    m_nSimDCHit=simHitCol->size();
-
     m_nSdtRecTrack=sdtRecTrackCol->size();
     int isdttrack=0;
     for(auto sdtRecTrack: *sdtRecTrackCol){
@@ -837,10 +862,24 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol,
             m_omega[isdttrack] = trackStat.omega;
             m_Z0[isdttrack] = trackStat.Z0;
             m_tanLambda[isdttrack] = trackStat.tanLambda;
+
+            HelixClass helix;
+            helix.Initialize_Canonical(trackStat.phi,trackStat.D0,
+                    trackStat.Z0,trackStat.omega,trackStat.tanLambda,
+                    m_genfitField->getBz({0.,0.,0.})/GenfitUnit::tesla);
+
+            m_trackXc[isdttrack] = helix.getXC();
+            m_trackYc[isdttrack] = helix.getYC();
+            m_trackR[isdttrack] = helix.getRadius();
+
         }
         ++isdttrack;
     }
 
+    //signal digi hit
+    const edm4hep::TrackerHitCollection* SignaldCDigiCol=m_SignalDCDigiCol.get();
+    m_nSignalDCDigi=SignaldCDigiCol->size();
+
     //debug digi
     const edm4hep::TrackerHitCollection* dCDigiCol=nullptr;
     dCDigiCol=m_DCDigiCol.get();
@@ -866,9 +905,7 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol,
 
 
         //get information from associated simTrackerHit
-        //edm4hep::SimTrackerHit dcSimTrackerHit;
         auto dcSimTrackerHit=CEPC::getAssoClosestSimTrackerHit(m_DCHitAssociationCol.get(),dcDigi,m_gridDriftChamber,0);
-        //const edm4hep::MCRecoTrackerAssociationCollection* assoHits=m_DCHitAssociationCol.get();
         m_dcDigiMcMomX[iDCDigi]=dcSimTrackerHit.getMomentum().x*GenfitUnit::GeV;
         m_dcDigiMcMomY[iDCDigi]=dcSimTrackerHit.getMomentum().y*GenfitUnit::GeV;
         m_dcDigiMcMomZ[iDCDigi]=dcSimTrackerHit.getMomentum().z*GenfitUnit::GeV;
@@ -970,3 +1007,78 @@ void RecGenfitAlgSDT::selectHits(const edm4hep::Track&,
     }//end loop over track
     delete genfitTrack;
 }//end of select hit
+
+bool RecGenfitAlgSDT::addHitsToTk(edm4hep::TrackerHit hit,edm4hep::Track& track,
+        const char* msg) const
+{
+    edm4hep::MutableTrack _track = track.clone();
+    _track.addToTrackerHits(hit);
+    track = _track;
+    return true;
+}
+
+double RecGenfitAlgSDT::getSETRadius(){
+
+    dd4hep::DetElement world = m_geomSvc->getDD4HepGeo();
+    const std::map<std::string, dd4hep::DetElement>& subs = world.children();
+    for(std::map<std::string, dd4hep::DetElement>::const_iterator it=subs.begin();it!=subs.end();it++){
+        if(it->first=="SET"){
+            dd4hep::DetElement set = it->second;
+
+            dd4hep::rec::ZPlanarData* setData = nullptr;
+            try{
+                setData = set.extension<dd4hep::rec::ZPlanarData>();
+            }
+            catch(std::runtime_error& e){
+                warning() << e.what() << " " << setData << endmsg;
+                return 0;
+            }
+
+            std::vector<dd4hep::rec::ZPlanarData::LayerLayout>& setlayers = setData->layers;
+            const int nLayers = setlayers.size()-1;
+            dd4hep::rec::ZPlanarData::LayerLayout& layout = setlayers[nLayers];
+            double supRMin = layout.distanceSupport*CLHEP::cm;
+            double senRMin = layout.distanceSensitive*CLHEP::cm;
+            std::cout << " getSETRadius supRMin = " << supRMin << " senRMin = " << senRMin << std::endl;
+
+            return supRMin;
+        }else continue;
+    }
+}
+
+void RecGenfitAlgSDT::addSETHitsToTk(edm4hep::Track& track,
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        const edm4hep::TrackerHitCollection* SETHits)
+{
+    TVector3 SETPos,SETMom;
+
+    edm4hep::TrackState trackStat=track.getTrackStates(0);//FIXME?
+    edm4hep::TrackerHit trackHit  = track.getTrackerHits(0);
+    HelixClass helixClass;
+    helixClass.Initialize_Canonical(trackStat.phi,trackStat.D0,
+            trackStat.Z0,trackStat.omega,trackStat.tanLambda,
+            m_genfitField->getBz({0.,0.,0.})/GenfitUnit::tesla);
+    double SETRadius = getSETRadius(); // mm;
+    float refPos[3],Point[6];
+    float helixMom[3];
+    helixClass.getPointOnCircle(SETRadius,refPos,Point); //mm
+    helixClass.getExtrapolatedMomentum(Point,helixMom);//mm
+    SETPos.SetXYZ(Point[0],Point[1],Point[2]);
+    SETMom.SetXYZ(helixMom[0],helixMom[1],helixMom[2]);
+    for(int i=0;i<SETHits->size();i++){
+        edm4hep::TrackerHit SETHit = SETHits->at(i);
+        TVector3 SETHitPos(SETHit.getPosition()[0],
+                SETHit.getPosition()[1],SETHit.getPosition()[2]);
+        if(abs(SETPos.X()-SETHitPos.X())<m_cutSETPos &&
+                abs(SETPos.Y()-SETHitPos.Y())<m_cutSETPos &&
+                abs(SETPos.Z()-SETHitPos.Z())<m_cutSETPos ){
+            const edm4hep::SimTrackerHit simTrackerhit =
+                CEPC::getAssoSimTrackerHit(assoHits,SETHit);
+            if(addHitsToTk(SETHit,track,"SET digi hit")){
+                debug()<<"add SET digi hit 1  trackerHit"<<endmsg;
+            }
+
+        }
+    }
+}
+
diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h
index 60fe9cf8..2fb36e25 100644
--- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h
+++ b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h
@@ -34,7 +34,6 @@ namespace genfit{
 }
 namespace dd4hep {
     class Detector;
-    //class rec::CellIDPositionConverter;
     namespace DDSegmentation{
         class GridDriftChamber;
         class BitFieldCoder;
@@ -67,18 +66,25 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
         const GenfitField* m_genfitField;//The pointer to a GenfitField
 
         void debugTrack(int iStrack,int pidType,const GenfitTrack* genfitTrack,
-                        TVector3 pocaToOrigin_pos,TVector3 pocaToOrigin_mom,
-                        TMatrixDSym pocaToOrigin_cov);
+                TVector3 pocaToOrigin_pos,TVector3 pocaToOrigin_mom,
+                TMatrixDSym pocaToOrigin_cov);
         void debugEvent(const edm4hep::TrackCollection* sdtTrackCol,
                 const edm4hep::TrackCollection* sdtRecTrackCol,
                 double eventStartTime,int nFittedSDT);
 
         void selectHits(const edm4hep::Track&, std::vector<edm4hep::TrackerHit*>& dcDigiSelected);
+        bool addHitsToTk(edm4hep::TrackerHit hit,edm4hep::Track& track,const char* msg) const;
+        double getSETRadius();
+        void addSETHitsToTk(edm4hep::Track& track,
+                const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+                const edm4hep::TrackerHitCollection* SETHits);
 
         DataHandle<edm4hep::EventHeaderCollection> m_headerCol{
             "EventHeaderCol", Gaudi::DataHandle::Reader, this};
         DataHandle<edm4hep::TrackerHitCollection> m_DCDigiCol{
             "DigiDCHitCollection", Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::TrackerHitCollection> m_SignalDCDigiCol{
+            "SignalDigiDCHitCollection", Gaudi::DataHandle::Reader, this};
         //Mc truth
         DataHandle<edm4hep::SimTrackerHitCollection> m_simVXDHitCol{
             "VXDCollection", Gaudi::DataHandle::Reader, this};
@@ -110,23 +116,19 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
             m_FTDHitAssociationCol{"FTDTrackerHitAssociation",
                 Gaudi::DataHandle::Reader, this};
 
+        DataHandle<edm4hep::TrackerHitCollection> m_SETHitCol{
+            "SETTrackerHits",Gaudi::DataHandle::Reader, this};
+
         //Track from silicon detectors
         DataHandle<edm4hep::TrackCollection> m_SDTTrackCol{"SDTTrackCollection",
             Gaudi::DataHandle::Writer, this};
+        DataHandle<edm4hep::TrackCollection> m_SDTTrackFindCol{"SDTTrackFindCollection",
+            Gaudi::DataHandle::Writer, this};
         DataHandle<edm4hep::TrackCollection> m_SDTRecTrackCol{"SDTRecTrackCollection",
             Gaudi::DataHandle::Writer, this};
         DataHandle<edm4hep::TrackCollection> m_SDTDebugRecTrackCol{"SDTDebugRecTrackCollection",
             Gaudi::DataHandle::Writer, this};
 
-        //Smear
-        DataHandle<edm4hep::MCRecoTrackerAssociationCollection> r_SmearAssociationCol{
-            "SmearDCHitAssociationCollection", Gaudi::DataHandle::Reader, this};
-
-
-        //Noise
-        DataHandle<edm4hep::MCRecoTrackerAssociationCollection> r_NoiseAssociationCol{
-            "NoiseDCHitAssociationCollection", Gaudi::DataHandle::Reader, this};
-
         //Track Finding
         DataHandle<edm4hep::TrackerHitCollection> m_DCTrackFindingCol{
             "DCTrackFindingHitCollection",Gaudi::DataHandle::Reader, this};
@@ -145,6 +147,7 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
         dd4hep::DDSegmentation::BitFieldCoder* m_decoder;
         Gaudi::Property<std::string> m_readout_name{this,
             "readout", "DriftChamberHitsCollection"};
+        Gaudi::Property<int> m_iterFit{this,"iterFit",3};
         Gaudi::Property<int> m_debug{this,"debug",0};
         Gaudi::Property<int> m_debugGenfit{this,"debugGenfit",0};
         Gaudi::Property<int> m_debugPid{this,"debugPid",-99};
@@ -152,16 +155,17 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
         Gaudi::Property<std::vector<float> > m_sigmaHitU{this,
             "sigmaHitU",{0.11, // DC z mm
                 0.0028,0.006,0.004,0.004,0.004,0.004, //VXD U
-                    0.0072, //SIT U 4 layers same resolusion
-                    0.0072, //SET U
-                    0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V
+                0.0072, //SIT U 4 layers same resolusion
+                0.0072, //SET U
+                0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V
         //mm, 0:DC, 1~7:VXD, 8:SIT, 9:SET, FTD:10~16
         Gaudi::Property<std::vector<float> > m_sigmaHitV{this,
             "sigmaHitV",{0.11, // DC z mm
                 0.0028,0.006,0.004,0.004,0.004,0.004, //VXD V
-                    0.086, //SIT V
-                    0.086, //SET V
-                    0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V
+                0.086, //SIT V
+                0.086, //SET V
+                0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V
+        Gaudi::Property<float> m_cutSETPos{this,"cutSETPos",0.43}; //mm :2024.01.25之前为50mm
         Gaudi::Property<int> m_measurementTypeSi{this,"measurementTypeSi",0};
         //-1: not use, 0, space point, 1, pixel or planer measurement
         Gaudi::Property<int> m_measurementTypeDC{this,"measurementTypeDC",0};
@@ -170,10 +174,11 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
         //Gaudi::Property<float> m_nSigmaHit{this,"nSigmaHit",5};
         Gaudi::Property<int> m_sortMethod{this,"sortMethod",0};
         Gaudi::Property<bool> m_truthAmbig{this,"truthAmbig",true};
-        Gaudi::Property<float> m_skipCorner{this,"skipCorner",999.};
+        Gaudi::Property<bool> m_addSET{this,"addSET",true};
+        Gaudi::Property<bool> m_useSalHits{this,"useSalHits",true};
+        Gaudi::Property<bool> m_checkGenfitTrack{this,"checkGenfitTrack",false};
+        Gaudi::Property<float> m_skipCorner{this,"skipCorner",1200.};
         Gaudi::Property<float> m_skipNear{this,"skipNear",0.};
-        //Gaudi::Property<double> m_initCovResPos{this,"initCovResPos",1};
-        //Gaudi::Property<double> m_initCovResMom{this,"initCovResMom",0.1};
         Gaudi::Property<bool> m_isUseCovTrack{this,"isUseCovTrack",false};
         //Fitter type default is DAFRef.
         //Candidates are DAF,DAFRef,KalmanFitter and KalmanFitterRefTrack.
@@ -185,7 +190,10 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
         Gaudi::Property<bool> m_skipWireMaterial{this,
             "skipWireMaterial",true};
         Gaudi::Property<int> m_maxIteration{this,"maxIteration",20};
+        Gaudi::Property<int> m_minIteration{this,"minIteration",4};
         Gaudi::Property<int> m_resortHits{this,"resortHits",true};
+        Gaudi::Property<int> m_chi2FitCut{this,"chi2FitCut",30};
+        Gaudi::Property<int> m_dcFitNum{this,"dcFitNum",5};
         Gaudi::Property<double> m_bStart{this,"bStart",100};
         Gaudi::Property<double> m_bFinal{this,"bFinal",0.01};
         Gaudi::Property<double> m_DCCornerCuts{this,"dcCornerCuts",-999};
@@ -208,10 +216,13 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
         Gaudi::Property<bool> m_selectDCHit{this,"selectDCHit",false};
         Gaudi::Property<bool> m_useNoiseDCHit{this,"useNoiseDCHit",false};
         Gaudi::Property<double> m_docaCut{this,"docaCut",3.3};//mm
+
+        Gaudi::Property<bool> m_useTrackFinding{this,"DCTrackFinding",false};
+        Gaudi::Property<double> m_extraCut{this,"extraCut",0.055}; //5*sigma cm
+        Gaudi::Property<double> m_extraDocaCut{this,"extraDocaCut",1.2}; //cm
         int m_fitSuccess[5];
         int m_nRecTrack;
         bool m_firstTuple;
-        //bool m_useRecLRAmbig;
 
         genfit::EventDisplay* m_genfitDisplay;
 
@@ -221,159 +232,145 @@ class RecGenfitAlgSDT:public GaudiAlgorithm {
         NTuple::Item<int> m_evt;
         NTuple::Item<int> m_tkId;
         NTuple::Item<int> m_mcIndex;//number of navigated mcParicle
-        NTuple::Matrix<double> m_truthPocaMc;//2 dim matched particle and 3 pos.
-        NTuple::Array<double> m_seedMomP;//for some track
-        NTuple::Array<double> m_seedMomPt;
+        NTuple::Matrix<float> m_truthPocaMc;//2 dim matched particle and 3 pos.
+        NTuple::Array<float> m_seedMomP;//for some track
+        NTuple::Array<float> m_seedMomPt;
         NTuple::Array<int> m_seedMomQ;
-        NTuple::Matrix<double> m_seedMom;
-        NTuple::Matrix<double> m_seedPos;
-        NTuple::Matrix<double> m_pocaPosMc;//2 dim matched particle and 3 pos.
-        NTuple::Matrix<double> m_pocaMomMc;//2 dim matched particle and 3 mom.
-        NTuple::Array<double> m_pocaMomMcP;//2 dim matched particle and p
-        NTuple::Array<double> m_pocaMomMcPt;//2 dim matched particle and pt
-        NTuple::Matrix<double> m_pocaPosMdc;//pos 0:x,1:y,2:z
-        NTuple::Matrix<double> m_pocaMomMdc;//mom. 0:px,1:py,2:pz
+        NTuple::Matrix<float> m_seedMom;
+        NTuple::Matrix<float> m_seedPos;
+        NTuple::Matrix<float> m_pocaPosMc;//2 dim matched particle and 3 pos.
+        NTuple::Matrix<float> m_pocaMomMc;//2 dim matched particle and 3 mom.
+        NTuple::Array<float> m_pocaMomMcP;//2 dim matched particle and p
+        NTuple::Array<float> m_pocaMomMcPt;//2 dim matched particle and pt
+        NTuple::Matrix<float> m_pocaPosMdc;//pos 0:x,1:y,2:z
+        NTuple::Matrix<float> m_pocaMomMdc;//mom. 0:px,1:py,2:pz
         NTuple::Item<int> m_pidIndex;
-        NTuple::Matrix<double> m_firstPosKal;//5 hyposis and pos. at first
-        NTuple::Array<double> m_firstMomKalP;//5 hyposis and mom. at first
-        NTuple::Array<double> m_firstMomKalPt;//5 hyposis and mom. at first
-
-        NTuple::Matrix<double> m_ErrorcovMatrix6;
-        NTuple::Array<double> m_posx;
-        NTuple::Array<double> m_posy;
-        NTuple::Array<double> m_posz;
-
-        NTuple::Array<double> m_momx;
-        NTuple::Array<double> m_momy;
-        NTuple::Array<double> m_momz;
-
-        NTuple::Array<double> m_PosMcX;
-        NTuple::Array<double> m_PosMcY;
-        NTuple::Array<double> m_PosMcZ;
-
-        NTuple::Array<double> m_MomMcX;
-        NTuple::Array<double> m_MomMcY;
-        NTuple::Array<double> m_MomMcZ;
-
-        
-        NTuple::Array<double> m_PocaPosX;
-        NTuple::Array<double> m_PocaPosY;
-        NTuple::Array<double> m_PocaPosZ;
-
-        NTuple::Array<double> m_PocaMomX;
-        NTuple::Array<double> m_PocaMomY;
-        NTuple::Array<double> m_PocaMomZ;
-
-        NTuple::Matrix<double> m_McErrCov;
-        NTuple::Matrix<double> m_PocaErrCov;
-
-        NTuple::Matrix<double> m_ErrorcovMatrix;
-        NTuple::Array<double> m_D0;
-        NTuple::Array<double> m_phi;
-        NTuple::Array<double> m_omega;
-        NTuple::Array<double> m_Z0;
-        NTuple::Array<double> m_tanLambda;
-
-        NTuple::Matrix<double> m_ErrorcovMatrix_Origin;
-        NTuple::Array<double> m_D0_Origin;
-        NTuple::Array<double> m_phi_Origin;
-        NTuple::Array<double> m_omega_Origin;
-        NTuple::Array<double> m_Z0_Origin;
-        NTuple::Array<double> m_tanLambda_Origin;
-
-        NTuple::Array<double> mcP_D0;
-        NTuple::Array<double> mcP_phi;
-        NTuple::Array<double> mcP_omega;
-        NTuple::Array<double> mcP_Z0;
-        NTuple::Array<double> mcP_tanLambda;
-
-        NTuple::Matrix<double> m_pocaPosKal;//5 hyposis and 3 mom.
-        NTuple::Matrix<double> m_pocaMomKal;//5 hyposis and 3 mom.
-        NTuple::Matrix<double> m_pocaMomKalP;//5 hyposis and p
-        NTuple::Matrix<double> m_pocaMomKalPt;//5 hyposis and pt
+        NTuple::Matrix<float> m_firstPosKal;//5 hyposis and pos. at first
+        NTuple::Array<float> m_firstMomKalP;//5 hyposis and mom. at first
+        NTuple::Array<float> m_firstMomKalPt;//5 hyposis and mom. at first
+
+        NTuple::Matrix<float> m_ErrorcovMatrix6;
+        NTuple::Array<float> m_posx;
+        NTuple::Array<float> m_posy;
+        NTuple::Array<float> m_posz;
+
+        NTuple::Array<float> m_momx;
+        NTuple::Array<float> m_momy;
+        NTuple::Array<float> m_momz;
+
+        NTuple::Array<float> m_fittedXc;
+        NTuple::Array<float> m_fittedYc;
+        NTuple::Array<float> m_fittedR;
+
+        NTuple::Array<float> m_PosMcX;
+        NTuple::Array<float> m_PosMcY;
+        NTuple::Array<float> m_PosMcZ;
+
+        NTuple::Array<float> m_MomMcX;
+        NTuple::Array<float> m_MomMcY;
+        NTuple::Array<float> m_MomMcZ;
+
+
+        NTuple::Array<float> m_PocaPosX;
+        NTuple::Array<float> m_PocaPosY;
+        NTuple::Array<float> m_PocaPosZ;
+
+        NTuple::Array<float> m_PocaMomX;
+        NTuple::Array<float> m_PocaMomY;
+        NTuple::Array<float> m_PocaMomZ;
+
+        NTuple::Matrix<float> m_McErrCov;
+        NTuple::Matrix<float> m_PocaErrCov;
+
+        NTuple::Matrix<float> m_ErrorcovMatrix;
+        NTuple::Array<float> m_D0;
+        NTuple::Array<float> m_phi;
+        NTuple::Array<float> m_omega;
+        NTuple::Array<float> m_Z0;
+        NTuple::Array<float> m_tanLambda;
+
+        NTuple::Array<float> m_trackXc;
+        NTuple::Array<float> m_trackYc;
+        NTuple::Array<float> m_trackR;
+
+        NTuple::Matrix<float> m_ErrorcovMatrix_Origin;
+        NTuple::Array<float> m_D0_Origin;
+        NTuple::Array<float> m_phi_Origin;
+        NTuple::Array<float> m_omega_Origin;
+        NTuple::Array<float> m_Z0_Origin;
+        NTuple::Array<float> m_tanLambda_Origin;
+
+        NTuple::Array<float> mcP_D0;
+        NTuple::Array<float> mcP_phi;
+        NTuple::Array<float> mcP_omega;
+        NTuple::Array<float> mcP_Z0;
+        NTuple::Array<float> mcP_tanLambda;
+        NTuple::Array<float> mcP_Xc;
+        NTuple::Array<float> mcP_Yc;
+        NTuple::Array<float> mcP_R;
+
+        NTuple::Matrix<float> m_pocaPosKal;//5 hyposis and 3 mom.
+        NTuple::Matrix<float> m_pocaMomKal;//5 hyposis and 3 mom.
+        NTuple::Matrix<float> m_pocaMomKalP;//5 hyposis and p
+        NTuple::Matrix<float> m_pocaMomKalPt;//5 hyposis and pt
         NTuple::Matrix<int> m_chargeKal;
-        NTuple::Matrix<double> m_chi2Kal;
-        NTuple::Matrix<double> m_nDofKal;
+        NTuple::Matrix<float> m_chi2Kal;
+        NTuple::Matrix<float> m_nDofKal;
         NTuple::Matrix<int> m_isFitConverged;
         NTuple::Matrix<int> m_isFitConvergedFully;
         NTuple::Matrix<int> m_isFitted;
+        NTuple::Array<int> m_PDG;//5 hyposis and mom. at first
+        NTuple::Array<int> m_numDCOnTrack;//5 hyposis and mom. at first
+        NTuple::Array<int> m_salDCHits;//5 hyposis and mom. at first
+        NTuple::Array<int> m_DCHitsCol;//5 hyposis and mom. at first
         NTuple::Matrix<int> m_fittedState;
         NTuple::Item<int> m_nDCDigi;
-        NTuple::Item<int> m_nTruthDCDigi;
+        NTuple::Item<int> m_nSignalDCDigi;
         NTuple::Item<int> m_nHitMc;
         NTuple::Item<int> m_nSdtTrack;
         NTuple::Item<int> m_nSdtTrackHit;
 
         NTuple::Item<int> m_nSdtRecTrack;
 
-        NTuple::Item<int> m_nSimDCHit;
         NTuple::Matrix<int> m_nHitWithFitInfo;
         NTuple::Item<int> m_nHitKalInput;
         NTuple::Array<int> m_nHitDetType;
-        NTuple::Array<double> m_mdcHitDriftT;
-        NTuple::Array<double> m_mdcHitDriftDl;
-        NTuple::Array<double> m_mdcHitDriftDr;
-        NTuple::Array<int> m_mdcHitLr;
-        NTuple::Array<int> m_mdcHitLayer;
-        NTuple::Array<int> m_mdcHitWire;
-        NTuple::Array<double> m_mdcHitExpDoca;
-        NTuple::Array<double> m_mdcHitExpMcDoca;
-        NTuple::Array<double> m_mdcHitErr;
         NTuple::Matrix<int> m_nHitFailedKal;
         NTuple::Matrix<int> m_nHitFitted;
-        NTuple::Item<double> m_exeTime;
-        //truth
-        NTuple::Array<int> m_mdcHitMcLr;
-        NTuple::Array<int> m_mdcHitMcTkId;
-        NTuple::Array<double> m_mdcHitMcDrift;
-        NTuple::Array<double> m_mdcHitMcX;
-        NTuple::Array<double> m_mdcHitMcY;
-        NTuple::Array<double> m_mdcHitMcZ;
-        NTuple::Array<double> m_mdcHitExpMcPocaX;
-        NTuple::Array<double> m_mdcHitExpMcPocaY;
-        NTuple::Array<double> m_mdcHitExpMcPocaZ;
-        NTuple::Array<double> m_mdcHitExpMcPocaWireX;
-        NTuple::Array<double> m_mdcHitExpMcPocaWireY;
-        NTuple::Array<double> m_mdcHitExpMcPocaWireZ;
-
-        NTuple::Array<double> m_dcDigiChamber;
-        NTuple::Array<double> m_dcDigiLayer;
-        NTuple::Array<double> m_dcDigiCell;
-        NTuple::Array<double> m_dcDigiTime;
-        NTuple::Array<double> m_dcDigiDrift;
-        NTuple::Array<double> m_dcDigiDocaMC;
-        NTuple::Array<double> m_dcDigiPocaOnWireMCX;
-        NTuple::Array<double> m_dcDigiPocaOnWireMCY;
-        NTuple::Array<double> m_dcDigiWireStartX;
-        NTuple::Array<double> m_dcDigiWireStartY;
-        NTuple::Array<double> m_dcDigiWireStartZ;
-        NTuple::Array<double> m_dcDigiWireEndX;
-        NTuple::Array<double> m_dcDigiWireEndY;
-        NTuple::Array<double> m_dcDigiWireEndZ;
-        NTuple::Array<double> m_dcDigiMcPosX;
-        NTuple::Array<double> m_dcDigiMcPosY;
-        NTuple::Array<double> m_dcDigiMcPosZ;
-        NTuple::Array<double> m_dcDigiMcMomX;
-        NTuple::Array<double> m_dcDigiMcMomY;
-        NTuple::Array<double> m_dcDigiMcMomZ;
-        NTuple::Array<double> m_dcDigiDocaExt;
-        NTuple::Array<double> m_dcDigiPocaExtX;
-        NTuple::Array<double> m_dcDigiPocaExtY;
-        NTuple::Array<double> m_dcDigiPocaExtZ;
-        NTuple::Item<double> m_firstMomMc;
-
-        NTuple::Item<int> m_nTrackerHitSDT;
-        NTuple::Item<int> m_nTrackerHitDC;
-        NTuple::Item<int> m_nGenFitTrackerHit;
-
-        NTuple::Array<double> m_trackLength;
-        NTuple::Array<double> m_hitMomEdep;
-        NTuple::Array<float> m_truthMomEdep;
-        NTuple::Array<float> m_FittedDoca;
-        NTuple::Array<float> m_truthDoca;
-        NTuple::Array<float> m_driftDis;
-        NTuple::Array<float> m_Res;
-        NTuple::Array<float> m_truthRes;
+
+        NTuple::Array<float> m_dcDigiChamber;
+
+        NTuple::Array<float> m_docaTrack;
+        NTuple::Array<int> m_isNoise;
+
+        NTuple::Array<float> m_dcDigiLayer;
+        NTuple::Array<float> m_dcDigiCell;
+        NTuple::Array<float> m_dcDigiTime;
+        NTuple::Array<float> m_dcDigiDrift;
+        NTuple::Array<float> m_dcDigiDocaMC;
+        NTuple::Array<float> m_dcDigiPocaOnWireMCX;
+        NTuple::Array<float> m_dcDigiPocaOnWireMCY;
+        NTuple::Array<float> m_dcDigiWireStartX;
+        NTuple::Array<float> m_dcDigiWireStartY;
+        NTuple::Array<float> m_dcDigiWireStartZ;
+        NTuple::Array<float> m_dcDigiWireEndX;
+        NTuple::Array<float> m_dcDigiWireEndY;
+        NTuple::Array<float> m_dcDigiWireEndZ;
+        NTuple::Array<float> m_dcDigiMcPosX;
+        NTuple::Array<float> m_dcDigiMcPosY;
+        NTuple::Array<float> m_dcDigiMcPosZ;
+        NTuple::Array<float> m_dcDigiMcMomX;
+        NTuple::Array<float> m_dcDigiMcMomY;
+        NTuple::Array<float> m_dcDigiMcMomZ;
+        NTuple::Array<float> m_dcDigiDocaExt;
+        NTuple::Array<float> m_dcDigiPocaExtX;
+        NTuple::Array<float> m_dcDigiPocaExtY;
+        NTuple::Array<float> m_dcDigiPocaExtZ;
+        NTuple::Item<float> m_firstMomMc;
+
+        NTuple::Array<int> m_nTrackerHitSDT;
+        NTuple::Array<int> m_nTrackerHitDC;
+        NTuple::Array<int> m_nTrackerFitHitDC;
 
 };
 #endif
diff --git a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp
index 0070d7ff..8e26afbd 100644
--- a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp
+++ b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp
@@ -160,17 +160,18 @@ void WireMeasurementDC::print(){
   std::cout<<"("<<layer_<<","<<cell_
     <<") wire(" <<wireEndPoint1_[0] <<wireEndPoint1_[1] <<wireEndPoint1_[2]
     <<wireEndPoint2_[0] <<wireEndPoint2_[1] <<wireEndPoint2_[2]
-    <<")cm dt "<<trackerHit_->getTime()
-    <<"ns time "<<simTrackerHit_->getTime()
+    <<")cm ptr: "<< trackerHit_
+    << " dt "<<time_
     <<"ns dd "<<getRawHitCoords()[0]
     <<"cm dd err "<< getRawHitCov()(0,0)
-    <<"cm lr "<<leftRight_;
-  //<<std::endl;
+    <<"cm lr "<<leftRight_
+  <<std::endl;
   //<<" ddSm "<<driftDistanceSmeared
 }
 
 
 WireMeasurementDC::WireMeasurementDC(const GenfitHit* genfitHit,int iHit):
+    genfitHit_(genfitHit),
     maxDistance_(genfitHit->getMaxDistance()),
     leftRight_(genfitHit->getLeftRightAmbig()),
     trackerHit_(genfitHit->getTrackerHit()),
diff --git a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h
index 024ee704..9e29a3c6 100644
--- a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h
+++ b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h
@@ -32,6 +32,8 @@
 #include "AbsHMatrix.h"
 #include "GenfitHit.h"
 
+
+#include "edm4hep/TrackerHit.h"
 namespace edm4hep{
     class TrackerHit;
     class SimTrackerHit;
@@ -109,10 +111,19 @@ class WireMeasurementDC : public genfit::AbsMeasurement{
   virtual bool isLeftRigthMeasurement() const {return true;}
   double getMaxDistance(){return maxDistance_;}
   int getLeftRightResolution() const override {return leftRight_;}
-  void setTrackerHit(const edm4hep::TrackerHit& trackerHit,int l,int c){
+  int getWireMeasurementDCLayer(){return layer_;}
+  void setTrackerHit(const edm4hep::TrackerHit& trackerHit,int l,int c,double t){
       trackerHit_=&trackerHit;
       layer_=l;
       cell_=c;
+      time_=t;
+  }
+  void setTrackerHitObj(const edm4hep::TrackerHit& trackerHit,int l,int c,double t){
+      trackerHit_= nullptr;
+      trackerHitObj_=trackerHit;
+      layer_=l;
+      cell_=c;
+      time_=t;
   }
   void setSimTrackerHit(const edm4hep::SimTrackerHit& simTrackerHit){
       simTrackerHit_=&simTrackerHit;
@@ -120,6 +131,8 @@ class WireMeasurementDC : public genfit::AbsMeasurement{
   void print();
 
   const edm4hep::TrackerHit* getTrackerHit(){return trackerHit_;}
+  edm4hep::TrackerHit getTrackerHitObj(){return trackerHitObj_;}
+  const GenfitHit* getGenfitHit(){return genfitHit_;}
 
  protected:
 
@@ -130,8 +143,11 @@ class WireMeasurementDC : public genfit::AbsMeasurement{
 
   int layer_;
   int cell_;
+  double time_;
   const edm4hep::SimTrackerHit* simTrackerHit_;
   const edm4hep::TrackerHit* trackerHit_;
+  edm4hep::TrackerHit trackerHitObj_;
+  const GenfitHit* genfitHit_;
 
  public:
 
diff --git a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp
index 611b7789..2fee8d42 100644
--- a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp
+++ b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp
@@ -1,5 +1,7 @@
 #include "TruthTrackerAlg.h"
 #include "DataHelper/HelixClass.h"
+#include "DataHelper/TrackHelper.h"
+#include "DataHelper/TrackerHitHelper.h"
 #include "DDSegmentation/Segmentation.h"
 #include "DetSegmentation/GridDriftChamber.h"
 #include "DetInterface/IGeomSvc.h"
@@ -26,12 +28,6 @@ TruthTrackerAlg::TruthTrackerAlg(const std::string& name, ISvcLocator* svcLoc)
 : GaudiAlgorithm(name, svcLoc),m_dd4hep(nullptr),m_gridDriftChamber(nullptr),
     m_decoder(nullptr)
 {
-    declareProperty("NoiseSimHitsCollection", w_SimNoiseHCol,
-            "Handle of the output simulation  DC Noise hits collection");
-    declareProperty("NoiseDCHitsCollection", w_NoiseHitCol,
-            "Handle of the input DC Noise hits collection");
-    declareProperty("NoiseDCHitAssociationCollection", w_NoiseAssociationCol,
-            "Handle of the simNoiseDCHit and noiseDC Noise hits collection");
     declareProperty("MCParticle", m_mcParticleCol,
             "Handle of the input MCParticle collection");
     declareProperty("DriftChamberHitsCollection", m_DCSimTrackerHitCol,
@@ -56,12 +52,18 @@ TruthTrackerAlg::TruthTrackerAlg(const std::string& name, ISvcLocator* svcLoc)
             "Handle of input FTD tracker hit collection");
     declareProperty("SITSpacePoints", m_SITSpacePointCol,
             "Handle of input SIT hit collection");
-//    declareProperty("SETSpacePoints", m_SETSpacePointCol,
-//            "Handle of input SET hit collection");
     declareProperty("FTDSpacePoints", m_FTDSpacePointCol,
             "Handle of input FTD hit collection");
     declareProperty("VXDCollection", m_VXDCollection,
             "Handle of input VXD hit collection");
+    declareProperty("VXDTrackerHitAssociation", m_VXDHitAssociationCol,
+            "Handle of VXD association collection");
+    declareProperty("SETTrackerHitAssociation", m_SETHitAssociationCol,
+            "Handle of SET association collection");
+    declareProperty("SITTrackerHitAssociation", m_SITHitAssociationCol,
+            "Handle of SIT association collection");
+    declareProperty("FTDTrackerHitAssociation", m_FTDHitAssociationCol,
+            "Handle of FTD association collection");
     declareProperty("SITCollection", m_SITCollection,
             "Handle of input SIT hit collection");
     declareProperty("SETCollection", m_SETCollection,
@@ -70,12 +72,6 @@ TruthTrackerAlg::TruthTrackerAlg(const std::string& name, ISvcLocator* svcLoc)
             "Handle of input FTD hit collection");
     declareProperty("TruthTrackerHitCollection", m_truthTrackerHitCol,
             "Handle of output truth TrackerHit collection");
-    declareProperty("SmearTrackerHitCollection", m_SmeartruthTrackerHitCol,
-            "Handle of output smear truth TrackerHit collection");
-    declareProperty("SmearSimHitsCollection", w_SimSmearHCol,
-            "Handle of output smear SimTrackerHit collection");
-    declareProperty("SmearDCHitAssociationCollection", w_SmearAssociationCol,
-            "Handle of output smear simulationhit and TrackerHit collection");
 }
 
 
@@ -111,6 +107,8 @@ StatusCode TruthTrackerAlg::initialize()
         return StatusCode::FAILURE;
     }
 
+    eventNo = 0;
+
     ///book tuple
     if(m_hist){
         NTuplePtr nt(ntupleSvc(), "TruthTrackerAlg/truthTrackerAlg");
@@ -121,20 +119,9 @@ StatusCode TruthTrackerAlg::initialize()
                     CLID_ColumnWiseTuple,"TruthTrackerAlg");
             if(m_tuple){
                 StatusCode sc;
-                sc=m_tuple->addItem("run",m_run);
-                sc=m_tuple->addItem("evt",m_evt);
-                sc=m_tuple->addItem("siMom",3,m_siMom);
-                sc=m_tuple->addItem("siPos",3,m_siPos);
-                sc=m_tuple->addItem("mcMom",3,m_mcMom);
-
-                sc=m_tuple->addItem("mcPos",3,m_mcPos);
                 sc=m_tuple->addItem("nDCTrackHit",m_nDCTrackHit,0,100000);
-                sc=m_tuple->addItem("DriftDistance",m_nDCTrackHit,m_DriftDistance);
-                sc=m_tuple->addItem("nSmearDCTrackHit",m_nSmearDCTrackHit,0,100000);
-                sc=m_tuple->addItem("SmearDriftDistance",m_nSmearDCTrackHit,m_SmearDriftDistance);
-                sc=m_tuple->addItem("nNoiseDCTrackHit",m_nNoiseDCTrackHit,0,100000);
-                sc=m_tuple->addItem("NoiseDriftDistance",m_nNoiseDCTrackHit,m_NoiseDriftDistance);
 
+                sc=m_tuple->addItem("nSDTTrack",m_nSDTTrack,0,100000);
                 sc=m_tuple->addItem("nSimTrackerHitVXD",m_nSimTrackerHitVXD);
                 sc=m_tuple->addItem("nSimTrackerHitSIT",m_nSimTrackerHitSIT);
                 sc=m_tuple->addItem("nSimTrackerHitSET",m_nSimTrackerHitSET);
@@ -145,20 +132,19 @@ StatusCode TruthTrackerAlg::initialize()
                 sc=m_tuple->addItem("nTrackerHitSET",m_nTrackerHitSET);
                 sc=m_tuple->addItem("nTrackerHitFTD",m_nTrackerHitFTD);
                 sc=m_tuple->addItem("nTrackerHitDC",m_nTrackerHitDC);
-                sc=m_tuple->addItem("nSpacePointSIT",m_nSpacePointSIT);
-                sc=m_tuple->addItem("nSpacePointSET",m_nSpacePointSET);
-                sc=m_tuple->addItem("nSpacePointFTD",m_nSpacePointFTD);
-                sc=m_tuple->addItem("nHitOnSiTkXVD",m_nHitOnSiTkVXD);
-                sc=m_tuple->addItem("nHitOnSiTkSIT",m_nHitOnSiTkSIT);
-                sc=m_tuple->addItem("nHitOnSiTkSET",m_nHitOnSiTkSET);
-                sc=m_tuple->addItem("nHitOnSiTkFTD",m_nHitOnSiTkFTD);
-                sc=m_tuple->addItem("nHitOnSdtTkVXD",m_nHitOnSdtTkVXD);
-                sc=m_tuple->addItem("nHitOnSdtTkSIT",m_nHitOnSdtTkSIT);
-                sc=m_tuple->addItem("nHitOnSdtTkSET",m_nHitOnSdtTkSET);
-                sc=m_tuple->addItem("nHitOnSdtTkFTD",m_nHitOnSdtTkFTD);
-                sc=m_tuple->addItem("nHitOnSdtTkDC",m_nHitOnSdtTkDC);
-                sc=m_tuple->addItem("nHitSdt",m_nHitOnSdtTk);
-                sc=m_tuple->addItem("nNoiseOnSdt",m_nNoiseOnSdtTk);
+                sc=m_tuple->addItem("nHitOnSiTkXVD",m_nSDTTrack,m_nHitOnSiTkVXD);
+                sc=m_tuple->addItem("nHitOnSiTkSIT",m_nSDTTrack,m_nHitOnSiTkSIT);
+                sc=m_tuple->addItem("nHitOnSiTkSET",m_nSDTTrack,m_nHitOnSiTkSET);
+                sc=m_tuple->addItem("nHitOnSiTkFTD",m_nSDTTrack,m_nHitOnSiTkFTD);
+                sc=m_tuple->addItem("nHitOnSdtTkVXD",m_nSDTTrack,m_nHitOnSdtTkVXD);
+                sc=m_tuple->addItem("nHitOnSdtTkSIT",m_nSDTTrack,m_nHitOnSdtTkSIT);
+                sc=m_tuple->addItem("nHitOnSdtTkSET",m_nSDTTrack,m_nHitOnSdtTkSET);
+                sc=m_tuple->addItem("nHitOnSdtTkFTD",m_nSDTTrack,m_nHitOnSdtTkFTD);
+                sc=m_tuple->addItem("nHitOnSdtTkDC",m_nSDTTrack,m_nHitOnSdtTkDC);
+                sc=m_tuple->addItem("nHitSdt",m_nSDTTrack,m_nHitOnSdtTk);
+                sc=m_tuple->addItem("siXc",m_nSDTTrack,m_siXc);
+                sc=m_tuple->addItem("siYc",m_nSDTTrack,m_siYc);
+                sc=m_tuple->addItem("siR",m_nSDTTrack,m_siR);
             }
         }
     }
@@ -170,24 +156,45 @@ StatusCode TruthTrackerAlg::execute()
     info()<<"In execute()"<<endmsg;
 
     ///Output DC Track collection
-    edm4hep::TrackCollection* dcTrackCol=m_DCTrackCol.createAndPut();
+    edm4hep::TrackCollection* dcTrackCol= m_DCTrackCol.createAndPut();
 
     ///Output SDT Track collection
-    edm4hep::TrackCollection* sdtTkCol=m_SDTTrackCol.createAndPut();
+    edm4hep::TrackCollection* sdtTkCol= m_SDTTrackCol.createAndPut();
 
     ///Output Hit collection
-    auto truthTrackerHitCol=m_truthTrackerHitCol.createAndPut();
+    auto truthTrackerHitCol = m_truthTrackerHitCol.createAndPut();
+
+    //VXD MCRecoTrackerAssociation
+    const edm4hep::MCRecoTrackerAssociationCollection* VXDAssoVec = m_VXDHitAssociationCol.get();
+    //SIT MCRecoTrackerAssociation
+    const edm4hep::MCRecoTrackerAssociationCollection* SITAssoVec = m_SITHitAssociationCol.get();
+    //SET MCRecoTrackerAssociation
+    const edm4hep::MCRecoTrackerAssociationCollection* SETAssoVec = m_SETHitAssociationCol.get();
+    //FTD MCRecoTrackerAssociation
+    const edm4hep::MCRecoTrackerAssociationCollection* FTDAssoVec = m_FTDHitAssociationCol.get();
 
     ///Retrieve MC particle(s)
     const edm4hep::MCParticleCollection* mcParticleCol=nullptr;
     mcParticleCol=m_mcParticleCol.get();
-    //if(m_mcParticleCol.exist()){mcParticleCol=m_mcParticleCol.get();}
+    const int mcPNum = mcParticleCol->size();
+    float mcP_Mom[mcPNum]={1e-9};
+
     if(nullptr==mcParticleCol){
         debug()<<"MCParticleCollection not found"<<endmsg;
         return StatusCode::SUCCESS;
     }
+    for(int i=0;i<mcPNum;i++){
+        mcP_Mom[i] = sqrt(mcParticleCol->at(i).getMomentum()[0]*mcParticleCol->at(i).getMomentum()[0]
+                +mcParticleCol->at(i).getMomentum()[1]*mcParticleCol->at(i).getMomentum()[1]);
+    }
+
     ///Retrieve DC digi
     const edm4hep::TrackerHitCollection* digiDCHitsCol=nullptr;
+    digiDCHitsCol=m_DCDigiCol.get();
+    if(digiDCHitsCol->size()<1e-9){
+        debug() << " TruthTrackerAlg digiDCHitsCol size =0 !!" << endmsg;
+        return StatusCode::SUCCESS;
+    }
     const edm4hep::SimTrackerHitCollection* dcSimHitCol
         =m_DCSimTrackerHitCol.get();
     const edm4hep::MCRecoTrackerAssociationCollection* assoHits
@@ -200,8 +207,7 @@ StatusCode TruthTrackerAlg::execute()
                 <<dcSimHitCol->size()<<endmsg;
             if(m_tuple)m_nSimTrackerHitDC=dcSimHitCol->size();
         }
-        digiDCHitsCol=m_DCDigiCol.get();
-        m_nDCTrackHit = digiDCHitsCol->size();
+        if(m_tuple) m_nDCTrackHit = digiDCHitsCol->size();
         if(nullptr==digiDCHitsCol){
             debug()<<"TrackerHitCollection not found"<<endmsg;
         }else{
@@ -211,61 +217,120 @@ StatusCode TruthTrackerAlg::execute()
                 return StatusCode::SUCCESS;
             }
         }
-    }
 
-    // make noise
-    edm4hep::SimTrackerHitCollection* SimVec = w_SimNoiseHCol.createAndPut();
-    edm4hep::MCRecoTrackerAssociationCollection* AssoVec = 
-        w_NoiseAssociationCol.createAndPut();
-    edm4hep::TrackerHitCollection* Vec = w_NoiseHitCol.createAndPut();
-
-    ////TODO
-    //Output MCRecoTrackerAssociationCollection collection
-    //const edm4hep::MCRecoTrackerAssociationCollection*
-    //    mcRecoTrackerAssociationCol=nullptr;
-    //if(nullptr==mcRecoTrackerAssociationCol){
-    //    log<<MSG::DEBUG<<"MCRecoTrackerAssociationCollection not found"
-    //        <<endmsg;
-    //    return StatusCode::SUCCESS;
-    //}
-    //mcRecoTrackerAssociationCol=m_mcRecoParticleAssociation.get();
-
-    ///New SDT track
-    edm4hep::MutableTrack sdtTk=sdtTkCol->create();
-
-    int nVXDHit=0;
-    int nSITHit=0;
-    int nSETHit=0;
-    int nFTDHit=0;
-    int nDCHitDCTk=0;
-    int nDCHitSDTTk=0;
-
-    ///Create track with mcParticle
-    edm4hep::TrackState trackStateMc;
-    getTrackStateFromMcParticle(mcParticleCol,trackStateMc);
-    if(m_useTruthTrack.value()||!m_useSi){sdtTk.addToTrackStates(trackStateMc);}
+        //Test DCHit Mom
+        if(m_useCutMom){
+            const int dchitNum = digiDCHitsCol->size();
+            float dchitMom[dchitNum] = {1e-9};
+            int nloop =0;
+            for(auto dcHit:*digiDCHitsCol){
+
+                edm4hep::SimTrackerHit simDCHit = getAssoSimTrackerHit(assoHits,dcHit);
+                dchitMom[nloop] = sqrt(simDCHit.getMomentum()[0]*simDCHit.getMomentum()[0]+
+                        simDCHit.getMomentum()[1]*simDCHit.getMomentum()[1]);
+                float dchitMomP = sqrt(simDCHit.getMomentum()[0]*simDCHit.getMomentum()[0]+
+                        simDCHit.getMomentum()[1]*simDCHit.getMomentum()[1]+
+                        simDCHit.getMomentum()[2]*simDCHit.getMomentum()[2]);
+                nloop++;
+            }
 
-    if(m_useSi){
-        ///Retrieve silicon Track
-        const edm4hep::TrackCollection* siTrackCol=nullptr;
-        //if(m_siSubsetTrackCol.exist()){
-        siTrackCol=m_siSubsetTrackCol.get();
-        if(nullptr==siTrackCol){
-            debug()<<"SDTTrackCollection is empty"<<endmsg;
-            if(!m_useTruthTrack.value()) return StatusCode::SUCCESS;
-        }else{
-            debug()<<"SiSubsetTrackCol size "<<siTrackCol->size()<<endmsg;
-            if(!m_useTruthTrack.value()&&0==siTrackCol->size()){
+            float cutMom = 0;
+            for(int i=0;i<nloop;i++){
+                if(dchitMom[i]>1e-1){
+                    cutMom = dchitMom[i];
+                    break;
+                }
+            }
+            float cutMomLast = 0;
+            for(int i=nloop-1;i>-1;i--){
+                if(dchitMom[i]>1e-9){
+                    cutMomLast = dchitMom[i];
+                    break;
+                }
+            }
+            if(((std::abs(mcP_Mom[0]-cutMom))/mcP_Mom[0])>m_cutMomHit[m_debugPID])
+                return StatusCode::SUCCESS;
+            if((std::abs(cutMom-cutMomLast)/mcP_Mom[0])>m_cutMomHit[m_debugPID])
+                return StatusCode::SUCCESS;
+        }// end loop of use cutMom
+    }//end loop of useDC
+
+    ///Retrieve silicon Track
+    const edm4hep::TrackCollection* siTrackCol=nullptr;
+    siTrackCol=m_siSubsetTrackCol.get();
+    if(nullptr==siTrackCol){
+        debug()<<"SDTTrackCollection is empty"<<endmsg;
+        if(!m_useTruthTrack.value()) return StatusCode::SUCCESS;
+    }else{
+        debug()<<"SiSubsetTrackCol size "<<siTrackCol->size()<<endmsg;
+        if(!m_useTruthTrack.value()&&0==siTrackCol->size()){
+            return StatusCode::SUCCESS;
+        }
+        for(int iSitrk=0;iSitrk<siTrackCol->size();iSitrk++){
+            auto siTk = siTrackCol->at(iSitrk);
+            if(nHotsOnTrack(siTk,lcio::ILDDetID::VXD)<1e-9 &&
+                    nHotsOnTrack(siTk,lcio::ILDDetID::SIT)<1e-9){
+                debug() << " Because siTrack have no VXDHits and SITHits !" << endmsg;
+                return StatusCode::SUCCESS;
+            }
+            if(nHotsOnTrack(siTk,lcio::ILDDetID::FTD)>1e-9){
+                debug() << " Because siTrack have FTDHits !" << endmsg;
                 return StatusCode::SUCCESS;
             }
+
+        }
+    }//end loop of silicon Track
+
+    m_nSDTTrack = siTrackCol->size();
+    for(int iSitrk=0;iSitrk<siTrackCol->size();iSitrk++){
+        auto siTk = siTrackCol->at(iSitrk);
+        ///New SDT track
+        edm4hep::MutableTrack sdtTk=sdtTkCol->create();
+
+        int nVXDHit=0;
+        int nSITHit=0;
+        int nSETHit=0;
+        int nFTDHit=0;
+        int nDCHitDCTk=0;
+        int nDCHitSDTTk=0;
+
+        ///Create track with mcParticle
+        edm4hep::TrackerHit trackHit = siTk.getTrackerHits(0);
+        edm4hep::MCParticle mcParticle;
+        edm4hep::SimTrackerHit simTrackerHit;
+        CEPC::getAssoMCParticle(VXDAssoVec,trackHit,mcParticle,simTrackerHit);
+        edm4hep::TrackState trackStateMc;
+        getTrackStateFromMcParticle(mcParticle,trackStateMc);
+
+        if(m_useTruthTrack.value()||!m_useSi){
+            sdtTk.addToTrackStates(trackStateMc);
         }
-        //}
 
-        for(auto siTk:*siTrackCol){
+        if(m_useSi){
             if(!m_useTruthTrack.value()){
                 debug()<<"siTk: "<<siTk<<endmsg;
                 edm4hep::TrackState siTrackStat=siTk.getTrackStates(0);//FIXME?
-                sdtTk.addToTrackStates(siTrackStat);
+                float Bz = 3;//T
+
+                HelixClass helixClass;
+                helixClass.Initialize_Canonical(siTrackStat.phi,siTrackStat.D0,
+                        siTrackStat.Z0,siTrackStat.omega,siTrackStat.tanLambda,Bz);
+                m_siXc[iSitrk] = helixClass.getXC();
+                m_siYc[iSitrk] = helixClass.getYC();
+                m_siR[iSitrk] = helixClass.getRadius();
+
+                TVector3 siPos,siMom;
+                TMatrixDSym siCov(6);
+                double charge_test;
+
+                CEPC::getPosMomFromTrackState(siTrackStat,Bz,siPos,siMom,charge_test,siCov);
+
+                if((0==mcParticle.getCharge()) || (charge_test==mcParticle.getCharge())){
+                    sdtTk.addToTrackStates(siTrackStat);
+                }else{
+                    sdtTk.addToTrackStates(trackStateMc);
+                }
+
                 sdtTk.setType(siTk.getType());
                 sdtTk.setChi2(siTk.getChi2());
                 sdtTk.setNdf(siTk.getNdf());
@@ -278,119 +343,77 @@ StatusCode TruthTrackerAlg::execute()
                 debug()<<"use Si hit on track"<<endmsg;
                 nVXDHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::VXD,"VXD",nVXDHit);
                 nSITHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::SIT,"SIT",nSITHit);
-                nSETHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::SET,"SET",nSETHit);
-                nFTDHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::FTD,"FTD",nFTDHit);
-            }//end of loop over hits on siTk
-        }//end of loop over siTk
-
-        if(m_useSiTruthHit){
-            ///Add silicon SimTrackerHit
-            debug()<<"Add silicon SimTrackerHit"<<endmsg;
-            nVXDHit=addSimHitsToTk(m_VXDCollection,truthTrackerHitCol,sdtTk,"VXD",nVXDHit);
-            nSITHit=addSimHitsToTk(m_SITCollection,truthTrackerHitCol,sdtTk,"SIT",nSITHit);
-            nSETHit=addSimHitsToTk(m_SETCollection,truthTrackerHitCol,sdtTk,"SET",nSETHit);
-            nFTDHit=addSimHitsToTk(m_FTDCollection,truthTrackerHitCol,sdtTk,"FTD",nFTDHit);
-        }else{
-            ///Add reconstructed hit or digi
-            debug()<<"Add VXD TrackerHit"<<endmsg;
-            nVXDHit=addHitsToTk(m_VXDTrackerHits,sdtTk,"VXD digi",nVXDHit);
-            nSITHit=addHitsToTk(m_SITTrackerHits,sdtTk,"SIT digi",nSITHit);
-            if(m_useSiSpacePoint.value()){
-                ///Add silicon SpacePoint
-                debug()<<"Add silicon SpacePoint"<<endmsg;
-                if(m_useSiSpacePoint){
-                    nSITHit=addHitsToTk(m_SITSpacePointCol,sdtTk,"SIT sp",nSITHit);
-                }
-               // nSETHit=addHitsToTk(m_SETSpacePointCol,sdtTk,"SET sp",nSETHit);
-                nFTDHit=addHitsToTk(m_FTDSpacePointCol,sdtTk,"FTD sp",nFTDHit);
+                //end of loop over hits on siTk
             }else{
-                ///Add silicon TrackerHit
-                debug()<<"Add silicon TrackerHit"<<endmsg;
-                nSITHit=addHitsToTk(m_SITTrackerHits,sdtTk,"SIT digi",nSITHit);
-                nSETHit=addHitsToTk(m_SETTrackerHits,sdtTk,"SET digi",nSETHit);
-                nFTDHit=addHitsToTk(m_FTDTrackerHits,sdtTk,"FTD digi",nFTDHit);
-            }//end of use space point
-        }
-    }//end of use silicon
+                if(m_useSiSimHit){
+                    ///Add silicon SimTrackerHit
+                    debug()<<"Add silicon SimTrackerHit"<<endmsg;
+                    nVXDHit=addSimHitsToTk(m_VXDCollection,truthTrackerHitCol,sdtTk,"VXD",nVXDHit);
+                    nSITHit=addSimHitsToTk(m_SITCollection,truthTrackerHitCol,sdtTk,"SIT",nSITHit);
+                }else{  
+                    ///Add reconstructed hit or digi
+                    debug()<<"Add VXD TrackerHit"<<endmsg;
+                    nVXDHit=addHitsToTk(m_VXDTrackerHits,sdtTk,"VXD digi",nVXDHit);
+                    nSITHit=addHitsToTk(m_SITTrackerHits,sdtTk,"SIT digi",nSITHit);
+                    if(m_useSiSpacePoint.value()){
+                        ///Add silicon SpacePoint
+                        debug()<<"Add silicon SpacePoint"<<endmsg;
+                        if(m_useSiSpacePoint){
+                            nSITHit=addHitsToTk(m_SITSpacePointCol,sdtTk,"SIT sp",nSITHit);
+                        }
+                    }//end of use space point
+                } // end of Add reconstructed hit or digi
+            } // end of truth hits
+        }//end of use silicon
+
+        if(m_useDC){
+            ///Create DC Track
+            edm4hep::MutableTrack dcTrack=dcTrackCol->create();
+
+            //Create TrackState
+            edm4hep::TrackState trackStateFirstDCHit;
+            float charge=trackStateMc.omega/fabs(trackStateMc.omega);
+            if(m_useFirstHitForDC&&getTrackStateFirstHit(m_DCSimTrackerHitCol,
+                        charge,trackStateFirstDCHit)){
+                dcTrack.addToTrackStates(trackStateFirstDCHit);
+                dcTrack.addToTrackStates(trackStateMc);
+            }else{
+                dcTrack.addToTrackStates(trackStateMc);
+                dcTrack.addToTrackStates(trackStateFirstDCHit);
+            }
+            sdtTk.addToTrackStates(trackStateFirstDCHit);
 
-    if(m_useDC){
-        ///Create DC Track
-        edm4hep::MutableTrack dcTrack=dcTrackCol->create();
-
-        //Create TrackState
-        edm4hep::TrackState trackStateFirstDCHit;
-        float charge=trackStateMc.omega/fabs(trackStateMc.omega);
-        if(m_useFirstHitForDC&&getTrackStateFirstHit(m_DCSimTrackerHitCol,
-                    charge,trackStateFirstDCHit)){
-            dcTrack.addToTrackStates(trackStateFirstDCHit);
-            dcTrack.addToTrackStates(trackStateMc);
-        }else{
-            dcTrack.addToTrackStates(trackStateMc);
-            dcTrack.addToTrackStates(trackStateFirstDCHit);
+            ///Add other track properties
+            dcTrack.setNdf(dcTrack.trackerHits_size()-5);
+
+            if(!m_useTrackFinding){
+                if(m_useIdealHit){
+                    nDCHitDCTk=addIdealHitsToTk(m_DCDigiCol,truthTrackerHitCol,dcTrack,
+                            "DC digi",nDCHitDCTk);
+                }else{
+                    nDCHitDCTk=addHitsToTk(m_DCDigiCol,dcTrack,"DC digi(dcTrack)",nDCHitDCTk);
+                }
+                debug()<<"dcTrack nHit "<<dcTrack.trackerHits_size()<<dcTrack<<endmsg;
+            }
         }
-        //sdtTk.addToTrackStates(trackStateFirstDCHit);
 
-        ///Add other track properties
-        dcTrack.setNdf(dcTrack.trackerHits_size()-5);
+        debug()<<"sdtTk nHit "<<sdtTk.trackerHits_size()<<sdtTk<<endmsg;
+        debug()<<"nVXDHit "<<nVXDHit<<" nSITHit "<<nSITHit<<" nSETHit "<<nSETHit
+            <<" nFTDHit "<<nFTDHit<<" nDCHitSDTTk "<<nDCHitSDTTk<<endmsg;
+        std::cout<<"iSitrk = " << iSitrk << " nVXDHit "<<nVXDHit<<" nSITHit "<<nSITHit<<" nSETHit "<<nSETHit
+            <<" nFTDHit "<<nFTDHit<<" nDCHitSDTTk "<<nDCHitSDTTk<<std::endl;;
 
-        ///Add DC hits to tracks after track state set
-        if(m_useIdealHit){
-            nDCHitDCTk=addIdealHitsToTk(m_DCDigiCol,truthTrackerHitCol,dcTrack,
-                    "DC digi",nDCHitDCTk);
-        }else{
-            nDCHitDCTk=addHitsToTk(m_DCDigiCol,dcTrack,"DC digi",nDCHitDCTk);
-        }
-//        if(m_useSi) nDCHitSDTTk=addHitsToTk(m_DCDigiCol,sdtTk,"DC digi",nDCHitSDTTk);
-       // if(m_useSi)
-       // {
-        if(m_smearHits){
-            m_nSmearDCTrackHit = smearDCTkhit(m_DCDigiCol,
-                    m_SmeartruthTrackerHitCol,m_DCSimTrackerHitCol,
-                    w_SimSmearHCol,m_DCHitAssociationCol,
-                    w_SmearAssociationCol,m_resX,m_resY,m_resZ);
+        if(m_tuple){
+            m_nHitOnSdtTkVXD[iSitrk]=nVXDHit;
+            m_nHitOnSdtTkSIT[iSitrk]=nSITHit;
+            m_nHitOnSdtTkDC[iSitrk]=nDCHitSDTTk;
+            m_nHitOnSdtTk[iSitrk]=sdtTk.trackerHits_size();
+            StatusCode sc=m_tuple->write();
         }
+    }//end of loop over siTk
 
-        if(!m_useNoiseHits)
-        {
-            //nDCHitSDTTk=addHitsToTk(m_DCDigiCol,sdtTk,"DC digi",nDCHitSDTTk);
-            nDCHitSDTTk=addHitsToTk(m_SmeartruthTrackerHitCol,sdtTk,"DC digi",nDCHitSDTTk);
-        } else {
-            m_nNoiseOnSdtTk = makeNoiseHit(SimVec,Vec,AssoVec,
-                    m_SmeartruthTrackerHitCol.get(),w_SmearAssociationCol.get());
-            if(debugNoiseHitsCol(Vec))std::cout << " Make noise hits successfully!" << std::endl;
-            nDCHitSDTTk=addHitsToTk(w_NoiseHitCol,sdtTk,
-                    "DC digi",nDCHitSDTTk);
-        } 
-        //}
-
-        //track.setType();//TODO
-        //track.setChi2(gauss(digiDCHitsCol->size-5(),1));//FIXME
-        //track.setDEdx();//TODO
-
-        debug()<<"dcTrack nHit "<<dcTrack.trackerHits_size()<<dcTrack<<endmsg;
-    }
-
-    ///Set other track parameters
-    //sdtTk.setNdf(sdtTk.trackerHits_size()-5);
-    //double radiusOfInnermostHit=1e9;
-    //edm4hep::Vector3d digiPos=digiDC.getPosition();
-    //double r=sqrt(digiPos.x*digiPos.x+digiPos.y*digiPos.y);
-    //if(r<radiusOfInnermostHit) radiusOfInnermostHit=r;
-
-    debug()<<"sdtTk nHit "<<sdtTk.trackerHits_size()<<sdtTk<<endmsg;
-    debug()<<"nVXDHit "<<nVXDHit<<" nSITHit "<<nSITHit<<" nSETHit "<<nSETHit
-        <<" nFTDHit "<<nFTDHit<<" nDCHitSDTTk "<<nDCHitSDTTk<<endmsg;
-
-    if(m_tuple){
-        m_nHitOnSdtTkVXD=nVXDHit;
-        m_nHitOnSdtTkSIT=nSITHit;
-        m_nHitOnSdtTkSET=nSETHit;
-        m_nHitOnSdtTkFTD=nFTDHit;
-        m_nHitOnSdtTkDC=nDCHitSDTTk;
-        //m_nHitOnSdtTk=sdtTk.trackerHits_size();
-        debugEvent();
-        StatusCode sc=m_tuple->write();
-    }
+    debugEvent();
+    StatusCode sc=m_tuple->write();
 
     return StatusCode::SUCCESS;
 }
@@ -401,88 +424,71 @@ StatusCode TruthTrackerAlg::finalize()
 }
 
 void TruthTrackerAlg::getTrackStateFromMcParticle(
-        const edm4hep::MCParticleCollection* mcParticleCol,
+        edm4hep::MCParticle mcParticle,
         edm4hep::TrackState& trackState)
 {
     ///Convert MCParticle to DC Track and ReconstructedParticle
-    debug()<<"MCParticleCol size="<<mcParticleCol->size()<<endmsg;
-    for(auto mcParticle : *mcParticleCol){
-        /// skip mcParticleVertex do not have enough associated hits TODO
-        ///Vertex
-        const edm4hep::Vector3d mcParticleVertex=mcParticle.getVertex();//mm
-        edm4hep::Vector3f mcParticleVertexSmeared;//mm
-        mcParticleVertexSmeared.x=
-            CLHEP::RandGauss::shoot(mcParticleVertex.x,m_resVertexX);
-        mcParticleVertexSmeared.y=
-            CLHEP::RandGauss::shoot(mcParticleVertex.y,m_resVertexY);
-        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=
-        //    CLHEP::RandGauss::shoot(mcParticlePt,m_resPT);
-        double mcParticleMomPhi=atan2(mcParticleMom.y,mcParticleMom.x);
-        double mcParticleMomPhiSmeared=
-            CLHEP::RandGauss::shoot(mcParticleMomPhi,m_resMomPhi);
-        edm4hep::Vector3f mcParticleMomSmeared;
-        mcParticleMomSmeared.x=mcParticlePt*cos(mcParticleMomPhiSmeared);
-        mcParticleMomSmeared.y=mcParticlePt*sin(mcParticleMomPhiSmeared);
-        mcParticleMomSmeared.z=CLHEP::RandGauss::shoot(mcParticleMom.z,m_resPz);
-
-        ///Converted to Helix
-        double B[3]={1e9,1e9,1e9};
-        m_dd4hepField.magneticField({0.,0.,0.},B);
-        HelixClass helix;
-        //float pos[3]={mcParticleVertexSmeared.x,
-        //    mcParticleVertexSmeared.y,mcParticleVertexSmeared.z};
-        //float mom[3]={mcParticleMomSmeared.x,mcParticleMomSmeared.y,
-        //    mcParticleMomSmeared.z};
-        ////FIXME DEBUG
-        double pos[3]={mcParticleVertex.x,mcParticleVertex.y,mcParticleVertex.z};//mm
-        double mom[3]={mcParticleMom.x,mcParticleMom.y,mcParticleMom.z};//mm
-        helix.Initialize_VP(pos,mom,mcParticle.getCharge(),B[2]/dd4hep::tesla);
-        if(m_tuple) {
-            for(int ii=0;ii<3;ii++) {
-                m_mcMom[ii]=mom[ii];//GeV
-                m_mcPos[ii]=pos[ii];//mm
-            }
-        }
-
-        ///new Track
-        trackState.D0=helix.getD0();
-        trackState.phi=helix.getPhi0();
-        trackState.omega=helix.getOmega();
-        trackState.Z0=helix.getZ0();
-        trackState.tanLambda=helix.getTanLambda();
-        trackState.referencePoint=helix.getReferencePoint();
-
-        decltype(trackState.covMatrix) covMatrix;
-        for(int i=0;i<covMatrix.size();i++){covMatrix[i]=999.;}//FIXME
-
-        trackState.covMatrix=covMatrix;
-
-        getCircleFromPosMom(pos,mom,B[2]/dd4hep::tesla,mcParticle.getCharge(),m_helixRadius,m_helixXC,m_helixYC);
-
-        debug()<<"dd4hep::mm "<<dd4hep::mm<<" dd4hep::cm "<<dd4hep::cm<<endmsg;
-        debug()<<"mcParticle "<<mcParticle
-            <<" helix radius "<<helix.getRadius()<<" "<<helix.getXC()<<" "
-            <<helix.getYC()<<" mm "
-            <<" myhelix radius "<<m_helixRadius<<" "<<m_helixXC<<" "
-            <<m_helixYC<<" mm "
-            <<" momMC "<<mom[0]<<" "<<mom[1]<<" "<<mom[2]<<"GeV"
-            <<" posMC "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<"mm"
-            <<" momPhi "<<mcParticleMomPhi
-            <<" mcParticleVertex("<<mcParticleVertex<<")mm "
-            <<" mcParticleVertexSmeared("<<mcParticleVertexSmeared<<")mm "
-            <<" mcParticleMom("<<mcParticleMom<<")GeV "
-            <<" mcParticleMomSmeared("<<mcParticleMomSmeared<<")GeV "
-            <<" Bxyz "<<B[0]/dd4hep::tesla<<" "<<B[1]/dd4hep::tesla
-            <<" "<<B[2]/dd4hep::tesla<<" tesla"<<endmsg;
-    }//end loop over MCParticleCol
+    /// skip mcParticleVertex do not have enough associated hits TODO
+    ///Vertex
+    const edm4hep::Vector3d mcParticleVertex=mcParticle.getVertex();//mm
+    edm4hep::Vector3f mcParticleVertexSmeared;//mm
+    mcParticleVertexSmeared.x=
+        CLHEP::RandGauss::shoot(mcParticleVertex.x,m_resVertexX);
+    mcParticleVertexSmeared.y=
+        CLHEP::RandGauss::shoot(mcParticleVertex.y,m_resVertexY);
+    mcParticleVertexSmeared.z=
+        CLHEP::RandGauss::shoot(mcParticleVertex.z,m_resVertexZ);
+    ///Momentum
+    const edm4hep::Vector3f mcParticleMom=mcParticle.getMomentum();//GeV
+    float mcParticlePt=sqrt(mcParticleMom.x*mcParticleMom.x+
+            mcParticleMom.y*mcParticleMom.y);
+    //float mcParticlePtSmeared=
+    //    CLHEP::RandGauss::shoot(mcParticlePt,m_resPT);
+    float mcParticleMomPhi=atan2(mcParticleMom.y,mcParticleMom.x);
+    float mcParticleMomPhiSmeared=
+        CLHEP::RandGauss::shoot(mcParticleMomPhi,m_resMomPhi);
+    edm4hep::Vector3f mcParticleMomSmeared;
+    mcParticleMomSmeared.x=mcParticlePt*cos(mcParticleMomPhiSmeared);
+    mcParticleMomSmeared.y=mcParticlePt*sin(mcParticleMomPhiSmeared);
+    mcParticleMomSmeared.z=CLHEP::RandGauss::shoot(mcParticleMom.z,m_resPz);
+
+    ///Converted to Helix
+    double B[3]={1e9,1e9,1e9};
+    m_dd4hepField.magneticField({0.,0.,0.},B);
+    HelixClass helix;
+    ////FIXME DEBUG
+    float pos[3]={mcParticleVertex.x,mcParticleVertex.y,mcParticleVertex.z};//mm
+    float mom[3]={mcParticleMom.x,mcParticleMom.y,mcParticleMom.z};//mm
+    helix.Initialize_VP(pos,mom,mcParticle.getCharge(),B[2]/dd4hep::tesla);
+
+    ///new Track
+    trackState.D0=helix.getD0();
+    trackState.phi=helix.getPhi0();
+    trackState.omega=helix.getOmega();
+    trackState.Z0=helix.getZ0();
+    trackState.tanLambda=helix.getTanLambda();
+    trackState.referencePoint=helix.getReferencePoint();
+    decltype(trackState.covMatrix) covMatrix;
+    for(int i=0;i<covMatrix.size();i++){covMatrix[i]=999.;}//FIXME
+    trackState.covMatrix=covMatrix;
+
+    getCircleFromPosMom(pos,mom,B[2]/dd4hep::tesla,mcParticle.getCharge(),m_helixRadius,m_helixXC,m_helixYC);
+
+    debug()<<"dd4hep::mm "<<dd4hep::mm<<" dd4hep::cm "<<dd4hep::cm<<endmsg;
+    debug()<<"mcParticle "<<mcParticle
+        <<" helix radius "<<helix.getRadius()<<" "<<helix.getXC()<<" "
+        <<helix.getYC()<<" mm "
+        <<" myhelix radius "<<m_helixRadius<<" "<<m_helixXC<<" "
+        <<m_helixYC<<" mm "
+        <<" momMC "<<mom[0]<<" "<<mom[1]<<" "<<mom[2]<<"GeV"
+        <<" posMC "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<"mm"
+        <<" momPhi "<<mcParticleMomPhi
+        <<" mcParticleVertex("<<mcParticleVertex<<")mm "
+        <<" mcParticleVertexSmeared("<<mcParticleVertexSmeared<<")mm "
+        <<" mcParticleMom("<<mcParticleMom<<")GeV "
+        <<" mcParticleMomSmeared("<<mcParticleMomSmeared<<")GeV "
+        <<" Bxyz "<<B[0]/dd4hep::tesla<<" "<<B[1]/dd4hep::tesla
+        <<" "<<B[2]/dd4hep::tesla<<" tesla"<<endmsg;
 }//end of getTrackStateFromMcParticle
 
 bool TruthTrackerAlg::getTrackStateFirstHit(
@@ -504,9 +510,6 @@ bool TruthTrackerAlg::getTrackStateFirstHit(
                 minHitTime=dcSimTrackerHit.getTime();
                 firstHit=dcSimTrackerHit;
             }
-            //debug()<<"simTrackerHit time "<<dcSimTrackerHit.getTime()
-            //    <<" pos "<<dcSimTrackerHit.getPosition()
-            //    <<" mom "<<dcSimTrackerHit.getMomentum()<<endmsg;
         }
         const edm4hep::Vector3d pos=firstHit.getPosition();
         const edm4hep::Vector3f mom=firstHit.getMomentum();
@@ -544,6 +547,7 @@ void TruthTrackerAlg::debugEvent()
         ///Retrieve silicon Track
         const edm4hep::TrackCollection* siTrackCol=nullptr;
         siTrackCol=m_siSubsetTrackCol.get();
+        int nSiTrk = 0;
         if(nullptr!=siTrackCol){
             for(auto siTk:*siTrackCol){
                 debug()<<"siTk: "<<siTk<<endmsg;
@@ -555,17 +559,12 @@ void TruthTrackerAlg::debugEvent()
                         trackStat.omega, trackStat.tanLambda, B[2]/dd4hep::tesla);
 
                 if(m_tuple){
-                    m_siMom[0]=helix.getMomentum()[0];
-                    m_siMom[1]=helix.getMomentum()[1];
-                    m_siMom[2]=helix.getMomentum()[2];
-                    m_siPos[0]=helix.getReferencePoint()[0];
-                    m_siPos[1]=helix.getReferencePoint()[1];
-                    m_siPos[2]=helix.getReferencePoint()[2];
-                    m_nHitOnSiTkVXD=nHotsOnTrack(siTk,lcio::ILDDetID::VXD);
-                    m_nHitOnSiTkSIT=nHotsOnTrack(siTk,lcio::ILDDetID::SIT);
-                    m_nHitOnSiTkSET=nHotsOnTrack(siTk,lcio::ILDDetID::SET);
-                    m_nHitOnSiTkFTD=nHotsOnTrack(siTk,lcio::ILDDetID::FTD);
+                    m_nHitOnSiTkVXD[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::VXD);
+                    m_nHitOnSiTkSIT[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::SIT);
+                    m_nHitOnSiTkSET[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::SET);
+                    m_nHitOnSiTkFTD[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::FTD);
                 }
+                nSiTrk++;
             }//end of loop over siTk
         }
         if(m_tuple){
@@ -581,19 +580,13 @@ void TruthTrackerAlg::debugEvent()
             m_nTrackerHitSET=trackerHitColSize(m_SETTrackerHits);
             m_nTrackerHitFTD=trackerHitColSize(m_FTDTrackerHits);
             m_nTrackerHitDC=trackerHitColSize(m_DCDigiCol);
-
-            //SpacePoints
-            if(m_useSiSpacePoint){
-                m_nSpacePointSIT=trackerHitColSize(m_SITSpacePointCol);
-            }
-            //m_nSpacePointSET=trackerHitColSize(m_SETSpacePointCol);
-            m_nSpacePointFTD=trackerHitColSize(m_FTDSpacePointCol);
         }
     }
 }
 
-int TruthTrackerAlg::addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
-        colHandle, edm4hep::TrackerHitCollection*& truthTrackerHitCol,
+int TruthTrackerAlg::addIdealHitsToTk(
+        DataHandle<edm4hep::TrackerHitCollection>& colHandle,
+        edm4hep::TrackerHitCollection*& truthTrackerHitCol,
         edm4hep::MutableTrack& track, const char* msg,int nHitAdded)
 {
     if(nHitAdded>0) return nHitAdded;
@@ -611,13 +604,14 @@ int TruthTrackerAlg::addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
         //calc. doca of helix to wire
         TVector3 wire(endPointStart.X()/dd4hep::mm,endPointStart.Y()/dd4hep::mm,0);//to mm
         TVector3 center(m_helixXC,m_helixYC,0);//mm
-        double docaIdeal=(center-wire).Mag()-m_helixRadius;//mm
+        float docaIdeal=(center-wire).Mag()-m_helixRadius;//mm
         TVector3 centerFirst(m_helixXCFirst,m_helixYCFirst,0);//mm
-        double docaIdealFirst=(centerFirst-wire).Mag()-m_helixRadiusFirst;//mm
+        float docaIdealFirst=(centerFirst-wire).Mag()-m_helixRadiusFirst;//mm
 
         //add modified hit
         auto tmpHit = truthTrackerHitCol->create();
         tmpHit=hit.clone();
+        //tmpHit=hit;
         tmpHit.setTime(fabs(docaIdeal)*1e3/40.);//40#um/ns, drift time in ns
         track.addToTrackerHits(tmpHit);
 
@@ -633,182 +627,119 @@ int TruthTrackerAlg::addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
     return nHit;
 }
 
-bool TruthTrackerAlg::debugNoiseHitsCol(edm4hep::TrackerHitCollection* Vec)
+int TruthTrackerAlg::addHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
+colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded)
 {
-    m_nNoiseDCTrackHit = Vec->size();
-std::cout << "  m_nNoiseDCTrackHit = " <<  m_nNoiseDCTrackHit << std::endl;
-    int ihit=0;
-    for(auto Vechit: *Vec)
-    {
-        m_NoiseDriftDistance[ihit] = (Vechit.getTime())*m_driftVelocity*1e-3;
-        ihit++;
+    if(nHitAdded>0) return nHitAdded;
+    int nHit=0;
+    const edm4hep::TrackerHitCollection* col=colHandle.get();
+    debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg;
+    //sort,FIXME
+    for(auto hit:*col){
+        track.addToTrackerHits(hit);
+        ++nHit;
     }
-
-    return true;
+    return nHit;
 }
 
-int TruthTrackerAlg::makeNoiseHit(edm4hep::SimTrackerHitCollection* SimVec,
-        edm4hep::TrackerHitCollection* Vec,
-        edm4hep::MCRecoTrackerAssociationCollection* AssoVec,
-        const edm4hep::TrackerHitCollection* digiDCHitsCol,
-        const edm4hep::MCRecoTrackerAssociationCollection* assoHits)
+int TruthTrackerAlg::addOneLayerHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
+colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded)
 {
-    int nNoise = 0;
-    //loop all hits
-    for(unsigned int i = 0; i<(digiDCHitsCol->size()); i++)
-    {
-        edm4hep::TrackerHit mcHit = digiDCHitsCol->at(i);
-        unsigned long long wcellid = mcHit.getCellID();
-
-        float pocaTime = mcHit.getTime();
-
-        // store trackHit
-        auto trkHit = Vec->create();
-
-        trkHit.setCellID(wcellid);
-        trkHit.setTime(pocaTime);
-        trkHit.setEDep(mcHit.getEDep());
-        //trkHit.setEdx(mcHit.getEdx());
-        trkHit.setPosition(mcHit.getPosition());
-        trkHit.setCovMatrix(mcHit.getCovMatrix());
-        for(int iAsso=0;iAsso<(int) assoHits->size();iAsso++)
-        {
-
-            if(assoHits->at(iAsso).getRec().getCellID()==wcellid )
-            {
-                auto SimtrkHit = SimVec->create();
-
-                SimtrkHit.setCellID(assoHits->at(iAsso).getSim().getCellID());
-                SimtrkHit.setEDep(assoHits->at(iAsso).getSim().getEDep());
-                SimtrkHit.setTime(assoHits->at(iAsso).getSim().getTime());
-                SimtrkHit.setPathLength(assoHits->at(iAsso).getSim().getPathLength());
-                SimtrkHit.setQuality(assoHits->at(iAsso).getSim().getQuality());
-                SimtrkHit.setPosition(assoHits->at(iAsso).getSim().getPosition());
-                SimtrkHit.setMomentum(assoHits->at(iAsso).getSim().getMomentum());
-                SimtrkHit.setMCParticle(assoHits->at(iAsso).getSim().getMCParticle());
-
-                auto asso = AssoVec->create();
-                asso.setRec(trkHit);
-                asso.setSim(SimtrkHit);
-                asso.setWeight(SimtrkHit.getEDep()/trkHit.getEDep());
-            }
+    if(nHitAdded>0) return nHitAdded;
+    int nHit=0;
+    const edm4hep::TrackerHitCollection* col=colHandle.get();
+    debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg;
+    //sort,FIXME
+    bool isHaveHit[55]={0};
+    for(auto hit:*col){
+        unsigned long long cellID=hit.getCellID();
+        int layer = m_decoder->get(cellID,"layer");
+        if(!(isHaveHit[layer])){
+            track.addToTrackerHits(hit);
+            ++nHit;
         }
+        isHaveHit[layer] = 1;
+    }
+    return nHit;
+}
 
-        double prob1 = fRandom.Uniform(1.);
-        if(prob1 > m_fHitPurity) continue;
-
-        float noiseTime = m_pocaTime*fRandom.Uniform(1.);
-        if(noiseTime>pocaTime) continue;
-        nNoise++;
-        trkHit.setTime(noiseTime);
-
-        for(int iAsso=0;iAsso<(int) assoHits->size();iAsso++)
+void TruthTrackerAlg::getAssoMCParticle(
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        edm4hep::TrackerHit trackerHit,
+        edm4hep::MCParticle& mcParticle) const
+{
+    edm4hep::SimTrackerHit simTrackerHit;
+    for(auto assoHit: *assoHits){
+        if(assoHit.getRec()==trackerHit)
         {
-
-            if(assoHits->at(iAsso).getRec().getCellID()==wcellid )
-            {
-
-                AssoVec->at(iAsso).setRec(trkHit);
-
-            }
+            simTrackerHit=assoHit.getSim();
+            mcParticle = simTrackerHit.getMCParticle();
 
         }
-
     }
-
-std::cout << " Truth Noise number = " << nNoise << std::endl;
-    return nNoise;
 }
 
-int TruthTrackerAlg::smearDCTkhit(DataHandle<edm4hep::TrackerHitCollection>&
-        colHandle,DataHandle<edm4hep::TrackerHitCollection>& smearCol,
-        DataHandle<edm4hep::SimTrackerHitCollection>& SimDCHitCol,
-        DataHandle<edm4hep::SimTrackerHitCollection>& SimSmearDCHitCol,
-        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoDCHitCol,
-        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoSmearDCHitCol,
-        double resX, double resY, double resZ)
+edm4hep::SimTrackerHit TruthTrackerAlg::getAssoSimTrackerHit(
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        edm4hep::TrackerHit trackerHit) const
 {
-    int nHit=0;
-    const edm4hep::TrackerHitCollection* col=colHandle.get();
-    auto smearTrackerHitCol = smearCol.createAndPut();
-
-    auto simDCCol = SimDCHitCol.get();
-    auto SimVec = SimSmearDCHitCol.createAndPut();
-
-    auto assoHits = AssoDCHitCol.get();
-    auto AssoVec = AssoSmearDCHitCol.createAndPut();
-
-    //sort,FIXME
-    for(auto hit:*col){
-
-        auto smearHit=smearTrackerHitCol->create();
-
-        float truthD = (hit.getTime())*m_driftVelocity*1e-3;
-        m_DriftDistance[nHit] = truthD;
-
-        truthD+=gRandom->Gaus(0,fabs(m_resX));
-        m_SmearDriftDistance[nHit] = truthD;
-        float smearT = (truthD*1e3)/m_driftVelocity;
-
-        smearHit.setTime(smearT);
-        smearHit.setCellID(hit.getCellID());
-        smearHit.setType(hit.getCellID());
-        smearHit.setQuality(hit.getQuality());
-        smearHit.setEDep(hit.getEDep());
-        smearHit.setEDepError(hit.getEDepError());
-        //smearHit.setEdx(hit.getEdx());
-        smearHit.setPosition(hit.getPosition());
-        smearHit.setCovMatrix(hit.getCovMatrix());
-        smearHit.addToRawHits(hit.getObjectID());
-
-        ++nHit;
-        for(int iAsso=0;iAsso<(int) assoHits->size();iAsso++)
+    edm4hep::SimTrackerHit simTrackerHit;
+    for(auto assoHit: *assoHits){
+        if(assoHit.getRec()==trackerHit)
         {
-
-            if(assoHits->at(iAsso).getRec().getCellID()== smearHit.getCellID())
-            {
-                auto SimtrkHit = SimVec->create();
-
-                SimtrkHit.setCellID(assoHits->at(iAsso).getSim().getCellID());
-                SimtrkHit.setEDep(assoHits->at(iAsso).getSim().getEDep());
-                SimtrkHit.setTime(assoHits->at(iAsso).getSim().getTime());
-                SimtrkHit.setPathLength(assoHits->at(iAsso).getSim().getPathLength());
-                SimtrkHit.setQuality(assoHits->at(iAsso).getSim().getQuality());
-                SimtrkHit.setPosition(assoHits->at(iAsso).getSim().getPosition());
-                SimtrkHit.setMomentum(assoHits->at(iAsso).getSim().getMomentum());
-                SimtrkHit.setMCParticle(assoHits->at(iAsso).getSim().getMCParticle());
-
-                auto asso = AssoVec->create();
-                asso.setRec(smearHit);
-                asso.setSim(SimtrkHit);
-                asso.setWeight(SimtrkHit.getEDep()/smearHit.getEDep());
-            }
+            simTrackerHit=assoHit.getSim();
         }
     }
-    std::cout << " SimSmear size = " <<  SimVec->size() << " Asso size = " << AssoVec->size() << std::endl;
-    std::cout << " Sim size = " <<  simDCCol->size() << " Asso size = " << assoHits->size() << std::endl;
-
-    return nHit;
+    return simTrackerHit;
 }
 
-int TruthTrackerAlg::addHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
-        colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded)
+int TruthTrackerAlg::getSiMCParticle(edm4hep::Track siTrack,
+        const edm4hep::TrackerHitCollection* dcTrackerHits,
+        const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso,
+        const edm4hep::MCRecoTrackerAssociationCollection* sitAsso,
+        const edm4hep::MCRecoTrackerAssociationCollection* setAsso,
+        const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso,
+        const edm4hep::MCRecoTrackerAssociationCollection* dcAsso
+        )
 {
-    if(nHitAdded>0) return nHitAdded;
-    int nHit=0;
-    const edm4hep::TrackerHitCollection* col=colHandle.get();
-    debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg;
-    //sort,FIXME
-    for(auto hit:*col){
-        track.addToTrackerHits(hit);
-        ++nHit;
+    int nDCHit =0;
+
+    edm4hep::TrackerHit trackerHit = siTrack.getTrackerHits(0);
+    unsigned long long cellID = trackerHit.getCellID();
+    UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string) ;
+    encoder.setValue(cellID);
+    int detID=encoder[lcio::ILDCellID0::subdet] ;
+    edm4hep::MCParticle mcParticle;
+    if(lcio::ILDDetID::VXD==detID){
+        std::cout << "the hit from VXD!!" << std::endl;
+        getAssoMCParticle(vxdAsso,trackerHit,mcParticle);
+    }else if(lcio::ILDDetID::SIT==detID){
+        getAssoMCParticle(sitAsso,trackerHit,mcParticle);
+        std::cout << "the hit from SIT!!" << std::endl;
+    }else if(lcio::ILDDetID::SET==detID){
+        getAssoMCParticle(setAsso,trackerHit,mcParticle);
+        std::cout << "the hit from SET!!" << std::endl;
+    }else if(lcio::ILDDetID::FTD==detID){
+        getAssoMCParticle(ftdAsso,trackerHit,mcParticle);
+        std::cout << "the hit from FTD!!" << std::endl;
+    }else{
+        std::cout << "the hit from ERROR!!" << std::endl;
     }
-    return nHit;
+
+    for(auto dcHit:*dcTrackerHits){
+
+        edm4hep::SimTrackerHit simDCHit = getAssoSimTrackerHit(dcAsso,dcHit);
+
+        if(mcParticle==simDCHit.getMCParticle()) nDCHit++;
+    }
+    return nDCHit;
 }
 
+
 int TruthTrackerAlg::addSimHitsToTk(
         DataHandle<edm4hep::SimTrackerHitCollection>& colHandle,
         edm4hep::TrackerHitCollection*& truthTrackerHitCol,
+        //edm4hep::Track& track, const char* msg,int nHitAdded)
         edm4hep::MutableTrack& track, const char* msg,int nHitAdded)
 {
     if(nHitAdded>0) return nHitAdded;
@@ -824,7 +755,7 @@ int TruthTrackerAlg::addSimHitsToTk(
         debug()<<" addSimHitsToTk "<<msg<<" "<<sqrt(pos.x*pos.x+pos.y*pos.y)<<endmsg;
         UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string) ;
         int detID=encoder[lcio::ILDCellID0::subdet] ;
-        double resolution[3];
+        float resolution[3];
         if(lcio::ILDDetID::VXD==detID){
             for(int i=0;i<3;i++)resolution[i]=m_resVXD[i];
         }else if(lcio::ILDDetID::SIT==detID){
@@ -863,10 +794,67 @@ int TruthTrackerAlg::addSimHitsToTk(
     return nHit;
 }
 
+bool TruthTrackerAlg::debugVertex(edm4hep::Track sourceTrack,
+        const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso,
+        const edm4hep::MCRecoTrackerAssociationCollection* sitAsso,
+        const edm4hep::MCRecoTrackerAssociationCollection* setAsso,
+        const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso
+        ){
+    for(unsigned int iHit=0;iHit<sourceTrack.trackerHits_size();iHit++){
+        edm4hep::TrackerHit hit=sourceTrack.getTrackerHits(iHit);
+        edm4hep::Vector3d position = hit.getPosition();
+
+        unsigned long long cellID = hit.getCellID();
+        UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string) ;
+        encoder.setValue(cellID);
+
+        int detID=encoder[lcio::ILDCellID0::subdet] ;
+
+        edm4hep::SimTrackerHit simTrackerHit;
+        edm4hep::MCParticle mcParticle;
+        if(lcio::ILDDetID::VXD==detID){
+            simTrackerHit = getAssoSimTrackerHit(vxdAsso,hit);
+            getAssoMCParticle(vxdAsso,hit,mcParticle);
+        }else if(lcio::ILDDetID::SIT==detID){
+            simTrackerHit = getAssoSimTrackerHit(sitAsso,hit);
+            getAssoMCParticle(sitAsso,hit,mcParticle);
+        }else if(lcio::ILDDetID::SET==detID){
+            simTrackerHit = getAssoSimTrackerHit(setAsso,hit);
+            getAssoMCParticle(setAsso,hit,mcParticle);
+        }else if(lcio::ILDDetID::FTD==detID){
+            simTrackerHit = getAssoSimTrackerHit(ftdAsso,hit);
+            getAssoMCParticle(ftdAsso,hit,mcParticle);
+        }else{
+            std::cout << __LINE__ <<"the hit from ERROR!!" << std::endl;
+        }
+
+        edm4hep::Vector3f momentum = simTrackerHit.getMomentum();
+
+        float pos[3] = {position[0],position[1],position[2]};
+        float mom[3] = {momentum[0]*1e-1,momentum[1]*1e-1,momentum[2]*1e-1};
+
+        float mcPos[3] = {mcParticle.getVertex().x,mcParticle.getVertex().y,mcParticle.getVertex().z};
+        float mcMom[3] = {mcParticle.getMomentum().x,mcParticle.getMomentum().y,mcParticle.getMomentum().z};
+
+        HelixClass helix;
+        helix.Initialize_VP(pos,mom,mcParticle.getCharge(),3);
+
+        HelixClass mcHelix;
+        mcHelix.Initialize_VP(mcPos,mcMom,mcParticle.getCharge(),3);
+
+        float deltaD0 = helix.getD0()-mcHelix.getD0();
+        float deltaZ0 = helix.getZ0()-mcHelix.getZ0();
+        if((1000*deltaD0)>30 || (1000*deltaZ0)>30){ //um
+            return true;
+            break;
+        }
+    }
+    return false;
+}
+
 int TruthTrackerAlg::addHotsToTk(edm4hep::Track& sourceTrack,
-        edm4hep::MutableTrack& targetTrack, int hitType,const char* msg,int nHitAdded)
+    edm4hep::MutableTrack& targetTrack, int hitType,const char* msg,int nHitAdded)
 {
-    if(nHitAdded>0) return nHitAdded;
     int nHit=0;
     for(unsigned int iHit=0;iHit<sourceTrack.trackerHits_size();iHit++){
         edm4hep::TrackerHit hit=sourceTrack.getTrackerHits(iHit);
@@ -889,6 +877,7 @@ int TruthTrackerAlg::nHotsOnTrack(edm4hep::Track& track, int hitType)
     int nHit=0;
     for(unsigned int iHit=0;iHit<track.trackerHits_size();iHit++){
         edm4hep::TrackerHit hit=track.getTrackerHits(iHit);
+        //edm4hep::ConstTrackerHit hit=track.getTrackerHits(iHit);
         UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string);
         encoder.setValue(hit.getCellID());
         if(encoder[lcio::ILDCellID0::subdet]==hitType){
@@ -912,13 +901,13 @@ int TruthTrackerAlg::simTrackerHitColSize(DataHandle<edm4hep::SimTrackerHitColle
     return 0;
 }
 //unit length is mm
-void TruthTrackerAlg::getCircleFromPosMom(double pos[3],double mom[3],
-        double Bz,double q,double& helixRadius,double& helixXC,double& helixYC)
+void TruthTrackerAlg::getCircleFromPosMom(float pos[3],float mom[3],
+        float Bz,float q,float& helixRadius,float& helixXC,float& helixYC)
 {
-    double FCT = 2.99792458E-4;//mm
-    double pxy = sqrt(mom[0]*mom[0]+mom[1]*mom[1]);
+    float FCT = 2.99792458E-4;//mm
+    float pxy = sqrt(mom[0]*mom[0]+mom[1]*mom[1]);
     helixRadius = pxy / (FCT*Bz);
-    double phiMomRefPoint = atan2(mom[1],mom[0]);
+    float phiMomRefPoint = atan2(mom[1],mom[0]);
     helixXC= pos[0] + helixRadius*cos(phiMomRefPoint-M_PI*0.5*q);
     helixYC= pos[1] + helixRadius*sin(phiMomRefPoint-M_PI*0.5*q);
 }
diff --git a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h
index 563d9854..d548c840 100644
--- a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h
+++ b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h
@@ -18,8 +18,11 @@ namespace dd4hep {
 }
 namespace edm4hep {
     class MCParticleCollection;
+    class MCParticle;
     class SimTrackerHitCollection;
+    class SimTrackerHit;
     class TrackerHitCollection;
+    class TrackerHit;
     class TrackCollection;
     class Track;
     class MutableTrack;
@@ -39,8 +42,9 @@ class TruthTrackerAlg: public GaudiAlgorithm
         virtual StatusCode finalize() override;
 
     private:
-        void getTrackStateFromMcParticle(const edm4hep::MCParticleCollection*
-                mcParticleCol, edm4hep::TrackState& stat);
+        int eventNo;
+        void getTrackStateFromMcParticle(edm4hep::MCParticle mcParticleCol,
+                edm4hep::TrackState& stat);
         int addSimHitsToTk(DataHandle<edm4hep::SimTrackerHitCollection>&
                 colHandle, edm4hep::TrackerHitCollection*& truthTrackerHitCol,
                 edm4hep::MutableTrack& track, const char* msg,int nHitAdded);
@@ -50,9 +54,11 @@ class TruthTrackerAlg: public GaudiAlgorithm
                 DataHandle<edm4hep::SimTrackerHitCollection>& SimSmearDCHitCol,
                 DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoDCHitCol,
                 DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoSmearDCHitCol,
-                double resX, double resY, double resZ);
+                float resX, float resY, float resZ);
         int addHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
                 colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded);
+        int addOneLayerHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
+                colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded);
         int addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>&
                 colHandle, edm4hep::TrackerHitCollection*& truthTrackerHitCol,
                 edm4hep::MutableTrack& track, const char* msg,int nHitAdded);
@@ -71,15 +77,31 @@ class TruthTrackerAlg: public GaudiAlgorithm
         dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber;
         dd4hep::DDSegmentation::BitFieldCoder* m_decoder;
         void debugEvent();
+        bool debugVertex(edm4hep::Track sourceTrack,
+                const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso,
+                const edm4hep::MCRecoTrackerAssociationCollection* sitAsso,
+                const edm4hep::MCRecoTrackerAssociationCollection* setAsso, 
+                const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso);
         //unit length is mm
-        void getCircleFromPosMom(double pos[3],double mom[3],
-                double Bz,double q,double& helixRadius,double& helixXC,double& helixYC);
+        void getCircleFromPosMom(float pos[3],float mom[3],
+                float Bz,float q,float& helixRadius,float& helixXC,float& helixYC);
         int makeNoiseHit(edm4hep::SimTrackerHitCollection* SimVec,
                 edm4hep::TrackerHitCollection* Vec,
                 edm4hep::MCRecoTrackerAssociationCollection* AssoVec,
                 const edm4hep::TrackerHitCollection* digiDCHitsCol,
                 const edm4hep::MCRecoTrackerAssociationCollection* assoHits);
         bool debugNoiseHitsCol(edm4hep::TrackerHitCollection* Vec);
+        int getSiMCParticle(edm4hep::Track siTack,
+                const edm4hep::TrackerHitCollection* dcTrackerHits,
+                const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso,
+                const edm4hep::MCRecoTrackerAssociationCollection* sitAsso,
+                const edm4hep::MCRecoTrackerAssociationCollection* setAsso,
+                const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso,
+                const edm4hep::MCRecoTrackerAssociationCollection* dcAsso);
+        edm4hep::SimTrackerHit getAssoSimTrackerHit(const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+                edm4hep::TrackerHit trackerHit) const;
+        void getAssoMCParticle(const edm4hep::MCRecoTrackerAssociationCollection* assoHits,edm4hep::TrackerHit trackerHit,
+                edm4hep::MCParticle& mcParticle) const;
 
             //reader
             //        DataHandle<edm4hep::TrackerHitCollection> m_NoiseHitCol{
@@ -112,12 +134,24 @@ class TruthTrackerAlg: public GaudiAlgorithm
             "FTDTrackerHits" , Gaudi::DataHandle::Reader, this};
         DataHandle<edm4hep::SimTrackerHitCollection> m_VXDCollection{
             "VXDCollection" , Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_VXDHitAssociationCol{ "VXDTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
         DataHandle<edm4hep::SimTrackerHitCollection> m_SETCollection{
             "SETCollection" , Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_SETHitAssociationCol{ "SETTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
         DataHandle<edm4hep::SimTrackerHitCollection> m_SITCollection{
             "SITCollection" , Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_SITHitAssociationCol{ "SITTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
         DataHandle<edm4hep::SimTrackerHitCollection> m_FTDCollection{
             "FTDCollection" , Gaudi::DataHandle::Reader, this};
+        DataHandle<edm4hep::MCRecoTrackerAssociationCollection>
+            m_FTDHitAssociationCol{ "FTDTrackerHitAssociation",
+                Gaudi::DataHandle::Reader, this};
         //writer
         DataHandle<edm4hep::TrackCollection> m_DCTrackCol{
             "DCTrackCollection", Gaudi::DataHandle::Writer, this};
@@ -126,22 +160,6 @@ class TruthTrackerAlg: public GaudiAlgorithm
         DataHandle<edm4hep::TrackerHitCollection> m_truthTrackerHitCol{
             "TruthTrackerHitCollection", Gaudi::DataHandle::Writer, this};
 
-        // Smear hit
-        DataHandle<edm4hep::SimTrackerHitCollection> w_SimSmearHCol{
-            "SmearSimHitsCollection", Gaudi::DataHandle::Writer, this};
-        DataHandle<edm4hep::TrackerHitCollection> m_SmeartruthTrackerHitCol{
-            "SmearTrackerHitCollection", Gaudi::DataHandle::Writer, this};
-        DataHandle<edm4hep::MCRecoTrackerAssociationCollection> w_SmearAssociationCol{
-            "SmearDCHitAssociationCollection", Gaudi::DataHandle::Writer, this};
-        // make noise hit
-        DataHandle<edm4hep::SimTrackerHitCollection> w_SimNoiseHCol{
-            "NoiseSimHitsCollection", Gaudi::DataHandle::Writer, this};
-        DataHandle<edm4hep::TrackerHitCollection> w_NoiseHitCol{
-            "NoiseDCHitsCollection", Gaudi::DataHandle::Writer, this};
-        DataHandle<edm4hep::MCRecoTrackerAssociationCollection> w_NoiseAssociationCol{
-            "NoiseDCHitAssociationCollection", Gaudi::DataHandle::Writer, this};
-
-
         //readout for getting segmentation
         Gaudi::Property<std::string> m_readout_name{this, "readout",
             "DriftChamberHitsCollection"};
@@ -150,13 +168,17 @@ class TruthTrackerAlg: public GaudiAlgorithm
         Gaudi::Property<bool> m_useSi{this,"useSi",true};
         Gaudi::Property<bool> m_useTruthTrack{this,"useTruthTrack",false};
         Gaudi::Property<bool> m_useSiTruthHit{this,"useSiTruthHit",false};
+        Gaudi::Property<bool> m_useSiSimHit{this,"useSiSimHit",false};
         Gaudi::Property<bool> m_skipSecondaryHit{this,"skipSecondaryHit",true};
         Gaudi::Property<bool> m_useFirstHitForDC{this,"useFirstHitForDC",false};
         Gaudi::Property<bool> m_useSiSpacePoint{this,"useSiSpacePoint",false};
         Gaudi::Property<bool> m_useIdealHit{this,"useIdealHit",false};
 
-        Gaudi::Property<bool> m_useNoiseHits{this,"useNoiseHits",false};
-        Gaudi::Property<bool> m_smearHits{this,"smearHits",false};
+        Gaudi::Property<bool> m_useCutMom{this,"useCutMom",false};
+        Gaudi::Property<bool> m_setSiTrackConditions{this,"SetSiTrackConditions",true};
+
+        Gaudi::Property<bool> m_useTrackFinding{this,"DCTrackFinding",false};
+        Gaudi::Property<bool> m_useSelectHitsOneLayer{this,"useSelectHitsOneLayer",false};
 
         Gaudi::Property<float> m_momentumCut{this,"momentumCut",0.1};//momentum cut for the first hit
         Gaudi::Property<float> m_resPT{this,"resPT",0};//ratio
@@ -171,33 +193,20 @@ class TruthTrackerAlg: public GaudiAlgorithm
         Gaudi::Property<float> m_resVertexY{this,"resVertexY",0.003};//3um
         Gaudi::Property<float> m_resVertexZ{this,"resVertexZ",0.003};//3um
         Gaudi::Property<int> m_maxDCDigiCut{this,"maxDigiCut",1e6};
+        Gaudi::Property<int> m_debugPID{this,"debugPID",0};// {0,1,2,3,4} = {e-,mu-,pi-,K-,p}
         Gaudi::Property<std::vector<float> > m_resVXD{this,"resVXD",{0.003,0.003,0.003}};//mm
         Gaudi::Property<std::vector<float> > m_resSIT{this,"resSIT",{0.003,0.003,0.003}};//mm
         Gaudi::Property<std::vector<float> > m_resSET{this,"resSET",{0.003,0.003,0.003}};//mm
         Gaudi::Property<std::vector<float> > m_resFTDPixel{this,"resFTDPixel",{0.003,0.003,0.003}};//mm
         Gaudi::Property<std::vector<float> > m_resFTDStrip{this,"resFTDStrip",{0.003,0.003,0.003}};//mm
+        Gaudi::Property<std::vector<float> > m_cutMomHit{this,"cutMomHit",{0.65,0.04,0.2,0.05,0.14}};//e,mu,pi,K,p
 
-        Gaudi::Property<double> m_fHitPurity{this,"fHitPurity",0.1};
-        Gaudi::Property<float> m_pocaTime  { this, "pocaTime", 225};// ns
-
-        double m_helixRadius,m_helixXC,m_helixYC;
-        double m_helixRadiusFirst,m_helixXCFirst,m_helixYCFirst;
+        float m_helixRadius,m_helixXC,m_helixYC;
+        float m_helixRadiusFirst,m_helixXCFirst,m_helixYCFirst;
 
         NTuple::Tuple*  m_tuple;
-        NTuple::Item<int> m_run;
-        NTuple::Item<int> m_evt;
-        NTuple::Array<double> m_siMom;
-        NTuple::Array<double> m_siPos;
-        NTuple::Array<double> m_mcMom;
-        NTuple::Array<double> m_mcPos;
-
+        NTuple::Item<int> m_nSDTTrack;
         NTuple::Item<int> m_nDCTrackHit;
-        NTuple::Item<int> m_nSmearDCTrackHit;
-        NTuple::Item<int> m_nNoiseDCTrackHit;
-        NTuple::Array<float> m_DriftDistance;
-        NTuple::Array<float> m_SmearDriftDistance;
-        NTuple::Array<float> m_NoiseDriftDistance;
-
         NTuple::Item<int> m_nSimTrackerHitVXD;
         NTuple::Item<int> m_nSimTrackerHitSIT;
         NTuple::Item<int> m_nSimTrackerHitSET;
@@ -208,28 +217,21 @@ class TruthTrackerAlg: public GaudiAlgorithm
         NTuple::Item<int> m_nTrackerHitSET;
         NTuple::Item<int> m_nTrackerHitFTD;
         NTuple::Item<int> m_nTrackerHitDC;
-        NTuple::Item<int> m_nTrackerHitErrVXD;
-        NTuple::Item<int> m_nTrackerHitErrSIT;
-        NTuple::Item<int> m_nTrackerHitErrSET;
-        NTuple::Item<int> m_nTrackerHitErrFTD;
-        NTuple::Item<int> m_nSpacePointSIT;
-        NTuple::Item<int> m_nSpacePointSET;
-        NTuple::Item<int> m_nSpacePointFTD;
-        NTuple::Item<int> m_nSpacePointErrVXD;
-        NTuple::Item<int> m_nSpacePointErrSIT;
-        NTuple::Item<int> m_nSpacePointErrSET;
-        NTuple::Item<int> m_nSpacePointErrFTD;
-        NTuple::Item<int> m_nHitOnSiTkVXD;
-        NTuple::Item<int> m_nHitOnSiTkSIT;
-        NTuple::Item<int> m_nHitOnSiTkSET;
-        NTuple::Item<int> m_nHitOnSiTkFTD;
-        NTuple::Item<int> m_nHitOnSdtTkVXD;
-        NTuple::Item<int> m_nHitOnSdtTkSIT;
-        NTuple::Item<int> m_nHitOnSdtTkSET;
-        NTuple::Item<int> m_nHitOnSdtTkFTD;
-        NTuple::Item<int> m_nHitOnSdtTkDC;
-        NTuple::Item<int> m_nHitOnSdtTk;
-        NTuple::Item<int> m_nNoiseOnSdtTk;
+
+        NTuple::Array<int> m_nHitOnSiTkVXD;
+        NTuple::Array<int> m_nHitOnSiTkSIT;
+        NTuple::Array<int> m_nHitOnSiTkSET;
+        NTuple::Array<int> m_nHitOnSiTkFTD;
+        NTuple::Array<int> m_nHitOnSdtTkVXD;
+        NTuple::Array<int> m_nHitOnSdtTkSIT;
+        NTuple::Array<int> m_nHitOnSdtTkSET;
+        NTuple::Array<int> m_nHitOnSdtTkFTD;
+        NTuple::Array<int> m_nHitOnSdtTkDC;
+        NTuple::Array<int> m_nHitOnSdtTk;
+
+        NTuple::Array<float> m_siXc;
+        NTuple::Array<float> m_siYc;
+        NTuple::Array<float> m_siR;
 
         TRandom3 fRandom;
 };
diff --git a/Utilities/DataHelper/CMakeLists.txt b/Utilities/DataHelper/CMakeLists.txt
index 74ec620f..2cc021c0 100644
--- a/Utilities/DataHelper/CMakeLists.txt
+++ b/Utilities/DataHelper/CMakeLists.txt
@@ -17,12 +17,18 @@ gaudi_add_library(DataHelperLib
                           src/TrackHitPair.cc
                           src/TrackerHitHelper.cpp
                           src/TrackHelper.cc
-                  LINK EDM4HEP::edm4hep
-                       EDM4HEP::edm4hepDict
-                       DetSegmentation
-                       GSL::gsl
-                       ${CLHEP_LIBRARIES}
-		       Identifier
+                          src/GeomeryHelper.cpp
+                          LINK
+                             EDM4HEP::edm4hep
+                             EDM4HEP::edm4hepDict
+                             Gaudi::GaudiAlgLib
+                             Gaudi::GaudiKernel
+                             ${GSL_LIBRARIES}
+                             ${CLHEP_LIBRARIES}
+                             Identifier
+                             DetSegmentation
+                             DetInterface
+                             Identifier
 )
 
 install(TARGETS DataHelperLib
diff --git a/Utilities/DataHelper/include/DataHelper/GeomeryHelper.h b/Utilities/DataHelper/include/DataHelper/GeomeryHelper.h
new file mode 100644
index 00000000..0eb94244
--- /dev/null
+++ b/Utilities/DataHelper/include/DataHelper/GeomeryHelper.h
@@ -0,0 +1,55 @@
+#ifndef GeomeryHelper_H
+#define GeomeryHelper_H
+
+
+#include <array>
+#include "DDSegmentation/Segmentation.h"
+#include "DetSegmentation/GridDriftChamber.h"
+#include "TVector3.h"
+
+#include "GaudiKernel/SmartIF.h"
+#include "GaudiKernel/ISvcLocator.h"
+#include "GaudiKernel/Kernel.h"
+#include "GaudiKernel/Bootstrap.h"
+#include "DetInterface/IGeomSvc.h"
+
+class IGeomSvc;
+namespace dd4hep {
+    class Detector;
+    namespace DDSegmentation{
+        class GridDriftChamber;
+    }
+}
+namespace dd4hep {
+    class Detector;
+    namespace DDSegmentation{
+        class GridDriftChamber;
+    }
+    namespace rec{
+        class ISurface;
+    }
+}
+
+class GeomeryWire{
+
+    public:
+        static const GeomeryWire* Instance;
+        static const GeomeryWire* Get();
+
+        void getWirePos(int layerID,int wireID,TVector3& Wstart,TVector3& Wend) const;
+        dd4hep::DDSegmentation::GridDriftChamber * getSeg() const;
+    private:
+
+        GeomeryWire();
+        virtual ~GeomeryWire();
+
+        GeomeryWire(const GeomeryWire&);
+        GeomeryWire& operator=(const GeomeryWire&);
+
+        SmartIF<IGeomSvc> m_geomsvc;
+        dd4hep::Detector* m_dd4hepDetector;
+        dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber;
+
+};
+
+#endif
diff --git a/Utilities/DataHelper/include/DataHelper/TrackHelper.h b/Utilities/DataHelper/include/DataHelper/TrackHelper.h
index cb76b6be..78f006d5 100644
--- a/Utilities/DataHelper/include/DataHelper/TrackHelper.h
+++ b/Utilities/DataHelper/include/DataHelper/TrackHelper.h
@@ -1,8 +1,13 @@
 #ifndef TRACKHELPER_H
 #define TRACKHELPER_H
 #include "edm4hep/TrackState.h"
+#include "edm4hep/TrackerHit.h"
+#include "edm4hep/MCParticle.h"
+#include "edm4hep/SimTrackerHit.h"
+#include "edm4hep/MCRecoTrackerAssociationCollection.h"
 #include "TMatrixDSym.h"
 #include "TVector3.h"
+#include "DataHelper/HelixClass.h"
 
 namespace CEPC{
     //get track position and momentum from TrackState
@@ -14,6 +19,12 @@ namespace CEPC{
     void getTrackStateFromPosMom(edm4hep::TrackState& trackState,double Bz,
             TVector3 pos,TVector3 mom,double charge,TMatrixDSym covMatrix_6);
 
+    void getHelixFromPosMom(HelixClass& helix,double& xc,double& yc,
+            double& R,double Bz,TVector3 seedPos,TVector3 seedMom,double charge);
+    void getAssoMCParticle(
+            const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+            edm4hep::TrackerHit trackerHit,
+            edm4hep::MCParticle& mcParticle,edm4hep::SimTrackerHit& simTrackerHit);
 }
 
 #endif
diff --git a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
index 319bbebf..f6d5b319 100644
--- a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
+++ b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
@@ -20,11 +20,20 @@ namespace CEPC{
   float                GetResolutionRPhi(edm4hep::TrackerHit& hit);
   float                GetResolutionZ(edm4hep::TrackerHit& hit);
   std::array<float, 6> ConvertToCovXYZ(float dU, float thetaU, float phiU, float dV, float thetaV, float phiV, bool useSpacePointBuilderMethod = false);
+
   const edm4hep::SimTrackerHit getAssoClosestSimTrackerHit(
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        const edm4hep::TrackerHit trackerHit,
+        const dd4hep::DDSegmentation::GridDriftChamber* segmentation,
+        int docaMehtod);
+
+  const edm4hep::TrackerHit getAssoTrackerHit(
+          const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+          edm4hep::SimTrackerHit simTrackerHit);
+
+  const edm4hep::SimTrackerHit getAssoSimTrackerHit(
           const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
-          const edm4hep::TrackerHit trackerHit,
-          const dd4hep::DDSegmentation::GridDriftChamber* segmentation,
-          int docaMehtod);
+          edm4hep::TrackerHit trackerHit);
 }
 
 #endif
diff --git a/Utilities/DataHelper/src/GeomeryHelper.cpp b/Utilities/DataHelper/src/GeomeryHelper.cpp
new file mode 100644
index 00000000..8dbefbb8
--- /dev/null
+++ b/Utilities/DataHelper/src/GeomeryHelper.cpp
@@ -0,0 +1,58 @@
+#include "DataHelper/GeomeryHelper.h"
+#include "Identifier/CEPCConf.h"
+
+
+//Externals
+#include "DD4hep/DD4hepUnits.h"
+#include "DD4hep/Detector.h"
+#include "DD4hep/DetElement.h"
+#include "DDRec/ISurface.h"
+#include "DDRec/SurfaceManager.h"
+#include "DDRec/Vector3D.h"
+
+#include "TMatrixF.h"
+#include "CLHEP/Matrix/SymMatrix.h"
+#include "CLHEP/Matrix/Matrix.h"
+#include "CLHEP/Vector/ThreeVector.h"
+#include "CLHEP/Vector/Rotation.h"
+#include <bitset>
+
+// must initialize before using Get()!!!!
+const GeomeryWire* GeomeryWire::Instance = nullptr;
+const GeomeryWire* GeomeryWire::Get(){
+    if(nullptr==Instance){
+        Instance = new GeomeryWire();
+    }
+    return Instance;
+}
+
+GeomeryWire::GeomeryWire()
+{
+
+    //m_geosvc = service<IGeomSvc>("GeomSvc");
+    m_geomsvc = Gaudi::svcLocator()->service("GeomSvc");
+
+    m_dd4hepDetector=m_geomsvc->lcdd();
+    dd4hep::Readout readout=m_dd4hepDetector->readout("DriftChamberHitsCollection");
+    m_gridDriftChamber=dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*>(readout.segmentation().segmentation());
+    if(nullptr==m_gridDriftChamber){
+        std::cout  << "Failed to get the GridDriftChamber" << std::endl;
+    }
+    Instance = this;
+}
+
+GeomeryWire::~GeomeryWire()
+{
+}
+
+void GeomeryWire::getWirePos(int layerID,int wireID,TVector3& Wstart,TVector3& Wend) const
+{
+
+    assert(m_gridDriftChamber);
+    m_gridDriftChamber->cellposition2(0,layerID,wireID,Wstart,Wend);
+}
+
+dd4hep::DDSegmentation::GridDriftChamber* GeomeryWire::getSeg() const
+{
+    return m_gridDriftChamber;
+}
diff --git a/Utilities/DataHelper/src/TrackHelper.cc b/Utilities/DataHelper/src/TrackHelper.cc
index 9e1f437f..72c3935f 100644
--- a/Utilities/DataHelper/src/TrackHelper.cc
+++ b/Utilities/DataHelper/src/TrackHelper.cc
@@ -58,10 +58,6 @@ void CEPC::getPosMomFromTrackState(const edm4hep::TrackState& trackState,
     const char* m_name="TrackHelper";
     int m_debug=0;
     if(m_debug>=2){
-        //std::cout<<m_name<<" covMatrix_5 " <<std::endl;
-        //covMatrix_5.Print();
-        //std::cout<<m_name<<" mS " <<std::endl;
-        //mS.Print();
         std::cout<<m_name<<" covMatrix_6 " <<std::endl;
         covMatrix_6.Print();
         std::cout<<m_name<<" pos " <<std::endl;
@@ -120,7 +116,6 @@ void CEPC::getTrackStateFromPosMom(edm4hep::TrackState& trackState,double Bz,
         for(int j=0;j<6;j++){
             if(i>=j) { 
                 k1=k++;
-                //covMatrix[k++]=covMatrix_5(i,j);
                 if(5==i){
                     covMatrix[k1]=-999;
                     continue;
@@ -132,3 +127,32 @@ void CEPC::getTrackStateFromPosMom(edm4hep::TrackState& trackState,double Bz,
 
     trackState.covMatrix = covMatrix;
 }
+
+//Set 5 par from position, momentum and charge
+void CEPC::getHelixFromPosMom(HelixClass& helix,double& xc,double& yc,
+        double& R,double Bz,TVector3 seedPos,TVector3 seedMom,double charge){
+    //HelixClass helix;
+    double seedPos_t[3]={seedPos.X(),seedPos.Y(),seedPos.Z()};
+    double seedMom_t[3]={seedMom.X(),seedMom.Y(),seedMom.Z()};
+    helix.Initialize_VP(seedPos_t,seedMom_t,charge,Bz); //mm GeV
+
+    xc = helix.getXC();
+    yc = helix.getYC();
+
+    R = helix.getRadius();
+}
+
+void CEPC::getAssoMCParticle(
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        edm4hep::TrackerHit trackerHit,
+        edm4hep::MCParticle& mcParticle,edm4hep::SimTrackerHit& simTrackerHit)
+{
+    for(auto assoHit: *assoHits){
+        if(assoHit.getRec()==trackerHit)
+        {
+            simTrackerHit=assoHit.getSim();
+            mcParticle = simTrackerHit.getMCParticle();
+
+        }
+    }
+} 
diff --git a/Utilities/DataHelper/src/TrackerHitHelper.cpp b/Utilities/DataHelper/src/TrackerHitHelper.cpp
index f12b1687..c3e8a64f 100644
--- a/Utilities/DataHelper/src/TrackerHitHelper.cpp
+++ b/Utilities/DataHelper/src/TrackerHitHelper.cpp
@@ -148,13 +148,32 @@ const edm4hep::SimTrackerHit CEPC::getAssoClosestSimTrackerHit(
 
     if(tmp_distance < min_distance){
       min_distance = tmp_distance;
-      //pos_x = hitPosition.x();     //pos.x();
-      //pos_y = hitPosition.y();     //pos.y();
-      //pos_z = pos.z();
-      //momx = hit.getMomentum()[0];
-      //momy = hit.getMomentum()[1];
       minSimTrackerHit=hit;
     }
   }
   return minSimTrackerHit;
 }
+
+const edm4hep::TrackerHit CEPC::getAssoTrackerHit(
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        edm4hep::SimTrackerHit simTrackerHit){
+    edm4hep::TrackerHit trackerHit;
+    for(auto assoHit: *assoHits){
+        if(assoHit.getSim()==simTrackerHit){
+            trackerHit = assoHit.getRec();
+        }
+    }
+    return trackerHit;
+}
+
+const edm4hep::SimTrackerHit CEPC::getAssoSimTrackerHit(
+        const edm4hep::MCRecoTrackerAssociationCollection* assoHits,
+        edm4hep::TrackerHit trackerHit){
+    edm4hep::SimTrackerHit simTrackerHit;
+    for(auto assoHit: *assoHits){
+        if(assoHit.getRec()==trackerHit){
+            simTrackerHit = assoHit.getSim();
+        }
+    }
+    return simTrackerHit;
+}
diff --git a/cmake/CEPCSWDependencies.cmake b/cmake/CEPCSWDependencies.cmake
index ae896474..d0bafced 100644
--- a/cmake/CEPCSWDependencies.cmake
+++ b/cmake/CEPCSWDependencies.cmake
@@ -17,6 +17,7 @@ Find all the dependencies here, so in each package user don't need to find the p
 - PandoraSDK
 - podio
 - ROOT
+- BelleIICKF
 #]]
 
 find_package(CLHEP REQUIRED;CONFIG)
@@ -35,3 +36,4 @@ find_package(PandoraSDK REQUIRED)
 find_package(podio REQUIRED)
 find_package(ROOT COMPONENTS EG Graf Graf3d Gpad MathCore Net RIO Tree TreePlayer REQUIRED)
 find_package(GenFit)
+find_package(BelleIICKF)
-- 
GitLab