#ifndef ALIHELIX_H
#define ALIHELIX_H
#include <TObject.h>
#include <TMath.h>
class AliCluster;
class AliKalmanTrack;
class AliExternalTrackParam;
class AliHelix : public TObject {
public:
AliHelix();
AliHelix(const AliHelix &t);
AliHelix(const AliKalmanTrack &t);
AliHelix(const AliExternalTrackParam &t);
AliHelix(Double_t x[3], Double_t p[3], Double_t charge=1, Double_t conversion=0.);
virtual ~AliHelix(){};
inline void Evaluate(Double_t t, Double_t r[3]);
void Evaluate(Double_t t, Double_t r[3],
Double_t g[3],
Double_t gg[3]);
void GetMomentum(Double_t phase, Double_t p[4], Double_t conversion=0., Double_t *xr=0);
void GetAngle(Double_t t1, AliHelix &h, Double_t t2, Double_t angle[3]);
inline Double_t GetHelixR(Double_t phase=0);
inline Double_t GetHelixZ(Double_t phase=0);
Double_t GetPhase(Double_t x0, Double_t y0);
Double_t GetPhaseZ(Double_t z0);
Int_t GetPhase(Double_t r0, Double_t t[2]);
Int_t GetRPHIintersections(AliHelix &h, Double_t phase[2][2], Double_t ri[2], Double_t cut=3.);
Int_t GetClosestPhases(AliHelix &h, Double_t phase[2][2]);
Double_t GetPointAngle(AliHelix &h, Double_t phase[2],const Float_t *vertex);
Int_t LinearDCA(AliHelix &h, Double_t &t1, Double_t &t2,
Double_t &R, Double_t &dist);
Int_t ParabolicDCA(AliHelix&h,
Double_t &t1, Double_t &t2,
Double_t &R, Double_t &dist, Int_t iter=1);
Int_t ParabolicDCA2(AliHelix&h,
Double_t &t1, Double_t &t2,
Double_t &R, Double_t &dist, Double_t err[3], Int_t iter=1);
Double_t GetHelix(Int_t i) const{return fHelix[i];}
public:
Double_t fHelix[9];
private:
AliHelix &operator=(const AliHelix&helix);
ClassDef(AliHelix,1)
};
void AliHelix::Evaluate(Double_t t, Double_t r[3]){
Double_t phase=fHelix[4]*t+fHelix[2];
r[0] = fHelix[5] + TMath::Sin(phase)/fHelix[4];
r[1] = fHelix[0] - TMath::Cos(phase)/fHelix[4];
r[2] = fHelix[1] + fHelix[3]*t;
}
inline Double_t AliHelix::GetHelixR(Double_t phase)
{
Double_t x[3];
Evaluate(phase,x);
return TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
}
inline Double_t AliHelix::GetHelixZ(Double_t phase)
{
Double_t x[3];
Evaluate(phase,x);
return x[2];
}
#endif