#ifndef ALIJFILTER_H
#define ALIJFILTER_H
#include "TNamed.h"
#include "AliJRunHeader.h"
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliAnalysisTaskSE.h"
#include <iostream>
#include <AliJConst.h>
#include <TVectorT.h>
#ifndef AliJMaxDimBuffer
#define AliJMaxDimBuffer
const int kMaxDimBuffer = 300;
#endif
class AliJEventHeader;
class AliJRunHeader;
class AliJTrack;
class AliAnalysisTaskSE;
class TH1D;
class TH2D;
class TNtuple;
class TList;
class TTree;
class TFormula;
class TRefArray;
class TArrayI;
class AliMCEvent;
class AliESDEvent;
class AliESDtrack;
class AliAODEvent;
class AliAODTrack;
class AliESDtrackCuts;
class AliESDVZERO;
class AliESDCentrality;
class AliVCluster;
class AliVCaloCells;
class AliVEvent;
class AliEMCALGeometry;
class AliEMCALGeoUtils;
class AliEMCALRecoUtils;
class AliPHOSGeoUtils;
class AliMCEvent;
class AliAnalysisFilter;
class AliESDTZERO;
class AliESDZDC;
class AliPIDResponse;
class AliPIDResponse;
class AliPIDCombined;
class AliESDTZERO;
class AliAnalysisUtils;
using namespace std;
class AliJFilter : public TNamed {
public:
AliJFilter();
AliJFilter(const char *name, AliAnalysisTaskSE *task);
AliJFilter(const AliJFilter& ap);
AliJFilter& operator = (const AliJFilter& ap);
virtual ~AliJFilter();
virtual void UserCreateOutputObjects();
virtual void Init();
virtual void LocalInit() { Init(); }
virtual void UserExec(Option_t *option);
virtual void Terminate(Option_t * opt = "");
void SetTrackFilter( AliAnalysisFilter * filter ){ fESDFilter = filter; }
bool GetEventSuccess() const { return fEventSuccess; }
void SetClusterThreshold(double t) { fClusterThreshold = t; }
void SetTrackThreshold(double t) { fTrackThreshold = t; }
void SetMyTask( AliAnalysisTaskSE *t ) { fMyTask = t; }
TClonesArray *GetTrackList() const { return fTrackList; }
TClonesArray *GetPhotonList() const { return fPhotonList; }
TClonesArray *GetCaloCellList() const { return fCaloCellList; }
TClonesArray *GetMCTrackList() const { return fMCTrackList; }
TClonesArray *GetHeaderList() const { return fHeaderList; }
TList *GetRunInfoList() const { return fRunInfoList; }
AliESDVZERO *GetESDVZERO() const { return fVZEROData; }
AliESDTZERO *GetESDTZERO() const { return fTZEROData; }
AliESDZDC* GetESDZDC() const { return fZDCData; }
TClonesArray **GetTrackListP() { return &fTrackList; }
TClonesArray **GetPhotonListP() { return &fPhotonList; }
TClonesArray **GetCaloCellListP() { return &fCaloCellList; }
TClonesArray **GetMCTrackListP() { return &fMCTrackList; }
TClonesArray **GetHeaderListP() { return &fHeaderList; }
TList **GetRunInfoListP() { return &fRunInfoList; }
AliESDVZERO** GetESDVZEROP() { return &fVZEROData; }
AliESDTZERO** GetESDTZEROP() { return &fTZEROData; }
AliESDZDC** GetESDZDCP() { return &fZDCData; }
Bool_t GetStoreEventPlaneSource(){ return fAliJRunHeader->GetStoreEventPlaneSource(); }
Bool_t GetStoreEMCalInfo(){ return fAliJRunHeader->GetStoreEMCalInfo(); }
AliESDEvent * ESDEvent(){ return FromESD()? dynamic_cast<AliESDEvent*>(Event()):NULL;}
AliAODEvent * AODEvent(){ return FromAOD()? dynamic_cast<AliAODEvent*>(Event()):NULL;}
AliVEvent * Event(){ return fMyTask->InputEvent(); }
AliMCEvent * MCEvent(){ return IsMC()?fMyTask->MCEvent():NULL; }
Bool_t IsMC(){ return fAliJRunHeader->IsMC(); }
Bool_t FromESD(){ return fAliJRunHeader->FromESD(); }
Bool_t FromAOD(){ return fAliJRunHeader->FromAOD(); }
AliJRunHeader* GetAliJRunHeader() const { return fAliJRunHeader; }
void SetAliJRunHeader( AliJRunHeader* header ){ fAliJRunHeader=header; }
private:
Int_t DebugLevel(){ return fMyTask->DebugLevel(); }
inline void DEBUG(int level, int type, TString msg1, TString msg2=""){
if(DebugLevel()>level) std::cout<<type<<"\t"<<msg1<<" : "<<msg2<<std::endl;
}
AliJEventHeader* ReadCommonHeader(AliVEvent *event);
void ReadESDTracks(AliESDEvent* esd);
void ConvertESDTPCOnlyTracks(AliESDEvent* esd, int iTrack, AliJTrack * ctrack, double ptMin, double ptMax);
void ConvertESDGCGTracks(AliESDEvent* esd, int iTrack, AliJTrack * ctrack, double ptMin, double ptMax);
void ReadESDCaloClusters(const AliESDEvent* esd);
void ReadESDCaloCells(const AliESDEvent* esd);
void ReadESDHeader(AliESDEvent* esd);
void ReadESDPID(AliESDtrack* track, AliJTrack* ctrack);
Bool_t ReadAODTracks(const AliAODEvent* aod);
Bool_t ReadAODCaloClusters(const AliAODEvent* aod);
void ReadAODCaloCells(const AliAODEvent* aod);
void ReadAODHeader(AliAODEvent* aod);
void ReadFilter();
void ReadMCTracksFromESD();
void ReadMCTracksFromAOD();
void RemapMCLabels();
Int_t GetSuperModuleNumber(bool isemcal, AliVCluster *cluster, AliVCaloCells *cells, Int_t absId);
Double_t* GetCellsAmplitude( bool isemcal, AliVCluster *cluster, AliVCaloCells *emCells, AliVCaloCells *phoCells );
UInt_t ConvertTriggerMask();
bool AcceptAODTrack(AliAODTrack* aodTrack);
void SetOADBPath(const char* path) {fOADBPath=path;}
const char* GetOADBPath() const { return fOADBPath.Data(); }
void PrintOut() const;
void AddList(const char* aname, const char* cname, TClonesArray **obj, int nlist);
AliESDtrackCuts* fEsdTrackCuts;
AliAnalysisFilter * fESDFilter;
TVectorT<double> fIsRealOrMC;
TString fActiveTriggers[kRangeTriggerTableAlice];
TString fTriggerTableJCorran[kRangeTriggerTableJCorran];
Bool_t fStoreEventPlaneSource;
TString fOADBPath;
TRefArray *fCaloClustersArr;
Double_t fClusterThreshold;
Double_t fTrackThreshold;
Bool_t fEventSuccess;
TArrayI *fMcMap;
TClonesArray * fTrackList;
TClonesArray * fMCTrackList;
TClonesArray * fPhotonList;
TClonesArray * fCaloCellList;
TClonesArray * fHeaderList;
TList * fRunInfoList;
AliPIDResponse *fPIDResponse;
AliPIDCombined *fPIDCombined;
AliESDVZERO* fVZEROData;
AliESDTZERO* fTZEROData;
AliESDZDC* fZDCData;
vector<Int_t> fEMCLabels;
vector<Int_t> fEMCTreeLabels;
AliJRunHeader* fAliJRunHeader;
AliEMCALGeometry * fEMCALGeometry;
AliEMCALRecoUtils * fEMCALRecoUtils;
AliPHOSGeoUtils * fPHOSGeom;
AliAnalysisUtils *fAnaUtils;
AliAnalysisTaskSE *fMyTask;
ClassDef(AliJFilter, 1);
};
#endif // AliJFilter_H