//-*- Mode: C++ -*-
// $Id$
-
-//* This file is property of and copyright by the ALICE HLT Project *
-//* ALICE Experiment at CERN, All rights reserved. *
-//* See cxx source for full Copyright notice *
+// ************************************************************************
+// This file is property of and copyright by the ALICE HLT Project *
+// ALICE Experiment at CERN, All rights reserved. *
+// See cxx source for full Copyright notice *
+// *
+//*************************************************************************
#ifndef ALIHLTTPCCATRACKPARAM_H
#define ALIHLTTPCCATRACKPARAM_H
#include "AliHLTTPCCADef.h"
+#include "AliHLTTPCCAMath.h"
+#include "AliHLTTPCCATrackParam2.h"
+class AliHLTTPCCATrackLinearisation;
/**
* @class AliHLTTPCCATrackParam
*/
class AliHLTTPCCATrackParam
{
- public:
-
- class AliHLTTPCCATrackFitParam
- {
public:
- Float_t
- fBethe, fE,fTheta2, fEP2, fSigmadE2, fK22,fK33,fK43,fK44;// parameters
- };
-
-#if !defined(HLTCA_GPUCODE)
- AliHLTTPCCATrackParam(): fX(0),fCosPhi(1),fChi2(0), fNDF(0){}
- ~AliHLTTPCCATrackParam(){}
-#endif
-
- GPUd() Float_t &X() { return fX; }
- GPUd() Float_t &Y() { return fP[0]; }
- GPUd() Float_t &Z() { return fP[1]; }
- GPUd() Float_t &SinPhi(){ return fP[2]; }
- GPUd() Float_t &DzDs() { return fP[3]; }
- GPUd() Float_t &Kappa() { return fP[4]; }
- GPUd() Float_t &CosPhi(){ return fCosPhi; }
- GPUd() Float_t &Chi2() { return fChi2; }
- GPUd() Int_t &NDF() { return fNDF; }
-
- Float_t &Err2Y() { return fC[0]; }
- Float_t &Err2Z() { return fC[2]; }
- Float_t &Err2SinPhi() { return fC[5]; }
- Float_t &Err2DzDs() { return fC[9]; }
- Float_t &Err2Kappa() { return fC[14]; }
-
- GPUd() Float_t GetX() const { return fX; }
- GPUd() Float_t GetY() const { return fP[0]; }
- GPUd() Float_t GetZ() const { return fP[1]; }
- GPUd() Float_t GetSinPhi() const { return fP[2]; }
- GPUd() Float_t GetDzDs() const { return fP[3]; }
- GPUd() Float_t GetKappa() const { return fP[4]; }
- GPUd() Float_t GetCosPhi() const { return fCosPhi; }
- GPUd() Float_t GetChi2() const { return fChi2; }
- GPUd() Int_t GetNDF() const { return fNDF; }
-
- GPUd() Float_t GetErr2Y() const { return fC[0]; }
- GPUd() Float_t GetErr2Z() const { return fC[2]; }
- GPUd() Float_t GetErr2SinPhi() const { return fC[5]; }
- GPUd() Float_t GetErr2DzDs() const { return fC[9]; }
- GPUd() Float_t GetErr2Kappa() const { return fC[14]; }
-
- GPUhd() Float_t *Par(){ return fP; }
- GPUhd() Float_t *Cov(){ return fC; }
-
- const Float_t *GetPar() const { return fP; }
- const Float_t *GetCov() const { return fC; }
-
- GPUd() void ConstructXY3( const Float_t x[3], const Float_t y[3], const Float_t sigmaY2[3], Float_t CosPhi0 );
-
- GPUd() void ConstructXYZ3( const Float_t p0[5], const Float_t p1[5], const Float_t p2[5],
- Float_t CosPhi0, Float_t t0[]=0 );
-
- GPUd() Float_t GetS( Float_t x, Float_t y ) const;
-
- GPUd() void GetDCAPoint( Float_t x, Float_t y, Float_t z,
- Float_t &px, Float_t &py, Float_t &pz ) const;
-
- GPUd() Int_t TransportToX( Float_t X, Float_t maxSinPhi );
- GPUd() Bool_t TransportToXWithMaterial( Float_t X, AliHLTTPCCATrackFitParam &par );
- GPUd() Bool_t TransportToXWithMaterial( Float_t X, Float_t Bz );
- GPUd() Bool_t Rotate( Float_t alpha );
-
- GPUd() Bool_t Filter2( Float_t y, Float_t z, Float_t err2Y, Float_t err2Z, Float_t maxSinPhi=.99 );
-
- GPUd() Int_t TransportToX0( Float_t X, Float_t /*maxSinPhi*/ );
- GPUd() Bool_t Filter20( Float_t y, Float_t z, Float_t err2Y, Float_t err2Z, Float_t maxSinPhi=.99 );
-
- GPUd() Bool_t Filter2v1( Float_t y, Float_t z, Float_t err2Y, Float_t err2Z, Float_t maxSinPhi=.99 );
- GPUd() void FilterY( Float_t y, Float_t erry );
- GPUd() void FilterZ( Float_t z, Float_t errz );
-
- GPUd() GPUd() static Float_t ApproximateBetheBloch( Float_t beta2 );
- GPUd() void CalculateFitParameters( AliHLTTPCCATrackFitParam &par, Float_t Bz, Float_t mass = 0.13957 );
- GPUd() GPUd() Bool_t CorrectForMeanMaterial( Float_t xOverX0, Float_t xTimesRho, AliHLTTPCCATrackFitParam &par );
- GPUd() void Print() const;
-
-private:
-
- Float_t fX; // x position
- Float_t fCosPhi; // cosPhi
- Float_t fP[5]; // 'active' track parameters: Y, Z, SinPhi, DzDs, Kappa
- Float_t fC[15]; // the covariance matrix for Y,Z,SinPhi,..
- Float_t fChi2; // the chi^2 value
- Int_t fNDF; // the Number of Degrees of Freedom
+ struct AliHLTTPCCATrackFitParam {
+ float fBethe, fE, fTheta2, fEP2, fSigmadE2, fK22, fK33, fK43, fK44;// parameters
+ };
+
+ GPUd() const AliHLTTPCCATrackParam2& GetParam() const { return fParam; }
+ GPUd() void SetParam(const AliHLTTPCCATrackParam2& v) { fParam = v; }
+ GPUd() void InitParam();
+
+ GPUd() float X() const { return fParam.X(); }
+ GPUd() float Y() const { return fParam.Y(); }
+ GPUd() float Z() const { return fParam.Z(); }
+ GPUd() float SinPhi() const { return fParam.SinPhi(); }
+ GPUd() float DzDs() const { return fParam.DzDs(); }
+ GPUd() float QPt() const { return fParam.QPt(); }
+ GPUd() float SignCosPhi() const { return fSignCosPhi; }
+ GPUd() float Chi2() const { return fChi2; }
+ GPUd() int NDF() const { return fNDF; }
+
+ GPUd() float Err2Y() const { return fC[0]; }
+ GPUd() float Err2Z() const { return fC[2]; }
+ GPUd() float Err2SinPhi() const { return fC[5]; }
+ GPUd() float Err2DzDs() const { return fC[9]; }
+ GPUd() float Err2QPt() const { return fC[14]; }
+
+ GPUd() float GetX() const { return fParam.GetX(); }
+ GPUd() float GetY() const { return fParam.GetY(); }
+ GPUd() float GetZ() const { return fParam.GetZ(); }
+ GPUd() float GetSinPhi() const { return fParam.GetSinPhi(); }
+ GPUd() float GetDzDs() const { return fParam.GetDzDs(); }
+ GPUd() float GetQPt() const { return fParam.GetQPt(); }
+ GPUd() float GetSignCosPhi() const { return fSignCosPhi; }
+ GPUd() float GetChi2() const { return fChi2; }
+ GPUd() int GetNDF() const { return fNDF; }
+
+ GPUd() float GetKappa( float Bz ) const { return fParam.GetKappa(Bz); }
+ GPUd() float GetCosPhi() const { return fSignCosPhi*CAMath::Sqrt( 1 - SinPhi()*SinPhi() ); }
+
+ GPUd() float GetErr2Y() const { return fC[0]; }
+ GPUd() float GetErr2Z() const { return fC[2]; }
+ GPUd() float GetErr2SinPhi() const { return fC[5]; }
+ GPUd() float GetErr2DzDs() const { return fC[9]; }
+ GPUd() float GetErr2QPt() const { return fC[14]; }
+
+ GPUhd() const float *Par() const { return fParam.Par(); }
+ GPUhd() const float *Cov() const { return fC; }
+
+ GPUd() const float *GetPar() const { return fParam.GetPar(); }
+ GPUd() float GetPar(int i) const { return(fParam.GetPar(i)); }
+ GPUd() const float *GetCov() const { return fC; }
+ GPUd() float GetCov(int i) const {return fC[i]; }
+
+ GPUhd() void SetPar( int i, float v ) { fParam.SetPar(i, v); }
+ GPUhd() void SetCov( int i, float v ) { fC[i] = v; }
+
+ GPUd() void SetX( float v ) { fParam.SetX(v); }
+ GPUd() void SetY( float v ) { fParam.SetY(v); }
+ GPUd() void SetZ( float v ) { fParam.SetZ(v); }
+ GPUd() void SetSinPhi( float v ) { fParam.SetSinPhi(v); }
+ GPUd() void SetDzDs( float v ) { fParam.SetDzDs(v); }
+ GPUd() void SetQPt( float v ) { fParam.SetQPt(v); }
+ GPUd() void SetSignCosPhi( float v ) { fSignCosPhi = v >= 0 ? 1 : -1; }
+ GPUd() void SetChi2( float v ) { fChi2 = v; }
+ GPUd() void SetNDF( int v ) { fNDF = v; }
+
+ GPUd() float GetDist2( const AliHLTTPCCATrackParam &t ) const;
+ GPUd() float GetDistXZ2( const AliHLTTPCCATrackParam &t ) const;
+
+ GPUd() float GetS( float x, float y, float Bz ) const;
+
+ GPUd() void GetDCAPoint( float x, float y, float z,
+ float &px, float &py, float &pz, float Bz ) const;
+
+ GPUd() bool TransportToX( float x, float Bz, float maxSinPhi = .999 );
+ GPUd() bool TransportToXWithMaterial( float x, float Bz, float maxSinPhi = .999 );
+
+ GPUd() bool TransportToX( float x, AliHLTTPCCATrackLinearisation &t0,
+ float Bz, float maxSinPhi = .999, float *DL = 0 );
+
+ GPUd() bool TransportToX( float x, float sinPhi0, float cosPhi0, float Bz, float maxSinPhi = .999 );
+
+
+ GPUd() bool TransportToXWithMaterial( float x, AliHLTTPCCATrackLinearisation &t0,
+ AliHLTTPCCATrackFitParam &par, float Bz, float maxSinPhi = .999 );
+
+ GPUd() bool TransportToXWithMaterial( float x,
+ AliHLTTPCCATrackFitParam &par, float Bz, float maxSinPhi = .999 );
+
+ GPUd() static float ApproximateBetheBloch( float beta2 );
+ GPUd() static float BetheBlochGeant( float bg,
+ float kp0 = 2.33,
+ float kp1 = 0.20,
+ float kp2 = 3.00,
+ float kp3 = 173e-9,
+ float kp4 = 0.49848
+ );
+ GPUd() static float BetheBlochSolid( float bg );
+ GPUd() static float BetheBlochGas( float bg );
+
+ GPUd() void CalculateFitParameters( AliHLTTPCCATrackFitParam &par, float mass = 0.13957 );
+ GPUd() bool CorrectForMeanMaterial( float xOverX0, float xTimesRho, const AliHLTTPCCATrackFitParam &par );
+
+ GPUd() bool Rotate( float alpha, float maxSinPhi = .999 );
+ GPUd() bool Rotate( float alpha, AliHLTTPCCATrackLinearisation &t0, float maxSinPhi = .999 );
+ GPUd() bool Filter( float y, float z, float err2Y, float err2Z, float maxSinPhi = .999 );
+
+ GPUd() bool CheckNumericalQuality() const;
+
+ GPUd() void Print() const;
+
+#ifndef HLTCA_GPUCODE
+ private:
+#endif //!HLTCA_GPUCODE
+ AliHLTTPCCATrackParam2 fParam; // Track Parameters
+
+ private:
+ //WARNING, Track Param Data is copied in the GPU Tracklet Constructor element by element instead of using copy constructor!!!
+ //This is neccessary for performance reasons!!!
+ //Changes to Elements of this class therefore must also be applied to TrackletConstructor!!!
+ float fC[15]; // the covariance matrix for Y,Z,SinPhi,..
+ float fSignCosPhi; // sign of cosPhi
+ float fChi2; // the chi^2 value
+ int fNDF; // the Number of Degrees of Freedom
};
-
-#endif
+GPUd() inline void AliHLTTPCCATrackParam::InitParam()
+{
+ //Initialize Tracklet Parameters using default values
+ SetSinPhi( 0 );
+ SetDzDs( 0 );
+ SetQPt( 0 );
+ SetSignCosPhi( 1 );
+ SetChi2( 0 );
+ SetNDF( -3 );
+ SetCov( 0, 1 );
+ SetCov( 1, 0 );
+ SetCov( 2, 1 );
+ SetCov( 3, 0 );
+ SetCov( 4, 0 );
+ SetCov( 5, 1 );
+ SetCov( 6, 0 );
+ SetCov( 7, 0 );
+ SetCov( 8, 0 );
+ SetCov( 9, 1 );
+ SetCov( 10, 0 );
+ SetCov( 11, 0 );
+ SetCov( 12, 0 );
+ SetCov( 13, 0 );
+ SetCov( 14, 10. );
+}
+
+#endif //ALIHLTTPCCATRACKPARAM_H