diff --git a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
index 249513b2e5926cd2ee5895d40fa0a718870f25c2..04dad3786ad81bc1d66e17922eaa4eeafd375831 100755
--- a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
+++ b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
@@ -431,7 +431,68 @@ fitstart:
     // sort hits in R or z
     std::vector< std::pair<float, edm4hep::TrackerHit> > sort_values;
     sort_values.reserve(trkHits.size());
-    
+
+    double r_at_rmax = 0;
+    double z_at_rmax = 0;
+    double r_at_rmin = DBL_MAX;
+    double z_at_rmin = 0;
+    double z_at_zmin = DBL_MAX;
+    for (auto hit : trkHits) {
+      auto&  pos    = hit.getPosition();
+      double radius = sqrt(pos[0]*pos[0]+pos[1]*pos[1]);
+      double zabs   = fabs(pos[2]);
+      auto   cellID = hit.getCellID();
+      unsigned det  = cellID&0x1F;
+      if (det == CEPCConf::DetID::ETD) continue;
+      if (radius > r_at_rmax) {
+	r_at_rmax = radius;
+	z_at_rmax = zabs;
+      }
+      if (radius < r_at_rmin) {
+        r_at_rmin = radius;
+        z_at_rmin = zabs;
+      }
+      if (zabs < z_at_zmin) z_at_zmin = zabs;
+    }
+    double half_length_z = fabs(z_at_rmax - z_at_rmin);
+    for (auto hit : trkHits) {
+      auto&  pos    = hit.getPosition();
+      double radius = sqrt(pos[0]*pos[0]+pos[1]*pos[1]);
+      double zabs   = fabs(pos[2]);
+      auto   cellID = hit.getCellID();
+      unsigned det  = cellID&0x1F;
+      if (r_at_rmax > _tpc_inner_r && zabs > z_at_rmax + half_length_z) continue;
+      float value = radius;
+      if (sort_by_r) {
+	// OTKEndcap: always larger than others
+	if (det == CEPCConf::DetID::ETD) value += 10*r_at_rmax;
+	else {
+	  // second half of circle
+	  if (z_at_rmax > z_at_rmin) {
+	    if (zabs > z_at_rmax) value += (r_at_rmax - radius);
+	  }
+	  else {
+	    if (z_at_zmin == z_at_rmax && r_at_rmax > _tpc_outer_r && r_at_rmin < _tpc_inner_r) {
+	      // FIXME: how to deal with only half and tanLambda*z < 0
+	      if (det == CEPCConf::DetID::ETD) value = radius;
+	    }
+	    else {
+	      if (zabs > z_at_rmax) value += (r_at_rmax - radius);
+	    }
+	  }
+	}
+      }
+      else {
+	// TPC
+        if (det == CEPCConf::DetID::TPC) value = _tpc_inner_r + zabs;
+        // OTKBarrel: always larger than TPC's
+        else if (det == CEPCConf::DetID::SET) value = _tpc_max_drift_length + zabs;
+	// OTKEndcap: always larger than others
+        else if (det == CEPCConf::DetID::ETD) value = 10*_tpc_max_drift_length + zabs;
+      }
+      sort_values.push_back(std::make_pair(value, hit));
+    }
+    /*
     for (std::vector<edm4hep::TrackerHit>::iterator it=trkHits.begin(); it!=trkHits.end(); ++it) {
       edm4hep::TrackerHit h = *it;
       //float value = sort_by_z ? h.getPosition()[2] : h.getPosition()[0]*h.getPosition()[0]+h.getPosition()[1]*h.getPosition()[1];
@@ -446,9 +507,14 @@ fitstart:
 	// OTKEndcap:
 	else if (z>_tpc_max_drift_length) value = _tpc_max_drift_length + value;
       }
+      else {
+	// OTKEndcap:
+	if (z>_tpc_max_drift_length) value = _tpc_outer_r + value;
+      }
+      debug() << sqrt(h.getPosition()[0]*h.getPosition()[0]+h.getPosition()[1]*h.getPosition()[1]) << " " << z << " " << value << endmsg;
       sort_values.push_back(std::make_pair(value, *it));
     }
-    
+    */
     sort(sort_values.begin(),sort_values.end());
     
     trkHits.clear();
@@ -512,10 +578,10 @@ fitstart:
     outliers = m_fitTool->GetOutliers();
 
     if (error_code != IMarlinTrack::success) {
-      debug() << "FullLDCTrackingAlg::AddTrackColToEvt: Track fit failed with error code " << error_code << " track dropped. Number of hits = "<< trkHits.size() << endmsg;
+      debug() << "AddTrackColToEvt: Track fit failed " << MarlinTrk::errorCode(error_code) << " track dropped. Number of hits = "<< trkHits.size() << endmsg;
       m_fitTool->Clear();
       if (fit_count==1) {
-	sort_by_r = !sort_by_r;
+	use_ts_initial = !use_ts_initial;//sort_by_r = !sort_by_r;
 	goto fitstart;
       }
       // TODO: to pick up old tracks
@@ -599,8 +665,8 @@ fitstart:
       }
     }
     
-    float d0TrkCand = trkCand->getD0();
-    float z0TrkCand = trkCand->getZ0();
+    float d0TrkCand = trkStateIP.D0;//trkCand->getD0();
+    float z0TrkCand = trkStateIP.Z0;//trkCand->getZ0();
     //    float phi0TrkCand = trkCand->getPhi();
     // FIXME, fucd
 #if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0)
@@ -658,6 +724,7 @@ fitstart:
 	      << " rejectTrackonSiliconHits " << rejectTrackonSiliconHits
 	      << " rejectTrackonImpactParameters " << rejectTrackonImpactParameters
 	      << endmsg;
+      if (rejectTrackonImpactParameters) debug() << "d0TrkCand = " << d0TrkCand << " z0TrkCand = " << z0TrkCand << endmsg;
       /*
       if (fit_count==1) {
 	fit_backwards = !fit_backwards;
@@ -5324,6 +5391,7 @@ StatusCode FullLDCTrackingAlg::setupGeom(){
   } catch(std::runtime_error& e) {
     error() << e.what() << endmsg;
   }
+  debug() << "TPC: drift_length = " << _tpc_max_drift_length << " inner_r = " << _tpc_inner_r << " outer_r = " << _tpc_outer_r << " pad_height = " << _tpc_pad_height << endmsg;
 
   _nLayersFTD = 0;
   try {