#ifndef ALITRDTRACKERV1_H
#define ALITRDTRACKERV1_H
#include "AliTracker.h"
#include "AliTRDtrackingSector.h"
#include <TMatrixDfwd.h>
class TFile;
class TTreeSRedirector;
class TClonesArray;
class TLinearFitter;
class AliRieman;
class AliESDEvent;
class AliCluster;
class AliTrackPoint;
class AliTRDcluster;
class AliTRDseedV1;
class AliTRDtrackingChamber;
class AliTRDchamberTimeBin;
class AliTRDtrackerFitter;
class AliTRDtrackV1;
class AliTRDReconstructor;
class AliTRDrecoParam;
class AliTRDtrackerV1 : public AliTracker
{
public:
enum{
kOwner = BIT(14)
,kRemoveContainers = BIT(15)
};
enum ETRDtrackerV1const {
kMaxLayersPerSector = 1000
, kMaxTimeBinIndex = 216
, kTrackingSectors = 18
, kNTimeBins = 35
, kNPlanes = 6
, kNSeedPlanes = 4
, kMaxTracksStack = 100
, kNConfigs = 15
};
enum ETRDtrackerV1BetheBloch {
kGeant = 0
,kSolid
,kGas
};
AliTRDtrackerV1(const AliTRDReconstructor *rec = NULL);
virtual ~AliTRDtrackerV1();
AliTRDtrackingSector* GetTrackingSector(Int_t sec) {return &fTrSec[sec];}
Int_t Clusters2Tracks(AliESDEvent *esd);
static ETRDtrackerV1BetheBloch
GetBetheBloch() { return fgBB;}
AliCluster* GetCluster(Int_t index) const;
AliTRDseedV1* GetTracklet(Int_t index) const;
AliKalmanTrack* GetTrack(Int_t index) const;
TClonesArray* GetListOfClusters() const { return fClusters;}
TClonesArray* GetListOfTracklets() const { return fTracklets;}
TClonesArray* GetListOfTracks() const { return fTracks;}
static Int_t GetNTimeBins() { return fgNTimeBins;}
static void GetExtrapolationConfig(Int_t iconfig, Int_t planes[2]);
static void GetSeedingConfig(Int_t iconfig, Int_t planes[4]);
static TLinearFitter* GetTiltedRiemanFitter();
static TLinearFitter* GetTiltedRiemanFitterConstraint();
static AliRieman* GetRiemanFitter();
static void FitRieman(AliTRDcluster **clusters, Double_t chi2[2]);
static Float_t FitRieman(AliTRDseedV1 *tracklets, Double_t *chi2, Int_t *const planes = NULL);
static Float_t FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Double_t zVertex);
static Float_t FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigError);
static Double_t FitTiltedRiemanV1(AliTRDseedV1 *tracklets);
static Double_t FitRiemanTilt(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL);
static Double_t FitLine(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL);
static Double_t FitKalman(AliTRDtrackV1 *trk, AliTRDseedV1 * const tracklets = NULL, Bool_t up=0, Int_t np = 0, AliTrackPoint *points = NULL);
Bool_t IsClustersOwner() const { return TestBit(kOwner);}
Bool_t HasRemoveContainers() const { return TestBit(kRemoveContainers);}
static void SetBetheBloch(ETRDtrackerV1BetheBloch bb) {fgBB = bb;}
void SetClustersOwner(Bool_t own=kTRUE) {SetBit(kOwner, own); if(!own) fClusters = NULL;}
void SetRemoveContainers(Bool_t rm=kTRUE) {SetBit(kRemoveContainers, rm);}
Int_t FollowBackProlongation(AliTRDtrackV1 &t);
Int_t FollowProlongation(AliTRDtrackV1 &t);
Int_t LoadClusters(TTree *cTree);
Int_t LoadClusters(TClonesArray *const clusters);
Int_t PropagateBack(AliESDEvent *event);
static Int_t PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t maxStep);
Bool_t ReadClusters(TTree *in);
Int_t RefitInward(AliESDEvent *event);
static void SetNTimeBins(Int_t nTimeBins){fgNTimeBins = nTimeBins; }
void SetReconstructor(const AliTRDReconstructor *rec) {fkReconstructor = rec;}
void UnloadClusters();
class AliTRDLeastSquare{
public:
AliTRDLeastSquare();
~AliTRDLeastSquare(){};
void AddPoint(const Double_t * const x, Double_t y, Double_t sigmaY);
void RemovePoint(const Double_t * const x, Double_t y, Double_t sigmaY);
Bool_t Eval();
void Reset();
Double_t GetFunctionParameter(Int_t ParNumber) const {return fParams[ParNumber];}
Double_t GetFunctionValue(const Double_t * const xpos) const;
void GetCovarianceMatrix(Double_t *storage) const;
private:
AliTRDLeastSquare(const AliTRDLeastSquare &);
AliTRDLeastSquare& operator=(const AliTRDLeastSquare &);
Double_t fParams[2];
Double_t fCovarianceMatrix[3];
Double_t fSums[6];
};
class AliTRDtrackFitterRieman{
public:
AliTRDtrackFitterRieman();
~AliTRDtrackFitterRieman();
Double_t Eval();
void Reset();
Double_t GetYat(Double_t x) const;
Double_t GetDyDxAt(Double_t x) const;
Double_t GetZat(Double_t x) const;
Double_t GetDzDx() const { return fParameters[4]; };
Double_t GetCurvature() const;
void GetCovAt(Double_t x, Double_t *cov) const;
void SetRiemanFitter(TLinearFitter *const fitter) { fTrackFitter = fitter; }
void SetTracklet(Int_t il, AliTRDseedV1 * const tracklet);
void SetSysClusterError(Double_t err) { fSysClusterError = err; };
private:
AliTRDtrackFitterRieman(const AliTRDtrackFitterRieman &);
AliTRDtrackFitterRieman &operator=(const AliTRDtrackFitterRieman &);
void UpdateFitters(const AliTRDseedV1 * const tracklet);
Bool_t CheckAcceptable(Double_t offset, Double_t slope);
Double_t CalculateReferenceX();
TLinearFitter *fTrackFitter;
AliTRDLeastSquare *fZfitter;
AliTRDseedV1 *fTracklets[kNPlanes];
TMatrixD *fCovarPolY;
TMatrixD *fCovarPolZ;
Double_t fXref;
Double_t fSysClusterError;
Double_t fParameters[5];
Double_t fSumPolY[5];
Double_t fSumPolZ[3];
};
protected:
static Bool_t AdjustSector(AliTRDtrackV1 *const track);
Double_t BuildSeedingConfigs(AliTRDtrackingChamber **stack, Int_t *configs);
Int_t BuildTrackingContainers();
static Float_t CalculateChi2Z(const AliTRDseedV1 *tracklets, Double_t offset, Double_t slope, Double_t xref);
Int_t Clusters2TracksSM(Int_t sector, AliESDEvent *esd);
Int_t Clusters2TracksStack(AliTRDtrackingChamber **stack, TClonesArray * const esdTrackList);
AliTRDseedV1* GetTracklet(const AliTRDtrackV1 *const trk, Int_t plane, Int_t &idx);
Bool_t GetTrackPoint(Int_t index, AliTrackPoint &p) const;
Float_t GetR4Layer(Int_t ly) const { return fR[ly];}
Int_t MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * const sseed, const Int_t * const ipar);
AliTRDtrackV1* MakeTrack(AliTRDseedV1 * const tracklet);
AliTRDtrackV1* SetTrack(const AliTRDtrackV1 * const track);
AliTRDseedV1* SetTracklet(const AliTRDseedV1 * const tracklet);
void UnsetTrackletsTrack(const AliTRDtrackV1 * const track);
private:
AliTRDtrackerV1(const AliTRDtrackerV1 &tracker);
AliTRDtrackerV1 &operator=(const AliTRDtrackerV1 &tracker);
Double_t CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]);
Double_t CalculateTrackLikelihood(Double_t *chi2);
Bool_t ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDseedV1 *tracklet, Double_t &chi2);
static Float_t CalculateReferenceX(const AliTRDseedV1 *const tracklets);
void ResetSeedTB();
Float_t GetChi2Y(const AliTRDseedV1 *const tracklets) const;
Float_t GetChi2Z(const AliTRDseedV1 *const tracklets) const;
Float_t GetChi2Phi(const AliTRDseedV1 *const tracklets) const;
const AliTRDReconstructor *fkReconstructor;
const AliTRDrecoParam *fkRecoParam;
AliTRDgeometry *fGeom;
AliTRDtrackingSector fTrSec[kTrackingSectors];
TClonesArray *fClusters;
TClonesArray *fTracklets;
TClonesArray *fTracks;
TClonesArray *fTracksESD;
Float_t fR[kNPlanes];
static Double_t fgTopologicQA[kNConfigs];
Double_t fTrackQuality[kMaxTracksStack];
Int_t fSeedLayer[kMaxTracksStack];
AliTRDchamberTimeBin *fSeedTB[kNSeedPlanes];
Int_t fSieveSeeding;
Int_t fEventInFile;
static ETRDtrackerV1BetheBloch fgBB;
static const Double_t fgkX0[kNPlanes];
static Int_t fgNTimeBins;
static TLinearFitter *fgTiltedRieman;
static TLinearFitter *fgTiltedRiemanConstrained;
static AliRieman *fgRieman;
ClassDef(AliTRDtrackerV1, 7)
};
#endif