#ifndef ALIMUONTRACKPARAM_H
#define ALIMUONTRACKPARAM_H
#include <TObject.h>
#include <TMatrixD.h>
class AliMUONVCluster;
class AliMUONTrackParam : public TObject
{
public:
AliMUONTrackParam();
virtual ~AliMUONTrackParam();
AliMUONTrackParam(const AliMUONTrackParam& theMUONTrackParam);
AliMUONTrackParam& operator=(const AliMUONTrackParam& theMUONTrackParam);
Double_t GetZ() const {return fZ;}
void SetZ(Double_t z) {fZ = z;}
Double_t GetNonBendingCoor() const {return fParameters(0,0);}
void SetNonBendingCoor(Double_t nonBendingCoor) {fParameters(0,0) = nonBendingCoor;}
Double_t GetNonBendingSlope() const {return fParameters(1,0);}
void SetNonBendingSlope(Double_t nonBendingSlope) {fParameters(1,0) = nonBendingSlope;}
Double_t GetBendingCoor() const {return fParameters(2,0);}
void SetBendingCoor(Double_t bendingCoor) {fParameters(2,0) = bendingCoor;}
Double_t GetBendingSlope() const {return fParameters(3,0);}
void SetBendingSlope(Double_t bendingSlope) {fParameters(3,0) = bendingSlope;}
Double_t GetInverseBendingMomentum() const {return fParameters(4,0);}
void SetInverseBendingMomentum(Double_t inverseBendingMomentum) {fParameters(4,0) = inverseBendingMomentum;}
Double_t GetCharge() const {return TMath::Sign(1.,fParameters(4,0));}
void SetCharge(Double_t charge) {if (charge*fParameters(4,0) < 0.) fParameters(4,0) *= -1.;}
const TMatrixD& GetParameters() const {return fParameters;}
void SetParameters(const TMatrixD& parameters) {fParameters = parameters;}
void AddParameters(const TMatrixD& parameters) {fParameters += parameters;}
Double_t Px() const;
Double_t Py() const;
Double_t Pz() const;
Double_t P() const;
Bool_t CovariancesExist() const {return (fCovariances) ? kTRUE : kFALSE;}
const TMatrixD& GetCovariances() const;
void SetCovariances(const TMatrixD& covariances);
void SetCovariances(const Double_t matrix[5][5]);
void SetVariances(const Double_t matrix[5][5]);
void DeleteCovariances();
const TMatrixD& GetPropagator() const;
void ResetPropagator();
void UpdatePropagator(const TMatrixD& propagator);
const TMatrixD& GetExtrapParameters() const;
void SetExtrapParameters(const TMatrixD& parameters);
const TMatrixD& GetExtrapCovariances() const;
void SetExtrapCovariances(const TMatrixD& covariances);
const TMatrixD& GetSmoothParameters() const;
void SetSmoothParameters(const TMatrixD& parameters);
const TMatrixD& GetSmoothCovariances() const;
void SetSmoothCovariances(const TMatrixD& covariances);
AliMUONVCluster* GetClusterPtr() const {return fClusterPtr;}
void SetClusterPtr(AliMUONVCluster* cluster, Bool_t owner = kFALSE);
Bool_t IsRemovable() const {return fRemovable;}
void SetRemovable(Bool_t removable) {fRemovable = removable;}
Double_t GetTrackChi2() const {return fTrackChi2;}
void SetTrackChi2(Double_t chi2) {fTrackChi2 = chi2;}
Double_t GetLocalChi2() const {return fLocalChi2;}
void SetLocalChi2(Double_t chi2) {fLocalChi2 = chi2;}
Bool_t IsSortable () const {return kTRUE;}
Int_t Compare(const TObject* trackParam) const;
Bool_t CompatibleTrackParam(const AliMUONTrackParam &trackParam, Double_t sigma2Cut, Double_t &normChi2) const;
virtual void Print(Option_t* opt="") const;
virtual void Clear(Option_t* opt="");
private:
Double_t fZ;
TMatrixD fParameters;
mutable TMatrixD *fCovariances;
mutable TMatrixD *fPropagator;
mutable TMatrixD *fExtrapParameters;
mutable TMatrixD *fExtrapCovariances;
mutable TMatrixD *fSmoothParameters;
mutable TMatrixD *fSmoothCovariances;
AliMUONVCluster *fClusterPtr;
Bool_t fOwnCluster;
Bool_t fRemovable;
Double_t fTrackChi2;
Double_t fLocalChi2;
ClassDef(AliMUONTrackParam, 4)
};
#endif