1 |
loizides |
1.1 |
//
|
2 |
loizides |
1.8 |
// $Id: TAModule.h,v 1.7 2009/07/13 19:18:38 loizides Exp $
|
3 |
loizides |
1.1 |
//
|
4 |
|
|
|
5 |
|
|
#ifndef ROOT_TAModule
|
6 |
|
|
#define ROOT_TAModule
|
7 |
|
|
|
8 |
|
|
// keep this for compatibility
|
9 |
|
|
#define TAM_TAModule
|
10 |
|
|
|
11 |
|
|
|
12 |
|
|
// typeid include
|
13 |
|
|
#include <typeinfo>
|
14 |
|
|
|
15 |
|
|
|
16 |
|
|
#ifndef ROOT_TTask
|
17 |
|
|
#include "TTask.h"
|
18 |
|
|
#endif
|
19 |
|
|
#ifndef ROOT_Varargs
|
20 |
|
|
#include "Varargs.h"
|
21 |
|
|
#endif
|
22 |
|
|
#ifndef ROOT_TAMSelector
|
23 |
loizides |
1.8 |
#include "MitAna/TAM/interface/TAMSelector.h"
|
24 |
loizides |
1.1 |
#endif
|
25 |
|
|
#ifndef ROOT_TAMOutput
|
26 |
loizides |
1.8 |
#include "MitAna/TAM/interface/TAMOutput.h"
|
27 |
loizides |
1.1 |
#endif
|
28 |
|
|
|
29 |
|
|
class TFile;
|
30 |
|
|
class TStopwatch;
|
31 |
|
|
|
32 |
|
|
|
33 |
|
|
class TAModule : public TTask {
|
34 |
|
|
public:
|
35 |
|
|
enum EModResult {
|
36 |
loizides |
1.7 |
kWarning, //a problem requiring no action, just printing of a warning
|
37 |
loizides |
1.1 |
kAbortModule, //a problem requiring this mod (and its submods) to stop
|
38 |
|
|
kAbortEvent, //a problem requiring the processing of this event to stop
|
39 |
loizides |
1.7 |
kStopModule, //a problem requiring this module (and its submodules)
|
40 |
|
|
// to stop for the rest of the analysis
|
41 |
|
|
kAbortAnalysis //a problem requiring the analysis to stop
|
42 |
loizides |
1.1 |
};
|
43 |
|
|
|
44 |
|
|
private:
|
45 |
loizides |
1.7 |
TAMSelector *fSelector; //!the selector processing the tree
|
46 |
loizides |
1.1 |
TAMOutput *fOutput; //the list of output objects for this mod
|
47 |
loizides |
1.7 |
Bool_t fDefActv; //!copy of fActive so that TAMSelector can
|
48 |
|
|
// temporarily change this mod's active-ness
|
49 |
|
|
// to abort the module or the event
|
50 |
loizides |
1.1 |
UInt_t fVerbose; //verbosity level
|
51 |
loizides |
1.7 |
Bool_t fStopped; //!indicate if module (and its submodules) are
|
52 |
|
|
// aborted for the rest of the analysis
|
53 |
|
|
Bool_t fUseName; //if true use this module's name when
|
54 |
|
|
// writing the output in the flattening mode
|
55 |
loizides |
1.1 |
|
56 |
|
|
static const Char_t kExecBegin; //!key to mark Begin
|
57 |
|
|
static const Char_t kExecSlaveBegin; //!key to mark SlaveBegin
|
58 |
|
|
static const Char_t kExecProcess; //!key to mark Process
|
59 |
loizides |
1.2 |
static const Char_t kExecBeginRun; //!key to mark BeginRun
|
60 |
|
|
static const Char_t kExecEndRun; //!key to mark EndRun
|
61 |
loizides |
1.1 |
static const Char_t kExecSlaveTerminate; //!key to mark SlaveTerminate
|
62 |
|
|
static const Char_t kExecTerminate; //!key to mark Terminate
|
63 |
|
|
|
64 |
loizides |
1.6 |
void AbortAnalysis();
|
65 |
|
|
void AbortModule();
|
66 |
loizides |
1.1 |
void DeactivateAll();
|
67 |
|
|
void NewOutputList(TList* list);
|
68 |
|
|
Bool_t NotifyAll();
|
69 |
|
|
void ResetAllActiveFlags();
|
70 |
|
|
void SetAllModOutput(TAMOutput* o);
|
71 |
|
|
void SetModOutput(TAMOutput* o);
|
72 |
|
|
void StopModule();
|
73 |
|
|
|
74 |
|
|
protected:
|
75 |
loizides |
1.6 |
|
76 |
|
|
// utility functions to be used by derived classes
|
77 |
loizides |
1.5 |
void AbortEvent();
|
78 |
loizides |
1.1 |
virtual Bool_t AddObjThisEvt(TObject* obj);
|
79 |
|
|
virtual Bool_t AddObjThisEvt(TObject* obj, const char *name);
|
80 |
|
|
template <class OC>
|
81 |
|
|
void AddOutput(OC* const & obj);
|
82 |
loizides |
1.4 |
const TAMSelector *GetSelector() const { return fSelector; }
|
83 |
loizides |
1.7 |
Bool_t IsEventAborted() const;
|
84 |
|
|
Bool_t IsAnalysisAborted() const;
|
85 |
loizides |
1.4 |
void ls(Option_t *option) const;
|
86 |
loizides |
1.1 |
void LoadBranch(const Char_t* bname);
|
87 |
|
|
virtual TObject *FindObjThisEvt(const Char_t* name) const;
|
88 |
loizides |
1.5 |
virtual Bool_t Notify() { return kTRUE; }
|
89 |
loizides |
1.1 |
virtual TObject *RemoveObjThisEvt(const Char_t* name);
|
90 |
|
|
void RemoveOutput(TObject* obj);
|
91 |
|
|
template <typename T>
|
92 |
|
|
void ReqBranch(const Char_t* bname, T*& address);
|
93 |
|
|
void SendError(const EModResult errLevel,
|
94 |
loizides |
1.5 |
const Char_t* location,
|
95 |
|
|
const Char_t* formattedMsg, ...);
|
96 |
loizides |
1.1 |
void SkipEvent();
|
97 |
|
|
|
98 |
|
|
// functions to be overloaded by specific TAModule
|
99 |
|
|
virtual void Begin() {}
|
100 |
|
|
virtual void SlaveBegin() {}
|
101 |
|
|
virtual void Process() {}
|
102 |
loizides |
1.2 |
virtual void BeginRun() {}
|
103 |
|
|
virtual void EndRun() {}
|
104 |
loizides |
1.1 |
virtual void SlaveTerminate() {}
|
105 |
|
|
virtual void Terminate() {}
|
106 |
|
|
|
107 |
|
|
public:
|
108 |
|
|
|
109 |
|
|
TAModule();
|
110 |
|
|
TAModule(const Char_t* name, const Char_t* title);
|
111 |
|
|
virtual ~TAModule();
|
112 |
|
|
|
113 |
loizides |
1.7 |
void SetActive(Bool_t act = kTRUE) { SetDefActive(act); }
|
114 |
loizides |
1.1 |
virtual void Browse(TBrowser* b);
|
115 |
|
|
// intentionally have no GetSelector as modules should never directly
|
116 |
|
|
// interact with the selector, the input list or the output list
|
117 |
|
|
Bool_t CheckSelectors(const TAMSelector* sel,
|
118 |
|
|
const Bool_t warn=kTRUE) const;
|
119 |
|
|
// TAMSelector is a friend to allow it to call Exec
|
120 |
|
|
// using the private variables such as kExecProcess
|
121 |
|
|
// and to prevent TAModules inheritting from this class
|
122 |
|
|
// from making such explicit calls.
|
123 |
|
|
friend class TAMSelector;
|
124 |
|
|
void Exec(Option_t* option);
|
125 |
|
|
TObject *FindPublicObj(const Char_t* name) const;
|
126 |
|
|
TFile *GetCurrentFile() const;
|
127 |
loizides |
1.7 |
const TAMOutput *GetModOutput() const { return fOutput; }
|
128 |
|
|
TAMOutput *GetModOutput() { return fOutput; }
|
129 |
loizides |
1.1 |
TList* GetSubModules() { return GetListOfTasks(); }
|
130 |
|
|
const TList *GetSubModules() const { return GetListOfTasks(); }
|
131 |
loizides |
1.7 |
Bool_t GetUseName() const { return fUseName; }
|
132 |
|
|
UInt_t GetVerbosity() const { return fVerbose; }
|
133 |
loizides |
1.1 |
virtual void Print(Option_t *option="") const;
|
134 |
|
|
Bool_t PublishObj(TObject* obj);
|
135 |
|
|
TObject *RetractObj(const Char_t* name);
|
136 |
|
|
void SetDefActive(Bool_t active);
|
137 |
|
|
void SetSelector(TAMSelector* sel);
|
138 |
loizides |
1.7 |
void SetUseName(Bool_t b) { fUseName = b; }
|
139 |
|
|
void SetVerbosity(UInt_t vb) { fVerbose = vb; }
|
140 |
loizides |
1.1 |
|
141 |
|
|
static const char *Version();
|
142 |
|
|
|
143 |
loizides |
1.7 |
ClassDef(TAModule,4) // Base class for modular processing a tree
|
144 |
loizides |
1.1 |
};
|
145 |
|
|
|
146 |
|
|
|
147 |
|
|
//______________________________________________________________________________
|
148 |
|
|
template <class OC>
|
149 |
|
|
inline void TAModule::AddOutput(OC* const & obj)
|
150 |
|
|
{
|
151 |
|
|
// Add the object to the list of output objects of this module.
|
152 |
|
|
// The Proof facility can then merge this object from each worker
|
153 |
|
|
// computer.
|
154 |
|
|
// This version of the function will also store the address of the
|
155 |
|
|
// pointer, and if the pointer is a member of the module, the member
|
156 |
|
|
// will be made to point to the object in the output list on the
|
157 |
|
|
// client computer before Terminate is called.
|
158 |
|
|
|
159 |
|
|
if (fOutput!=0) {
|
160 |
|
|
fOutput->AddOutput(obj);
|
161 |
|
|
} else {
|
162 |
|
|
SendError(kAbortAnalysis,
|
163 |
|
|
"AddOutput",
|
164 |
|
|
"fOutput is null in module [%s]",
|
165 |
|
|
GetName());
|
166 |
|
|
}
|
167 |
|
|
}
|
168 |
|
|
|
169 |
|
|
|
170 |
|
|
//______________________________________________________________________________
|
171 |
loizides |
1.7 |
inline Bool_t TAModule::IsEventAborted() const
|
172 |
|
|
{
|
173 |
|
|
// Return kTRUE if event has been aborted.
|
174 |
|
|
|
175 |
|
|
return (fSelector==0) ? kFALSE : fSelector->IsEventAborted();
|
176 |
|
|
}
|
177 |
|
|
|
178 |
|
|
|
179 |
|
|
//______________________________________________________________________________
|
180 |
|
|
inline Bool_t TAModule::IsAnalysisAborted() const
|
181 |
|
|
{
|
182 |
|
|
// Return kTRUE if analysis has been aborted.
|
183 |
|
|
|
184 |
|
|
return (fSelector==0) ? kFALSE : fSelector->IsAnalysisAborted();
|
185 |
|
|
}
|
186 |
|
|
|
187 |
|
|
//______________________________________________________________________________
|
188 |
loizides |
1.1 |
template <typename T>
|
189 |
|
|
inline void TAModule::ReqBranch(const Char_t* bname, T*& address)
|
190 |
|
|
{
|
191 |
|
|
// Requests that the branch with the specified name be made available
|
192 |
|
|
// during processing and that it be read in to the address specified.
|
193 |
|
|
// The TAMSelector will automatically change the value of the pointer
|
194 |
|
|
// pointed to ('*address') to the address of the branch entry when it
|
195 |
|
|
// is read in via LoadBranch.
|
196 |
|
|
|
197 |
|
|
if (fSelector!=0) {
|
198 |
|
|
fSelector->ReqBranch(bname, address);
|
199 |
|
|
} else {
|
200 |
|
|
SendError(kAbortAnalysis,
|
201 |
|
|
"ReqBranch",
|
202 |
|
|
"fSelector is null in module [%s]",
|
203 |
|
|
GetName());
|
204 |
|
|
}
|
205 |
|
|
}
|
206 |
|
|
|
207 |
|
|
|
208 |
|
|
//______________________________________________________________________________
|
209 |
|
|
inline void TAModule::SetDefActive(Bool_t active)
|
210 |
|
|
{
|
211 |
|
|
// Set the activity and make it the default behavior.
|
212 |
|
|
|
213 |
|
|
fDefActv = active;
|
214 |
|
|
TTask::SetActive(active);
|
215 |
|
|
}
|
216 |
|
|
|
217 |
|
|
#endif //ROOT_TAModule
|