#ifndef ALITRDTRACKONLINE_H
#define ALITRDTRACKONLINE_H
#include "TObject.h"
#include "TList.h"
#include "Math/IFunction.h"
#include "Math/Minimizer.h"
#include "AliTRDgeometry.h"
#include "AliTRDpadPlane.h"
class AliVTrdTracklet;
class AliTRDtrackPosition;
class AliTRDtrackOnline;
class AliTRDgeometry;
class AliTRDtrackParametrization : public TNamed
{
public:
AliTRDtrackParametrization(const char* name = "", const char* title = "");
~AliTRDtrackParametrization() {}
virtual void SetParams(ROOT::Math::Minimizer * minim) = 0;
virtual void GetParams(ROOT::Math::Minimizer * minim) = 0;
virtual void SetValues(const Double_t *par) = 0;
virtual Int_t GetNDim() const = 0;
virtual void UpdateTitle() {}
virtual AliTRDtrackPosition ExtrapolateToLayer(Int_t layer) = 0;
virtual AliTRDtrackPosition ExtrapolateToX(Float_t x) = 0;
Bool_t IsFitGood() const { return fFitGood; }
protected:
Bool_t fFitGood;
ClassDef(AliTRDtrackParametrization, 1);
};
class AliTRDtrackParametrizationStraightLine : public AliTRDtrackParametrization
{
public:
AliTRDtrackParametrizationStraightLine();
AliTRDtrackParametrizationStraightLine(Double_t offsetY, Double_t slopeY,
Double_t offsetZ, Double_t slopeZ);
virtual void SetParams(ROOT::Math::Minimizer * minim);
virtual void GetParams(ROOT::Math::Minimizer * minim);
virtual void SetValues(const Double_t *par);
virtual Int_t GetNDim() const { return 4; }
AliTRDtrackPosition ExtrapolateToLayer(Int_t layer);
AliTRDtrackPosition ExtrapolateToX(Float_t x);
Double_t GetOffsetY() const { return fOffsetY; }
Double_t GetOffsetZ() const { return fOffsetZ; }
Double_t GetSlopeY() const { return fSlopeY; }
Double_t GetSlopeZ() const { return fSlopeZ; }
void Print(Option_t *option = "") const;
protected:
Double_t fOffsetY;
Double_t fSlopeY;
Double_t fOffsetZ;
Double_t fSlopeZ;
ClassDef(AliTRDtrackParametrizationStraightLine, 1);
};
class AliTRDtrackParametrizationCurved : public AliTRDtrackParametrization
{
public:
AliTRDtrackParametrizationCurved();
virtual void SetParams(ROOT::Math::Minimizer * minim);
virtual void GetParams(ROOT::Math::Minimizer * minim);
virtual void SetValues(const Double_t *par);
virtual Int_t GetNDim() const { return 4; }
AliTRDtrackPosition ExtrapolateToLayer(Int_t layer);
AliTRDtrackPosition ExtrapolateToX(Float_t x);
Float_t GetY(Float_t x);
void Print(Option_t *option = "") const;
protected:
Double_t fRadiusInv;
Double_t fOffsetY;
Double_t fOffsetZ;
Double_t fSlopeZ;
Double_t fOffsetX;
ClassDef(AliTRDtrackParametrizationCurved, 1);
};
class AliTRDtrackOnline : public TObject
{
public:
AliTRDtrackOnline();
~AliTRDtrackOnline();
void AddTracklet(AliVTrdTracklet *trkl);
Bool_t Fit(ROOT::Math::Minimizer *minim);
Int_t GetNTracklets() const { return fNTracklets; }
AliVTrdTracklet* GetTracklet(Int_t i) const { return i < fNTracklets ? (AliVTrdTracklet*) fTracklets[i] : 0x0; }
AliTRDtrackPosition ExtrapolateToLayer(Int_t layer);
void AddParametrization(AliTRDtrackParametrization *param) { fTrackParametrizations.Add(param); }
const TList& GetParametrizations() const { return fTrackParametrizations; }
void Print(Option_t *option = "") const;
void SetErrorY(Float_t error) { fErrorY = error; }
Float_t GetErrorY() const { return fErrorY; }
static Float_t GetX(AliVTrdTracklet *trkl) { return fgGeometry->GetTime0(trkl->GetDetector() % 6); }
static Float_t GetZ(AliVTrdTracklet *trkl) { return
fgGeometry->GetPadPlane(trkl->GetDetector())->GetRowPos(trkl->GetBinZ()) -
.5 * fgGeometry->GetPadPlane(trkl->GetDetector())->GetRowSize(trkl->GetBinZ()); }
static AliTRDgeometry *fgGeometry;
protected:
static const Int_t fgkMaxTracklets = 10;
Int_t fNTracklets;
TObjArray fTracklets;
TList fTrackParametrizations;
Float_t fErrorY;
ClassDef(AliTRDtrackOnline, 1);
};
class AliTRDtrackPosition : public TObject
{
public:
AliTRDtrackPosition(Float_t y, Float_t z, Float_t dy = 0.);
~AliTRDtrackPosition();
Float_t GetY() const { return fY; }
Float_t GetZ() const { return fZ; }
Float_t GetdY() const { return fDy; }
Float_t Distance(AliVTrdTracklet *trkl) const;
protected:
Float_t fY;
Float_t fZ;
Float_t fDy;
ClassDef(AliTRDtrackPosition, 1);
};
class AliTRDtrackResiduals : public ROOT::Math::IBaseFunctionMultiDim
{
public:
AliTRDtrackResiduals(const AliTRDtrackOnline *track, AliTRDtrackParametrization *param);
AliTRDtrackResiduals(const AliTRDtrackResiduals &rhs);
AliTRDtrackResiduals& operator=(const AliTRDtrackResiduals &rhs);
~AliTRDtrackResiduals() {}
AliTRDtrackResiduals* Clone() const;
UInt_t NDim() const { return fParam->GetNDim(); }
Double_t DoEval(const Double_t *par) const;
protected:
const AliTRDtrackOnline *fTrack;
AliTRDtrackParametrization *fParam;
static AliTRDgeometry *fgGeometry;
};
#endif