]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/tracking-ca/AliHLT3DTrackParam.cxx
bug fix: reconstruction crash when the output buffer size exceed
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLT3DTrackParam.cxx
index 8809ce6382a4f7dd76a3099b4df0f9fa3866dc37..71879af894326b424d5dfafbcb91a7612d0f0eb1 100644 (file)
@@ -1,6 +1,6 @@
 // @(#) $Id$
-//***************************************************************************
-// This file is property of and copyright by the ALICE HLT Project          * 
+// **************************************************************************
+// This file is property of and copyright by the ALICE HLT Project          *
 // ALICE Experiment at CERN, All rights reserved.                           *
 //                                                                          *
 // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
 #include "AliHLT3DTrackParam.h"
 #include "TMath.h"
 
-ClassImp(AliHLT3DTrackParam);
+ClassImp( AliHLT3DTrackParam )
 
 //* Transport utilities
-  
-Double_t AliHLT3DTrackParam::GetDStoPoint( Double_t Bz, const Double_t xyz[3], const Double_t *T0 ) const
+
+double AliHLT3DTrackParam::GetDStoPoint( double Bz, const double xyz[3], const double *T0 ) const
 {
   //* Get DS = Path/Momentum to a certain space point for Bz field
 
-  Double_t q = fSignQ;
-  if( !T0 ) T0 = fParam; 
+  double q = fSignQ;
+  if ( !T0 ) T0 = fParam;
   else q = T0[6];
 
-  const Double_t kCLight = 0.000299792458;
-  Double_t bq = Bz*q*kCLight;
-  Double_t pt2 = T0[3]*T0[3] + T0[4]*T0[4];
-  if( pt2<1.e-4 ) return 0;
-  Double_t dx = xyz[0] - T0[0];
-  Double_t dy = xyz[1] - T0[1]; 
-  Double_t a = dx*T0[3]+dy*T0[4];
-  Double_t dS = 0;
-  if( TMath::Abs(bq)<1.e-8 ) dS = a/pt2;
-  else dS = TMath::ATan2( bq*a, pt2 + bq*(dy*T0[3] -dx*T0[4]) )/bq;
+  const double kCLight = 0.000299792458;
+  double bq = Bz * q * kCLight;
+  double pt2 = T0[3] * T0[3] + T0[4] * T0[4];
+  if ( pt2 < 1.e-4 ) return 0;
+  double dx = xyz[0] - T0[0];
+  double dy = xyz[1] - T0[1];
+  double a = dx * T0[3] + dy * T0[4];
+  double dS = 0;
+  if ( TMath::Abs( bq ) < 1.e-8 ) dS = a / pt2;
+  else dS = TMath::ATan2( bq * a, pt2 + bq * ( dy * T0[3] - dx * T0[4] ) ) / bq;
   return dS;
 }
 
 
-void AliHLT3DTrackParam::TransportToDS( Double_t Bz, Double_t DS, Double_t *T0 )
+void AliHLT3DTrackParam::TransportToDS( double Bz, double DS, double *T0 )
 {
-  //* Transport the particle on DS = Path/Momentum, for Bz field 
+  //* Transport the particle on DS = Path/Momentum, for Bz field
 
-  Double_t tmp[7];
-  if( !T0 ){
+  double tmp[7];
+  if ( !T0 ) {
     T0 = tmp;
     T0[0] = fParam[0];
     T0[1] = fParam[1];
@@ -60,71 +60,73 @@ void AliHLT3DTrackParam::TransportToDS( Double_t Bz, Double_t DS, Double_t *T0 )
     T0[5] = fParam[5];
     T0[6] = fSignQ;
   }
-  const Double_t kCLight = 0.000299792458;
-  Bz = Bz*T0[6]*kCLight;
-  Double_t bs= Bz*DS;
-  Double_t s = TMath::Sin(bs), c = TMath::Cos(bs);
-  Double_t sB, cB;
-  if( TMath::Abs(bs)>1.e-10){
-    sB= s/Bz;
-    cB= (1-c)/Bz;
-  }else{
-    sB = (1. - bs*bs/6.)*DS;
-    cB = .5*sB*bs;
+  const double kCLight = 0.000299792458;
+  Bz = Bz * T0[6] * kCLight;
+  double bs = Bz * DS;
+  double s = TMath::Sin( bs ), c = TMath::Cos( bs );
+  double sB, cB;
+  if ( TMath::Abs( bs ) > 1.e-10 ) {
+    sB = s / Bz;
+    cB = ( 1 - c ) / Bz;
+  } else {
+    sB = ( 1. - bs * bs / 6. ) * DS;
+    cB = .5 * sB * bs;
   }
-    
-  Double_t px = T0[3];
-  Double_t py = T0[4];
-  Double_t pz = T0[5];
-  
-  Double_t d[6] = { fParam[0]-T0[0], fParam[1]-T0[1], fParam[2]-T0[2], 
-                   fParam[3]-T0[3], fParam[4]-T0[4], fParam[5]-T0[5]  };
-
-  T0[0] = T0[0] + sB*px + cB*py;
-  T0[1] = T0[1] - cB*px + sB*py;
-  T0[2] = T0[2] + DS*pz                       ;
-  T0[3] =          c*px + s*py;
-  T0[4] =         -s*px + c*py;
+
+  double px = T0[3];
+  double py = T0[4];
+  double pz = T0[5];
+
+  double d[6] = { fParam[0] - T0[0], fParam[1] - T0[1], fParam[2] - T0[2],
+                  fParam[3] - T0[3], fParam[4] - T0[4], fParam[5] - T0[5]
+                };
+
+  T0[0] = T0[0] + sB * px + cB * py;
+  T0[1] = T0[1] - cB * px + sB * py;
+  T0[2] = T0[2] + DS * pz                       ;
+  T0[3] =          c * px + s * py;
+  T0[4] =         -s * px + c * py;
   T0[5] = T0[5];
-  Double_t mJ[6][6] = { {1,0,0,   sB, cB,  0, },
-                        {0,1,0,  -cB, sB,  0, },
-                        {0,0,1,    0,  0, DS, },
-                        {0,0,0,    c,  s,  0, },
-                        {0,0,0,   -s,  c,  0, },
-                        {0,0,0,    0,  0,  1, }   };
-
-  for( Int_t i=0; i<6; i++){
+
+  double mJ[6][6] = { {1, 0, 0,   sB, cB,  0, },
+    {0, 1, 0,  -cB, sB,  0, },
+    {0, 0, 1,    0,  0, DS, },
+    {0, 0, 0,    c,  s,  0, },
+    {0, 0, 0,   -s,  c,  0, },
+    {0, 0, 0,    0,  0,  1, }
+  };
+
+  for ( int i = 0; i < 6; i++ ) {
     fParam[i] = T0[i];
-    for( Int_t j=0; j<6; j++) fParam[i] += mJ[i][j]*d[j];
+    for ( int j = 0; j < 6; j++ ) fParam[i] += mJ[i][j] * d[j];
   }
 
-  Double_t mA[6][6];
-  for( Int_t k=0,i=0; i<6; i++)
-    for( Int_t j=0; j<=i; j++, k++ ) mA[i][j] = mA[j][i] = fCov[k]; 
+  double mA[6][6];
+  for ( int k = 0, i = 0; i < 6; i++ )
+    for ( int j = 0; j <= i; j++, k++ ) mA[i][j] = mA[j][i] = fCov[k];
 
-  Double_t mJC[6][6];
-  for( Int_t i=0; i<6; i++ )
-    for( Int_t j=0; j<6; j++ ){
-      mJC[i][j]=0;
-      for( Int_t k=0; k<6; k++ ) mJC[i][j]+=mJ[i][k]*mA[k][j];
+  double mJC[6][6];
+  for ( int i = 0; i < 6; i++ )
+    for ( int j = 0; j < 6; j++ ) {
+      mJC[i][j] = 0;
+      for ( int k = 0; k < 6; k++ ) mJC[i][j] += mJ[i][k] * mA[k][j];
     }
-  
-  for( Int_t k=0,i=0; i<6; i++)
-    for( Int_t j=0; j<=i; j++, k++ ){
+
+  for ( int k = 0, i = 0; i < 6; i++ )
+    for ( int j = 0; j <= i; j++, k++ ) {
       fCov[k] = 0;
-      for( Int_t l=0; l<6; l++ ) fCov[k]+=mJC[i][l]*mJ[j][l];
+      for ( int l = 0; l < 6; l++ ) fCov[k] += mJC[i][l] * mJ[j][l];
     }
 }
 
 
-//* Fit utilities 
+//* Fit utilities
 
 void AliHLT3DTrackParam::InitializeCovarianceMatrix()
 {
   //* Initialization of covariance matrix
 
-  for( Int_t i=0; i<21; i++ ) fCov[i] = 0;
+  for ( int i = 0; i < 21; i++ ) fCov[i] = 0;
   fSignQ = 0;
   fCov[0] = fCov[ 2] = fCov[ 5] = 100.;
   fCov[9] = fCov[14] = fCov[20] = 10000.;
@@ -132,249 +134,252 @@ void AliHLT3DTrackParam::InitializeCovarianceMatrix()
   fNDF = -5;
 }
 
-void AliHLT3DTrackParam::GetGlueMatrix( const Double_t xyz[3], 
-                                       Double_t G[6], const Double_t *T0  ) const 
+void AliHLT3DTrackParam::GetGlueMatrix( const double xyz[3],
+                                        double G[6], const double *T0  ) const
 {
   //* !
 
-  if( !T0 ) T0 = fParam;
-
-  Double_t dx = xyz[0]-T0[0], dy = xyz[1]-T0[1], dz = xyz[2]-T0[2];
-  Double_t px2= T0[3]*T0[3], py2= T0[4]*T0[4], pz2= T0[5]*T0[5];
-  Double_t s2 = (dx*dx + dy*dy + dz*dz);
-  Double_t p2 = px2 + py2 + pz2;
-  if( p2>1.e-4 ) s2/=p2;
-  Double_t x = T0[3]*s2;
-  Double_t xx= px2*s2, xy= x*T0[4], xz= x*T0[5], yy= py2*s2, yz= T0[4]*T0[5]*s2;
-  G[ 0]= xx;
-  G[ 1]= xy;   G[ 2]= yy;
-  G[ 3]= xz;   G[ 4]= yz;   G[ 5]= pz2*s2;  
+  if ( !T0 ) T0 = fParam;
+
+  double dx = xyz[0] - T0[0], dy = xyz[1] - T0[1], dz = xyz[2] - T0[2];
+  double px2 = T0[3] * T0[3], py2 = T0[4] * T0[4], pz2 = T0[5] * T0[5];
+  double s2 = ( dx * dx + dy * dy + dz * dz );
+  double p2 = px2 + py2 + pz2;
+  if ( p2 > 1.e-4 ) s2 /= p2;
+  double x = T0[3] * s2;
+  double xx = px2 * s2, xy = x * T0[4], xz = x * T0[5], yy = py2 * s2, yz = T0[4] * T0[5] * s2;
+  G[ 0] = xx;
+  G[ 1] = xy;   G[ 2] = yy;
+  G[ 3] = xz;   G[ 4] = yz;   G[ 5] = pz2 * s2;
 }
 
 
 
-void AliHLT3DTrackParam::Filter( const Double_t m[3], const Double_t V[6], const Double_t G[6] )
-{ 
+void AliHLT3DTrackParam::Filter( const double m[3], const double V[6], const double G[6] )
+{
   //* !
-  
-  Double_t 
-    c00 = fCov[ 0],
-    c10 = fCov[ 1], c11 = fCov[ 2],
-    c20 = fCov[ 3], c21 = fCov[ 4], c22 = fCov[ 5],
-    c30 = fCov[ 6], c31 = fCov[ 7], c32 = fCov[ 8],
-    c40 = fCov[10], c41 = fCov[11], c42 = fCov[12],
-    c50 = fCov[15], c51 = fCov[16], c52 = fCov[17];
-  
+
   double
-    z0 = m[0]-fParam[0],
-    z1 = m[1]-fParam[1],
-    z2 = m[2]-fParam[2];
-  
-  Double_t mS[6] = { c00+V[0]+G[0], c10+V[1]+G[1], c11+V[2]+G[2],
-                    c20+V[3]+G[3], c21+V[4]+G[4], c22+V[5]+G[5] };
-  Double_t mSi[6];
-  mSi[0] = mS[4]*mS[4] - mS[2]*mS[5];
-  mSi[1] = mS[1]*mS[5] - mS[3]*mS[4];
-  mSi[3] = mS[2]*mS[3] - mS[1]*mS[4];
-  Double_t det = 1./(mS[0]*mSi[0] + mS[1]*mSi[1] + mS[3]*mSi[3]);
+  c00 = fCov[ 0],
+        c10 = fCov[ 1], c11 = fCov[ 2],
+                              c20 = fCov[ 3], c21 = fCov[ 4], c22 = fCov[ 5],
+                                                                    c30 = fCov[ 6], c31 = fCov[ 7], c32 = fCov[ 8],
+                                                                                                          c40 = fCov[10], c41 = fCov[11], c42 = fCov[12],
+                                                                                                                                                c50 = fCov[15], c51 = fCov[16], c52 = fCov[17];
+
+  double
+  z0 = m[0] - fParam[0],
+       z1 = m[1] - fParam[1],
+            z2 = m[2] - fParam[2];
+
+  double mS[6] = { c00 + V[0] + G[0], c10 + V[1] + G[1], c11 + V[2] + G[2],
+                   c20 + V[3] + G[3], c21 + V[4] + G[4], c22 + V[5] + G[5]
+                 };
+  double mSi[6];
+  mSi[0] = mS[4] * mS[4] - mS[2] * mS[5];
+  mSi[1] = mS[1] * mS[5] - mS[3] * mS[4];
+  mSi[3] = mS[2] * mS[3] - mS[1] * mS[4];
+  double det = 1. / ( mS[0] * mSi[0] + mS[1] * mSi[1] + mS[3] * mSi[3] );
   mSi[0] *= det;
   mSi[1] *= det;
   mSi[3] *= det;
-  mSi[2] = ( mS[3]*mS[3] - mS[0]*mS[5] )*det;
-  mSi[4] = ( mS[0]*mS[4] - mS[1]*mS[3] )*det;
-  mSi[5] = ( mS[1]*mS[1] - mS[0]*mS[2] )*det;
-  
+  mSi[2] = ( mS[3] * mS[3] - mS[0] * mS[5] ) * det;
+  mSi[4] = ( mS[0] * mS[4] - mS[1] * mS[3] ) * det;
+  mSi[5] = ( mS[1] * mS[1] - mS[0] * mS[2] ) * det;
+
   fNDF  += 2;
-  fChi2 += ( +(mSi[0]*z0 + mSi[1]*z1 + mSi[3]*z2)*z0
-            +(mSi[1]*z0 + mSi[2]*z1 + mSi[4]*z2)*z1
-            +(mSi[3]*z0 + mSi[4]*z1 + mSi[5]*z2)*z2 );
-        
-  Double_t k0, k1, k2 ; // k = CHtS
-    
-  k0 = c00*mSi[0] + c10*mSi[1] + c20*mSi[3];
-  k1 = c00*mSi[1] + c10*mSi[2] + c20*mSi[4];
-  k2 = c00*mSi[3] + c10*mSi[4] + c20*mSi[5];
-    
-  fParam[ 0]+= k0*z0  + k1*z1  + k2*z2 ;
-  fCov  [ 0]-= k0*c00 + k1*c10 + k2*c20;
-  
-  k0 = c10*mSi[0] + c11*mSi[1] + c21*mSi[3];
-  k1 = c10*mSi[1] + c11*mSi[2] + c21*mSi[4];
-  k2 = c10*mSi[3] + c11*mSi[4] + c21*mSi[5];
-  
-  fParam[ 1]+= k0*z0  + k1*z1  + k2*z2 ;
-  fCov  [ 1]-= k0*c00 + k1*c10 + k2*c20;
-  fCov  [ 2]-= k0*c10 + k1*c11 + k2*c21;
-  
-  k0 = c20*mSi[0] + c21*mSi[1] + c22*mSi[3];
-  k1 = c20*mSi[1] + c21*mSi[2] + c22*mSi[4];
-  k2 = c20*mSi[3] + c21*mSi[4] + c22*mSi[5];
-  
-  fParam[ 2]+= k0*z0  + k1*z1  + k2*z2 ;
-  fCov  [ 3]-= k0*c00 + k1*c10 + k2*c20;
-  fCov  [ 4]-= k0*c10 + k1*c11 + k2*c21;
-  fCov  [ 5]-= k0*c20 + k1*c21 + k2*c22;
-  
-  k0 = c30*mSi[0] + c31*mSi[1] + c32*mSi[3];
-  k1 = c30*mSi[1] + c31*mSi[2] + c32*mSi[4];
-  k2 = c30*mSi[3] + c31*mSi[4] + c32*mSi[5];
-  
-  fParam[ 3]+= k0*z0  + k1*z1  + k2*z2 ;
-  fCov  [ 6]-= k0*c00 + k1*c10 + k2*c20;
-  fCov  [ 7]-= k0*c10 + k1*c11 + k2*c21;
-  fCov  [ 8]-= k0*c20 + k1*c21 + k2*c22;
-  fCov  [ 9]-= k0*c30 + k1*c31 + k2*c32;
-  
-  k0 = c40*mSi[0] + c41*mSi[1] + c42*mSi[3];
-  k1 = c40*mSi[1] + c41*mSi[2] + c42*mSi[4];
-  k2 = c40*mSi[3] + c41*mSi[4] + c42*mSi[5];
-    
-  fParam[ 4]+= k0*z0  + k1*z1  + k2*z2 ;
-  fCov  [10]-= k0*c00 + k1*c10 + k2*c20;
-  fCov  [11]-= k0*c10 + k1*c11 + k2*c21;
-  fCov  [12]-= k0*c20 + k1*c21 + k2*c22;
-  fCov  [13]-= k0*c30 + k1*c31 + k2*c32;
-  fCov  [14]-= k0*c40 + k1*c41 + k2*c42;
-
-  k0 = c50*mSi[0] + c51*mSi[1] + c52*mSi[3];
-  k1 = c50*mSi[1] + c51*mSi[2] + c52*mSi[4];
-  k2 = c50*mSi[3] + c51*mSi[4] + c52*mSi[5];
-  
-  fParam[ 5]+= k0*z0  + k1*z1  + k2*z2 ;
-  fCov  [15]-= k0*c00 + k1*c10 + k2*c20;
-  fCov  [16]-= k0*c10 + k1*c11 + k2*c21;
-  fCov  [17]-= k0*c20 + k1*c21 + k2*c22;
-  fCov  [18]-= k0*c30 + k1*c31 + k2*c32;
-  fCov  [19]-= k0*c40 + k1*c41 + k2*c42;
-  fCov  [20]-= k0*c50 + k1*c51 + k2*c52;
+  fChi2 += ( +( mSi[0] * z0 + mSi[1] * z1 + mSi[3] * z2 ) * z0
+             + ( mSi[1] * z0 + mSi[2] * z1 + mSi[4] * z2 ) * z1
+             + ( mSi[3] * z0 + mSi[4] * z1 + mSi[5] * z2 ) * z2 );
+
+  double k0, k1, k2 ; // k = CHtS
+
+  k0 = c00 * mSi[0] + c10 * mSi[1] + c20 * mSi[3];
+  k1 = c00 * mSi[1] + c10 * mSi[2] + c20 * mSi[4];
+  k2 = c00 * mSi[3] + c10 * mSi[4] + c20 * mSi[5];
+
+  fParam[ 0] += k0 * z0  + k1 * z1  + k2 * z2 ;
+  fCov  [ 0] -= k0 * c00 + k1 * c10 + k2 * c20;
+
+  k0 = c10 * mSi[0] + c11 * mSi[1] + c21 * mSi[3];
+  k1 = c10 * mSi[1] + c11 * mSi[2] + c21 * mSi[4];
+  k2 = c10 * mSi[3] + c11 * mSi[4] + c21 * mSi[5];
+
+  fParam[ 1] += k0 * z0  + k1 * z1  + k2 * z2 ;
+  fCov  [ 1] -= k0 * c00 + k1 * c10 + k2 * c20;
+  fCov  [ 2] -= k0 * c10 + k1 * c11 + k2 * c21;
+
+  k0 = c20 * mSi[0] + c21 * mSi[1] + c22 * mSi[3];
+  k1 = c20 * mSi[1] + c21 * mSi[2] + c22 * mSi[4];
+  k2 = c20 * mSi[3] + c21 * mSi[4] + c22 * mSi[5];
+
+  fParam[ 2] += k0 * z0  + k1 * z1  + k2 * z2 ;
+  fCov  [ 3] -= k0 * c00 + k1 * c10 + k2 * c20;
+  fCov  [ 4] -= k0 * c10 + k1 * c11 + k2 * c21;
+  fCov  [ 5] -= k0 * c20 + k1 * c21 + k2 * c22;
+
+  k0 = c30 * mSi[0] + c31 * mSi[1] + c32 * mSi[3];
+  k1 = c30 * mSi[1] + c31 * mSi[2] + c32 * mSi[4];
+  k2 = c30 * mSi[3] + c31 * mSi[4] + c32 * mSi[5];
+
+  fParam[ 3] += k0 * z0  + k1 * z1  + k2 * z2 ;
+  fCov  [ 6] -= k0 * c00 + k1 * c10 + k2 * c20;
+  fCov  [ 7] -= k0 * c10 + k1 * c11 + k2 * c21;
+  fCov  [ 8] -= k0 * c20 + k1 * c21 + k2 * c22;
+  fCov  [ 9] -= k0 * c30 + k1 * c31 + k2 * c32;
+
+  k0 = c40 * mSi[0] + c41 * mSi[1] + c42 * mSi[3];
+  k1 = c40 * mSi[1] + c41 * mSi[2] + c42 * mSi[4];
+  k2 = c40 * mSi[3] + c41 * mSi[4] + c42 * mSi[5];
+
+  fParam[ 4] += k0 * z0  + k1 * z1  + k2 * z2 ;
+  fCov  [10] -= k0 * c00 + k1 * c10 + k2 * c20;
+  fCov  [11] -= k0 * c10 + k1 * c11 + k2 * c21;
+  fCov  [12] -= k0 * c20 + k1 * c21 + k2 * c22;
+  fCov  [13] -= k0 * c30 + k1 * c31 + k2 * c32;
+  fCov  [14] -= k0 * c40 + k1 * c41 + k2 * c42;
+
+  k0 = c50 * mSi[0] + c51 * mSi[1] + c52 * mSi[3];
+  k1 = c50 * mSi[1] + c51 * mSi[2] + c52 * mSi[4];
+  k2 = c50 * mSi[3] + c51 * mSi[4] + c52 * mSi[5];
+
+  fParam[ 5] += k0 * z0  + k1 * z1  + k2 * z2 ;
+  fCov  [15] -= k0 * c00 + k1 * c10 + k2 * c20;
+  fCov  [16] -= k0 * c10 + k1 * c11 + k2 * c21;
+  fCov  [17] -= k0 * c20 + k1 * c21 + k2 * c22;
+  fCov  [18] -= k0 * c30 + k1 * c31 + k2 * c32;
+  fCov  [19] -= k0 * c40 + k1 * c41 + k2 * c42;
+  fCov  [20] -= k0 * c50 + k1 * c51 + k2 * c52;
 
   // fit charge
 
-  Double_t px = fParam[3];
-  Double_t py = fParam[4];
-  Double_t pz = fParam[5];
-  
-  Double_t p = TMath::Sqrt( px*px + py*py + pz*pz );
-  Double_t pi = 1./p;
-  Double_t qp = fSignQ*pi;
-  Double_t qp3 = qp*pi*pi;
-  Double_t 
-    c60 = qp3*(c30+c40+c50),
-    c61 = qp3*(c31+c41+c51),
-    c62 = qp3*(c32+c42+c52);
-
-  k0 = c60*mSi[0] + c61*mSi[1] + c62*mSi[3];
-  k1 = c60*mSi[1] + c61*mSi[2] + c62*mSi[4];
-  k2 = c60*mSi[3] + c61*mSi[4] + c62*mSi[5];
-  
-  qp+= k0*z0  + k1*z1  + k2*z2 ;
-  if( qp>0 ) fSignQ = 1;
-  else if(qp<0 ) fSignQ = -1;
+  double px = fParam[3];
+  double py = fParam[4];
+  double pz = fParam[5];
+
+  double p = TMath::Sqrt( px * px + py * py + pz * pz );
+  double pi = 1. / p;
+  double qp = fSignQ * pi;
+  double qp3 = qp * pi * pi;
+  double
+  c60 = qp3 * ( c30 + c40 + c50 ),
+        c61 = qp3 * ( c31 + c41 + c51 ),
+              c62 = qp3 * ( c32 + c42 + c52 );
+
+  k0 = c60 * mSi[0] + c61 * mSi[1] + c62 * mSi[3];
+  k1 = c60 * mSi[1] + c61 * mSi[2] + c62 * mSi[4];
+  k2 = c60 * mSi[3] + c61 * mSi[4] + c62 * mSi[5];
+
+  qp += k0 * z0  + k1 * z1  + k2 * z2 ;
+  if ( qp > 0 ) fSignQ = 1;
+  else if ( qp < 0 ) fSignQ = -1;
   else fSignQ = 0;
 }
 
 
 //* Other utilities
 
-void AliHLT3DTrackParam::SetDirection( Double_t Direction[3] )
+void AliHLT3DTrackParam::SetDirection( double Direction[3] )
 {
-  //* Change track direction 
+  //* Change track direction
 
-  if( fParam[3]*Direction[0] + fParam[4]*Direction[1] + fParam[5]*Direction[2] >= 0 ) return;
+  if ( fParam[3]*Direction[0] + fParam[4]*Direction[1] + fParam[5]*Direction[2] >= 0 ) return;
 
   fParam[3] = -fParam[3];
   fParam[4] = -fParam[4];
   fParam[5] = -fParam[5];
   fSignQ    = -fSignQ;
 
-  fCov[ 6]=-fCov[ 6]; fCov[ 7]=-fCov[ 7]; fCov[ 8]=-fCov[ 8];
-  fCov[10]=-fCov[10]; fCov[11]=-fCov[11]; fCov[12]=-fCov[12];
-  fCov[15]=-fCov[15]; fCov[16]=-fCov[16]; fCov[17]=-fCov[17];
+  fCov[ 6] = -fCov[ 6]; fCov[ 7] = -fCov[ 7]; fCov[ 8] = -fCov[ 8];
+  fCov[10] = -fCov[10]; fCov[11] = -fCov[11]; fCov[12] = -fCov[12];
+  fCov[15] = -fCov[15]; fCov[16] = -fCov[16]; fCov[17] = -fCov[17];
 }
 
 
-void AliHLT3DTrackParam::RotateCoordinateSystem( Double_t alpha )
+void AliHLT3DTrackParam::RotateCoordinateSystem( double alpha )
 {
   //* !
 
-  Double_t cA = TMath::Cos( alpha );
-  Double_t sA = TMath::Sin( alpha );
-  Double_t x= fParam[0], y= fParam[1], px= fParam[3], py= fParam[4];
-  fParam[0] = x*cA + y*sA;
-  fParam[1] =-x*sA + y*cA;
+  double cA = TMath::Cos( alpha );
+  double sA = TMath::Sin( alpha );
+  double x = fParam[0], y = fParam[1], px = fParam[3], py = fParam[4];
+  fParam[0] = x * cA + y * sA;
+  fParam[1] = -x * sA + y * cA;
   fParam[2] = fParam[2];
-  fParam[3] = px*cA + py*sA;
-  fParam[4] =-px*sA + py*cA;
-  fParam[5] = fParam[5];  
-
-  Double_t mJ[6][6] = { { cA,sA, 0,  0,  0,  0 },
-                        {-sA,cA, 0,  0,  0,  0 },
-                        {  0, 0, 1,  0,  0,  0 },
-                        {  0, 0, 0, cA, sA,  0 },
-                        {  0, 0, 0,-sA, cA,  0 },
-                        {  0, 0, 0,  0,  0,  1 }  };
-                  
-  Double_t mA[6][6];
-  for( Int_t k=0,i=0; i<6; i++)
-    for( Int_t j=0; j<=i; j++, k++ ) mA[i][j] = mA[j][i] = fCov[k]; 
-
-  Double_t mJC[6][6];
-  for( Int_t i=0; i<6; i++ )
-    for( Int_t j=0; j<6; j++ ){
-      mJC[i][j]=0;
-      for( Int_t k=0; k<6; k++ ) mJC[i][j]+=mJ[i][k]*mA[k][j];
+  fParam[3] = px * cA + py * sA;
+  fParam[4] = -px * sA + py * cA;
+  fParam[5] = fParam[5];
+
+  double mJ[6][6] = { { cA, sA, 0,  0,  0,  0 },
+    { -sA, cA, 0,  0,  0,  0 },
+    {  0, 0, 1,  0,  0,  0 },
+    {  0, 0, 0, cA, sA,  0 },
+    {  0, 0, 0, -sA, cA,  0 },
+    {  0, 0, 0,  0,  0,  1 }
+  };
+
+  double mA[6][6];
+  for ( int k = 0, i = 0; i < 6; i++ )
+    for ( int j = 0; j <= i; j++, k++ ) mA[i][j] = mA[j][i] = fCov[k];
+
+  double mJC[6][6];
+  for ( int i = 0; i < 6; i++ )
+    for ( int j = 0; j < 6; j++ ) {
+      mJC[i][j] = 0;
+      for ( int k = 0; k < 6; k++ ) mJC[i][j] += mJ[i][k] * mA[k][j];
     }
-  
-  for( Int_t k=0,i=0; i<6; i++)
-    for( Int_t j=0; j<=i; j++, k++ ){
+
+  for ( int k = 0, i = 0; i < 6; i++ )
+    for ( int j = 0; j <= i; j++, k++ ) {
       fCov[k] = 0;
-      for( Int_t l=0; l<6; l++ ) fCov[k]+=mJC[i][l]*mJ[j][l];
+      for ( int l = 0; l < 6; l++ ) fCov[k] += mJC[i][l] * mJ[j][l];
     }
 }
 
 
-void AliHLT3DTrackParam::Get5Parameters( Double_t alpha, Double_t T[6], Double_t C[15] ) const
+void AliHLT3DTrackParam::Get5Parameters( double alpha, double T[6], double C[15] ) const
 {
   //* !
 
   AliHLT3DTrackParam t = *this;
-  t.RotateCoordinateSystem(alpha);
-  Double_t 
-    x= t.fParam[0], y= t.fParam[1], z = t.fParam[2], 
-    px= t.fParam[3], py= t.fParam[4], pz = t.fParam[5], q = t.fSignQ;
+  t.RotateCoordinateSystem( alpha );
+  double
+  x = t.fParam[0], y = t.fParam[1], z = t.fParam[2],
+                                        px = t.fParam[3], py = t.fParam[4], pz = t.fParam[5], q = t.fSignQ;
 
-  Double_t p2 = px*px+py*py+pz*pz;
-  if( p2<1.e-8 ) p2 = 1;
-  Double_t n2 = 1./p2;
-  Double_t n = sqrt(n2);
+  double p2 = px * px + py * py + pz * pz;
+  if ( p2 < 1.e-8 ) p2 = 1;
+  double n2 = 1. / p2;
+  double n = sqrt( n2 );
 
   T[5] = x;
   T[0] = y;
   T[1] = z;
-  T[2] = py/px;
-  T[3] = pz/px;
-  T[4] = q*n;
-
-  Double_t mJ[5][6] = { { -T[2], 1, 0,  0,  0,  0 },
-                        { -T[3], 0, 1,  0,  0,  0 },
-                        { 0, 0, 0,  -T[2]/px,  1./px,  0 },
-                        { 0, 0, 0, -T[3]/px,  0,  1./px },
-                        { 0, 0, 0, -T[4]*n2*px, -T[4]*n2*py, -T[4]*n2*pz} };
-
-  Double_t mA[6][6];
-  for( Int_t k=0,i=0; i<6; i++)
-    for( Int_t j=0; j<=i; j++, k++ ) mA[i][j] = mA[j][i] = t.fCov[k]; 
-
-  Double_t mJC[5][6];
-  for( Int_t i=0; i<5; i++ )
-    for( Int_t j=0; j<6; j++ ){
-      mJC[i][j]=0;
-      for( Int_t k=0; k<6; k++ ) mJC[i][j]+=mJ[i][k]*mA[k][j];
+  T[2] = py / px;
+  T[3] = pz / px;
+  T[4] = q * n;
+
+  double mJ[5][6] = { { -T[2], 1, 0,  0,  0,  0 },
+    { -T[3], 0, 1,  0,  0,  0 },
+    { 0, 0, 0,  -T[2] / px,  1. / px,  0 },
+    { 0, 0, 0, -T[3] / px,  0,  1. / px },
+    { 0, 0, 0, -T[4]*n2*px, -T[4]*n2*py, -T[4]*n2*pz}
+  };
+
+  double mA[6][6];
+  for ( int k = 0, i = 0; i < 6; i++ )
+    for ( int j = 0; j <= i; j++, k++ ) mA[i][j] = mA[j][i] = t.fCov[k];
+
+  double mJC[5][6];
+  for ( int i = 0; i < 5; i++ )
+    for ( int j = 0; j < 6; j++ ) {
+      mJC[i][j] = 0;
+      for ( int k = 0; k < 6; k++ ) mJC[i][j] += mJ[i][k] * mA[k][j];
     }
-  
-  for( Int_t k=0,i=0; i<5; i++)
-    for( Int_t j=0; j<=i; j++, k++ ){
+
+  for ( int k = 0, i = 0; i < 5; i++ )
+    for ( int j = 0; j <= i; j++, k++ ) {
       C[k] = 0;
-      for( Int_t l=0; l<6; l++ ) C[k]+=mJC[i][l]*mJ[j][l];
+      for ( int l = 0; l < 6; l++ ) C[k] += mJC[i][l] * mJ[j][l];
     }
 }