#ifndef ALITRACKPOINTARRAY_H
#define ALITRACKPOINTARRAY_H
#include <TObject.h>
#include <TMatrixDSym.h>
#include "Rtypes.h"
class TGeoRotation;
class AliTrackPoint : public TObject {
public:
AliTrackPoint();
AliTrackPoint(Float_t x, Float_t y, Float_t z, const Float_t *cov, UShort_t volid, Float_t charge = 0, Float_t drifttime = 0,Float_t chargeratio = 0, Int_t clutype = 0);
AliTrackPoint(const Float_t *xyz, const Float_t *cov, UShort_t volid, Float_t charge = 0, Float_t drifttime = 0,Float_t chargeratio = 0, Int_t clutype=0);
AliTrackPoint(const AliTrackPoint &p);
AliTrackPoint& operator= (const AliTrackPoint& p);
virtual ~AliTrackPoint() {}
void SetXYZ(Float_t x, Float_t y, Float_t z, const Float_t *cov = 0);
void SetXYZ(const Float_t *xyz, const Float_t *cov = 0);
void SetCov(const Float_t *cov);
void SetVolumeID(UShort_t volid) { fVolumeID = volid; }
void SetCharge(Float_t charge) { fCharge = charge; }
void SetDriftTime(Float_t time) { fDriftTime = time; }
void SetChargeRatio(Float_t ratio) { fChargeRatio= ratio; }
void SetClusterType(Int_t clutype) { fClusterType= clutype; }
void SetExtra(Bool_t flag=kTRUE) { fIsExtra = flag; }
Float_t GetX() const { return fX; }
Float_t GetY() const { return fY; }
Float_t GetZ() const { return fZ; }
void GetXYZ(Float_t *xyz, Float_t *cov = 0) const;
const Float_t *GetCov() const { return &fCov[0]; }
UShort_t GetVolumeID() const { return fVolumeID; }
Float_t GetCharge() const { return fCharge; }
Float_t GetDriftTime() const { return fDriftTime;}
Float_t GetChargeRatio() const { return fChargeRatio;}
Int_t GetClusterType() const { return fClusterType;}
Bool_t IsExtra() const { return fIsExtra;}
Float_t GetResidual(const AliTrackPoint &p, Bool_t weighted = kFALSE) const;
Bool_t GetPCA(const AliTrackPoint &p, AliTrackPoint &out) const;
Float_t GetAngle() const;
Bool_t GetRotMatrix(TGeoRotation& rot) const;
void SetAlignCovMatrix(const TMatrixDSym& alignparmtrx);
AliTrackPoint& Rotate(Float_t alpha) const;
AliTrackPoint& MasterToLocal() const;
void Print(Option_t *) const;
private:
Float_t fX;
Float_t fY;
Float_t fZ;
Float_t fCharge;
Float_t fDriftTime;
Float_t fChargeRatio;
Int_t fClusterType;
Float_t fCov[6];
Bool_t fIsExtra;
UShort_t fVolumeID;
ClassDef(AliTrackPoint,7)
};
class AliTrackPointArray : public TObject {
public:
AliTrackPointArray();
AliTrackPointArray(Int_t npoints);
AliTrackPointArray(const AliTrackPointArray &array);
AliTrackPointArray& operator= (const AliTrackPointArray& array);
virtual ~AliTrackPointArray();
Bool_t AddPoint(Int_t i, const AliTrackPoint *p);
Int_t GetNPoints() const { return fNPoints; }
Int_t GetCovSize() const { return fSize; }
Bool_t GetPoint(AliTrackPoint &p, Int_t i) const;
const Float_t* GetX() const { return &fX[0]; }
const Float_t* GetY() const { return &fY[0]; }
const Float_t* GetZ() const { return &fZ[0]; }
const Float_t* GetCharge() const { return &fCharge[0]; }
const Float_t* GetDriftTime() const { return &fDriftTime[0]; }
const Float_t* GetChargeRatio() const { return &fChargeRatio[0]; }
const Int_t* GetClusterType() const { return &fClusterType[0]; }
const Bool_t* GetExtra() const { return &fIsExtra[0]; }
const Float_t* GetCov() const { return &fCov[0]; }
const UShort_t* GetVolumeID() const { return &fVolumeID[0]; }
Bool_t HasVolumeID(UShort_t volid) const;
void Print(Option_t *) const;
void Sort(Bool_t down=kTRUE);
private:
Bool_t fSorted;
Int_t fNPoints;
Float_t *fX;
Float_t *fY;
Float_t *fZ;
Float_t *fCharge;
Float_t *fDriftTime;
Float_t *fChargeRatio;
Int_t *fClusterType;
Bool_t *fIsExtra;
Int_t fSize;
Float_t *fCov;
UShort_t *fVolumeID;
ClassDef(AliTrackPointArray,7)
};
#endif