#ifndef ALIANALYSISTASK_H
#define ALIANALYSISTASK_H
#ifndef ROOT_TTask
#include "TTask.h"
#endif
#ifndef ROOT_TObjArray
#include "TObjArray.h"
#endif
class TClass;
class TFile;
class AliAnalysisDataSlot;
class AliAnalysisDataContainer;
class AliAnalysisTask : public TTask {
public:
enum EAnalysisTaskFlags {
kTaskUsed = BIT(14),
kTaskZombie = BIT(15),
kTaskChecked = BIT(16),
kTaskPostEventLoop = BIT(17)
};
virtual void ConnectInputData(Option_t *option="");
protected:
Bool_t fReady;
Bool_t fInitialized;
Int_t fNinputs;
Int_t fNoutputs;
Bool_t *fOutputReady;
TObject *fPublishedData;
TObjArray *fInputs;
TObjArray *fOutputs;
TString fBranchNames;
void DefineInput(Int_t islot, TClass *type);
void DefineOutput(Int_t islot, TClass *type);
Bool_t PostData(Int_t iout, TObject *data, Option_t *option="");
char *GetBranchAddress(Int_t islot, const char *branch) const;
Bool_t SetBranchAddress(Int_t islot, const char *branch, void *address) const;
void EnableBranch(Int_t islot, const char *bname) const;
TFile *OpenFile(Int_t iout, Option_t *option="RECREATE") const;
public:
AliAnalysisTask();
AliAnalysisTask(const char *name, const char *title);
AliAnalysisTask(const AliAnalysisTask &task);
virtual ~AliAnalysisTask();
AliAnalysisTask& operator=(const AliAnalysisTask &task);
virtual void CreateOutputObjects();
virtual void LocalInit();
virtual Bool_t Notify();
virtual Bool_t NotifyBinChange();
virtual void FinishTaskOutput();
Bool_t ConnectInput(Int_t islot, AliAnalysisDataContainer *cont);
Bool_t ConnectOutput(Int_t islot, AliAnalysisDataContainer *cont);
Bool_t AreSlotsConnected();
void CheckNotify(Bool_t init=kFALSE);
Bool_t CheckCircularDeps();
virtual Bool_t CheckPostData() const;
virtual Bool_t CheckOwnership() const;
virtual void Reset();
void GetBranches(const char *type, TString &result) const;
Int_t GetNinputs() const {return fNinputs;}
Int_t GetNoutputs() const {return fNoutputs;}
TObject *GetPublishedData() const {return fPublishedData;}
AliAnalysisDataSlot *GetInputSlot(Int_t islot) const {return (AliAnalysisDataSlot*)fInputs->At(islot);}
AliAnalysisDataSlot *GetOutputSlot(Int_t islot) const {return (AliAnalysisDataSlot*)fOutputs->At(islot);}
TClass *GetInputType(Int_t islot) const;
TClass *GetOutputType(Int_t islot) const;
TObject *GetInputData(Int_t islot) const;
TObject *GetOutputData(Int_t islot) const;
Bool_t IsOutputReady(Int_t islot) const {return fOutputReady[islot];}
Bool_t IsChecked() const {return TObject::TestBit(kTaskChecked);}
Bool_t IsPostEventLoop() const {return TObject::TestBit(kTaskPostEventLoop);}
Bool_t IsInitialized() const {return fInitialized;}
Bool_t IsReady() const {return fReady;}
Bool_t IsUsed() const {return TObject::TestBit(kTaskUsed);}
Bool_t IsZombie() const {return TObject::TestBit(kTaskZombie);}
Bool_t HasBranches() const {return !fBranchNames.IsNull();}
virtual void PrintTask(Option_t *option="all", Int_t indent=0) const;
void PrintContainers(Option_t *option="all", Int_t indent=0) const;
Bool_t ProducersTouched() const;
void SetBranches(const char *names) {fBranchNames = names;}
void SetChecked(Bool_t flag=kTRUE) {TObject::SetBit(kTaskChecked,flag);}
void SetPostEventLoop(Bool_t flag=kTRUE);
void SetUsed(Bool_t flag=kTRUE);
void SetZombie(Bool_t flag=kTRUE) {TObject::SetBit(kTaskZombie,flag);}
virtual void Exec(Option_t *option) = 0;
Bool_t HasExecuted() const {return fHasExecuted;}
virtual void Terminate(Option_t *option="");
ClassDef(AliAnalysisTask,2)
};
#endif