#ifndef ALITOFTRACKER_H
#define ALITOFTRACKER_H
#include "AliTracker.h"
#include "TObject.h"
#include "AliESDTOFCluster.h"
#include "AliESDTOFHit.h"
class TClonesArray;
class TObjArray;
class TH1F;
class TH2F;
class AliESDEvent;
class AliESDpid;
class AliTOFcluster;
class AliTOFRecoParam;
class AliTOFGeometry;
class AliTOFtrackPoint : public TObject {
public:
AliTOFtrackPoint() :
fIndex(0),fDistance(0),fDistanceZ(0),
fDistanceY(0),fDistanceX(0),fPropRadius(0),fLength(0) { };
AliTOFtrackPoint(Int_t index,Float_t dist,Float_t distZ,
Float_t distY,Float_t distX,Float_t radius,Float_t length) :
TObject(),
fIndex(index),fDistance(dist),fDistanceZ(distZ),
fDistanceY(distY),fDistanceX(distX),fPropRadius(radius),fLength(length) { };
AliTOFtrackPoint(const AliTOFtrackPoint & source) :
TObject(source),
fIndex(source.fIndex),
fDistance(source.fDistance),
fDistanceZ(source.fDistanceZ),
fDistanceY(source.fDistanceY),
fDistanceX(source.fDistanceX),
fPropRadius(source.fPropRadius),
fLength(source.fLength) { };
AliTOFtrackPoint & operator=(const AliTOFtrackPoint & source)
{ if (this == &source) return *this;
TObject::operator=(source);
fDistance=source.fDistance;fDistanceZ=source.fDistanceZ;fDistanceY=source.fDistanceY;fDistanceX=source.fDistanceX;
fPropRadius=source.fPropRadius;fLength=source.fLength;
return *this; };
Int_t Index() const {return fIndex;}
Float_t Distance() const {return fDistance;}
Float_t DistanceZ() const {return fDistanceZ;}
Float_t DistanceY() const {return fDistanceY;}
Float_t DistanceX() const {return fDistanceX;}
Float_t PropRadius() const {return fPropRadius;}
Float_t Length() const {return fLength;}
private:
Int_t fIndex;
Float_t fDistance;
Float_t fDistanceZ;
Float_t fDistanceY;
Float_t fDistanceX;
Float_t fPropRadius;
Float_t fLength;
};
class AliTOFtracker : public AliTracker {
public:
AliTOFtracker();
virtual ~AliTOFtracker();
virtual void GetPidSettings(AliESDpid *esdPID);
virtual Int_t Clusters2Tracks(AliESDEvent* ) {return -1;};
virtual Int_t PropagateBack(AliESDEvent * const event);
virtual Int_t RefitInward(AliESDEvent* ) {return -1;};
virtual Int_t LoadClusters(TTree * cTree);
virtual void UnloadClusters();
virtual AliCluster *GetCluster(Int_t index) const
{if (index==-1 || index >= fN) return NULL;
return (AliCluster *) fClusters[index];};
Bool_t GetTrackPoint(Int_t index, AliTrackPoint& p) const;
Int_t GetNumberOfMatchedTOFtracks() const {return fnmatch;}
void InitCheckHists();
void SaveCheckHists();
void FillClusterArray(TObjArray* arr) const;
protected:
AliESDTOFCluster* GetESDTOFCluster(int clID);
private:
enum {kMaxCluster=77777};
AliTOFtracker(const AliTOFtracker &t);
AliTOFtracker& operator=(const AliTOFtracker &source);
Int_t FindClusterIndex(Double_t z) const;
void MatchTracks(Int_t mLastStep);
void CollectESD();
Float_t CorrectTimeWalk(Float_t dist,Float_t tof) const;
const AliTOFRecoParam* fkRecoParam;
AliTOFGeometry* fGeom;
AliTOFcluster *fClusters[kMaxCluster];
Int_t fN;
Int_t fNseeds;
Int_t fNseedsTOF;
Int_t fngoodmatch;
Int_t fnbadmatch;
Int_t fnunmatch;
Int_t fnmatch;
AliESDEvent* fESDEv;
TClonesArray* fTracks;
TObjArray* fSeeds;
TObjArray* fTOFtrackPoints;
TH2F * fHDigClusMap;
TH1F * fHDigNClus;
TH1F * fHDigClusTime;
TH1F * fHDigClusToT;
TH1F * fHRecNClus;
TH1F * fHRecDist;
TH2F * fHRecSigYVsP;
TH2F * fHRecSigZVsP;
TH2F * fHRecSigYVsPWin;
TH2F * fHRecSigZVsPWin;
TTree * fCalTree;
Int_t fIch;
Float_t fToT;
Float_t fTime;
Float_t fExpTimePi;
Float_t fExpTimeKa;
Float_t fExpTimePr;
Int_t fNTOFmatched;
ClassDef(AliTOFtracker, 9)
};
#endif