#ifndef ALIITSVERTEXER3D_H
#define ALIITSVERTEXER3D_H
#include<AliITSVertexer.h>
#include <TClonesArray.h>
#include <TRandom3.h>
#include <AliESDVertex.h>
#include <TH3F.h>
#include <TBits.h>
class AliITSVertexer3D : public AliITSVertexer {
public:
AliITSVertexer3D(Double_t zcut=0.);
AliITSVertexer3D(TRootIOCtor* );
virtual ~AliITSVertexer3D();
virtual AliESDVertex* FindVertexForCurrentEvent(TTree *itsClusterTree);
void FindVertex3DIterative();
void FindVertex3DIterativeMM();
void FindVertex3D(TTree *itsClusterTree);
AliESDVertex GetVertex3D() const {return fVert3D;}
virtual void PrintStatus() const;
static Bool_t DistBetweenVertices(AliESDVertex &a, AliESDVertex &b, Double_t test, Double_t &dist);
void SetWideFiducialRegion(Double_t dz = 40.0, Double_t dr=2.5){
SetCoarseMaxRCut(dr);
SetZCutDiamond(dz);
}
void SetNarrowFiducialRegion(Double_t dz = 0.5, Double_t dr=0.5){
SetMaxRCut(dr);
SetMaxZCut(dz);
}
void SetDeltaPhiCuts(Double_t dphiloose=0.5, Double_t dphitight=0.025){
SetCoarseDiffPhiCut(dphiloose);
SetDiffPhiMax(dphitight);
}
void SetCoarseDiffPhiCut(Double_t dphi = 0.5){fCoarseDiffPhiCut=dphi;}
void SetFineDiffPhiCut(Double_t dphi = 0.05){fFineDiffPhiCut=dphi;}
void SetCutOnPairs(Double_t cp = 0.15){fCutOnPairs = cp;}
void SetCoarseMaxRCut(Double_t rad = 2.5){fCoarseMaxRCut=rad;}
void SetMaxRCut(Double_t rad = 0.5){fMaxRCut=rad;}
void SetMaxRCutAlgo2(Double_t rad = 0.2){fMaxRCut2=rad;}
void SetZCutDiamond(Double_t zcut = 40.0);
void SetMaxZCut(Double_t dz = 0.5){fMaxZCut=dz;}
void SetDCACut(Double_t dca=0.1){fDCAcut=dca;}
void SetDiffPhiMax(Double_t pm = 0.025){fDiffPhiMax = pm;}
void SetMeanPSelTracks(Double_t pGeV=0.875){fMeanPSelTrk = pGeV;}
void SetMeanPtSelTracks(Double_t ptGeV=0.630){fMeanPtSelTrk = ptGeV;}
void SetMeanPPtSelTracks(Double_t fieldTesla);
void SetMinDCAforPileup(Double_t mindist=0.1) {fDCAforPileup=mindist;}
void SetDeltaPhiforPileup(Double_t dphi=0.01) {fDiffPhiforPileup=dphi;}
void SetPileupAlgo(UShort_t optalgo=1){fPileupAlgo=optalgo;}
void SetBinSizeR(Double_t siz=0.1){fBinSizeR=siz;}
void SetBinSizeZ(Double_t siz=0.8){fBinSizeZ=siz;}
void SetHighMultAlgo(UChar_t n){
if(n<2) fHighMultAlgo=n;
else AliError("Only algos 0 and 1 implemented");
}
void SetHighMultDownscalingAlgo(){fHighMultAlgo=0;}
void SetHighMultTracesAlgo(){fHighMultAlgo=1;}
void SetMaxNumOfClustersForHighMult(Int_t ncl){fMaxNumOfCl=ncl;}
void SetMaxNumOfClustersForDownScale(Int_t ncl){fMaxNumOfClForDownScale=ncl;}
void SetMaxNumOfClustersForRebin(Int_t ncl){fMaxNumOfClForRebin=ncl;}
Int_t GetMaxNumOfClustersForHighMult() const {return fMaxNumOfCl;}
Int_t GetMaxNumOfClustersForDownScale() const {return fMaxNumOfClForDownScale;}
Int_t GetMaxNumOfClustersForRebin() const {return fMaxNumOfClForRebin;}
void SetFallBack(UInt_t th){ fFallBack = kTRUE; fFallBackThreshold = th;}
UInt_t GetFallBackThreshold() const {return fFallBackThreshold; }
protected:
AliITSVertexer3D(const AliITSVertexer3D& vtxr);
AliITSVertexer3D& operator=(const AliITSVertexer3D& );
Int_t FindTracklets(TTree *itsClusterTree, Int_t optCuts);
Int_t Prepare3DVertex(Int_t optCuts);
Int_t Prepare3DVertexPbPb();
void ResetVert3D();
void FindPeaks(TH3F* histo, Double_t *peak, Int_t &nOfTracklets, Int_t &nOfTimes);
void PileupFromZ();
void MarkUsedClusters();
Int_t RemoveTracklets();
void FindOther3DVertices(TTree *itsClusterTree);
Double_t GetFraction(Int_t itr) const;
enum {kMaxCluPerMod=250};
enum {kMaxPileupVertices=10};
TClonesArray fLines;
AliESDVertex fVert3D;
Double_t fCoarseDiffPhiCut;
Double_t fFineDiffPhiCut;
Double_t fCutOnPairs;
Double_t fCoarseMaxRCut;
Double_t fMaxRCut;
Double_t fMaxRCut2;
Double_t fZCutDiamond;
Double_t fMaxZCut;
Double_t fDCAcut;
Double_t fDiffPhiMax;
Double_t fMeanPSelTrk;
Double_t fMeanPtSelTrk;
TBits fUsedCluster;
TH1F *fZHisto;
Double_t fDCAforPileup;
Double_t fDiffPhiforPileup;
Double_t fBinSizeR;
Double_t fBinSizeZ;
UShort_t fPileupAlgo;
Int_t fMaxNumOfCl;
Int_t fMaxNumOfClForRebin;
Int_t fMaxNumOfClForDownScale;
Int_t fNRecPLay1;
Int_t fNRecPLay2;
Float_t f3DBinSize;
Bool_t fDoDownScale;
TRandom3 *fGenerForDownScale;
Double_t f3DPeak[3];
UChar_t fHighMultAlgo;
Bool_t fSwitchAlgorithm;
Bool_t fFallBack;
UInt_t fFallBackThreshold;
TH3F* fH3d;
TH3F* fH3dcs;
TH3F* fH3dfs;
TH3F* fH3dv;
static const Int_t fgkMaxNumOfClDefault;
static const Int_t fgkMaxNumOfClRebinDefault;
static const Int_t fgkMaxNumOfClDownscaleDefault;
static const Float_t fgk3DBinSizeDefault;
ClassDef(AliITSVertexer3D,16);
};
#endif