Index: external/TrackCovariance/ObsTrk.cc
===================================================================
--- external/TrackCovariance/ObsTrk.cc	(revision 7bca620d8806cdb79431d2e6f5507261fe714df3)
+++ external/TrackCovariance/ObsTrk.cc	(revision 00b14d5c6ddb976be4dc164ca631592625d582a4)
@@ -134,4 +134,8 @@
 	Double_t ZinNeg = fG->GetZminNeg();
 	Bool_t inside = TrkUtil::IsInside(fGenX, Rin, ZinNeg, ZinPos); // Check if in inner box
+	SolTrack* trk = new SolTrack(fGenX, fGenP, fG);
+	Double_t Xfirst, Yfirst, Zfirst;
+	Int_t iLay = trk->FirstHit(Xfirst, Yfirst, Zfirst);
+	TVector3 fXfirst(Xfirst, Yfirst, Zfirst);
 	if (inside)
 	{
@@ -147,10 +151,9 @@
 		//std::cout<<"ObsTrk:: outside: x= "<<fGenX(0)<<", y= "<<fGenX(1)
                 //                         <<", z= "<<fGenX(2)<<std::endl;
-		SolTrack* trk = new SolTrack(fGenX, fGenP, fG);
 		Bool_t Res = kTRUE; Bool_t MS = kTRUE;
 		trk->CovCalc(Res, MS);					// Calculate covariance matrix
-		Cov = trk->Cov();					// Track covariance
-		delete trk;
-	}
+		Cov = trk->Cov();
+	}					// Track covariance
+	delete trk;
 	//
 	fCov = Cov;
Index: external/TrackCovariance/ObsTrk.h
===================================================================
--- external/TrackCovariance/ObsTrk.h	(revision 7bca620d8806cdb79431d2e6f5507261fe714df3)
+++ external/TrackCovariance/ObsTrk.h	(revision 00b14d5c6ddb976be4dc164ca631592625d582a4)
@@ -46,4 +46,5 @@
 	TMatrixDSym fCovILC;			// Covariance of track parameters in ILC format
 									// (d0, phi0, w, z0, tan(lambda))
+	TVector3 fXfirst;			// x,y,z of first track hit
 	//
 	// Service routines
@@ -89,6 +90,7 @@
 	TMatrixDSym GetCovMm()	{ return fCov; }	// in mm
 	TMatrixDSym GetCovACTS(){ return fCovACTS; }
-	TMatrixDSym GetCovILC(){ return fCovILC; }
-	//
+	TMatrixDSym GetCovILC() { return fCovILC; }
+	// First hit
+	TVector3 GetFirstHit()  { return fXfirst; }
 };
 
Index: external/TrackCovariance/SolTrack.cc
===================================================================
--- external/TrackCovariance/SolTrack.cc	(revision 7bca620d8806cdb79431d2e6f5507261fe714df3)
+++ external/TrackCovariance/SolTrack.cc	(revision 00b14d5c6ddb976be4dc164ca631592625d582a4)
@@ -232,4 +232,46 @@
 	//
 	return kmh;
+}
+//
+Int_t SolTrack::FirstHit(Double_t &Xfirst, Double_t &Yfirst, Double_t &Zfirst)
+{
+	Int_t iFirst = -1;	
+	Int_t iFirstLay = -1;	// Default return with no hits
+	Xfirst = 0.;
+	Yfirst = 0.;
+	Zfirst = 0.;
+	Int_t Nmh = nmHit();	// # measurement hits
+	if(Nmh > 0){
+		Int_t    *ih = new Int_t   [Nmh];
+		Double_t *Xh = new Double_t[Nmh];
+		Double_t *Yh = new Double_t[Nmh];
+		Double_t *Zh = new Double_t[Nmh];
+		Double_t *dh = new Double_t[Nmh];
+		//
+		Int_t n = HitListXYZ(ih, Xh, Yh, Zh);	
+		//
+		for(Int_t i=0; i<Nmh; i++){
+			Double_t rr = TMath::Sqrt(Xh[i]*Xh[i]+Yh[i]*Yh[i]);	// Hit radius		
+			dh[i] = TMath::ASin(C() * TMath::Sqrt((rr * rr - D() * D()) / (1. + 2 * C() * D()))) / C();	// Arc length traveled
+		}
+		//
+		Int_t *hord = new Int_t[Nmh];			// hit order by increasing arc length
+		TMath::Sort(Nmh, dh, hord, kFALSE);		// Order by increasing arc length
+		iFirst = hord[0];				// First hit pointer
+		Xfirst = Xh[iFirst];
+		Yfirst = Yh[iFirst];
+		Zfirst = Zh[iFirst];
+		iFirstLay = ih[iFirst];
+		//
+		// Clean
+		delete [] ih;
+		delete [] Xh;
+		delete [] Yh;
+		delete [] Zh;
+		delete [] dh;
+		delete [] hord;
+	}
+//
+	return 	iFirstLay;	// Return first hit layer number
 }
 //
Index: external/TrackCovariance/SolTrack.h
===================================================================
--- external/TrackCovariance/SolTrack.h	(revision 7bca620d8806cdb79431d2e6f5507261fe714df3)
+++ external/TrackCovariance/SolTrack.h	(revision 00b14d5c6ddb976be4dc164ca631592625d582a4)
@@ -73,4 +73,5 @@
 	Int_t HitList(Int_t *&ihh, Double_t *&rhh, Double_t *&zhh);
 	Int_t HitListXYZ(Int_t *&ihh, Double_t *&Xh, Double_t *&Yh, Double_t *&Zh);
+	Int_t FirstHit(Double_t &Xfirst, Double_t &Yfirst, Double_t &Zfirst);	// First hit position
 	//
 	// Track graph
