From d5ec7e5c7b6738e43b03831b799cd31313d4f1eb Mon Sep 17 00:00:00 2001
From: "guofangyi@ihep.ac.cn" <guofangyi@ihep.ac.cn>
Date: Wed, 16 Oct 2024 09:46:55 +0000
Subject: [PATCH] Fix track reference points in PFO and remove redundant
 collections

---
 Analysis/ReadDigi/src/ReadDigiAlg.cpp         | 446 ++++++++++++------
 Analysis/ReadDigi/src/ReadDigiAlg.h           |  35 +-
 Reconstruction/RecPFACyber/script/digi.py     |  25 +-
 Reconstruction/RecPFACyber/script/rec.py      |  14 +-
 Reconstruction/RecPFACyber/script/sim.py      |  24 +-
 Reconstruction/RecPFACyber/script/tracking.py |  27 +-
 .../RecPFACyber/src/Objects/Track.cc          |  12 +-
 7 files changed, 395 insertions(+), 188 deletions(-)

diff --git a/Analysis/ReadDigi/src/ReadDigiAlg.cpp b/Analysis/ReadDigi/src/ReadDigiAlg.cpp
index 186a5dd7..c2cdb4ed 100644
--- a/Analysis/ReadDigi/src/ReadDigiAlg.cpp
+++ b/Analysis/ReadDigi/src/ReadDigiAlg.cpp
@@ -12,21 +12,24 @@ ReadDigiAlg::ReadDigiAlg(const std::string& name, ISvcLocator* svcLoc)
   declareProperty("MCParticle",  m_MCParticleCol, "MCParticle collection (input)");
 
   //Tracker hit
-  declareProperty("SITRawHits", m_SITRawColHdl, "SIT Raw Hit Collection of SpacePoints");
-  declareProperty("SETRawHits", m_SETRawColHdl, "SET Raw Hit Collection of SpacePoints");
-  declareProperty("FTDRawHits", m_FTDRawColHdl, "FTD Raw Hit Collection of SpacePoints");
-  declareProperty("VTXTrackerHits", m_VTXTrackerHitColHdl, "VTX Hit Collection");
-  declareProperty("SITTrackerHits", m_SITTrackerHitColHdl, "SIT Hit Collection");
-  declareProperty("SETTrackerHits", m_SETTrackerHitColHdl, "SET Hit Collection");
-  declareProperty("TPCTrackerHits", m_TPCTrackerHitColHdl, "TPC Hit Collection");
-  declareProperty("FTDSpacePoints", m_FTDSpacePointColHdl, "FTD FTDSpacePoint Collection");
-  declareProperty("FTDPixelTrackerHits", m_FTDPixelTrackerHitColHdl, "handler of FTD Pixel Hit Collection");
+  //declareProperty("SITRawHits", m_SITRawColHdl, "SIT Raw Hit Collection of SpacePoints");
+  //declareProperty("SETRawHits", m_SETRawColHdl, "SET Raw Hit Collection of SpacePoints");
+  //declareProperty("FTDRawHits", m_FTDRawColHdl, "FTD Raw Hit Collection of SpacePoints");
+  //declareProperty("VTXTrackerHits", m_VTXTrackerHitColHdl, "VTX Hit Collection");
+  //declareProperty("SITTrackerHits", m_SITTrackerHitColHdl, "SIT Hit Collection");
+  //declareProperty("SETTrackerHits", m_SETTrackerHitColHdl, "SET Hit Collection");
+  //declareProperty("TPCTrackerHits", m_TPCTrackerHitColHdl, "TPC Hit Collection");
+  //declareProperty("FTDSpacePoints", m_FTDSpacePointColHdl, "FTD FTDSpacePoint Collection");
+  //declareProperty("FTDPixelTrackerHits", m_FTDPixelTrackerHitColHdl, "handler of FTD Pixel Hit Collection");
 
   //Track
   declareProperty("FullTracks", m_fullTrk, "Full Track Collection");
   declareProperty("TPCTracks", m_TPCTrk, "TPC Track Collection");
   declareProperty("SiTracks", m_SiTrk, "Si Track Collection");
 
+  declareProperty("TPCTracksAssociation", m_TPCTrkAssoHdl, "TPC Track - MCParticle Collection");
+  declareProperty("FullTracksAssociation", m_fullTrkAssoHdl, "Full Track - MCParticle Collection");
+
   //declareProperty("EcalBarrelCollection",  m_ECalBarrelHitCol, "ECal Barrel");
   //declareProperty("EcalEndcapsCollection", m_ECalEndcapHitCol, "ECal Endcap");
   //declareProperty("HcalBarrelCollection",  m_HCalBarrelHitCol, "HCal Barrel");
@@ -40,7 +43,9 @@ StatusCode ReadDigiAlg::initialize()
   std::string s_outfile = _filename;
   m_wfile = new TFile(s_outfile.c_str(), "recreate");
   m_mctree = new TTree("MCParticle", "MCParticle");
-  m_trktree = new TTree("RecoTrk", "RecoTrk");
+  m_sitrktree = new TTree("RecoSiTrk", "RecoSiTrk");
+  m_tpctrktree = new TTree("RecoTPCTrk", "RecoTPCTrk");
+  m_fulltrktree = new TTree("RecoFullTrk", "RecoFullTrk");
 
   m_mctree->Branch("N_MCP", &N_MCP);
   m_mctree->Branch("MCP_px", &MCP_px);
@@ -53,28 +58,103 @@ StatusCode ReadDigiAlg::initialize()
   m_mctree->Branch("MCP_pdgid", &MCP_pdgid);
   m_mctree->Branch("MCP_gStatus", &MCP_gStatus);
 
-  m_trktree->Branch("N_SiTrk", &N_SiTrk);
-  m_trktree->Branch("N_TPCTrk", &N_TPCTrk);
-  m_trktree->Branch("N_fullTrk", &N_fullTrk);
-  m_trktree->Branch("N_VTXhit", &N_VTXhit);
-  m_trktree->Branch("N_SIThit", &N_SIThit);
-  m_trktree->Branch("N_TPChit", &N_TPChit);
-  m_trktree->Branch("N_SEThit", &N_SEThit);
-  m_trktree->Branch("N_FTDhit", &N_FTDhit);
-  m_trktree->Branch("N_SITrawhit", &N_SITrawhit);
-  m_trktree->Branch("N_SETrawhit", &N_SETrawhit);
-  m_trktree->Branch("trk_px", &m_trk_px);
-  m_trktree->Branch("trk_py", &m_trk_py);
-  m_trktree->Branch("trk_pz", &m_trk_pz);
-  m_trktree->Branch("trk_p", &m_trk_p);
-  m_trktree->Branch("trk_startpoint_x", &m_trk_startpoint_x);
-  m_trktree->Branch("trk_startpoint_y", &m_trk_startpoint_y);
-  m_trktree->Branch("trk_startpoint_z", &m_trk_startpoint_z);
-  m_trktree->Branch("trk_endpoint_x", &m_trk_endpoint_x);
-  m_trktree->Branch("trk_endpoint_y", &m_trk_endpoint_y);
-  m_trktree->Branch("trk_endpoint_z", &m_trk_endpoint_z);
-  m_trktree->Branch("trk_type", &m_trk_type);
-  m_trktree->Branch("trk_Nhit", &m_trk_Nhit);
+  //m_trktree->Branch("N_VTXhit", &N_VTXhit);
+  //m_trktree->Branch("N_SIThit", &N_SIThit);
+  //m_trktree->Branch("N_TPChit", &N_TPChit);
+  //m_trktree->Branch("N_SEThit", &N_SEThit);
+  //m_trktree->Branch("N_FTDhit", &N_FTDhit);
+  //m_trktree->Branch("N_SITrawhit", &N_SITrawhit);
+  //m_trktree->Branch("N_SETrawhit", &N_SETrawhit);
+  m_sitrktree->Branch("N_SiTrk", &N_SiTrk);
+  m_sitrktree->Branch("N_TPCTrk", &N_TPCTrk);
+  m_sitrktree->Branch("N_fullTrk", &N_fullTrk);
+  m_sitrktree->Branch("trk_px", &m_trk_px);
+  m_sitrktree->Branch("trk_py", &m_trk_py);
+  m_sitrktree->Branch("trk_pz", &m_trk_pz);
+  m_sitrktree->Branch("trk_p", &m_trk_p);
+  m_sitrktree->Branch("trk_Nhit", &m_trk_Nhit);
+  m_sitrktree->Branch("trkstate_d0", &m_trkstate_d0 );
+  m_sitrktree->Branch("trkstate_z0", &m_trkstate_z0 );
+  m_sitrktree->Branch("trkstate_phi", &m_trkstate_phi );
+  m_sitrktree->Branch("trkstate_tanL", &m_trkstate_tanL );
+  m_sitrktree->Branch("trkstate_omega", &m_trkstate_omega );
+  m_sitrktree->Branch("trkstate_kappa", &m_trkstate_kappa );
+  m_sitrktree->Branch("trkstate_refx", &m_trkstate_refx );
+  m_sitrktree->Branch("trkstate_refy", &m_trkstate_refy );
+  m_sitrktree->Branch("trkstate_refz", &m_trkstate_refz );
+  m_sitrktree->Branch("trkstate_tag", &m_trkstate_tag );
+  m_sitrktree->Branch("trkstate_location", &m_trkstate_location );
+  m_sitrktree->Branch("truthMC_tag", &m_truthMC_tag);
+  m_sitrktree->Branch("truthMC_pid", &m_truthMC_pid);
+  m_sitrktree->Branch("truthMC_px", &m_truthMC_px);
+  m_sitrktree->Branch("truthMC_py", &m_truthMC_py);
+  m_sitrktree->Branch("truthMC_pz", &m_truthMC_pz);
+  m_sitrktree->Branch("truthMC_E", &m_truthMC_E);
+  m_sitrktree->Branch("truthMC_EPx", &m_truthMC_EPx);
+  m_sitrktree->Branch("truthMC_EPy", &m_truthMC_EPy);
+  m_sitrktree->Branch("truthMC_EPz", &m_truthMC_EPz);
+  m_sitrktree->Branch("truthMC_weight", &m_truthMC_weight);
+
+  m_tpctrktree->Branch("N_SiTrk", &N_SiTrk);
+  m_tpctrktree->Branch("N_TPCTrk", &N_TPCTrk);
+  m_tpctrktree->Branch("N_fullTrk", &N_fullTrk);
+  m_tpctrktree->Branch("trk_px", &m_trk_px);
+  m_tpctrktree->Branch("trk_py", &m_trk_py);
+  m_tpctrktree->Branch("trk_pz", &m_trk_pz);
+  m_tpctrktree->Branch("trk_p", &m_trk_p);
+  m_tpctrktree->Branch("trk_Nhit", &m_trk_Nhit);
+  m_tpctrktree->Branch("trkstate_d0", &m_trkstate_d0 );
+  m_tpctrktree->Branch("trkstate_z0", &m_trkstate_z0 );
+  m_tpctrktree->Branch("trkstate_phi", &m_trkstate_phi );
+  m_tpctrktree->Branch("trkstate_tanL", &m_trkstate_tanL );
+  m_tpctrktree->Branch("trkstate_omega", &m_trkstate_omega );
+  m_tpctrktree->Branch("trkstate_kappa", &m_trkstate_kappa );
+  m_tpctrktree->Branch("trkstate_refx", &m_trkstate_refx );
+  m_tpctrktree->Branch("trkstate_refy", &m_trkstate_refy );
+  m_tpctrktree->Branch("trkstate_refz", &m_trkstate_refz );
+  m_tpctrktree->Branch("trkstate_tag", &m_trkstate_tag );
+  m_tpctrktree->Branch("trkstate_location", &m_trkstate_location );
+  m_tpctrktree->Branch("truthMC_tag", &m_truthMC_tag);
+  m_tpctrktree->Branch("truthMC_pid", &m_truthMC_pid);
+  m_tpctrktree->Branch("truthMC_px", &m_truthMC_px);
+  m_tpctrktree->Branch("truthMC_py", &m_truthMC_py);
+  m_tpctrktree->Branch("truthMC_pz", &m_truthMC_pz);
+  m_tpctrktree->Branch("truthMC_E", &m_truthMC_E);
+  m_tpctrktree->Branch("truthMC_EPx", &m_truthMC_EPx);
+  m_tpctrktree->Branch("truthMC_EPy", &m_truthMC_EPy);
+  m_tpctrktree->Branch("truthMC_EPz", &m_truthMC_EPz);
+  m_tpctrktree->Branch("truthMC_weight", &m_truthMC_weight);
+
+  m_fulltrktree->Branch("N_SiTrk", &N_SiTrk);
+  m_fulltrktree->Branch("N_TPCTrk", &N_TPCTrk);
+  m_fulltrktree->Branch("N_fullTrk", &N_fullTrk);
+  m_fulltrktree->Branch("trk_px", &m_trk_px);
+  m_fulltrktree->Branch("trk_py", &m_trk_py);
+  m_fulltrktree->Branch("trk_pz", &m_trk_pz);
+  m_fulltrktree->Branch("trk_p", &m_trk_p);
+  m_fulltrktree->Branch("trk_Nhit", &m_trk_Nhit);
+  m_fulltrktree->Branch("trk_type", &m_trk_type);
+  m_fulltrktree->Branch("trkstate_d0", &m_trkstate_d0 );
+  m_fulltrktree->Branch("trkstate_z0", &m_trkstate_z0 );
+  m_fulltrktree->Branch("trkstate_phi", &m_trkstate_phi );
+  m_fulltrktree->Branch("trkstate_tanL", &m_trkstate_tanL );
+  m_fulltrktree->Branch("trkstate_omega", &m_trkstate_omega );
+  m_fulltrktree->Branch("trkstate_kappa", &m_trkstate_kappa );
+  m_fulltrktree->Branch("trkstate_refx", &m_trkstate_refx );
+  m_fulltrktree->Branch("trkstate_refy", &m_trkstate_refy );
+  m_fulltrktree->Branch("trkstate_refz", &m_trkstate_refz );
+  m_fulltrktree->Branch("trkstate_tag", &m_trkstate_tag );
+  m_fulltrktree->Branch("trkstate_location", &m_trkstate_location );
+  m_fulltrktree->Branch("truthMC_tag", &m_truthMC_tag);
+  m_fulltrktree->Branch("truthMC_pid", &m_truthMC_pid);
+  m_fulltrktree->Branch("truthMC_px", &m_truthMC_px);
+  m_fulltrktree->Branch("truthMC_py", &m_truthMC_py);
+  m_fulltrktree->Branch("truthMC_pz", &m_truthMC_pz);
+  m_fulltrktree->Branch("truthMC_E", &m_truthMC_E);
+  m_fulltrktree->Branch("truthMC_EPx", &m_truthMC_EPx);
+  m_fulltrktree->Branch("truthMC_EPy", &m_truthMC_EPy);
+  m_fulltrktree->Branch("truthMC_EPz", &m_truthMC_EPz);
+  m_fulltrktree->Branch("truthMC_weight", &m_truthMC_weight);
 
   return GaudiAlgorithm::initialize();
 }
@@ -106,56 +186,58 @@ StatusCode ReadDigiAlg::execute()
   }catch(GaudiException &e){
     debug()<<"MC Particle is not available "<<endmsg;
   }
+  m_mctree->Fill(); 
 
-  try{
-  if(m_VTXTrackerHitColHdl.get())
-    N_VTXhit = m_VTXTrackerHitColHdl.get()->size();
-  }catch(GaudiException &e){
-    debug()<<"VTX hit is not available "<<endmsg;
-  }
-
-  try{
-  if(m_SITTrackerHitColHdl.get())
-    N_SIThit = m_SITTrackerHitColHdl.get()->size();
-  }catch(GaudiException &e){
-    debug()<<"SIT hit is not available "<<endmsg;
-  }
-
-  try{
-  if(m_TPCTrackerHitColHdl.get())
-    N_TPChit = m_TPCTrackerHitColHdl.get()->size();
-  }catch(GaudiException &e){
-    debug()<<"TPC hit is not available "<<endmsg;
-  }
-
-  try{
-  if(m_SETTrackerHitColHdl.get())
-    N_SEThit = m_SETTrackerHitColHdl.get()->size();
-  }catch(GaudiException &e){
-    debug()<<"SET hit is not available "<<endmsg;
-  }
-
-  try{
-  if(m_FTDSpacePointColHdl.get())
-    N_FTDhit = m_FTDSpacePointColHdl.get()->size();
-  }catch(GaudiException &e){
-    debug()<<"FDT space point is not available "<<endmsg;
-  }
-
-  try{
-  if(m_SITRawColHdl.get())
-    N_SITrawhit = m_SITRawColHdl.get()->size();
-  }catch(GaudiException &e){
-    debug()<<"SIT raw hit is not available "<<endmsg;
-  }
-
-  try{
-  if(m_SETRawColHdl.get())
-    N_SETrawhit = m_SETRawColHdl.get()->size();
-  }catch(GaudiException &e){
-    debug()<<"SET raw hit is not available "<<endmsg;
-  }
+  //try{
+  //if(m_VTXTrackerHitColHdl.get())
+  //  N_VTXhit = m_VTXTrackerHitColHdl.get()->size();
+  //}catch(GaudiException &e){
+  //  debug()<<"VTX hit is not available "<<endmsg;
+  //}
+
+  //try{
+  //if(m_SITTrackerHitColHdl.get())
+  //  N_SIThit = m_SITTrackerHitColHdl.get()->size();
+  //}catch(GaudiException &e){
+  //  debug()<<"SIT hit is not available "<<endmsg;
+  //}
+
+  //try{
+  //if(m_TPCTrackerHitColHdl.get())
+  //  N_TPChit = m_TPCTrackerHitColHdl.get()->size();
+  //}catch(GaudiException &e){
+  //  debug()<<"TPC hit is not available "<<endmsg;
+  //}
+
+  //try{
+  //if(m_SETTrackerHitColHdl.get())
+  //  N_SEThit = m_SETTrackerHitColHdl.get()->size();
+  //}catch(GaudiException &e){
+  //  debug()<<"SET hit is not available "<<endmsg;
+  //}
+
+  //try{
+  //if(m_FTDSpacePointColHdl.get())
+  //  N_FTDhit = m_FTDSpacePointColHdl.get()->size();
+  //}catch(GaudiException &e){
+  //  debug()<<"FDT space point is not available "<<endmsg;
+  //}
+
+  //try{
+  //if(m_SITRawColHdl.get())
+  //  N_SITrawhit = m_SITRawColHdl.get()->size();
+  //}catch(GaudiException &e){
+  //  debug()<<"SIT raw hit is not available "<<endmsg;
+  //}
+
+  //try{
+  //if(m_SETRawColHdl.get())
+  //  N_SETrawhit = m_SETRawColHdl.get()->size();
+  //}catch(GaudiException &e){
+  //  debug()<<"SET raw hit is not available "<<endmsg;
+  //}
 
+  Clear(); 
   try{
   auto const_SiTrkCol = m_SiTrk.get();
   if(const_SiTrkCol){
@@ -164,6 +246,23 @@ StatusCode ReadDigiAlg::execute()
       auto m_trk = const_SiTrkCol->at(i);
       if(m_trk.trackStates_size()==0) continue;
       if(m_trk.trackerHits_size()==0) continue;
+
+      for(int istat=0; istat<m_trk.trackStates_size(); istat++){
+        edm4hep::TrackState m_trkstate = m_trk.getTrackStates(istat);
+
+        m_trkstate_d0.push_back( m_trkstate.D0 );
+        m_trkstate_z0.push_back( m_trkstate.Z0 );
+        m_trkstate_phi.push_back( m_trkstate.phi );
+        m_trkstate_tanL.push_back( m_trkstate.tanLambda );
+        //m_trkstate_kappa.push_back( m_trkstate.Kappa);
+        m_trkstate_omega.push_back( m_trkstate.omega );
+        m_trkstate_refx.push_back( m_trkstate.referencePoint.x );
+        m_trkstate_refy.push_back( m_trkstate.referencePoint.y );
+        m_trkstate_refz.push_back( m_trkstate.referencePoint.z );
+        m_trkstate_location.push_back( m_trkstate.location );
+        m_trkstate_tag.push_back(i);
+      }
+
       edm4hep::TrackState m_trkstate = m_trk.getTrackStates(0);
 
       HelixClassD * TrkInit_Helix = new HelixClassD();
@@ -171,21 +270,11 @@ StatusCode ReadDigiAlg::execute()
       TVector3 TrkMom(TrkInit_Helix->getMomentum()[0],TrkInit_Helix->getMomentum()[1],TrkInit_Helix->getMomentum()[2]);
 
       int NTrkHit = m_trk.trackerHits_size();
-      TVector3 StartPointPos = TVector3((m_trk.getTrackerHits(0)).getPosition().x,(m_trk.getTrackerHits(0)).getPosition().y,(m_trk.getTrackerHits(0)).getPosition().z);
-      TVector3 EndPointPos = TVector3((m_trk.getTrackerHits(NTrkHit - 1)).getPosition().x,(m_trk.getTrackerHits(NTrkHit - 1)).getPosition().y,(m_trk.getTrackerHits(NTrkHit - 1)).getPosition().z);
-
       m_trk_Nhit.push_back(NTrkHit);
       m_trk_px.push_back(TrkMom.x());
       m_trk_py.push_back(TrkMom.y());
       m_trk_pz.push_back(TrkMom.z());
       m_trk_p.push_back(TrkMom.Mag());
-      m_trk_endpoint_x.push_back(EndPointPos.x());
-      m_trk_endpoint_y.push_back(EndPointPos.y());
-      m_trk_endpoint_z.push_back(EndPointPos.z());
-      m_trk_startpoint_x.push_back(StartPointPos.x());
-      m_trk_startpoint_y.push_back(StartPointPos.y());
-      m_trk_startpoint_z.push_back(StartPointPos.z());
-      m_trk_type.push_back(1);
 
       delete TrkInit_Helix;
     }
@@ -193,37 +282,65 @@ StatusCode ReadDigiAlg::execute()
   }catch(GaudiException &e){
     debug()<<"Si track is not available "<<endmsg;
   }  
+  m_sitrktree->Fill();
 
+  Clear(); 
   try{
   auto const_TPCTrkCol = m_TPCTrk.get();
+  auto const_TPCTrkLinkCol = m_TPCTrkAssoHdl.get();
   if(const_TPCTrkCol){
     N_TPCTrk = const_TPCTrkCol->size();
     for(int i=0; i<N_TPCTrk; i++){
       auto m_trk = const_TPCTrkCol->at(i);
       if(m_trk.trackStates_size()==0) continue;
       if(m_trk.trackerHits_size()==0) continue;
+      int NTrkHit = m_trk.trackerHits_size();
+
+      for(int istat=0; istat<m_trk.trackStates_size(); istat++){
+        edm4hep::TrackState m_trkstate = m_trk.getTrackStates(istat);
+
+        m_trkstate_d0.push_back( m_trkstate.D0 );
+        m_trkstate_z0.push_back( m_trkstate.Z0 );
+        m_trkstate_phi.push_back( m_trkstate.phi );
+        m_trkstate_tanL.push_back( m_trkstate.tanLambda );
+        //m_trkstate_kappa.push_back( m_trkstate.Kappa);
+        m_trkstate_omega.push_back( m_trkstate.omega );
+        m_trkstate_refx.push_back( m_trkstate.referencePoint.x );
+        m_trkstate_refy.push_back( m_trkstate.referencePoint.y );
+        m_trkstate_refz.push_back( m_trkstate.referencePoint.z );
+        m_trkstate_location.push_back( m_trkstate.location );
+        m_trkstate_tag.push_back(i);
+      }
+
+      if(const_TPCTrkLinkCol){
+        for(auto iter: *const_TPCTrkLinkCol){
+          if(iter.getRec()==m_trk){
+            edm4hep::MCParticle m_mcp = iter.getSim();
+            m_truthMC_pid.push_back(m_mcp.getPDG());
+            m_truthMC_px.push_back(m_mcp.getMomentum().x);
+            m_truthMC_py.push_back(m_mcp.getMomentum().y);
+            m_truthMC_pz.push_back(m_mcp.getMomentum().z);
+            m_truthMC_E.push_back(m_mcp.getEnergy());
+            m_truthMC_EPx.push_back(m_mcp.getEndpoint().x);
+            m_truthMC_EPy.push_back(m_mcp.getEndpoint().y);
+            m_truthMC_EPz.push_back(m_mcp.getEndpoint().z);
+            m_truthMC_weight.push_back(iter.getWeight()/NTrkHit);
+            m_truthMC_tag.push_back(i);
+          }
+        }
+      }
+
       edm4hep::TrackState m_trkstate = m_trk.getTrackStates(0);
 
       HelixClassD * TrkInit_Helix = new HelixClassD();
       TrkInit_Helix->Initialize_Canonical(m_trkstate.phi, m_trkstate.D0, m_trkstate.Z0, m_trkstate.omega, m_trkstate.tanLambda, _Bfield);
       TVector3 TrkMom(TrkInit_Helix->getMomentum()[0],TrkInit_Helix->getMomentum()[1],TrkInit_Helix->getMomentum()[2]);
 
-      int NTrkHit = m_trk.trackerHits_size();
-      TVector3 StartPointPos = TVector3((m_trk.getTrackerHits(0)).getPosition().x,(m_trk.getTrackerHits(0)).getPosition().y,(m_trk.getTrackerHits(0)).getPosition().z);
-      TVector3 EndPointPos = TVector3((m_trk.getTrackerHits(NTrkHit - 1)).getPosition().x,(m_trk.getTrackerHits(NTrkHit - 1)).getPosition().y,(m_trk.getTrackerHits(NTrkHit - 1)).getPosition().z);
-
       m_trk_Nhit.push_back(NTrkHit);
       m_trk_px.push_back(TrkMom.x());
       m_trk_py.push_back(TrkMom.y());
       m_trk_pz.push_back(TrkMom.z());
       m_trk_p.push_back(TrkMom.Mag());
-      m_trk_endpoint_x.push_back(EndPointPos.x());
-      m_trk_endpoint_y.push_back(EndPointPos.y());
-      m_trk_endpoint_z.push_back(EndPointPos.z());
-      m_trk_startpoint_x.push_back(StartPointPos.x());
-      m_trk_startpoint_y.push_back(StartPointPos.y());
-      m_trk_startpoint_z.push_back(StartPointPos.z());
-      m_trk_type.push_back(2);
 
       delete TrkInit_Helix;
     }
@@ -231,45 +348,93 @@ StatusCode ReadDigiAlg::execute()
   }catch(GaudiException &e){
     debug()<<"TPC track is not available "<<endmsg;
   }
+  m_tpctrktree->Fill();
 
 
+  Clear(); 
   try{
   auto const_fullTrkCol = m_fullTrk.get();
+  auto const_fullTrkLinkCol = m_fullTrkAssoHdl.get();
   if(const_fullTrkCol){
     N_fullTrk = const_fullTrkCol->size();
     for(int i=0; i<N_fullTrk; i++){
       auto m_trk = const_fullTrkCol->at(i);
       if(m_trk.trackStates_size()==0) continue;
       if(m_trk.trackerHits_size()==0) continue;
-      edm4hep::TrackState m_trkstate = m_trk.getTrackStates(0);
+      int NTrkHit = m_trk.trackerHits_size();
 
-      HelixClassD * TrkInit_Helix = new HelixClassD();
-      TrkInit_Helix->Initialize_Canonical(m_trkstate.phi, m_trkstate.D0, m_trkstate.Z0, m_trkstate.omega, m_trkstate.tanLambda, _Bfield);
-      TVector3 TrkMom(TrkInit_Helix->getMomentum()[0],TrkInit_Helix->getMomentum()[1],TrkInit_Helix->getMomentum()[2]);   
+      for(int istat=0; istat<m_trk.trackStates_size(); istat++){
+        edm4hep::TrackState m_trkstate = m_trk.getTrackStates(istat);
+
+        m_trkstate_d0.push_back( m_trkstate.D0 );
+        m_trkstate_z0.push_back( m_trkstate.Z0 );
+        m_trkstate_phi.push_back( m_trkstate.phi );
+        m_trkstate_tanL.push_back( m_trkstate.tanLambda );
+        //m_trkstate_kappa.push_back( m_trkstate.Kappa);
+        m_trkstate_omega.push_back( m_trkstate.omega );
+        m_trkstate_refx.push_back( m_trkstate.referencePoint.x );
+        m_trkstate_refy.push_back( m_trkstate.referencePoint.y );
+        m_trkstate_refz.push_back( m_trkstate.referencePoint.z );
+        m_trkstate_location.push_back( m_trkstate.location );
+        m_trkstate_tag.push_back(i);
+      }
+
+      int NSihit = 0;
+      int NTPChit = 0;
+      int Nelse = 0;
+      for(int ihit=0; ihit<NTrkHit; ihit++){
+        auto m_hit = m_trk.getTrackerHits(ihit);
+        if(m_hit.getType()==8) NSihit++;
+        else if(m_hit.getType()==0) NTPChit++;
+        else Nelse++;
+      }
+      //cout<<"In track #"<<i<<": Nhit "<<NTrkHit<<", Si Hit "<<NSihit<<", TPC hit "<<NTPChit<<", else "<<Nelse<<endl;
+
+      if(const_fullTrkLinkCol){
+        for(auto iter: *const_fullTrkLinkCol){
+          if(iter.getRec()==m_trk){
+            edm4hep::MCParticle m_mcp = iter.getSim();
+            m_truthMC_pid.push_back(m_mcp.getPDG());
+            m_truthMC_px.push_back(m_mcp.getMomentum().x);
+            m_truthMC_py.push_back(m_mcp.getMomentum().y);
+            m_truthMC_pz.push_back(m_mcp.getMomentum().z);
+            m_truthMC_E.push_back(m_mcp.getEnergy());
+            m_truthMC_EPx.push_back(m_mcp.getEndpoint().x);
+            m_truthMC_EPy.push_back(m_mcp.getEndpoint().y);
+            m_truthMC_EPz.push_back(m_mcp.getEndpoint().z);
+            m_truthMC_weight.push_back(iter.getWeight()/NTrkHit);
+            m_truthMC_tag.push_back(i);
+          }
+        }
+      }
 
-      int NTrkHit = m_trk.trackerHits_size();
-      TVector3 StartPointPos = TVector3((m_trk.getTrackerHits(0)).getPosition().x,(m_trk.getTrackerHits(0)).getPosition().y,(m_trk.getTrackerHits(0)).getPosition().z);
-      TVector3 EndPointPos = TVector3((m_trk.getTrackerHits(NTrkHit - 1)).getPosition().x,(m_trk.getTrackerHits(NTrkHit - 1)).getPosition().y,(m_trk.getTrackerHits(NTrkHit - 1)).getPosition().z);
+      edm4hep::TrackState m_trkstate = m_trk.getTrackStates(0);
+      if(m_trkstate.location!=1){
+        std::cout<<"ERROR: first track state is not IP! Will use this for track momentum "<<std::endl;
+      }
+
+      double m_pt = (0.299792458*_Bfield)/fabs(m_trkstate.omega*1000.);
+      double m_phi = m_trkstate.phi;
+      double m_pz = m_trkstate.tanLambda * m_pt;
+      TVector3 TrkMom(m_pt*cos(m_phi), m_pt*sin(m_phi), m_pz);
+      //HelixClassD * TrkInit_Helix = new HelixClassD();
+      //TrkInit_Helix->Initialize_Canonical(m_trkstate.phi, m_trkstate.D0, m_trkstate.Z0, m_trkstate.omega, m_trkstate.tanLambda, _Bfield);
+      //TVector3 TrkMom(TrkInit_Helix->getMomentum()[0],TrkInit_Helix->getMomentum()[1],TrkInit_Helix->getMomentum()[2]);
 
       m_trk_Nhit.push_back(NTrkHit);
+      m_trk_type.push_back(m_trk.getType());
       m_trk_px.push_back(TrkMom.x());
       m_trk_py.push_back(TrkMom.y());
       m_trk_pz.push_back(TrkMom.z());
       m_trk_p.push_back(TrkMom.Mag());
-      m_trk_endpoint_x.push_back(EndPointPos.x());
-      m_trk_endpoint_y.push_back(EndPointPos.y());
-      m_trk_endpoint_z.push_back(EndPointPos.z());
-      m_trk_startpoint_x.push_back(StartPointPos.x());
-      m_trk_startpoint_y.push_back(StartPointPos.y());
-      m_trk_startpoint_z.push_back(StartPointPos.z());
-      m_trk_type.push_back(3);
 
-      delete TrkInit_Helix;
+      //delete TrkInit_Helix;
     }
   }
   }catch(GaudiException &e){
     debug()<<"Full track is not available "<<endmsg;
   }
+  m_fulltrktree->Fill();
 
 /*  const edm4hep::SimCalorimeterHitCollection* ECalBHitCol = m_ECalBarrelHitCol.get();
   Nhit_EcalB = ECalBHitCol->size();
@@ -330,8 +495,6 @@ StatusCode ReadDigiAlg::execute()
   }
 */
 
-  m_mctree->Fill(); 
-  m_trktree->Fill();
   _nEvt++; 
   return StatusCode::SUCCESS;
 }
@@ -341,7 +504,9 @@ StatusCode ReadDigiAlg::finalize()
   debug() << "begin finalize ReadDigiAlg" << endmsg;
   m_wfile->cd();
   m_mctree->Write();
-  m_trktree->Write();
+  m_sitrktree->Write();
+  m_tpctrktree->Write();
+  m_fulltrktree->Write();
   m_wfile->Close(); 
 
   return GaudiAlgorithm::finalize();
@@ -364,25 +529,40 @@ StatusCode ReadDigiAlg::Clear()
   N_SiTrk = -99;
   N_TPCTrk = -99;
   N_fullTrk = -99;
-  N_VTXhit = -99; 
-  N_SIThit = -99; 
-  N_TPChit = -99; 
-  N_SEThit = -99; 
-  N_FTDhit = -99; 
-  N_SITrawhit = -99;
-  N_SETrawhit = -99;
+  //N_VTXhit = -99; 
+  //N_SIThit = -99; 
+  //N_TPChit = -99; 
+  //N_SEThit = -99; 
+  //N_FTDhit = -99; 
+  //N_SITrawhit = -99;
+  //N_SETrawhit = -99;
   m_trk_px.clear(); 
   m_trk_py.clear(); 
   m_trk_pz.clear();
   m_trk_p.clear(); 
-  m_trk_endpoint_x.clear();
-  m_trk_endpoint_y.clear();
-  m_trk_endpoint_z.clear();
-  m_trk_startpoint_x.clear();
-  m_trk_startpoint_y.clear();
-  m_trk_startpoint_z.clear();
-  m_trk_type.clear(); 
   m_trk_Nhit.clear();
+  m_trk_type.clear();
+  m_trkstate_d0.clear();
+  m_trkstate_z0.clear();
+  m_trkstate_phi.clear();
+  m_trkstate_tanL.clear();
+  m_trkstate_omega.clear();
+  m_trkstate_kappa.clear();
+  m_trkstate_refx.clear();
+  m_trkstate_refy.clear();
+  m_trkstate_refz.clear();
+  m_trkstate_tag.clear();
+  m_trkstate_location.clear();
+  m_truthMC_tag.clear();
+  m_truthMC_pid.clear();
+  m_truthMC_px.clear();
+  m_truthMC_py.clear();
+  m_truthMC_pz.clear();
+  m_truthMC_E.clear();
+  m_truthMC_EPx.clear();
+  m_truthMC_EPy.clear();
+  m_truthMC_EPz.clear();
+  m_truthMC_weight.clear();
 
   return StatusCode::SUCCESS;
 }
diff --git a/Analysis/ReadDigi/src/ReadDigiAlg.h b/Analysis/ReadDigi/src/ReadDigiAlg.h
index abfcb759..ea79a581 100644
--- a/Analysis/ReadDigi/src/ReadDigiAlg.h
+++ b/Analysis/ReadDigi/src/ReadDigiAlg.h
@@ -9,6 +9,7 @@
 #include "edm4hep/TrackerHitCollection.h"
 #include "edm4hep/TrackCollection.h"
 #include "edm4hep/SimCalorimeterHitCollection.h"
+#include "edm4hep/MCRecoTrackParticleAssociationCollection.h"
 #include "HelixClassD.hh"
 
 #include "TFile.h"
@@ -32,20 +33,23 @@ public :
 private :
   DataHandle<edm4hep::MCParticleCollection> m_MCParticleCol{"MCParticle", Gaudi::DataHandle::Reader, this};
 
-  DataHandle<edm4hep::TrackerHitCollection> m_SITRawColHdl{"SITTrackerHits", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackerHitCollection> m_SETRawColHdl{"SETTrackerHits", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackerHitCollection> m_FTDRawColHdl{"FTDStripTrackerHits", Gaudi::DataHandle::Reader, this};  
+  //DataHandle<edm4hep::TrackerHitCollection> m_SITRawColHdl{"SITTrackerHits", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_SETRawColHdl{"SETTrackerHits", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_FTDRawColHdl{"FTDStripTrackerHits", Gaudi::DataHandle::Reader, this};  
 
-  DataHandle<edm4hep::TrackerHitCollection> m_VTXTrackerHitColHdl{"VTXTrackerHits", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackerHitCollection> m_SITTrackerHitColHdl{"SITSpacePoints", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackerHitCollection> m_TPCTrackerHitColHdl{"TPCTrackerHits", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackerHitCollection> m_SETTrackerHitColHdl{"SETSpacePoints", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackerHitCollection> m_FTDSpacePointColHdl{"FTDSpacePoints", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackerHitCollection> m_FTDPixelTrackerHitColHdl{"FTDPixelTrackerHits", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_VTXTrackerHitColHdl{"VTXTrackerHits", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_SITTrackerHitColHdl{"SITSpacePoints", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_TPCTrackerHitColHdl{"TPCTrackerHits", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_SETTrackerHitColHdl{"SETSpacePoints", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_FTDSpacePointColHdl{"FTDSpacePoints", Gaudi::DataHandle::Reader, this};
+  //DataHandle<edm4hep::TrackerHitCollection> m_FTDPixelTrackerHitColHdl{"FTDPixelTrackerHits", Gaudi::DataHandle::Reader, this};
 
   DataHandle<edm4hep::TrackCollection>      m_SiTrk{"SiTracks", Gaudi::DataHandle::Reader, this};
   DataHandle<edm4hep::TrackCollection>      m_TPCTrk{"ClupatraTracks", Gaudi::DataHandle::Reader, this};
-  DataHandle<edm4hep::TrackCollection>      m_fullTrk{"MarlinTrkTracks", Gaudi::DataHandle::Reader, this};
+  DataHandle<edm4hep::TrackCollection>      m_fullTrk{"CompleteTracks", Gaudi::DataHandle::Reader, this};
+
+  DataHandle<edm4hep::MCRecoTrackParticleAssociationCollection> m_TPCTrkAssoHdl{"ClupatraTracksParticleAssociation",  Gaudi::DataHandle::Reader, this};
+  DataHandle<edm4hep::MCRecoTrackParticleAssociationCollection> m_fullTrkAssoHdl{"CompleteTracksParticleAssociation",  Gaudi::DataHandle::Reader, this};
 
   //DataHandle<edm4hep::SimCalorimeterHitCollection> m_ECalBarrelHitCol{"EcalBarrelCollection", Gaudi::DataHandle::Reader, this};
   //DataHandle<edm4hep::SimCalorimeterHitCollection> m_ECalEndcapHitCol{"EcalEndcapCollection", Gaudi::DataHandle::Reader, this};
@@ -62,7 +66,7 @@ private :
 
   int _nEvt; 
   TFile *m_wfile;
-  TTree *m_mctree, *m_trktree;
+  TTree *m_mctree, *m_sitrktree, *m_tpctrktree, *m_fulltrktree;
 
   //MCParticle
   int N_MCP;
@@ -71,10 +75,13 @@ private :
 
   //Tracker 
   int N_SiTrk, N_TPCTrk, N_fullTrk;
-  int N_VTXhit, N_SIThit, N_TPChit, N_SEThit, N_FTDhit, N_SITrawhit, N_SETrawhit;
+  //int N_VTXhit, N_SIThit, N_TPChit, N_SEThit, N_FTDhit, N_SITrawhit, N_SETrawhit;
   FloatVec m_trk_px, m_trk_py, m_trk_pz, m_trk_p;
-  FloatVec m_trk_endpoint_x, m_trk_endpoint_y, m_trk_endpoint_z, m_trk_startpoint_x, m_trk_startpoint_y, m_trk_startpoint_z;
-  IntVec m_trk_type, m_trk_Nhit; 
+  FloatVec m_trkstate_d0, m_trkstate_z0, m_trkstate_phi, m_trkstate_tanL, m_trkstate_omega, m_trkstate_kappa;
+  FloatVec m_trkstate_refx, m_trkstate_refy, m_trkstate_refz;
+  IntVec m_trkstate_tag, m_trkstate_location, m_trk_Nhit, m_trk_type;
+  FloatVec m_truthMC_tag, m_truthMC_pid, m_truthMC_px, m_truthMC_py, m_truthMC_pz, m_truthMC_E;
+  FloatVec m_truthMC_EPx, m_truthMC_EPy, m_truthMC_EPz, m_truthMC_weight;
 
 
   //ECal
diff --git a/Reconstruction/RecPFACyber/script/digi.py b/Reconstruction/RecPFACyber/script/digi.py
index a7736873..c3ea459f 100644
--- a/Reconstruction/RecPFACyber/script/digi.py
+++ b/Reconstruction/RecPFACyber/script/digi.py
@@ -3,7 +3,7 @@ import os
 from Gaudi.Configuration import *
 
 from Configurables import k4DataSvc
-dsvc = k4DataSvc("EventDataSvc", input="Tracking_TDR_o1_v01_E240_nnHgg.root")
+dsvc = k4DataSvc("EventDataSvc", input="Sim_TDR_o1_v01.root")
 
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 seed = [12340]
@@ -52,8 +52,6 @@ podioinput = PodioInput("PodioReader", collections=[
     "EcalBarrelContributionCollection", 
     "HcalBarrelCollection", 
     "HcalBarrelContributionCollection", 
-    "CompleteTracks", 
-    "CompleteTracksParticleAssociation"
     ])
 
 ########## Digitalization ################
@@ -75,7 +73,7 @@ EcalDigi.TimeResolution = 0.5        #unit: ns
 EcalDigi.ChargeThresholdFrac = 0.05
 EcalDigi.EcalMIP_Thre = 0.05
 EcalDigi.Debug=1
-EcalDigi.WriteNtuple = 1
+EcalDigi.WriteNtuple = 0
 EcalDigi.OutFileName = "Digi_ECAL.root"
 #########################################
 
@@ -108,22 +106,33 @@ HcalDigi.ADCBaselineSigmaLG = 0.
 HcalDigi.ADCHLRatio = 1
 HcalDigi.ADCSwitch = 1e7
 HcalDigi.ADCLimit = 1e7
-HcalDigi.WriteNtuple = 1
+HcalDigi.WriteNtuple = 0
 HcalDigi.OutFileName = "Digi_HCAL.root"
 
 
 # output
 from Configurables import PodioOutput
 out = PodioOutput("outputalg")
-out.filename = "CaloDigi_TDR_o1_v01_E240_nnHgg.root"
-out.outputCommands = ["keep *"]
+out.filename = "CaloDigi_TDR_o1_v01.root"
+out.outputCommands = ["drop *", 
+    "keep MCParticle",
+    "keep VXDCollection",
+    "keep SITCollection",
+    "keep TPCCollection",
+    "keep OTKBarrelCollection",
+    "keep FTDCollection",
+    "keep ECALBarrel",
+    "keep HCALBarrel",
+    "keep ECALBarrelParticleAssoCol",
+    "keep HCALBarrelParticleAssoCol" ]
+
 
 # ApplicationMgr
 from Configurables import ApplicationMgr
 mgr = ApplicationMgr(
     TopAlg = [podioinput, EcalDigi, HcalDigi, out],
     EvtSel = 'NONE',
-    EvtMax = 3,
+    EvtMax = 10,
     ExtSvc = [dsvc, rndmengine, rndmgensvc, geosvc],
     HistogramPersistency = 'ROOT',
     OutputLevel = ERROR
diff --git a/Reconstruction/RecPFACyber/script/rec.py b/Reconstruction/RecPFACyber/script/rec.py
index 6e273e20..e844f945 100644
--- a/Reconstruction/RecPFACyber/script/rec.py
+++ b/Reconstruction/RecPFACyber/script/rec.py
@@ -20,7 +20,7 @@ geomsvc.compact = geometry_path
 
 ########### k4DataSvc ####################
 from Configurables import k4DataSvc
-podioevent = k4DataSvc("EventDataSvc", input="CaloDigi_TDR_o1_v01_E240_nnHgg.root")
+podioevent = k4DataSvc("EventDataSvc", input="Tracking_TDR_o1_v01.root")
 ##########################################
 
 ########## CEPCSWData ################# 
@@ -36,12 +36,8 @@ crystalecalcorr.CorrectionFile = os.path.join(cepcswdatatop, "CEPCSWData/offline
 ########## Podio Input ###################
 from Configurables import PodioInput
 inp = PodioInput("InputReader")
-inp.collections = [ "EcalBarrelCollection",
-                    "EcalBarrelContributionCollection",  
-                    "ECALBarrel", 
+inp.collections = [ "ECALBarrel", 
                     "ECALBarrelParticleAssoCol",
-                    "HcalBarrelCollection", 
-                    "HcalBarrelContributionCollection", 
                     "HCALBarrel",
                     "HCALBarrelParticleAssoCol",
                     "MCParticle", 
@@ -58,7 +54,7 @@ CyberPFAlg.BField = 3.
 CyberPFAlg.Debug = 0
 CyberPFAlg.SkipEvt = 0
 CyberPFAlg.WriteAna = 1
-CyberPFAlg.AnaFileName = "RecAnaTuple_TDR_o1_v01_E240_nnHgg.root"
+CyberPFAlg.AnaFileName = "RecAnaTuple_TDR_o1_v01_mu.root"
 CyberPFAlg.UseTruthTrack = 0
 CyberPFAlg.EcalGlobalCalib = 1.05
 CyberPFAlg.HcalGlobalCalib = 4.5
@@ -133,7 +129,7 @@ CyberPFAlg.AlgParValues = [ ["BarCol","Cluster1DCol","HalfClusterCol"],#1
 ##############################################################################
 from Configurables import PodioOutput
 out = PodioOutput("outputalg")
-out.filename = "Rec_TDR_o1_v01_E240_nnHgg.root"
+out.filename = "Rec_TDR_o1_v01.root"
 out.outputCommands = ["keep *"]
 
 
@@ -143,7 +139,7 @@ from Configurables import ApplicationMgr
 ApplicationMgr( 
     TopAlg=[inp, CyberPFAlg, out ],
     EvtSel="NONE",
-    EvtMax=3,
+    EvtMax=10,
     ExtSvc=[podioevent, geomsvc],
     #OutputLevel=DEBUG
 )
diff --git a/Reconstruction/RecPFACyber/script/sim.py b/Reconstruction/RecPFACyber/script/sim.py
index 57639491..a8b14c52 100644
--- a/Reconstruction/RecPFACyber/script/sim.py
+++ b/Reconstruction/RecPFACyber/script/sim.py
@@ -42,16 +42,16 @@ from Configurables import HepMCRdr
 from Configurables import GenPrinter
 
 #gun = GtGunTool("GtGunTool")
-#gun.PositionXs = [0]
-#gun.PositionYs = [0]
-#gun.PositionZs = [0]
-#gun.Particles = ["pi-"]
-#gun.EnergyMins = [10]
-#gun.EnergyMaxs = [10]
-#gun.ThetaMins  = [60]
-#gun.ThetaMaxs  = [120]
-#gun.PhiMins    = [0]
-#gun.PhiMaxs    = [360]
+#gun.PositionXs = [0, 0]
+#gun.PositionYs = [0, 0]
+#gun.PositionZs = [0, 0]
+#gun.Particles = ["mu-", "mu+"]
+#gun.EnergyMins = [5, 10]
+#gun.EnergyMaxs = [5, 10]
+#gun.ThetaMins  = [60, 60]
+#gun.ThetaMaxs  = [120, 120]
+#gun.PhiMins    = [0, 0]
+#gun.PhiMaxs    = [360, 360]
 #genprinter = GenPrinter("GenPrinter")
 
 stdheprdr = StdHepRdr("StdHepRdr")
@@ -97,7 +97,7 @@ cal_sensdettool.CalNamesMergeDisable = ["EcalBarrel", "CaloDetectorEndcap", "Hca
 # output
 from Configurables import PodioOutput
 out = PodioOutput("outputalg")
-out.filename = "Sim_TDR_o1_v01_E240_nnHgg.root"
+out.filename = "Sim_TDR_o1_v01.root"
 out.outputCommands = ["keep *"]
 
 # ApplicationMgr
@@ -105,7 +105,7 @@ from Configurables import ApplicationMgr
 mgr = ApplicationMgr(
     TopAlg = [genalg, detsimalg, out],
     EvtSel = 'NONE',
-    EvtMax = 3,
+    EvtMax = 10,
     ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc],
     HistogramPersistency = 'ROOT',
     OutputLevel = INFO
diff --git a/Reconstruction/RecPFACyber/script/tracking.py b/Reconstruction/RecPFACyber/script/tracking.py
index a6d7538f..7e07f554 100644
--- a/Reconstruction/RecPFACyber/script/tracking.py
+++ b/Reconstruction/RecPFACyber/script/tracking.py
@@ -3,7 +3,7 @@ import os
 from Gaudi.Configuration import *
 
 from Configurables import k4DataSvc
-dsvc = k4DataSvc("EventDataSvc", input="Sim_TDR_o1_v01_E240_nnHgg.root")
+dsvc = k4DataSvc("EventDataSvc", input="CaloDigi_TDR_o1_v01.root")
 
 from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_
 seed = [12340]
@@ -51,7 +51,6 @@ podioinput = PodioInput("PodioReader", collections=[
     "VXDCollection",
     "SITCollection",
     "TPCCollection",
-#    "SETCollection",
     "OTKBarrelCollection",
     "FTDCollection"
     ])
@@ -249,18 +248,34 @@ tmt.MuonTagEfficiency = 0.95 # muon true tag efficiency, default is 1.0 (100%)
 tmt.MuonDetTanTheta = 1.2 # muon det barrel/endcap separation tan(theta)
 #tmt.OutputLevel = DEBUG
 
+from Configurables import ReadDigiAlg
+readtrk = ReadDigiAlg("ReadDigiAlg")
+readtrk.SiTracks = "SubsetTracks"
+readtrk.TPCTracks = "ClupatraTracks"
+readtrk.FullTracks = "CompleteTracks"
+readtrk.TPCTracksAssociation = "ClupatraTracksParticleAssociation"
+readtrk.FullTracksAssociation = "CompleteTracksParticleAssociation"
+readtrk.OutFileName = "TrackAnaTuple_mu.root"
+
 # output
 from Configurables import PodioOutput
 out = PodioOutput("outputalg")
-out.filename = "Tracking_TDR_o1_v01_E240_nnHgg.root"
-out.outputCommands = ["keep *"]
+out.filename = "Tracking_TDR_o1_v01.root"
+out.outputCommands = ["drop *",
+  "keep ECALBarrel",
+  "keep ECALBarrelParticleAssoCol",
+  "keep HCALBarrel",
+  "keep HCALBarrelParticleAssoCol",
+  "keep MCParticle",
+  "keep CompleteTracks",
+  "keep CompleteTracksParticleAssociation" ]
 
 # ApplicationMgr
 from Configurables import ApplicationMgr
 mgr = ApplicationMgr(
-    TopAlg = [podioinput, digiVXD, digiSIT, digiSET, digiFTD, digiTPC, tracking, forward, subset, clupatra, full, tpr, tpc_dndx, tmt, out],
+    TopAlg = [podioinput, digiVXD, digiSIT, digiSET, digiFTD, digiTPC, tracking, forward, subset, clupatra, full, tpr, tpc_dndx, tmt, readtrk, out],
     EvtSel = 'NONE',
-    EvtMax = 3,
+    EvtMax = 10,
     ExtSvc = [rndmengine, rndmgensvc, dsvc, evtseeder, geosvc, gearsvc, tracksystemsvc, pidsvc],
     #HistogramPersistency = 'ROOT',
     OutputLevel = INFO
diff --git a/Reconstruction/RecPFACyber/src/Objects/Track.cc b/Reconstruction/RecPFACyber/src/Objects/Track.cc
index 204f3e3e..1d67ef0b 100644
--- a/Reconstruction/RecPFACyber/src/Objects/Track.cc
+++ b/Reconstruction/RecPFACyber/src/Objects/Track.cc
@@ -42,7 +42,7 @@ namespace Cyber{
     std::vector<TrackState> trkStates = getTrackStates("Input");
     float d0 = -99.;
     for(auto it: trkStates){
-      if(it.location==4 || it.location==1){  //Calorimeter(for real track) or IP (for truth track)
+      if(it.location==Cyber::TrackState::AtIP){
         d0 = it.D0;
       }
     }
@@ -54,7 +54,7 @@ namespace Cyber{
     std::vector<TrackState> trkStates = getTrackStates("Input");
     float z0 = -99.;
     for(auto it: trkStates){
-      if(it.location==4 || it.location==1){  //Calorimeter(for real track) or IP (for truth track)
+      if(it.location==Cyber::TrackState::AtIP){
         z0 = it.Z0;
       }
     }
@@ -67,7 +67,7 @@ namespace Cyber{
     std::vector<TrackState> trkStates = getTrackStates("Input");
     float pt = -99.;
     for(auto it: trkStates){
-      if(it.location==4 || it.location==1){  //Calorimeter(for real track) or IP (for truth track)
+      if(it.location==Cyber::TrackState::AtIP){ 
         pt = 1./fabs(it.Kappa);
       }
     }
@@ -79,7 +79,7 @@ namespace Cyber{
     std::vector<TrackState> trkStates = getTrackStates("Input");
     float pz = -99.;
     for(auto it: trkStates){
-      if( (m_type!=0 && it.location==4) || (m_type==0 && it.location==1)){ //Calorimeter(for real track) or IP (for truth track)
+      if( it.location==Cyber::TrackState::AtIP ){
         pz = it.tanLambda/fabs(it.Kappa);
       }
     }
@@ -93,7 +93,7 @@ namespace Cyber{
     float pt = -99.;
     float pz = -99.;
     for(auto it: trkStates){
-      if((m_type!=0 && it.location==4) || (m_type==0 && it.location==1)){  //Calorimeter(for real track) or IP (for truth track)
+      if(it.location==Cyber::TrackState::AtIP){ 
         pt = 1./fabs(it.Kappa);
         phi = it.phi0;
         pz = it.tanLambda/fabs(it.Kappa);
@@ -108,7 +108,7 @@ namespace Cyber{
     std::vector<TrackState> trkStates = getTrackStates("Input");
     float omega = -99.;
     for(auto it: trkStates){
-      if((m_type!=0 && it.location==4) || (m_type==0 && it.location==1)){ //Calorimeter(for real track) or IP (for truth track)
+      if(it.location==Cyber::TrackState::AtIP){ 
         omega = it.Omega;
       }
     }
-- 
GitLab