AliRoot Core  3dc7879 (3dc7879)
AliAnalysisTask.h
Go to the documentation of this file.
1 #ifndef ALIANALYSISTASK_H
2 #define ALIANALYSISTASK_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice */
5 
85 
86 //
87 //==============================================================================
90 
91 #ifndef ROOT_TTask
92 #include "TTask.h"
93 #endif
94 
95 #ifndef ROOT_TObjArray
96 #include "TObjArray.h"
97 #endif
98 
99 class TClass;
100 class TFile;
101 class AliAnalysisDataSlot;
103 
104 class AliAnalysisTask : public TTask {
105  public:
107  kTaskUsed = BIT(14),
108  kTaskZombie = BIT(15),
109  kTaskChecked = BIT(16),
111  };
112 
113  //=====================================================================
114  // === OVERLOAD THIS TO CONNECT TREE BRANCHES AT INPUT SLOTS. YOU
115  // SHOULD DEFINE HERE ALSO THE OBJECTS TO BE CONNECTED TO YOUR OUTPUTS
116  virtual void ConnectInputData(Option_t *option="");
117  //=====================================================================
118 
119  protected:
120  Bool_t fReady;
121  Bool_t fInitialized;
122  Int_t fNinputs;
123  Int_t fNoutputs;
124  Bool_t *fOutputReady; //[fNoutputs]
126  TObject *fPublishedData;
129  TString fBranchNames;
130 
131  // Define the input/output slots (called by user in the ctor of the derived class)
132  //=== CALL IN THE CONSTRUCTOR OF DERIVED CLASS TO DEFINE INPUTS/OUTPUTS ===
133  void DefineInput(Int_t islot, TClass *type);
134  void DefineOutput(Int_t islot, TClass *type);
135 
136  // Post output data (called by Exec() when data is ready)
137  //=== CALL IN EXEC() FOR EACH OUTPUT WHEN READY ===
138  Bool_t PostData(Int_t iout, TObject *data, Option_t *option="");
139  //=====================================================================
140 
141  // === USE THIS FIRST IN YOUR ConnectInputData() TO CHECH IF A BRANCH IS ALREADY CONNECTED
142  // TO SOME ADDRESS.
143  char *GetBranchAddress(Int_t islot, const char *branch) const;
144  // === CALL THIS AFTERWARDS IN ConnectInputData() IF THE BRANCH ADDRESS IS NOT YET SET
145  Bool_t SetBranchAddress(Int_t islot, const char *branch, void *address) const;
146  //=====================================================================
147  //=== CALL IN ConnectInputData() TO ENABLE ONLY EXPLICIT BRANCHES NEEDED FOR THIS TASK EXECUTION
148  void EnableBranch(Int_t islot, const char *bname) const;
149  //=====================================================================
150  // === CALL THIS IN CreateOutputObjects BEFORE CREATING THE OBJECT FOR EACH
151  // OUTPUT IOUT THAT HAS TO BE WRITTEN TO A FILE
152  TFile *OpenFile(Int_t iout, Option_t *option="RECREATE") const;
153 
154 public:
155  AliAnalysisTask();
156  AliAnalysisTask(const char *name, const char *title);
157  AliAnalysisTask(const AliAnalysisTask &task);
158  virtual ~AliAnalysisTask();
159 
160  // Assignment
162  //=====================================================================
163  // === OVERLOAD THIS AND CREATE YOUR OUTPUT OBJECTS (HISTOGRAMS,DATA) HERE
164  virtual void CreateOutputObjects();
165  // === OVERLOAD THIS IF YOU NEED TO INITIALIZE YOUR CLASS ON THE CLIENT
166  virtual void LocalInit();
167  // === OVERLOAD THIS IF YOU NEED TO TREAT INPUT FILE/TREE CHANGE
168  virtual Bool_t Notify();
169  // === OVERLOAD THIS IF YOU NEED TO TREAT BIN CHANGE IN EVENT MIXING
170  virtual Bool_t NotifyBinChange();
171  //=====================================================================
172  // Optional method that will be called in SlaveTerminate phase for each task
173  // Warning: in PROOF mode this is called before merging so their cleanup is
174  // not allowed - do output cleanup in class destructor.
175  virtual void FinishTaskOutput();
176  // Conect inputs/outputs to data containers (by AliAnalysisModule)
177  Bool_t ConnectInput(Int_t islot, AliAnalysisDataContainer *cont);
178  Bool_t ConnectOutput(Int_t islot, AliAnalysisDataContainer *cont);
179  // Check connectivity
180  Bool_t AreSlotsConnected();
181  // Check if data for all inputs is ready
182  void CheckNotify(Bool_t init=kFALSE);
183  // Check if there are illegal circular dependencies
184  Bool_t CheckCircularDeps();
185  virtual Bool_t CheckPostData() const;
186  virtual Bool_t CheckOwnership() const;
187  // Reset task
188  virtual void Reset();
189  // full reset: discard all statistics, zero histograms, start again.
190  // called in online mode (HLT) after sending output for merging.
191  virtual Bool_t ResetOutputData() {return kFALSE;}
192  // Getters
193  void GetBranches(const char *type, TString &result) const;
194  Int_t GetNinputs() const {return fNinputs;}
195  Int_t GetNoutputs() const {return fNoutputs;}
196  TObject *GetPublishedData() const {return fPublishedData;}
197  AliAnalysisDataSlot *GetInputSlot(Int_t islot) const {return (AliAnalysisDataSlot*)fInputs->At(islot);}
198  AliAnalysisDataSlot *GetOutputSlot(Int_t islot) const {return (AliAnalysisDataSlot*)fOutputs->At(islot);}
199  TClass *GetInputType(Int_t islot) const;
200  TClass *GetOutputType(Int_t islot) const;
201  // === USE THIS TO RETREIVE INPUT DATA AND STATICALLY CAST IT TO THE DECLARED TYPE
202  TObject *GetInputData(Int_t islot) const;
203  TObject *GetOutputData(Int_t islot) const;
204  Bool_t IsOutputReady(Int_t islot) const {return fOutputReady[islot];}
205  Bool_t IsChecked() const {return TObject::TestBit(kTaskChecked);}
206  Bool_t IsPostEventLoop() const {return TObject::TestBit(kTaskPostEventLoop);}
207  Bool_t IsInitialized() const {return fInitialized;}
208  Bool_t IsReady() const {return fReady;}
209  Bool_t IsUsed() const {return TObject::TestBit(kTaskUsed);}
210  Bool_t IsZombie() const {return TObject::TestBit(kTaskZombie);}
211  Bool_t HasBranches() const {return !fBranchNames.IsNull();}
212  virtual void PrintTask(Option_t *option="all", Int_t indent=0) const;
213  void PrintContainers(Option_t *option="all", Int_t indent=0) const;
214  Bool_t ProducersTouched() const;
215  void SetBranches(const char *names) {fBranchNames = names;}
216  void SetChecked(Bool_t flag=kTRUE) {TObject::SetBit(kTaskChecked,flag);}
217  void SetPostEventLoop(Bool_t flag=kTRUE);
218  void SetUsed(Bool_t flag=kTRUE);
219  void SetZombie(Bool_t flag=kTRUE) {TObject::SetBit(kTaskZombie,flag);}
220  // Main task execution
221  //=== IMPLEMENT THIS !!! ==============================================
222  virtual void Exec(Option_t *option) = 0;
223  //=====================================================================
224  Bool_t HasExecuted() const {return fHasExecuted;}
225  //=====================================================================
226  // === OVERLOAD THIS IF YOU WANT TO DO SOMETHING WITH THE OUTPUT
227  virtual void Terminate(Option_t *option="");
228  //=====================================================================
229 
230  ClassDef(AliAnalysisTask,2) // Class describing an analysis task
231 };
232 #endif
AliAnalysysTask - Class representing a basic analysis task. Any user-defined task should derive from...
Bool_t fReady
Flag if the task is ready.
Bool_t fInitialized
True if Init() was called.
TObject * GetPublishedData() const
virtual void Terminate(Option_t *option="")
void CheckNotify(Bool_t init=kFALSE)
TClass * GetInputType(Int_t islot) const
Bool_t HasBranches() const
Bool_t CheckCircularDeps()
virtual void FinishTaskOutput()
#define TObjArray
virtual void PrintTask(Option_t *option="all", Int_t indent=0) const
virtual Bool_t CheckOwnership() const
TClass * GetOutputType(Int_t islot) const
void SetBranches(const char *names)
Bool_t IsZombie() const
Bool_t PostData(Int_t iout, TObject *data, Option_t *option="")
void SetPostEventLoop(Bool_t flag=kTRUE)
Int_t fNinputs
Number of inputs.
virtual Bool_t NotifyBinChange()
void DefineInput(Int_t islot, TClass *type)
AliAnalysisTask & operator=(const AliAnalysisTask &task)
Bool_t IsOutputReady(Int_t islot) const
virtual Bool_t ResetOutputData()
char * GetBranchAddress(Int_t islot, const char *branch) const
AliAnalysysDataContainer AliAnalysysDataContainer - Container of data of arbitrary type deriving from...
Int_t GetNinputs() const
void SetZombie(Bool_t flag=kTRUE)
virtual Bool_t Notify()
TString fBranchNames
List of input branches that need to be loaded for this task.
void SetChecked(Bool_t flag=kTRUE)
bool init
Definition: XSection.C:263
virtual void CreateOutputObjects()
Bool_t ConnectOutput(Int_t islot, AliAnalysisDataContainer *cont)
virtual void Exec(Option_t *option)=0
TObject * GetInputData(Int_t islot) const
virtual ~AliAnalysisTask()
TFile * OpenFile(Int_t iout, Option_t *option="RECREATE") const
virtual void ConnectInputData(Option_t *option="")
Bool_t ProducersTouched() const
AliAnalysysDataSlot Class representing a data slot of an analysis task. An analysis slot enforces a c...
virtual void Reset()
void PrintContainers(Option_t *option="all", Int_t indent=0) const
Bool_t IsInitialized() const
AliAnalysisDataSlot * GetOutputSlot(Int_t islot) const
virtual void LocalInit()
Bool_t ConnectInput(Int_t islot, AliAnalysisDataContainer *cont)
TObject * GetOutputData(Int_t islot) const
Bool_t SetBranchAddress(Int_t islot, const char *branch, void *address) const
Bool_t IsPostEventLoop() const
const char * names[10]
AliAnalysisDataSlot * GetInputSlot(Int_t islot) const
void GetBranches(const char *type, TString &result) const
Bool_t * fOutputReady
Flags for output readyness.
void SetUsed(Bool_t flag=kTRUE)
virtual Bool_t CheckPostData() const
Int_t GetNoutputs() const
Bool_t IsUsed() const
Bool_t IsChecked() const
void DefineOutput(Int_t islot, TClass *type)
Bool_t HasExecuted() const
Bool_t IsReady() const
TObject * fPublishedData
! published data
TObjArray * fInputs
Array of input slots.
void EnableBranch(Int_t islot, const char *bname) const
TObjArray * fOutputs
Array of output slots.
Bool_t AreSlotsConnected()