#ifndef ALIMATERIALBUDGET_H
#define ALIMATERIALBUDGET_H
#include <TList.h>
#include <TH1.h>
#include <TH2.h>
#include <AliAnalysisTask.h>
#include <AliESDEvent.h>
#include <AliESDfriend.h>
#include <AliESDtrack.h>
#include <AliESDfriendTrack.h>
#include <AliTPCseed.h>
#include <TString.h>
class AliGenInfoMaker;
class TTreeSRedirector;
class AliMCEventHadnler;
class TParticle;
class AliMCInfo;
class AliMCParticle;
class AliESDRecInfo;
class AliESDEvent;
class AliMCEvent;
class AliComparisonObject;
class AliMaterialBudget : public AliAnalysisTask {
public:
AliMaterialBudget();
AliMaterialBudget(const char *name);
virtual ~AliMaterialBudget();
virtual void ConnectInputData(Option_t *);
virtual void CreateOutputObjects();
virtual void Exec(Option_t *option);
virtual void Terminate(Option_t *);
virtual void FinishTaskOutput();
void SetDebugOuputhPath(const char * name){fDebugOutputPath=name;}
void FindPairs(AliESDEvent * event);
Bool_t IsPair(AliExternalTrackParam *tr0, AliExternalTrackParam *tr1);
void ProcessMCInfo();
void ProcessRefTracker(AliTrackReference* refIn, AliTrackReference* refOut, TParticle*part, Int_t type);
void FitTrackRefs(TParticle * part, TClonesArray * trefs);
TTreeSRedirector *GetDebugStreamer();
void SetStreamLevel(Int_t streamLevel){fStreamLevel=streamLevel;}
void SetDebugLevel(Int_t level) {fDebugLevel = level;}
Int_t GetStreamLevel() const {return fStreamLevel;}
Int_t GetDebugLevel() const {return fDebugLevel;}
static Bool_t PropagateCosmicToDCA(AliExternalTrackParam *param0, AliExternalTrackParam *param1, Double_t mass);
static AliExternalTrackParam * MakeTrack(const AliTrackReference* ref, TParticle*part);
static Bool_t PropagateToPoint(AliExternalTrackParam *param, Double_t *xyz, Double_t mass, Float_t step);
AliTrackReference * GetFirstTPCTrackRef(AliMCParticle *mcParticle);
AliTrackReference * GetAllTOFinfo(AliMCParticle *mcParticle, Int_t & nTrackRef, Int_t &nTrackRefITS, Int_t retValue =0);
protected:
void RegisterDebugOutput();
AliMaterialBudget(const AliMaterialBudget& );
AliMaterialBudget& operator=(const AliMaterialBudget& ) { return *this;}
AliMCEvent * fMCinfo;
AliESDEvent * fESD;
TTreeSRedirector *fDebugStreamer;
Int_t fStreamLevel;
Int_t fDebugLevel;
TString fDebugOutputPath;
TList * fListHist;
TH1F * fHistMult;
Float_t fCutMaxD;
Float_t fCutMaxDz;
Float_t fCutTheta;
Float_t fCutMinDir;
ClassDef(AliMaterialBudget, 1);
};
#endif