]>
Commit | Line | Data |
---|---|---|
1 | #ifndef ALIANALYSISMANAGER_H | |
2 | #define ALIANALYSISMANAGER_H | |
3 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
4 | * See cxx source for full Copyright notice */ | |
5 | ||
6 | /* $Id$ */ | |
7 | // Author: Andrei Gheata, 31/05/2006 | |
8 | ||
9 | //============================================================================== | |
10 | // AliAnalysysManager - Manager analysis class. Allows creation of several | |
11 | // analysis tasks and data containers storing their input/output. Allows | |
12 | // connecting/chaining tasks via shared data containers. Serializes the current | |
13 | // event for all tasks depending only on initial input data. | |
14 | //============================================================================== | |
15 | ||
16 | #ifndef ROOT_TNamed | |
17 | #include <TNamed.h> | |
18 | #endif | |
19 | #ifndef ROOT_THashTable | |
20 | #include <THashTable.h> | |
21 | #endif | |
22 | #ifndef ROOT_Riostream | |
23 | #include <Riostream.h> | |
24 | #endif | |
25 | ||
26 | class TClass; | |
27 | class TTree; | |
28 | class TFile; | |
29 | class TStopwatch; | |
30 | class TMap; | |
31 | class AliAnalysisSelector; | |
32 | class AliAnalysisDataContainer; | |
33 | class AliAnalysisFileDescriptor; | |
34 | class AliAnalysisTask; | |
35 | class AliVEventHandler; | |
36 | class AliVEventPool; | |
37 | class AliAnalysisGrid; | |
38 | class AliAnalysisStatistics; | |
39 | ||
40 | ||
41 | class AliAnalysisManager : public TNamed { | |
42 | ||
43 | public: | |
44 | ||
45 | enum EAliAnalysisContType { | |
46 | kExchangeContainer = 0, // use to exchange data between tasks | |
47 | kInputContainer = 1, // use for the task private input data | |
48 | kOutputContainer = 2, // use for the task private output data | |
49 | kParamContainer = 3 // use for storing task private parameters/cuts per analysis session | |
50 | }; | |
51 | ||
52 | enum EAliAnalysisExecMode { | |
53 | kLocalAnalysis = 0, | |
54 | kProofAnalysis = 1, | |
55 | kGridAnalysis = 2, | |
56 | kMixingAnalysis = 3 | |
57 | }; | |
58 | ||
59 | enum EAliAnalysisFlags { | |
60 | kEventLoop = BIT(14), | |
61 | kDisableBranches = BIT(15), | |
62 | kUseDataSet = BIT(16), | |
63 | kSaveCanvases = BIT(17), | |
64 | kExternalLoop = BIT(18), | |
65 | kSkipTerminate = BIT(19), | |
66 | kUseProgressBar = BIT(20), | |
67 | kTrueNotify = BIT(21), | |
68 | kTasksInitialized = BIT(22), | |
69 | kCollectThroughput= BIT(23) | |
70 | }; | |
71 | ||
72 | AliAnalysisManager(const char *name = "mgr", const char *title=""); | |
73 | virtual ~AliAnalysisManager(); | |
74 | ||
75 | AliAnalysisManager(const AliAnalysisManager& other); | |
76 | AliAnalysisManager& operator=(const AliAnalysisManager& other); | |
77 | ||
78 | // Event loop control | |
79 | Bool_t EventLoop(Long64_t nevents); | |
80 | virtual Int_t GetEntry(Long64_t entry, Int_t getall = 0); | |
81 | virtual Bool_t Init(TTree *tree); | |
82 | virtual Bool_t Notify(); | |
83 | virtual Bool_t ProcessCut(Long64_t entry) {return Process(entry);} | |
84 | virtual Bool_t Process(Long64_t entry); | |
85 | TFile *OpenProofFile(AliAnalysisDataContainer *cont, const char *option, const char *extaod=""); | |
86 | static TFile *OpenFile(AliAnalysisDataContainer *cont, const char *option, Bool_t ignoreProof=kFALSE); | |
87 | void PackOutput(TList *target); | |
88 | void RegisterExtraFile(const char *fname); | |
89 | Long64_t StartAnalysis(const char *type, TTree * const tree, Long64_t nentries=1234567890, Long64_t firstentry=0); | |
90 | Long64_t StartAnalysis(const char *type, const char *dataset, Long64_t nentries=1234567890, Long64_t firstentry=0); | |
91 | Long64_t StartAnalysis(const char *type, Long64_t nentries=1234567890, Long64_t firstentry=0); | |
92 | virtual void SlaveBegin(TTree *tree); | |
93 | virtual void Terminate(); | |
94 | void UnpackOutput(TList *source); | |
95 | ||
96 | // Getters/Setters | |
97 | static AliAnalysisManager *GetAnalysisManager() {return fgAnalysisManager;} | |
98 | static Int_t LoadMacro(const char *filename, Int_t *error = 0, Bool_t check = kFALSE); | |
99 | EAliAnalysisExecMode | |
100 | GetAnalysisType() const {return fMode;} | |
101 | void GetAnalysisTypeString(TString &type) const; | |
102 | Bool_t GetAutoBranchLoading() const {return fAutoBranchHandling;} | |
103 | Long64_t GetCacheSize() const {return fCacheSize;} | |
104 | static const char *GetCommonFileName() {return fgCommonFileName.Data();} | |
105 | AliAnalysisDataContainer * | |
106 | GetCommonInputContainer() const {return fCommonInput;} | |
107 | AliAnalysisDataContainer * | |
108 | GetCommonOutputContainer() const {return fCommonOutput;} | |
109 | TObjArray *GetContainers() const {return fContainers;} | |
110 | Long64_t GetCurrentEntry() const {return fCurrentEntry;} | |
111 | UInt_t GetDebugLevel() const {return fDebug;} | |
112 | Bool_t GetAsyncReading() const {return fAsyncReading;} | |
113 | TString GetExtraFiles() const {return fExtraFiles;} | |
114 | AliVEventPool* GetEventPool() const {return fEventPool;} | |
115 | Bool_t GetFileFromWrapper(const char *filename, const TList *source); | |
116 | const char *GetFileInfoLog() const {return fFileInfoLog.Data();} | |
117 | static Int_t GetRunFromAlienPath(const char *path); | |
118 | AliAnalysisGrid* GetGridHandler() {return fGridHandler;} | |
119 | TObjArray *GetInputs() const {return fInputs;} | |
120 | AliVEventHandler* GetInputEventHandler() const {return fInputEventHandler;} | |
121 | AliVEventHandler* GetMCtruthEventHandler() const {return fMCtruthEventHandler;} | |
122 | Int_t GetNsysInfo() const {return fNSysInfo;} | |
123 | AliVEventHandler* GetOutputEventHandler() const {return fOutputEventHandler;} | |
124 | TObjArray *GetOutputs() const {return fOutputs;} | |
125 | TObjArray *GetParamOutputs() const {return fParamCont;} | |
126 | TObjArray *GetExchangeContainers() const {return fExchangeCont;} | |
127 | Int_t GetRunFromPath() const {return fRunFromPath;} | |
128 | const char *GetRequestedBranches() const {return fRequestedBranches.Data();} | |
129 | TObjArray *GetTasks() const {return fTasks;} | |
130 | TObjArray *GetTopTasks() const {return fTopTasks;} | |
131 | TTree *GetTree() const {return fTree;} | |
132 | TObjArray *GetZombieTasks() const {return fZombies;} | |
133 | static const char *GetGlobalStr(const char *key, Bool_t &valid); | |
134 | static Int_t GetGlobalInt(const char *key, Bool_t &valid); | |
135 | static Double_t GetGlobalDbl(const char *key, Bool_t &valid); | |
136 | TMap *GetGlobals() {return fGlobals;} | |
137 | static Bool_t IsMacroLoaded(const char * filename); | |
138 | Bool_t IsMCLoop() const {return fMCLoop;} | |
139 | static Bool_t IsPipe(std::ostream &out); | |
140 | Bool_t IsProofMode() const {return (fMode==kProofAnalysis)?kTRUE:kFALSE;} | |
141 | Bool_t IsRemote() const {return fIsRemote;} | |
142 | Bool_t IsCollectThroughput() {return TObject::TestBit(kCollectThroughput);} | |
143 | Bool_t IsUsingDataSet() const {return TObject::TestBit(kUseDataSet);} | |
144 | void LoadBranch(const char *n) { if(fAutoBranchHandling) return; DoLoadBranch(n); } | |
145 | void RunLocalInit(); | |
146 | void SetAnalysisType(EAliAnalysisExecMode mode) {fMode = mode;} | |
147 | void SetAutoBranchLoading(Bool_t b) { fAutoBranchHandling = b; } | |
148 | void SetCurrentEntry(Long64_t entry) {fCurrentEntry = entry;} | |
149 | void SetCacheSize(Long64_t size) {fCacheSize = size;} | |
150 | void SetCollectSysInfoEach(Int_t nevents=0) {fNSysInfo = nevents;} | |
151 | void SetCollectThroughput(Bool_t flag) {Changed(); TObject::SetBit(kCollectThroughput,flag);} | |
152 | static void SetCommonFileName(const char *name) {fgCommonFileName = name;} | |
153 | void SetDebugLevel(UInt_t level); | |
154 | void SetDisableBranches(Bool_t disable=kTRUE) {Changed(); TObject::SetBit(kDisableBranches,disable);} | |
155 | void SetAsyncReading(Bool_t flag=kTRUE) {fAsyncReading = flag;} | |
156 | void SetExternalLoop(Bool_t flag) {Changed(); TObject::SetBit(kExternalLoop,flag);} | |
157 | void SetMCLoop(Bool_t flag=kTRUE) {fMCLoop = flag;} | |
158 | void SetEventPool(AliVEventPool* const epool) {Changed(); fEventPool = epool;} | |
159 | void SetFileInfoLog(const char *name) {TObject::SetBit(kCollectThroughput,kTRUE); fFileInfoLog = name;} | |
160 | void SetGridHandler(AliAnalysisGrid * const handler) {Changed(); fGridHandler = handler;} | |
161 | void SetInputEventHandler(AliVEventHandler* const handler); | |
162 | void SetMCtruthEventHandler(AliVEventHandler* const handler) {Changed(); fMCtruthEventHandler = handler;} | |
163 | void SetNSysInfo(Long64_t nevents) {fNSysInfo = nevents;} | |
164 | void SetOutputEventHandler(AliVEventHandler* const handler); | |
165 | void SetRunFromPath(Int_t run) {fRunFromPath = run;} | |
166 | void SetSelector(AliAnalysisSelector * const sel) {fSelector = sel;} | |
167 | void SetSaveCanvases(Bool_t flag=kTRUE) {TObject::SetBit(kSaveCanvases,flag);} | |
168 | void SetSkipTerminate(Bool_t flag) {TObject::SetBit(kSkipTerminate,flag);} | |
169 | void SetUseProgressBar(Bool_t flag, Int_t freq=1); | |
170 | void SetSpecialOutputLocation(const char *loc) {fSpecialOutputLocation = loc;} | |
171 | static void SetGlobalStr(const char *key, const char *value); | |
172 | static void SetGlobalInt(const char *key, Int_t value); | |
173 | static void SetGlobalDbl(const char *key, Double_t value); | |
174 | ||
175 | ||
176 | // Container handling | |
177 | AliAnalysisDataContainer *CreateContainer(const char *name, TClass *datatype, | |
178 | EAliAnalysisContType type = kExchangeContainer, | |
179 | const char *filename = NULL); | |
180 | ||
181 | // Including tasks and getting them | |
182 | void AddTask(AliAnalysisTask *task); | |
183 | AliAnalysisTask *GetTask(const char *name) const; | |
184 | Int_t GetTaskIndex(const AliAnalysisTask *task) const; | |
185 | ||
186 | // Connecting data containers to task inputs/outputs | |
187 | Bool_t ConnectInput(AliAnalysisTask *task, Int_t islot, | |
188 | AliAnalysisDataContainer *cont); | |
189 | Bool_t ConnectOutput(AliAnalysisTask *task, Int_t islot, | |
190 | AliAnalysisDataContainer *cont); | |
191 | // Garbage collection | |
192 | void CleanContainers(); | |
193 | ||
194 | // Analysis initialization and execution, status | |
195 | void AddBranches(const char *branches); | |
196 | void AddStatisticsTask(UInt_t offlineMask=0); | |
197 | void CheckBranches(Bool_t load=kFALSE); | |
198 | Bool_t CheckTasks() const; | |
199 | void CountEvent(Int_t ninput, Int_t nprocessed, Int_t nfailed, Int_t naccepted); | |
200 | Bool_t InitAnalysis(); | |
201 | Bool_t IsInitialized() const {return fInitOK;} | |
202 | Bool_t IsTrainInitialized() const {return TObject::TestBit(kTasksInitialized);} | |
203 | Bool_t IsExternalLoop() const {return TObject::TestBit(kExternalLoop);} | |
204 | Bool_t IsEventLoop() const {return TObject::TestBit(kEventLoop);} | |
205 | Bool_t IsSkipTerminate() const {return TObject::TestBit(kSkipTerminate);} | |
206 | Bool_t MustClean() const {return fMustClean;} | |
207 | void SetMustClean(Bool_t flag=kTRUE) {fMustClean = flag;} | |
208 | void ResetAnalysis(); | |
209 | void ExecAnalysis(Option_t *option=""); | |
210 | void PrintStatus(Option_t *option="all") const; | |
211 | void ProfileTask(const char *name, const char *option="VM") const; | |
212 | void ProfileTask(Int_t itop, const char *option="VM") const; | |
213 | static void ProgressBar(const char *opname, Long64_t current, Long64_t size, TStopwatch * const watch=0, Bool_t last=kFALSE, Bool_t refresh=kFALSE); | |
214 | void AddStatisticsMsg(const char *line); | |
215 | const char *GetStatisticsMsg() const {return fStatisticsMsg.Data();} | |
216 | const AliAnalysisStatistics *GetStatistics() const {return fStatistics;} | |
217 | void SetStatistics(AliAnalysisStatistics *stat) {fStatistics = stat;} | |
218 | void WriteStatisticsMsg(Int_t nevents); | |
219 | Int_t GetNcalls() const {return fNcalls;} | |
220 | Bool_t ValidateOutputFiles() const; | |
221 | ||
222 | static const char* GetOADBPath(); | |
223 | ||
224 | void ApplyDebugOptions(); | |
225 | void AddClassDebug(const char *className, Int_t debugLevel); | |
226 | ||
227 | // Security | |
228 | Bool_t IsLocked() const {return fLocked;} | |
229 | void Lock(); | |
230 | void UnLock(); | |
231 | void Changed(); | |
232 | protected: | |
233 | void CreateReadCache(); | |
234 | void ImportWrappers(TList *source); | |
235 | void InputFileFromTree(TTree * const tree, TString &fname); | |
236 | void SetEventLoop(Bool_t flag=kTRUE) {TObject::SetBit(kEventLoop,flag);} | |
237 | void DoLoadBranch(const char *name); | |
238 | ||
239 | private: | |
240 | TTree *fTree; //! Input tree in case of TSelector model | |
241 | AliVEventHandler *fInputEventHandler; // Optional common input event handler | |
242 | AliVEventHandler *fOutputEventHandler; // Optional common output event handler | |
243 | AliVEventHandler *fMCtruthEventHandler; // Optional common MC Truth event handler | |
244 | AliVEventPool *fEventPool; // Event pool for mixing analysis | |
245 | Long64_t fCurrentEntry; //! Current processed entry in the tree | |
246 | Long64_t fNSysInfo; // Event frequency for collecting system information | |
247 | EAliAnalysisExecMode fMode; // Execution mode | |
248 | Bool_t fInitOK; // Initialisation done | |
249 | Bool_t fMustClean; // Flag to let ROOT do cleanup | |
250 | Bool_t fIsRemote; //! Flag is set for remote analysis | |
251 | Bool_t fLocked; //! Lock for the manager and handlers | |
252 | Bool_t fMCLoop; // External MC generator loop | |
253 | UInt_t fDebug; // Debug level | |
254 | TString fSpecialOutputLocation; // URL/path where the special outputs will be copied | |
255 | TObjArray *fTasks; // List of analysis tasks | |
256 | TObjArray *fTopTasks; // List of top tasks | |
257 | TObjArray *fZombies; // List of zombie tasks | |
258 | TObjArray *fContainers; // List of all containers | |
259 | TObjArray *fInputs; // List of containers with input data | |
260 | TObjArray *fOutputs; // List of containers with results | |
261 | TObjArray *fParamCont; // List of containers with parameters | |
262 | TObjArray *fExchangeCont; // List of exchange containers | |
263 | TObjArray *fDebugOptions; // List of debug options | |
264 | TObjArray *fFileDescriptors; //! List of file descriptors | |
265 | AliAnalysisFileDescriptor *fCurrentDescriptor; //! Current file descriptor | |
266 | AliAnalysisDataContainer *fCommonInput; // Common input container | |
267 | AliAnalysisDataContainer *fCommonOutput; // Common output container | |
268 | AliAnalysisSelector *fSelector; //! Current selector | |
269 | AliAnalysisGrid *fGridHandler; //! Grid handler plugin | |
270 | TString fExtraFiles; // List of extra files to be merged | |
271 | TString fFileInfoLog; // File name for fileinfo logs | |
272 | Bool_t fAutoBranchHandling; // def=kTRUE, turn off if you use LoadBranch | |
273 | Bool_t fAsyncReading; // Enable async reading | |
274 | THashTable fTable; // keep branch ptrs in case of manual branch loading | |
275 | Int_t fRunFromPath; // Run number retrieved from path to input data | |
276 | Int_t fNcalls; // Total number of calls (events) of ExecAnalysis | |
277 | Long64_t fMaxEntries; // Maximum number of entries | |
278 | Long64_t fCacheSize; // Cache size in bytes | |
279 | static Int_t fPBUpdateFreq; // Progress bar update freq. | |
280 | TString fStatisticsMsg; // Statistics user message | |
281 | TString fRequestedBranches; // Requested branch names | |
282 | AliAnalysisStatistics *fStatistics; // Statistics info about input events | |
283 | TMap *fGlobals; // Map with global variables | |
284 | TStopwatch *fIOTimer; //! Timer for I/O + deserialization | |
285 | TStopwatch *fCPUTimer; //! Timer for useful processing | |
286 | TStopwatch *fInitTimer; //! Timer for initialization | |
287 | Double_t fIOTime; //! Cumulated time in IO | |
288 | Double_t fCPUTime; //! Cumulated time in Exec | |
289 | Double_t fInitTime; //! Cumulated time in initialization | |
290 | static TString fgCommonFileName; //! Common output file name (not streamed) | |
291 | static TString fgMacroNames; //! Loaded macro names | |
292 | static AliAnalysisManager *fgAnalysisManager; //! static pointer to object instance | |
293 | ClassDef(AliAnalysisManager,20) // Analysis manager class | |
294 | }; | |
295 | #endif |