#ifndef ALIITSTRACKERU_H
#define ALIITSTRACKERU_H
#include "AliTracker.h"
#include "AliESDEvent.h"
#include "AliITSUSeed.h"
#include "AliITSUTrackCond.h"
#include "AliITSUTrackHyp.h"
#include "AliITSUAux.h"
#include "AliITSUMatLUT.h"
#include <TArrayI.h>
class AliITSUReconstructor;
class AliITSURecoDet;
class AliITSUClusterPix;
class AliESDtrack;
class AliITSURecoLayer;
class TTree;
class AliITSUTrackerGlo : public AliTracker {
public:
enum {kClus2Tracks,kPropBack,kRefitInw,kNTrackingPhases};
enum {
kTrXIn ,kTrYIn ,kTrZIn ,kTrPhiIn ,
kTrXOut,kTrYOut,kTrZOut,kTrPhiOut,
kTrPhi0, kTrDPhi, kTrZ0, kTrDZ,
kNTrImpData};
enum {kMissingCluster=0
,kTransportFailed=1
,kRWCheckFailed =2
};
enum {kStopSearchOnSensor,kClusterNotMatching,kClusterMatching};
enum {kDummyLabel=-3141593};
AliITSUTrackerGlo(AliITSUReconstructor* rec);
virtual ~AliITSUTrackerGlo();
virtual Int_t Clusters2Tracks(AliESDEvent *event);
virtual Int_t PropagateBack(AliESDEvent *event);
virtual Int_t RefitInward(AliESDEvent *event);
virtual Int_t LoadClusters(TTree * treeRP=0);
virtual void UnloadClusters();
virtual AliCluster* GetCluster(Int_t index) const;
void PrintSeedClusters(const AliITSUSeed* seed, Option_t* option="");
Int_t GetCountPronlongationTrials() const {return fCountProlongationTrials;}
Int_t GetCountITSin() const {return fCountITSin;}
Int_t GetCountITSout() const {return fCountITSout;}
Int_t GetCountITSrefit() const {return fCountITSrefit;}
AliITSURecoDet* GetITSInterface() const {return fITS;}
Bool_t NeedToProlong(AliESDtrack* estTr, Int_t esdID);
void Init(AliITSUReconstructor* rec);
void FindTrack(AliESDtrack* esdTr, Int_t esdID);
void CreateDefaultTrackCond();
AliITSUTrackHyp* InitHypothesis(AliESDtrack *esdTr, Int_t esdID);
Bool_t TransportToLayer(AliITSUSeed* seed, Int_t lFrom, Int_t lTo, Double_t rLim=-1);
Bool_t TransportToLayer(AliExternalTrackParam* seed, Int_t lFrom, Int_t lTo, Double_t rLim=-1);
Bool_t TransportToLayerX(AliExternalTrackParam* seed, Int_t lFrom, Int_t lTo, Double_t xStop);
Bool_t GoToExitFromLayer(AliITSUSeed* seed, AliITSURecoLayer* lr, Int_t dir, Bool_t check=kTRUE);
Bool_t GoToExitFromLayer(AliExternalTrackParam* seed, AliITSURecoLayer* lr, Int_t dir, Bool_t check=kTRUE);
Bool_t GoToEntranceToLayer(AliITSUSeed* seed, AliITSURecoLayer* lr, Int_t dir, Bool_t check=kFALSE);
Bool_t GoToEntranceToLayer(AliExternalTrackParam* seed, AliITSURecoLayer* lr, Int_t dir, Bool_t check=kFALSE);
Bool_t PropagateSeed(AliITSUSeed *seed, Double_t xToGo, Double_t mass, Double_t maxStep=1.0, Bool_t matCorr=kTRUE);
Bool_t PropagateSeed(AliExternalTrackParam *seed, Double_t xToGo, Double_t mass, Double_t maxStep=1.0, Bool_t matCorr=kTRUE);
Double_t RefitTrack(AliITSUTrackHyp* trc, Double_t r, Int_t& nclFit, Int_t stopCond=0);
Double_t GetMaterialBudget(const double* pnt0, const double* pnt1, double& x2x0, double& rhol) const;
Int_t GetTrackingPhase() const {return fTrackPhaseID;}
void KillSeed(AliITSUSeed* seed, Bool_t branch=kFALSE);
Bool_t NeedToKill(AliITSUSeed* seed, Int_t flag);
Bool_t GetRoadWidth(AliITSUSeed* seed, int ilrA);
Bool_t CheckBackwardMatching(AliITSUSeed* seed);
Int_t CheckCluster(AliITSUSeed* seed, Int_t lr, Int_t clID);
void AddProlongationHypothesis(AliITSUSeed* seed, Int_t lr);
Bool_t AddSeedBranch(AliITSUSeed* seed);
void ValidateAllowedBranches(Int_t accMax);
void ValidateAllowedCandidates(Int_t ilr, Int_t accMax);
void FlagSeedClusters(const AliITSUSeed* seed, Bool_t flg, UShort_t hypRef);
AliITSUSeed* NewSeedFromPool(const AliITSUSeed* src=0);
void ResetSeedsPool();
void MarkSeedFree(AliITSUSeed* seed );
AliITSUTrackHyp* GetTrackHyp(Int_t id) const {return (AliITSUTrackHyp*)fHypStore.UncheckedAt(id);}
void SetTrackHyp(AliITSUTrackHyp* hyp,Int_t id) {fHypStore.AddAtAndExpand(hyp,id);}
void DeleteLastSeedFromPool() {fSeedsPool.RemoveLast();}
void CheckClusterSharingConflicts(AliITSUTrackHyp* hyp);
void SaveReducedHypothesesTree(AliITSUTrackHyp* dest);
void CleanHypothesis(AliITSUTrackHyp* hyp);
void FinalizeHypotheses();
Bool_t FinalizeHypothesis(AliITSUTrackHyp* hyp);
void UpdateESDTrack(AliITSUTrackHyp* hyp,Int_t flag);
void CookMCLabel(AliITSUTrackHyp* hyp);
void SetTrackingPhase(Int_t p) {fTrackPhaseID = p;}
void FlagSplitClusters();
Bool_t ContainsSplitCluster(const AliITSUSeed* seed, Int_t maxSize=99999);
void CheckClusterUsage();
protected:
TObject*& NextFreeSeed();
private:
AliITSUTrackerGlo(const AliITSUTrackerGlo&);
AliITSUTrackerGlo &operator=(const AliITSUTrackerGlo &tr);
protected:
AliITSUReconstructor* fReconstructor;
AliITSURecoDet* fITS;
AliITSUMatLUT* fMatLUT;
AliESDtrack* fCurrESDtrack;
Int_t fCurrESDtrMClb;
Double_t fCurrMass;
Double_t fTrImpData[kNTrImpData];
Int_t fCountProlongationTrials;
Int_t fCountITSin;
Int_t fCountITSout;
Int_t fCountITSrefit;
Int_t fNTracksESD;
TObjArray fHypStore;
Int_t fLayerMaxCandidates;
AliITSUSeed** fLayerCandidates;
Int_t fNBranchesAdded;
Int_t fNCandidatesAdded;
AliITSUTrackHyp* fCurrHyp;
AliITSUTrackHyp* fWorkHyp;
TClonesArray fSeedsPool;
TArrayI fFreeSeedsID;
TArrayI fESDIndex;
Int_t fNFreeSeeds;
Int_t fLastSeedID;
Int_t fNLrActive;
TObjArray fDefTrackConds;
AliITSUTrackCond* fCurrTrackCond;
Int_t fCurrActLrID;
AliITSURecoLayer* fCurrLayer;
Int_t fTrackPhaseID;
Int_t fCurrPassID;
Bool_t fUseMatLUT;
static const Double_t fgkToler;
#ifdef _ITSU_TUNING_MODE_
Int_t GetHistoID(Int_t lr, Int_t hid, Int_t pass=0, Int_t phase=0);
TObjArray* BookControlHistos(const char* pref);
TObjArray* fCHistoArrCorr;
TObjArray* fCHistoArrFake;
enum {kHResY,kHResYP,kHResZ,kHResZP,kHChi2Cl,kHChi2Nrm,kHBestInBranch,kHBestInCand,kMaxHID=10};
enum {kHChiMatch,kHChiITSSA};
enum {kHistosPhase=kMaxHID*(AliITSUAux::kMaxLayers+1),kHistosPass=kNTrackingPhases*kHistosPhase};
#endif
ClassDef(AliITSUTrackerGlo,1)
};
inline TObject *&AliITSUTrackerGlo::NextFreeSeed()
{
fLastSeedID = fNFreeSeeds ? fFreeSeedsID.GetArray()[--fNFreeSeeds] : fSeedsPool.GetEntriesFast();
return fSeedsPool[ fLastSeedID ];
}
inline AliITSUSeed* AliITSUTrackerGlo::NewSeedFromPool(const AliITSUSeed* src)
{
AliITSUSeed* sd = src ? new( NextFreeSeed() ) AliITSUSeed(*src) : new( NextFreeSeed() ) AliITSUSeed();
sd->SetPoolID(fLastSeedID);
return sd;
}
inline void AliITSUTrackerGlo::KillSeed(AliITSUSeed* seed, Bool_t branch)
{
seed->Kill();
seed = (AliITSUSeed*)seed->GetParent();
if (seed && !seed->DecChildren() && branch) KillSeed(seed,branch);
}
inline void AliITSUTrackerGlo::AddProlongationHypothesis(AliITSUSeed* seed, Int_t lr)
{
#ifdef _ITSU_TUNING_MODE_
seed->SetOrdCand(fCurrHyp->GetNSeeds(lr));
#endif
fCurrHyp->AddSeed(seed,lr);
}
inline Double_t AliITSUTrackerGlo::GetMaterialBudget(const double* pnt0,const double* pnt1, double& x2x0, double& rhol) const
{
double par[7];
if (fUseMatLUT && fMatLUT) {
double d = fMatLUT->GetMatBudget(pnt0,pnt1,par);
x2x0 = par[AliITSUMatLUT::kParX2X0];
rhol = par[AliITSUMatLUT::kParRhoL];
return d;
}
else {
MeanMaterialBudget(pnt0,pnt1,par);
x2x0 = par[1];
rhol = par[0]*par[4];
return par[4];
}
}
#endif