From a7838ddff0151a7ad6e974d4fe695d0e248fe422 Mon Sep 17 00:00:00 2001
From: Mingrui Zhao <mingrui.zhao@mail.labz0.org>
Date: Thu, 17 Sep 2020 21:40:10 +0800
Subject: [PATCH] Correct data type

---
 Utilities/DataHelper/DataHelper/Navigation.h  |   4 +-
 .../DataHelper/DataHelper/TrackExtended.h     |   7 +-
 .../DataHelper/DataHelper/TrackHitPair.h      |  38 +++
 .../DataHelper/TrackerHitExtended.h           |   8 +-
 Utilities/DataHelper/src/Navigation.cpp       |   8 +-
 Utilities/DataHelper/src/TrackExtended.cc     |   4 +-
 Utilities/DataHelper/src/TrackHitPair.cc      |  34 ++
 .../DataHelper/src/TrackerHitExtended.cc      |   8 +-
 .../KalDet/cmake/MacroCheckPackageLibs.cmake  | 164 +++++++++
 .../cmake/MacroCheckPackageVersion.cmake      | 108 ++++++
 Utilities/KalDet/cmake/MacroRootDict.cmake    | 145 ++++++++
 Utilities/KalDet/cmake/MyFindROOT.cmake       | 316 ++++++++++++++++++
 Utilities/KalDet/kaldet/EXVKalDetector.h      |   4 +-
 Utilities/KalDet/kaldet/ILDConeMeasLayer.h    |   2 +-
 Utilities/KalDet/kaldet/ILDCylinderHit.h      |   2 +-
 .../KalDet/kaldet/ILDCylinderMeasLayer.h      |   2 +-
 Utilities/KalDet/kaldet/ILDDiscMeasLayer.h    |   2 +-
 .../kaldet/ILDParallelPlanarStripMeasLayer.h  |   2 +-
 Utilities/KalDet/kaldet/ILDPlanarHit.h        |   2 +-
 Utilities/KalDet/kaldet/ILDPlanarMeasLayer.h  |   2 +-
 Utilities/KalDet/kaldet/ILDPlanarStripHit.h   |   2 +-
 .../KalDet/kaldet/ILDPolygonBarrelMeasLayer.h |   2 +-
 .../KalDet/kaldet/ILDRotatedTrapMeaslayer.h   |   2 +-
 .../KalDet/kaldet/ILDSegmentedDiscMeasLayer.h |   2 +-
 .../kaldet/ILDSegmentedDiscStripMeasLayer.h   |   2 +-
 Utilities/KalDet/kaldet/ILDVMeasLayer.h       |   3 +-
 Utilities/KalDet/kaldet/ILDVTrackHit.h        |   6 +-
 Utilities/KalDet/src/gen/EXEventGen.cxx       |   4 +-
 .../KalDet/src/ild/common/ILDConeMeasLayer.h  |   2 +-
 .../KalDet/src/ild/common/ILDCylinderHit.h    |   2 +-
 .../src/ild/common/ILDCylinderMeasLayer.cc    |  18 +-
 .../src/ild/common/ILDCylinderMeasLayer.h     |   2 +-
 .../KalDet/src/ild/common/ILDDiscMeasLayer.cc |  24 +-
 .../KalDet/src/ild/common/ILDDiscMeasLayer.h  |   2 +-
 .../common/ILDParallelPlanarStripMeasLayer.cc |  20 +-
 .../common/ILDParallelPlanarStripMeasLayer.h  |   2 +-
 .../KalDet/src/ild/common/ILDPlanarHit.h      |   2 +-
 .../src/ild/common/ILDPlanarMeasLayer.cc      |  24 +-
 .../src/ild/common/ILDPlanarMeasLayer.h       |   2 +-
 .../KalDet/src/ild/common/ILDPlanarStripHit.h |   2 +-
 .../ild/common/ILDPolygonBarrelMeasLayer.cc   |   4 +-
 .../ild/common/ILDPolygonBarrelMeasLayer.h    |   2 +-
 .../src/ild/common/ILDRotatedTrapMeaslayer.cc |  10 +-
 .../src/ild/common/ILDRotatedTrapMeaslayer.h  |   2 +-
 .../ild/common/ILDSegmentedDiscMeasLayer.cc   | 126 +++----
 .../ild/common/ILDSegmentedDiscMeasLayer.h    |   2 +-
 .../common/ILDSegmentedDiscStripMeasLayer.cc  | 136 ++++----
 .../common/ILDSegmentedDiscStripMeasLayer.h   |   2 +-
 .../KalDet/src/ild/common/ILDVMeasLayer.h     |   3 +-
 .../KalDet/src/ild/common/ILDVTrackHit.h      |   6 +-
 .../lctpc/gearTPC/GearTPCCylinderMeasLayer.h  |   2 +-
 .../KalTest/cmake/MacroCheckPackageLibs.cmake | 164 +++++++++
 .../cmake/MacroCheckPackageVersion.cmake      | 108 ++++++
 Utilities/KalTest/cmake/MacroRootDict.cmake   | 145 ++++++++
 Utilities/KalTest/cmake/MyFindROOT.cmake      | 316 ++++++++++++++++++
 Utilities/KiTrack/Tools/KiTrackMarlinTools.h  |   2 +-
 Utilities/KiTrack/src/Tools/FTDHelixFitter.cc |   2 +-
 Utilities/KiTrack/src/Tools/Fitter.cc         |  94 +++---
 .../KiTrack/src/Tools/KiTrackMarlinTools.cc   |  16 +-
 .../KiTrack/src/Tools/VXDHelixFitter.cc.bak   |  12 +-
 Utilities/KiTrack/src/Tools/VXDHelixFitter.h  |   4 +-
 61 files changed, 1850 insertions(+), 295 deletions(-)
 create mode 100755 Utilities/DataHelper/DataHelper/TrackHitPair.h
 create mode 100755 Utilities/DataHelper/src/TrackHitPair.cc
 create mode 100644 Utilities/KalDet/cmake/MacroCheckPackageLibs.cmake
 create mode 100644 Utilities/KalDet/cmake/MacroCheckPackageVersion.cmake
 create mode 100644 Utilities/KalDet/cmake/MacroRootDict.cmake
 create mode 100644 Utilities/KalDet/cmake/MyFindROOT.cmake
 create mode 100644 Utilities/KalTest/cmake/MacroCheckPackageLibs.cmake
 create mode 100644 Utilities/KalTest/cmake/MacroCheckPackageVersion.cmake
 create mode 100644 Utilities/KalTest/cmake/MacroRootDict.cmake
 create mode 100644 Utilities/KalTest/cmake/MyFindROOT.cmake

diff --git a/Utilities/DataHelper/DataHelper/Navigation.h b/Utilities/DataHelper/DataHelper/Navigation.h
index 238dd30e..a4870ba9 100644
--- a/Utilities/DataHelper/DataHelper/Navigation.h
+++ b/Utilities/DataHelper/DataHelper/Navigation.h
@@ -19,7 +19,7 @@ class Navigation{
   void AddTrackerHitCollection(const edm4hep::TrackerHitCollection* col){m_hitColVec.push_back(col);};
   void AddTrackerAssociationCollection(const edm4hep::MCRecoTrackerAssociationCollection* col){m_assColVec.push_back(col);};
 
-  edm4hep::TrackerHit* GetTrackerHit(const edm4hep::ObjectID& id, bool delete_by_caller=true);
+  edm4hep::ConstTrackerHit GetTrackerHit(const edm4hep::ObjectID& id, bool delete_by_caller=true);
   std::vector<edm4hep::ConstSimTrackerHit> GetRelatedTrackerHit(const edm4hep::ObjectID& id);
   std::vector<edm4hep::ConstSimTrackerHit> GetRelatedTrackerHit(const edm4hep::TrackerHit& hit);
   
@@ -29,6 +29,6 @@ class Navigation{
   //DataHandle<edm4hep::MCRecoTrackerAssociationCollection> _inHitAssColHdl{"FTDStripTrackerHitsAssociation", Gaudi::DataHandle::Reader, this};
   std::vector<const edm4hep::TrackerHitCollection*> m_hitColVec;
   std::vector<const edm4hep::MCRecoTrackerAssociationCollection*> m_assColVec;
-  std::map<int, edm4hep::TrackerHit*> m_trkHits;
+  std::map<int, edm4hep::ConstTrackerHit> m_trkHits;
 };
 #endif 
diff --git a/Utilities/DataHelper/DataHelper/TrackExtended.h b/Utilities/DataHelper/DataHelper/TrackExtended.h
index 61ff5923..687db47d 100644
--- a/Utilities/DataHelper/DataHelper/TrackExtended.h
+++ b/Utilities/DataHelper/DataHelper/TrackExtended.h
@@ -4,6 +4,7 @@
 //#include "lcio.h"
 //#include "EVENT/LCIO.h"
 #include "edm4hep/Track.h"
+#include "edm4hep/TrackConst.h"
 #include <vector>
 //#include "ClusterExtended.h"
 //#include "TrackerHitExtended.h"
@@ -32,10 +33,10 @@ class TrackExtended {
 
     TrackExtended( );
     TrackExtended( TrackerHitExtended * trackerhit );
-    TrackExtended( edm4hep::Track * track );
+    TrackExtended( edm4hep::ConstTrack track );
     ~TrackExtended();
     
-    edm4hep::Track * getTrack();
+    edm4hep::ConstTrack getTrack();
     const float * getSeedDirection();
     const float * getSeedPosition();
     ClusterExtendedVec & getClusterVec();
@@ -95,7 +96,7 @@ class TrackExtended {
     ClusterExtended *_superCluster;
     ClusterExtendedVec _clusterVec;
     GroupTracks * _group;
-    edm4hep::Track * _track;
+    edm4hep::ConstTrack _track;
     float _seedDirection[3];
     float _seedPosition[3];
     TrackerHitExtendedVec _trackerHitVector;    
diff --git a/Utilities/DataHelper/DataHelper/TrackHitPair.h b/Utilities/DataHelper/DataHelper/TrackHitPair.h
new file mode 100755
index 00000000..f9e8b794
--- /dev/null
+++ b/Utilities/DataHelper/DataHelper/TrackHitPair.h
@@ -0,0 +1,38 @@
+#ifndef TRACKHITPAIR_H
+#define TRACKHITPAIR_H 1
+
+#include "TrackExtended.h"
+#include "TrackerHitExtended.h"
+#include <vector>
+
+class TrackHitPair;
+
+typedef std::vector<TrackHitPair*> TrackHitPairVec;
+/**
+ * Class implementing association of TrackExtended and TrackerHitExtended objects. <br>
+ * @author A. Raspereza (MPI-Munich)<br>
+ */
+
+class TrackHitPair {
+
+ public:
+
+    TrackHitPair(TrackExtended * trkExt, TrackerHitExtended * hitExt, float distance);
+    ~TrackHitPair();
+    void setTrackExtended(TrackExtended * trkExt);
+    void setTrackerHitExtended(TrackerHitExtended * hitExt);
+    void setDistance(float distance);
+    TrackExtended * getTrackExtended();
+    TrackerHitExtended * getTrackerHitExtended();
+    float getDistance();
+    
+
+ private:
+    TrackExtended * _trackExtended;
+    TrackerHitExtended * _trackerHitExtended;
+    float _distance;
+    
+
+};
+
+#endif
diff --git a/Utilities/DataHelper/DataHelper/TrackerHitExtended.h b/Utilities/DataHelper/DataHelper/TrackerHitExtended.h
index d625679e..1962d59e 100644
--- a/Utilities/DataHelper/DataHelper/TrackerHitExtended.h
+++ b/Utilities/DataHelper/DataHelper/TrackerHitExtended.h
@@ -24,14 +24,14 @@ class TrackerHitExtended {
   
  public:
   
-  TrackerHitExtended(const edm4hep::TrackerHit& trackerhit);
+  TrackerHitExtended(const edm4hep::ConstTrackerHit trackerhit);
   ~TrackerHitExtended();
   void setTrackExtended(TrackExtended * trackAR);
     void addTrackExtended(TrackExtended * trackAR);
     void setTrackerHitTo(TrackerHitExtended * hitTo);
     void setTrackerHitFrom(TrackerHitExtended * hitFrom);
     void setGenericDistance(float genericDistance);
-    //void setTrackerHit(edm4hep::TrackerHit* hit);
+    //void setTrackerHit(edm4hep::ConstTrackerHit hit);
     void setYresTo(float yresTo);
     void setYresFrom(float yresFrom);
     void setDirVec(float * dirVec);
@@ -42,7 +42,7 @@ class TrackerHitExtended {
     void setDet(int idet);
     void setUsedInFit(bool usedInFit);
 
-    edm4hep::TrackerHit* getTrackerHit();
+    edm4hep::ConstTrackerHit getTrackerHit();
     TrackExtended * getTrackExtended();
     TrackExtendedVec & getTrackExtendedVec();
     TrackerHitExtended * getTrackerHitFrom();
@@ -59,7 +59,7 @@ class TrackerHitExtended {
 
  private:
 
-    edm4hep::TrackerHit _trackerHit;
+    edm4hep::ConstTrackerHit _trackerHit;
     TrackExtended * _trackAR;
     TrackerHitExtended * _hitTo;
     TrackerHitExtended * _hitFrom;
diff --git a/Utilities/DataHelper/src/Navigation.cpp b/Utilities/DataHelper/src/Navigation.cpp
index 4c220906..f31eadbd 100644
--- a/Utilities/DataHelper/src/Navigation.cpp
+++ b/Utilities/DataHelper/src/Navigation.cpp
@@ -19,13 +19,13 @@ Navigation::~Navigation(){
 void Navigation::Initialize(){
   m_hitColVec.clear();
   m_assColVec.clear();
-  for(std::map<int, edm4hep::TrackerHit*>::iterator it=m_trkHits.begin();it!=m_trkHits.end();it++){
-    delete it->second;
+  for(std::map<int, edm4hep::ConstTrackerHit>::iterator it=m_trkHits.begin();it!=m_trkHits.end();it++){
+    // delete it->second;
   }
   m_trkHits.clear();
 }
 
-edm4hep::TrackerHit* Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, bool delete_by_caller){
+edm4hep::ConstTrackerHit Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id, bool delete_by_caller){
   int id = obj_id.collectionID * 10000000 + obj_id.index;
   if(!delete_by_caller){
     if(m_trkHits.find(id)!=m_trkHits.end()) return m_trkHits[id];
@@ -47,7 +47,7 @@ edm4hep::TrackerHit* Navigation::GetTrackerHit(const edm4hep::ObjectID& obj_id,
       edm4hep::ObjectID this_id = hit.getObjectID();
       if(this_id.collectionID!=obj_id.collectionID)break;
       else if(this_id.index==obj_id.index){
-	edm4hep::TrackerHit* hit_copy = new edm4hep::TrackerHit(hit);
+	edm4hep::ConstTrackerHit hit_copy = edm4hep::ConstTrackerHit(hit);
 	if(!delete_by_caller) m_trkHits[id] = hit_copy;
 	return hit_copy;//&(m_trkHits[id]);
       }
diff --git a/Utilities/DataHelper/src/TrackExtended.cc b/Utilities/DataHelper/src/TrackExtended.cc
index bd5444d7..2c2d1412 100644
--- a/Utilities/DataHelper/src/TrackExtended.cc
+++ b/Utilities/DataHelper/src/TrackExtended.cc
@@ -11,7 +11,7 @@ TrackExtended::TrackExtended( ) {
     _group = NULL;
 }
 
-TrackExtended::TrackExtended( Track * track) {
+TrackExtended::TrackExtended(ConstTrack track) {
     _track = track;
     _superCluster = NULL;
     _trackerHitVector.clear();
@@ -32,7 +32,7 @@ TrackExtended::TrackExtended( TrackerHitExtended * trackerhit) {
 
 TrackExtended::~TrackExtended() {}
 
-Track * TrackExtended::getTrack() {
+ConstTrack TrackExtended::getTrack() {
     return _track;
 }
 
diff --git a/Utilities/DataHelper/src/TrackHitPair.cc b/Utilities/DataHelper/src/TrackHitPair.cc
new file mode 100755
index 00000000..c9017241
--- /dev/null
+++ b/Utilities/DataHelper/src/TrackHitPair.cc
@@ -0,0 +1,34 @@
+#include "DataHelper/TrackHitPair.h"
+
+TrackHitPair::TrackHitPair(TrackExtended * trkExt, TrackerHitExtended * hitExt, float distance) {
+    _trackExtended = trkExt;
+    _trackerHitExtended = hitExt;
+    _distance = distance;
+}
+TrackHitPair::~TrackHitPair() {
+
+}
+
+void TrackHitPair::setTrackExtended(TrackExtended * trkExt) {
+    _trackExtended = trkExt;
+}
+
+void TrackHitPair::setTrackerHitExtended(TrackerHitExtended * hitExt) {
+    _trackerHitExtended = hitExt;
+}
+
+void TrackHitPair::setDistance(float distance) {
+    _distance = distance;
+}
+
+TrackExtended * TrackHitPair::getTrackExtended() {
+    return _trackExtended;
+}
+
+TrackerHitExtended * TrackHitPair::getTrackerHitExtended() {
+    return _trackerHitExtended;
+}
+
+float TrackHitPair::getDistance() {
+    return _distance;
+}
diff --git a/Utilities/DataHelper/src/TrackerHitExtended.cc b/Utilities/DataHelper/src/TrackerHitExtended.cc
index d2169bf3..394ab2cf 100644
--- a/Utilities/DataHelper/src/TrackerHitExtended.cc
+++ b/Utilities/DataHelper/src/TrackerHitExtended.cc
@@ -1,7 +1,7 @@
 #include "DataHelper/TrackExtended.h"
 #include "DataHelper/TrackerHitExtended.h"
 
-TrackerHitExtended::TrackerHitExtended(const edm4hep::TrackerHit& trackerhit):
+TrackerHitExtended::TrackerHitExtended(const edm4hep::ConstTrackerHit trackerhit):
   _trackerHit(trackerhit){
   _trackAR = NULL;
   _trackVecAR.clear();
@@ -41,7 +41,7 @@ void TrackerHitExtended::setGenericDistance(float genericDistance) {
     _genericDistance = genericDistance; 
 }
 
-//void TrackerHitExtended::setTrackerHit(edm4hep::TrackerHit * hit) {
+//void TrackerHitExtended::setTrackerHit(edm4hep::ConstTrackerHit hit) {
 //    _trackerHit = hit;
 //}
 
@@ -67,8 +67,8 @@ void TrackerHitExtended::setDet(int idet) {
     _idet = idet;
 }
 
-edm4hep::TrackerHit * TrackerHitExtended::getTrackerHit() {
-    return &_trackerHit;
+edm4hep::ConstTrackerHit TrackerHitExtended::getTrackerHit() {
+    return _trackerHit;
 }
 
 TrackExtended * TrackerHitExtended::getTrackExtended() {
diff --git a/Utilities/KalDet/cmake/MacroCheckPackageLibs.cmake b/Utilities/KalDet/cmake/MacroCheckPackageLibs.cmake
new file mode 100644
index 00000000..c4451b3e
--- /dev/null
+++ b/Utilities/KalDet/cmake/MacroCheckPackageLibs.cmake
@@ -0,0 +1,164 @@
+##############################################################################
+# macro for checkin package libraries in ${PKG_ROOT}/lib
+#
+#
+# macro usage:
+#   CHECK_PACKAGE_LIBS( PACKAGE_NAME stdlib1 stdlib2 ... stdlibn )
+#       only standard libraries should be passed as arguments to the macro
+#       component libraries are set by cmake in PKG_FIND_COMPONENTS (when
+#       calling FIND_PACKAGE with COMPONENTS argument) or through the
+#       variable PKG_USE_COMPONENTS
+#
+#
+# required variables:
+#   PKG_ROOT    : path to PKG root directory
+#
+#
+# returns following variables:
+#   PKG_LIBRARY_DIRS : list of paths to be used with LINK_DIRECTORIES
+#   PGK_LIBRARIES    : list of STANDARD libraries (NOT including COMPONENTS)
+#   PKG_COMPONENT_LIBRARIES    : list of COMPONENT libraries
+#   PKG_${COMPONENT}_FOUND     : set to TRUE or FALSE for each library
+#   PKG_${COMPONENT}_LIBRARY   : path to each individual library
+#
+#
+# PKG_LIBRARIES and PKG_LIBRARY_DIRS will be empty if any of the standard
+#   libraries is missing
+#
+# @author Jan Engels, Desy
+##############################################################################
+
+
+SET( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE )
+
+MACRO( CHECK_PACKAGE_LIBS _pkgname )
+
+    SET( _std_lib_missing FALSE )
+    SET( _ext_lib_missing FALSE )
+
+    SET( _std_libnames ${ARGN} )
+    SET( _ext_libnames ${${_pkgname}_FIND_COMPONENTS} ${${_pkgname}_USE_COMPONENTS} )
+
+    IF( _ext_libnames )
+        SEPARATE_ARGUMENTS( _ext_libnames )
+        LIST( REMOVE_DUPLICATES _ext_libnames )
+    ENDIF()
+
+    IF( NOT ${_pkgname}_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ${_pkgname}_LIBRARIES: ${_std_libnames}" )
+        IF( _ext_libnames )
+            MESSAGE( STATUS "Check for ${_pkgname}_COMPONENT_LIBRARIES: ${_ext_libnames}" )
+        ENDIF()
+    ENDIF()
+
+    SET( ${_pkgname}_LIBRARY_DIRS )
+    MARK_AS_ADVANCED( ${_pkgname}_LIBRARY_DIRS )
+
+    SET( ${_pkgname}_LIBRARIES )
+    MARK_AS_ADVANCED( ${_pkgname}_LIBRARIES )
+    
+    SET( ${_pkgname}_COMPONENT_LIBRARIES )
+    MARK_AS_ADVANCED( ${_pkgname}_COMPONENT_LIBRARIES )
+
+    SET( ${_pkgname}_COMPONENT_VARIABLES )
+    MARK_AS_ADVANCED( ${_pkgname}_COMPONENT_VARIABLES )
+
+    FOREACH( _libname ${_std_libnames} ${_ext_libnames} )
+
+        # flag to check if it is a standard or a component library
+        LIST( FIND _std_libnames "${_libname}" _aux )
+        IF( ${_aux} LESS 0 )
+           SET( _is_std_lib FALSE )
+        ELSE()
+           SET( _is_std_lib TRUE )
+        ENDIF()
+
+        # libname in upper case
+        STRING( TOUPPER ${_libname} _ulibname )
+
+        SET( ${_pkgname}_${_ulibname}_LIBRARY ${_pkgname}_${_ulibname}_LIBRARY-NOTFOUND )
+        MARK_AS_ADVANCED( ${_pkgname}_${_ulibname}_LIBRARY )
+
+        # WARNING: using PATH_SUFFIXES may cause problems when using variable CMAKE_FIND_ROOT_PATH
+        #           this problem does not occur if expanding PATHS
+        #           look in FindMySQL.cmake for more info
+        #FIND_LIBRARY( ${_pkgname}_${_ulibname}_LIBRARY NAMES ${_libname} PATHS
+        #    ${${_pkgname}_ROOT} ${${_pkgname}_DIR} ${${_pkgname}_LIB_SEARCH_PATH}
+        #    PATH_SUFFIXES lib64 lib
+        #    NO_DEFAULT_PATH
+        #)
+
+        FIND_LIBRARY( ${_pkgname}_${_ulibname}_LIBRARY NAMES ${_libname} PATHS
+            ${${_pkgname}_ROOT}/lib64 ${${_pkgname}_ROOT}/lib
+            ${${_pkgname}_DIR}/lib64 ${${_pkgname}_DIR}/lib
+            ${${_pkgname}_LIB_SEARCH_PATH} ${${_pkgname}_LIB_SEARCH_PATH}/lib64 ${${_pkgname}_LIB_SEARCH_PATH}/lib
+            NO_DEFAULT_PATH
+        )
+
+        IF( NOT ${_pkgname}_DIR )
+            FIND_LIBRARY( ${_pkgname}_${_ulibname}_LIBRARY NAMES ${_libname} )
+        ENDIF()
+        
+        IF( ${_pkgname}_FIND_REQUIRED )
+            LIST( APPEND ${_pkgname}_COMPONENT_VARIABLES ${_pkgname}_${_ulibname}_LIBRARY )
+        ENDIF()
+
+        IF( ${_pkgname}_${_ulibname}_LIBRARY ) # if library found
+
+            SET( ${_pkgname}_${_ulibname}_FOUND TRUE )
+            
+            # split libraries in PKG_LIBRARIES and PKG_COMPONENT_LIBRARIES
+            IF( _is_std_lib )
+                LIST( APPEND ${_pkgname}_LIBRARIES ${${_pkgname}_${_ulibname}_LIBRARY} )
+            ELSE()
+                LIST( APPEND ${_pkgname}_COMPONENT_LIBRARIES ${${_pkgname}_${_ulibname}_LIBRARY} )
+            ENDIF()
+
+            GET_FILENAME_COMPONENT( _aux ${${_pkgname}_${_ulibname}_LIBRARY} PATH )
+            LIST( APPEND ${_pkgname}_LIBRARY_DIRS ${_aux} )
+
+            IF( NOT ${_pkgname}_FIND_QUIETLY )
+                MESSAGE( STATUS "Check for ${_pkgname}_${_ulibname}_LIBRARY: ${${_pkgname}_${_ulibname}_LIBRARY} -- ok" )
+            ENDIF()
+
+        ELSE() # library not found
+
+            SET( ${_pkgname}_${_ulibname}_FOUND FALSE )
+
+            IF( _is_std_lib )
+                SET( _std_lib_missing TRUE )
+            ELSE()
+                SET( _ext_lib_missing TRUE )
+            ENDIF()
+
+            IF( NOT ${_pkgname}_FIND_QUIETLY )
+                MESSAGE( STATUS "Check for ${_pkgname}_${_ulibname}_LIBRARY: ${_libname} -- failed" )
+            ENDIF()
+
+        ENDIF()
+
+    ENDFOREACH()
+
+    # clear PKG_LIBRARIES if standard library is missing
+    IF( _std_lib_missing )
+        SET( ${_pkgname}_LIBRARIES )
+    ENDIF()
+
+    # clear PKG_COMPONENT_LIBRARIES if a component library is missing and
+    # FIND_PACKAGE called with REQUIRED argument
+    IF( _ext_lib_missing AND ${_pkgname}_FIND_REQUIRED )
+        SET( ${_pkgname}_COMPONENT_LIBRARIES )
+    ENDIF()
+
+    # remove duplicate paths in PKG_LIBRARY_DIRS
+    IF( ${_pkgname}_LIBRARY_DIRS )
+        LIST( REMOVE_DUPLICATES ${_pkgname}_LIBRARY_DIRS )
+    ENDIF()
+
+    # debug
+    #MESSAGE( STATUS "${_pkgname}_LIBRARIES: ${${_pkgname}_LIBRARIES}" )
+    #MESSAGE( STATUS "${_pkgname}_COMPONENT_LIBRARIES: ${${_pkgname}_COMPONENT_LIBRARIES}" )
+    #MESSAGE( STATUS "${_pkgname}_LIBRARY_DIRS: ${${_pkgname}_LIBRARY_DIRS}" )
+
+ENDMACRO( CHECK_PACKAGE_LIBS _pkgname )
+
diff --git a/Utilities/KalDet/cmake/MacroCheckPackageVersion.cmake b/Utilities/KalDet/cmake/MacroCheckPackageVersion.cmake
new file mode 100644
index 00000000..e3ec75d9
--- /dev/null
+++ b/Utilities/KalDet/cmake/MacroCheckPackageVersion.cmake
@@ -0,0 +1,108 @@
+##############################################################################
+# macro for checking a package version
+#
+# this macro should be called from your PKGVersion.cmake or from a
+#   FindPKG.cmake module with the following arguments:
+#       _pkgname    : The package name
+#       _iversion   : The installed version of the package
+#
+#
+# the following conventions are used:
+#
+#   if FIND_PACKAGE is called with EXACT argument than the version has to
+#   match EXACTLY, i.e.:
+#       1.5 == 1.5
+#       1.5 == 1.5.0
+#       1.5 == 1.5.0.0
+#       1.5.2 == 1.5.2.0
+#       1.5.2.1 == 1.5.2.1
+#       1.5.2 != 1.5.2.1
+#       1.5 != 1.5.0.1
+#
+#
+#   otherwise a MINIMUM_REQUIRED version is checked for, i.e. the same
+#   behavior as with the cmake variable CMAKE_MINIMUM_REQUIRED, e.g.:
+#       searching: 1.2     --> installed: 1.5.2.2 --> compatible
+#       searching: 1.5     --> installed: 1.5.2.2 --> compatible
+#       searching: 1.5.2.1 --> installed: 1.5.2.2 --> compatible
+#       searching: 1.5.2.3 --> installed: 1.5.2.2 --> unsuitable
+#       searching: 1.7     --> installed: 1.5.2.2 --> unsuitable
+#
+#
+# following variables are returned (internally to cmake):
+#   PACKAGE_VERSION_EXACT       : set to TRUE if exact version was found
+#   PACKAGE_VERSION_COMPATIBLE  : set to TRUE if version is compatible
+#   PACKAGE_VERSION_UNSUITABLE  : set to TRUE if version found is unsuitable
+#
+#
+# @author Jan Engels, Desy IT
+##############################################################################
+
+# these variables are evaluated internally by the cmake command FIND_PACKAGE to mark this
+# package as suitable or not depending on the required version
+SET( PACKAGE_VERSION_EXACT FALSE )
+SET( PACKAGE_VERSION_COMPATIBLE TRUE )
+SET( PACKAGE_VERSION_UNSUITABLE FALSE )
+
+
+# cmake internal variable PACKAGE_FIND_NAME is not defined on FindPKG.cmake
+# modules, therefore it is passed as an argument to the macro
+# _iversion is the installed version of the package
+# _sversion is the version searched by the user with FIND_PACKAGE
+#MACRO( CHECK_PACKAGE_VERSION _pkgname _iversion )
+MACRO( CHECK_PACKAGE_VERSION _pkgname ) # left with one argument only for backwards compatibility
+
+    IF( NOT "${ARGV1}" STREQUAL "" )
+        SET( _iversion ${ARGV1} )
+    ELSE()
+        SET( _iversion ${${_pkgname}_VERSION_MAJOR}.${${_pkgname}_VERSION_MINOR}.${${_pkgname}_VERSION_PATCH}.${${_pkgname}_VERSION_TWEAK} )
+    ENDIF()
+
+    #SET( _sversion_major ${${_pkgname}_FIND_VERSION_MAJOR} )
+    #SET( _sversion_minor ${${_pkgname}_FIND_VERSION_MINOR} )
+
+    SET( _sversion ${${_pkgname}_FIND_VERSION} )
+
+    IF( NOT ${_pkgname}_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ${_pkgname} (${_iversion})" )
+    ENDIF()
+
+    # only do work if FIND_PACKAGE called with a version argument
+    IF( _sversion )
+
+        #IF( NOT ${_pkgname}_FIND_QUIETLY )
+        #    MESSAGE( STATUS "Check for ${_pkgname}: looking for version ${_sversion}" )
+        #ENDIF()
+
+        IF( ${_iversion} VERSION_EQUAL ${_sversion} ) # if version matches EXACTLY
+            #IF( NOT ${_pkgname}_FIND_QUIETLY )
+            #    MESSAGE( STATUS "Check for ${_pkgname}: exact version found: ${_iversion}" )
+            #ENDIF()
+            SET( PACKAGE_VERSION_EXACT TRUE )
+        ELSE() # if version does not match EXACTLY, check if it is compatible/suitable
+
+            # installed version must be greater or equal than version searched by the user, i.e.
+            # like with the CMAKE_MINIMUM_REQUIRED commando
+            # if user asks for version 1.2.5 then any version >= 1.2.5 is suitable/compatible
+            IF( NOT ${_sversion} VERSION_LESS ${_iversion} )
+                SET( PACKAGE_VERSION_UNSUITABLE TRUE )
+            ENDIF()
+            # -------------------------------------------------------------------------------------
+
+            IF( ${_pkgname}_FIND_VERSION_EXACT ) # if exact version was required search must fail!!
+                #IF( NOT ${_pkgname}_FIND_QUIETLY )
+                #    MESSAGE( "Check for ${_pkgname}: could not find exact version" )
+                #ENDIF()
+                SET( PACKAGE_VERSION_UNSUITABLE TRUE )
+            ENDIF()
+
+        ENDIF()
+
+        IF( PACKAGE_VERSION_UNSUITABLE )
+            SET( PACKAGE_VERSION_COMPATIBLE FALSE )
+        ENDIF()
+
+    ENDIF( _sversion )
+
+ENDMACRO( CHECK_PACKAGE_VERSION )
+
diff --git a/Utilities/KalDet/cmake/MacroRootDict.cmake b/Utilities/KalDet/cmake/MacroRootDict.cmake
new file mode 100644
index 00000000..eb1059ed
--- /dev/null
+++ b/Utilities/KalDet/cmake/MacroRootDict.cmake
@@ -0,0 +1,145 @@
+IF(APPLE)
+    SET( LD_LIBRARY_PATH_VAR DYLD_LIBRARY_PATH )
+ELSE()
+    SET( LD_LIBRARY_PATH_VAR LD_LIBRARY_PATH )
+ENDIF()
+SET( LD_LIBRARY_PATH_CONTENTS $ENV{${LD_LIBRARY_PATH_VAR}} )
+#MESSAGE( STATUS "LD_LIBRARY_PATH_CONTENTS: ${LD_LIBRARY_PATH_CONTENTS}" )
+#MESSAGE( STATUS "ROOT_CINT_EXECUTABLE: ${ROOT_CINT_EXECUTABLE}" )
+
+SET( ROOT_CINT_WRAPPER ${LD_LIBRARY_PATH_VAR}=${ROOT_LIBRARY_DIR}:${LD_LIBRARY_PATH_CONTENTS} ${ROOT_CINT_EXECUTABLE} )
+
+IF( NOT DEFINED ROOT_DICT_OUTPUT_DIR )
+    SET( ROOT_DICT_OUTPUT_DIR "${PROJECT_BINARY_DIR}/rootdict" )
+ENDIF()
+
+# clean generated header files with 'make clean'
+SET_DIRECTORY_PROPERTIES( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${ROOT_DICT_OUTPUT_DIR}" )
+
+IF( NOT ROOT_FIND_QUIETLY )
+    MESSAGE( STATUS "Check for ROOT_DICT_OUTPUT_DIR: ${PROJECT_BINARY_DIR}/rootdict" )
+    MESSAGE( STATUS "Check for ROOT_DICT_CINT_DEFINITIONS: ${ROOT_DICT_CINT_DEFINITIONS}" )
+ENDIF()
+
+
+# ============================================================================
+# helper macro to prepare input headers for GEN_ROOT_DICT_SOURCES
+#   sorts LinkDef.h to be the last header (required by rootcint)
+#
+# arguments:
+#   input_dir - directory to search for headers matching *.h
+#
+# returns:
+#   ROOT_DICT_INPUT_HEADERS - all header files found in input_dir with
+#       LinkDef.h as the last header (if found)
+#
+# ----------------------------------------------------------------------------
+MACRO( PREPARE_ROOT_DICT_HEADERS _input_dir )
+
+    FILE( GLOB ROOT_DICT_INPUT_HEADERS "${_input_dir}/*.h" )
+    FILE( GLOB _linkdef_hdr "${_input_dir}/LinkDef.h" )
+
+    #LIST( FIND ROOT_DICT_INPUT_HEADERS ${_linkdef_hdr} _aux )
+    #IF( ${_aux} EQUAL 0 OR ${_aux} GREATER 0 )
+    #    LIST( REMOVE_ITEM ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}" )
+    #    LIST( APPEND ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}" )
+    #ENDIF()
+
+    IF( _linkdef_hdr )
+        LIST( REMOVE_ITEM ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}" )
+        LIST( APPEND ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}")
+    ENDIF()
+
+    #MESSAGE( STATUS "ROOT_DICT_INPUT_HEADERS: ${ROOT_DICT_INPUT_HEADERS}" )
+
+ENDMACRO( PREPARE_ROOT_DICT_HEADERS )
+
+
+
+# ============================================================================
+# helper macro to generate Linkdef.h files for rootcint
+#
+# arguments:
+#   namespace - prefix used for creating header <namespace>_Linkdef.h
+#   ARGN      - list of sources to be used for generating Linkdef.h
+#
+# returns:
+#   ROOT_DICT_INPUT_HEADERS - all header files + <namespace>_LinkDef.h in the
+#       correct order to be used by macro GEN_ROOT_DICT_SOURCES
+#
+# ----------------------------------------------------------------------------
+MACRO( GEN_ROOT_DICT_LINKDEF_HEADER _namespace )
+
+    SET( _input_headers ${ARGN} )
+    SET( _linkdef_header "${ROOT_DICT_OUTPUT_DIR}/${_namespace}_Linkdef.h" )
+
+    FOREACH( _header ${_input_headers} )
+        SET( ${_namespace}_file_contents "${${_namespace}_file_contents}\\#pragma link C++ defined_in \\\"${_header}\\\"\\;\\\\n" )
+    ENDFOREACH()
+
+    ADD_CUSTOM_COMMAND(
+        OUTPUT ${_linkdef_header}
+        COMMAND mkdir -p ${ROOT_DICT_OUTPUT_DIR}
+        COMMAND printf "${${_namespace}_file_contents}" > ${_linkdef_header}
+        DEPENDS ${_input_headers}
+        COMMENT "generating: ${_linkdef_header}"
+    )
+
+    SET( ROOT_DICT_INPUT_HEADERS ${_input_headers} ${_linkdef_header} )
+
+ENDMACRO()
+
+
+# ============================================================================
+# macro for generating root dict sources with rootcint
+#
+# arguments:
+#   dict_src_filename - filename of the dictionary source (to be generated)
+#
+# requires following variables:
+#       ROOT_DICT_INPUT_HEADERS - list of headers needed to generate dict source
+#           * if LinkDef.h is in the list it must be at the end !!
+#       ROOT_DICT_INCLUDE_DIRS - list of include dirs to pass to rootcint -I..
+#       ROOT_DICT_CINT_DEFINITIONS - extra definitions to pass to rootcint
+#       ROOT_DICT_OUTPUT_DIR - where dictionary source should be generated
+#
+# returns:
+#       ROOT_DICT_OUTPUT_SOURCES - list containing generated source and other
+#           previously generated sources
+                                    
+# ----------------------------------------------------------------------------
+MACRO( GEN_ROOT_DICT_SOURCE _dict_src_filename )
+
+    # TODO check for ROOT_CINT_EXECUTABLE
+
+    # need to prefix all include dirs with -I
+    set( _dict_includes )
+    FOREACH( _inc ${ROOT_DICT_INCLUDE_DIRS} )
+        SET( _dict_includes "${_dict_includes}\t-I${_inc}")  #fg: the \t fixes a wired string expansion 
+        #SET( _dict_includes ${_dict_includes} -I${_inc} )
+    ENDFOREACH()
+
+    STRING( REPLACE "/" "_" _dict_src_filename_nosc ${_dict_src_filename} )
+    SET( _dict_src_file ${ROOT_DICT_OUTPUT_DIR}/${_dict_src_filename_nosc} )
+    STRING( REGEX REPLACE "^(.*)\\.(.*)$" "\\1.h" _dict_hdr_file "${_dict_src_file}" )
+    #message("fucd debug: ${_dict_src_file} ${ROOT_DICT_CINT_DEFINITIONS} ${_dict_includes} ${ROOT_DICT_INPUT_HEADERS}")
+    ADD_CUSTOM_COMMAND(
+        OUTPUT  ${_dict_src_file} ${_dict_hdr_file}
+        COMMAND mkdir -p ${ROOT_DICT_OUTPUT_DIR}
+        COMMAND ${ROOT_CINT_WRAPPER} -f "${_dict_src_file}" -c ${ROOT_DICT_CINT_DEFINITIONS} ${_dict_includes} ${ROOT_DICT_INPUT_HEADERS}
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+        DEPENDS ${ROOT_DICT_INPUT_HEADERS}
+        COMMENT "generating: ${_dict_src_file} ${_dict_hdr_file}"
+    )
+    LIST( APPEND ROOT_DICT_OUTPUT_SOURCES ${_dict_src_file} )
+
+ENDMACRO()
+
+# for backwards compatibility
+MACRO( GEN_ROOT_DICT_SOURCES _dict_src_filename )
+    #MESSAGE( "USING DEPRECATED GEN_ROOT_DICT_SOURCES. PLEASE USE GEN_ROOT_DICT_SOURCE instead." )
+    SET( ROOT_DICT_OUTPUT_SOURCES )
+    GEN_ROOT_DICT_SOURCE( ${_dict_src_filename} )
+ENDMACRO()
+# ============================================================================
+
diff --git a/Utilities/KalDet/cmake/MyFindROOT.cmake b/Utilities/KalDet/cmake/MyFindROOT.cmake
new file mode 100644
index 00000000..567ce159
--- /dev/null
+++ b/Utilities/KalDet/cmake/MyFindROOT.cmake
@@ -0,0 +1,316 @@
+###############################################################################
+# cmake module for finding ROOT
+#
+# requires:
+#   MacroCheckPackageLibs.cmake for checking package libraries
+#
+# Following cmake variables are returned by this module:
+#
+#   ROOT_FOUND              : set to TRUE if ROOT found
+#       If FIND_PACKAGE is called with REQUIRED and COMPONENTS arguments
+#       ROOT_FOUND is only set to TRUE if ALL components are found.
+#       If REQUIRED is NOT set components may or may not be available
+#
+#   ROOT_LIBRARIES          : list of ROOT libraries (NOT including COMPONENTS)
+#   ROOT_INCLUDE_DIRS       : list of paths to be used with INCLUDE_DIRECTORIES
+#   ROOT_LIBRARY_DIRS       : list of paths to be used with LINK_DIRECTORIES
+#   ROOT_COMPONENT_LIBRARIES    : list of ROOT component libraries
+#   ROOT_${COMPONENT}_FOUND     : set to TRUE or FALSE for each library
+#   ROOT_${COMPONENT}_LIBRARY   : path to individual libraries
+#   
+#
+#   Please note that by convention components should be entered exactly as
+#   the library names, i.e. the component name equivalent to the library
+#   $ROOTSYS/lib/libMathMore.so should be called MathMore and NOT:
+#       mathmore or Mathmore or MATHMORE
+#
+#   However to follow the usual cmake convention it is agreed that the
+#   ROOT_${COMPONENT}_FOUND and ROOT_${COMPONENT}_LIBRARY variables are ALL
+#   uppercase, i.e. the MathMore component returns: ROOT_MATHMORE_FOUND and
+#   ROOT_MATHMORE_LIBRARY NOT ROOT_MathMore_FOUND or ROOT_MathMore_LIBRARY
+#
+#
+# The additional ROOT components should be defined as follows:
+# FIND_PACKAGE( ROOT COMPONENTS MathMore Gdml Geom ...)
+#
+# If components are required use:
+# FIND_PACKAGE( ROOT REQUIRED COMPONENTS MathMore Gdml Geom ...)
+#
+# If only root is required and components are NOT required use:
+# FIND_PACKAGE( ROOT REQUIRED )
+# FIND_PACKAGE( ROOT COMPONENTS MathMore Gdml Geom ... QUIET )
+#   then you need to check for ROOT_MATHMORE_FOUND, ROOT_GDML_FOUND, etc.
+#
+# The variable ROOT_USE_COMPONENTS can also be used before calling
+# FIND_PACKAGE, i.e.:
+# SET( ROOT_USE_COMPONENTS MathMore Gdml Geom )
+# FIND_PACKAGE( ROOT REQUIRED ) # all ROOT_USE_COMPONENTS must also be found
+# FIND_PACKAGE( ROOT ) # check for ROOT_FOUND, ROOT_MATHMORE_FOUND, etc.
+#
+# @author Jan Engels, DESY
+###############################################################################
+
+# ==============================================
+# ===        ROOT_CONFIG_EXECUTABLE          ===
+# ==============================================
+
+SET( ROOT_CONFIG_EXECUTABLE ROOT_CONFIG_EXECUTABLE-NOTFOUND )
+MARK_AS_ADVANCED( ROOT_CONFIG_EXECUTABLE )
+# FIND_PROGRAM: Once one of the calls succeeds the result variable will be set and stored in the cache so that no call will search again. 
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config PATHS ${ROOT_DIR}/bin NO_DEFAULT_PATH )
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config PATHS $ENV{ROOTSYS}/bin NO_DEFAULT_PATH)
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config PATHS ENV PATH )
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config )
+
+IF( NOT ROOT_FIND_QUIETLY )
+    MESSAGE( STATUS "Check for ROOT_CONFIG_EXECUTABLE: ${ROOT_CONFIG_EXECUTABLE}" )
+ENDIF()
+
+IF( ROOT_CONFIG_EXECUTABLE )
+
+
+    # ==============================================
+    # ===          ROOT_VERSION                  ===
+    # ==============================================
+
+    INCLUDE( MacroCheckPackageVersion )
+    
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --version
+        OUTPUT_VARIABLE _version
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( _exit_code EQUAL 0 )
+
+        # set required variables for MacroCheckPackageVersion
+        STRING(REGEX REPLACE "^([0-9]+).*" "\\1" ROOT_VERSION_MAJOR "${_version}")
+        STRING(REGEX REPLACE "^[0-9]+.([0-9]+).*" "\\1" ROOT_VERSION_MINOR "${_version}")
+        STRING(REGEX REPLACE "^[0-9]+.[0-9]+.([0-9]+).*" "\\1" ROOT_VERSION_PATCH "${_version}")
+
+        SET( ROOT_VERSION "${ROOT_VERSION_MAJOR}.${ROOT_VERSION_MINOR}.${ROOT_VERSION_PATCH}" )
+    ENDIF()
+
+    CHECK_PACKAGE_VERSION( ROOT ${ROOT_VERSION} )
+
+
+
+    # ==============================================
+    # ===          ROOT_PREFIX                   ===
+    # ==============================================
+
+    # get root prefix from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --prefix
+        OUTPUT_VARIABLE ROOT_PREFIX
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( ROOT_PREFIX )
+    ENDIF()
+
+    # PKG_ROOT variables are a cmake standard
+    # since this package is also called ROOT the variable name
+    # becomes ROOT_ROOT ...
+    SET( ROOT_ROOT ${ROOT_PREFIX} )
+
+
+
+    # ==============================================
+    # ===          ROOT_BIN_DIR                  ===
+    # ==============================================
+
+    # get bindir from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --bindir
+        OUTPUT_VARIABLE ROOT_BIN_DIR
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( ROOT_BIN_DIR )
+    ENDIF()
+
+
+
+    # ==============================================
+    # ===          ROOT_EXECUTABLE               ===
+    # ==============================================
+
+
+    SET( ROOT_EXECUTABLE ROOT_EXECUTABLE-NOTFOUND )
+    MARK_AS_ADVANCED( ROOT_EXECUTABLE )
+    FIND_PROGRAM( ROOT_EXECUTABLE root PATHS ${ROOT_BIN_DIR} NO_DEFAULT_PATH )
+
+    IF( NOT ROOT_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ROOT_EXECUTABLE: ${ROOT_EXECUTABLE}" )
+    ENDIF()
+
+
+
+
+    # ==============================================
+    # ===          ROOT_CINT_EXECUTABLE          ===
+    # ==============================================
+
+
+    # find rootcint
+    SET( ROOT_CINT_EXECUTABLE ROOT_CINT_EXECUTABLE-NOTFOUND )
+    MARK_AS_ADVANCED( ROOT_CINT_EXECUTABLE )
+    FIND_PROGRAM( ROOT_CINT_EXECUTABLE rootcint PATHS ${ROOT_BIN_DIR} NO_DEFAULT_PATH )
+
+    IF( NOT ROOT_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ROOT_CINT_EXECUTABLE: ${ROOT_CINT_EXECUTABLE}" )
+    ENDIF()
+
+
+
+    # ==============================================
+    # ===          ROOT_INCLUDE_DIR              ===
+    # ==============================================
+
+    # get include dir from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --incdir
+        OUTPUT_VARIABLE _inc_dir
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( _inc_dir )
+    ENDIF()
+
+
+    SET( ROOT_INCLUDE_DIRS ROOT_INCLUDE_DIRS-NOTFOUND )
+    MARK_AS_ADVANCED( ROOT_INCLUDE_DIRS )
+
+    FIND_PATH( ROOT_INCLUDE_DIRS
+        NAMES TH1.h
+        PATHS ${ROOT_DIR}/include ${_inc_dir}
+        NO_DEFAULT_PATH
+    )
+
+
+
+    # ==============================================
+    # ===            ROOT_LIBRARIES              ===
+    # ==============================================
+
+    # get library dir from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --libdir
+        OUTPUT_VARIABLE ROOT_LIBRARY_DIR
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( ROOT_LIBRARY_DIR )
+    ENDIF()
+
+
+
+    # ========== standard root libraries =================
+
+    # standard root libraries (without components)
+    SET( _root_libnames )
+
+    # get standard root libraries from 'root-config --libs' output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --noauxlibs --libs
+        OUTPUT_VARIABLE _aux
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( _exit_code EQUAL 0 )
+        
+        # create a list out of the output
+        SEPARATE_ARGUMENTS( _aux )
+
+        # remove first item -L compiler flag
+        LIST( REMOVE_AT _aux 0 )
+
+        FOREACH( _lib ${_aux} )
+
+            # extract libnames from -l compiler flags
+            STRING( REGEX REPLACE "^-.(.*)$" "\\1" _libname "${_lib}")
+
+            # fix for some root-config versions which export -lz even if using --noauxlibs
+            IF( NOT _libname STREQUAL "z" )
+
+                # append all library names into a list
+                LIST( APPEND _root_libnames ${_libname} )
+
+            ENDIF()
+
+        ENDFOREACH()
+
+    ENDIF()
+
+
+
+    # ========== additional root components =================
+
+    #LIST( APPEND ROOT_FIND_COMPONENTS Minuit2 ) # DEPRECATED !!!
+
+
+    # ---------- libraries --------------------------------------------------------
+    INCLUDE( MacroCheckPackageLibs )
+
+    SET( ROOT_LIB_SEARCH_PATH ${ROOT_LIBRARY_DIR} )
+
+    # only standard libraries should be passed as arguments to CHECK_PACKAGE_LIBS
+    # additional components are set by cmake in variable PKG_FIND_COMPONENTS
+    # first argument should be the package name
+    CHECK_PACKAGE_LIBS( ROOT ${_root_libnames} )
+
+
+
+
+    # ====== DL LIBRARY ==================================================
+    # workaround for cmake bug in 64 bit:
+    # see: http://public.kitware.com/mantis/view.php?id=10813
+    IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+        FIND_LIBRARY( DL_LIB NAMES ${CMAKE_DL_LIBS} dl PATHS /usr/lib64 /lib64 NO_DEFAULT_PATH )
+    ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+    FIND_LIBRARY( DL_LIB NAMES ${CMAKE_DL_LIBS} dl )
+    MARK_AS_ADVANCED( DL_LIB )
+
+    IF( NOT ROOT_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for libdl.so: ${DL_LIB}" )
+    ENDIF()
+
+ENDIF( ROOT_CONFIG_EXECUTABLE )
+
+# Threads library
+#FIND_PACKAGE( Threads REQUIRED)
+
+
+# ---------- final checking ---------------------------------------------------
+INCLUDE( FindPackageHandleStandardArgs )
+# set ROOT_FOUND to TRUE if all listed variables are TRUE and not empty
+# ROOT_COMPONENT_VARIABLES will be set if FIND_PACKAGE is called with REQUIRED argument
+FIND_PACKAGE_HANDLE_STANDARD_ARGS( ROOT DEFAULT_MSG ROOT_INCLUDE_DIRS ROOT_LIBRARIES ${ROOT_COMPONENT_VARIABLES} PACKAGE_VERSION_COMPATIBLE DL_LIB )
+
+IF( ROOT_FOUND )
+    LIST( APPEND ROOT_LIBRARIES ${DL_LIB} )
+    # FIXME DEPRECATED
+    SET( ROOT_DEFINITIONS "-DUSEROOT -DUSE_ROOT -DMARLIN_USE_ROOT" )
+    MARK_AS_ADVANCED( ROOT_DEFINITIONS )
+
+    # file including MACROS for generating root dictionary sources
+    GET_FILENAME_COMPONENT( _aux ${CMAKE_CURRENT_LIST_FILE} PATH )
+    SET( ROOT_DICT_MACROS_FILE ${_aux}/MacroRootDict.cmake )
+
+ENDIF( ROOT_FOUND )
+
+# ---------- cmake bug --------------------------------------------------------
+# ROOT_FIND_REQUIRED is not reset between FIND_PACKAGE calls, i.e. the following
+# code fails when geartgeo component not available: (fixed in cmake 2.8)
+# FIND_PACKAGE( ROOT REQUIRED )
+# FIND_PACKAGE( ROOT COMPONENTS geartgeo QUIET )
+SET( ROOT_FIND_REQUIRED )
+
diff --git a/Utilities/KalDet/kaldet/EXVKalDetector.h b/Utilities/KalDet/kaldet/EXVKalDetector.h
index bb1e09cb..16e1d926 100644
--- a/Utilities/KalDet/kaldet/EXVKalDetector.h
+++ b/Utilities/KalDet/kaldet/EXVKalDetector.h
@@ -34,8 +34,8 @@ class TNode;
  *
  * \deprecated EXVKalDetector
  */
-class EXVKalDetector : public TVKalDetector, public TAttDrawable {
-  //class EXVKalDetector : public TVKalDetector {
+// class EXVKalDetector : public TVKalDetector, public TAttDrawable {
+class EXVKalDetector : public TVKalDetector {
 public:
   EXVKalDetector(Double_t bField, Int_t m = 100);
   virtual ~EXVKalDetector();
diff --git a/Utilities/KalDet/kaldet/ILDConeMeasLayer.h b/Utilities/KalDet/kaldet/ILDConeMeasLayer.h
index 00e9fb06..ba2138e0 100644
--- a/Utilities/KalDet/kaldet/ILDConeMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDConeMeasLayer.h
@@ -60,7 +60,7 @@ public:
    Bool_t IsOnSurface(const TVector3 &xx) const;
 
    /** Convert LCIO Tracker Hit to an ILDCylinderHit  */
-   virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+   virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
       
       /* streamlog_out( ERROR ) << "Don't use this, it's not implemented!"; */
       return NULL;
diff --git a/Utilities/KalDet/kaldet/ILDCylinderHit.h b/Utilities/KalDet/kaldet/ILDCylinderHit.h
index 9dbe5b73..ca694e6e 100644
--- a/Utilities/KalDet/kaldet/ILDCylinderHit.h
+++ b/Utilities/KalDet/kaldet/ILDCylinderHit.h
@@ -17,7 +17,7 @@ public:
   
   /** Constructor Taking R and Rphi coordinates and associated measurement layer, with bfield */
   ILDCylinderHit(const TVMeasLayer &ms, Double_t *x, Double_t *dx, 
-                 Double_t bfield, edm4hep::TrackerHit* trkhit ) 
+                 Double_t bfield, edm4hep::ConstTrackerHit trkhit ) 
   : ILDVTrackHit(ms, x, dx, bfield, 2, trkhit)
   { /* no op */ } 
     
diff --git a/Utilities/KalDet/kaldet/ILDCylinderMeasLayer.h b/Utilities/KalDet/kaldet/ILDCylinderMeasLayer.h
index 04740cc8..fd408f08 100644
--- a/Utilities/KalDet/kaldet/ILDCylinderMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDCylinderMeasLayer.h
@@ -71,7 +71,7 @@ public:
                                 TKalMatrix &H)    const;
   
   /** Convert LCIO Tracker Hit to an ILDCylinderHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   /** Get the intersection and the CellID, needed for multilayers */
   virtual int getIntersectionAndCellID(const TVTrack  &hel,
diff --git a/Utilities/KalDet/kaldet/ILDDiscMeasLayer.h b/Utilities/KalDet/kaldet/ILDDiscMeasLayer.h
index fe3ff826..a4e2f387 100644
--- a/Utilities/KalDet/kaldet/ILDDiscMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDDiscMeasLayer.h
@@ -70,7 +70,7 @@ public:
     
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   /** Check if global point is on surface  */
   inline virtual Bool_t   IsOnSurface (const TVector3 &xx) const;
diff --git a/Utilities/KalDet/kaldet/ILDParallelPlanarStripMeasLayer.h b/Utilities/KalDet/kaldet/ILDParallelPlanarStripMeasLayer.h
index c717f4c1..8ecf1e0c 100644
--- a/Utilities/KalDet/kaldet/ILDParallelPlanarStripMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDParallelPlanarStripMeasLayer.h
@@ -50,7 +50,7 @@ public:
   
   void CalcDhDa(const TVTrackHit &vht, const TVector3   &xxv, const TKalMatrix &dxphiada, TKalMatrix &H)  const;
     
-  ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const;
+  ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const;
   
 private:
   
diff --git a/Utilities/KalDet/kaldet/ILDPlanarHit.h b/Utilities/KalDet/kaldet/ILDPlanarHit.h
index e54f0cf7..a3cb42c0 100644
--- a/Utilities/KalDet/kaldet/ILDPlanarHit.h
+++ b/Utilities/KalDet/kaldet/ILDPlanarHit.h
@@ -21,7 +21,7 @@ public:
                Double_t           *x,
                Double_t           *dx,
                Double_t           bfield,
-               edm4hep::TrackerHit* trkhit) 
+               edm4hep::ConstTrackerHit trkhit) 
   : ILDVTrackHit(ms, x, dx, bfield, ILDPlanarHit_DIM,trkhit)
   { /* no op */ } 
   
diff --git a/Utilities/KalDet/kaldet/ILDPlanarMeasLayer.h b/Utilities/KalDet/kaldet/ILDPlanarMeasLayer.h
index 500f2a23..45f93877 100644
--- a/Utilities/KalDet/kaldet/ILDPlanarMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDPlanarMeasLayer.h
@@ -63,7 +63,7 @@ public:
                                 const TKalMatrix &dxphiada,
                                 TKalMatrix &H)  const;
   
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   virtual Bool_t   IsOnSurface (const TVector3 &xx) const;
   
diff --git a/Utilities/KalDet/kaldet/ILDPlanarStripHit.h b/Utilities/KalDet/kaldet/ILDPlanarStripHit.h
index 1103eeda..30d56864 100644
--- a/Utilities/KalDet/kaldet/ILDPlanarStripHit.h
+++ b/Utilities/KalDet/kaldet/ILDPlanarStripHit.h
@@ -22,7 +22,7 @@ public:
                Double_t       *x,
                Double_t       *dx,
                Double_t        bfield,
-               edm4hep::TrackerHit* trkhit) 
+               edm4hep::ConstTrackerHit trkhit) 
   : ILDVTrackHit(ms, x, dx, bfield, ILDPlanarStripHit_DIM,trkhit)
   { /* no op */ } 
   
diff --git a/Utilities/KalDet/kaldet/ILDPolygonBarrelMeasLayer.h b/Utilities/KalDet/kaldet/ILDPolygonBarrelMeasLayer.h
index 684bb876..16fa5320 100644
--- a/Utilities/KalDet/kaldet/ILDPolygonBarrelMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDPolygonBarrelMeasLayer.h
@@ -70,7 +70,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
 
   /** overloaded version of CalcXingPointWith using closed solution*/
   virtual Int_t    CalcXingPointWith(const TVTrack  &hel,
diff --git a/Utilities/KalDet/kaldet/ILDRotatedTrapMeaslayer.h b/Utilities/KalDet/kaldet/ILDRotatedTrapMeaslayer.h
index 8cb7e4e0..dce3303b 100644
--- a/Utilities/KalDet/kaldet/ILDRotatedTrapMeaslayer.h
+++ b/Utilities/KalDet/kaldet/ILDRotatedTrapMeaslayer.h
@@ -57,7 +57,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   /** Check if global point is on surface  */
   inline virtual Bool_t   IsOnSurface (const TVector3 &xx) const;
diff --git a/Utilities/KalDet/kaldet/ILDSegmentedDiscMeasLayer.h b/Utilities/KalDet/kaldet/ILDSegmentedDiscMeasLayer.h
index 61335702..6afdc9f8 100644
--- a/Utilities/KalDet/kaldet/ILDSegmentedDiscMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDSegmentedDiscMeasLayer.h
@@ -77,7 +77,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
 
   /** overloaded version of CalcXingPointWith using closed solution*/
   virtual Int_t    CalcXingPointWith(const TVTrack  &hel,
diff --git a/Utilities/KalDet/kaldet/ILDSegmentedDiscStripMeasLayer.h b/Utilities/KalDet/kaldet/ILDSegmentedDiscStripMeasLayer.h
index 8bdab668..34a3b203 100644
--- a/Utilities/KalDet/kaldet/ILDSegmentedDiscStripMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDSegmentedDiscStripMeasLayer.h
@@ -67,7 +67,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
 private:
   
diff --git a/Utilities/KalDet/kaldet/ILDVMeasLayer.h b/Utilities/KalDet/kaldet/ILDVMeasLayer.h
index 3d213b3a..498c5608 100644
--- a/Utilities/KalDet/kaldet/ILDVMeasLayer.h
+++ b/Utilities/KalDet/kaldet/ILDVMeasLayer.h
@@ -13,6 +13,7 @@
 #include "kaltest/TAttDrawable.h"
 #include "kaltest/KalTrackDim.h"
 #include "TString.h"
+#include "edm4hep/TrackerHitConst.h"
 
 #include <vector>
 
@@ -43,7 +44,7 @@ public:
   inline Double_t GetBz() const { return _Bz; }
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const = 0 ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const = 0 ;
   
   /** Check whether the measurement layer represents a series of detector elements */
   bool isMultilayer() const { return _isMultiLayer; } 
diff --git a/Utilities/KalDet/kaldet/ILDVTrackHit.h b/Utilities/KalDet/kaldet/ILDVTrackHit.h
index d47be083..89aa42f2 100644
--- a/Utilities/KalDet/kaldet/ILDVTrackHit.h
+++ b/Utilities/KalDet/kaldet/ILDVTrackHit.h
@@ -19,15 +19,15 @@ public:
   
    /** Constructor Taking coordinates and associated measurement layer, with bfield and number of measurement dimentions*/
   ILDVTrackHit(const TVMeasLayer &ms, Double_t *x, Double_t *dx, 
-               Double_t bfield , Int_t dim, edm4hep::TrackerHit* trkhit) 
+               Double_t bfield , Int_t dim, edm4hep::ConstTrackerHit trkhit) 
   : TVTrackHit(ms, x, dx, bfield, dim), _trkhit(trkhit)
   { /* no op */ }
   
-  edm4hep::TrackerHit* getLCIOTrackerHit() const { return _trkhit; }
+  edm4hep::ConstTrackerHit getLCIOTrackerHit() const { return _trkhit; }
   
 private:
   
-  edm4hep::TrackerHit* _trkhit;
+  edm4hep::ConstTrackerHit _trkhit;
   
 };
 #endif
diff --git a/Utilities/KalDet/src/gen/EXEventGen.cxx b/Utilities/KalDet/src/gen/EXEventGen.cxx
index c10325c4..fa509413 100644
--- a/Utilities/KalDet/src/gen/EXEventGen.cxx
+++ b/Utilities/KalDet/src/gen/EXEventGen.cxx
@@ -1,8 +1,8 @@
 #include "EXEventGen.h"
 //#include "EXVKalDetector.h"
 //#include <EXVMeasLayer.h>
-#include "EXTPCKalDetector.h"
-#include <EXTPCMeasLayer.h>
+#include "kaldet/EXTPCKalDetector.h"
+#include <kaldet/EXTPCMeasLayer.h>
 #include <kaltest/TPlane.h>
 #include <TRandom.h>
 #include <TMath.h>
diff --git a/Utilities/KalDet/src/ild/common/ILDConeMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDConeMeasLayer.h
index 00e9fb06..ba2138e0 100644
--- a/Utilities/KalDet/src/ild/common/ILDConeMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDConeMeasLayer.h
@@ -60,7 +60,7 @@ public:
    Bool_t IsOnSurface(const TVector3 &xx) const;
 
    /** Convert LCIO Tracker Hit to an ILDCylinderHit  */
-   virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+   virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
       
       /* streamlog_out( ERROR ) << "Don't use this, it's not implemented!"; */
       return NULL;
diff --git a/Utilities/KalDet/src/ild/common/ILDCylinderHit.h b/Utilities/KalDet/src/ild/common/ILDCylinderHit.h
index 9dbe5b73..ca694e6e 100644
--- a/Utilities/KalDet/src/ild/common/ILDCylinderHit.h
+++ b/Utilities/KalDet/src/ild/common/ILDCylinderHit.h
@@ -17,7 +17,7 @@ public:
   
   /** Constructor Taking R and Rphi coordinates and associated measurement layer, with bfield */
   ILDCylinderHit(const TVMeasLayer &ms, Double_t *x, Double_t *dx, 
-                 Double_t bfield, edm4hep::TrackerHit* trkhit ) 
+                 Double_t bfield, edm4hep::ConstTrackerHit trkhit ) 
   : ILDVTrackHit(ms, x, dx, bfield, 2, trkhit)
   { /* no op */ } 
     
diff --git a/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.cc b/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.cc
index 72cb1119..fc41a5e1 100644
--- a/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.cc
@@ -2,6 +2,8 @@
  *
  * @author S.Aplin DESY
  */
+
+
 #include "kaltest/TKalTrack.h" 
 
 #include "ILDCylinderMeasLayer.h"
@@ -108,13 +110,13 @@ void ILDCylinderMeasLayer::CalcDhDa(const TVTrackHit &vht, // tracker hit not us
 
 /** Convert LCIO Tracker Hit to an ILDCylinderHit  */
 
-ILDVTrackHit* ILDCylinderMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
-  if ( ! trkhit) {
+ILDVTrackHit* ILDCylinderMeasLayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
+  if ( ! trkhit.isAvailable() ) {
     // streamlog_out(ERROR) << "ILDCylinderMeasLayer::ConvertLCIOTrkHit trkhit pointer is NULL" << std::endl;
     return NULL;
   }
 
-  const edm4hep::Vector3d& pos = trkhit->getPosition();
+  const edm4hep::Vector3d& pos = trkhit.getPosition();
   const TVector3 hit(pos.x, pos.y, pos.z) ;
   //SJA:FIXME: this assumes that the cylinder is centred at 0,0
   
@@ -129,16 +131,16 @@ ILDVTrackHit* ILDCylinderMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhi
   
   
   //EVENT::TrackerHitZCylinder* cylinder_hit = dynamic_cast<EVENT::TrackerHitZCylinder*>( trkhit ) ;
-  if(trkhit->getType()==16){
+  if(trkhit.getType()==16){
   //if(cylinder_hit){
     // convert errors
-    dx[0] = trkhit->getCovMatrix(0);
-    dx[1] = trkhit->getCovMatrix(1);
+    dx[0] = trkhit.getCovMatrix(0);
+    dx[1] = trkhit.getCovMatrix(1);
   }
   else {
     // convert errors
-    dx[0] = sqrt(trkhit->getCovMatrix(0) + trkhit->getCovMatrix(2)) ;
-    dx[1] = sqrt(trkhit->getCovMatrix(5)); 
+    dx[0] = sqrt(trkhit.getCovMatrix(0) + trkhit.getCovMatrix(2)) ;
+    dx[1] = sqrt(trkhit.getCovMatrix(5)); 
   }
   
     
diff --git a/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.h
index 04740cc8..fd408f08 100644
--- a/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDCylinderMeasLayer.h
@@ -71,7 +71,7 @@ public:
                                 TKalMatrix &H)    const;
   
   /** Convert LCIO Tracker Hit to an ILDCylinderHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   /** Get the intersection and the CellID, needed for multilayers */
   virtual int getIntersectionAndCellID(const TVTrack  &hel,
diff --git a/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.cc b/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.cc
index d8d476fc..d0c0dad4 100644
--- a/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.cc
@@ -207,19 +207,19 @@ Bool_t ILDDiscMeasLayer::IsOnSurface(const TVector3 &xx) const
 }
 
 
-ILDVTrackHit* ILDDiscMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+ILDVTrackHit* ILDDiscMeasLayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
   
   //edm4hep::TrackerHitPlane* plane_hit = dynamic_cast<EVENT::TrackerHitPlane*>( trkhit ) ;
   //edm4hep::TrackerHitPlane* plane_hit = trkhit;
-  if((trkhit->getType()&8)!=8) return NULL;
+  if(trkhit.getType()!=8) return NULL;
   
-  //edm4hep::TrackerHit* plane_hit = trkhit;
+  //edm4hep::ConstTrackerHit plane_hit = trkhit;
   //if( plane_hit == NULL )  return NULL; // SJA:FIXME: should be replaced with an exception  
   
-  //gear::Vector3D U(1.0,plane_hit->getU()[1],plane_hit->getU()[0],gear::Vector3D::spherical);
-  //gear::Vector3D V(1.0,plane_hit->getV()[1],plane_hit->getV()[0],gear::Vector3D::spherical);
-  gear::Vector3D U(1.0,trkhit->getCovMatrix(1),trkhit->getCovMatrix(0),gear::Vector3D::spherical);
-  gear::Vector3D V(1.0,trkhit->getCovMatrix(5),trkhit->getCovMatrix(4),gear::Vector3D::spherical);
+  //gear::Vector3D U(1.0,plane_hit.getU()[1],plane_hit.getU()[0],gear::Vector3D::spherical);
+  //gear::Vector3D V(1.0,plane_hit.getV()[1],plane_hit.getV()[0],gear::Vector3D::spherical);
+  gear::Vector3D U(1.0,trkhit.getCovMatrix(1),trkhit.getCovMatrix(0),gear::Vector3D::spherical);
+  gear::Vector3D V(1.0,trkhit.getCovMatrix(5),trkhit.getCovMatrix(4),gear::Vector3D::spherical);
   gear::Vector3D X(1.0,0.0,0.0);
   gear::Vector3D Y(0.0,1.0,0.0);
   
@@ -236,7 +236,7 @@ ILDVTrackHit* ILDDiscMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) c
     exit(1);
   }
   
-  const edm4hep::Vector3d& pos=trkhit->getPosition();
+  const edm4hep::Vector3d& pos=trkhit.getPosition();
   const TVector3 hit(pos.x, pos.y, pos.z);
   
   // convert to layer coordinates       
@@ -248,10 +248,10 @@ ILDVTrackHit* ILDDiscMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) c
   x[0] = h(0, 0);
   x[1] = h(1, 0);
   
-  //dx[0] = plane_hit->getdU() ;
-  //dx[1] = plane_hit->getdV() ;
-  dx[0] = trkhit->getCovMatrix(2);
-  dx[1] = trkhit->getCovMatrix(5);
+  //dx[0] = plane_hit.getdU() ;
+  //dx[1] = plane_hit.getdV() ;
+  dx[0] = trkhit.getCovMatrix(2);
+  dx[1] = trkhit.getCovMatrix(5);
 
   bool hit_on_surface = IsOnSurface(hit);
   
diff --git a/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.h
index fe3ff826..a4e2f387 100644
--- a/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDDiscMeasLayer.h
@@ -70,7 +70,7 @@ public:
     
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   /** Check if global point is on surface  */
   inline virtual Bool_t   IsOnSurface (const TVector3 &xx) const;
diff --git a/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.cc b/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.cc
index b7064d81..f2959c96 100644
--- a/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.cc
@@ -162,11 +162,11 @@ void ILDParallelPlanarStripMeasLayer::CalcDhDa(const TVTrackHit &vht,
   
 }
 
-ILDVTrackHit* ILDParallelPlanarStripMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+ILDVTrackHit* ILDParallelPlanarStripMeasLayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
   
   //EVENT::TrackerHitPlane* plane_hit = dynamic_cast<EVENT::TrackerHitPlane*>( trkhit ) ;
-  //if( plane_hit == NULL )  {
-  if((trkhit->getType()&8)!=8) {
+  if((trkhit.getType()&8)!=8) {
+    //if( plane_hit == NULL )  { 
     std::cout << "ILDParallelPlanarStripMeasLayer::ConvertLCIOTrkHit dynamic_cast to ILDPlanarStripHit failed " << std::endl; 
     throw std::logic_error("Invalid invoke ILDParallelPlanarStripMeasLayer by TrackerHit trkhit");
   }
@@ -174,8 +174,8 @@ ILDVTrackHit* ILDParallelPlanarStripMeasLayer::ConvertLCIOTrkHit(edm4hep::Tracke
   
   // remember here the "position" of the hit in fact defines the origin of the plane it defines so u and v are per definition 0. 
   // this is still the case for a 1-dimentional measurement, and is then used to calculate the u coordinate according to the origin of the actual measurement plane.
-  //const TVector3 hit( plane_hit->getPosition()[0], plane_hit->getPosition()[1], plane_hit->getPosition()[2]) ;
-  const edm4hep::Vector3d& pos=trkhit->getPosition(); 
+  //const TVector3 hit( plane_hit.getPosition()[0], plane_hit.getPosition()[1], plane_hit.getPosition()[2]) ;
+  const edm4hep::Vector3d& pos=trkhit.getPosition(); 
   const TVector3 hit(pos.x, pos.y, pos.z);
   
   // convert to layer coordinates       
@@ -188,15 +188,15 @@ ILDVTrackHit* ILDParallelPlanarStripMeasLayer::ConvertLCIOTrkHit(edm4hep::Tracke
   x[0] = h(0, 0);
   if(ILDPlanarStripHit_DIM == 2) x[1] = h(1, 0);
 
-  //dx[0] = plane_hit->getdU() ;
-  //if(ILDPlanarStripHit_DIM == 2) dx[1] = plane_hit->getdV() ;
-  dx[0] = trkhit->getCovMatrix(2);
-  if(ILDPlanarStripHit_DIM == 2) dx[1] = trkhit->getCovMatrix(5);
+  //dx[0] = plane_hit.getdU() ;
+  //if(ILDPlanarStripHit_DIM == 2) dx[1] = plane_hit.getdV() ;
+  dx[0] = trkhit.getCovMatrix(2);
+  if(ILDPlanarStripHit_DIM == 2) dx[1] = trkhit.getCovMatrix(5);
 
   bool hit_on_surface = IsOnSurface(hit);
   /*
   std::cout << "ILDParallelPlanarStripMeasLayer::ConvertLCIOTrkHit ILDPlanarStripHit created" 
-	    << " for CellID " << trkhit->getCellID()
+	    << " for CellID " << trkhit.getCellID()
 	    << " Layer R = " << this->GetXc().Perp() 
 	    << " Layer phi = " << this->GetXc().Phi() 
 	    << " Layer z0 = " << this->GetXc().Z() 
diff --git a/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.h
index c717f4c1..8ecf1e0c 100644
--- a/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDParallelPlanarStripMeasLayer.h
@@ -50,7 +50,7 @@ public:
   
   void CalcDhDa(const TVTrackHit &vht, const TVector3   &xxv, const TKalMatrix &dxphiada, TKalMatrix &H)  const;
     
-  ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const;
+  ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const;
   
 private:
   
diff --git a/Utilities/KalDet/src/ild/common/ILDPlanarHit.h b/Utilities/KalDet/src/ild/common/ILDPlanarHit.h
index e54f0cf7..a3cb42c0 100644
--- a/Utilities/KalDet/src/ild/common/ILDPlanarHit.h
+++ b/Utilities/KalDet/src/ild/common/ILDPlanarHit.h
@@ -21,7 +21,7 @@ public:
                Double_t           *x,
                Double_t           *dx,
                Double_t           bfield,
-               edm4hep::TrackerHit* trkhit) 
+               edm4hep::ConstTrackerHit trkhit) 
   : ILDVTrackHit(ms, x, dx, bfield, ILDPlanarHit_DIM,trkhit)
   { /* no op */ } 
   
diff --git a/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.cc b/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.cc
index ad196d2e..d0b30b96 100644
--- a/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.cc
@@ -244,19 +244,19 @@ Bool_t ILDPlanarMeasLayer::IsOnSurface(const TVector3 &xx) const
 }
 
 
-ILDVTrackHit* ILDPlanarMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
-  //std::cout << "ILDPlanarMeasLayer::ConvertLCIOTrkHit " << trkhit << " type=" << trkhit->getType() << std::endl;
+ILDVTrackHit* ILDPlanarMeasLayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
+  //std::cout << "ILDPlanarMeasLayer::ConvertLCIOTrkHit " << trkhit << " type=" << trkhit.getType() << std::endl;
   //EVENT::TrackerHitPlane* plane_hit = dynamic_cast<EVENT::TrackerHitPlane*>( trkhit ) ;
-  if((trkhit->getType()&8)!=8){
-    std::cout << "ILDPlanarMeasLayer::ConvertLCIOTrkHit Warning: type is not 8, but " << (trkhit->getType()&8) << std::endl;
+  if((trkhit.getType()&8)!=8){
+    std::cout << "ILDPlanarMeasLayer::ConvertLCIOTrkHit Warning: type is not 8, but " << (trkhit.getType()&8) << std::endl;
     return NULL;
   }
   //if( plane_hit == NULL )  return NULL; // SJA:FIXME: should be replaced with an exception  
 
-  //gear::Vector3D U(1.0,plane_hit->getU()[1],plane_hit->getU()[0],gear::Vector3D::spherical);
-  //gear::Vector3D V(1.0,plane_hit->getV()[1],plane_hit->getV()[0],gear::Vector3D::spherical);
-  gear::Vector3D U(1.0,trkhit->getCovMatrix(1),trkhit->getCovMatrix(0),gear::Vector3D::spherical);
-  gear::Vector3D V(1.0,trkhit->getCovMatrix(4),trkhit->getCovMatrix(3),gear::Vector3D::spherical);
+  //gear::Vector3D U(1.0,plane_hit.getU()[1],plane_hit.getU()[0],gear::Vector3D::spherical);
+  //gear::Vector3D V(1.0,plane_hit.getV()[1],plane_hit.getV()[0],gear::Vector3D::spherical);
+  gear::Vector3D U(1.0,trkhit.getCovMatrix(1),trkhit.getCovMatrix(0),gear::Vector3D::spherical);
+  gear::Vector3D V(1.0,trkhit.getCovMatrix(4),trkhit.getCovMatrix(3),gear::Vector3D::spherical);
   gear::Vector3D Z(0.0,0.0,1.0);
   
   const float eps = 1.0e-07;
@@ -272,7 +272,7 @@ ILDVTrackHit* ILDPlanarMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit)
   }
 
   // remember here the "position" of the hit in fact defines the origin of the plane it defines so u and v are per definition 0. 
-  const edm4hep::Vector3d& pos=trkhit->getPosition();
+  const edm4hep::Vector3d& pos=trkhit.getPosition();
   const TVector3 hit(pos.x, pos.y, pos.z) ;
   
   // convert to layer coordinates       
@@ -284,13 +284,13 @@ ILDVTrackHit* ILDPlanarMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit)
   x[0] = h(0, 0);
   x[1] = h(1, 0);
   
-  dx[0] = trkhit->getCovMatrix(2);
-  dx[1] = trkhit->getCovMatrix(5);
+  dx[0] = trkhit.getCovMatrix(2);
+  dx[1] = trkhit.getCovMatrix(5);
   
   bool hit_on_surface = IsOnSurface(hit);
   /*
   std::cout << "ILDPlanarMeasLayer::ConvertLCIOTrkHit ILDPlanarHit created" 
-			<< " for CellID " << trkhit->getCellID()
+			<< " for CellID " << trkhit.getCellID()
 			<< " Layer R = " << this->GetXc().Perp() 
 			<< " Layer phi = " << this->GetXc().Phi() 
 			<< " Layer z0 = " << this->GetXc().Z() 
diff --git a/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.h
index 500f2a23..45f93877 100644
--- a/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDPlanarMeasLayer.h
@@ -63,7 +63,7 @@ public:
                                 const TKalMatrix &dxphiada,
                                 TKalMatrix &H)  const;
   
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   virtual Bool_t   IsOnSurface (const TVector3 &xx) const;
   
diff --git a/Utilities/KalDet/src/ild/common/ILDPlanarStripHit.h b/Utilities/KalDet/src/ild/common/ILDPlanarStripHit.h
index 1103eeda..30d56864 100644
--- a/Utilities/KalDet/src/ild/common/ILDPlanarStripHit.h
+++ b/Utilities/KalDet/src/ild/common/ILDPlanarStripHit.h
@@ -22,7 +22,7 @@ public:
                Double_t       *x,
                Double_t       *dx,
                Double_t        bfield,
-               edm4hep::TrackerHit* trkhit) 
+               edm4hep::ConstTrackerHit trkhit) 
   : ILDVTrackHit(ms, x, dx, bfield, ILDPlanarStripHit_DIM,trkhit)
   { /* no op */ } 
   
diff --git a/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.cc b/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.cc
index c1348fd0..aeef051c 100644
--- a/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.cc
@@ -136,9 +136,9 @@ Bool_t ILDPolygonBarrelMeasLayer::IsOnSurface(const TVector3 &xx) const
 }
 
 
-ILDVTrackHit* ILDPolygonBarrelMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+ILDVTrackHit* ILDPolygonBarrelMeasLayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
   
-  std::cout << "ILDPolygonBarrelMeasLayer::ConvertLCIOTrkHit Not implemented: exit(1) called from " << __FILE__ << "   line " << __LINE__ << std::endl; 
+  // streamlog_out(ERROR) << "ILDPolygonBarrelMeasLayer::ConvertLCIOTrkHit Not implemented: exit(1) called from " << __FILE__ << "   line " << __LINE__ << std::endl; 
   exit(1);
     
 }
diff --git a/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.h
index 684bb876..16fa5320 100644
--- a/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDPolygonBarrelMeasLayer.h
@@ -70,7 +70,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
 
   /** overloaded version of CalcXingPointWith using closed solution*/
   virtual Int_t    CalcXingPointWith(const TVTrack  &hel,
diff --git a/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.cc b/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.cc
index c9f855e0..38b3b56f 100644
--- a/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.cc
@@ -155,12 +155,12 @@ Bool_t ILDRotatedTrapMeaslayer::IsOnSurface(const TVector3 &xx) const
 }
 
 
-ILDVTrackHit* ILDRotatedTrapMeaslayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+ILDVTrackHit* ILDRotatedTrapMeaslayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
   
   //EVENT::TrackerHitPlane* plane_hit = dynamic_cast<EVENT::TrackerHitPlane*>( trkhit ) ;
-  if(trkhit->getType()!=8) return NULL;
+  if(trkhit.getType()!=8) return NULL;
   //if( plane_hit == NULL )  return NULL; // SJA:FIXME: should be replaced with an exception  
-  const edm4hep::Vector3d& pos=trkhit->getPosition();
+  const edm4hep::Vector3d& pos=trkhit.getPosition();
   const TVector3 hit(pos.x, pos.y, pos.z);
   
   // convert to layer coordinates       
@@ -172,8 +172,8 @@ ILDVTrackHit* ILDRotatedTrapMeaslayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* tr
   x[0] = h(0, 0);
   x[1] = h(1, 0);
   
-  dx[0] = trkhit->getCovMatrix(2);
-  dx[1] = trkhit->getCovMatrix(5);
+  dx[0] = trkhit.getCovMatrix(2);
+  dx[1] = trkhit.getCovMatrix(5);
   
   bool hit_on_surface = IsOnSurface(hit);
   
diff --git a/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.h b/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.h
index 8cb7e4e0..dce3303b 100644
--- a/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDRotatedTrapMeaslayer.h
@@ -57,7 +57,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
   /** Check if global point is on surface  */
   inline virtual Bool_t   IsOnSurface (const TVector3 &xx) const;
diff --git a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.cc b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.cc
index 87cac85c..9fca07c1 100644
--- a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.cc
@@ -124,13 +124,14 @@ TKalMatrix ILDSegmentedDiscMeasLayer::XvToMv(const TVector3 &xv) const
 //  
 //  
 //  mv(1,0)  = xv.Y() ;
-  /*
-  std::cout << "\t ILDSegmentedDiscMeasLayer::XvToMv: "
-	    << " x = " << xv.X() 
-	    << " y = " << xv.Y() 
-	    << " z = " << xv.Z() 
-	    << std::endl;
-  */
+
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscMeasLayer::XvToMv: "
+  // << " x = " << xv.X() 
+  // << " y = " << xv.Y() 
+  // << " z = " << xv.Z() 
+  // << std::endl;
+
+  
   // coordinate matrix to return
   TKalMatrix mv(ILDPlanarHit_DIM,1);
 
@@ -165,23 +166,24 @@ TKalMatrix ILDSegmentedDiscMeasLayer::XvToMv(const TVector3 &xv) const
   double v =   ( cos_theta * delta_y * cos_phi - cos_theta * delta_x * sin_phi) ; 
   mv(1,0) = v ;
   
-  /*
-  std::cout << "\t ILDSegmentedDiscMeasLayer::XvToMv: phi_sensor = " << phi_sensor << " phi = " << phi << " sign_z = " << sign_z<< std::endl;
   
-  std::cout << "\t ILDSegmentedDiscMeasLayer::XvToMv: "
-	    << " mv(0,0) = " << mv(0,0) 
-	    << " mv(1,0) = " << mv(1,0) 
-	    << std::endl;
-  */
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscMeasLayer::XvToMv: phi_sensor = " << phi_sensor << " phi = " << phi << " sign_z = " << sign_z<< std::endl;
+  
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscMeasLayer::XvToMv: "
+  // << " mv(0,0) = " << mv(0,0) 
+  // << " mv(1,0) = " << mv(1,0) 
+  // << std::endl;
+
   return mv;
   
 }
 
 
-TVector3 ILDSegmentedDiscMeasLayer::HitToXv(const TVTrackHit &vht) const {
+TVector3 ILDSegmentedDiscMeasLayer::HitToXv(const TVTrackHit &vht) const
+{
   
-  //std::cout << "\t ILDSegmentedDiscMeasLayer::HitToXv: "
-  //	    << " vht(0,0) = " << vht(0,0) << " vht(1,0) = " << vht(1,0) << std::endl;
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscMeasLayer::HitToXv: "
+  // << " vht(0,0) = " << vht(0,0) << " vht(1,0) = " << vht(1,0) << std::endl;
   
   const ILDPlanarHit &mv = dynamic_cast<const ILDPlanarHit &>(vht);
     
@@ -191,8 +193,8 @@ TVector3 ILDSegmentedDiscMeasLayer::HitToXv(const TVTrackHit &vht) const {
 //  double z = this->GetXc().Z() ;
 
   UTIL::BitField64 encoder( lcio::ILDCellID0::encoder_string ) ;
-  edm4hep::TrackerHit* hit = mv.getLCIOTrackerHit();
-  encoder.setValue(hit->getCellID());
+  edm4hep::ConstTrackerHit hit = mv.getLCIOTrackerHit();
+  encoder.setValue(hit.getCellID());
   int segmentIndex = encoder[lcio::ILDCellID0::module] / 2 ;
   
   
@@ -223,13 +225,13 @@ TVector3 ILDSegmentedDiscMeasLayer::HitToXv(const TVTrackHit &vht) const {
   double y = delta_y + sensor_y0; 
   
   double z = sensor_z0 ;
-  /*
-  std::cout << "\t ILDSegmentedDiscMeasLayer::HitToXv: "
-	    << " x = " << x 
-	    << " y = " << y 
-	    << " z = " << z 
-	    << std::endl;
-  */
+  
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscMeasLayer::HitToXv: "
+  // << " x = " << x 
+  // << " y = " << y 
+  // << " z = " << z 
+  // << std::endl;
+
   return TVector3(x,y,z);
 
 }
@@ -282,20 +284,21 @@ void ILDSegmentedDiscMeasLayer::CalcDhDa(const TVTrackHit &vht,
   Int_t hdim = TMath::Max(5,sdim-1);
   
   // Set H = (@h/@a) = (@d/@a, @z/@a)^t
-    
+  
+  
   double dudx =   cos_phi;
   double dudy =   sin_phi;
   
   double dvdx =  -cos_theta * sin_phi;
   double dvdy =   cos_theta * cos_phi;
-  /*
-  std::cout << "\t ILDSegmentedDiscMeasLayer::CalcDhDa: "
-	    << " dudx = " << dudx 
-	    << " dudy = " << dudy
-	    << " dvdx = " << dvdx 
-	    << " dvdy = " << dvdy 
-	    << std::endl;
-  */	    
+  
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscMeasLayer::CalcDhDa: "
+  // << " dudx = " << dudx 
+  // << " dudy = " << dudy
+  // << " dvdx = " << dvdx 
+  // << " dvdy = " << dvdy 
+  // << std::endl;
+  
   for (Int_t i=0; i<hdim; i++) {
     
     H(0,i) = dudx * dxphiada(0,i) + dudy * dxphiada(1,i) ;
@@ -308,6 +311,18 @@ void ILDSegmentedDiscMeasLayer::CalcDhDa(const TVTrackHit &vht,
     H(1,sdim-1) = 0.;
 
   }
+  
+ 
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
 }
 
 
@@ -480,19 +495,16 @@ Bool_t ILDSegmentedDiscMeasLayer::IsOnSurface(const TVector3 &xx) const
 }
 
 
-ILDVTrackHit* ILDSegmentedDiscMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+ILDVTrackHit* ILDSegmentedDiscMeasLayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
   //EVENT::TrackerHitPlane* plane_hit = dynamic_cast<EVENT::TrackerHitPlane*>( trkhit ) ;
+  if(trkhit.getType()!=8) {
   //if( plane_hit == NULL )  { 
     // streamlog_out(ERROR) << "ILDSegmentedDiscMeasLayer::ConvertLCIOTrkHit dynamic_cast to TrackerHitPlane failed " << std::endl; 
-    //return NULL; // SJA:FIXME: should be replaced with an exception  
-  //}
-  if((trkhit->getType()&8)!=8) {
-    std::cout << "ILDSegmentedDiscMeasLayer::ConvertLCIOTrkHit dynamic_cast to ILDPlanarHit failed " << std::endl;
-    throw std::logic_error("Invalid invoke ILDSegmentedDiscMeasLayer by TrackerHit trkhit");
+    return NULL; // SJA:FIXME: should be replaced with an exception  
   }
   
   // remember here the "position" of the hit in fact defines the origin of the plane it defines so u and v are per definition 0. 
-  const edm4hep::Vector3d& pos=trkhit->getPosition();
+  const edm4hep::Vector3d& pos=trkhit.getPosition();
   const TVector3 hit(pos.x, pos.y, pos.z) ;
   
   // convert to layer coordinates       
@@ -506,23 +518,23 @@ ILDVTrackHit* ILDSegmentedDiscMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit*
   x[0] = h(0, 0);
   x[1] = h(1, 0);
   
-  dx[0] = trkhit->getCovMatrix(2);
-  dx[1] = trkhit->getCovMatrix(5);
+  dx[0] = trkhit.getCovMatrix(2);
+  dx[1] = trkhit.getCovMatrix(5);
   
   bool hit_on_surface = IsOnSurface(hit);
-  /*
-  std::cout << "ILDSegmentedDiscMeasLayer::ConvertLCIOTrkHit: ILDPlanarHit created" 
-	    << " for CellID " << trkhit->getCellID()
-	    << " u = "  <<  x[0]
-	    << " v = "  <<  x[1]
-	    << " du = " << dx[0]
-	    << " dv = " << dx[1]
-	    << " x = "  << pos.x
-	    << " y = "  << pos.y
-	    << " z = "  << pos.z
-	    << " onSurface = " << hit_on_surface
-	    << std::endl ;
-  */
+  
+  // streamlog_out(DEBUG1) << "ILDSegmentedDiscMeasLayer::ConvertLCIOTrkHit: ILDPlanarHit created" 
+  //       		<< " for CellID " << trkhit.getCellID()
+  //       		<< " u = "  <<  x[0]
+  //       		<< " v = "  <<  x[1]
+  //       		<< " du = " << dx[0]
+  //       		<< " dv = " << dx[1]
+  //       		<< " x = "  << pos.x
+  //       		<< " y = "  << pos.y
+  //       		<< " z = "  << pos.z
+  //       		<< " onSurface = " << hit_on_surface
+  //       		<< std::endl ;
+  
   ILDPlanarHit hh( *this , x, dx, this->GetBz(),trkhit);
   
   this->HitToXv(hh);
diff --git a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.h
index 61335702..6afdc9f8 100644
--- a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscMeasLayer.h
@@ -77,7 +77,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
 
   /** overloaded version of CalcXingPointWith using closed solution*/
   virtual Int_t    CalcXingPointWith(const TVTrack  &hel,
diff --git a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.cc b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.cc
index 590032d2..e547982b 100644
--- a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.cc
+++ b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.cc
@@ -27,13 +27,13 @@ TKalMatrix ILDSegmentedDiscStripMeasLayer::XvToMv(const TVector3 &xv) const
 {
   
   // Calculate measurement vector (hit coordinates) from global coordinates:
-  /*
-  std::cout << "\t ILDSegmentedDiscStripMeasLayer::XvToMv: "
-	    << " x = " << xv.X() 
-	    << " y = " << xv.Y() 
-	    << " z = " << xv.Z() 
-	    << std::endl;
-  */
+  
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscStripMeasLayer::XvToMv: "
+  // << " x = " << xv.X() 
+  // << " y = " << xv.Y() 
+  // << " z = " << xv.Z() 
+  // << std::endl;
+  
   // let's start with the sensor whose axis of symmetry is 
   // aligned with the y-axis and whose sensitive face is facing towards the IP.
   // For a zero strip angle then:
@@ -87,34 +87,36 @@ TKalMatrix ILDSegmentedDiscStripMeasLayer::XvToMv(const TVector3 &xv) const
     mv(1,0)  = v ;
   }
 
-  /*
-  std::cout << "\t ILDSegmentedDiscStripMeasLayer::XvToMv: phi_sensor = " << phi_sensor << " phi = " << phi << " stripAngle = " << _stripAngle << " sign_z = " << sign_z<< std::endl;
   
-  std::cout << "\t ILDSegmentedDiscStripMeasLayer::XvToMv: " 
-	    << " mv(0,0) = " << mv(0,0) ;
-  if (ILDPlanarStripHit_DIM == 2) {
-    std::cout << " mv(1,0) = " << mv(1,0);
-  }
-  std::cout << std::endl;
-  */
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscStripMeasLayer::XvToMv: phi_sensor = " << phi_sensor << " phi = " << phi << " stripAngle = " << _stripAngle << " sign_z = " << sign_z<< std::endl;
+  
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscStripMeasLayer::XvToMv: " 
+  // << " mv(0,0) = " << mv(0,0) ;
+  // if (ILDPlanarStripHit_DIM == 2) {
+  //   streamlog_out(DEBUG0) << " mv(1,0) = " << mv(1,0);
+  // }
+  // streamlog_out(DEBUG0) << std::endl;
+  
   return mv;
   
 }
 
-TVector3 ILDSegmentedDiscStripMeasLayer::HitToXv(const TVTrackHit &vht) const {
-  /*
-  std::cout << "\t ILDSegmentedDiscStripMeasLayer::HitToXv: "
-	    << " vht(0,0) = " << vht(0,0);
-  if (ILDPlanarStripHit_DIM == 2) {
-    std::cout << " vht(1,0) = " << vht(1,0);
-  }
-  std::cout << std::endl;
-  */
+TVector3 ILDSegmentedDiscStripMeasLayer::HitToXv(const TVTrackHit &vht) const
+{
+  
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscStripMeasLayer::HitToXv: "
+  // << " vht(0,0) = " << vht(0,0);
+  // if (ILDPlanarStripHit_DIM == 2) {
+  //   streamlog_out(DEBUG0) << " vht(1,0) = " << vht(1,0);
+  // }
+  // streamlog_out(DEBUG0) << std::endl;
+
+  
   const ILDPlanarStripHit &mv = dynamic_cast<const ILDPlanarStripHit &>(vht);
   
   UTIL::BitField64 encoder( lcio::ILDCellID0::encoder_string ) ;
-  edm4hep::TrackerHit* hit = mv.getLCIOTrackerHit();
-  encoder.setValue(hit->getCellID());
+  edm4hep::ConstTrackerHit hit = mv.getLCIOTrackerHit();
+  encoder.setValue(hit.getCellID());
   int segmentIndex = encoder[lcio::ILDCellID0::module] / 2 ;
   
 
@@ -124,7 +126,7 @@ TVector3 ILDSegmentedDiscStripMeasLayer::HitToXv(const TVTrackHit &vht) const {
   double sensor_y0 = XC.Y();
   double sensor_z0 = XC.Z();
 
-  ////std::cout << "\t ILDSegmentedDiscStripMeasLayer::HitToXv: segmentIndex = " << segmentIndex << " x0 = " << sensor_x0 << " y0 = " << sensor_y0 << " z0 = " << sensor_z0 << " segment Phi = " << XC.Phi() << std::endl; 
+//  streamlog_out(DEBUG0) << "\t ILDSegmentedDiscStripMeasLayer::HitToXv: segmentIndex = " << segmentIndex << " x0 = " << sensor_x0 << " y0 = " << sensor_y0 << " z0 = " << sensor_z0 << " segment Phi = " << XC.Phi() << std::endl; 
   
   // here we are assuming that there is no offset of the centre of the sensor in the x-y plane. 
   // SJA:FIXME: We need to get the segment we are in to get phi
@@ -159,13 +161,14 @@ TVector3 ILDSegmentedDiscStripMeasLayer::HitToXv(const TVTrackHit &vht) const {
   double y = delta_y + sensor_y0; 
   
   double z = sensor_z0 ;
-  /*
-  std::cout << "\t ILDSegmentedDiscStripMeasLayer::HitToXv: "
-	    << " x = " << x 
-	    << " y = " << y 
-	    << " z = " << z 
-	    << std::endl;
-  */
+  
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscStripMeasLayer::HitToXv: "
+  // << " x = " << x 
+  // << " y = " << y 
+  // << " z = " << z 
+  // << std::endl;
+
+  
   return TVector3(x,y,z);
 }
 
@@ -210,14 +213,14 @@ void ILDSegmentedDiscStripMeasLayer::CalcDhDa(const TVTrackHit &vht,
   
   double dvdx =  -cos_theta * sin_phi;
   double dvdy =   cos_theta * cos_phi;
-  /*
-  std::cout << "\t ILDSegmentedDiscStripMeasLayer::CalcDhDa: "
-	    << " dudx = " << dudx 
-	    << " dudy = " << dudy
-	    << " dvdx = " << dvdx 
-	    << " dvdy = " << dvdy 
-	    << std::endl;
-  */
+
+  // streamlog_out(DEBUG0) << "\t ILDSegmentedDiscStripMeasLayer::CalcDhDa: "
+  // << " dudx = " << dudx 
+  // << " dudy = " << dudy
+  // << " dvdx = " << dvdx 
+  // << " dvdy = " << dvdy 
+  // << std::endl;
+   
   for (Int_t i=0; i<hdim; i++) {
     
     H(0,i) = dudx * dxphiada(0,i) + dudy * dxphiada(1,i) ;
@@ -239,21 +242,18 @@ void ILDSegmentedDiscStripMeasLayer::CalcDhDa(const TVTrackHit &vht,
 
 
 
-ILDVTrackHit* ILDSegmentedDiscStripMeasLayer::ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const {
+ILDVTrackHit* ILDSegmentedDiscStripMeasLayer::ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const {
   
   //EVENT::TrackerHitPlane* plane_hit = dynamic_cast<EVENT::TrackerHitPlane*>( trkhit ) ;
+  if(trkhit.getType()!=8){
   //if( plane_hit == NULL )  { 
     // streamlog_out(ERROR) << "ILDSegmentedDiscStripMeasLayer::ConvertLCIOTrkHit dynamic_cast to TrackerHitPlane failed " << std::endl; 
-    //return NULL; // SJA:FIXME: should be replaced with an exception  
-  //}
-  if((trkhit->getType()&8)!=8) {
-    std::cout << "ILDSegmentedDiscStripMeasLayer::ConvertLCIOTrkHit dynamic_cast to ILDPlanarStripHit failed " << std::endl;
-    throw std::logic_error("Invalid invoke ILDSegmentedDiscStripMeasLayer by TrackerHit trkhit");
+    return NULL; // SJA:FIXME: should be replaced with an exception  
   }
   
   // remember here the "position" of the hit in fact defines the origin of the plane it defines so u and v are per definition 0. 
   // this is still the case for a 1-dimentional measurement, and is then used to calculate the u coordinate according to the origin of the actual measurement plane.
-  const edm4hep::Vector3d& pos=trkhit->getPosition();
+  const edm4hep::Vector3d& pos=trkhit.getPosition();
   const TVector3 hit(pos[0], pos[1], pos[2]) ;
   
   // convert to layer coordinates       
@@ -267,26 +267,26 @@ ILDVTrackHit* ILDSegmentedDiscStripMeasLayer::ConvertLCIOTrkHit(edm4hep::Tracker
   x[0] = h(0, 0);
   if(ILDPlanarStripHit_DIM == 2) x[1] = h(1, 0);
   
-  dx[0] = trkhit->getCovMatrix(2);
-  if(ILDPlanarStripHit_DIM == 2) dx[1] = trkhit->getCovMatrix(5);
+  dx[0] = trkhit.getCovMatrix(2);
+  if(ILDPlanarStripHit_DIM == 2) dx[1] = trkhit.getCovMatrix(5);
     
   bool hit_on_surface = IsOnSurface(hit);
-  /*
-  std::cout << "ILDSegmentedDiscStripMeasLayer::ConvertLCIOTrkHit ILDPlanarStripHit created" 
-	    << " for CellID " << trkhit->getCellID()
-	    << " Disc Z = " << this->GetXc().Z() 
-	    << " u = "  <<  x[0]
-	    << " du = " << dx[0];
-  
-  if(ILDPlanarStripHit_DIM == 2)  std::cout << " v = "  <<  x[1] << " dv = " << dx[1];
-  
-  std::cout << " x = " << hit.x()
-	    << " y = " << hit.y()
-	    << " z = " << hit.z()
-	    << " r = " << hit.Perp()
-	    << " onSurface = " << hit_on_surface
-	    << std::endl ;
-  */
+  
+  // streamlog_out(DEBUG1) << "ILDSegmentedDiscStripMeasLayer::ConvertLCIOTrkHit ILDPlanarStripHit created" 
+  // << " for CellID " << trkhit.getCellID()
+  // << " Disc Z = " << this->GetXc().Z() 
+  // << " u = "  <<  x[0]
+  // << " du = " << dx[0];
+  
+  // if(ILDPlanarStripHit_DIM == 2)  streamlog_out(DEBUG1) << " v = "  <<  x[1] << " dv = " << dx[1];
+  
+  // streamlog_out(DEBUG1) << " x = " << hit.x()
+  //       		<< " y = " << hit.y()
+  //       		<< " z = " << hit.z()
+  //       		<< " r = " << hit.Perp()
+  //       		<< " onSurface = " << hit_on_surface
+  //       		<< std::endl ;
+  
   ILDPlanarStripHit hh( *this , x, dx, this->GetBz(),trkhit);
   
   this->HitToXv(hh);
diff --git a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.h
index 8bdab668..34a3b203 100644
--- a/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDSegmentedDiscStripMeasLayer.h
@@ -67,7 +67,7 @@ public:
                                 TKalMatrix &H)  const;
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const ;
   
 private:
   
diff --git a/Utilities/KalDet/src/ild/common/ILDVMeasLayer.h b/Utilities/KalDet/src/ild/common/ILDVMeasLayer.h
index 3d213b3a..498c5608 100644
--- a/Utilities/KalDet/src/ild/common/ILDVMeasLayer.h
+++ b/Utilities/KalDet/src/ild/common/ILDVMeasLayer.h
@@ -13,6 +13,7 @@
 #include "kaltest/TAttDrawable.h"
 #include "kaltest/KalTrackDim.h"
 #include "TString.h"
+#include "edm4hep/TrackerHitConst.h"
 
 #include <vector>
 
@@ -43,7 +44,7 @@ public:
   inline Double_t GetBz() const { return _Bz; }
   
   /** Convert LCIO Tracker Hit to an ILDPLanarTrackHit  */
-  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::TrackerHit* trkhit) const = 0 ;
+  virtual ILDVTrackHit* ConvertLCIOTrkHit(edm4hep::ConstTrackerHit trkhit) const = 0 ;
   
   /** Check whether the measurement layer represents a series of detector elements */
   bool isMultilayer() const { return _isMultiLayer; } 
diff --git a/Utilities/KalDet/src/ild/common/ILDVTrackHit.h b/Utilities/KalDet/src/ild/common/ILDVTrackHit.h
index d47be083..89aa42f2 100644
--- a/Utilities/KalDet/src/ild/common/ILDVTrackHit.h
+++ b/Utilities/KalDet/src/ild/common/ILDVTrackHit.h
@@ -19,15 +19,15 @@ public:
   
    /** Constructor Taking coordinates and associated measurement layer, with bfield and number of measurement dimentions*/
   ILDVTrackHit(const TVMeasLayer &ms, Double_t *x, Double_t *dx, 
-               Double_t bfield , Int_t dim, edm4hep::TrackerHit* trkhit) 
+               Double_t bfield , Int_t dim, edm4hep::ConstTrackerHit trkhit) 
   : TVTrackHit(ms, x, dx, bfield, dim), _trkhit(trkhit)
   { /* no op */ }
   
-  edm4hep::TrackerHit* getLCIOTrackerHit() const { return _trkhit; }
+  edm4hep::ConstTrackerHit getLCIOTrackerHit() const { return _trkhit; }
   
 private:
   
-  edm4hep::TrackerHit* _trkhit;
+  edm4hep::ConstTrackerHit _trkhit;
   
 };
 #endif
diff --git a/Utilities/KalDet/src/lctpc/gearTPC/GearTPCCylinderMeasLayer.h b/Utilities/KalDet/src/lctpc/gearTPC/GearTPCCylinderMeasLayer.h
index 14e60fdf..e20af5be 100644
--- a/Utilities/KalDet/src/lctpc/gearTPC/GearTPCCylinderMeasLayer.h
+++ b/Utilities/KalDet/src/lctpc/gearTPC/GearTPCCylinderMeasLayer.h
@@ -3,7 +3,7 @@
 #include <TVector3.h>
 #include <kaltest/TKalMatrix.h>
 #include <kaltest/TCylinder.h>
-#include <EXTPCMeasLayer.h>
+#include <kaldet/EXTPCMeasLayer.h>
 //#include <KalTrackDim.h>
 
 #include <TMath.h>
diff --git a/Utilities/KalTest/cmake/MacroCheckPackageLibs.cmake b/Utilities/KalTest/cmake/MacroCheckPackageLibs.cmake
new file mode 100644
index 00000000..c4451b3e
--- /dev/null
+++ b/Utilities/KalTest/cmake/MacroCheckPackageLibs.cmake
@@ -0,0 +1,164 @@
+##############################################################################
+# macro for checkin package libraries in ${PKG_ROOT}/lib
+#
+#
+# macro usage:
+#   CHECK_PACKAGE_LIBS( PACKAGE_NAME stdlib1 stdlib2 ... stdlibn )
+#       only standard libraries should be passed as arguments to the macro
+#       component libraries are set by cmake in PKG_FIND_COMPONENTS (when
+#       calling FIND_PACKAGE with COMPONENTS argument) or through the
+#       variable PKG_USE_COMPONENTS
+#
+#
+# required variables:
+#   PKG_ROOT    : path to PKG root directory
+#
+#
+# returns following variables:
+#   PKG_LIBRARY_DIRS : list of paths to be used with LINK_DIRECTORIES
+#   PGK_LIBRARIES    : list of STANDARD libraries (NOT including COMPONENTS)
+#   PKG_COMPONENT_LIBRARIES    : list of COMPONENT libraries
+#   PKG_${COMPONENT}_FOUND     : set to TRUE or FALSE for each library
+#   PKG_${COMPONENT}_LIBRARY   : path to each individual library
+#
+#
+# PKG_LIBRARIES and PKG_LIBRARY_DIRS will be empty if any of the standard
+#   libraries is missing
+#
+# @author Jan Engels, Desy
+##############################################################################
+
+
+SET( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE )
+
+MACRO( CHECK_PACKAGE_LIBS _pkgname )
+
+    SET( _std_lib_missing FALSE )
+    SET( _ext_lib_missing FALSE )
+
+    SET( _std_libnames ${ARGN} )
+    SET( _ext_libnames ${${_pkgname}_FIND_COMPONENTS} ${${_pkgname}_USE_COMPONENTS} )
+
+    IF( _ext_libnames )
+        SEPARATE_ARGUMENTS( _ext_libnames )
+        LIST( REMOVE_DUPLICATES _ext_libnames )
+    ENDIF()
+
+    IF( NOT ${_pkgname}_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ${_pkgname}_LIBRARIES: ${_std_libnames}" )
+        IF( _ext_libnames )
+            MESSAGE( STATUS "Check for ${_pkgname}_COMPONENT_LIBRARIES: ${_ext_libnames}" )
+        ENDIF()
+    ENDIF()
+
+    SET( ${_pkgname}_LIBRARY_DIRS )
+    MARK_AS_ADVANCED( ${_pkgname}_LIBRARY_DIRS )
+
+    SET( ${_pkgname}_LIBRARIES )
+    MARK_AS_ADVANCED( ${_pkgname}_LIBRARIES )
+    
+    SET( ${_pkgname}_COMPONENT_LIBRARIES )
+    MARK_AS_ADVANCED( ${_pkgname}_COMPONENT_LIBRARIES )
+
+    SET( ${_pkgname}_COMPONENT_VARIABLES )
+    MARK_AS_ADVANCED( ${_pkgname}_COMPONENT_VARIABLES )
+
+    FOREACH( _libname ${_std_libnames} ${_ext_libnames} )
+
+        # flag to check if it is a standard or a component library
+        LIST( FIND _std_libnames "${_libname}" _aux )
+        IF( ${_aux} LESS 0 )
+           SET( _is_std_lib FALSE )
+        ELSE()
+           SET( _is_std_lib TRUE )
+        ENDIF()
+
+        # libname in upper case
+        STRING( TOUPPER ${_libname} _ulibname )
+
+        SET( ${_pkgname}_${_ulibname}_LIBRARY ${_pkgname}_${_ulibname}_LIBRARY-NOTFOUND )
+        MARK_AS_ADVANCED( ${_pkgname}_${_ulibname}_LIBRARY )
+
+        # WARNING: using PATH_SUFFIXES may cause problems when using variable CMAKE_FIND_ROOT_PATH
+        #           this problem does not occur if expanding PATHS
+        #           look in FindMySQL.cmake for more info
+        #FIND_LIBRARY( ${_pkgname}_${_ulibname}_LIBRARY NAMES ${_libname} PATHS
+        #    ${${_pkgname}_ROOT} ${${_pkgname}_DIR} ${${_pkgname}_LIB_SEARCH_PATH}
+        #    PATH_SUFFIXES lib64 lib
+        #    NO_DEFAULT_PATH
+        #)
+
+        FIND_LIBRARY( ${_pkgname}_${_ulibname}_LIBRARY NAMES ${_libname} PATHS
+            ${${_pkgname}_ROOT}/lib64 ${${_pkgname}_ROOT}/lib
+            ${${_pkgname}_DIR}/lib64 ${${_pkgname}_DIR}/lib
+            ${${_pkgname}_LIB_SEARCH_PATH} ${${_pkgname}_LIB_SEARCH_PATH}/lib64 ${${_pkgname}_LIB_SEARCH_PATH}/lib
+            NO_DEFAULT_PATH
+        )
+
+        IF( NOT ${_pkgname}_DIR )
+            FIND_LIBRARY( ${_pkgname}_${_ulibname}_LIBRARY NAMES ${_libname} )
+        ENDIF()
+        
+        IF( ${_pkgname}_FIND_REQUIRED )
+            LIST( APPEND ${_pkgname}_COMPONENT_VARIABLES ${_pkgname}_${_ulibname}_LIBRARY )
+        ENDIF()
+
+        IF( ${_pkgname}_${_ulibname}_LIBRARY ) # if library found
+
+            SET( ${_pkgname}_${_ulibname}_FOUND TRUE )
+            
+            # split libraries in PKG_LIBRARIES and PKG_COMPONENT_LIBRARIES
+            IF( _is_std_lib )
+                LIST( APPEND ${_pkgname}_LIBRARIES ${${_pkgname}_${_ulibname}_LIBRARY} )
+            ELSE()
+                LIST( APPEND ${_pkgname}_COMPONENT_LIBRARIES ${${_pkgname}_${_ulibname}_LIBRARY} )
+            ENDIF()
+
+            GET_FILENAME_COMPONENT( _aux ${${_pkgname}_${_ulibname}_LIBRARY} PATH )
+            LIST( APPEND ${_pkgname}_LIBRARY_DIRS ${_aux} )
+
+            IF( NOT ${_pkgname}_FIND_QUIETLY )
+                MESSAGE( STATUS "Check for ${_pkgname}_${_ulibname}_LIBRARY: ${${_pkgname}_${_ulibname}_LIBRARY} -- ok" )
+            ENDIF()
+
+        ELSE() # library not found
+
+            SET( ${_pkgname}_${_ulibname}_FOUND FALSE )
+
+            IF( _is_std_lib )
+                SET( _std_lib_missing TRUE )
+            ELSE()
+                SET( _ext_lib_missing TRUE )
+            ENDIF()
+
+            IF( NOT ${_pkgname}_FIND_QUIETLY )
+                MESSAGE( STATUS "Check for ${_pkgname}_${_ulibname}_LIBRARY: ${_libname} -- failed" )
+            ENDIF()
+
+        ENDIF()
+
+    ENDFOREACH()
+
+    # clear PKG_LIBRARIES if standard library is missing
+    IF( _std_lib_missing )
+        SET( ${_pkgname}_LIBRARIES )
+    ENDIF()
+
+    # clear PKG_COMPONENT_LIBRARIES if a component library is missing and
+    # FIND_PACKAGE called with REQUIRED argument
+    IF( _ext_lib_missing AND ${_pkgname}_FIND_REQUIRED )
+        SET( ${_pkgname}_COMPONENT_LIBRARIES )
+    ENDIF()
+
+    # remove duplicate paths in PKG_LIBRARY_DIRS
+    IF( ${_pkgname}_LIBRARY_DIRS )
+        LIST( REMOVE_DUPLICATES ${_pkgname}_LIBRARY_DIRS )
+    ENDIF()
+
+    # debug
+    #MESSAGE( STATUS "${_pkgname}_LIBRARIES: ${${_pkgname}_LIBRARIES}" )
+    #MESSAGE( STATUS "${_pkgname}_COMPONENT_LIBRARIES: ${${_pkgname}_COMPONENT_LIBRARIES}" )
+    #MESSAGE( STATUS "${_pkgname}_LIBRARY_DIRS: ${${_pkgname}_LIBRARY_DIRS}" )
+
+ENDMACRO( CHECK_PACKAGE_LIBS _pkgname )
+
diff --git a/Utilities/KalTest/cmake/MacroCheckPackageVersion.cmake b/Utilities/KalTest/cmake/MacroCheckPackageVersion.cmake
new file mode 100644
index 00000000..e3ec75d9
--- /dev/null
+++ b/Utilities/KalTest/cmake/MacroCheckPackageVersion.cmake
@@ -0,0 +1,108 @@
+##############################################################################
+# macro for checking a package version
+#
+# this macro should be called from your PKGVersion.cmake or from a
+#   FindPKG.cmake module with the following arguments:
+#       _pkgname    : The package name
+#       _iversion   : The installed version of the package
+#
+#
+# the following conventions are used:
+#
+#   if FIND_PACKAGE is called with EXACT argument than the version has to
+#   match EXACTLY, i.e.:
+#       1.5 == 1.5
+#       1.5 == 1.5.0
+#       1.5 == 1.5.0.0
+#       1.5.2 == 1.5.2.0
+#       1.5.2.1 == 1.5.2.1
+#       1.5.2 != 1.5.2.1
+#       1.5 != 1.5.0.1
+#
+#
+#   otherwise a MINIMUM_REQUIRED version is checked for, i.e. the same
+#   behavior as with the cmake variable CMAKE_MINIMUM_REQUIRED, e.g.:
+#       searching: 1.2     --> installed: 1.5.2.2 --> compatible
+#       searching: 1.5     --> installed: 1.5.2.2 --> compatible
+#       searching: 1.5.2.1 --> installed: 1.5.2.2 --> compatible
+#       searching: 1.5.2.3 --> installed: 1.5.2.2 --> unsuitable
+#       searching: 1.7     --> installed: 1.5.2.2 --> unsuitable
+#
+#
+# following variables are returned (internally to cmake):
+#   PACKAGE_VERSION_EXACT       : set to TRUE if exact version was found
+#   PACKAGE_VERSION_COMPATIBLE  : set to TRUE if version is compatible
+#   PACKAGE_VERSION_UNSUITABLE  : set to TRUE if version found is unsuitable
+#
+#
+# @author Jan Engels, Desy IT
+##############################################################################
+
+# these variables are evaluated internally by the cmake command FIND_PACKAGE to mark this
+# package as suitable or not depending on the required version
+SET( PACKAGE_VERSION_EXACT FALSE )
+SET( PACKAGE_VERSION_COMPATIBLE TRUE )
+SET( PACKAGE_VERSION_UNSUITABLE FALSE )
+
+
+# cmake internal variable PACKAGE_FIND_NAME is not defined on FindPKG.cmake
+# modules, therefore it is passed as an argument to the macro
+# _iversion is the installed version of the package
+# _sversion is the version searched by the user with FIND_PACKAGE
+#MACRO( CHECK_PACKAGE_VERSION _pkgname _iversion )
+MACRO( CHECK_PACKAGE_VERSION _pkgname ) # left with one argument only for backwards compatibility
+
+    IF( NOT "${ARGV1}" STREQUAL "" )
+        SET( _iversion ${ARGV1} )
+    ELSE()
+        SET( _iversion ${${_pkgname}_VERSION_MAJOR}.${${_pkgname}_VERSION_MINOR}.${${_pkgname}_VERSION_PATCH}.${${_pkgname}_VERSION_TWEAK} )
+    ENDIF()
+
+    #SET( _sversion_major ${${_pkgname}_FIND_VERSION_MAJOR} )
+    #SET( _sversion_minor ${${_pkgname}_FIND_VERSION_MINOR} )
+
+    SET( _sversion ${${_pkgname}_FIND_VERSION} )
+
+    IF( NOT ${_pkgname}_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ${_pkgname} (${_iversion})" )
+    ENDIF()
+
+    # only do work if FIND_PACKAGE called with a version argument
+    IF( _sversion )
+
+        #IF( NOT ${_pkgname}_FIND_QUIETLY )
+        #    MESSAGE( STATUS "Check for ${_pkgname}: looking for version ${_sversion}" )
+        #ENDIF()
+
+        IF( ${_iversion} VERSION_EQUAL ${_sversion} ) # if version matches EXACTLY
+            #IF( NOT ${_pkgname}_FIND_QUIETLY )
+            #    MESSAGE( STATUS "Check for ${_pkgname}: exact version found: ${_iversion}" )
+            #ENDIF()
+            SET( PACKAGE_VERSION_EXACT TRUE )
+        ELSE() # if version does not match EXACTLY, check if it is compatible/suitable
+
+            # installed version must be greater or equal than version searched by the user, i.e.
+            # like with the CMAKE_MINIMUM_REQUIRED commando
+            # if user asks for version 1.2.5 then any version >= 1.2.5 is suitable/compatible
+            IF( NOT ${_sversion} VERSION_LESS ${_iversion} )
+                SET( PACKAGE_VERSION_UNSUITABLE TRUE )
+            ENDIF()
+            # -------------------------------------------------------------------------------------
+
+            IF( ${_pkgname}_FIND_VERSION_EXACT ) # if exact version was required search must fail!!
+                #IF( NOT ${_pkgname}_FIND_QUIETLY )
+                #    MESSAGE( "Check for ${_pkgname}: could not find exact version" )
+                #ENDIF()
+                SET( PACKAGE_VERSION_UNSUITABLE TRUE )
+            ENDIF()
+
+        ENDIF()
+
+        IF( PACKAGE_VERSION_UNSUITABLE )
+            SET( PACKAGE_VERSION_COMPATIBLE FALSE )
+        ENDIF()
+
+    ENDIF( _sversion )
+
+ENDMACRO( CHECK_PACKAGE_VERSION )
+
diff --git a/Utilities/KalTest/cmake/MacroRootDict.cmake b/Utilities/KalTest/cmake/MacroRootDict.cmake
new file mode 100644
index 00000000..ed7747fd
--- /dev/null
+++ b/Utilities/KalTest/cmake/MacroRootDict.cmake
@@ -0,0 +1,145 @@
+IF(APPLE)
+    SET( LD_LIBRARY_PATH_VAR DYLD_LIBRARY_PATH )
+ELSE()
+    SET( LD_LIBRARY_PATH_VAR LD_LIBRARY_PATH )
+ENDIF()
+SET( LD_LIBRARY_PATH_CONTENTS $ENV{${LD_LIBRARY_PATH_VAR}} )
+#MESSAGE( STATUS "LD_LIBRARY_PATH_CONTENTS: ${LD_LIBRARY_PATH_CONTENTS}" )
+#MESSAGE( STATUS "ROOT_CINT_EXECUTABLE: ${ROOT_CINT_EXECUTABLE}" )
+
+SET( ROOT_CINT_WRAPPER ${LD_LIBRARY_PATH_VAR}=${ROOT_LIBRARY_DIR}:${LD_LIBRARY_PATH_CONTENTS} ${ROOT_CINT_EXECUTABLE} )
+
+IF( NOT DEFINED ROOT_DICT_OUTPUT_DIR )
+    SET( ROOT_DICT_OUTPUT_DIR "${PROJECT_BINARY_DIR}/rootdict" )
+ENDIF()
+
+# clean generated header files with 'make clean'
+SET_DIRECTORY_PROPERTIES( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${ROOT_DICT_OUTPUT_DIR}" )
+
+IF( NOT ROOT_FIND_QUIETLY )
+    MESSAGE( STATUS "Check for ROOT_DICT_OUTPUT_DIR: ${PROJECT_BINARY_DIR}/rootdict" )
+    MESSAGE( STATUS "Check for ROOT_DICT_CINT_DEFINITIONS: ${ROOT_DICT_CINT_DEFINITIONS}" )
+ENDIF()
+
+
+# ============================================================================
+# helper macro to prepare input headers for GEN_ROOT_DICT_SOURCES
+#   sorts LinkDef.h to be the last header (required by rootcint)
+#
+# arguments:
+#   input_dir - directory to search for headers matching *.h
+#
+# returns:
+#   ROOT_DICT_INPUT_HEADERS - all header files found in input_dir with
+#       LinkDef.h as the last header (if found)
+#
+# ----------------------------------------------------------------------------
+MACRO( PREPARE_ROOT_DICT_HEADERS _input_dir )
+
+    FILE( GLOB ROOT_DICT_INPUT_HEADERS "${_input_dir}/*.h" )
+    FILE( GLOB _linkdef_hdr "${_input_dir}/LinkDef.h" )
+
+    #LIST( FIND ROOT_DICT_INPUT_HEADERS ${_linkdef_hdr} _aux )
+    #IF( ${_aux} EQUAL 0 OR ${_aux} GREATER 0 )
+    #    LIST( REMOVE_ITEM ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}" )
+    #    LIST( APPEND ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}" )
+    #ENDIF()
+
+    IF( _linkdef_hdr )
+        LIST( REMOVE_ITEM ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}" )
+        LIST( APPEND ROOT_DICT_INPUT_HEADERS "${_linkdef_hdr}")
+    ENDIF()
+
+    #MESSAGE( STATUS "ROOT_DICT_INPUT_HEADERS: ${ROOT_DICT_INPUT_HEADERS}" )
+
+ENDMACRO( PREPARE_ROOT_DICT_HEADERS )
+
+
+
+# ============================================================================
+# helper macro to generate Linkdef.h files for rootcint
+#
+# arguments:
+#   namespace - prefix used for creating header <namespace>_Linkdef.h
+#   ARGN      - list of sources to be used for generating Linkdef.h
+#
+# returns:
+#   ROOT_DICT_INPUT_HEADERS - all header files + <namespace>_LinkDef.h in the
+#       correct order to be used by macro GEN_ROOT_DICT_SOURCES
+#
+# ----------------------------------------------------------------------------
+MACRO( GEN_ROOT_DICT_LINKDEF_HEADER _namespace )
+
+    SET( _input_headers ${ARGN} )
+    SET( _linkdef_header "${ROOT_DICT_OUTPUT_DIR}/${_namespace}_Linkdef.h" )
+
+    FOREACH( _header ${_input_headers} )
+        SET( ${_namespace}_file_contents "${${_namespace}_file_contents}\\#pragma link C++ defined_in \\\"${_header}\\\"\\;\\\\n" )
+    ENDFOREACH()
+
+    ADD_CUSTOM_COMMAND(
+        OUTPUT ${_linkdef_header}
+        COMMAND mkdir -p ${ROOT_DICT_OUTPUT_DIR}
+        COMMAND printf "${${_namespace}_file_contents}" > ${_linkdef_header}
+        DEPENDS ${_input_headers}
+        COMMENT "generating: ${_linkdef_header}"
+    )
+
+    SET( ROOT_DICT_INPUT_HEADERS ${_input_headers} ${_linkdef_header} )
+
+ENDMACRO()
+
+
+# ============================================================================
+# macro for generating root dict sources with rootcint
+#
+# arguments:
+#   dict_src_filename - filename of the dictionary source (to be generated)
+#
+# requires following variables:
+#       ROOT_DICT_INPUT_HEADERS - list of headers needed to generate dict source
+#           * if LinkDef.h is in the list it must be at the end !!
+#       ROOT_DICT_INCLUDE_DIRS - list of include dirs to pass to rootcint -I..
+#       ROOT_DICT_CINT_DEFINITIONS - extra definitions to pass to rootcint
+#       ROOT_DICT_OUTPUT_DIR - where dictionary source should be generated
+#
+# returns:
+#       ROOT_DICT_OUTPUT_SOURCES - list containing generated source and other
+#           previously generated sources
+                                    
+# ----------------------------------------------------------------------------
+MACRO( GEN_ROOT_DICT_SOURCE _dict_src_filename )
+
+    # TODO check for ROOT_CINT_EXECUTABLE
+
+    # need to prefix all include dirs with -I
+    set( _dict_includes )
+    FOREACH( _inc ${ROOT_DICT_INCLUDE_DIRS} )
+        SET( _dict_includes "${_dict_includes}\t-I${_inc}")  #fg: the \t fixes a wired string expansion 
+        #SET( _dict_includes ${_dict_includes} -I${_inc} )
+    ENDFOREACH()
+
+    STRING( REPLACE "/" "_" _dict_src_filename_nosc ${_dict_src_filename} )
+    SET( _dict_src_file ${ROOT_DICT_OUTPUT_DIR}/${_dict_src_filename_nosc} )
+    STRING( REGEX REPLACE "^(.*)\\.(.*)$" "\\1.h" _dict_hdr_file "${_dict_src_file}" )
+    #message("${ROOT_DICT_INPUT_HEADERS}")
+    ADD_CUSTOM_COMMAND(
+        OUTPUT  ${_dict_src_file} ${_dict_hdr_file}
+        COMMAND mkdir -p ${ROOT_DICT_OUTPUT_DIR}
+        COMMAND ${ROOT_CINT_WRAPPER} -f "${_dict_src_file}" -c ${ROOT_DICT_CINT_DEFINITIONS} ${_dict_includes} ${ROOT_DICT_INPUT_HEADERS}
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+        DEPENDS ${ROOT_DICT_INPUT_HEADERS}
+        COMMENT "generating: ${_dict_src_file} ${_dict_hdr_file}"
+    )
+    LIST( APPEND ROOT_DICT_OUTPUT_SOURCES ${_dict_src_file} )
+
+ENDMACRO()
+
+# for backwards compatibility
+MACRO( GEN_ROOT_DICT_SOURCES _dict_src_filename )
+    #MESSAGE( "USING DEPRECATED GEN_ROOT_DICT_SOURCES. PLEASE USE GEN_ROOT_DICT_SOURCE instead." )
+    SET( ROOT_DICT_OUTPUT_SOURCES )
+    GEN_ROOT_DICT_SOURCE( ${_dict_src_filename} )
+ENDMACRO()
+# ============================================================================
+
diff --git a/Utilities/KalTest/cmake/MyFindROOT.cmake b/Utilities/KalTest/cmake/MyFindROOT.cmake
new file mode 100644
index 00000000..567ce159
--- /dev/null
+++ b/Utilities/KalTest/cmake/MyFindROOT.cmake
@@ -0,0 +1,316 @@
+###############################################################################
+# cmake module for finding ROOT
+#
+# requires:
+#   MacroCheckPackageLibs.cmake for checking package libraries
+#
+# Following cmake variables are returned by this module:
+#
+#   ROOT_FOUND              : set to TRUE if ROOT found
+#       If FIND_PACKAGE is called with REQUIRED and COMPONENTS arguments
+#       ROOT_FOUND is only set to TRUE if ALL components are found.
+#       If REQUIRED is NOT set components may or may not be available
+#
+#   ROOT_LIBRARIES          : list of ROOT libraries (NOT including COMPONENTS)
+#   ROOT_INCLUDE_DIRS       : list of paths to be used with INCLUDE_DIRECTORIES
+#   ROOT_LIBRARY_DIRS       : list of paths to be used with LINK_DIRECTORIES
+#   ROOT_COMPONENT_LIBRARIES    : list of ROOT component libraries
+#   ROOT_${COMPONENT}_FOUND     : set to TRUE or FALSE for each library
+#   ROOT_${COMPONENT}_LIBRARY   : path to individual libraries
+#   
+#
+#   Please note that by convention components should be entered exactly as
+#   the library names, i.e. the component name equivalent to the library
+#   $ROOTSYS/lib/libMathMore.so should be called MathMore and NOT:
+#       mathmore or Mathmore or MATHMORE
+#
+#   However to follow the usual cmake convention it is agreed that the
+#   ROOT_${COMPONENT}_FOUND and ROOT_${COMPONENT}_LIBRARY variables are ALL
+#   uppercase, i.e. the MathMore component returns: ROOT_MATHMORE_FOUND and
+#   ROOT_MATHMORE_LIBRARY NOT ROOT_MathMore_FOUND or ROOT_MathMore_LIBRARY
+#
+#
+# The additional ROOT components should be defined as follows:
+# FIND_PACKAGE( ROOT COMPONENTS MathMore Gdml Geom ...)
+#
+# If components are required use:
+# FIND_PACKAGE( ROOT REQUIRED COMPONENTS MathMore Gdml Geom ...)
+#
+# If only root is required and components are NOT required use:
+# FIND_PACKAGE( ROOT REQUIRED )
+# FIND_PACKAGE( ROOT COMPONENTS MathMore Gdml Geom ... QUIET )
+#   then you need to check for ROOT_MATHMORE_FOUND, ROOT_GDML_FOUND, etc.
+#
+# The variable ROOT_USE_COMPONENTS can also be used before calling
+# FIND_PACKAGE, i.e.:
+# SET( ROOT_USE_COMPONENTS MathMore Gdml Geom )
+# FIND_PACKAGE( ROOT REQUIRED ) # all ROOT_USE_COMPONENTS must also be found
+# FIND_PACKAGE( ROOT ) # check for ROOT_FOUND, ROOT_MATHMORE_FOUND, etc.
+#
+# @author Jan Engels, DESY
+###############################################################################
+
+# ==============================================
+# ===        ROOT_CONFIG_EXECUTABLE          ===
+# ==============================================
+
+SET( ROOT_CONFIG_EXECUTABLE ROOT_CONFIG_EXECUTABLE-NOTFOUND )
+MARK_AS_ADVANCED( ROOT_CONFIG_EXECUTABLE )
+# FIND_PROGRAM: Once one of the calls succeeds the result variable will be set and stored in the cache so that no call will search again. 
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config PATHS ${ROOT_DIR}/bin NO_DEFAULT_PATH )
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config PATHS $ENV{ROOTSYS}/bin NO_DEFAULT_PATH)
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config PATHS ENV PATH )
+FIND_PROGRAM( ROOT_CONFIG_EXECUTABLE root-config )
+
+IF( NOT ROOT_FIND_QUIETLY )
+    MESSAGE( STATUS "Check for ROOT_CONFIG_EXECUTABLE: ${ROOT_CONFIG_EXECUTABLE}" )
+ENDIF()
+
+IF( ROOT_CONFIG_EXECUTABLE )
+
+
+    # ==============================================
+    # ===          ROOT_VERSION                  ===
+    # ==============================================
+
+    INCLUDE( MacroCheckPackageVersion )
+    
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --version
+        OUTPUT_VARIABLE _version
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( _exit_code EQUAL 0 )
+
+        # set required variables for MacroCheckPackageVersion
+        STRING(REGEX REPLACE "^([0-9]+).*" "\\1" ROOT_VERSION_MAJOR "${_version}")
+        STRING(REGEX REPLACE "^[0-9]+.([0-9]+).*" "\\1" ROOT_VERSION_MINOR "${_version}")
+        STRING(REGEX REPLACE "^[0-9]+.[0-9]+.([0-9]+).*" "\\1" ROOT_VERSION_PATCH "${_version}")
+
+        SET( ROOT_VERSION "${ROOT_VERSION_MAJOR}.${ROOT_VERSION_MINOR}.${ROOT_VERSION_PATCH}" )
+    ENDIF()
+
+    CHECK_PACKAGE_VERSION( ROOT ${ROOT_VERSION} )
+
+
+
+    # ==============================================
+    # ===          ROOT_PREFIX                   ===
+    # ==============================================
+
+    # get root prefix from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --prefix
+        OUTPUT_VARIABLE ROOT_PREFIX
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( ROOT_PREFIX )
+    ENDIF()
+
+    # PKG_ROOT variables are a cmake standard
+    # since this package is also called ROOT the variable name
+    # becomes ROOT_ROOT ...
+    SET( ROOT_ROOT ${ROOT_PREFIX} )
+
+
+
+    # ==============================================
+    # ===          ROOT_BIN_DIR                  ===
+    # ==============================================
+
+    # get bindir from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --bindir
+        OUTPUT_VARIABLE ROOT_BIN_DIR
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( ROOT_BIN_DIR )
+    ENDIF()
+
+
+
+    # ==============================================
+    # ===          ROOT_EXECUTABLE               ===
+    # ==============================================
+
+
+    SET( ROOT_EXECUTABLE ROOT_EXECUTABLE-NOTFOUND )
+    MARK_AS_ADVANCED( ROOT_EXECUTABLE )
+    FIND_PROGRAM( ROOT_EXECUTABLE root PATHS ${ROOT_BIN_DIR} NO_DEFAULT_PATH )
+
+    IF( NOT ROOT_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ROOT_EXECUTABLE: ${ROOT_EXECUTABLE}" )
+    ENDIF()
+
+
+
+
+    # ==============================================
+    # ===          ROOT_CINT_EXECUTABLE          ===
+    # ==============================================
+
+
+    # find rootcint
+    SET( ROOT_CINT_EXECUTABLE ROOT_CINT_EXECUTABLE-NOTFOUND )
+    MARK_AS_ADVANCED( ROOT_CINT_EXECUTABLE )
+    FIND_PROGRAM( ROOT_CINT_EXECUTABLE rootcint PATHS ${ROOT_BIN_DIR} NO_DEFAULT_PATH )
+
+    IF( NOT ROOT_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for ROOT_CINT_EXECUTABLE: ${ROOT_CINT_EXECUTABLE}" )
+    ENDIF()
+
+
+
+    # ==============================================
+    # ===          ROOT_INCLUDE_DIR              ===
+    # ==============================================
+
+    # get include dir from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --incdir
+        OUTPUT_VARIABLE _inc_dir
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( _inc_dir )
+    ENDIF()
+
+
+    SET( ROOT_INCLUDE_DIRS ROOT_INCLUDE_DIRS-NOTFOUND )
+    MARK_AS_ADVANCED( ROOT_INCLUDE_DIRS )
+
+    FIND_PATH( ROOT_INCLUDE_DIRS
+        NAMES TH1.h
+        PATHS ${ROOT_DIR}/include ${_inc_dir}
+        NO_DEFAULT_PATH
+    )
+
+
+
+    # ==============================================
+    # ===            ROOT_LIBRARIES              ===
+    # ==============================================
+
+    # get library dir from root-config output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --libdir
+        OUTPUT_VARIABLE ROOT_LIBRARY_DIR
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( NOT _exit_code EQUAL 0 )
+        # clear variable if root-config exits with error
+        # it might contain garbage
+        SET( ROOT_LIBRARY_DIR )
+    ENDIF()
+
+
+
+    # ========== standard root libraries =================
+
+    # standard root libraries (without components)
+    SET( _root_libnames )
+
+    # get standard root libraries from 'root-config --libs' output
+    EXECUTE_PROCESS( COMMAND "${ROOT_CONFIG_EXECUTABLE}" --noauxlibs --libs
+        OUTPUT_VARIABLE _aux
+        RESULT_VARIABLE _exit_code
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    IF( _exit_code EQUAL 0 )
+        
+        # create a list out of the output
+        SEPARATE_ARGUMENTS( _aux )
+
+        # remove first item -L compiler flag
+        LIST( REMOVE_AT _aux 0 )
+
+        FOREACH( _lib ${_aux} )
+
+            # extract libnames from -l compiler flags
+            STRING( REGEX REPLACE "^-.(.*)$" "\\1" _libname "${_lib}")
+
+            # fix for some root-config versions which export -lz even if using --noauxlibs
+            IF( NOT _libname STREQUAL "z" )
+
+                # append all library names into a list
+                LIST( APPEND _root_libnames ${_libname} )
+
+            ENDIF()
+
+        ENDFOREACH()
+
+    ENDIF()
+
+
+
+    # ========== additional root components =================
+
+    #LIST( APPEND ROOT_FIND_COMPONENTS Minuit2 ) # DEPRECATED !!!
+
+
+    # ---------- libraries --------------------------------------------------------
+    INCLUDE( MacroCheckPackageLibs )
+
+    SET( ROOT_LIB_SEARCH_PATH ${ROOT_LIBRARY_DIR} )
+
+    # only standard libraries should be passed as arguments to CHECK_PACKAGE_LIBS
+    # additional components are set by cmake in variable PKG_FIND_COMPONENTS
+    # first argument should be the package name
+    CHECK_PACKAGE_LIBS( ROOT ${_root_libnames} )
+
+
+
+
+    # ====== DL LIBRARY ==================================================
+    # workaround for cmake bug in 64 bit:
+    # see: http://public.kitware.com/mantis/view.php?id=10813
+    IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+        FIND_LIBRARY( DL_LIB NAMES ${CMAKE_DL_LIBS} dl PATHS /usr/lib64 /lib64 NO_DEFAULT_PATH )
+    ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+    FIND_LIBRARY( DL_LIB NAMES ${CMAKE_DL_LIBS} dl )
+    MARK_AS_ADVANCED( DL_LIB )
+
+    IF( NOT ROOT_FIND_QUIETLY )
+        MESSAGE( STATUS "Check for libdl.so: ${DL_LIB}" )
+    ENDIF()
+
+ENDIF( ROOT_CONFIG_EXECUTABLE )
+
+# Threads library
+#FIND_PACKAGE( Threads REQUIRED)
+
+
+# ---------- final checking ---------------------------------------------------
+INCLUDE( FindPackageHandleStandardArgs )
+# set ROOT_FOUND to TRUE if all listed variables are TRUE and not empty
+# ROOT_COMPONENT_VARIABLES will be set if FIND_PACKAGE is called with REQUIRED argument
+FIND_PACKAGE_HANDLE_STANDARD_ARGS( ROOT DEFAULT_MSG ROOT_INCLUDE_DIRS ROOT_LIBRARIES ${ROOT_COMPONENT_VARIABLES} PACKAGE_VERSION_COMPATIBLE DL_LIB )
+
+IF( ROOT_FOUND )
+    LIST( APPEND ROOT_LIBRARIES ${DL_LIB} )
+    # FIXME DEPRECATED
+    SET( ROOT_DEFINITIONS "-DUSEROOT -DUSE_ROOT -DMARLIN_USE_ROOT" )
+    MARK_AS_ADVANCED( ROOT_DEFINITIONS )
+
+    # file including MACROS for generating root dictionary sources
+    GET_FILENAME_COMPONENT( _aux ${CMAKE_CURRENT_LIST_FILE} PATH )
+    SET( ROOT_DICT_MACROS_FILE ${_aux}/MacroRootDict.cmake )
+
+ENDIF( ROOT_FOUND )
+
+# ---------- cmake bug --------------------------------------------------------
+# ROOT_FIND_REQUIRED is not reset between FIND_PACKAGE calls, i.e. the following
+# code fails when geartgeo component not available: (fixed in cmake 2.8)
+# FIND_PACKAGE( ROOT REQUIRED )
+# FIND_PACKAGE( ROOT COMPONENTS geartgeo QUIET )
+SET( ROOT_FIND_REQUIRED )
+
diff --git a/Utilities/KiTrack/Tools/KiTrackMarlinTools.h b/Utilities/KiTrack/Tools/KiTrackMarlinTools.h
index f4b58292..c137684e 100644
--- a/Utilities/KiTrack/Tools/KiTrackMarlinTools.h
+++ b/Utilities/KiTrack/Tools/KiTrackMarlinTools.h
@@ -79,7 +79,7 @@ FTDHitSimple* createVirtualIPHit( int side , const SectorSystemFTD* sectorSystem
 VXDHitSimple* createVirtualIPHit( const SectorSystemVXD* sectorSystemVXD );
 
 
-std::string getPositionInfo( edm4hep::ConstTrackerHit* hit );
+std::string getPositionInfo( edm4hep::ConstTrackerHit hit );
 
 std::string getPositionInfo( IHit* hit );   
 
diff --git a/Utilities/KiTrack/src/Tools/FTDHelixFitter.cc b/Utilities/KiTrack/src/Tools/FTDHelixFitter.cc
index 2f0492a0..219770d3 100644
--- a/Utilities/KiTrack/src/Tools/FTDHelixFitter.cc
+++ b/Utilities/KiTrack/src/Tools/FTDHelixFitter.cc
@@ -24,7 +24,7 @@ FTDHelixFitter::FTDHelixFitter( edm4hep::Track* track ){
   //int nHits = track->trackerHits_size();
   std::copy(track->trackerHits_begin(), track->trackerHits_end(), std::back_inserter(_trackerHits));
   //for(int i=0;i<nHits;i++){
-  //  edm4hep::ConstTrackerHit* hit = &track->getTrackerHits(i);
+  //  edm4hep::ConstTrackerHit hit = &track->getTrackerHits(i);
   //  _trackerHits.push_back(hit);
   //}
   fit();
diff --git a/Utilities/KiTrack/src/Tools/Fitter.cc b/Utilities/KiTrack/src/Tools/Fitter.cc
index 13ae3aab..512c4a22 100644
--- a/Utilities/KiTrack/src/Tools/Fitter.cc
+++ b/Utilities/KiTrack/src/Tools/Fitter.cc
@@ -33,13 +33,13 @@ void Fitter::init_BField(){
 
 }
 
-bool compare_TrackerHit_z( edm4hep::TrackerHit* a, edm4hep::TrackerHit* b ){
-  return ( fabs(a->getPosition()[2]) < fabs( b->getPosition()[2]) ); //compare their z values
+bool compare_TrackerHit_z( edm4hep::ConstTrackerHit a, edm4hep::ConstTrackerHit b ){
+  return ( fabs(a.getPosition()[2]) < fabs( b.getPosition()[2]) ); //compare their z values
 }
 
-bool compare_TrackerHit_R( edm4hep::TrackerHit* a, edm4hep::TrackerHit* b ){
-  double Rad_a2 = (a->getPosition()[0]*a->getPosition()[0]) + (a->getPosition()[1]*a->getPosition()[1]) ;
-  double Rad_b2 = (b->getPosition()[0]*b->getPosition()[0]) + (b->getPosition()[1]*b->getPosition()[1]) ;
+bool compare_TrackerHit_R( edm4hep::ConstTrackerHit a, edm4hep::ConstTrackerHit b ){
+  double Rad_a2 = (a.getPosition()[0]*a.getPosition()[0]) + (a.getPosition()[1]*a.getPosition()[1]) ;
+  double Rad_b2 = (b.getPosition()[0]*b.getPosition()[0]) + (b.getPosition()[1]*b.getPosition()[1]) ;
   
   return ( Rad_a2 < Rad_b2 ); //compare their radii
 }
@@ -84,21 +84,21 @@ void Fitter::fitVXD(){
      
   unsigned number_of_added_hits = 0;
   unsigned ndof_added = 0;
-  std::vector< edm4hep::TrackerHit* > added_hits;
-  std::vector< edm4hep::TrackerHit* > added_hits_2D;
+  std::vector< edm4hep::ConstTrackerHit > added_hits;
+  std::vector< edm4hep::ConstTrackerHit > added_hits_2D;
   
   for( it = _trackerHits.begin() ; it != _trackerHits.end() ; ++it ) {
-    edm4hep::TrackerHit* trkHit = Navigation::Instance()->GetTrackerHit((*it).getObjectID());
+    edm4hep::ConstTrackerHit trkHit = Navigation::Instance()->GetTrackerHit((*it).getObjectID());
     bool isSuccessful = false; 
     
-    if( UTIL::BitSet32( trkHit->getType() )[ UTIL::ILDTrkHitTypeBit::COMPOSITE_SPACEPOINT ]   ){ //it is a composite spacepoint
+    if( UTIL::BitSet32( trkHit.getType() )[ UTIL::ILDTrkHitTypeBit::COMPOSITE_SPACEPOINT ]   ){ //it is a composite spacepoint
       //Split it up and hits to the MarlinTrk
-      std::vector< edm4hep::TrackerHit* > rawHits;
-      //const LCObjectVec rawObjects = trkHit->getRawHits();
-      //for( unsigned k=0; k<rawObjects.size(); k++ ) rawHits.push_back( dynamic_cast< TrackerHit* >( rawObjects[k] ) );
-      int nRawHit = trkHit->rawHits_size();
+      std::vector< edm4hep::ConstTrackerHit > rawHits;
+      //const LCObjectVec rawObjects = trkHit.getRawHits();
+      //for( unsigned k=0; k<rawObjects.size(); k++ ) rawHits.push_back( dynamic_cast< ConstTrackerHit >( rawObjects[k] ) );
+      int nRawHit = trkHit.rawHits_size();
       for( unsigned k=0; k< nRawHit; k++ ){
-	edm4hep::TrackerHit* rawHit = Navigation::Instance()->GetTrackerHit(trkHit->getRawHits(k));
+	edm4hep::ConstTrackerHit rawHit = Navigation::Instance()->GetTrackerHit(trkHit.getRawHits(k));
 	rawHits.push_back(rawHit);
       }
       std::sort( rawHits.begin(), rawHits.end(), compare_TrackerHit_R );
@@ -142,7 +142,7 @@ void Fitter::fitVXD(){
   
   for (unsigned ihit=0; ihit <added_hits.size(); ++ihit) {
     // check if this a space point or 2D hit 
-    if(UTIL::BitSet32( added_hits[ihit]->getType() )[ UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ] == false ){
+    if(UTIL::BitSet32( added_hits[ihit].getType() )[ UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ] == false ){
       // then add to the list 
       added_hits_2D.push_back(added_hits[ihit]);
       
@@ -151,9 +151,9 @@ void Fitter::fitVXD(){
   
   // initialise with space-points not strips 
   // make a helix from 3 hits to get a trackstate
-  const edm4hep::Vector3d x1 = added_hits_2D[0]->getPosition();
-  const edm4hep::Vector3d x2 = added_hits_2D[ added_hits_2D.size()/2 ]->getPosition();
-  const edm4hep::Vector3d x3 = added_hits_2D.back()->getPosition();   
+  const edm4hep::Vector3d x1 = added_hits_2D[0].getPosition();
+  const edm4hep::Vector3d x2 = added_hits_2D[ added_hits_2D.size()/2 ].getPosition();
+  const edm4hep::Vector3d x3 = added_hits_2D.back().getPosition();   
   
   init_BField();
   HelixTrack helixTrack( x1, x2, x3, _bField, HelixTrack::forwards );
@@ -223,7 +223,7 @@ void Fitter::fitVXD(){
   
   // fitting finished get hits in the fit for safety checks:
   
-  std::vector<std::pair<edm4hep::TrackerHit*, double> > hits_in_fit;
+  std::vector<std::pair<edm4hep::ConstTrackerHit, double> > hits_in_fit;
   
   // remember the hits are ordered in the order in which they were fitted
   // here we are fitting inwards so the first is the last and vice verse
@@ -240,14 +240,14 @@ void Fitter::fitVXD(){
     throw FitterException( s.str() );
     
   }
-  edm4hep::TrackerHit* first_hit_in_fit = hits_in_fit.back().first;
-  if (!first_hit_in_fit) {
+  edm4hep::ConstTrackerHit first_hit_in_fit = hits_in_fit.back().first;
+  if (! first_hit_in_fit.isAvailable()) {
     throw FitterException( std::string("Fitter::fit(): TrackerHit pointer to first hit == NULL ")  ) ;
   }
   
   
-  edm4hep::TrackerHit* last_hit_in_fit = hits_in_fit.front().first;
-  if (!last_hit_in_fit) {
+  edm4hep::ConstTrackerHit last_hit_in_fit = hits_in_fit.front().first;
+  if (!last_hit_in_fit.isAvailable()) {
     throw FitterException( std::string("Fitter::fit(): TrackerHit pointer to last hit == NULL ")  ) ;
   }
   
@@ -275,21 +275,21 @@ void Fitter::fit(){
   
   unsigned number_of_added_hits = 0;
   unsigned ndof_added = 0;
-  std::vector<edm4hep::TrackerHit*> added_hits;
+  std::vector<edm4hep::ConstTrackerHit> added_hits;
   
   for( it = _trackerHits.begin() ; it != _trackerHits.end() ; ++it ) {
-    edm4hep::TrackerHit* trkHit = Navigation::Instance()->GetTrackerHit((*it).getObjectID());
+    edm4hep::ConstTrackerHit trkHit = Navigation::Instance()->GetTrackerHit((*it).getObjectID());
     bool isSuccessful = false; 
-    //std::cout << "Hit " << trkHit->id() << " " << trkHit->getPosition() << std::endl;
-    if( UTIL::BitSet32( trkHit->getType() )[ UTIL::ILDTrkHitTypeBit::COMPOSITE_SPACEPOINT ]   ){ //it is a composite spacepoint
+    //std::cout << "Hit " << trkHit->id() << " " << trkHit.getPosition() << std::endl;
+    if( UTIL::BitSet32( trkHit.getType() )[ UTIL::ILDTrkHitTypeBit::COMPOSITE_SPACEPOINT ]   ){ //it is a composite spacepoint
       //Split it up and hits to the MarlinTrk
-      std::vector<edm4hep::TrackerHit*> rawHits;
-      //const LCObjectVec rawObjects = trkHit->getRawHits();                    
-      //for( unsigned k=0; k<rawObjects.size(); k++ ) rawHits.push_back( dynamic_cast< TrackerHit* >( rawObjects[k] ) );
-      int nRawHit = trkHit->rawHits_size();
+      std::vector<edm4hep::ConstTrackerHit> rawHits;
+      //const LCObjectVec rawObjects = trkHit.getRawHits();                    
+      //for( unsigned k=0; k<rawObjects.size(); k++ ) rawHits.push_back( dynamic_cast< ConstTrackerHit >( rawObjects[k] ) );
+      int nRawHit = trkHit.rawHits_size();
       for( unsigned k=0; k< nRawHit; k++ ){
-	edm4hep::TrackerHit* rawHit = Navigation::Instance()->GetTrackerHit(trkHit->getRawHits(k));
-	//std::cout << "Raw Hit " << rawHit->id() << " " << rawHit->getPosition() << std::endl;
+	edm4hep::ConstTrackerHit rawHit = Navigation::Instance()->GetTrackerHit(trkHit.getRawHits(k));
+	//std::cout << "Raw Hit " << rawHit->id() << " " << rawHit.getPosition() << std::endl;
 	rawHits.push_back(rawHit);
       }
       std::sort( rawHits.begin(), rawHits.end(), compare_TrackerHit_z );
@@ -334,9 +334,9 @@ void Fitter::fit(){
     
   // initialise with space-points not strips 
   // make a helix from 3 hits to get a trackstate
-  const edm4hep::Vector3d x1 = added_hits[0]->getPosition();
-  const edm4hep::Vector3d x2 = added_hits[ added_hits.size()/2 ]->getPosition();
-  const edm4hep::Vector3d x3 = added_hits.back()->getPosition();
+  const edm4hep::Vector3d x1 = added_hits[0].getPosition();
+  const edm4hep::Vector3d x2 = added_hits[ added_hits.size()/2 ].getPosition();
+  const edm4hep::Vector3d x3 = added_hits.back().getPosition();
   
   init_BField();
   HelixTrack helixTrack( x1, x2, x3, _bField, HelixTrack::forwards );
@@ -396,7 +396,7 @@ void Fitter::fit(){
   
   // fitting finished get hits in the fit for safety checks:
   
-  std::vector<std::pair<edm4hep::TrackerHit*, double> > hits_in_fit;
+  std::vector<std::pair<edm4hep::ConstTrackerHit, double> > hits_in_fit;
   
   // remember the hits are ordered in the order in which they were fitted
   // here we are fitting inwards so the first is the last and vice verse
@@ -410,13 +410,13 @@ void Fitter::fit(){
     
     throw FitterException( s.str() );
   }
-  edm4hep::TrackerHit* first_hit_in_fit = hits_in_fit.back().first;
-  if (!first_hit_in_fit) {
+  edm4hep::ConstTrackerHit first_hit_in_fit = hits_in_fit.back().first;
+  if (!first_hit_in_fit.isAvailable()) {
     throw FitterException( std::string("Fitter::fit(): TrackerHit pointer to first hit == NULL ")  ) ;
   }
   
-  edm4hep::TrackerHit* last_hit_in_fit = hits_in_fit.front().first;
-  if (!last_hit_in_fit) {
+  edm4hep::ConstTrackerHit last_hit_in_fit = hits_in_fit.front().first;
+  if (!last_hit_in_fit.isAvailable()) {
     throw FitterException( std::string("Fitter::fit(): TrackerHit pointer to last hit == NULL ")  ) ;
   }
   
@@ -478,13 +478,13 @@ const TrackStatePlus* Fitter::getTrackStatePlus( int trackStateLocation ){
      }
    }
    case 2/*lcio::TrackState::AtFirstHit*/:{
-     std::vector<std::pair<edm4hep::TrackerHit*, double> > hits_in_fit;
+     std::vector<std::pair<edm4hep::ConstTrackerHit, double> > hits_in_fit;
          
      // remember the hits are ordered in the order in which they were fitted
      // here we are fitting inwards so the first is the last and vice verse
      _marlinTrk->getHitsInFit(hits_in_fit);
      
-     edm4hep::TrackerHit* first_hit_in_fit = hits_in_fit.back().first;
+     edm4hep::ConstTrackerHit first_hit_in_fit = hits_in_fit.back().first;
           
      return_code = _marlinTrk->getTrackState(first_hit_in_fit, *trackState, chi2, ndf ) ;
      
@@ -506,10 +506,10 @@ const TrackStatePlus* Fitter::getTrackStatePlus( int trackStateLocation ){
      }
    }
    case 3/*lcio::TrackState::AtLastHit*/:{
-     std::vector<std::pair<edm4hep::TrackerHit*, double> > hits_in_fit;
+     std::vector<std::pair<edm4hep::ConstTrackerHit, double> > hits_in_fit;
      _marlinTrk->getHitsInFit(hits_in_fit);
      
-     edm4hep::TrackerHit* last_hit_in_fit = hits_in_fit.front().first;
+     edm4hep::ConstTrackerHit last_hit_in_fit = hits_in_fit.front().first;
           
      return_code = _marlinTrk->getTrackState(last_hit_in_fit, *trackState, chi2, ndf ) ;
          
@@ -531,10 +531,10 @@ const TrackStatePlus* Fitter::getTrackStatePlus( int trackStateLocation ){
      break;
    }
    case 4/*lcio::TrackState::AtCalorimeter*/:{
-     std::vector<std::pair<edm4hep::TrackerHit*, double> > hits_in_fit;
+     std::vector<std::pair<edm4hep::ConstTrackerHit, double> > hits_in_fit;
      _marlinTrk->getHitsInFit(hits_in_fit);
      
-     edm4hep::TrackerHit* last_hit_in_fit = hits_in_fit.front().first;
+     edm4hep::ConstTrackerHit last_hit_in_fit = hits_in_fit.front().first;
           
      UTIL::BitField64 encoder( UTIL::ILDCellID0::encoder_string ) ; 
      encoder.reset() ;  // reset to 0
diff --git a/Utilities/KiTrack/src/Tools/KiTrackMarlinTools.cc b/Utilities/KiTrack/src/Tools/KiTrackMarlinTools.cc
index 7bb007c9..235f724d 100644
--- a/Utilities/KiTrack/src/Tools/KiTrackMarlinTools.cc
+++ b/Utilities/KiTrack/src/Tools/KiTrackMarlinTools.cc
@@ -150,8 +150,8 @@ void KiTrackMarlin::saveToRoot( std::string rootFileName, std::string treeName ,
 }
 
 
-//bool KiTrackMarlin::compare_TrackerHit_z( edm4hep::ConstTrackerHit* a, edm4hep::ConstTrackerHit* b ){
-//  return ( fabs(a->getPosition()[2]) < fabs( b->getPosition()[2]) ); //compare their z values
+//bool KiTrackMarlin::compare_TrackerHit_z( edm4hep::ConstTrackerHit a, edm4hep::ConstTrackerHit b ){
+//  return ( fabs(a.getPosition()[2]) < fabs( b.getPosition()[2]) ); //compare their z values
 //}
 
 bool KiTrackMarlin::compare_TrackerHit_z( edm4hep::ConstTrackerHit& a, edm4hep::ConstTrackerHit& b ){
@@ -197,13 +197,13 @@ VXDHitSimple* KiTrackMarlin::createVirtualIPHit( const SectorSystemVXD* sectorSy
 }
 
 
-std::string KiTrackMarlin::getPositionInfo( edm4hep::ConstTrackerHit* hit ){
+std::string KiTrackMarlin::getPositionInfo( edm4hep::ConstTrackerHit hit ){
    
    std::stringstream info;
    
-   double x = hit->getPosition()[0];
-   double y = hit->getPosition()[1];
-   double z = hit->getPosition()[2];
+   double x = hit.getPosition()[0];
+   double y = hit.getPosition()[1];
+   double z = hit.getPosition()[2];
    
    info << "(" << x << "," << y << "," << z << ")";
    
@@ -245,11 +245,11 @@ std::string KiTrackMarlin::getTrackHitInfo( ITrack* track){
 
 std::string KiTrackMarlin::getTrackHitInfo( edm4hep::Track* track){
   std::stringstream info;
-  //std::vector< edm4hep::TrackerHit* > hits;
+  //std::vector< edm4hep::ConstTrackerHit > hits;
   unsigned int nHits = track->trackerHits_size();
   for(unsigned i=0; i<nHits; i++){
     edm4hep::ConstTrackerHit hit = track->getTrackerHits(i);
-    info << getPositionInfo(&hit);
+    info << getPositionInfo(hit);
   }
    
   //for( unsigned i=0; i < hits.size(); i++ ){
diff --git a/Utilities/KiTrack/src/Tools/VXDHelixFitter.cc.bak b/Utilities/KiTrack/src/Tools/VXDHelixFitter.cc.bak
index 515a8029..3da4ca1b 100644
--- a/Utilities/KiTrack/src/Tools/VXDHelixFitter.cc.bak
+++ b/Utilities/KiTrack/src/Tools/VXDHelixFitter.cc.bak
@@ -13,7 +13,7 @@
 #include "Tools/KiTrackMarlinTools.h"
 
 
-VXDHelixFitter::VXDHelixFitter( std::vector< TrackerHit* > trackerHits ){
+VXDHelixFitter::VXDHelixFitter( std::vector< ConstTrackerHit > trackerHits ){
    
    _trackerHits = trackerHits;
    
@@ -31,7 +31,7 @@ VXDHelixFitter::VXDHelixFitter( Track* track ){
 
 void VXDHelixFitter::fit(){
    
-  std::vector< TrackerHit* > trackerHits2D ;
+  std::vector< ConstTrackerHit > trackerHits2D ;
 
   for (unsigned ihit=0; ihit <_trackerHits.size(); ++ihit) {
     
@@ -76,11 +76,11 @@ void VXDHelixFitter::fit(){
    
    for( int i=0; i<nHits; i++ ){
      
-     TrackerHit* hit = trackerHits2D[i];
+     ConstTrackerHit hit = trackerHits2D[i];
      
-     xh[i] = hit->getPosition()[0];
-     yh[i] = hit->getPosition()[1];
-     zh[i] = float(hit->getPosition()[2]);
+     xh[i] = hit.getPosition()[0];
+     yh[i] = hit.getPosition()[1];
+     zh[i] = float(hit.getPosition()[2]);
      
      //wrh[i] = double(1.0/(hit->getResolutionRPhi()*hit->getResolutionRPhi()));
      //wzh[i] = 1.0/(hit->getResolutionZ()*hit->getResolutionZ());
diff --git a/Utilities/KiTrack/src/Tools/VXDHelixFitter.h b/Utilities/KiTrack/src/Tools/VXDHelixFitter.h
index cf066262..d0c84383 100644
--- a/Utilities/KiTrack/src/Tools/VXDHelixFitter.h
+++ b/Utilities/KiTrack/src/Tools/VXDHelixFitter.h
@@ -47,7 +47,7 @@ class VXDHelixFitter{
 public:
    
   VXDHelixFitter( edm4hep::Track* track ) ;
-  VXDHelixFitter( std::vector < edm4hep::TrackerHit* > trackerHits ) ;
+  VXDHelixFitter( std::vector < edm4hep::ConstTrackerHit > trackerHits ) ;
    
    
    double getChi2(){ return _chi2; }
@@ -74,7 +74,7 @@ private:
    float _d0;
    float _z0;
    
-   std::vector< edm4hep::TrackerHit* > _trackerHits;
+   std::vector< edm4hep::ConstTrackerHit > _trackerHits;
   
    
 };
-- 
GitLab