+ if(fkReconstructor){
+ Double_t sys[15]; memset(sys, 0, 15*sizeof(Double_t));
+ fkReconstructor->GetRecoParam()->GetSysCovMatrix(sys);
+ sy2 += sys[0];
+ sz2 += sys[1];
+ }
+
+ // rotate covariance matrix if no RC
+ if(!IsRowCross()){
+ Double_t t2 = GetTilt()*GetTilt();
+ Double_t correction = 1./(1. + t2);
+ cov[0] = (sy2+t2*sz2)*correction;
+ cov[1] = GetTilt()*(sz2 - sy2)*correction;
+ cov[2] = (t2*sy2+sz2)*correction;
+ } else {
+ cov[0] = sy2; cov[1] = 0.; cov[2] = sy2;
+ }
+
+ AliDebug(4, Form("C(%6.1f %+6.3f %6.1f) RC[%c]", 1.e4*TMath::Sqrt(cov[0]), cov[1], 1.e4*TMath::Sqrt(cov[2]), IsRowCross()?'y':'n'));
+}
+
+//____________________________________________________________
+Int_t AliTRDseedV1::GetCovSqrt(const Double_t * const c, Double_t *d)
+{
+// Helper function to calculate the square root of the covariance matrix.
+// The input matrix is stored in the vector c and the result in the vector d.
+// Both arrays have to be initialized by the user with at least 3 elements. Return negative in case of failure.
+//
+// For calculating the square root of the symmetric matrix c
+// the following relation is used:
+// BEGIN_LATEX
+// C^{1/2} = VD^{1/2}V^{-1}
+// END_LATEX
+// with V being the matrix with the n eigenvectors as columns.
+// In case C is symmetric the followings are true:
+// - matrix D is diagonal with the diagonal given by the eigenvalues of C
+// - V = V^{-1}
+//
+// Author A.Bercuci <A.Bercuci@gsi.de>
+// Date Mar 19 2009
+
+ const Double_t kZero(1.e-20);
+ Double_t l[2], // eigenvalues
+ v[3]; // eigenvectors
+ // the secular equation and its solution :
+ // (c[0]-L)(c[2]-L)-c[1]^2 = 0
+ // L^2 - L*Tr(c)+DET(c) = 0
+ // L12 = [Tr(c) +- sqrt(Tr(c)^2-4*DET(c))]/2
+ Double_t tr = c[0]+c[2], // trace
+ det = c[0]*c[2]-c[1]*c[1]; // determinant
+ if(TMath::Abs(det)<kZero) return 1;
+ Double_t dd = TMath::Sqrt(tr*tr - 4*det);
+ l[0] = .5*(tr + dd*(c[0]>c[2]?-1.:1.));
+ l[1] = .5*(tr + dd*(c[0]>c[2]?1.:-1.));
+ if(l[0]<kZero || l[1]<kZero) return 2;
+ // the sym V matrix
+ // | v00 v10|
+ // | v10 v11|
+ Double_t den = (l[0]-c[0])*(l[0]-c[0])+c[1]*c[1];
+ if(den<kZero){ // almost diagonal
+ v[0] = TMath::Sign(0., c[1]);
+ v[1] = TMath::Sign(1., (l[0]-c[0]));
+ v[2] = TMath::Sign(0., c[1]*(l[0]-c[0])*(l[1]-c[2]));
+ } else {
+ Double_t tmp = 1./TMath::Sqrt(den);
+ v[0] = c[1]* tmp;
+ v[1] = (l[0]-c[0])*tmp;
+ if(TMath::Abs(l[1]-c[2])<kZero) v[2] = TMath::Sign(v[0]*(l[0]-c[0])/kZero, (l[1]-c[2]));
+ else v[2] = v[0]*(l[0]-c[0])/(l[1]-c[2]);
+ }
+ // the VD^{1/2}V is:
+ l[0] = TMath::Sqrt(l[0]); l[1] = TMath::Sqrt(l[1]);
+ d[0] = v[0]*v[0]*l[0]+v[1]*v[1]*l[1];
+ d[1] = v[0]*v[1]*l[0]+v[1]*v[2]*l[1];
+ d[2] = v[1]*v[1]*l[0]+v[2]*v[2]*l[1];
+
+ return 0;
+}
+
+//____________________________________________________________
+Double_t AliTRDseedV1::GetCovInv(const Double_t * const c, Double_t *d)
+{
+// Helper function to calculate the inverse of the covariance matrix.
+// The input matrix is stored in the vector c and the result in the vector d.
+// Both arrays have to be initialized by the user with at least 3 elements
+// The return value is the determinant or 0 in case of singularity.
+//
+// Author A.Bercuci <A.Bercuci@gsi.de>
+// Date Mar 19 2009
+
+ Double_t det = c[0]*c[2] - c[1]*c[1];
+ if(TMath::Abs(det)<1.e-20) return 0.;
+ Double_t invDet = 1./det;
+ d[0] = c[2]*invDet;
+ d[1] =-c[1]*invDet;
+ d[2] = c[0]*invDet;
+ return det;
+}
+
+//____________________________________________________________________
+UShort_t AliTRDseedV1::GetVolumeId() const
+{
+// Returns geometry volume id by delegation
+
+ for(Int_t ic(0);ic<kNclusters; ic++){
+ if(fClusters[ic]) return fClusters[ic]->GetVolumeId();
+ }
+ return 0;