#ifndef ALIAODHANDLER_H
#define ALIAODHANDLER_H
#include "AliVEventHandler.h"
#include "AliAODExtension.h"
class AliAODEvent;
class TFile;
class TTree;
class TObjArray;
class AliMCEventHandler;
class AliAODMCHeader;
class AliGenEventHeader;
class TMap;
class AliAnalysisFilter;
class AliAODHandler : public AliVEventHandler {
public:
AliAODHandler();
AliAODHandler(const char* name, const char* title);
virtual ~AliAODHandler();
virtual void SetOutputFileName(const char* fname);
virtual const char* GetOutputFileName() const;
virtual const char* GetExtraOutputs(Bool_t merge=kTRUE) const;
virtual Bool_t Init(Option_t* option);
virtual Bool_t Init(TTree* , Option_t* ) {return kTRUE;}
virtual Bool_t GetEntry() {return kTRUE;}
virtual Bool_t BeginEvent(Long64_t ) {fFillAOD=kFALSE; fFillExtension=kFALSE; return kTRUE;}
virtual Bool_t Notify() { return AliVEventHandler::Notify(); };
virtual Bool_t Notify(const char * ) {return kTRUE;}
virtual Bool_t FinishEvent();
virtual Bool_t Terminate();
virtual Bool_t TerminateIO();
virtual void SetCreateNonStandardAOD() {Changed(); fIsStandard = kFALSE;}
virtual void SetFillAOD(Bool_t b) {Changed(); fFillAOD = b;}
virtual void SetFillExtension(Bool_t b) {Changed(); fFillExtension = b;}
virtual void SetFillAODforRun(Bool_t b) {Changed(); fFillAODRun = b;}
virtual void SetNeedsHeaderReplication() {fNeedsHeaderReplication = kTRUE;}
virtual void SetNeedsTOFHeaderReplication() {fNeedsTOFHeaderReplication = kTRUE;}
virtual void SetNeedsVZEROReplication() {fNeedsVZEROReplication = kTRUE;}
virtual void SetNeedsTracksBranchReplication() {fNeedsTracksBranchReplication = kTRUE;}
virtual void SetNeedsVerticesBranchReplication() {fNeedsVerticesBranchReplication = kTRUE;}
virtual void SetNeedsV0sBranchReplication() {fNeedsV0sBranchReplication = kTRUE;}
virtual void SetNeedsCascadesBranchReplication() {fNeedsCascadesBranchReplication = kTRUE;}
virtual void SetNeedsTrackletsBranchReplication() {fNeedsTrackletsBranchReplication = kTRUE;}
virtual void SetNeedsPMDClustersBranchReplication() {fNeedsPMDClustersBranchReplication = kTRUE;}
virtual void SetNeedsJetsBranchReplication() {fNeedsJetsBranchReplication = kTRUE;}
virtual void SetNeedsFMDClustersBranchReplication() {fNeedsFMDClustersBranchReplication = kTRUE;}
virtual void SetNeedsCaloClustersBranchReplication() {fNeedsCaloClustersBranchReplication = kTRUE;}
virtual void SetNeedsCaloTriggerBranchReplication() {fNeedsCaloTriggerBranchReplication = kTRUE;}
virtual void SetNeedsMCParticlesBranchReplication() {fNeedsMCParticlesBranchReplication = kTRUE;}
virtual void SetNeedsDimuonsBranchReplication() {fNeedsDimuonsBranchReplication = kTRUE;}
virtual void SetNeedsHMPIDBranchReplication() {fNeedsHMPIDBranchReplication = kTRUE;}
virtual void SetAODIsReplicated() {Changed(); fAODIsReplicated = kTRUE;}
virtual void SetAODExtensionMode() {Changed(); fIsStandard=kFALSE; fFillAOD=kFALSE; fFillAODRun=kFALSE; fFillExtension=kTRUE;}
AliAODEvent* GetAOD() {return fAODEvent;}
virtual TTree* GetTree() const {return fTreeA;}
TObjArray* GetExtensions() const {return fExtensions;}
AliAODExtension* GetExtension(const char *filename) const;
TObjArray* GetFilters() const {return fFilters;}
AliAODExtension* GetFilteredAOD(const char *filename) const;
void CreateTree(Int_t flag);
void FillTree();
void AddAODtoTreeUserInfo();
void AddBranch(const char* cname, void* addobj, const char *fname="");
AliAODExtension* AddExtension(const char *filename, const char *title="", Bool_t tomerge=kFALSE);
AliAODExtension* AddFilteredAOD(const char *filename, const char *filtername, Bool_t tomerge=kFALSE);
Bool_t IsStandard() const {return fIsStandard;}
Bool_t GetFillAOD() const {return fFillAOD;}
Bool_t GetFillExtension() const {return fFillExtension;}
Bool_t NeedsHeaderReplication() const {return fNeedsHeaderReplication;}
Bool_t NeedsTOFHeaderReplication() const {return fNeedsTOFHeaderReplication;}
Bool_t NeedsVZEROReplication() const {return fNeedsVZEROReplication;}
Bool_t NeedsTracksBranchReplication() const {return fNeedsTracksBranchReplication;}
Bool_t NeedsVerticesBranchReplication() const {return fNeedsVerticesBranchReplication;}
Bool_t NeedsV0sBranchReplication() const {return fNeedsV0sBranchReplication;}
Bool_t NeedsCascadesBranchReplication() const {return fNeedsCascadesBranchReplication;}
Bool_t NeedsTrackletsBranchReplication() const {return fNeedsTrackletsBranchReplication;}
Bool_t NeedsPMDClustersBranchReplication() const {return fNeedsPMDClustersBranchReplication;}
Bool_t NeedsJetsBranchReplication() const {return fNeedsJetsBranchReplication;}
Bool_t NeedsFMDClustersBranchReplication() const {return fNeedsFMDClustersBranchReplication;}
Bool_t NeedsCaloClustersBranchReplication() const {return fNeedsCaloClustersBranchReplication;}
Bool_t NeedsCaloTriggerBranchReplication() const {return fNeedsCaloTriggerBranchReplication;}
Bool_t NeedsMCParticlesBranchReplication() const {return fNeedsMCParticlesBranchReplication;}
Bool_t NeedsDimuonsBranchReplication() const {return fNeedsDimuonsBranchReplication;}
Bool_t NeedsHMPIDBranchReplication() const {return fNeedsHMPIDBranchReplication;}
Bool_t AODIsReplicated() const {return fAODIsReplicated;}
void SetInputTree(TTree* ) {;}
void SetMCEventHandler(AliMCEventHandler* mcH) {fMCEventH = mcH;}
void StoreMCParticles();
void SetTreeBuffSize(Long64_t sz=30000000) {fTreeBuffSize = sz;}
Bool_t HasExtensions() const;
void Print(Option_t* opt="") const;
private:
void SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader *genHeader);
AliAODHandler(const AliAODHandler&);
AliAODHandler& operator=(const AliAODHandler&);
void PrintExtensions(const TObjArray& array) const;
private:
Bool_t fIsStandard;
Bool_t fFillAOD;
Bool_t fFillAODRun;
Bool_t fFillExtension;
Bool_t fNeedsHeaderReplication;
Bool_t fNeedsTOFHeaderReplication;
Bool_t fNeedsVZEROReplication;
Bool_t fNeedsTracksBranchReplication;
Bool_t fNeedsVerticesBranchReplication;
Bool_t fNeedsV0sBranchReplication;
Bool_t fNeedsCascadesBranchReplication;
Bool_t fNeedsTrackletsBranchReplication;
Bool_t fNeedsPMDClustersBranchReplication;
Bool_t fNeedsJetsBranchReplication;
Bool_t fNeedsFMDClustersBranchReplication;
Bool_t fNeedsCaloClustersBranchReplication;
Bool_t fNeedsCaloTriggerBranchReplication;
Bool_t fNeedsMCParticlesBranchReplication;
Bool_t fNeedsDimuonsBranchReplication;
Bool_t fNeedsHMPIDBranchReplication;
Bool_t fAODIsReplicated;
Long64_t fTreeBuffSize;
Long64_t fMemCountAOD;
AliAODEvent *fAODEvent;
AliMCEventHandler *fMCEventH;
TTree *fTreeA;
TFile *fFileA;
TString fFileName;
TObjArray *fExtensions;
TObjArray *fFilters;
ClassDef(AliAODHandler, 8)
};
#endif