diff --git a/Detector/CMakeLists.txt b/Detector/CMakeLists.txt
index be45fff6cab99071fd9915a4452980e4a22b9340..57e6f2ce1389dc6690edf864c20b8862b81313f5 100644
--- a/Detector/CMakeLists.txt
+++ b/Detector/CMakeLists.txt
@@ -6,3 +6,4 @@ add_subdirectory(DetEcalMatrix)
 add_subdirectory(DetInterface)
 add_subdirectory(DetSegmentation)
 add_subdirectory(GeomSvc)
+add_subdirectory(Identifier)
diff --git a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml
index 80b21fe4ef424e540376f273f796a7b91f0cd4bc..4dfed10c66362c86c902d7a0b45fa9628771971c 100644
--- a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml
+++ b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml
@@ -51,7 +51,10 @@
 
   <readouts>
     <readout name="EcalEndcapRingCollection">
-      <segmentation type="CartesianGridXY" grid_size_x="Ecal_cells_size" grid_size_y="Ecal_cells_size"/>
+
+      <segmentation type="CartesianGridXY" grid_size_x="Ecal_cells_size" grid_size_y="Ecal_cells_size"
+		    offset_x="-0.5*Ecal_ECRing_Siplate_Size+0.5*Ecal_cells_size" offset_y="-0.5*Ecal_ECRing_Siplate_Size+0.5*Ecal_cells_size"/>
+
       <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,y:-16</id>
     </readout>
   </readouts>
diff --git a/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml b/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml
index 214e9983bf2f6d78b51f38cc3768b23fac88b7ae..07802e884723ec23f4c9305b1c8dc40f60bfeb0c 100644
--- a/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml
+++ b/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml
@@ -80,8 +80,8 @@
 
   <readouts>
     <readout name="EcalEndcapsCollection">
-      <segmentation type="MegatileLayerGridXY" grid_size_x="10.1667*mm" grid_size_y="10.1667*mm"/>
-      <id>system:5,module:3,stave:4,tower:5,layer:6,wafer:6,cellX:32:-16,cellY:-16</id>
+      <segmentation type="WaferGridXY" grid_size_x="10.1667*mm" grid_size_y="10.1667*mm" offset_x="2*mm" offset_y="-1.0999755859375*mm"/>
+      <id>system:5,module:3,stave:4,tower:5,layer:6,wafer:6,x:32:-16,y:-16</id>
     </readout>
   </readouts>
 
diff --git a/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml b/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml
index 8ea02125f3e24158e985c8f2dc9ac455b84c013f..5ce08e226f5119bc7646d7cc6b79ac37649d5bc5 100644
--- a/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml
+++ b/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml
@@ -33,8 +33,10 @@
 
   <readouts>
     <readout name="HcalBarrelCollection">
-      <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size"/>
+
+      <segmentation type="TiledLayerGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size"/>
       <id>system:5,module:3,stave:3,tower:5,layer:6,slice:4,x:32:-16,y:-16</id>
+
     </readout>
   </readouts>
 
diff --git a/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml b/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml
index ab41b9af64cb63b92de5c198e83f90867caedc78..e598f6cd3be4879100ee811d6b02799de44033ee 100644
--- a/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml
+++ b/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml
@@ -10,7 +10,7 @@
                    dz="HcalEndcapRing_max_z + 2.0*env_safety"/>
             <shape type="PolyhedraRegular" numsides="Hcal_ring_inner_symmetry" rmin="HcalEndcapRing_inner_radius - env_safety"
                    rmax="HcalEndcapRing_outer_radius*cos(pi/Hcal_ring_outer_symmetry) + env_safety" dz="2.0*HcalEndcapRing_max_z + env_safety" material="Air"/>
-            <rotation x="0" y="0" z="90*deg-180*deg/Hcal_ring_inner_symmetry"/>
+            <rotation x="0" y="0" z="-180*deg/Hcal_ring_inner_symmetry"/>
           </shape>
           <shape type="Box" dx="HcalEndcapRing_outer_radius + 2.0*env_safety" dy="HcalEndcapRing_outer_radius + 2.0*env_safety"
                  dz="HcalEndcapRing_min_z - env_safety"/>
@@ -32,8 +32,8 @@
 
   <readouts>
     <readout name="HcalEndcapRingCollection">
-      <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size"/>
-      <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,y:-16</id>
+      <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size" offset_x="Hcal_cells_size/2.0" offset_y="Hcal_cells_size/2.0"/>
+      <id>system:5,module:3,stave:4,tower:3,layer:6,y:32:-16,x:-16</id>
     </readout>
   </readouts>
   
diff --git a/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml b/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml
index 677a23dd3dcdb7f207f11089a0144e0846f00a84..3799553f5f9e4aebf59ec059d474c173a1180fa1 100644
--- a/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml
+++ b/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml
@@ -31,7 +31,7 @@
   <readouts>
     <readout name="HcalEndcapsCollection">
       <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size" offset_x="Hcal_cells_size/2.0" offset_y="Hcal_cells_size/2.0" />
-      <id>system:5,module:3,stave:3,tower:5,layer:6,x:32:-16,y:-16</id>
+      <id>system:5,module:3,stave:3,tower:5,layer:6,y:32:-16,x:-16</id>
     </readout>
   </readouts>
   
diff --git a/Detector/DetCEPCv4/compact/ecal_defs.xml b/Detector/DetCEPCv4/compact/ecal_defs.xml
index 057bb5bbdee6936f385a00605c36b095ea1cbf74..d258d5711f9ec0e356ffa05605dc994c743be0ad 100644
--- a/Detector/DetCEPCv4/compact/ecal_defs.xml
+++ b/Detector/DetCEPCv4/compact/ecal_defs.xml
@@ -55,7 +55,8 @@
   <constant name="Ecal_Slab_Plug_length" value="0*mm"/>
   
   <!-- needed only for ecal ring driver... -->
-  <constant name="Ecal_cells_size" value="10.2105*mm"/>
+  <constant name="Ecal_ECRing_Siplate_Size" value="Ecal_endcap_center_box_size - 2*Ecal_EC_Ring_gap - 2*Ecal_lateral_face_thickness"/>
+  <constant name="Ecal_cells_size" value="Ecal_ECRing_Siplate_Size/76."/>
   <constant name="Ecal_Sc_reflector_thickness" value="0.057*mm"/>
   <constant name="Ecal_Sc_thickness" value="2.0*mm"/>
   <constant name="Ecal_Slab_Sc_PCB_thickness" value="0.8*mm"/>
diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp
index 9801a0a17418f93b03e46f8ea259be8f80e6ad6c..b49d996411f5b030dff243c9365c6535ee7d8aaf 100644
--- a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp
+++ b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp
@@ -4,6 +4,7 @@
 #include "DD4hep/DetFactoryHelper.h"
 #include "DD4hep/DD4hepUnits.h"
 #include "DD4hep/DetType.h"
+#include "DDSegmentation/TiledLayerGridXY.h"
 
 #include "DDRec/Surface.h"
 #include "DDRec/DetectorData.h"
@@ -23,6 +24,7 @@ using dd4hep::Volume;
 using dd4hep::PlacedVolume;
 using dd4hep::Position;
 using dd4hep::RotationZYX;
+using dd4hep::RotationZ;
 using dd4hep::Transform3D;
 using dd4hep::Box;
 using dd4hep::Tube;
@@ -63,30 +65,31 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
 
   Readout readout = sens.readout();
   Segmentation seg = readout.segmentation();
+  dd4hep::DDSegmentation::TiledLayerGridXY* tiledSeg = dynamic_cast<dd4hep::DDSegmentation::TiledLayerGridXY*> (seg.segmentation());
+  assert(tiledSeg && "no TiledLayerGridXY found" );
 
   std::vector<double> cellSizeVector = seg.segmentation()->cellDimensions(0);
   double cell_sizeX      = cellSizeVector[0];
   double cell_sizeZ      = cellSizeVector[1];
 
-  double      Hcal_inner_radius   = theDetector.constant<double>("Hcal_inner_radius");
-  double      Hcal_outer_radius_set   = theDetector.constant<double>("Hcal_outer_radius");
-  double      Hcal_half_length    = theDetector.constant<double>("Hcal_half_length");
-  int         Hcal_inner_symmetry = theDetector.constant<int>("Hcal_inner_symmetry");
-  int         Hcal_outer_symmetry = 0;
-  double      Hcal_lateral_plate_thickness     = theDetector.constant<double>("Hcal_lateral_structure_thickness");
-  double      Hcal_modules_gap                 = theDetector.constant<double>("Hcal_modules_gap");
-  int         Hcal_nlayers                     = theDetector.constant<int>("Hcal_nlayers");
-  double      TPC_outer_radius               = theDetector.constant<double>("TPC_outer_radius");
-  double      Ecal_outer_radius               = theDetector.constant<double>("Ecal_outer_radius");
-  int Hcal_barrel_number_modules = theDetector.constant<int>("Hcal_barrel_number_modules");
+  double Hcal_inner_radius            = theDetector.constant<double>("Hcal_inner_radius");
+  double Hcal_outer_radius_set        = theDetector.constant<double>("Hcal_outer_radius");
+  double Hcal_half_length             = theDetector.constant<double>("Hcal_half_length");
+  int    Hcal_inner_symmetry          = theDetector.constant<int>("Hcal_inner_symmetry");
+  int    Hcal_outer_symmetry          = 0;
+  double Hcal_lateral_plate_thickness = theDetector.constant<double>("Hcal_lateral_structure_thickness");
+  double Hcal_modules_gap             = theDetector.constant<double>("Hcal_modules_gap");
+  double Ecal_outer_radius            = theDetector.constant<double>("Ecal_outer_radius");
+  int    Hcal_barrel_number_modules   = theDetector.constant<int>("Hcal_barrel_number_modules");
   
-  double hPrime =    Ecal_outer_radius + theDetector.constant<double>("Hcal_Ecal_gap");
+  double hPrime   = Ecal_outer_radius + theDetector.constant<double>("Hcal_Ecal_gap");
   Hcal_inner_radius = hPrime / cos(pi/8.);
   
   double Hcal_normal_dim_z = (2*Hcal_half_length - (Hcal_barrel_number_modules-1)*Hcal_modules_gap)/Hcal_barrel_number_modules;
 
   xml_coll_t c(x_det,_U(layer));
   xml_comp_t x_layer = c;
+  int         Hcal_nlayers = x_layer.repeat();
 
   double Hcal_radiator_thickness = 0;
   double layerThickness = 0.0;
@@ -95,6 +98,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
     layerThickness += x_slice.thickness();
     if(x_slice.materialStr()==Hcal_radiator_material) Hcal_radiator_thickness = x_slice.thickness();
   }
+  cout << " cell size xy = " <<  cell_sizeX << " cell size z = " << cell_sizeZ << endl;
   cout << " layer_thickness (from slices) = " << layerThickness << " and radiator_thickness = " << Hcal_radiator_thickness << endl;
   double Hcal_chamber_thickness = layerThickness - Hcal_radiator_thickness; 
 
@@ -149,28 +153,31 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
   PlacedVolume calo_pv = envelope.placeVolume(logicCalo, Position(0,0,0));
   DetElement calo(det, "envelope", det_id);
   calo.setPlacement(calo_pv);
-
+  if(tiledSeg) tiledSeg->setOffsetY(-(Hcal_regular_chamber_dim_z/2.-RPC_EdgeWidth)+0.5*cell_sizeZ);
   for(int layer_id=1; layer_id<=Hcal_nlayers; layer_id++){
     double yn = sqrt(Hcal_outer_radius*Hcal_outer_radius - (hPrime + layer_id*layerThickness)*(hPrime + layer_id*layerThickness));
     double Yn = 0.5*d_InnerOctoSize - layer_id*layerThickness;
 
     double halfX = Hcal_chamber_thickness/2.;
-    double halfZ = (yn+Yn)/2.;
+    double halfY = (yn+Yn)/2.;
     
     LayeredCalorimeterData::Layer caloLayer ;
     caloLayer.cellSize0 = cell_sizeX;
     caloLayer.cellSize1 = cell_sizeZ;
 
-    //double halfY = Hcal_normal_dim_z / 2.;
-    double halfY = Hcal_regular_chamber_dim_z / 2.;
-
+    //double halfZ = Hcal_normal_dim_z / 2.;
+    double halfZ = Hcal_regular_chamber_dim_z / 2.;
+    
     double localXPos = hPrime + Hcal_radiator_thickness + Hcal_chamber_thickness/2. + (layer_id-1)*layerThickness;
     double localYPos = -Yn + 0.5*(Yn + yn);
-    Box chamberSolid(halfX, halfY, halfZ);
+
+    Box chamberSolid(halfY, halfZ, halfX);
     string chamberLogical_name      = name+_toString(layer_id,"_layer%d");
     Volume chamberLogical(chamberLogical_name, chamberSolid, air);
     chamberLogical.setAttributes(theDetector, x_layer.regionStr(), x_layer.limitsStr(), x_layer.visStr());
 
+    if(tiledSeg) tiledSeg->setLayerOffsetX((-(halfY-RPC_EdgeWidth)+0.5*cell_sizeX)*2/cell_sizeX);
+
     string layer_name      = name+_toString(layer_id,"_layer%d");
 
     double nRadiationLengths=0.;
@@ -196,44 +203,45 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
       thickness_sum       += slice_thickness/2;
 
       // Slice volume & box
-      Box sliceSolid(slice_thickness/2., halfY, halfZ);
+      Box sliceSolid(halfY, halfZ, slice_thickness/2.);
       Volume sliceVol(slice_name, sliceSolid, slice_material);
       
       if ( x_slice.isSensitive() ) {
 	sliceVol.setSensitiveDetector(sens);
 	if(RPC_EdgeWidth>0){
-	  double RPC_GazInlet_In_Y  = halfY - RPC_EdgeWidth - RPCGazInletOuterRadius;
-	  double RPC_GazInlet_In_Z  = halfZ - RPC_EdgeWidth/2;
-	  double RPC_GazInlet_Out_Y = -RPC_GazInlet_In_Y;
-	  double RPC_GazInlet_Out_Z =  RPC_GazInlet_In_Z;
+	  double RPC_GazInlet_In_Z  = halfZ - RPC_EdgeWidth - RPCGazInletOuterRadius;
+	  double RPC_GazInlet_In_Y  = halfY - RPC_EdgeWidth/2;
+	  double RPC_GazInlet_Out_Z = -RPC_GazInlet_In_Z;
+	  double RPC_GazInlet_Out_Y =  RPC_GazInlet_In_Y;
 
 	  string mateialName = x_slice.attr<string>(_Unicode(edge_material));
 	  Material edge_material = theDetector.material(mateialName);
-	  Box solidRPCEdge1(slice_thickness/2.,halfY, halfZ);
-	  Box solidRPCEdge2(slice_thickness/2.,halfY-RPC_EdgeWidth, halfZ-RPC_EdgeWidth);
+	  Box solidRPCEdge1(halfY, halfZ, slice_thickness/2.);
+	  Box solidRPCEdge2(halfY-RPC_EdgeWidth, halfZ-RPC_EdgeWidth, slice_thickness/2.);
 	  SubtractionSolid solidRPCEdge(solidRPCEdge1, solidRPCEdge2, Position(0,0,0));
 	  Volume logicRPCEdge(slice_name+"_edge", solidRPCEdge, edge_material);
 	  logicRPCEdge.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
 	  sliceVol.placeVolume(logicRPCEdge);
 
+	  RotationZYX rotGaz(0, pi/2., 0);
 	  Tube solidRPCGazInlet(RPCGazInletInnerRadius,RPCGazInletOuterRadius,RPC_EdgeWidth/*RPCGazInletLength*//2);
 	  Volume logicRPCGazInlet(slice_name+"_GazInlet", solidRPCGazInlet, edge_material);
 	  logicRPCGazInlet.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
-	  logicRPCEdge.placeVolume(logicRPCGazInlet, Position(0,RPC_GazInlet_In_Y,RPC_GazInlet_In_Z));
-	  logicRPCEdge.placeVolume(logicRPCGazInlet, Position(0,RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z));
+	  logicRPCEdge.placeVolume(logicRPCGazInlet, Transform3D(rotGaz, Position(RPC_GazInlet_In_Y,RPC_GazInlet_In_Z, 0)));
+	  logicRPCEdge.placeVolume(logicRPCGazInlet, Transform3D(rotGaz, Position(RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z, 0)));
 	  
 	  Tube solidRPCGazInsideInlet(0,RPCGazInletInnerRadius,RPC_EdgeWidth/*RPCGazInletLength*//2);
 	  Volume logicRPCGazInsideInlet(slice_name+"_GazInsideInlet", solidRPCGazInsideInlet, slice_material);
 	  logicRPCGazInsideInlet.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),"SeeThrough");
-	  logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Position(0,RPC_GazInlet_In_Y,RPC_GazInlet_In_Z));
-	  logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Position(0,RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z));
+	  logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Transform3D(rotGaz, Position(RPC_GazInlet_In_Y,RPC_GazInlet_In_Z, 0)));
+	  logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Transform3D(rotGaz,Position(RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z, 0)));
 	}
 	if(Hcal_spacer_thickness>0){
 	  Tube solidRPCSpacer(0,Hcal_spacer_thickness/2,slice_thickness/2);
 	  Material space_material = theDetector.material(x_slice.attr<string>(_Unicode(spacer_material)));
 	  Volume logicRPCSpacer(slice_name+"_spacer", solidRPCSpacer, space_material);
 	  logicRPCSpacer.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
-	  RotationZYX rotSpacer(0, pi/2., 0);
+	  RotationZYX rotSpacer(0, 0, 0);
 	  
 	  double gap_hZ = halfZ-RPC_EdgeWidth;
 	  double gap_hY = halfY-RPC_EdgeWidth;
@@ -253,7 +261,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
 	    double SpacerY = gap_hY - y_lateral_space - y_counter*Hcal_spacer_separation;
 	    for(int z_counter = 0; z_counter <=z_number_of_separations; z_counter++){
 	      double SpacerZ = gap_hZ - z_lateral_space - z_counter*Hcal_spacer_separation;
-	      PlacedVolume space_pv = sliceVol.placeVolume(logicRPCSpacer, Transform3D(rotSpacer, Position(0,SpacerY,SpacerZ)));
+	      PlacedVolume space_pv = sliceVol.placeVolume(logicRPCSpacer, Transform3D(rotSpacer, Position(SpacerY,SpacerZ,0)));
 	    }
 	  }
 	}
@@ -279,7 +287,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
       thickness_sum += slice_thickness/2;
 
       // slice PlacedVolume
-      PlacedVolume slice_phv = chamberLogical.placeVolume(sliceVol,Position(slice_pos_z,0,0));
+      PlacedVolume slice_phv = chamberLogical.placeVolume(sliceVol,Position(0,0,slice_pos_z));
       if ( x_slice.isSensitive() ) {
 	int slice_id  = (layer_id > Hcal_nlayers)? 1:-1;
 	slice_phv.addPhysVolID("layer",layer_id).addPhysVolID("slice",slice_id);
@@ -309,14 +317,17 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
     for(int stave_id = 1; stave_id <= 8; stave_id++){
       double phirot = stave_phi_offset+(stave_id-1)*pi/4.;
 
-      RotationZYX rot(0, phirot, pi*0.5);
-      RotationZYX rotInverse(0,-phirot, -pi*0.5);
+      RotationZYX rot(pi/2, pi/2, 0); //phirot);
+      RotationZ rotZ(phirot);
+      RotationZYX rotAll = rotZ*rot;
+      RotationZYX rotInverse(phirot, 0, 0);
       for(int module_id = 1; module_id <= Hcal_barrel_number_modules; module_id++){
         module_z_offset = - Hcal_half_length + Hcal_normal_dim_z/2. + (module_id-1)*(Hcal_normal_dim_z+Hcal_modules_gap);
 	
-        Position localPos(localXPos,-module_z_offset,localYPos);
+        Position localPos(localXPos,localYPos,module_z_offset);
         Position newPos = rotInverse*localPos;
-	Transform3D tran3D(rot, newPos);
+
+	Transform3D tran3D(rotAll, newPos);
 	PlacedVolume pv = logicCalo.placeVolume(chamberLogical, tran3D);
 	pv.addPhysVolID("stave",stave_id).addPhysVolID("module",module_id).addPhysVolID("layer",layer_id);
 	DetElement layer(calo, name+_toString(stave_id,"_stave%d")+_toString(module_id,"_module%d")+_toString(layer_id,"_layer%d"), det_id);
diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp
index 3a9978cc85833ad6807f55cbaae2fd9d74d3656d..08e00c5a6ef27cbf4402ed5a05621d721a06428b 100644
--- a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp
+++ b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp
@@ -197,7 +197,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
   
   // chamber placements
   for(int stave_id = 1; stave_id <= 4; stave_id++){
-    double angle = pi/2.*(stave_id-1);
+    double angle = -pi/2.*(stave_id-1);
     RotationZYX lrot(angle,0,0);
     for (int layer_id = 1; layer_id <= number_of_chambers; layer_id++){
       double Zoff = -pDz + (layer_id-1)*layerThickness + Hcal_radiator_thickness + Hcal_chamber_thickness/2.;
@@ -217,28 +217,30 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
 	cout << "Hcal_EndcapRing:  inner_thickness= " << inner_thickness << endl;
 	cout << "Hcal_EndcapRing:  outer_thickness= " << thickness_sum << endl;
       }
-      LayeredCalorimeterData::Layer caloLayer ;
-      caloLayer.cellSize0 = cell_sizeX;
-      caloLayer.cellSize1 = cell_sizeY;
-      caloLayer.inner_nRadiationLengths   = nRadiationLengthsInside;
-      caloLayer.inner_nInteractionLengths = nInteractionLengthsInside;
-      caloLayer.inner_thickness           = inner_thickness;
-      caloLayer.sensitive_thickness       = sensitive_thickness;
-      caloLayer.outer_nRadiationLengths   = nRadiationLengths;
-      caloLayer.outer_nInteractionLengths = nInteractionLengths;
-      caloLayer.outer_thickness           = thickness_sum;
+      if(stave_id==1){//only one needed, according to wenxingfang's
+	LayeredCalorimeterData::Layer caloLayer ;
+	caloLayer.cellSize0 = cell_sizeX;
+	caloLayer.cellSize1 = cell_sizeY;
+	caloLayer.inner_nRadiationLengths   = nRadiationLengthsInside;
+	caloLayer.inner_nInteractionLengths = nInteractionLengthsInside;
+	caloLayer.inner_thickness           = inner_thickness;
+	caloLayer.sensitive_thickness       = sensitive_thickness;
+	caloLayer.outer_nRadiationLengths   = nRadiationLengths;
+	caloLayer.outer_nInteractionLengths = nInteractionLengths;
+	caloLayer.outer_thickness           = thickness_sum;
+	
+	caloLayer.distance = start_z + (layer_id-1)*layerThickness;
+	caloLayer.absorberThickness = Hcal_radiator_thickness ;
       
-      caloLayer.distance = start_z + (layer_id-1)*layerThickness;
-      caloLayer.absorberThickness = Hcal_radiator_thickness ;
-      
-      caloData->layers.push_back( caloLayer ) ;
+	caloData->layers.push_back( caloLayer ) ;
+      }
     }
   }
   
   // Placements
   double endcap_z_offset = start_z + pDz;
   for(int side = 0; side <= 1; side++){
-    int module_id = (side==0) ? 0 : 6;
+    int module_id = (side==0) ? 6 : 0;
     double this_module_z_offset = (side==0) ? endcap_z_offset : -endcap_z_offset;
     // use reflect volume for z<0, therefore, same rotation
     // segmentation violation happen if EndCapRingLogical.reflect(), back to rotate Y
diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp
index e55eb4722038d9f9879659d71f407b0e79313df1..92ef98190b83213dc11d3a91e01bf99b58414387 100644
--- a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp
+++ b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp
@@ -205,7 +205,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
   if(possible_number_of_chambers < number_of_chambers) number_of_chambers = possible_number_of_chambers;
   // chamber placements
   for(int stave_id = 1; stave_id <= 4; stave_id++){
-    double angle = pi/2.*(stave_id-1);
+    double angle = -pi/2.*(stave_id-1);
     //RotationZ lrotz(angle);
     RotationZYX lrot(angle,0,0);
     for (int layer_id = 1; layer_id <= number_of_chambers; layer_id++){
@@ -226,28 +226,32 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete
 	cout << "Hcal_Endcap:  inner_thickness= " << inner_thickness << endl;
 	cout << "Hcal_Endcap:  outer_thickness= " << thickness_sum << endl;
       }
-      LayeredCalorimeterData::Layer caloLayer ;
-      caloLayer.cellSize0 = cell_sizeX;
-      caloLayer.cellSize1 = cell_sizeY;
-      caloLayer.inner_nRadiationLengths = nRadiationLengthsInside;
-      caloLayer.inner_nInteractionLengths = nInteractionLengthsInside;
-      caloLayer.inner_thickness = inner_thickness;
-      caloLayer.sensitive_thickness = sensitive_thickness;
-      caloLayer.outer_nRadiationLengths = nRadiationLengths;
-      caloLayer.outer_nInteractionLengths = nInteractionLengths;
-      caloLayer.outer_thickness = thickness_sum;
-      
-      caloLayer.distance = Hcal_start_z + (layer_id-1)*layerThickness;
-      caloLayer.absorberThickness = Hcal_radiator_thickness ;
-      
-      caloData->layers.push_back( caloLayer ) ;
+
+      if(stave_id==1){// only for one stave is good. by wenxingfang 
+	LayeredCalorimeterData::Layer caloLayer ;
+	caloLayer.cellSize0 = cell_sizeX;
+	caloLayer.cellSize1 = cell_sizeY;
+	caloLayer.inner_nRadiationLengths = nRadiationLengthsInside;
+	caloLayer.inner_nInteractionLengths = nInteractionLengthsInside;
+	caloLayer.inner_thickness = inner_thickness;
+	caloLayer.sensitive_thickness = sensitive_thickness;
+	caloLayer.outer_nRadiationLengths = nRadiationLengths;
+	caloLayer.outer_nInteractionLengths = nInteractionLengths;
+	caloLayer.outer_thickness = thickness_sum;
+	
+	caloLayer.distance = Hcal_start_z + (layer_id-1)*layerThickness;
+	caloLayer.absorberThickness = Hcal_radiator_thickness ;
+	
+	caloData->layers.push_back( caloLayer ) ;
+
+      }
     }
   }
   
   // Placements
   double endcap_z_offset = Hcal_start_z + Hcal_endcap_thickness/2.;
   for(int side = 0; side <= 1; side++){
-    int module_id = (side==0) ? 0 : 6;
+    int module_id = (side==0) ? 6 : 0;
     double this_module_z_offset = (side==0) ? endcap_z_offset : -endcap_z_offset;
     // use reflect volume for z<0, therefore, same rotation
     // segmentation violation happen if EndCapRingLogical.reflect(), back to rotate Y
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a135d6eda279f136833d95e3c959db1a00520fbe
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml
@@ -0,0 +1,21 @@
+<lccdd>
+  <detectors>
+    <detector name="Coil" type="SCoil02" vis="SOLVis" id="DetID_COIL" insideTrackingVolume="false" readout="COILCollection">
+      <envelope vis="SeeThrough">
+	<shape type="Tube" rmin="Solenoid_inner_radius" rmax="Solenoid_outer_radius" dz="Solenoid_half_length" material="Air"/>
+      </envelope>
+  
+      <type_flags type=" DetType_SUPPORT + DetType_COIL " />
+  
+      <!--fg: for now only a simple aluminum cylinder is created inside the envelope -->
+      <tube rmin="Solenoid_inner_radius" rmax="Solenoid_outer_radius" dz="Solenoid_half_length" material="G4_Al"/>
+      
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="COILCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+    </readout>
+  </readouts>
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml
index 8dd7602c1e415b63b47d6d52a7b9a22556926380..44f21025ccffe4e952544a836af318c54e56cd6e 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml
@@ -14,16 +14,18 @@
     <constant name="SDT_radius_min" value="InnerTracker_inner_radius"/>
     <constant name="SDT_radius_max" value="OuterTracker_outer_radius"/>
 
-    <constant name="SDT_half_length" value="MainTracker_half_length"/>
+    <constant name="SDT_half_length" value="DC_half_length"/>
     <constant name="SDT_length" value="SDT_half_length*2"/>
     <constant name="DC_length" value="DC_half_length*2"/>
 
-    <constant name="SDT_inner_chamber_radius_min" value="235*mm"/>
-    <constant name="SDT_inner_chamber_radius_max" value="InnerTracker_outer_radius"/>
+    <constant name="SDT_chamber_inner_wall_thickness" value="0.2*mm"/>
+    <constant name="SDT_chamber_outer_wall_thickness" value="2.8*mm"/>
+    <constant name="SDT_inner_chamber_radius_min" value="InnerTracker_inner_radius+SDT_chamber_inner_wall_thickness"/>
+    <constant name="SDT_inner_chamber_radius_max" value="InnerTracker_outer_radius-SDT_chamber_outer_wall_thickness"/>
     <constant name="SDT_inner_chamber_length" value="DC_length"/>
 
-    <constant name="SDT_outer_chamber_radius_min" value="OuterTracker_inner_radius"/>
-    <constant name="SDT_outer_chamber_radius_max" value="1715*mm"/>
+    <constant name="SDT_outer_chamber_radius_min" value="OuterTracker_inner_radius+SDT_chamber_inner_wall_thickness"/>
+    <constant name="SDT_outer_chamber_radius_max" value="OuterTracker_outer_radius-SDT_chamber_outer_wall_thickness"/>
     <constant name="SDT_outer_chamber_length" value="DC_length"/>
 
     <constant name="SDT_inner_chamber_layer_number" value="67"/>
@@ -31,14 +33,14 @@
     <constant name="SDT_chamber_layer_width" value="10*mm"/>
     <constant name="Epsilon" value="0*deg"/>
 
-    <constant name="SDT_inner_chamber_inner_wall_radius_min" value="234.8*mm"/>
-    <constant name="SDT_inner_chamber_inner_wall_radius_max" value="235*mm"/>
-    <constant name="SDT_inner_chamber_outer_wall_radius_min" value="906*mm"/>
-    <constant name="SDT_inner_chamber_outer_wall_radius_max" value="908.8*mm"/>
-    <constant name="SDT_outer_chamber_inner_wall_radius_min" value="1084.8*mm"/>
-    <constant name="SDT_outer_chamber_inner_wall_radius_max" value="1085*mm"/>
-    <constant name="SDT_outer_chamber_outer_wall_radius_min" value="1715*mm"/>
-    <constant name="SDT_outer_chamber_outer_wall_radius_max" value="1717.8*mm"/>
+    <constant name="SDT_inner_chamber_inner_wall_radius_min" value="SDT_inner_chamber_radius_min-SDT_chamber_inner_wall_thickness"/>
+    <constant name="SDT_inner_chamber_inner_wall_radius_max" value="SDT_inner_chamber_radius_min"/>
+    <constant name="SDT_inner_chamber_outer_wall_radius_min" value="SDT_inner_chamber_radius_max"/>
+    <constant name="SDT_inner_chamber_outer_wall_radius_max" value="SDT_inner_chamber_radius_max+SDT_chamber_outer_wall_thickness"/>
+    <constant name="SDT_outer_chamber_inner_wall_radius_min" value="SDT_outer_chamber_radius_min-SDT_chamber_inner_wall_thickness"/>
+    <constant name="SDT_outer_chamber_inner_wall_radius_max" value="SDT_outer_chamber_radius_min"/>
+    <constant name="SDT_outer_chamber_outer_wall_radius_min" value="SDT_outer_chamber_radius_max"/>
+    <constant name="SDT_outer_chamber_outer_wall_radius_max" value="SDT_outer_chamber_radius_max+SDT_chamber_outer_wall_thickness"/>
 
     <constant name="DC_Endcap_rmin" value="SDT_radius_min"/>
     <constant name="DC_Endcap_rmax" value="SDT_radius_max"/>
@@ -55,8 +57,8 @@
     <detector id="DetID_DC" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="BlueVis" sensitive="true" insideTrackingVolume="true">
       <envelope vis="SeeThrough">
         <shape type="BooleanShape" operation="Union" material="Air">
-          <shape type="Tube" rmin="SDT_radius_min" rmax="909*mm" dz="SDT_half_length" />
-          <shape type="Tube" rmin="1084.8*mm" rmax="SDT_radius_max" dz="SDT_half_length" />
+          <shape type="Tube" rmin="SDT_radius_min" rmax="InnerTracker_outer_radius" dz="MainTracker_half_length" />
+          <shape type="Tube" rmin="OuterTracker_inner_radius" rmax="SDT_radius_max" dz="MainTracker_half_length" />
         </shape>
       </envelope>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml
index dce464bf8f2dc60523562d475579e2bb696c818c..f6f865ea47763225fcef3ab8065db1a2a386fe17 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml
@@ -56,8 +56,8 @@
       <extended_reconstruction_parameters strip_width="0.001*mm" strip_length="250*mm" strip_pitch="0.01*mm" strip_angle="5*deg"  />
 
       <!-- SQL command: "select * from disks;"  -->
-      <disk disk_number="1" z_position_ReltoTPCLength="0" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.9*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0"  />
-      <disk disk_number="2" z_position_ReltoTPCLength="FTD_disk2_zPosRelToDCLength" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.9*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0"  />
+      <disk disk_number="1" z_position_ReltoTPCLength="0" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.8*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0"  />
+      <disk disk_number="2" z_position_ReltoTPCLength="FTD_disk2_zPosRelToDCLength" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.8*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0"  />
       <disk disk_number="3" z_position_ReltoTPCLength="FTD_disk3_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1"  />
       <disk disk_number="4" z_position_ReltoTPCLength="FTD_disk4_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1"  />
       <disk disk_number="5" z_position_ReltoTPCLength="FTD_disk5_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1"  />
diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..afbb943147743d9a783c886da870c60feab9ee60
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml
@@ -0,0 +1,76 @@
+<lccdd>
+  <define>
+    <constant name="FTD_inner_radius" value="BeamPipe_VertexRegion_rmax + FTD_BeamPipe_cable_clearance"/>
+    <constant name="FTD_outer_radius" value="InnerTracker_inner_radius - FTD_InnerTracker_gap"/>
+    <constant name="FTD_outer_radius_1"  value="SIT1_inner_radius - env_safety"/>
+    <constant name="FTD_outer_radius_2"  value="FTD_outer_radius - env_safety"/>
+    <constant name="FTD_half_length"  value="InnerTracker_half_length"/>
+    <constant name="FTD_min_z_0" value="Vertex_half_length + env_safety"/>
+    <constant name="FTD_min_z_2" value="SIT1_half_length   + env_safety"/>
+    <constant name="FTD_cone_min_z" value="BeamPipe_CentralAl_zmax"/>
+    <constant name="FTD_cone_radius" value="FTD_half_length*tan(CrossingAngle/2) + BeamPipe_Dnstream_inner_radius + BeamPipe_Cu_thickness + FTD_BeamPipe_cable_clearance/2"/>
+    <constant name="petal_cp_support_thickness" value="2.0*mm"/>
+    <constant name="petal_support_zoffset" value="1.5*mm"/>
+    <constant name="FTD1_vtx3_distance_z" value="95*mm"/>
+    <constant name="FTD7_ecal_distance_z" value="200*mm"/>
+    <constant name="FTD_disk2_zPosRelToDCLength" value="0.158004*2350*mm/InnerTracker_half_length"/>
+    <constant name="FTD_disk3_zPosRelToDCLength" value="0.273577*2350*mm/InnerTracker_half_length"/>
+    <constant name="FTD_disk4_zPosRelToDCLength" value="0.359149*2350*mm/InnerTracker_half_length"/>
+    <constant name="FTD_disk5_zPosRelToDCLength" value="0.393600*2350*mm/InnerTracker_half_length"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_FTD" name="FTD" type="FTD_Simple_Staggered" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true">
+      <envelope vis="FTDVis">
+        <shape type="BooleanShape" operation="Subtraction" material="Air" >
+          <shape type="BooleanShape" operation="Subtraction" material="Air" >
+            <shape type="BooleanShape" operation="Subtraction" material="Air" >
+              <shape type="BooleanShape" operation="Subtraction" material="Air" >
+                <shape type="Tube" rmin="FTD_inner_radius"   rmax="FTD_outer_radius" dz="FTD_half_length"  />
+                <shape type="Tube" rmin="0." rmax="FTD_outer_radius+env_safety" dz="FTD_min_z_0" />
+              </shape>
+              <shape type="Tube" rmin="FTD_outer_radius_1" rmax="FTD_outer_radius+env_safety" dz="FTD_min_z_2" />
+            </shape>
+            <shape type="Cone" rmin1="0" rmax1="FTD_inner_radius" rmin2="0" rmax2="FTD_cone_radius"
+                   z="(FTD_half_length-FTD_cone_min_z)/2. + env_safety "/>
+            <position x="0" y="0" z="FTD_cone_min_z+(FTD_half_length-FTD_cone_min_z)/2."/>
+          </shape>
+          <shape type="Cone" rmin1="0" rmax1="FTD_inner_radius" rmin2="0" rmax2="FTD_cone_radius"
+                 z="(FTD_half_length-FTD_cone_min_z)/2. + env_safety "/>
+          <position x="0" y="0" z="-FTD_cone_min_z-(FTD_half_length-FTD_cone_min_z)/2."/>
+          <rotation x="0" y="180.*deg" z="0" />
+        </shape>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER +  DetType_ENDCAP  + DetType_PIXEL + DetType_STRIP "/>
+
+      <!-- SQL command: "select * from common_parameters;"  -->
+      <common_parameters ftd1_vtx3_distance_z="FTD1_vtx3_distance_z"
+                         ftd7_ecal_distance_z="FTD7_ecal_distance_z" ftd1_sit1_radial_diff="-1*mm" ftd2_sit1_radial_diff="-1*mm" ftd3_sit2_radial_diff="-FTD_InnerTracker_gap"
+                         ftd4to7_tpc_radial_gap="FTD_InnerTracker_gap" beamtube_clearance="FTD_BeamPipe_gap" cables_thickness="0.08*mm" cable_shield_thickness="0.1*mm"
+			 outer_cylinder_total_thickness="1*mm" petal_half_angle_support="11.25*deg" petal_y_ratio="0.5015"
+                         support_spaceframe_width="10*mm"/>
+
+      <!-- SQL command: "select * from extended_reconstruction_parameters;"  -->
+      <extended_reconstruction_parameters strip_width="0.001*mm" strip_length="250*mm" strip_pitch="0.01*mm" strip_angle="5*deg"  />
+
+      <!-- SQL command: "select * from disks;"  -->
+      <disk disk_number="1" z_position_ReltoTPCLength="0" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="62.*mm" padUp_Si_dxMax="58*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0"  />
+      <disk disk_number="2" z_position_ReltoTPCLength="FTD_disk2_zPosRelToDCLength" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="62.*mm" padUp_Si_dxMax="58*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0"  />
+      <disk disk_number="3" z_position_ReltoTPCLength="FTD_disk3_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1"  />
+      <disk disk_number="4" z_position_ReltoTPCLength="FTD_disk4_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1"  />
+      <disk disk_number="5" z_position_ReltoTPCLength="FTD_disk5_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1"  />
+
+    </detector>
+
+  </detectors>
+
+  <readouts>
+    <readout name="FTDCollection">
+      <!-- fixme: for now DD4hep cannot handle signed values - side should actually be "-2" -->
+      <id>system:5,side:2,layer:9,module:8,sensor:8</id>
+    </readout>
+  </readouts>
+
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a65ff1dc17fcceb0db7f2e97ba6c5d0220e9f054
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml
@@ -0,0 +1,79 @@
+<lccdd>
+  <define>
+    <constant name="Hcal_cells_size" value="10*mm"/>
+    <constant name="Hcal_inner_radius" value="Hcal_barrel_inner_radius"/>
+    <constant name="Hcal_half_length" value="Hcal_barrel_half_length"/>
+    <constant name="Hcal_inner_symmetry" value="Hcal_barrel_symmetry"/>
+    <constant name="Hcal_nlayers" value="40"/>
+    <constant name="Hcal_Ecal_gap" value="Hcal_barrel_inner_radius-Ecal_barrel_outer_radius"/>
+    <constant name="Ecal_outer_radius" value="Ecal_barrel_outer_radius"/>
+    
+    <constant name="Hcal_radiator_thickness" value="20.0*mm"/>
+    <constant name="Hcal_airgap_thickness" value="1*mm"/>
+    <constant name="Hcal_mylar_cathode_thickness" value="0.18*mm"/>
+    <constant name="Hcal_graphite_cathode_thickness" value="0.05*mm"/>
+    <constant name="Hcal_glass_cathode_thickness" value="1.1*mm"/>
+    <constant name="Hcal_sensitive_gas_gap" value="1.2*mm"/>
+    <constant name="Hcal_glass_anode_thickness" value="0.7*mm"/>
+    <constant name="Hcal_graphite_anode_thickness" value="0.05*mm"/>
+    <constant name="Hcal_mylar_anode_thickness" value="0.05*mm"/>
+    <constant name="Hcal_PCB_thickness" value="0.8*mm"/>
+    <constant name="Hcal_electronics_mask_thickness" value="1.6*mm"/>
+    
+    <constant name="Hcal_gas_edge_width" value="1*mm"/>
+    <constant name="Hcal_MinNumCellsInTransvPlane" value="11"/>
+    <constant name="Hcal_barrel_number_modules" value="5"/>
+    <constant name="Hcal_chamber_thickness" value="6.73*mm"/>
+    <constant name="Hcal_back_plate_thickness" value="15*mm"/>
+    <constant name="Hcal_lateral_structure_thickness" value="10*mm"/>
+    <constant name="Hcal_stave_gaps" value="0*mm"/>
+    <constant name="Hcal_modules_gap" value="2*mm"/>
+
+    <constant name="Hcal_pad_separation" value="0*mm"/>
+    <constant name="Hcal_gasInlet_length" value="3.0*mm"/>
+    <constant name="Hcal_spacer_separation" value="100*mm"/>
+    <constant name="Hcal_spacer_thickness" value="8*mm"/>
+    <constant name="Hcal_gasInlet_inner_radius" value="0.4*mm"/>
+    <constant name="Hcal_gasInlet_outer_radius" value="0.5*mm"/>
+  </define>
+
+  <detectors>
+    <detector name="HcalBarrel" type="SHcalRpc01_Barrel" id="DetID_HCAL" readout="HcalBarrelCollection" vis="GreenVis" insideTrackingVolume="false" >
+      <comment>Hadron Calorimeter Barrel</comment>
+      <envelope vis="HCALVis">
+        <shape type="BooleanShape" operation="Subtraction" material="Air" >
+          <shape type="Cone" z="Hcal_barrel_half_length + env_safety/2" rmin1="0.0" rmax1="Hcal_barrel_outer_radius + env_safety"
+		 rmin2="0.0" rmax2="Hcal_barrel_outer_radius + env_safety"/>
+          <shape type="PolyhedraRegular"  numsides="Hcal_barrel_symmetry" rmin="0.0"
+                 rmax="Hcal_barrel_inner_radius - env_safety" dz="2*(Hcal_barrel_half_length + env_safety)"/>
+	  <rotation x="0" y="0" z="-180*deg/Hcal_barrel_symmetry"/>
+        </shape>
+      </envelope>
+      <type_flags type=" DetType_CALORIMETER + DetType_BARREL + DetType_HADRONIC " />
+
+      <staves  material="stainless_steel"  vis="BlueVis"/>
+
+      <layer repeat="Hcal_nlayers" vis="SeeThrough">
+        <slice material="stainless_steel" thickness="Hcal_radiator_thickness"                    vis="BlueVis"   />
+        <slice material="Air"             thickness="Hcal_airgap_thickness"                      vis="WhiteVis"   />
+	<slice material="mylar"           thickness="Hcal_mylar_cathode_thickness"               vis="MagentaVis" />
+	<slice material="graphite"        thickness="Hcal_graphite_cathode_thickness"            vis="Invisible" />
+	<slice material="FloatGlass"      thickness="Hcal_glass_cathode_thickness"               vis="RedVis" />
+	<slice material="RPCGAS2"         thickness="Hcal_sensitive_gas_gap"   sensitive = "yes" vis="YellowVis" edge_material="PEEK-GF30" spacer_material="Nylon"/>
+	<slice material="FloatGlass"      thickness="Hcal_glass_anode_thickness"                 vis="RedVis" />
+	<slice material="graphite"        thickness="Hcal_graphite_anode_thickness"              vis="Invisible" />
+	<slice material="mylar"           thickness="Hcal_mylar_anode_thickness"                 vis="MagentaVis" />
+	<slice material="g10"             thickness="Hcal_PCB_thickness"                         vis="CyanVis" />
+	<slice material="g10"             thickness="Hcal_electronics_mask_thickness"            vis="GreenVis" />
+      </layer>
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="HcalBarrelCollection">
+      <segmentation type="CartesianGridYZ" grid_size_y="Hcal_cells_size" grid_size_z="Hcal_cells_size"/>
+      <id>system:5,module:3,stave:3,tower:5,layer:6,slice:4,y:32:-16,z:-16</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7d23b43cd6a4db765c393b568c0a2ed13ba1b9da
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml
@@ -0,0 +1,48 @@
+<lccdd>
+  <define>
+    <constant name="Hcal_endcap_nlayers" value="Hcal_nlayers"/>
+    <constant name="Hcal_endcap_center_box_size" value="700*mm"/>
+  </define>
+  <detectors>
+    <detector id="DetID_HCAL_ENDCAP" name="HcalEndcap" type="SHcalRpc01_Endcaps" readout="HcalEndcapsCollection"  vis="SeeThrough" calorimeterType="HAD_ENDCAP">
+      <comment>Hadron Calorimeter Endcap</comment>
+      <envelope vis="HCALVis">    
+	<shape type="BooleanShape" operation="Subtraction" material="Air">
+          <shape type="BooleanShape" operation="Subtraction" material="Air">
+            <shape type="Tube" rmin="0.0" rmax="Hcal_endcap_outer_radius + env_safety" dz="Hcal_endcap_zmax + env_safety"/>
+            <shape type="Tube" rmin="0.0" rmax="Hcal_endcap_outer_radius + 2.0*env_safety" dz="Hcal_endcap_zmin - env_safety"/>
+          </shape>
+          <shape type="Box" dx="Hcal_endcap_inner_radius - env_safety" dy="Hcal_endcap_inner_radius - env_safety" dz="Hcal_endcap_zmax + 2.0*env_safety"/>
+	</shape>
+	<rotation x="0" y="0" z="0"/>
+      </envelope>
+      
+      <type_flags type="DetType_CALORIMETER + DetType_ENDCAP + DetType_HADRONIC " />
+      
+      <staves material="stainless_steel" vis="SeeThrough"/>
+
+      <layer repeat="Hcal_endcap_nlayers" vis="SeeThrough">  
+	<slice material="stainless_steel" thickness="Hcal_radiator_thickness"                    vis="BlueVis"   />
+        <slice material="Air"             thickness="Hcal_airgap_thickness"                      vis="WhiteVis"   />
+        <slice material="mylar"           thickness="Hcal_mylar_cathode_thickness"               vis="MagentaVis" />
+        <slice material="graphite"        thickness="Hcal_graphite_cathode_thickness"            vis="Invisible" />
+        <slice material="FloatGlass"      thickness="Hcal_glass_cathode_thickness"               vis="RedVis" />
+        <slice material="RPCGAS2"         thickness="Hcal_sensitive_gas_gap"   sensitive = "yes" vis="YellowVis"/>
+        <slice material="FloatGlass"      thickness="Hcal_glass_anode_thickness"                 vis="RedVis" />
+        <slice material="graphite"        thickness="Hcal_graphite_anode_thickness"              vis="Invisible" />
+        <slice material="mylar"           thickness="Hcal_mylar_anode_thickness"                 vis="MagentaVis" />
+        <slice material="g10"             thickness="Hcal_PCB_thickness"                         vis="CyanVis" />
+	<slice material="g10"             thickness="Hcal_electronics_mask_thickness"            vis="GreenVis" />
+      </layer>
+      
+    </detector>
+  </detectors>
+  
+  <readouts>
+    <readout name="HcalEndcapsCollection">
+      <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size" offset_x="Hcal_cells_size/2.0" offset_y="Hcal_cells_size/2.0" />
+      <id>system:5,module:3,stave:3,tower:5,layer:6,x:32:-16,y:-16</id>
+    </readout>
+  </readouts>
+  
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2d90b1c81d0a5e41831bbd2f2dc19b3739e604d3
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml
@@ -0,0 +1,49 @@
+<lccdd>
+  <define>
+    <constant name="SET_inner_radius" value="OuterTracker_outer_radius + env_safety"/>
+    <constant name="SET_outer_radius" value="Ecal_barrel_inner_radius - env_safety "/>
+    <constant name="SET_half_length"  value="OuterTracker_half_length"/>
+    <constant name="SET_inner_distance_from_tpc" value="InnerTracker_outer_radius-OuterTracker_outer_radius+3*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_SET" name="SET" type="SET_Simple_Planar" vis="SETVis" readout="SETCollection" insideTrackingVolume="true">
+      <envelope vis="SETVis">
+	<shape type="BooleanShape" operation="Union" material="Air" >
+	  <shape type="Tube" rmin="InnerTracker_outer_radius" rmax="OuterTracker_inner_radius" dz="SET_half_length"  material = "Air" />
+	  <shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length"  material = "Air" />
+        </shape>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER +  DetType_BARREL + DetType_STRIP "/>
+
+      <reconstruction strip_width="0.0125*mm" strip_length="92*mm" strip_pitch="0.05*mm" strip_angle="7*deg"  />
+
+      <global sensitive_thickness="0.2*mm" support_thickness="1*mm" sensor_length="92*mm" sensitive_mat="G4_Si"
+              support_mat="G4_C" sensitive_threshold_KeV="64*keV"  />
+
+      <layer layer_id="0" sensitive_distance_from_tpc="SET_inner_distance_from_tpc" coverage_of_TPC_Ecal_Hcal_barrel="0.98"
+             n_ladders="24" ladder_clearance="0.1*mm" faces_IP="1"  />
+
+      <layer layer_id="1" sensitive_distance_from_tpc="SET_inner_distance_from_tpc+2.5*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98"
+             n_ladders="24" ladder_clearance="0.1*mm" faces_IP="0"  />
+
+      <layer layer_id="2" sensitive_distance_from_tpc="3*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98"
+             n_ladders="24" ladder_clearance="0.1*mm" faces_IP="1"  />
+
+      <layer layer_id="3" sensitive_distance_from_tpc="5.5*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98"
+             n_ladders="24" ladder_clearance="0.1*mm" faces_IP="0"  />
+
+    </detector>
+
+  </detectors>
+
+  <readouts>
+    <readout name="SETCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+    </readout>
+  </readouts>
+
+
+</lccdd>
+
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9e7a967efaa134682cb5d9ae978095be20d14846
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml
@@ -0,0 +1,49 @@
+<lccdd>
+  <define>
+    <constant name="SIT_sensitive_thickness" value="0.2*mm"/>
+    <constant name="SIT_inner_radius"   value="SIT1_inner_radius"/>
+    <constant name="SIT_inner_radius_1"   value="SIT_inner_radius + env_safety"/>
+    <constant name="SIT_outer_radius_1" value="SIT_inner_radius_1/cos(pi/8)"/>
+    <constant name="SIT_inner_radius_2" value="SIT2_inner_radius"/>
+    <constant name="SIT_outer_radius"   value="InnerTracker_inner_radius"/>
+    <constant name="SIT_half_length"    value="SIT2_half_length"/>
+    <constant name="SIT_half_length_1"  value="SIT1_half_length"/>
+    <constant name="SIT_layer_gap" value="2.5*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_SIT" name="SIT" type="SIT_Simple_Planar" vis="SITVis" readout="SITCollection" insideTrackingVolume="true">
+      <envelope vis="SeeThrough">
+        <shape type="BooleanShape" operation="Union" material="Air" >
+          <shape type="Tube" rmin="SIT_inner_radius"   rmax="SIT_outer_radius_1" dz="SIT_half_length_1" />
+          <shape type="Tube" rmin="SIT_inner_radius_2" rmax="SIT_outer_radius"   dz="SIT_half_length" />
+        </shape>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/>
+
+      <!-- database : sit_simple_planar_sensors_03 -->
+      
+      <!-- SQL command: "select * from extended_reconstruction_parameters;"  -->
+      <reconstruction strip_width="0." strip_length="92*mm" strip_pitch="0." strip_angle="0*deg"  />
+
+      <!-- SQL command: "select * from global;"  -->
+      <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="1*mm" sensor_length="92*mm"
+              sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV"  />
+
+      <!-- SQL command: "select * from sit_layers;"  -->
+      <layer layer_id="0" sensitive_radius="SIT_inner_radius_1+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="8" n_ladders="10"
+             ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="1" is_SIT2="0"  />
+
+      <layer layer_id="1" sensitive_radius="SIT_inner_radius_2+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="48" n_ladders="16"
+             ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="1"  />
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="SITCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+    </readout>
+  </readouts>
+  
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml
index 857af3277bbada91568cbb05352dc6e3a7c50bc3..3a9df414610a95791f1d1a9bb0616d4d255465d9 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml
@@ -25,7 +25,7 @@
       <!-- database : sit_simple_planar_sensors_03 -->
       
       <!-- SQL command: "select * from extended_reconstruction_parameters;"  -->
-      <reconstruction strip_width="0." strip_length="92*mm" strip_pitch="0." strip_angle="0*deg"  />
+      <reconstruction strip_width="0." strip_length="92*mm" strip_pitch="0." strip_angle="7*deg"  />
 
       <!-- SQL command: "select * from global;"  -->
       <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="1*mm" sensor_length="92*mm"
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8960b15c2c9931e19b398d049673328950dbd7ff
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml
@@ -0,0 +1,38 @@
+<lccdd>
+  <define>
+    <constant name="Yoke_cells_size" value="30*mm"/>
+  </define>
+  <detectors>
+    <detector name="YokeBarrel" type="Yoke05_Barrel" id="DetID_YOKE" readout="MuonBarrelCollection" vis="YellowVis" insideTrackingVolume="false">
+      <envelope vis="YOKEVis">
+        <shape type="BooleanShape" operation="Intersection" material="Air" >
+          <shape type="Box" dx="Yoke_barrel_outer_radius + env_safety" dy="Yoke_barrel_outer_radius + env_safety" dz="Yoke_barrel_half_length + env_safety"/>
+          <shape type="PolyhedraRegular" numsides="Yoke_barrel_symmetry"  rmin="Yoke_barrel_inner_radius" rmax="Yoke_barrel_outer_radius"
+		 dz="2.0*Yoke_barrel_half_length" material = "Air" />
+          <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/Yoke_barrel_symmetry"/>
+        </shape>
+      </envelope>
+      
+      <type_flags type=" DetType_CALORIMETER + DetType_BARREL + DetType_MUON " />
+
+      <dimensions numsides="Yoke_barrel_symmetry" rmin="Yoke_barrel_inner_radius" rmax="Yoke_barrel_outer_radius" zhalf="Yoke_barrel_half_length"  material="Air"/>
+      <position x="0*mm" y="0*mm" z="0*mm"/>
+      <rotation x="0*deg" y="0*deg" z="0*deg"/>
+      <staves  material = "Iron"  vis="BlueVis"/>
+      <!--TODO Yoke05_Barrel fixed 14 layers, should be updated as optional-->
+      <layer repeat="14" vis="SeeThrough">
+        <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
+        <slice material = "G4_POLYSTYRENE" thickness = "10.0*mm" sensitive = "yes"  vis="CyanVis"   />
+        <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
+      </layer>
+    </detector>
+  </detectors>
+  
+  <readouts>
+    <readout name="MuonBarrelCollection">
+      <segmentation type="CartesianGridXZ" grid_size_x="Yoke_cells_size" grid_size_z="Yoke_cells_size"/>
+      <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,z:-16</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6e49c15cb0b3c68bedf66c2f0b468689720ed70d
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml
@@ -0,0 +1,47 @@
+<lccdd>
+  <define>
+    <constant name="Hcal_Yoke_plug_gap"      value="25*mm"/>
+    <constant name="YokeEndcapPlug_symmetry" value="Yoke_endcap_outer_symmetry"/>
+  </define>
+  <detectors>
+    <detector name="YokeEndcap" type="Yoke05_Endcaps" id="DetID_YOKE_ENDCAP" readout="MuonEndcapsCollection" vis="YellowVis" insideTrackingVolume="false" >
+      <envelope vis="YOKEVis">
+        <shape type="BooleanShape" operation="Subtraction" material="Air">
+          <shape type="BooleanShape" operation="Subtraction" material="Air">
+            <shape type="BooleanShape" operation="Intersection" material="Air">
+              <shape type="Box" dx="Yoke_endcap_outer_radius + 1.5*env_safety" dy="Yoke_endcap_outer_radius + 1.5*env_safety"
+                     dz="Yoke_endcap_zmax + env_safety"/>
+              <shape type="PolyhedraRegular" numsides="Yoke_endcap_outer_symmetry"  rmin="Yoke_endcap_inner_radius - env_safety"
+                     rmax="Yoke_endcap_outer_radius + env_safety" dz="2.*Yoke_endcap_zmax + env_safety" />
+              <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/Yoke_endcap_outer_symmetry"/>
+            </shape>
+            <shape type="Box" dx="Yoke_endcap_outer_radius + 1.5*env_safety" dy="Yoke_endcap_outer_radius + 1.5*env_safety"
+                   dz="HcalEndcap_max_z + Hcal_Yoke_plug_gap - env_safety"/>
+          </shape>
+	  <!--without Yoke_plug--> 
+          <!--shape type="PolyhedraRegular" numsides="YokeEndcapPlug_symmetry"  rmin="Hcal_barrel_outer_radius*cos(pi/Hcal_endcap_outer_symmetry) + env_safety"
+                 rmax="Yoke_endcap_outer_radius + 2.0*env_safety" dz="2.*Yoke_endcap_zmin - env_safety" />
+          <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/YokeEndcapPlug_symmetry"/-->
+        </shape>
+      </envelope>
+
+      <type_flags type=" DetType_CALORIMETER + DetType_ENDCAP + DetType_MUON " />
+
+      <dimensions numsides="Yoke_endcap_outer_symmetry" rmin="Yoke_endcap_inner_radius" z="Yoke_barrel_half_length" />
+      <material name="Iron"/>
+      <layer repeat="12" vis="SeeThrough">
+        <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
+        <slice material = "G4_POLYSTYRENE" thickness = "10.0*mm" sensitive = "yes"  vis="CyanVis"   />
+        <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
+      </layer>
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="MuonEndcapsCollection">
+      <segmentation type="CartesianGridXY" grid_size_x="Yoke_cells_size" grid_size_y="Yoke_cells_size"/>
+      <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,y:-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 36230440063ab1e4785d4f3340c0cbee6bf02321..7fa9b7cba6c11d4e29037539f4dddd8a50181b20 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,11 +85,11 @@
     <constant name="DC_half_length"  value="2225*mm" />
     <constant name="MainTracker_half_length"  value="DC_half_length+DC_Endcap_z" />
     <constant name="InnerTracker_half_length"  value="DC_half_length" />
-    <constant name="InnerTracker_inner_radius" value="234*mm"/>
-    <constant name="InnerTracker_outer_radius" value="906*mm"/>
+    <constant name="InnerTracker_inner_radius" value="234.8*mm"/>
+    <constant name="InnerTracker_outer_radius" value="908.8*mm"/>
     <constant name="OuterTracker_half_length"  value="DC_half_length"/>
-    <constant name="OuterTracker_inner_radius" value="1085*mm"/>
-    <constant name="OuterTracker_outer_radius" value="1720*mm"/>
+    <constant name="OuterTracker_inner_radius" value="1084.8*mm"/>
+    <constant name="OuterTracker_outer_radius" value="1717.8*mm"/>
     
     <constant name="SIT1_inner_radius"   value="152.90*mm"/>
     <constant name="SIT1_half_length"    value="368.00*mm"/>
@@ -125,42 +125,50 @@
     <constant name="Ecal_endcap_zmin"        value="2260*mm"/>
     <constant name="Ecal_endcap_zmax"        value="2540*mm"/>
     <constant name="Ecal_endcap_symmetry"    value="8"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/>
     
-    <constant name="Solenoid_inner_radius" value="2250*mm"/>
-    <constant name="Solenoid_outer_radius" value="2550*mm"/>
+    <constant name="Solenoid_inner_radius" value="2260*mm"/>
+    <constant name="Solenoid_outer_radius" value="2560*mm"/>
     <constant name="Solenoid_half_length" value="3000*mm"/>
     <constant name="SolenoidCoil_half_length" value="2900*mm"/>
     <constant name="SolenoidCoil_radius" value="2300*mm"/>
     <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/>
 
     <constant name="Hcal_barrel_inner_radius" value="2600*mm"/>
-    <constant name="Hcal_barrel_outer_radius" value="3700*mm"/>
+    <constant name="Hcal_barrel_outer_radius" value="3670.6805372782*mm"/>
     <constant name="Hcal_barrel_half_length"  value="3000*mm"/>
     <constant name="Hcal_barrel_symmetry"    value="8"/>
     
     <constant name="Hcal_endcap_inner_radius" value="340*mm"/>
     <constant name="Hcal_endcap_outer_radius" value="Hcal_barrel_outer_radius"/>
     <constant name="Hcal_endcap_zmin" value="3010*mm"/>
-    <constant name="Hcal_endcap_zmax" value="4110*mm"/>
+    <constant name="Hcal_endcap_zmax" value="4094.2*mm"/>
     <constant name="Hcal_endcap_symmetry" value="8"/>
-    
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/>
+    <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/>
+    <constant name="Hcal_outer_radius" value="Hcal_barrel_outer_radius"/>
+
     <constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/>
     <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/>
     <constant name="Hcal_ring_zmin" value="2600*mm"/>
-    <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin"/>
+    <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/>
     <constant name="Hcal_ring_symmetry" value="8"/>
         
     <constant name="Yoke_barrel_inner_radius" value="3710*mm"/>
-    <constant name="Yoke_barrel_outer_radius" value="5170*mm"/>
-    <constant name="Yoke_barrel_half_length" value="3650*mm"/>
+    <constant name="Yoke_barrel_outer_radius" value="6951*mm"/>
+    <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/>
     <constant name="Yoke_barrel_symmetry" value="8"/>
     
     <constant name="Yoke_endcap_inner_radius" value="400*mm"/>
-    <constant name="Yoke_endcap_outer_radius" value="5170*mm"/>
-    <constant name="Yoke_endcap_zmin" value="4150*mm"/>
-    <constant name="Yoke_endcap_zmax" value="5610*mm"/>
+    <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/>
+    <constant name="Yoke_endcap_zmin" value="Yoke_barrel_half_length+25*mm"/>
+    <constant name="Yoke_endcap_zmax" value="6750*mm"/>
     <constant name="Yoke_endcap_outer_symmetry" value="8"/>
     <constant name="Yoke_endcap_inner_symmetry" value="0"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/>
     
     <constant name="LumiCal_zmax" value="805*mm" />
     <constant name="LumiCal_zmin" value="700*mm"/>
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml
index d264a40d004528055692ba1de56706e7f009986f..2dff18ec59923381d7e98a1e999e334c4649b4e4 100644
--- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml
@@ -1,8 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
-  <info name="CRD_i1_v01"
-        title="CepC reference detctor with coil inside Hcal"
+  <info name="CRD_o1_v01"
+        title="CepC reference detctor with coil inside Hcal, strip SIT"
         author="C.D.Fu, "
         url="http://cepc.ihep.ac.cn"
         status="developing"
@@ -34,17 +35,28 @@
   <include ref="../CRD_common_v01/SET_SimplePlanar_v01_01.xml"/>
   <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/>
   <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/-->
-  <!--include ref="../CRD_common_v01/Coil_v01_01.xml"/-->
-  <!--include ref="../CRD_common_v01/Hcal_v01_01.xml"/-->
-  <!--include ref="../CRD_common_v01/Yoke_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Hcal_Rpc_EndcapRing_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/>
   <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/-->
 
   <fields>
-    <field name="GlobalSolenoid" type="solenoid"
+    <field name="InnerSolenoid" type="solenoid"
            inner_field="Field_nominal_value"
+           outer_field="0"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="SolenoidCoil_center_radius"
+           outer_radius="Solenoid_outer_radius">
+    </field>
+    <field name="OuterSolenoid" type="solenoid"
+           inner_field="0"
            outer_field="Field_outer_nominal_value"
            zmax="SolenoidCoil_half_length"
-           outer_radius="SolenoidCoil_center_radius">
+           inner_radius="Solenoid_outer_radius"
+           outer_radius="Yoke_barrel_inner_radius">
     </field>
   </fields>
 
diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0ef534ce04ff16c208695f5d74661f21c30ce392
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+
+  <info name="CRDDimensions"
+	title="master file with includes and world dimension"
+	author="C.D.Fu, "
+	url="no"
+	status="development"
+	version="1.0">
+    <comment>
+      undeterminded parameters
+    </comment>
+  </info>
+
+  <define>
+    <constant name="CrossingAngle" value="0.033*rad"/>  
+
+    <constant name="GlobalTrackerReadoutID_DCH" type="string" value="system:8,chamber:1,layer:7,phi:16"/>
+    <constant name="GlobalTrackerReadoutID" type="string" value="system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2"/>
+
+    <constant name="Field_nominal_value" value="3*tesla"/>
+    <constant name="Field_outer_nominal_value" value="-1.3*tesla"/>
+
+    <constant name="env_safety" value="0.1*mm"/>
+
+    <constant name="DetID_NOTUSED"      value="  0"/>
+    <constant name="DetID_VXD"          value="  1"/>
+    <constant name="DetID_SIT"          value="  2"/>
+    <constant name="DetID_FTD"          value="  3"/>
+    <constant name="DetID_TPC"          value="  4"/>
+    <constant name="DetID_SET"          value="  5"/>
+    <constant name="DetID_ETD"          value="  6"/>
+    <constant name="DetID_DC"           value="  7"/>
+    
+    <constant name="DetID_ECAL"         value=" 20"/>
+    <constant name="DetID_ECAL_PLUG"    value=" 21"/>
+    <constant name="DetID_HCAL"         value=" 22"/>
+    <constant name="DetID_HCAL_RING"    value=" 23"/>
+    <constant name="DetID_LCAL"         value=" 24"/>
+    <constant name="DetID_BCAL"         value=" 25"/>
+    <constant name="DetID_LHCAL"        value=" 26"/>
+    <constant name="DetID_YOKE"         value=" 27"/>
+    <constant name="DetID_COIL"         value=" 28"/>
+    <constant name="DetID_ECAL_ENDCAP"  value=" 29"/>
+    <constant name="DetID_HCAL_ENDCAP"  value=" 30"/>
+    <constant name="DetID_YOKE_ENDCAP"  value=" 31"/>
+    
+    <constant name="DetID_bwd"       value="-1"/>
+    <constant name="DetID_barrel"    value=" 0"/>
+    <constant name="DetID_fwd"       value="+1"/>
+    
+    <constant name="BeamPipe_Be_inner_thickness"   value="0.5*mm"/>
+    <constant name="BeamPipe_Cooling_thickness"    value="0.5*mm"/>
+    <constant name="BeamPipe_Be_outer_thickness"   value="0.3*mm"/>
+    <constant name="BeamPipe_Be_total_thickness"   value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/>
+    <constant name="BeamPipe_Al_thickness"         value="BeamPipe_Be_total_thickness"/>
+    <constant name="BeamPipe_Cu_thickness"         value="2.0*mm"/>
+    
+    <constant name="BeamPipe_CentralBe_zmax"       value="120*mm"/>
+    <constant name="BeamPipe_CentralAl_zmax"       value="205*mm"/>
+    <constant name="BeamPipe_ConeAl_zmax"          value="655*mm"/>
+    <constant name="BeamPipe_LinkerAl_zmax"        value="700*mm"/>
+    <constant name="BeamPipe_LinkerCu_zmax"        value="780*mm"/>
+    <constant name="BeamPipe_Waist_zmax"           value="805*mm"/>
+    <constant name="BeamPipe_Crotch_zmax"          value="855*mm"/>
+    <constant name="BeamPipe_FirstSeparated_zmax"  value="1110*mm"/>
+    <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/>
+    <constant name="BeamPipe_end_z"                value="12*m"/>
+
+    <constant name="BeamPipe_Central_inner_radius"  value="14*mm"/>
+    <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/>
+    <constant name="BeamPipe_Upstream_inner_radius" value="6*mm"/>
+    <constant name="BeamPipe_Dnstream_inner_radius" value="10*mm"/>
+    <constant name="BeamPipe_Crotch_hole_height"    value="30.67*mm"/>
+    <constant name="BeamPipe_VertexRegion_rmax"     value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/>
+    <constant name="BeamPipe_ForwardRegion_rmax"    value="BeamPipe_Expanded_inner_radius+BeamPipe_Cu_thickness"/>
+
+    <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/>
+    <constant name="Vertex_outer_radius" value="101*mm"/>
+    <constant name="Vertex_half_length"  value="200*mm"/>
+
+    <constant name="DC_Endcap_z" value="0.1*mm"/>
+    <constant name="DC_half_length"  value="2225*mm" />
+    <constant name="MainTracker_half_length"  value="DC_half_length+DC_Endcap_z" />
+    <constant name="InnerTracker_half_length"  value="DC_half_length" />
+    <constant name="InnerTracker_inner_radius" value="234.8*mm"/>
+    <constant name="InnerTracker_outer_radius" value="908.8*mm"/>
+    <constant name="OuterTracker_half_length"  value="DC_half_length"/>
+    <constant name="OuterTracker_inner_radius" value="1084.8*mm"/>
+    <constant name="OuterTracker_outer_radius" value="1717.8*mm"/>
+    
+    <constant name="SIT1_inner_radius"   value="140*mm"/>
+    <constant name="SIT1_half_length"    value="368.00*mm"/>
+    <constant name="SIT2_inner_radius"   value="225*mm"/>
+    <constant name="SIT2_half_length"    value="InnerTracker_half_length"/>
+
+    <constant name="FTD_BeamPipe_cable_clearance"     value="10*mm"/> 
+    <constant name="FTD_BeamPipe_gap"     value="15*mm"/>
+    <constant name="FTD_InnerTracker_gap" value="5*mm"/>
+
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> 
+    <constant name="TPC_Ecal_Hcal_barrel_halfZ"   value="MainTracker_half_length"/>
+    <constant name="TPC_inner_radius"             value="InnerTracker_inner_radius"/>
+    <constant name="TPC_outer_radius"             value="OuterTracker_outer_radius"/>
+    <constant name="SIT1_Radius"                  value="SIT1_inner_radius"/>
+    <constant name="SIT1_Half_Length_Z"           value="SIT1_half_length"/>
+    <constant name="SIT2_Radius"                  value="InnerTracker_inner_radius"/> <!--fake, used by FTD_Simple_Staggered and FTD_cepc, now should be determined by inner tracker-->
+    <constant name="SIT2_Half_Length_Z"           value="SIT2_half_length"/>
+    <constant name="TUBE_IPOuterTube_end_z"       value="BeamPipe_CentralAl_zmax"/>
+    <constant name="TUBE_IPOuterTube_end_radius"  value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/>
+    <constant name="TUBE_IPOuterBulge_end_z"      value="BeamPipe_Crotch_zmax"/><!--"BeamPipe_ConeAl_zmax"/-->
+    <constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/>
+							 <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/-->
+
+    <constant name="Ecal_barrel_inner_radius" value="1800*mm"/>
+    <constant name="Ecal_barrel_thickness"    value="280*mm"/>
+    <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/>
+    <constant name="Ecal_barrel_half_length"  value="2300*mm"/>
+    <constant name="Ecal_barrel_symmetry"    value="8"/>
+    
+    <constant name="Ecal_endcap_inner_radius" value="340*mm"/>
+    <constant name="Ecal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/>
+    <constant name="Ecal_endcap_zmin"        value="2260*mm"/>
+    <constant name="Ecal_endcap_zmax"        value="2540*mm"/>
+    <constant name="Ecal_endcap_symmetry"    value="8"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/>
+    
+    <constant name="Solenoid_inner_radius" value="2260*mm"/>
+    <constant name="Solenoid_outer_radius" value="2560*mm"/>
+    <constant name="Solenoid_half_length" value="3000*mm"/>
+    <constant name="SolenoidCoil_half_length" value="2900*mm"/>
+    <constant name="SolenoidCoil_radius" value="2300*mm"/>
+    <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/>
+
+    <constant name="Hcal_barrel_inner_radius" value="2600*mm"/>
+    <constant name="Hcal_barrel_outer_radius" value="3670.6805372782*mm"/>
+    <constant name="Hcal_barrel_half_length"  value="3000*mm"/>
+    <constant name="Hcal_barrel_symmetry"    value="8"/>
+    
+    <constant name="Hcal_endcap_inner_radius" value="340*mm"/>
+    <constant name="Hcal_endcap_outer_radius" value="Hcal_barrel_outer_radius"/>
+    <constant name="Hcal_endcap_zmin" value="3010*mm"/>
+    <constant name="Hcal_endcap_zmax" value="4094.2*mm"/>
+    <constant name="Hcal_endcap_symmetry" value="8"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/>
+    <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/>
+    <constant name="Hcal_outer_radius" value="Hcal_barrel_outer_radius"/>
+
+    <constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/>
+    <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/>
+    <constant name="Hcal_ring_zmin" value="2600*mm"/>
+    <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/>
+    <constant name="Hcal_ring_symmetry" value="8"/>
+        
+    <constant name="Yoke_barrel_inner_radius" value="3710*mm"/>
+    <constant name="Yoke_barrel_outer_radius" value="6951*mm"/>
+    <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/>
+    <constant name="Yoke_barrel_symmetry" value="8"/>
+    
+    <constant name="Yoke_endcap_inner_radius" value="400*mm"/>
+    <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/>
+    <constant name="Yoke_endcap_zmin" value="Yoke_barrel_half_length+25*mm"/>
+    <constant name="Yoke_endcap_zmax" value="6750*mm"/>
+    <constant name="Yoke_endcap_outer_symmetry" value="8"/>
+    <constant name="Yoke_endcap_inner_symmetry" value="0"/>
+    <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
+    <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/>
+    
+    <constant name="LumiCal_zmax" value="805*mm" />
+    <constant name="LumiCal_zmin" value="700*mm"/>
+    <constant name="LumiCal_thickness" value="(LumiCal_zmax-LumiCal_zmin)/2.0"/>
+    <constant name="LumiCal_inner_radius" value="35.0*mm"/>
+    <constant name="LumiCal_outer_radius" value="100.0*mm- env_safety"/>
+        
+    <constant name="tracker_region_zmax" value="OuterTracker_half_length"/>
+    <constant name="tracker_region_rmax" value="OuterTracker_outer_radius"/>
+
+  </define>
+  
+  <limits>
+    <limitset name="cal_limits">
+      <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+    </limitset>
+    <limitset name="dc_limits">
+      <limit name="step_length_max" particles="*" value="10.0" unit="mm" />
+    </limitset>
+    <limitset name="tracker_limits">
+      <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+    </limitset>
+  </limits>
+
+  <regions>
+    <region name="BeampipeRegion"/>
+    <region name="VertexRegion"/>
+    <region name="ForwardRegion"/>
+  </regions>
+
+  <display>
+    <vis name="VXDVis"           alpha="0.1" r="0.1"   g=".5"      b=".5"    showDaughters="true"  visible="true"/>
+    <vis name="VXDLayerVis"      alpha="1.0" r="0.1"   g=".5"      b=".5"    showDaughters="true"  visible="true"/>
+    <vis name="VXDSupportVis"    alpha="1.0" r="0.0"   g="1.0"     b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="FTDVis"           alpha="1.0" r="0.0"   g="0.1"     b="0.0"   showDaughters="true"  visible="false"/>
+    <vis name="FTDSensitiveVis"  alpha="1.0" r="1.0"   g="1.0"     b="0.45"  showDaughters="true" visible="true"/>
+    <vis name="FTDSupportVis"    alpha="1.0" r="1.0"   g="0.5"     b="0.5"   showDaughters="true" visible="true"/>
+    <vis name="SITVis"           alpha="1.0" r="0.54"  g="0.43"    b="0.04"  showDaughters="true"  visible="true"/>
+    <vis name="SETVis"           alpha="1.0" r="0.8"   g="0.8"     b="0.4"   showDaughters="true"  visible="false"/>
+    <vis name="ECALVis"          alpha="1.0" r="0.2"   g="0.6"     b="0"     showDaughters="true"  visible="true"/>
+    <vis name="HCALVis"          alpha="1.0" r="0.078" g="0.01176" b="0.588" showDaughters="true"  visible="true"/>
+    <vis name="SOLVis"           alpha="1.0" r="0.4"   g="0.4"     b="0.4"   showDaughters="true"  visible="true"/>
+    <vis name="YOKEVis"          alpha="1.0" r="0.6"   g="0.0"     b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="LCALVis"          alpha="1.0" r="0.25"  g="0.88"    b="0.81"  showDaughters="true"  visible="true"/>
+    <vis name="SupportVis"       alpha="1.0" r="0.2"   g="0.2"     b="0.2"   showDaughters="true" visible="true"/>
+
+    <vis name="WhiteVis"         alpha="0.0" r=".96" g=".96"  b=".96"   showDaughters="true"  visible="true"/>
+    <vis name="LightGrayVis"     alpha="0.0" r=".75" g=".75"  b=".75"   showDaughters="true"  visible="true"/>
+    <vis name="Invisible"        alpha="0.0" r="0.0" g="0.0"  b="0.0"   showDaughters="false"  visible="false"/>
+    <vis name="SeeThrough"       alpha="0.0" r="0.0" g="0.0"  b="0.0"   showDaughters="true"  visible="false"/>
+    <vis name="RedVis"           alpha="1.0" r="1.0" g="0.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="GreenVis"         alpha="1.0" r="0.0" g="1.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="BlueVis"          alpha="1.0" r="0.0" g="0.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="CyanVis"          alpha="1.0" r="0.0" g="1.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="MagentaVis"       alpha="1.0" r="1.0" g="0.0"  b="1.0"   showDaughters="true"  visible="true"/>
+    <vis name="YellowVis"        alpha="1.0" r="1.0" g="1.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="BlackVis"         alpha="1.0" r="0.0" g="0.0"  b="0.0"   showDaughters="true"  visible="true"/>
+    <vis name="GrayVis"          alpha="1.0" r="0.5" g="0.5"  b="0.5"   showDaughters="true"  visible="true"/>
+  </display>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8c584bd311e6e22b1dc18bd8864fab67b20fe630
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  <info name="CRD_o1_v02"
+        title="CepC reference detctor with coil inside Hcal, pixel SIT"
+        author="C.D.Fu, "
+        url="http://cepc.ihep.ac.cn"
+        status="developing"
+        version="v02">
+    <comment>CepC reference detector simulation models used for detector study </comment>
+  </info>
+  
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
+  </includes>
+  
+  <define>
+    <constant name="world_size" value="25*m"/>
+    <constant name="world_x" value="world_size"/>
+    <constant name="world_y" value="world_size"/>
+    <constant name="world_z" value="world_size"/>
+
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/>
+  </define>
+
+  <include ref="./CRD_Dimensions_v01_02.xml"/>
+
+  <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/>
+  <include ref="../CRD_common_v01/VXD_v01_01.xml"/>
+  <include ref="../CRD_common_v01/FTD_SimpleStaggered_v01_02.xml"/>
+  <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/SET_SimplePlanar_v01_02.xml"/>
+  <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Hcal_Rpc_EndcapRing_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/-->
+
+  <fields>
+    <field name="InnerSolenoid" type="solenoid"
+           inner_field="Field_nominal_value"
+           outer_field="0"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="SolenoidCoil_center_radius"
+           outer_radius="Solenoid_outer_radius">
+    </field>
+    <field name="OuterSolenoid" type="solenoid"
+           inner_field="0"
+           outer_field="Field_outer_nominal_value"
+           zmax="SolenoidCoil_half_length"
+           inner_radius="Solenoid_outer_radius"
+           outer_radius="Yoke_barrel_inner_radius">
+    </field>
+  </fields>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/README.md b/Detector/DetCRD/compact/README.md
index 3ca82e71804c4139861744be371791a2b1464e23..e28392fe7297e747bba016a292c8d2c1b8486f21 100644
--- a/Detector/DetCRD/compact/README.md
+++ b/Detector/DetCRD/compact/README.md
@@ -5,11 +5,12 @@ The following CRD detector models are available in CEPCSW
 | Model         |  Description                 | MainTracker |  Ecal   | Hcal | Status         |
 | ------------- | -----------------------------|------------ |---------|------|----------------|
 | CRD_o1_v01    | coil inside simulation model | DC          | crystal | RPC  | developing     |
+| CRD_o1_v02    | pixel SIT                    | DC          | crystal | RPC  | developing     |
 | ------------- | -----------------------------|-------------|---------|------|----------------|
  
 ## Details
 
-### CRD_o1_v01 (first preliminary import, to update)
+### CRD_o1_v01 (to update)
  - coil inside CRD model
  - BeamPipe
          - with center pipe + crotch link to doubly-pipe
@@ -29,12 +30,23 @@ The following CRD detector models are available in CEPCSW
  - Ecal
          - with crystal 
          - Detector/DetCRD/src/Calorimeter/CRDEcal.cpp
- - Hcal (TODO)
-         - with scintillator **and** RPC readout
+         - Endcap (TODO)
+ - Hcal
+         - with RPC readout
          - creates two sets of hit collections
- - Coil (TODO)
- - Yoke (TODO) 
+ - Coil
+         - CEPC_v4 like
+ - Yoke
+         - CEPC_v4 like
  - compact files:
          - [./CRD_o1_v01/CRD_o1_v01.xml](./CRD_o1_v01/CRD_o1_v01.xml)
 
-
+### CRD_o1_v02 (to update)
+ - based on CRD_o1_v01
+ - SIT:   strip -> pixel
+ - SIT12->SIT1: r = 152.90  -> 140.00 mm (pixel SIT1)
+ - SIT34->SIT2: between DCs -> 225.00 mm (pixel SIT2)
+ - SET12: outside DC -> between DCs
+ - SET34: outside DC (added)
+ - compact files:
+         - [./CRD_o1_v02/CRD_o1_v02.xml](./CRD_o1_v02/CRD_o1_v02.xml)
diff --git a/Detector/DetInterface/include/DetInterface/IGeomSvc.h b/Detector/DetInterface/include/DetInterface/IGeomSvc.h
index 7fe1255dd64c0fb24fd543e66b5079f41de15859..d4f508b99779f44e6b30811f4296ac722d8cf9c8 100644
--- a/Detector/DetInterface/include/DetInterface/IGeomSvc.h
+++ b/Detector/DetInterface/include/DetInterface/IGeomSvc.h
@@ -56,7 +56,7 @@ public:
   virtual const dd4hep::rec::ConicalSupportData* getBeamPipeData() =0;
 
   virtual const std::map<std::string,double>& getDetParameters(std::string s) = 0;
-  virtual const double getDetParameter(std::string set_name, std::string par_name) = 0;
+  virtual double getDetParameter(std::string set_name, std::string par_name) = 0;
   virtual TMaterial* getMaterial(std::string s) = 0;
 
   virtual ~IGeomSvc() {}
diff --git a/Detector/GeomSvc/src/GeomSvc.cpp b/Detector/GeomSvc/src/GeomSvc.cpp
index 050431b8a5359493e9c6e57413f70576a93cd0b7..878d60c81a117965f49b8139212b644f3cde95ba 100644
--- a/Detector/GeomSvc/src/GeomSvc.cpp
+++ b/Detector/GeomSvc/src/GeomSvc.cpp
@@ -130,7 +130,7 @@ const std::map<std::string,double>& GeomSvc::getDetParameters(std::string name){
   }
 }
 
-const double GeomSvc::getDetParameter(std::string set_name, std::string par_name){
+double GeomSvc::getDetParameter(std::string set_name, std::string par_name){
   std::map<std::string, std::map<std::string,double> >::iterator it=m_detParameters.find(set_name);
   if(it!=m_detParameters.end()){
     if(it->second.find(par_name)!=it->second.end()) return it->second[par_name];  
diff --git a/Detector/GeomSvc/src/GeomSvc.h b/Detector/GeomSvc/src/GeomSvc.h
index 20d559a790c47c5f928d8db4a094f97b8cbeded7..379d5b08e4e995a98ebfb49031967d56a6d0c69b 100644
--- a/Detector/GeomSvc/src/GeomSvc.h
+++ b/Detector/GeomSvc/src/GeomSvc.h
@@ -40,7 +40,7 @@ class GeomSvc: public extends<Service, IGeomSvc> {
   const dd4hep::rec::ConicalSupportData* getBeamPipeData() override {return m_beamPipeData;};
 
   const std::map<std::string,double>& getDetParameters(std::string name) override;
-  const double getDetParameter(std::string set_name, std::string par_name) override;
+  double getDetParameter(std::string set_name, std::string par_name) override;
   TMaterial* getMaterial(std::string name);
   
  private:
diff --git a/Detector/Identifier/CMakeLists.txt b/Detector/Identifier/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b2ededab37a089078e47a6e22c7e9bedc711b60b
--- /dev/null
+++ b/Detector/Identifier/CMakeLists.txt
@@ -0,0 +1,11 @@
+################################################################################
+# Package: Identifier
+################################################################################
+
+gaudi_add_header_only_library(Identifier)
+
+install(TARGETS Identifier
+  EXPORT CEPCSWTargets
+  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
+  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
+  COMPONENT dev)
diff --git a/Detector/Identifier/include/Identifier/CEPCConf.h b/Detector/Identifier/include/Identifier/CEPCConf.h
new file mode 100644
index 0000000000000000000000000000000000000000..2dceac7e12193b6aebdbe1f3fbc746dcd5db7093
--- /dev/null
+++ b/Detector/Identifier/include/Identifier/CEPCConf.h
@@ -0,0 +1,49 @@
+/* CEPC conference description ID */
+#ifndef CEPCConf_H
+#define CEPCConf_H
+
+#include <string>
+
+namespace CEPCConf{
+  struct DetID{ // compatible for old codes from Marlin, will convert from compact file, default initial values here
+    static const int NOTUSED = 0;
+    static const int VXD     = 1;
+    static const int SIT     = 2;
+    static const int FTD     = 3;
+    static const int TPC     = 4;
+    static const int SET     = 5;
+    static const int ETD     = 6;
+    static const int DC      = 7; 
+    
+    static const int ECAL        = 20;
+    static const int ECAL_PLUG   = 21;
+    static const int HCAL        = 22;
+    static const int HCAL_RING   = 23;
+    static const int LCAL        = 24;
+    static const int BCAL        = 25;
+    static const int LHCAL       = 26;
+    static const int YOKE        = 27;
+    static const int COIL        = 28;
+    static const int ECAL_ENDCAP = 29;
+    static const int HCAL_ENDCAP = 30;
+    static const int YOKE_ENDCAP = 31;
+    
+    static const int bwd    = -1;
+    static const int barrel =  0;
+    static const int fwd    = +1;
+  };
+  
+  struct TrkHitTypeBit{
+    static const int ONE_DIMENSIONAL      = 29;
+    static const int COMPOSITE_SPACEPOINT = 30;
+    static const int PLANAR               = 3; // 3 is compatible with old tracking codes, 31 or 28 is better in future to modify uniformly
+  };
+  
+  struct TrkHitQualityBit{
+    static const int USED_IN_FIT          = 30;
+    static const int USED_IN_TRACK        = 29;
+    static const int DOUBLE_HIT_CANDIDATE = 28;
+    static const int GOOD                 = 27;
+  };
+}
+#endif
diff --git a/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp b/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp
index 50c742297b177932097ec179d12b07ff37043062..a38826b9d85301ed9e5990145e7a21f9b47b9ef8 100644
--- a/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp
+++ b/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp
@@ -494,8 +494,8 @@ StatusCode G2CDArborAlg::execute()
               // get the DD4hep readout
               m_decoder = m_geosvc->getDecoder(tmp_readout);
               if (!m_decoder) {
-                error() << "Failed to get the decoder. " << endmsg;
-                return StatusCode::FAILURE;
+                error() << "Failed to get the decoder. Skip this collection:"<<m_ecalColNames.value().at(k0)<< endmsg;
+                continue;
               }
           }
 
@@ -618,7 +618,7 @@ StatusCode G2CDArborAlg::execute()
      	  for(auto SimHcalhit: *Hcalcol){
      	  //      SimCalorimeterHit * SimHcalhit = dynamic_cast<SimCalorimeterHit*>( Hcalcol->getElementAt( k4 ) ) ;
 
-     	       cout<<"hcal"<<endl;
+     	       //cout<<"hcal"<<endl;
      	       currTime = 0;
      	       EmaxStep = 0;
      	       HitStepEn = 0;
diff --git a/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp b/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp
index 4a1eda3b4ac450b5ea90653ce102b8036acfc9a0..cdbcbfe22f8fb5288b23fe9ff20626087639e58c 100644
--- a/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp
+++ b/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp
@@ -6,6 +6,7 @@
 #include "DD4hep/Detector.h"
 #include "DD4hep/IDDescriptor.h"
 #include "DD4hep/Plugins.h"
+#include "DD4hep/DD4hepUnits.h"
 
 #include <string>
 #include <iostream>
@@ -56,10 +57,11 @@ StatusCode SimHitMergeAlg::initialize() {
 
 StatusCode SimHitMergeAlg::execute()
 {
-
+     
      for (unsigned int k0 = 0; k0 < m_inputColNames.size(); k0++)
      {
           std::map<unsigned long long, edm4hep::SimCalorimeterHit> id_hit_map;
+          std::map<unsigned long long, std::vector<edm4hep::SimCalorimeterHit> > test_id_hits_map;
           std::map<unsigned long long, std::vector<edm4hep::ConstCaloHitContribution> > id_vconb_map;
 	  edm4hep::SimCalorimeterHitCollection* mergedCol = m_OutputCollections[k0]->createAndPut();
 	  auto col = m_InputCollections[k0]->get();
@@ -67,6 +69,7 @@ StatusCode SimHitMergeAlg::execute()
 	  for (auto Simhit: *col){
               auto id = Simhit.getCellID();
               if(Simhit.getEnergy() <=0 ) continue; 
+              //std::cout<<"DD_sim_hit::ProcessHits, sp x="<<Simhit.getPosition()[0]<<", y="<<Simhit.getPosition()[1]<<", z="<<Simhit.getPosition()[2]<<",edep="<<Simhit.getEnergy()<<std::endl;
               if ( id_hit_map.find(id) != id_hit_map.end()) id_hit_map[id].setEnergy(id_hit_map[id].getEnergy() + Simhit.getEnergy());
               else id_hit_map[id] = Simhit;
               std::vector<edm4hep::ConstCaloHitContribution> tmp_vconb ;
@@ -81,13 +84,37 @@ StatusCode SimHitMergeAlg::execute()
               }
               else id_vconb_map[id] = tmp_vconb;
                   
+              if(m_sanity_check){
+                  test_id_hits_map[id].push_back(Simhit);
+              }
+
+          }
+
+          if(m_sanity_check){
+              for(std::map<unsigned long long, std::vector<edm4hep::SimCalorimeterHit> >::iterator iter = test_id_hits_map.begin(); iter != test_id_hits_map.end(); iter++){
+                  for(unsigned int i=0; i< iter->second.size(); i++){
+                     float pos1_x = iter->second.at(i).getPosition()[0];
+                     float pos1_y = iter->second.at(i).getPosition()[1];
+                     float pos1_z = iter->second.at(i).getPosition()[2];
+                     for(unsigned int j=i+1; j< iter->second.size(); j++){
+                         float pos2_x = iter->second.at(j).getPosition()[0];
+                         float pos2_y = iter->second.at(j).getPosition()[1];
+                         float pos2_z = iter->second.at(j).getPosition()[2];
+                         float dis = sqrt( (pos1_x-pos2_x)*(pos1_x-pos2_x) + (pos1_y-pos2_y)*(pos1_y-pos2_y) + (pos1_z-pos2_z)*(pos1_z-pos2_z) );
+                         if( dis > sqrt(m_cell_x*m_cell_x + m_cell_y*m_cell_y + m_cell_z*m_cell_z) ){
+                             std::cout<<"found id="<<iter->first<<",dis="<<dis<<",x1="<<pos1_x<<",y1="<<pos1_y<<",z1="<<pos1_z<<",x2="<<pos2_x<<",y2="<<pos2_y<<",z2="<<pos2_z<<std::endl;
+                         }
+                     }
+                  }
+              }
           }
-        
+
+
           for(std::map<unsigned long long, edm4hep::SimCalorimeterHit>::iterator iter = id_hit_map.begin(); iter != id_hit_map.end(); iter++)
           {
 	       edm4hep::SimCalorimeterHit Simhit = iter->second ;
                dd4hep::Position position = m_cellIDConverter->position(Simhit.getCellID());//cm
-	       edm4hep::Vector3f hitPos(position.x()*10, position.y()*10, position.z()*10);//to mm
+	       edm4hep::Vector3f hitPos(position.x()/(dd4hep::mm), position.y()/(dd4hep::mm), position.z()/(dd4hep::mm));//to mm
                //std::cout<<"id="<<Simhit.getCellID()<<",hitPos.x="<<hitPos[0]<<",y="<<hitPos[1]<<",z="<<hitPos[2]<<",ori x="<<Simhit.getPosition()[0]<<",y="<<Simhit.getPosition()[1]<<",z="<<Simhit.getPosition()[2]<<std::endl;
 	       auto Mergedhit = mergedCol->create();
 	       Mergedhit.setCellID  (Simhit.getCellID());
diff --git a/Digitisers/SimHitMerge/src/SimHitMergeAlg.h b/Digitisers/SimHitMerge/src/SimHitMergeAlg.h
index d91de40f0a111a99d9c0ca36f2e9177703e8ff96..04b74aa08f60a7d3841676bfbf6e8ed68b6023a1 100644
--- a/Digitisers/SimHitMerge/src/SimHitMergeAlg.h
+++ b/Digitisers/SimHitMerge/src/SimHitMergeAlg.h
@@ -44,6 +44,10 @@ protected:
      Gaudi::Property<std::vector<std::string>> m_outputColNames{this, "OutputCollections", {"ECALBarrel", "ECALEndcap", "ECALOther"}, "Name of merged Hit Collections"};
      std::vector<SimCaloType*> m_InputCollections;
      std::vector<SimCaloType*> m_OutputCollections;
+     Gaudi::Property< bool > m_sanity_check{this, "sanity_check", false, "sanity check"};
+     Gaudi::Property< float > m_cell_x{this, "cell_x", 10, ""};//mm
+     Gaudi::Property< float > m_cell_y{this, "cell_y", 10, ""};//mm
+     Gaudi::Property< float > m_cell_z{this, "cell_z", 10, ""};//mm
 
      SmartIF<IGeomSvc> m_geosvc;
      dd4hep::Detector* m_dd4hep_geo;
diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
index 482082a064e982a0452b93e4a945b5e2d35d13f7..4a5b1f311a48586f0388d67ed9d5d956ab1b0fdc 100644
--- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
+++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
@@ -1,5 +1,6 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 #include "PlanarDigiAlg.h"
+#include "DataHelper/TrackerHitHelper.h"
 #include "GearSvc/IGearSvc.h"
 #include "EventSeeder/IEventSeeder.h"
 #include "TrackSystemSvc/ITrackSystemSvc.h"
@@ -16,7 +17,7 @@
 #include "UTIL/CellIDEncoder.h"
 #include <UTIL/Operators.h>
 */
-
+#include "Identifier/CEPCConf.h"
 #include "UTIL/ILDConf.h"
 
 // STUFF needed for GEAR
@@ -174,7 +175,7 @@ StatusCode PlanarDigiAlg::execute()
     int module = encoder[lcio::ILDCellID0::module];
     int sensor = encoder[lcio::ILDCellID0::sensor];
 
-    debug() << "Hit = "<< i << " has celId " << celId << endmsg;
+    debug() << "Hit = " << i << " has celId " << celId << endmsg;
     debug() << "side = " << side << endmsg;
     debug() << "layerNumber = " <<  layer << endmsg;
     debug() << "moduleNumber = " << module << endmsg;
@@ -307,15 +308,16 @@ StatusCode PlanarDigiAlg::execute()
     debug() << " U[0] = "<< u_direction[0] << " U[1] = "<< u_direction[1]
             << " V[0] = "<< v_direction[0] << " V[1] = "<< v_direction[1]
             << endmsg ;
-    // fucd
-    std::array<float, 6> cov;
-    cov[0] = u_direction[0];
-    cov[1] = u_direction[1];
-    cov[2] = resU;
-    cov[3] = v_direction[0];
-    cov[4] = v_direction[1];
-    cov[5] = resV;
-    trkHit.setCovMatrix(cov);
+    // fucd: next TODO: cov[0] = resU*reU, cov[2] = resV*resV, cov[5] = 0
+    if(_usePlanarTag){
+      std::array<float, 6> cov;
+      cov[0] = u_direction[0];
+      cov[1] = u_direction[1];
+      cov[2] = resU;
+      cov[3] = v_direction[0];
+      cov[4] = v_direction[1];
+      cov[5] = resV;
+      trkHit.setCovMatrix(cov);
     /* zoujh: TODO - generate TrackerHitPlane with podio
     trkHit->setU( u_direction ) ;
     trkHit->setV( v_direction ) ;
@@ -325,11 +327,17 @@ StatusCode PlanarDigiAlg::execute()
     if( _isStrip ) trkHit->setdV( 0 ); // no error in v direction for strip hits as there is no meesurement information in v direction
     else trkHit->setdV( resV ) ;
     */
-    trkHit.setType(8);
-    if( _isStrip || (resU!=0&&resV==0) ){
-      trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ;
+      std::bitset<32> type;
+      type.set(CEPCConf::TrkHitTypeBit::PLANAR);
+      trkHit.setType((int)type.to_ulong());
+    }
+    else{
+      trkHit.setCovMatrix(CEPC::ConvertToCovXYZ(resU, u_direction[0], u_direction[1], resV, v_direction[0], v_direction[1]));
     }
 
+    if( _isStrip || (resU!=0&&resV==0) ){
+        trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ;
+    }
     trkHit.setEDep( SimTHit.getEDep() );
 
     // make the relation
diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
index 668333f29db62fadc13ed8619c212ef0c2ab9d0c..10ddd9dd4bc3216348518ea0df14ebe9cb000684 100644
--- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
+++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
@@ -79,6 +79,9 @@ protected:
   Gaudi::Property<FloatVec> _resV{ this, "ResolutionV", {0.0040} };
   // whether hits are 1D strip hits
   Gaudi::Property<bool> _isStrip{ this, "IsStrip", false };
+  // whether use Planar tag for type and cov, if true, CEPCConf::TrkHitTypeBit::PLANAR bit is set as true
+  // cov[0]=thetaU, cov[1]=phiU, cov[2]=resU, cov[0]=thetaV, cov[1]=phiV, cov[2]=resV
+  Gaudi::Property<bool> _usePlanarTag{ this, "UsePlanarTag", true };
 
   // Input collections
   DataHandle<edm4hep::EventHeaderCollection> _headerCol{"EventHeaderCol", Gaudi::DataHandle::Reader, this};
diff --git a/Examples/options/tut_analysis_TotalInvMass.py b/Examples/options/tut_analysis_TotalInvMass.py
index eb7faebb30a6907790371ff4677735c2ece03b11..3698df526fc1d638dc50ab2e42672e31424a59a3 100644
--- a/Examples/options/tut_analysis_TotalInvMass.py
+++ b/Examples/options/tut_analysis_TotalInvMass.py
@@ -6,8 +6,8 @@ from Configurables import k4DataSvc
 dsvc = k4DataSvc("EventDataSvc")
 
 # read LCIO files
-from Configurables import k4LCIOInput
-lcioinput = k4LCIOInput("k4LCIOInput")
+from Configurables import LCIOInput
+lcioinput = LCIOInput("LCIOInput")
 
 import glob
 
diff --git a/Examples/options/tut_detsim.py b/Examples/options/tut_detsim.py
index 27622a1671527fe2cc78e2844aee201fc47104b8..ededb9965cfeb4b78a928de4633b20d8952f8bbd 100644
--- a/Examples/options/tut_detsim.py
+++ b/Examples/options/tut_detsim.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 import os
-print(os.environ["DD4HEP_LIBRARY_PATH"])
 import sys
 # sys.exit(0)
 
@@ -12,13 +11,15 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
+seed = [42]
+
 # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
 
-# rndmgensvc = RndmGenSvc("RndmGenSvc")
-# rndmgensvc.Engine = rndmengine.name()
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 
 ##############################################################################
@@ -100,6 +101,7 @@ detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 
 detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
 
 # detsimalg.VisMacs = ["vis.mac"]
 
@@ -133,5 +135,5 @@ from Configurables import ApplicationMgr
 ApplicationMgr( TopAlg = [genalg, detsimalg, out],
                 EvtSel = 'NONE',
                 EvtMax = 10,
-                ExtSvc = [rndmengine, dsvc, geosvc],
+                ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc],
 )
diff --git a/Examples/options/tut_detsim_SDT.py b/Examples/options/tut_detsim_SDT.py
index d040cbd404134e03eda3f52604e6dcf3eb3b0e0b..268e317b2a206775ceea32e72b8bd566143b5cd2 100644
--- a/Examples/options/tut_detsim_SDT.py
+++ b/Examples/options/tut_detsim_SDT.py
@@ -1,7 +1,6 @@
 #!/usr/bin/env python
 
 import os
-print(os.environ["DD4HEP_LIBRARY_PATH"])
 import sys
 # sys.exit(0)
 
@@ -12,13 +11,15 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
+seed = [42]
+
 # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
 
-# rndmgensvc = RndmGenSvc("RndmGenSvc")
-# rndmgensvc.Engine = rndmengine.name()
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 
 ##############################################################################
@@ -110,6 +111,7 @@ detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 
 detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
 
 if int(os.environ.get("VIS", 0)):
     detsimalg.VisMacs = ["vis.mac"]
@@ -173,5 +175,5 @@ from Configurables import ApplicationMgr
 ApplicationMgr( TopAlg = [genalg, detsimalg, out],
                 EvtSel = 'NONE',
                 EvtMax = 10,
-                ExtSvc = [rndmengine, dsvc, geosvc],
+                ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc],
 )
diff --git a/Examples/options/tut_detsim_digi_SDT.py b/Examples/options/tut_detsim_digi_SDT.py
index df2f7672f93691a0fb23521e8a589d13d582f770..1dfd75ec1872c0300903afe6d1cdf5fd30318445 100644
--- a/Examples/options/tut_detsim_digi_SDT.py
+++ b/Examples/options/tut_detsim_digi_SDT.py
@@ -12,13 +12,15 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
+seed = [42]
+
 # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
 
-# rndmgensvc = RndmGenSvc("RndmGenSvc")
-# rndmgensvc.Engine = rndmengine.name()
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 
 ##############################################################################
@@ -112,6 +114,7 @@ detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 
 detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
 
 if int(os.environ.get("VIS", 0)):
     detsimalg.VisMacs = ["vis.mac"]
@@ -183,7 +186,7 @@ from Configurables import ApplicationMgr
 ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, out],
                 EvtSel = 'NONE',
                 EvtMax = 10,
-                ExtSvc = [rndmengine, dsvc, geosvc],
+                ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc],
                 HistogramPersistency = "ROOT",
                 OutputLevel=INFO
 )
diff --git a/Examples/options/tut_detsim_digi_fit_DC.py b/Examples/options/tut_detsim_digi_fit_DC.py
index 770bf4267256f540decd991517a4afb37634e57d..aec8695f5714de62ab4413f5ef9fc90d397dde7e 100644
--- a/Examples/options/tut_detsim_digi_fit_DC.py
+++ b/Examples/options/tut_detsim_digi_fit_DC.py
@@ -12,13 +12,15 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
+seed = [42]
+
 # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
 
-# rndmgensvc = RndmGenSvc("RndmGenSvc")
-# rndmgensvc.Engine = rndmengine.name()
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 
 ##############################################################################
@@ -112,6 +114,7 @@ detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 
 detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
 
 if int(os.environ.get("VIS", 0)):
     detsimalg.VisMacs = ["vis.mac"]
@@ -193,7 +196,7 @@ ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, truthTrackerAlg,
                           recGenfitAlgDC,out],
                 EvtSel = 'NONE',
                 EvtMax = 10,
-                ExtSvc = [rndmengine, dsvc, geosvc, ntsvc],
+                ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc, ntsvc],
                 HistogramPersistency = "ROOT",
                 OutputLevel=ERROR
 )
diff --git a/Examples/options/tut_detsim_digi_truthTracker_SDT.py b/Examples/options/tut_detsim_digi_truthTracker_SDT.py
index a5fd439aa790627b439c51e0146b233b5069399a..cbef316570dd61d203d7dfc4885eb5be2af070f0 100644
--- a/Examples/options/tut_detsim_digi_truthTracker_SDT.py
+++ b/Examples/options/tut_detsim_digi_truthTracker_SDT.py
@@ -12,13 +12,15 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
+seed = [42]
+
 # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
 
-# rndmgensvc = RndmGenSvc("RndmGenSvc")
-# rndmgensvc.Engine = rndmengine.name()
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 
 ##############################################################################
@@ -112,6 +114,7 @@ detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 
 detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
 
 if int(os.environ.get("VIS", 0)):
     detsimalg.VisMacs = ["vis.mac"]
@@ -176,7 +179,7 @@ dCHDigiAlg.WriteAna  = True
 from Configurables import TruthTrackerAlg
 truthTrackerAlg = TruthTrackerAlg("TruthTrackerAlg")
 truthTrackerAlg.DCHitAssociationCollection="DCHAssociationCollectio"
-truthTrackerAlg.debug = 1
+# truthTrackerAlg.debug = 1
 
 ##############################################################################
 # POD I/O
@@ -194,7 +197,7 @@ from Configurables import ApplicationMgr
 ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, truthTrackerAlg, out],
                 EvtSel = 'NONE',
                 EvtMax = 10,
-                ExtSvc = [rndmengine, dsvc, geosvc],
+                ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc],
                 HistogramPersistency = "ROOT",
                 OutputLevel=INFO
 )
diff --git a/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py b/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py
index 892572df60aac3d093d145135c7872e4506e9409..84bf326d6d3a887ca7515f6dc3a4cd61e3b65964 100644
--- a/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py
+++ b/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py
@@ -12,13 +12,15 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
+seed = [42]
+
 # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
 
-# rndmgensvc = RndmGenSvc("RndmGenSvc")
-# rndmgensvc.Engine = rndmengine.name()
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 
 ##############################################################################
@@ -113,6 +115,7 @@ detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 
 detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
 #detsimalg.RunMacs = ["Examples/options/noDecay.mac"]
 #detsimalg.RunCmds = ["Examples/options/noDecay.mac"]
 
@@ -216,7 +219,7 @@ from Configurables import ApplicationMgr
 ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, truthTrackerAlg, dedxAlg],
                 EvtSel = 'NONE',
                 EvtMax = 10,
-                ExtSvc = [rndmengine, dsvc, geosvc],
+                ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc],
                 HistogramPersistency = "ROOT",
                 OutputLevel=INFO
 )
diff --git a/Examples/options/tut_detsim_pan_matrix.py b/Examples/options/tut_detsim_pan_matrix.py
index ccc5b3e1cc277f535e3b566181f24f5067d2ada0..7340454f1055e011ad561f40be130acba0acc4f6 100644
--- a/Examples/options/tut_detsim_pan_matrix.py
+++ b/Examples/options/tut_detsim_pan_matrix.py
@@ -11,9 +11,14 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+seed = [42]
+
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
+
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 ##############################################################################
 # Event Data Svc
@@ -87,7 +92,9 @@ from Configurables import DetSimSvc
 detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 detsimalg = DetSimAlg("DetSimAlg")
-detsimalg.VisMacs = ["Examples/options/vis.mac"]
+detsimalg.RandomSeeds = seed
+
+# detsimalg.VisMacs = ["Examples/options/vis.mac"]
 detsimalg.RunCmds = [
 #    "/tracking/verbose 1",
 ]
@@ -173,6 +180,6 @@ ApplicationMgr(
         #TopAlg = [genalg, detsimalg, example_CaloDigiAlg, pandoralg],
         EvtSel = 'NONE',
         EvtMax = 50,
-        ExtSvc = [rndmengine, dsvc, geosvc, gearSvc,detsimsvc],
+        ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc, gearSvc,detsimsvc],
         OutputLevel=INFO
 )
diff --git a/Examples/options/tut_detsim_pandora.py b/Examples/options/tut_detsim_pandora.py
index 2768ea499d7259f85fdf03099d593c82e81ed895..d6be9779536ca104ede45df6114aece9411b5625 100644
--- a/Examples/options/tut_detsim_pandora.py
+++ b/Examples/options/tut_detsim_pandora.py
@@ -11,10 +11,15 @@ from Gaudi.Configuration import *
 ##############################################################################
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 
+seed = [42]
+
 # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi
-rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4
+rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4
 rndmengine.SetSingleton = True
-rndmengine.Seeds = [42]
+rndmengine.Seeds = seed
+
+rndmgensvc = RndmGenSvc("RndmGenSvc")
+rndmgensvc.Engine = rndmengine.name()
 
 ##############################################################################
 # Event Data Svc
@@ -90,6 +95,7 @@ detsimsvc = DetSimSvc("DetSimSvc")
 from Configurables import DetSimAlg
 
 detsimalg = DetSimAlg("DetSimAlg")
+detsimalg.RandomSeeds = seed
 
 # detsimalg.VisMacs = ["vis.mac"]
 
@@ -217,7 +223,7 @@ ApplicationMgr(
         TopAlg = [genalg, detsimalg, simHitMerge, caloDigi, pandoralg, write],
         EvtSel = 'NONE',
         EvtMax = 10,
-        ExtSvc = [rndmengine, dsvc, geosvc, gearSvc,detsimsvc],
+        ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc, gearSvc,detsimsvc],
         HistogramPersistency = "ROOT",
         OutputLevel=INFO
 )
diff --git a/Generator/src/GenEvent.cpp b/Generator/src/GenEvent.cpp
index 3e40c65b8476c83a48e98fc4b596e60d15bcab5f..8d8c254253f641fa3a54be063a1a39e210117179 100644
--- a/Generator/src/GenEvent.cpp
+++ b/Generator/src/GenEvent.cpp
@@ -1,7 +1,7 @@
 #include "GenEvent.h" 
 #include "edm4hep/MCParticleCollection.h"//plico
 
-using namespace std;
+// using namespace std;
 
 namespace MyHepMC{
 
@@ -17,7 +17,7 @@ GenEvent::GenEvent(edm4hep::MCParticleCollection& mcCol)
 }
 GenEvent::~GenEvent(){}
 
-void GenEvent::SetEventHeader(long event_id_, long run_id_, float time_, string det_name_){
+void GenEvent::SetEventHeader(long event_id_, long run_id_, float time_, const std::string& det_name_){
     m_event_id = event_id_;
     m_run_id = run_id_;
     m_time = time_;
@@ -28,8 +28,9 @@ void GenEvent::SetMCCollection(edm4hep::MCParticleCollection vec_){
 m_mc_vec = vec_;
 }
 */
-edm4hep::MCParticleCollection GenEvent::getMCVec(){
-return m_mc_vec;
+
+edm4hep::MCParticleCollection& GenEvent::getMCVec(){
+    return m_mc_vec;
 }
 
 long GenEvent::getID(){
diff --git a/Generator/src/GenEvent.h b/Generator/src/GenEvent.h
index 72895413a5d06438fcffe72495ef56b646921c5c..fd1dbe557e0afac14a3397c53c3978b2c66d7a55 100644
--- a/Generator/src/GenEvent.h
+++ b/Generator/src/GenEvent.h
@@ -10,17 +10,18 @@ class GenEvent{
         //GenEvent();
         GenEvent(edm4hep::MCParticleCollection& mcCol);
         ~GenEvent();
-        void SetEventHeader(long event_id_, long run_id_, float time_, std::string det_name_);
+        void SetEventHeader(long event_id_, long run_id_, float time_, const std::string& det_name_);
         //void SetMCCollection(edm4hep::MCParticleCollection vec_);
         long getID();
         long getRun();
         long getTime();
         void ReSet();
         std::string getName();
-        edm4hep::MCParticleCollection getMCVec();
+        edm4hep::MCParticleCollection& getMCVec();
         edm4hep::MCParticleCollection& m_mc_vec;
         //edm4hep::MCParticleCollection m_mc_vec;
     private:
+
         long m_event_id;
         long m_run_id;
         float m_time;
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h b/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h
index 442a356b05b90fe2dbf8999159e08aa6fac7872a..7a7620155704acc69cabb7f33ddc28b3c382fb77 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h
@@ -97,6 +97,7 @@ private:
      *  @param  subDetectorNameMap the sub detector name map (for smaller sub detectors, identified uniquely only by name)
      */
     void SetAdditionalSubDetectorParameters(SubDetectorNameMap &subDetectorNameMap) const;
+    void SetAdditionalSubDetectorParametersDD(SubDetectorNameMap &subDetectorNameMap) const;
 
     /**
      *  @brief  Set sub detector parameters to their gear default values
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h b/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h
index a74b8a77297e8facbbf6aee29c6916d35c0497c8..6a7a1bacfe9a26b462c645215dcc63370707d35a 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h
@@ -279,6 +279,8 @@ protected:
   NTuple::Array<float> m_mc_charge;
 
 
+  Gaudi::Property<int> m_max_mc {this, "max_mc", 1000,""};
+  Gaudi::Property<int> m_max_rec {this, "max_rec", 1000,""};
 
   
   Gaudi::Property<bool> m_debug {this, "debug", false,"if do debug"};
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h b/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h
index ed30bf2f653d59b6cbff735caafc451943bc293d..aa70ea794f68a872745eb4caada0a8482b4fbefe 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h
@@ -9,7 +9,7 @@
 #include "DD4hep/DetectorSelector.h"
 namespace PanUtil{
     std::string Convert (float number);
-    dd4hep::rec::LayeredCalorimeterData * getExtension(unsigned int includeFlag, unsigned int excludeFlag) ;
+    dd4hep::rec::LayeredCalorimeterData * getExtension(unsigned int includeFlag, unsigned int excludeFlag=0) ;
     void line_a_b(float x1, float y1, float x2, float y2, float& a, float& b);
     float getPhi(float x, float y);
     int partition(float x, float y);
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp
index 7e0836c9330ad81423000b6c6beebd22ee2cb1cd..e3bd6e3c3e9812a2fe75637c9ca3a0782c7b3933 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp
@@ -54,45 +54,155 @@ CaloHitCreator::CaloHitCreator(const Settings &settings, const pandora::Pandora
         if (!sc) throw "Failed to find GeomSvc.";
     }
     if(m_settings.m_use_dd4hep_geo){
-        const dd4hep::rec::LayeredCalorimeterData * eCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL),
-										     ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) );
-        m_eCalBarrelOuterZ        = eCalBarrelExtension->extent[3]/dd4hep::mm;
-        m_eCalBarrelInnerPhi0     = eCalBarrelExtension->inner_phi0/dd4hep::rad;
-        m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry;
+        const dd4hep::rec::LayeredCalorimeterData * eCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) );
+        if(eCalBarrelExtension){ 
+            m_eCalBarrelOuterZ        = eCalBarrelExtension->extent[3]/dd4hep::mm;
+            m_eCalBarrelInnerPhi0     = eCalBarrelExtension->inner_phi0/dd4hep::rad;
+            m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry;
+        }
+        else{
+            /*
+            std::cout<<"CaloHitCreator:WARNING, Can't get ECAL geo info from dd4hep, set it to dummy value. "<<std::endl;
+            m_eCalBarrelOuterZ        = 2400;
+            m_eCalBarrelInnerPhi0     = 0;
+            m_eCalBarrelInnerSymmetry = 8;
+            */
+            std::cout<<"CaloHitCreator:WARNING, Can't get ECAL geo info from dd4hep, get it from Gear. "<<std::endl;
+            m_eCalBarrelOuterZ        = (_GEAR->getEcalBarrelParameters().getExtent()[3]);
+            m_eCalBarrelInnerPhi0     = (_GEAR->getEcalBarrelParameters().getPhi0());
+            m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder());
+        }
+        //Get HCal Barrel extension by type, ignore plugs and rings 
+        const dd4hep::rec::LayeredCalorimeterData * hCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) );
+        //Get HCal Endcap extension by type, ignore plugs and rings 
+        const dd4hep::rec::LayeredCalorimeterData * hCalEndcapExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) );
+        if(hCalBarrelExtension){
+            m_hCalBarrelOuterZ             =   hCalBarrelExtension->extent[3]/dd4hep::mm;
+            m_hCalBarrelInnerPhi0          =   hCalBarrelExtension->inner_phi0/dd4hep::rad;
+            m_hCalBarrelInnerSymmetry      =   hCalBarrelExtension->inner_symmetry;
+            m_hCalBarrelOuterR             =   hCalBarrelExtension->extent[1]/dd4hep::mm;
+            m_hCalBarrelOuterPhi0          =   hCalBarrelExtension->outer_phi0/dd4hep::rad;
+            m_hCalBarrelOuterSymmetry      =   hCalBarrelExtension->outer_symmetry;
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& barrelLayers= hCalBarrelExtension->layers;
+            //Take thicknesses from last layer (was like that before with gear)
+            m_hCalBarrelLayerThickness =(barrelLayers.back().inner_thickness+barrelLayers.back().outer_thickness)/dd4hep::mm;
+        }
+        else{
+            /*
+            std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Barrel geo info from dd4hep, set it to dummy value. "<<std::endl;
+            m_hCalBarrelOuterZ             =   0;
+            m_hCalBarrelInnerPhi0          =   0;
+            m_hCalBarrelInnerSymmetry      =   0;
+            m_hCalBarrelOuterR             =   0;
+            m_hCalBarrelOuterPhi0          =   0;
+            m_hCalBarrelOuterSymmetry      =   0;
+            m_hCalBarrelLayerThickness     =   1;
+            */
+            std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Barrel geo info from dd4hep, get it from Gear"<<std::endl;
+            m_hCalBarrelOuterZ        = (_GEAR->getHcalBarrelParameters().getExtent()[3]);
+            m_hCalBarrelInnerPhi0     = (_GEAR->getHcalBarrelParameters().getPhi0());
+            m_hCalBarrelInnerSymmetry = (_GEAR->getHcalBarrelParameters().getSymmetryOrder());
+            m_hCalBarrelOuterR        = (_GEAR->getHcalBarrelParameters().getExtent()[1]);
+            m_hCalBarrelOuterPhi0     = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(),
+                _GEAR->getHcalBarrelParameters().getIntKeys().end(),
+                "Hcal_outer_polygon_phi0") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ?
+                _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_phi0")
+                : 0));
+            m_hCalBarrelOuterSymmetry = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(),
+                _GEAR->getHcalBarrelParameters().getIntKeys().end(),
+                "Hcal_outer_polygon_order") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ?
+                _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_order")
+                : 0));
+            const gear::LayerLayout &hCalBarrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout()); 
+            m_hCalBarrelLayerThickness = hCalBarrelLayerLayout.getThickness(hCalBarrelLayerLayout.getNLayers() - 1);
+        }
+        if(hCalEndcapExtension){
+            m_hCalEndCapOuterR             =   hCalEndcapExtension->extent[1]/dd4hep::mm;
+            m_hCalEndCapOuterZ             =   hCalEndcapExtension->extent[3]/dd4hep::mm;
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& endcapLayers= hCalEndcapExtension->layers;
+            //Take thicknesses from last layer (was like that before with gear)
+            m_hCalEndCapLayerThickness =(endcapLayers.back().inner_thickness+endcapLayers.back().outer_thickness)/dd4hep::mm;
+        }
+        else{
+            /*
+            std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Endcap geo info from dd4hep, set it to dummy value. "<<std::endl;
+            m_hCalEndCapOuterR             =   0;
+            m_hCalEndCapOuterZ             =   0;
+            m_hCalEndCapLayerThickness     =   1;
+            */
+            std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Endcap geo info from dd4hep, get it from Gear. "<<std::endl;
+            m_hCalEndCapOuterR        = (_GEAR->getHcalEndcapParameters().getExtent()[1]);
+            m_hCalEndCapOuterZ        = (_GEAR->getHcalEndcapParameters().getExtent()[3]);
+            const gear::LayerLayout &hCalEndCapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout());
+            m_hCalEndCapLayerThickness = hCalEndCapLayerLayout.getThickness(hCalEndCapLayerLayout.getNLayers() - 1);
+
+        }
+        //Get Muon Barrel extension by type, ignore plugs and rings 
+        const dd4hep::rec::LayeredCalorimeterData * muonBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) );
+        //fg: muon endcap is not used :
+        //Get Muon Endcap extension by type, ignore plugs and rings 
+        // const dd4hep::rec::LayeredCalorimeterData * muonEndcapExtension= getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY ) );
+        if(muonBarrelExtension){
+            m_muonBarrelOuterZ             =   muonBarrelExtension->extent[3]/dd4hep::mm;
+            m_muonBarrelInnerPhi0          =   muonBarrelExtension->inner_phi0/dd4hep::rad;
+            m_muonBarrelInnerSymmetry      =   muonBarrelExtension->inner_symmetry;
+        }
+        else{
+            /*
+            std::cout<<"CaloHitCreator:WARNING, Can't get Muon Barrel geo info from dd4hep, set it to dummy value. "<<std::endl;
+            m_muonBarrelOuterZ             =   0;
+            m_muonBarrelInnerPhi0          =   0;
+            m_muonBarrelInnerSymmetry      =   0;
+            */
+            std::cout<<"CaloHitCreator:WARNING, Can't get Muon Barrel geo info from dd4hep, get it from Gear. "<<std::endl;
+            m_muonBarrelInnerPhi0     = (_GEAR->getYokeBarrelParameters().getPhi0());
+            m_muonBarrelOuterZ        = (_GEAR->getYokeBarrelParameters().getExtent()[3]);
+            m_muonBarrelInnerSymmetry = (_GEAR->getYokeBarrelParameters().getSymmetryOrder());
+        }
+        //Get COIL extension
+        const dd4hep::rec::LayeredCalorimeterData * coilExtension= PanUtil::getExtension( ( dd4hep::DetType::COIL ) );
+        if(coilExtension){
+            m_coilOuterR                   =   coilExtension->extent[1]/dd4hep::mm;
+        }
+        else{
+            /*
+            std::cout<<"CaloHitCreator:WARNING, Can't get Coil geo info from dd4hep, set it to dummy value. "<<std::endl;
+            m_coilOuterR = 0;
+            */
+            std::cout<<"CaloHitCreator:WARNING, Can't get Coil geo info from dd4hep, get it from Gear. "<<std::endl;
+            m_coilOuterR              = (_GEAR->getGearParameters("CoilParameters").getDoubleVal("Coil_cryostat_outer_radius"));
+        }
     }
     else{
         m_eCalBarrelOuterZ        = (_GEAR->getEcalBarrelParameters().getExtent()[3]);
         m_eCalBarrelInnerPhi0     = (_GEAR->getEcalBarrelParameters().getPhi0());
         m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder());
+        m_hCalBarrelOuterZ        = (_GEAR->getHcalBarrelParameters().getExtent()[3]);
+        m_hCalBarrelInnerPhi0     = (_GEAR->getHcalBarrelParameters().getPhi0());
+        m_hCalBarrelInnerSymmetry = (_GEAR->getHcalBarrelParameters().getSymmetryOrder());
+        m_hCalBarrelOuterR        = (_GEAR->getHcalBarrelParameters().getExtent()[1]);
+        m_hCalBarrelOuterPhi0     = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(),
+            _GEAR->getHcalBarrelParameters().getIntKeys().end(),
+            "Hcal_outer_polygon_phi0") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ?
+            _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_phi0")
+            : 0));
+        m_hCalBarrelOuterSymmetry = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(),
+            _GEAR->getHcalBarrelParameters().getIntKeys().end(),
+            "Hcal_outer_polygon_order") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ?
+            _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_order")
+            : 0));
+        const gear::LayerLayout &hCalBarrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout()); 
+        m_hCalBarrelLayerThickness = hCalBarrelLayerLayout.getThickness(hCalBarrelLayerLayout.getNLayers() - 1);
+        m_hCalEndCapOuterR        = (_GEAR->getHcalEndcapParameters().getExtent()[1]);
+        m_hCalEndCapOuterZ        = (_GEAR->getHcalEndcapParameters().getExtent()[3]);
+        const gear::LayerLayout &hCalEndCapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout());
+        m_hCalEndCapLayerThickness = hCalEndCapLayerLayout.getThickness(hCalEndCapLayerLayout.getNLayers() - 1);
+        m_coilOuterR              = (_GEAR->getGearParameters("CoilParameters").getDoubleVal("Coil_cryostat_outer_radius"));
+        m_muonBarrelInnerPhi0     = (_GEAR->getYokeBarrelParameters().getPhi0());
+        m_muonBarrelOuterZ        = (_GEAR->getYokeBarrelParameters().getExtent()[3]);
+        m_muonBarrelInnerSymmetry = (_GEAR->getYokeBarrelParameters().getSymmetryOrder());
     }
 
-
-    m_hCalBarrelOuterZ        = (_GEAR->getHcalBarrelParameters().getExtent()[3]);
-    m_muonBarrelOuterZ        = (_GEAR->getYokeBarrelParameters().getExtent()[3]);
-    m_coilOuterR              = (_GEAR->getGearParameters("CoilParameters").getDoubleVal("Coil_cryostat_outer_radius"));
-    m_hCalBarrelInnerPhi0     = (_GEAR->getHcalBarrelParameters().getPhi0());
-    m_hCalBarrelInnerSymmetry = (_GEAR->getHcalBarrelParameters().getSymmetryOrder());
-    m_muonBarrelInnerPhi0     = (_GEAR->getYokeBarrelParameters().getPhi0());
-    m_muonBarrelInnerSymmetry = (_GEAR->getYokeBarrelParameters().getSymmetryOrder());
-    m_hCalEndCapOuterR        = (_GEAR->getHcalEndcapParameters().getExtent()[1]);
-    m_hCalEndCapOuterZ        = (_GEAR->getHcalEndcapParameters().getExtent()[3]);
-    m_hCalBarrelOuterR        = (_GEAR->getHcalBarrelParameters().getExtent()[1]);
-    m_hCalBarrelOuterPhi0     =((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(),
-        _GEAR->getHcalBarrelParameters().getIntKeys().end(),
-        "Hcal_outer_polygon_phi0") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ?
-        _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_phi0")
-        : 0));
-    m_hCalBarrelOuterSymmetry = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(),
-        _GEAR->getHcalBarrelParameters().getIntKeys().end(),
-        "Hcal_outer_polygon_order") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ?
-        _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_order")
-        : 0));
-
-
-    const gear::LayerLayout &hCalEndCapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout());
-    const gear::LayerLayout &hCalBarrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout()); 
-    m_hCalEndCapLayerThickness = hCalEndCapLayerLayout.getThickness(hCalEndCapLayerLayout.getNLayers() - 1);
-    m_hCalBarrelLayerThickness = hCalBarrelLayerLayout.getThickness(hCalBarrelLayerLayout.getNLayers() - 1);
     if ((m_hCalEndCapLayerThickness < std::numeric_limits<float>::epsilon()) || (m_hCalBarrelLayerThickness < std::numeric_limits<float>::epsilon()))
         throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
 
@@ -126,7 +236,7 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col
     for (unsigned int k = 0; k < m_settings.m_eCalCaloHitCollections.size(); k++)
     {
         std::string tmp_col_name = m_settings.m_eCalCaloHitCollections.at(k);
-        if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<tmp_col_name<<std::endl; continue;}
+        if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) { if(m_settings.m_debug) std::cout<<"not find "<<tmp_col_name<<std::endl; continue;}
         try
         {
             if(m_settings.m_debug) std::cout<<"CaloHitCreator for "<<tmp_col_name<<std::endl;
@@ -136,8 +246,6 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col
             if (0 == nElements)
                 continue;
 
-            const gear::LayerLayout &endcapLayerLayout(_GEAR->getEcalEndcapParameters().getLayerLayout());
-            const gear::LayerLayout &barrelLayerLayout(_GEAR->getEcalBarrelParameters().getLayerLayout()); 
 
             ID_UTIL::CellIDDecoder<const edm4hep::CalorimeterHit> cellIdDecoder(m_encoder_str);
             const std::string layerCodingString(m_encoder_str);
@@ -150,6 +258,18 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col
                 m_decoder = m_geosvc->getDecoder(name_readout);
                 if (!m_decoder) throw "Failed to get the decoder. ";
             }
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* barrelLayers=nullptr;
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* endcapLayers=nullptr;
+            const gear::LayerLayout* barrelLayerLayout=nullptr;
+            const gear::LayerLayout* endcapLayerLayout=nullptr;
+            if(m_settings.m_use_dd4hep_geo){
+                barrelLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) )->layers);
+                endcapLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) )->layers);
+            }
+            else{
+                barrelLayerLayout = &(_GEAR->getEcalBarrelParameters().getLayerLayout()); 
+                endcapLayerLayout = &(_GEAR->getEcalEndcapParameters().getLayerLayout());
+            }
 
             for (int i = 0; i < nElements; ++i)
             {
@@ -214,27 +334,15 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col
 
                     if (std::fabs(pCaloHit->getPosition()[2]) < m_eCalBarrelOuterZ)
                     {
-                        if(m_settings.m_use_dd4hep_geo){
-                            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& barrelLayers= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) )->layers;
-                            this->GetBarrelCaloHitProperties(pCaloHit, barrelLayers, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0,
-                            Stave, caloHitParameters, absorberCorrection);
-                        }
-                        else{
-                            this->GetBarrelCaloHitProperties(pCaloHit, barrelLayerLayout, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0,
-                            Stave, caloHitParameters, absorberCorrection);
-                        }
-
+                        if(m_settings.m_use_dd4hep_geo) this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayers, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection);
+                        else                            this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayerLayout, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection);
                         caloHitParameters.m_hadronicEnergy = eCalToHadGeVBarrel * pCaloHit->getEnergy();
                     }
                     else
                     {
-                        if(m_settings.m_use_dd4hep_geo){
-                            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& endcapLayers= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) )->layers;
-                            this->GetEndCapCaloHitProperties(pCaloHit, endcapLayers, caloHitParameters, absorberCorrection);
-                        }
-                        else{
-                            this->GetEndCapCaloHitProperties(pCaloHit, endcapLayerLayout, caloHitParameters, absorberCorrection);
-                        }
+                        if(m_settings.m_use_dd4hep_geo) this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayers, caloHitParameters, absorberCorrection);
+                        
+                        else                            this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayerLayout, caloHitParameters, absorberCorrection);
                         caloHitParameters.m_hadronicEnergy = eCalToHadGeVEndCap * pCaloHit->getEnergy();
                     }
 
@@ -280,25 +388,42 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col
 
 pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& collectionMaps)
 {
-    for (StringVector::const_iterator iter = m_settings.m_hCalCaloHitCollections.begin(), iterEnd = m_settings.m_hCalCaloHitCollections.end();
-        iter != iterEnd; ++iter)
+    for (unsigned int k = 0; k < m_settings.m_hCalCaloHitCollections.size(); k++)
     {
-        if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;}
+        std::string tmp_col_name = m_settings.m_hCalCaloHitCollections.at(k);
+        if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) { if(m_settings.m_debug) std::cout<<"not find "<<tmp_col_name<<std::endl; continue;}
         try
         {
-            const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second;
+            const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(tmp_col_name))->second;
             const int nElements(pCaloHitCollection.size());
 
             if (0 == nElements)
                 continue;
 
-            const gear::LayerLayout &endcapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout());
-            const gear::LayerLayout &barrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout());
 
             ID_UTIL::CellIDDecoder<const edm4hep::CalorimeterHit> cellIdDecoder(m_encoder_str);
             const std::string layerCodingString(m_encoder_str);
             const std::string layerCoding(this->GetLayerCoding(layerCodingString));
             const std::string staveCoding(this->GetStaveCoding(layerCodingString));
+            // get the DD4hep readout
+            const std::string name_readout = m_settings.m_hCalCaloReadOuts.at(k);
+            if(m_settings.m_debug) std::cout<<"readout= "<<name_readout<<std::endl;
+            if( m_settings.m_use_dd4hep_decoder ){
+                m_decoder = m_geosvc->getDecoder(name_readout);
+                if (!m_decoder) throw "Failed to get the decoder. ";
+            }
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* barrelLayers=nullptr;
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* endcapLayers=nullptr;
+            const gear::LayerLayout* barrelLayerLayout=nullptr;
+            const gear::LayerLayout* endcapLayerLayout=nullptr;
+            if(m_settings.m_use_dd4hep_geo){
+                barrelLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) )->layers);
+                endcapLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) )->layers);
+            }
+            else{
+                barrelLayerLayout = &(_GEAR->getHcalBarrelParameters().getLayerLayout());
+                endcapLayerLayout = &(_GEAR->getHcalEndcapParameters().getLayerLayout());
+            }
 
             for (int i = 0; i < nElements; ++i)
             {
@@ -313,20 +438,43 @@ pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& col
                     PandoraApi::CaloHit::Parameters caloHitParameters;
                     caloHitParameters.m_hitType = pandora::HCAL;
                     caloHitParameters.m_isDigital = false;// if it is DHCAL or AHCAL
-                    caloHitParameters.m_layer = cellIdDecoder(pCaloHit)[layerCoding.c_str()];
+                    caloHitParameters.m_layer = m_settings.m_use_dd4hep_decoder == false ? cellIdDecoder(pCaloHit)[layerCoding.c_str()]+1 : m_decoder->get(pCaloHit->getCellID(), "layer");//from 1 to 40
+                    //std::cout<<"HCAL layer="<<caloHitParameters.m_layer.Get()<<std::endl;
                     caloHitParameters.m_isInOuterSamplingLayer = (this->GetNLayersFromEdge(pCaloHit) <= m_settings.m_nOuterSamplingLayers);
                     this->GetCommonCaloHitProperties(pCaloHit, caloHitParameters);
+                    int Stave = 0 ; 
+                    if (m_settings.m_use_dd4hep_decoder == false){
+                        Stave = cellIdDecoder(pCaloHit)[ staveCoding];
+                    }
+                    else{
+                        Stave = m_decoder->get(pCaloHit->getCellID(), "stave");
+                        Stave = Stave ==0 ? Stave+7 : Stave-1 ;//correct, same with LCIO  
+                        /*
+                                    1                     0
+                                   ****                  ****
+                                2 *    * 0            1 *    * 7
+                                 *      *              *      *
+                                3*      * 7  --->     2*      * 6    
+                                 *      *              *      *
+                                4 *    * 6            3 *    * 5 
+                                   ****                  ****  
+                                    5                     4
+                            
+                            
+                        */
+                    }
 
                     float absorberCorrection(1.);
 
                     if (std::fabs(pCaloHit->getPosition()[2]) < m_hCalBarrelOuterZ)
                     {
-                        this->GetBarrelCaloHitProperties(pCaloHit, barrelLayerLayout, m_hCalBarrelInnerSymmetry, m_hCalBarrelInnerPhi0,
-                            m_hCalBarrelInnerSymmetry - int(cellIdDecoder(pCaloHit)[ staveCoding] / 2), caloHitParameters, absorberCorrection);
+                        if(m_settings.m_use_dd4hep_geo) this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayers, m_hCalBarrelInnerSymmetry, m_hCalBarrelInnerPhi0, m_hCalBarrelInnerSymmetry - int(Stave / 2), caloHitParameters, absorberCorrection);
+                        else                            this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayerLayout, m_hCalBarrelInnerSymmetry, m_hCalBarrelInnerPhi0, m_hCalBarrelInnerSymmetry - int(Stave / 2), caloHitParameters, absorberCorrection);
                     }
                     else
                     {
-                        this->GetEndCapCaloHitProperties(pCaloHit, endcapLayerLayout, caloHitParameters, absorberCorrection);
+                        if(m_settings.m_use_dd4hep_geo)   this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayers, caloHitParameters, absorberCorrection);
+                        else                              this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayerLayout, caloHitParameters, absorberCorrection);
                     }
 
                     //caloHitParameters.m_mipEquivalentEnergy = pCaloHit->getEnergy() * m_settings.m_hCalToMip * absorberCorrection;
@@ -353,7 +501,7 @@ pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& col
         }
         catch (...)
         {
-            std::cout << "Failed to extract hcal calo hit collection: " << *iter << std::endl;
+            std::cout << "Failed to extract hcal calo hit collection: " << tmp_col_name << std::endl;
         }
     }
 
@@ -364,26 +512,44 @@ pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& col
 
 pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& collectionMaps)
 {
-    for (StringVector::const_iterator iter = m_settings.m_muonCaloHitCollections.begin(), iterEnd = m_settings.m_muonCaloHitCollections.end();
-        iter != iterEnd; ++iter)
+    for (unsigned int k = 0; k < m_settings.m_muonCaloHitCollections.size(); k++)
     {
-        if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;}
+        std::string tmp_col_name = m_settings.m_muonCaloHitCollections.at(k);
+        if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) {if(m_settings.m_debug) std::cout<<"not find "<<tmp_col_name<<std::endl; continue;}
         try
         {
-            const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second;
+            const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(tmp_col_name))->second;
             const int nElements(pCaloHitCollection.size());
 
             if (0 == nElements)
                 continue;
 
-            const gear::LayerLayout &endcapLayerLayout(_GEAR->getYokeEndcapParameters().getLayerLayout());
-            const gear::LayerLayout &barrelLayerLayout(_GEAR->getYokeBarrelParameters().getLayerLayout()); 
-            const gear::LayerLayout &plugLayerLayout(_GEAR->getYokePlugParameters().getLayerLayout());
 
             ID_UTIL::CellIDDecoder<const edm4hep::CalorimeterHit> cellIdDecoder(m_encoder_str_MUON);
             const std::string layerCodingString(m_encoder_str_MUON);
             const std::string layerCoding(this->GetLayerCoding(layerCodingString));
             const std::string staveCoding(this->GetStaveCoding(layerCodingString));
+            // get the DD4hep readout
+            const std::string name_readout = m_settings.m_muonCalCaloReadOuts.at(k);
+            if(m_settings.m_debug) std::cout<<"readout= "<<name_readout<<std::endl;
+            if( m_settings.m_use_dd4hep_decoder ){
+                m_decoder = m_geosvc->getDecoder(name_readout);
+                if (!m_decoder) throw "Failed to get the decoder. ";
+            }
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* barrelLayers=nullptr;
+            const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* endcapLayers=nullptr;
+            const gear::LayerLayout* barrelLayerLayout=nullptr;
+            const gear::LayerLayout* plugLayerLayout=nullptr;
+            const gear::LayerLayout* endcapLayerLayout=nullptr;
+            if(m_settings.m_use_dd4hep_geo){
+                barrelLayers= &(PanUtil::getExtension(( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON| dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD  ))->layers);
+                endcapLayers = &(PanUtil::getExtension(( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON| dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD  ))->layers);
+            }
+            else{
+                plugLayerLayout= &(_GEAR->getYokePlugParameters().getLayerLayout());
+                barrelLayerLayout = &(_GEAR->getYokeBarrelParameters().getLayerLayout()); 
+                endcapLayerLayout = &(_GEAR->getYokeEndcapParameters().getLayerLayout());
+            }
 
             for (int i = 0; i < nElements; ++i)
             {
@@ -397,9 +563,28 @@ pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& col
 
                     PandoraApi::CaloHit::Parameters caloHitParameters;
                     caloHitParameters.m_hitType = pandora::MUON;
-                    caloHitParameters.m_layer = cellIdDecoder(pCaloHit)[layerCoding.c_str()] + 1;
+                    caloHitParameters.m_layer = m_settings.m_use_dd4hep_decoder == false ? cellIdDecoder(pCaloHit)[layerCoding.c_str()] + 1 : m_decoder->get(pCaloHit->getCellID(), "layer");
+                    //std::cout<<"Muon layer="<<caloHitParameters.m_layer.Get()<<std::endl;
                     caloHitParameters.m_isInOuterSamplingLayer = true;
                     this->GetCommonCaloHitProperties(pCaloHit, caloHitParameters);
+                    int Stave = 0 ; 
+                    if (m_settings.m_use_dd4hep_decoder == false){
+                        Stave = cellIdDecoder(pCaloHit)[ staveCoding];
+                        /*
+                        float tmp_x = pCaloHit->getPosition()[0];
+                        float tmp_y = pCaloHit->getPosition()[1];
+                        float tmp_z = pCaloHit->getPosition()[2];
+                        float tmp_phi = atan(tmp_y/tmp_x)*180/acos(-1);
+                        if(tmp_x<0) tmp_phi += 180;
+                        if(tmp_x>0 && tmp_y<0) tmp_phi += 360;
+                        if(abs(tmp_z) < 2000 )std::cout<<"Muon ILC Stave="<<Stave<<",phi="<<tmp_phi<<std::endl;
+                        */
+                    }
+                    else{
+                        Stave = m_decoder->get(pCaloHit->getCellID(), "stave");
+                        Stave = 12 - Stave ;//correct to be same with LCIO
+                        if(Stave<0) throw("throw wrong stave number?");
+                    }
 
                     const float radius(std::sqrt(pCaloHit->getPosition()[0] * pCaloHit->getPosition()[0] +
                         pCaloHit->getPosition()[1] * pCaloHit->getPosition()[1]));
@@ -411,16 +596,17 @@ pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& col
 
                     if (isInBarrelRegion && isWithinCoil)
                     {
-                        this->GetEndCapCaloHitProperties(pCaloHit, plugLayerLayout, caloHitParameters, absorberCorrection);
+                        if(m_settings.m_use_dd4hep_geo) std::cout<<"BIG WARNING: CANNOT HANDLE PLUG HITS (no plug), DO NOTHING!"<<std::endl;
+                        else                            this->GetEndCapCaloHitProperties(pCaloHit, *plugLayerLayout, caloHitParameters, absorberCorrection);
                     }
                     else if (isInBarrelRegion)
-                    {
-                        this->GetBarrelCaloHitProperties(pCaloHit, barrelLayerLayout, m_muonBarrelInnerSymmetry, m_muonBarrelInnerPhi0,
-                            cellIdDecoder(pCaloHit)[ staveCoding ], caloHitParameters, absorberCorrection);
+                    {   if(m_settings.m_use_dd4hep_geo) this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayers     , m_muonBarrelInnerSymmetry, m_muonBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection);
+                        else                            this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayerLayout, m_muonBarrelInnerSymmetry, m_muonBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection);
                     }
                     else
                     {
-                        this->GetEndCapCaloHitProperties(pCaloHit, endcapLayerLayout, caloHitParameters, absorberCorrection);
+                        if(m_settings.m_use_dd4hep_geo) this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayers     , caloHitParameters, absorberCorrection);
+                        else                            this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayerLayout, caloHitParameters, absorberCorrection);
                     }
 
                     if (m_settings.m_muonDigitalHits > 0)
@@ -455,7 +641,7 @@ pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& col
         }
         catch (...)
         {
-            std::cout << "Failed to extract muon hit collection: " << *iter  << std::endl;
+            std::cout << "Failed to extract muon hit collection: " << tmp_col_name  << std::endl;
         }
     }
 
@@ -469,7 +655,7 @@ pandora::StatusCode CaloHitCreator::CreateLCalCaloHits(const CollectionMaps& col
     for (StringVector::const_iterator iter = m_settings.m_lCalCaloHitCollections.begin(), iterEnd = m_settings.m_lCalCaloHitCollections.end();
         iter != iterEnd; ++iter)
     {
-        if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;}
+        if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) {if(m_settings.m_debug)std::cout<<"not find "<<(*iter)<<std::endl; continue;}
         try
         {
             const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second;
@@ -542,7 +728,7 @@ pandora::StatusCode CaloHitCreator::CreateLHCalCaloHits(const CollectionMaps& co
     for (StringVector::const_iterator iter = m_settings.m_lHCalCaloHitCollections.begin(), iterEnd = m_settings.m_lHCalCaloHitCollections.end();
         iter != iterEnd; ++iter)
     {
-        if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;}
+        if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) {if(m_settings.m_debug) std::cout<<"not find "<<(*iter)<<std::endl; continue;}
         try
         {
             const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second;
@@ -793,7 +979,7 @@ void CaloHitCreator::GetBarrelCaloHitProperties(const edm4hep::CalorimeterHit *c
     const int physicalLayer(std::min(static_cast<int>(caloHitParameters.m_layer.Get()), static_cast<int>(layers.size()-1)));
     caloHitParameters.m_cellSize0 = layers[physicalLayer].cellSize0/dd4hep::mm;
     caloHitParameters.m_cellSize1 = layers[physicalLayer].cellSize1/dd4hep::mm;
-    //std::cout<<"DD m_cellSize0="<<caloHitParameters.m_cellSize0.Get()<<",m_cellSize1="<<caloHitParameters.m_cellSize1.Get()<<std::endl;
+    if(m_settings.m_debug) std::cout<<"DD m_cellSize0="<<caloHitParameters.m_cellSize0.Get()<<",m_cellSize1="<<caloHitParameters.m_cellSize1.Get()<<std::endl;
     double thickness = (layers[physicalLayer].inner_thickness+layers[physicalLayer].sensitive_thickness/2.0)/dd4hep::mm;
     double nRadLengths = layers[physicalLayer].inner_nRadiationLengths;
     double nIntLengths = layers[physicalLayer].inner_nInteractionLengths;
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp
index 7a9a74cfe3ce2de993ba4c6a68a48bf00ab2ba00..a69feb3682b4671978392f57196c98410d562360 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp
@@ -16,6 +16,7 @@
 #include "GeometryCreator.h"
 #include "Utility.h"
 
+
 GeometryCreator::GeometryCreator(const Settings &settings, const pandora::Pandora *const pPandora) :
     m_settings(settings),
     m_pPandora(pPandora)
@@ -47,7 +48,8 @@ pandora::StatusCode GeometryCreator::CreateGeometry(ISvcLocator* svcloc)
         this->SetMandatorySubDetectorParameters(subDetectorTypeMap);
 
         SubDetectorNameMap subDetectorNameMap;
-        this->SetAdditionalSubDetectorParameters(subDetectorNameMap);
+        if(m_settings.m_use_dd4hep_geo) this->SetAdditionalSubDetectorParametersDD(subDetectorNameMap);
+        else                            this->SetAdditionalSubDetectorParameters  (subDetectorNameMap);
         
         if (std::string::npos != _GEAR->getDetectorName().find("ILD"))
             this->SetILDSpecificGeometry(subDetectorTypeMap, subDetectorNameMap);
@@ -71,23 +73,62 @@ pandora::StatusCode GeometryCreator::CreateGeometry(ISvcLocator* svcloc)
 
 void GeometryCreator::SetMandatorySubDetectorParameters(SubDetectorTypeMap &subDetectorTypeMap) const
 {
-    std::cout << "Begin SetMandatorySubDetectorParameters:" << std::endl;
-    PandoraApi::Geometry::SubDetector::Parameters eCalBarrelParameters, eCalEndCapParameters, hCalBarrelParameters, hCalEndCapParameters,
-        muonBarrelParameters, muonEndCapParameters;
+    std::cout << "GeometryCreator SetMandatorySubDetectorParameters:" << std::endl;
+    PandoraApi::Geometry::SubDetector::Parameters eCalBarrelParameters, eCalEndCapParameters, hCalBarrelParameters, hCalEndCapParameters, muonBarrelParameters, muonEndCapParameters;
+
     if(m_settings.m_use_dd4hep_geo){
-        std::cout << "Use dd4hep geo info for ECAL" << std::endl;
-        this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) )), "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters);
-        this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) )), "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters);
+        std::cout << "Use dd4hep geo info for ECAL, HCAL and Muon" << std::endl;
+        dd4hep::rec::LayeredCalorimeterData* layer_ecal_barrel = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) ) );
+        if(layer_ecal_barrel) this->SetDefaultSubDetectorParameters(*layer_ecal_barrel, "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters);
+        else{
+            std::cout << "GeometryCreator:Do not find ECAL Barrel geo info from dd4hep, Try to get it from Gear" << std::endl;
+            this->SetDefaultSubDetectorParameters(_GEAR->getEcalBarrelParameters(), "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters);
+        }
+
+        dd4hep::rec::LayeredCalorimeterData* layer_ecal_endcap = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) ) );
+        if(layer_ecal_endcap) this->SetDefaultSubDetectorParameters(*layer_ecal_endcap, "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters);
+        else{ 
+            std::cout << "GeometryCreator:Do not find ECAL Endcap geo info from dd4hep, Try to get it from Gear" << std::endl;
+            this->SetDefaultSubDetectorParameters(_GEAR->getEcalEndcapParameters(), "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters);
+        }
+
+        dd4hep::rec::LayeredCalorimeterData* layer_hcal_barrel = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) ) );
+        if(layer_hcal_barrel) this->SetDefaultSubDetectorParameters(*layer_hcal_barrel, "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters);
+        else{
+            std::cout << "GeometryCreator:Do not find HCAL Barrel geo info from dd4hep, Try to get it from Gear" << std::endl;
+            this->SetDefaultSubDetectorParameters(_GEAR->getHcalBarrelParameters(), "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters);
+        }
+
+        dd4hep::rec::LayeredCalorimeterData* layer_hcal_endcap = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) ) );
+        if(layer_hcal_endcap) this->SetDefaultSubDetectorParameters(*layer_hcal_endcap, "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters);
+        else{
+            std::cout << "GeometryCreator:Do not find HCAL Endcap geo info from dd4hep, Try to get it from Gear" << std::endl;
+            this->SetDefaultSubDetectorParameters(_GEAR->getHcalEndcapParameters(), "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters);
+        }
+
+        dd4hep::rec::LayeredCalorimeterData * layer_muon_barrel = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) ) );
+        if(layer_muon_barrel) this->SetDefaultSubDetectorParameters(*layer_muon_barrel, "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters);
+        else{ 
+            std::cout << "GeometryCreator:Do not find Muon Barrel geo info from dd4hep, Try to get it from Gear" << std::endl;
+            this->SetDefaultSubDetectorParameters(_GEAR->getYokeBarrelParameters(), "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters);
+        }
+
+        dd4hep::rec::LayeredCalorimeterData* layer_muon_endcap = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY ) ) );
+        if(layer_muon_endcap) this->SetDefaultSubDetectorParameters(*layer_muon_endcap, "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters);
+        else{ 
+            std::cout << "GeometryCreator:Do not find Muon Endcap geo info from dd4hep, Try to get it from Gear" << std::endl;
+            this->SetDefaultSubDetectorParameters(_GEAR->getYokeEndcapParameters(), "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters);
+        }
     }
     else{
         this->SetDefaultSubDetectorParameters(_GEAR->getEcalBarrelParameters(), "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters);
         this->SetDefaultSubDetectorParameters(_GEAR->getEcalEndcapParameters(), "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters);
+        this->SetDefaultSubDetectorParameters(_GEAR->getHcalBarrelParameters(), "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters);
+        this->SetDefaultSubDetectorParameters(_GEAR->getHcalEndcapParameters(), "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters);
+        this->SetDefaultSubDetectorParameters(_GEAR->getYokeBarrelParameters(), "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters);
+        this->SetDefaultSubDetectorParameters(_GEAR->getYokeEndcapParameters(), "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters);
     }
 
-    this->SetDefaultSubDetectorParameters(_GEAR->getHcalBarrelParameters(), "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters);
-    this->SetDefaultSubDetectorParameters(_GEAR->getHcalEndcapParameters(), "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters);
-    this->SetDefaultSubDetectorParameters(_GEAR->getYokeBarrelParameters(), "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters);
-    this->SetDefaultSubDetectorParameters(_GEAR->getYokeEndcapParameters(), "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters);
 
     subDetectorTypeMap[pandora::ECAL_BARREL] = eCalBarrelParameters;
     subDetectorTypeMap[pandora::ECAL_ENDCAP] = eCalEndCapParameters;
@@ -141,10 +182,67 @@ void GeometryCreator::SetMandatorySubDetectorParameters(SubDetectorTypeMap &subD
 }
 
 //------------------------------------------------------------------------------------------------------------------------------------------
+void GeometryCreator::SetAdditionalSubDetectorParametersDD(SubDetectorNameMap &subDetectorNameMap) const
+{
+    
+  dd4hep::Detector & mainDetector = dd4hep::Detector::getInstance();
+  const std::vector< dd4hep::DetElement>& theECalOtherDetectors = dd4hep::DetectorSelector(mainDetector).detectors(dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::AUXILIARY ) ;
+  for (std::vector< dd4hep::DetElement>::const_iterator iter = theECalOtherDetectors.begin(), iterEnd = theECalOtherDetectors.end();iter != iterEnd; ++iter){
+    try
+    {
+        const dd4hep::DetElement& theDetector = *iter;
+        const dd4hep::rec::LayeredCalorimeterData * theExtension = theDetector.extension<dd4hep::rec::LayeredCalorimeterData>();
+
+        PandoraApi::Geometry::SubDetector::Parameters parameters;
+        this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(theExtension),theDetector.name(), pandora::SUB_DETECTOR_OTHER, parameters);
+        subDetectorNameMap[parameters.m_subDetectorName.Get()] = parameters;
+    }
+    catch (std::runtime_error &exception)
+    {
+        std::cout << "pandora geometry creator during Other ECal construction: " << exception.what() << std::endl;
+    }
+  }
+  
+  const std::vector< dd4hep::DetElement>& theHCalOtherDetectors = dd4hep::DetectorSelector(mainDetector).detectors(dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::AUXILIARY ) ;
+  for (std::vector< dd4hep::DetElement>::const_iterator iter = theHCalOtherDetectors.begin(), iterEnd = theHCalOtherDetectors.end();iter != iterEnd; ++iter){
+    try
+    {
+        const dd4hep::DetElement& theDetector = *iter;
+        const dd4hep::rec::LayeredCalorimeterData * theExtension = theDetector.extension<dd4hep::rec::LayeredCalorimeterData>();
+
+        PandoraApi::Geometry::SubDetector::Parameters parameters;
+        this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(theExtension),theDetector.name(), pandora::SUB_DETECTOR_OTHER, parameters);
+        subDetectorNameMap[parameters.m_subDetectorName.Get()] = parameters;
+    }
+    catch (std::runtime_error &exception)
+    {
+        std::cout << "pandora geometry creator during Other HCal construction: " << exception.what() << std::endl;
+    }
+  }
+  
+  const std::vector< dd4hep::DetElement>& theMuonOtherDetectors = dd4hep::DetectorSelector(mainDetector).detectors(dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON| dd4hep::DetType::AUXILIARY ) ;
+  for (std::vector< dd4hep::DetElement>::const_iterator iter = theMuonOtherDetectors.begin(), iterEnd = theMuonOtherDetectors.end();iter != iterEnd; ++iter){
+    try
+    {
+        const dd4hep::DetElement& theDetector = *iter;
+        const dd4hep::rec::LayeredCalorimeterData * theExtension = theDetector.extension<dd4hep::rec::LayeredCalorimeterData>();
+
+        PandoraApi::Geometry::SubDetector::Parameters parameters;
+        this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(theExtension),theDetector.name(), pandora::SUB_DETECTOR_OTHER, parameters);
+        subDetectorNameMap[parameters.m_subDetectorName.Get()] = parameters;
+    }
+    catch (std::runtime_error &exception)
+    {
+        std::cout << "pandora geometry creator during Other Muon construction: " << exception.what() << std::endl;
+    }
+  }
+
+}
+
 
 void GeometryCreator::SetAdditionalSubDetectorParameters(SubDetectorNameMap &subDetectorNameMap) const
 {
-    std::cout << "Begin SetAdditionalSubDetectorParameters:" << std::endl;
+    std::cout << "SetAdditionalSubDetectorParameters:" << std::endl;
     try
     {
         PandoraApi::Geometry::SubDetector::Parameters parameters;
@@ -164,7 +262,7 @@ void GeometryCreator::SetAdditionalSubDetectorParameters(SubDetectorNameMap &sub
     }
     catch (gear::Exception &exception)
     {
-         std::cout<< "warning pandora geometry creator: " << exception.what() << std::endl;
+         std::cout << "warning pandora geometry creator: " << exception.what() << std::endl;
     }
 
     try
@@ -192,7 +290,29 @@ void GeometryCreator::SetAdditionalSubDetectorParameters(SubDetectorNameMap &sub
 }
 
 //------------------------------------------------------------------------------------------------------------------------------------------
+/*
+void GeometryCreator::SetDummySubDetectorParameters(const std::map<std::string, float>& para_map, const std::string &subDetectorName,
+    const pandora::SubDetectorType subDetectorType, PandoraApi::Geometry::SubDetector::Parameters &parameters) const
+{
+    parameters.m_subDetectorName = subDetectorName;
+    parameters.m_subDetectorType = subDetectorType;
+    parameters.m_innerRCoordinate = para_map["innerRCoordinate"];
+    parameters.m_innerZCoordinate = para_map["innerZCoordinate"];
+    parameters.m_innerPhiCoordinate = para_map["innerPhiCoordinate"];
+    parameters.m_innerSymmetryOrder = para_map["innerSymmetryOrder"];
+    parameters.m_outerRCoordinate = para_map["outerRCoordinate"];
+    parameters.m_outerZCoordinate = para_map["outerZCoordinate"];
+    parameters.m_outerPhiCoordinate = para_map["outerPhiCoordinate"];
+    parameters.m_outerSymmetryOrder = para_map["outerSymmetryOrder"];
+    parameters.m_isMirroredInZ = true;
 
+    PandoraApi::Geometry::LayerParameters layerParameters;
+    layerParameters.m_closestDistanceToIp = para_map["closestDistanceToIp"];
+    layerParameters.m_nRadiationLengths = 1;
+    layerParameters.m_nInteractionLengths = 1;
+    parameters.m_layerParametersVector.push_back(layerParameters);
+}
+*/
 void GeometryCreator::SetDefaultSubDetectorParameters(const gear::CalorimeterParameters &inputParameters, const std::string &subDetectorName,
     const pandora::SubDetectorType subDetectorType, PandoraApi::Geometry::SubDetector::Parameters &parameters) const
 {
@@ -211,6 +331,7 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const gear::CalorimeterPar
     parameters.m_isMirroredInZ = true;
     parameters.m_nLayers = layerLayout.getNLayers();
 
+    std::cout <<"Gear m_subDetectorName="<<subDetectorName<<",m_subDetectorType="<<subDetectorType<<",m_innerRCoordinate="<<parameters.m_innerRCoordinate.Get()<<",m_innerZCoordinate="<<parameters.m_innerZCoordinate.Get()<<",m_innerPhiCoordinate="<<parameters.m_innerPhiCoordinate.Get()<<",m_innerSymmetryOrder="<<parameters.m_innerSymmetryOrder.Get()<<",m_outerRCoordinate="<<parameters.m_outerRCoordinate.Get()<<",m_outerZCoordinate="<<parameters.m_outerZCoordinate.Get()<<",m_outerPhiCoordinate="<<parameters.m_outerPhiCoordinate.Get()<<",m_outerSymmetryOrder="<<parameters.m_outerSymmetryOrder.Get()<<",m_nLayers="<<parameters.m_nLayers.Get()<<std::endl;
     // ATTN Not always going to be correct for any optional subdetectors, but impact of this is negligible for ILD
     const float radiationLength(((pandora::ECAL_BARREL == subDetectorType) || (pandora::ECAL_ENDCAP == subDetectorType)) ? m_settings.m_absorberRadLengthECal :
         ((pandora::HCAL_BARREL == subDetectorType) || (pandora::HCAL_ENDCAP == subDetectorType)) ? m_settings.m_absorberRadLengthHCal : m_settings.m_absorberRadLengthOther);
@@ -224,6 +345,7 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const gear::CalorimeterPar
         layerParameters.m_nRadiationLengths = radiationLength * layerLayout.getAbsorberThickness(i);
         layerParameters.m_nInteractionLengths = interactionLength * layerLayout.getAbsorberThickness(i);
         parameters.m_layerParametersVector.push_back(layerParameters);
+        std::cout <<"layer="<<i<<",m_closestDistanceToIp="<<layerParameters.m_closestDistanceToIp.Get()<<",m_nRadiationLengths="<<layerParameters.m_nRadiationLengths.Get()<<",m_nInteractionLengths="<<layerParameters.m_nInteractionLengths.Get()<<std::endl;
     }
 }
 
@@ -244,7 +366,7 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const dd4hep::rec::Layered
     parameters.m_isMirroredInZ = true;
     parameters.m_nLayers = layers.size();
 
-    std::cout<<"DD m_subDetectorName="<<subDetectorName<<",m_subDetectorType="<<subDetectorType<<",m_innerRCoordinate="<<parameters.m_innerRCoordinate.Get()<<",m_innerZCoordinate="<<parameters.m_innerZCoordinate.Get()<<",m_innerPhiCoordinate="<<parameters.m_innerPhiCoordinate.Get()<<",m_innerSymmetryOrder="<<parameters.m_innerSymmetryOrder.Get()<<",m_outerRCoordinate="<<parameters.m_outerRCoordinate.Get()<<",m_outerZCoordinate="<<parameters.m_outerZCoordinate.Get()<<",m_outerPhiCoordinate="<<parameters.m_outerPhiCoordinate.Get()<<",m_outerSymmetryOrder="<<parameters.m_outerSymmetryOrder.Get()<<",m_nLayers="<<parameters.m_nLayers.Get()<<std::endl;
+    std::cout <<"DD m_subDetectorName="<<subDetectorName<<",m_subDetectorType="<<subDetectorType<<",m_innerRCoordinate="<<parameters.m_innerRCoordinate.Get()<<",m_innerZCoordinate="<<parameters.m_innerZCoordinate.Get()<<",m_innerPhiCoordinate="<<parameters.m_innerPhiCoordinate.Get()<<",m_innerSymmetryOrder="<<parameters.m_innerSymmetryOrder.Get()<<",m_outerRCoordinate="<<parameters.m_outerRCoordinate.Get()<<",m_outerZCoordinate="<<parameters.m_outerZCoordinate.Get()<<",m_outerPhiCoordinate="<<parameters.m_outerPhiCoordinate.Get()<<",m_outerSymmetryOrder="<<parameters.m_outerSymmetryOrder.Get()<<",m_nLayers="<<parameters.m_nLayers.Get()<<std::endl;
     for (size_t i = 0; i< layers.size(); i++)
     {
         const dd4hep::rec::LayeredCalorimeterStruct::Layer & theLayer = layers.at(i);
@@ -260,13 +382,13 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const dd4hep::rec::Layered
             totalNumberOfIntLengths += layers.at(i-1).outer_nInteractionLengths;
             
         }
-        
+        std::cout <<"layer="<<i<<",theLayer.distance="<<theLayer.distance<<std::endl; 
         layerParameters.m_closestDistanceToIp = (theLayer.distance+theLayer.inner_thickness)/dd4hep::mm; //Distance to center of sensitive element
         layerParameters.m_nRadiationLengths = totalNumberOfRadLengths;
         layerParameters.m_nInteractionLengths = totalNumberOfIntLengths;
 
         parameters.m_layerParametersVector.push_back(layerParameters);
-        std::cout<<"layer="<<i<<",m_closestDistanceToIp="<<layerParameters.m_closestDistanceToIp.Get()<<",m_nRadiationLengths="<<layerParameters.m_nRadiationLengths.Get()<<",m_nInteractionLengths="<<layerParameters.m_nInteractionLengths.Get()<<",outer_thickness="<<theLayer.outer_thickness<<",inner_thickness="<<theLayer.inner_thickness<<",sensitive_thickness="<<theLayer.sensitive_thickness<<std::endl;
+        std::cout <<"layer="<<i<<",m_closestDistanceToIp="<<layerParameters.m_closestDistanceToIp.Get()<<",m_nRadiationLengths="<<layerParameters.m_nRadiationLengths.Get()<<",m_nInteractionLengths="<<layerParameters.m_nInteractionLengths.Get()<<",outer_thickness="<<theLayer.outer_thickness<<",inner_thickness="<<theLayer.inner_thickness<<",sensitive_thickness="<<theLayer.sensitive_thickness<<std::endl;
     }
 }
 //------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp
index 9d94a93931dd76458ac5da6cdc49a4762ad2ba59..18030dbdb33cf0a5f62876fe64e237e550753855 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp
@@ -109,8 +109,8 @@ StatusCode PandoraPFAlg::initialize()
       else {
           m_tuple = ntupleSvc()->book( "MyTuples/Pan_reco_evt", CLID_ColumnWiseTuple, "Pan_reco_evt" );
           if ( m_tuple ) {
-            m_tuple->addItem( "N_mc" , m_n_mc , 0, 1000 ).ignore();
-            m_tuple->addItem( "N_rec", m_n_rec, 0, 1000 ).ignore();
+            m_tuple->addItem( "N_mc" , m_n_mc , 0, m_max_mc.value() ).ignore();
+            m_tuple->addItem( "N_rec", m_n_rec, 0, m_max_rec.value()).ignore();
             m_tuple->addItem( "m_pReco_PID"   , m_n_rec, m_pReco_PID    ).ignore();
             m_tuple->addItem( "m_pReco_mass"  , m_n_rec, m_pReco_mass   ).ignore();
             m_tuple->addItem( "m_pReco_energy", m_n_rec, m_pReco_energy ).ignore();
@@ -220,10 +220,10 @@ StatusCode PandoraPFAlg::initialize()
   // Name of PFO collection written by GaudiPandora
   
   m_pfoCreatorSettings.m_debug = m_debug;
-  m_pfoCreatorSettings.m_clusterCollectionName = m_ClusterCollectionName;// not used  
-  m_pfoCreatorSettings.m_pfoCollectionName = m_PFOCollectionName;//
-  m_pfoCreatorSettings.m_startVertexCollectionName = m_StartVertexCollectionName; //
-  m_pfoCreatorSettings.m_startVertexAlgName = m_StartVertexAlgorithmName;//
+  m_pfoCreatorSettings.m_clusterCollectionName = m_ClusterCollectionName; 
+  m_pfoCreatorSettings.m_pfoCollectionName = m_PFOCollectionName;
+  m_pfoCreatorSettings.m_startVertexCollectionName = m_StartVertexCollectionName; 
+  m_pfoCreatorSettings.m_startVertexAlgName = m_StartVertexAlgorithmName;
    
   m_pfoCreatorSettings.m_emStochasticTerm = m_EMStochasticTerm;
   m_pfoCreatorSettings.m_hadStochasticTerm = m_HadStochasticTerm;
@@ -283,6 +283,7 @@ StatusCode PandoraPFAlg::initialize()
   
   
   // Additional geometry parameters
+  m_geometryCreatorSettings.m_use_dd4hep_geo             = m_use_dd4hep_geo;
   m_geometryCreatorSettings.m_eCalEndCapInnerSymmetryOrder = m_ECalEndCapInnerSymmetryOrder;
   m_geometryCreatorSettings.m_eCalEndCapInnerPhiCoordinate = m_ECalEndCapInnerPhiCoordinate;
   m_geometryCreatorSettings.m_eCalEndCapOuterSymmetryOrder = m_ECalEndCapOuterSymmetryOrder;
@@ -295,8 +296,15 @@ StatusCode PandoraPFAlg::initialize()
   m_geometryCreatorSettings.m_hCalRingInnerPhiCoordinate = m_HCalRingInnerPhiCoordinate;
   m_geometryCreatorSettings.m_hCalRingOuterSymmetryOrder = m_HCalRingOuterSymmetryOrder; 
   m_geometryCreatorSettings.m_hCalRingOuterPhiCoordinate = m_HCalRingOuterPhiCoordinate;
-  m_geometryCreatorSettings.m_use_dd4hep_geo             = m_use_dd4hep_geo;
-  
+  if(m_use_dd4hep_geo){
+       std::cout<<"get hCalEndCapInner geo info from dd4hep."<<std::endl;
+       //Get HCal Endcap extension by type, ignore plugs and rings 
+       const dd4hep::rec::LayeredCalorimeterData * hCalEndcapExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD ) );
+       if(hCalEndcapExtension){
+           m_geometryCreatorSettings.m_hCalEndCapInnerSymmetryOrder = hCalEndcapExtension->inner_symmetry;
+           m_geometryCreatorSettings.m_hCalEndCapInnerPhiCoordinate = hCalEndcapExtension->inner_phi0/dd4hep::rad;
+       }
+  }
   // For Strip Splitting method and also for hybrid ECAL
   m_caloHitCreatorSettings.m_stripSplittingOn = m_StripSplittingOn;
   m_caloHitCreatorSettings.m_useEcalScLayers = m_UseEcalScLayers;
@@ -474,11 +482,12 @@ StatusCode PandoraPFAlg::updateMap()
                     std::vector<edm4hep::MCParticle> v_mc;
                     m_CollectionMaps->collectionMap_MC [v.first] = v_mc;
                     for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_MC [v.first].push_back(po->at(i));
-                    std::cout<<"saved col name="<<v.first<<std::endl;
+                    debug()<<"saved col name="<<v.first<<endmsg;
                 }
                 else{
-                std::cout<<"don't find col name="<<v.first<<std::endl;
+                    debug()<<"don't find col name="<<v.first<<endmsg;
                 }
+                
             }
             else if(m_collections[v.first]=="CalorimeterHit"){
                 auto handle = dynamic_cast<DataHandle<edm4hep::CalorimeterHitCollection>*> (v.second);
@@ -487,11 +496,12 @@ StatusCode PandoraPFAlg::updateMap()
                     std::vector<edm4hep::CalorimeterHit> v_cal;
                     m_CollectionMaps->collectionMap_CaloHit[v.first] = v_cal ;
                     for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_CaloHit [v.first].push_back(po->at(i));
-                    std::cout<<"saved col name="<<v.first<<std::endl;
+                    debug()<<"saved col name="<<v.first<<endmsg;
                 }
                 else{
-                std::cout<<"don't find col name="<<v.first<<std::endl;
+                    debug()<<"don't find col name="<<v.first<<endmsg;
                 }
+                
             }
             else if(m_collections[v.first]=="Track"){
                 auto handle = dynamic_cast<DataHandle<edm4hep::TrackCollection>*> (v.second);
@@ -500,12 +510,13 @@ StatusCode PandoraPFAlg::updateMap()
                     std::vector<edm4hep::Track> v_cal;
                     m_CollectionMaps->collectionMap_Track[v.first] = v_cal ;
                     for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_Track [v.first].push_back(po->at(i));
-                    std::cout<<"saved col name="<<v.first<<std::endl;
+                    debug() <<"saved col name="<<v.first<<endmsg;
                     m_marlinTrack = po->size();
                 }
                 else{
-                std::cout<<"don't find col name="<<v.first<<std::endl;
+                    debug()<<"don't find col name="<<v.first<<endmsg;
                 }
+                
             }
             else if(m_collections[v.first]=="Vertex"){
                 auto handle = dynamic_cast<DataHandle<edm4hep::VertexCollection>*> (v.second);
@@ -514,11 +525,12 @@ StatusCode PandoraPFAlg::updateMap()
                     std::vector<edm4hep::Vertex> v_cal;
                     m_CollectionMaps->collectionMap_Vertex[v.first] = v_cal ;
                     for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_Vertex [v.first].push_back(po->at(i));
-                    std::cout<<"saved col name="<<v.first<<std::endl;
+                    debug() <<"saved col name="<<v.first<<endmsg;
                 }
                 else{
-                std::cout<<"don't find col name="<<v.first<<std::endl;
+                    debug()<<"don't find col name="<<v.first<<endmsg;
                 }
+                
             }
             else if(m_collections[v.first]=="MCRecoCaloAssociation"){
                 auto handle = dynamic_cast<DataHandle<edm4hep::MCRecoCaloAssociationCollection>*> (v.second);
@@ -527,11 +539,12 @@ StatusCode PandoraPFAlg::updateMap()
                     std::vector<edm4hep::MCRecoCaloAssociation> v_cal;
                     m_CollectionMaps->collectionMap_CaloRel[v.first] = v_cal ;
                     for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_CaloRel [v.first].push_back(po->at(i));
-                    std::cout<<"saved col name="<<v.first<<std::endl;
+                    debug() <<"saved col name="<<v.first<<endmsg;
                 }
                 else{
-                std::cout<<"don't find col name="<<v.first<<std::endl;
+                    debug()<<"don't find col name="<<v.first<<endmsg;
                 }
+                
             }
             else if(m_collections[v.first]=="MCRecoTrackerAssociation"){
                 auto handle = dynamic_cast<DataHandle<edm4hep::MCRecoTrackerAssociationCollection>*> (v.second);
@@ -540,19 +553,20 @@ StatusCode PandoraPFAlg::updateMap()
                     std::vector<edm4hep::MCRecoTrackerAssociation> v_cal;
                     m_CollectionMaps->collectionMap_TrkRel[v.first] = v_cal ;
                     for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_TrkRel [v.first].push_back(po->at(i));
-                    std::cout<<"saved col name="<<v.first<<std::endl;
+                    debug() <<"saved col name="<<v.first<<endmsg;
                 }
                 else{
-                std::cout<<"don't find col name="<<v.first<<std::endl;
+                    debug()<<"don't find col name="<<v.first<<endmsg;
                 }
+                
             }
             else{
             std::cout<<"wrong type name for col :"<<v.first<<std::endl;
             }
         }//try
         catch(...){
-            std::cout<<"don't find "<<v.first<<"in event"<<std::endl;
-            std::cout<<"don't find  col name="<<v.first<<",with type="<<m_collections[v.first]<<" in this event"<<std::endl;
+            debug() <<"don't find "<<v.first<<" in event"<<endmsg;
+            debug() <<"don't find  col name="<<v.first<<",with type="<<m_collections[v.first]<<" in this event"<<endmsg;
         }
     }
     return StatusCode::SUCCESS;
@@ -569,6 +583,7 @@ StatusCode PandoraPFAlg::Ana()
     const edm4hep::MCRecoParticleAssociationCollection* reco_associa_col = m_MCRecoParticleAssociation_w.get();
     for(int i=0; i<reco_col->size();i++)
     {
+        if( m_n_rec >= m_max_rec) break;
         const edm4hep::ReconstructedParticle pReco = reco_col->at(i);
         const float px = pReco.getMomentum()[0];
         const float py = pReco.getMomentum()[1];
@@ -585,11 +600,11 @@ StatusCode PandoraPFAlg::Ana()
         m_pReco_py    [m_n_rec]=py;
         m_pReco_pz    [m_n_rec]=pz;
         m_n_rec ++ ;
-        if(m_debug) std::cout<<"rec type="<<type<<",energy="<<energy<<std::endl;
+        debug() <<"rec type="<<type<<",energy="<<energy<<endmsg;
         for(int j=0; j < reco_associa_col->size(); j++)
         {
             if(reco_associa_col->at(j).getRec().id() != pReco.id() ) continue;
-            if(m_debug) std::cout<<"MC pid ="<<reco_associa_col->at(j).getSim().getPDG()<<",weight="<<reco_associa_col->at(j).getWeight()<<", px="<<reco_associa_col->at(j).getSim().getMomentum()[0]<<", py="<<reco_associa_col->at(j).getSim().getMomentum()[1]<<",pz="<<reco_associa_col->at(j).getSim().getMomentum()[2]<<std::endl;
+            debug() <<"MC pid ="<<reco_associa_col->at(j).getSim().getPDG()<<",weight="<<reco_associa_col->at(j).getWeight()<<", px="<<reco_associa_col->at(j).getSim().getMomentum()[0]<<", py="<<reco_associa_col->at(j).getSim().getMomentum()[1]<<",pz="<<reco_associa_col->at(j).getSim().getMomentum()[2]<<endmsg;
         }
     }
     const edm4hep::MCParticleCollection*     MCParticle = nullptr;
@@ -598,6 +613,8 @@ StatusCode PandoraPFAlg::Ana()
     { 
         for(unsigned int i=0 ; i< MCParticle->size(); i++)
         {
+            if( m_n_mc >= m_max_mc) break;
+            if( MCParticle->at(i).parents_size() !=0 ) continue;// only save primary
             m_mc_p_size[m_n_mc] = MCParticle->at(i).parents_size();
             m_mc_pid   [m_n_mc] = MCParticle->at(i).getPDG();
             m_mc_mass  [m_n_mc] = MCParticle->at(i).getMass();
@@ -606,7 +623,7 @@ StatusCode PandoraPFAlg::Ana()
             m_mc_pz    [m_n_mc] = MCParticle->at(i).getMomentum()[2];
             m_mc_charge[m_n_mc] = MCParticle->at(i).getCharge();
             float mc_E = sqrt( MCParticle->at(i).getMass()*MCParticle->at(i).getMass() + MCParticle->at(i).getMomentum()[0]*MCParticle->at(i).getMomentum()[0] + MCParticle->at(i).getMomentum()[1]*MCParticle->at(i).getMomentum()[1] + MCParticle->at(i).getMomentum()[2]*MCParticle->at(i).getMomentum()[2]);
-            if(m_debug) std::cout<<"mc type="<<MCParticle->at(i).getPDG()<<",energy="<<mc_E<<std::endl;
+            //debug() <<"mc type="<<MCParticle->at(i).getPDG()<<",energy="<<mc_E<<",m_mc_p_size="<<m_mc_p_size->size()<<endmsg;
             m_n_mc ++ ;
             if (MCParticle->at(i).getPDG() != 22) continue;
             int hasEm = 0;
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp
index f9fd064f1a7195bb046ebcb4efcf5d24895e69e2..4b67db277fcb73218e559c6acd1521b7a28a637f 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp
@@ -42,16 +42,45 @@ TrackCreator::TrackCreator(const Settings &settings, const pandora::Pandora *con
 {
 
 
+    IGearSvc*  iSvc = 0;
+    StatusCode sc = svcloc->service("GearSvc", iSvc, false);
+    if ( !sc ) throw "Failed to find GearSvc ...";
+    _GEAR = iSvc->getGearMgr();
+
     if(m_settings.m_use_dd4hep_geo){
         m_bField                  = PanUtil::getFieldFromCompact();
         const dd4hep::rec::LayeredCalorimeterData * eCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL),
             									     ( dd4hep::DetType::AUXILIARY  |  dd4hep::DetType::FORWARD ) );
         const dd4hep::rec::LayeredCalorimeterData * eCalEndcapExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP),
             									     ( dd4hep::DetType::AUXILIARY |  dd4hep::DetType::FORWARD  ) );
-        m_eCalBarrelInnerPhi0     = eCalBarrelExtension->inner_phi0/dd4hep::rad;
-        m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry;
-        m_eCalBarrelInnerR        = eCalBarrelExtension->extent[0]/dd4hep::mm;
-        m_eCalEndCapInnerZ        = eCalEndcapExtension->extent[2]/dd4hep::mm;
+        if(eCalBarrelExtension){
+            m_eCalBarrelInnerPhi0     = eCalBarrelExtension->inner_phi0/dd4hep::rad;
+            m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry;
+            m_eCalBarrelInnerR        = eCalBarrelExtension->extent[0]/dd4hep::mm;
+        }
+        else{
+            /*
+            std::cout<<"TrackCreator:WARNING: can get ECAL barrel info from dd4hep, set it to dummy"<<std::endl;
+            m_eCalBarrelInnerPhi0     = 0;
+            m_eCalBarrelInnerSymmetry = 0;
+            m_eCalBarrelInnerR        = 1850;
+            */
+            std::cout<<"TrackCreator:WARNING: can get ECAL barrel info from dd4hep, get it from Gear"<<std::endl;
+            m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder());
+            m_eCalBarrelInnerPhi0     = (_GEAR->getEcalBarrelParameters().getPhi0());
+            m_eCalBarrelInnerR        = (_GEAR->getEcalBarrelParameters().getExtent()[0]);
+        }
+        if(eCalEndcapExtension){
+            m_eCalEndCapInnerZ        = eCalEndcapExtension->extent[2]/dd4hep::mm;
+        }
+        else{
+            /*
+            std::cout<<"TrackCreator:WARNING: can get ECAL endcap info from dd4hep, set it to dummy"<<std::endl;
+            m_eCalEndCapInnerZ        = 100;
+            */
+            std::cout<<"TrackCreator:WARNING: can get ECAL endcap info from dd4hep, get it from Gear"<<std::endl;
+            m_eCalEndCapInnerZ        = (_GEAR->getEcalEndcapParameters().getExtent()[2]);
+        }
 
         dd4hep::Detector & mainDetector = dd4hep::Detector::getInstance();
         try{
@@ -68,25 +97,56 @@ TrackCreator::TrackCreator(const Settings &settings, const pandora::Pandora *con
                   m_tpcMaxRow = theExtension->maxRow;
                   std::cout<<"DD4HEP m_tpcInnerR="<<m_tpcInnerR<<",m_tpcOuterR="<<m_tpcOuterR<<",m_tpcMaxRow="<<m_tpcMaxRow<<",m_tpcZmax="<<m_tpcZmax<<std::endl;
               }
-              else{ 
+              else{
+                  /* 
                   m_tpcInnerR = 100 ;
                   m_tpcOuterR = 1800;
                   m_tpcMaxRow = 100 ;
                   m_tpcZmax   = 2500;
                   std::cout<<"TrackCreator WARNING:Does not find TPC parameter from dd4hep and set it to dummy value"<<std::endl;
+                  */
+                  std::cout<<"TrackCreator WARNING:Does not find TPC parameter from dd4hep and get it from Gear"<<std::endl;
+                  m_tpcInnerR               = (_GEAR->getTPCParameters().getPadLayout().getPlaneExtent()[0]);
+                  m_tpcOuterR               = (_GEAR->getTPCParameters().getPadLayout().getPlaneExtent()[1]);
+                  m_tpcMaxRow               = (_GEAR->getTPCParameters().getPadLayout().getNRows());
+                  m_tpcZmax                 = (_GEAR->getTPCParameters().getMaxDriftLength());
               }
-           }
+        }
         catch (std::runtime_error &exception){
             std::cout<<"TrackCreator WARNING:exception during TPC parameter construction:"<<exception.what()<<std::endl;
         }
         //Instead of gear, loop over a provided list of forward (read: endcap) tracking detectors.
         const std::vector< dd4hep::DetElement>& endcapDets = dd4hep::DetectorSelector(mainDetector).detectors(  ( dd4hep::DetType::TRACKER | dd4hep::DetType::ENDCAP )) ;
         if(endcapDets.size()==0){ 
+            /*
             m_ftdInnerRadii.push_back(100);
             m_ftdOuterRadii.push_back(200);
             m_ftdZPositions.push_back(2000);
             m_nFtdLayers = 1;
             std::cout<<"TrackCreator WARNING:Does not find forward tracking parameter from dd4hep, so set it to dummy value"<<std::endl;
+            */
+            std::cout<<"TrackCreator WARNING:Does not find forward tracking parameter from dd4hep, so get it from Gear"<<std::endl;
+            try{
+                m_ftdInnerRadii = _GEAR->getGearParameters("FTD").getDoubleVals("FTDInnerRadius");
+                m_ftdOuterRadii = _GEAR->getGearParameters("FTD").getDoubleVals("FTDOuterRadius");
+                m_ftdZPositions = _GEAR->getGearParameters("FTD").getDoubleVals("FTDZCoordinate");
+                m_nFtdLayers = m_ftdZPositions.size();
+            }
+            catch (gear::UnknownParameterException &){
+                const gear::FTDLayerLayout &ftdLayerLayout(_GEAR->getFTDParameters().getFTDLayerLayout());
+                std::cout << " Filling FTD parameters from gear::FTDParameters - n layers: " << ftdLayerLayout.getNLayers() << std::endl;
+                for(unsigned int i = 0, N = ftdLayerLayout.getNLayers(); i < N; ++i)
+                {
+                    // Create a disk to represent even number petals front side
+                    m_ftdInnerRadii.push_back(ftdLayerLayout.getSensitiveRinner(i));
+                    m_ftdOuterRadii.push_back(ftdLayerLayout.getMaxRadius(i));
+                    // Take the mean z position of the staggered petals
+                    const double zpos(ftdLayerLayout.getZposition(i));
+                    m_ftdZPositions.push_back(zpos);
+                    std::cout << "Gear: layer " << i << " - mean z position = " << zpos << std::endl;
+                }
+                m_nFtdLayers = m_ftdZPositions.size() ;
+            }
         }
         for (std::vector< dd4hep::DetElement>::const_iterator iter = endcapDets.begin(), iterEnd = endcapDets.end();iter != iterEnd; ++iter){
           try{
@@ -121,10 +181,10 @@ TrackCreator::TrackCreator(const Settings &settings, const pandora::Pandora *con
 
     }// if m_use_dd4hep_geo
     else{
-        IGearSvc*  iSvc = 0;
-        StatusCode sc = svcloc->service("GearSvc", iSvc, false);
-        if ( !sc ) throw "Failed to find GearSvc ...";
-        _GEAR = iSvc->getGearMgr();
+        //IGearSvc*  iSvc = 0;
+        //StatusCode sc = svcloc->service("GearSvc", iSvc, false);
+        //if ( !sc ) throw "Failed to find GearSvc ...";
+        //_GEAR = iSvc->getGearMgr();
         m_bField                  = (_GEAR->getBField().at(gear::Vector3D(0., 0., 0.)).z());
         m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder());
         m_eCalBarrelInnerPhi0     = (_GEAR->getEcalBarrelParameters().getPhi0());
diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp
index 83edea103d7fab42363d57e7076ba8b4c7829177..3f054df12ae7fc59912e142d67610672a1992d0a 100644
--- a/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp
+++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp
@@ -35,7 +35,7 @@ std::vector<double> PanUtil::getTrackingRegionExtent(){
   return extent;
 }
 
-dd4hep::rec::LayeredCalorimeterData * PanUtil::getExtension(unsigned int includeFlag, unsigned int excludeFlag=0) {
+dd4hep::rec::LayeredCalorimeterData * PanUtil::getExtension(unsigned int includeFlag, unsigned int excludeFlag) {
   
   
   dd4hep::rec::LayeredCalorimeterData * theExtension = 0;
@@ -50,12 +50,12 @@ dd4hep::rec::LayeredCalorimeterData * PanUtil::getExtension(unsigned int include
   if( theDetectors.size()  != 1 ){
     
     std::stringstream es ;
-    es << " getExtension: selection is not unique (or empty)  includeFlag: " << dd4hep::DetType( includeFlag ) << " excludeFlag: " << dd4hep::DetType( excludeFlag )
-       << " --- found detectors : " ;
+    es << "return nullptr!  getExtension: selection is not unique (or empty)  includeFlag: " << dd4hep::DetType( includeFlag ) << " excludeFlag: " << dd4hep::DetType( excludeFlag ) << " --- found detectors : " ;
     for( unsigned i=0, N= theDetectors.size(); i<N ; ++i ){
       es << theDetectors.at(i).name() << ", " ; 
     }
-    throw std::runtime_error( es.str() ) ;
+    //throw std::runtime_error( es.str() ) ;
+    return nullptr;
   }
   
   theExtension = theDetectors.at(0).extension<dd4hep::rec::LayeredCalorimeterData>();
diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
index 708c33e38ba282c92f5d0f8ef579fde688d150f4..422ffd0fdcbe39fa4bb9bd3ca5bd85868494e8ec 100644
--- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
+++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h
@@ -55,26 +55,26 @@ namespace dd4hep {
 
 class GenfitTrack {
     friend int GenfitFitter::processTrack(
-            GenfitTrack* track, bool resort=false);
+            GenfitTrack* track, bool resort);
 
     friend int GenfitFitter::processTrackWithRep(
-            GenfitTrack* track, int repID=0, bool resort=false);
+            GenfitTrack* track, int repID, bool resort);
 
     friend double GenfitFitter::extrapolateToHit(TVector3& poca,
             TVector3& pocaDir,
             TVector3& pocaOnWire, double& doca, const GenfitTrack* track,
             TVector3 pos, TVector3 mom, TVector3 end0, TVector3 end1, int debug,
-            int repID=0, bool stopAtBoundary=false, bool calcJacobianNoise=false);
+            int repID, bool stopAtBoundary, bool calcJacobianNoise);
 
     friend double GenfitFitter::extrapolateToCylinder(TVector3& pos,
             TVector3& mom,
             GenfitTrack* track, double radius, const TVector3 linePoint,
-            const TVector3 lineDirection, int hitID =0, int repID=0,
-            bool stopAtBoundary=false, bool calcJacobianNoise=false);
+            const TVector3 lineDirection, int hitID, int repID,
+            bool stopAtBoundary, bool calcJacobianNoise);
 
     friend double GenfitFitter::extrapolateToPoint(TVector3& pos, TVector3& mom,
-            const GenfitTrack* genfitTrack, const TVector3& point, int repID=0,
-            bool stopAtBoundary = false, bool calcJacobianNoise = false) const;
+            const GenfitTrack* genfitTrack, const TVector3& point, int repID,
+            bool stopAtBoundary, bool calcJacobianNoise) const;
 
     public:
     GenfitTrack(const GenfitField* field,
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index a84e074e7cc38232e9d4b7887c7ddacae87bf61b..655d921c2742cd2b066000275f79baa1113cc558 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -2,12 +2,14 @@
 #include "GaudiKernel/IEventProcessor.h"
 #include "GaudiKernel/IAppMgrUI.h"
 #include "GaudiKernel/GaudiException.h"
+#include "GaudiKernel/IRndmEngine.h"
 
 #include "G4RunManager.hh"
 #include "G4UImanager.hh"
 #include "G4VisExecutive.hh"
 #include "G4UIExecutive.hh"
 
+#include "Randomize.hh"
 #include "DetectorConstruction.h"
 #include "G4PhysListFactory.hh"
 #include "G4EmParameters.hh"
@@ -30,6 +32,15 @@ DetSimAlg::initialize() {
 
     info() << "Initialize DetSimAlg... " << endmsg;
 
+    // Initialize random seed
+    if (not m_randomSeeds.empty()) {
+        randSvc()->engine()->setSeeds( m_randomSeeds );
+    }
+
+    info() << "Random Seed is initialized to "
+           << G4Random::getTheSeed()
+           << " in Geant4" << endmsg;
+
     m_detsimsvc = service("DetSimSvc");
     if (!m_detsimsvc) {
         error() << "Failed to find DetSimSvc. " << endmsg;
diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h
index 36646d9e8b449058aa7588cc8bbe89d3acff5342..bb4571c74ad2dceddab2fea70a551bea292ddea7 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.h
+++ b/Simulation/DetSimCore/src/DetSimAlg.h
@@ -31,6 +31,8 @@ private:
 
 private:
 
+    Gaudi::Property<std::vector<long>> m_randomSeeds{this, "RandomSeeds", {}};
+
     Gaudi::Property<std::vector<std::string>> m_run_macs{this, "RunMacs"};
     Gaudi::Property<std::vector<std::string>> m_run_cmds{this, "RunCmds"};
     Gaudi::Property<std::vector<std::string>> m_vis_macs{this, "VisMacs"};
diff --git a/Utilities/DataHelper/CMakeLists.txt b/Utilities/DataHelper/CMakeLists.txt
index 0583b24bdabbbe3328ac3c8d357502ba2115fe9c..c2d23702b687d3aa123186e8ec348b10543ca825 100644
--- a/Utilities/DataHelper/CMakeLists.txt
+++ b/Utilities/DataHelper/CMakeLists.txt
@@ -15,10 +15,12 @@ gaudi_add_library(DataHelperLib
                           src/TrackerHitExtended.cc
                           src/TrackExtended.cc
                           src/TrackHitPair.cc
+			  src/TrackerHitHelper.cpp
                   LINK EDM4HEP::edm4hep
                        EDM4HEP::edm4hepDict
                        ${GSL_LIBRARIES}
                        ${CLHEP_LIBRARIES}
+		       Identifier
 )
 
 install(TARGETS DataHelperLib
diff --git a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
new file mode 100644
index 0000000000000000000000000000000000000000..fcd9dd146b9268b581eb2246f89b1615fc3fb6db
--- /dev/null
+++ b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
@@ -0,0 +1,14 @@
+#ifndef TrackerHitHelper_H
+#define TrackerHitHelper_H
+
+#include "edm4hep/TrackerHit.h"
+#include <array>
+
+namespace CEPC{
+  std::array<float, 6> GetCovMatrix(edm4hep::TrackerHit& hit, bool useSpacePointerBuilderMethod = false);
+  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);
+}
+
+#endif
diff --git a/Utilities/DataHelper/src/TrackerHitHelper.cpp b/Utilities/DataHelper/src/TrackerHitHelper.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e12eb886c5aa7863f320b1157d278948cf21c880
--- /dev/null
+++ b/Utilities/DataHelper/src/TrackerHitHelper.cpp
@@ -0,0 +1,117 @@
+#include "DataHelper/TrackerHitHelper.h"
+#include "Identifier/CEPCConf.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>
+
+std::array<float,6> CEPC::GetCovMatrix(edm4hep::TrackerHit& hit, bool useSpacePointBuilderMethod){
+  if(hit.isAvailable()){
+    int type = hit.getType();
+    if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::COMPOSITE_SPACEPOINT]){
+      return hit.getCovMatrix();
+    }
+    else if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::PLANAR]){
+      float thetaU = hit.getCovMatrix(0);
+      float phiU   = hit.getCovMatrix(1);
+      float dU     = hit.getCovMatrix(2);
+      float thetaV = hit.getCovMatrix(3);
+      float phiV   = hit.getCovMatrix(4);
+      float dV     = hit.getCovMatrix(5);
+      return ConvertToCovXYZ(dU, thetaU, phiU, dV, thetaV, phiV, useSpacePointBuilderMethod);
+    }
+    else{
+      std::cout << "Warning: not SpacePoint and Planar, return original cov matrix preliminaryly." << std::endl;
+      return hit.getCovMatrix();
+    }
+  }
+  std::array<float,6> cov{0.,0.,0.,0.,0.,0.};
+  return cov;
+}
+
+float CEPC::GetResolutionRPhi(edm4hep::TrackerHit& hit){
+  if(hit.isAvailable()){
+    int type = hit.getType();
+    if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::COMPOSITE_SPACEPOINT]){
+      return sqrt(hit.getCovMatrix(0)+hit.getCovMatrix(2));
+    }
+    else if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::PLANAR]){
+      return hit.getCovMatrix(2);
+    }
+    else{
+      std::cout << "Warning: not SpacePoint and Planar, return value from original cov matrix preliminaryly." << std::endl;
+      return sqrt(hit.getCovMatrix(0)+hit.getCovMatrix(2));
+    }
+  }
+  return 0.;
+}
+
+float CEPC::GetResolutionZ(edm4hep::TrackerHit& hit){
+  if(hit.isAvailable()){
+    int type = hit.getType();
+    if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::COMPOSITE_SPACEPOINT]){
+      return sqrt(hit.getCovMatrix(5));
+    }
+    else if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::PLANAR]){
+      return hit.getCovMatrix(5);
+    }
+    else{
+      std::cout << "Warning: not SpacePoint and Planar, return value from original cov matrix preliminaryly." << std::endl;
+      return sqrt(hit.getCovMatrix(5));
+    }
+  }
+  return 0.;
+}
+
+std::array<float, 6> CEPC::ConvertToCovXYZ(float dU, float thetaU, float phiU, float dV, float thetaV, float phiV, bool useSpacePointBuilderMethod){
+  std::array<float,6> cov{0.,0.,0.,0.,0.,0.};
+  if(!useSpacePointBuilderMethod){
+    TMatrixF diffs(2,3);
+    TMatrixF diffsT(3,2);
+    diffs(0,0) = sin(thetaU)*cos(phiU);
+    diffs(0,1) = sin(thetaU)*sin(phiU);
+    diffs(0,2) = cos(thetaU);
+    diffs(1,0) = sin(thetaV)*cos(phiV);
+    diffs(1,1) = sin(thetaV)*sin(phiV);
+    diffs(1,2) = cos(thetaV);
+
+    diffsT.Transpose(diffs);
+
+    TMatrixF covMatrixUV(2,2);
+    covMatrixUV(0,0) = dU*dU;
+    covMatrixUV(0,1) = 0;
+    covMatrixUV(1,0) = 0;
+    covMatrixUV(1,1) = dV*dV;
+
+    TMatrixF covMatrixXYZ(3,3);
+    covMatrixXYZ = diffsT*covMatrixUV*diffs;
+    cov[0] = covMatrixXYZ(0,0);
+    cov[1] = covMatrixXYZ(1,0);
+    cov[2] = covMatrixXYZ(1,1);
+    cov[3] = covMatrixXYZ(2,0);
+    cov[4] = covMatrixXYZ(2,1);
+    cov[5] = covMatrixXYZ(2,2);
+  }
+  else{ // Method used in SpacePointBuilder, results are almost same with above
+    CLHEP::Hep3Vector u_sensor(sin(thetaU)*cos(phiU), sin(thetaU)*sin(phiU), cos(thetaU));
+    CLHEP::Hep3Vector v_sensor(sin(thetaV)*cos(phiV), sin(thetaV)*sin(phiV), cos(thetaV));
+    CLHEP::Hep3Vector w_sensor = u_sensor.cross(v_sensor);
+    CLHEP::HepRotation rot_sensor(u_sensor, v_sensor, w_sensor);
+    CLHEP::HepMatrix rot_sensor_matrix;
+    rot_sensor_matrix = rot_sensor;
+    CLHEP::HepSymMatrix cov_plane(3,0);
+    cov_plane(1,1) = dU*dU;
+    cov_plane(2,2) = dV*dV;
+    CLHEP::HepSymMatrix cov_xyz= cov_plane.similarity(rot_sensor_matrix);
+    cov[0] = cov_xyz[0][0];
+    cov[1] = cov_xyz[1][0];
+    cov[2] = cov_xyz[1][1];
+    cov[3] = cov_xyz[2][0];
+    cov[4] = cov_xyz[2][1];
+    cov[5] = cov_xyz[2][2];
+  }
+  return cov;
+}
diff --git a/cmake/CEPCSWConfig.cmake b/cmake/CEPCSWConfig.cmake
index 4f9445ac3683765653b333811ce5ca8803cec5c6..c008c2f82eae85e547b939a54d87cb190073bdfa 100644
--- a/cmake/CEPCSWConfig.cmake
+++ b/cmake/CEPCSWConfig.cmake
@@ -2,6 +2,7 @@ include(CMakeFindDependencyMacro)
 find_dependency(podio REQUIRED)
 find_dependency(Gaudi REQUIRED)
 find_dependency(k4FWCore REQUIRED)
+find_dependency(k4LCIOReader REQUIRED)
 find_dependency(EDM4HEP REQUIRED)
 find_dependency(ROOT REQUIRED)
 
diff --git a/cmake/FindHepMC.cmake b/cmake/FindHepMC.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..5e5714c9a6e9a3a19ca6adb48ea47d66de044870
--- /dev/null
+++ b/cmake/FindHepMC.cmake
@@ -0,0 +1,36 @@
+# - Locate HepMC library
+# Defines:
+#
+#  HEPMC_FOUND
+#  HEPMC_INCLUDE_DIR
+#  HEPMC_INCLUDE_DIRS (not cached)
+#  HEPMC_<component>_LIBRARY
+#  HEPMC_LIBRARIES (not cached)
+#  HEPMC_LIBRARY_DIRS (not cached)
+
+find_path(HEPMC_INCLUDE_DIR HepMC/GenEvent.h
+          HINTS ${HEPMC_ROOT_DIR}/include $ENV{HEPMC_ROOT_DIR}/include)
+set(HEPMC_INCLUDE_DIRS ${HEPMC_INCLUDE_DIR})
+
+if(NOT HepMC_FIND_COMPONENTS)
+  set(HepMC_FIND_COMPONENTS HepMC)
+endif()
+foreach(component ${HepMC_FIND_COMPONENTS})
+  find_library(HEPMC_${component}_LIBRARY 
+               NAMES HepMC${component} ${component}
+               HINTS ${HEPMC_ROOT_DIR}/lib $ENV{HEPMC_ROOT_DIR}/lib)
+  mark_as_advanced(HEPMC_${component}_LIBRARY)
+  list(APPEND HEPMC_LIBRARIES ${HEPMC_${component}_LIBRARY})
+  get_filename_component(_comp_dir ${HEPMC_${component}_LIBRARY} PATH)
+  list(APPEND HEPMC_LIBRARY_DIRS ${_comp_dir})
+endforeach()
+if(HEPMC_LIBRARY_DIRS)
+  list(REMOVE_DUPLICATES HEPMC_LIBRARY_DIRS)
+endif()
+
+# handle the QUIETLY and REQUIRED arguments and set HEPMC_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(HepMC DEFAULT_MSG HEPMC_INCLUDE_DIR HEPMC_LIBRARIES)
+
+mark_as_advanced(HEPMC_FOUND HEPMC_INCLUDE_DIR)