]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/RESONANCES/AliRsnVAnalysisTaskSE.cxx
Add new version of macros for RSN analysis
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnVAnalysisTaskSE.cxx
1 //
2 // Class AliRsnVAnalysisTaskSE
3 //
4 // Virtual Class derivated from AliAnalysisTaskSE which will be base class
5 // for all RSN SE tasks
6 //
7 // authors: Martin Vala (martin.vala@cern.ch)
8 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
9 //
10
11 #include <Riostream.h>
12
13 #include "AliESDEvent.h"
14 #include "AliMCEvent.h"
15 #include "AliAODEvent.h"
16 #include "AliRsnEvent.h"
17 #include "AliRsnTarget.h"
18
19 #include "AliRsnVAnalysisTaskSE.h"
20
21 ClassImp(AliRsnVAnalysisTaskSE)
22
23 //_____________________________________________________________________________
24 AliRsnVAnalysisTaskSE::AliRsnVAnalysisTaskSE
25 (const char *name, Bool_t mcOnly) :
26    AliAnalysisTaskSE(name),
27    fLogType(AliLog::kInfo),
28    fLogClassesString(""),
29    fESDEvent(0x0),
30    fMCEvent(0x0),
31    fAODEventIn(0x0),
32    fAODEventOut(0x0),
33    fMCOnly(mcOnly),
34    fRsnEvent(),
35    fInfoList(0x0),
36    fTaskInfo(name)
37 {
38 //
39 // Default constructor.
40 // Define the output slot for histograms.
41 //
42
43    DefineOutput(1, TList::Class());
44    DefineOutput(2, TList::Class());
45 }
46
47 //_____________________________________________________________________________
48 AliRsnVAnalysisTaskSE::AliRsnVAnalysisTaskSE(const AliRsnVAnalysisTaskSE& copy) :
49    AliAnalysisTaskSE(copy),
50    fLogType(copy.fLogType),
51    fLogClassesString(copy.fLogClassesString),
52    fESDEvent(copy.fESDEvent),
53    fMCEvent(copy.fMCEvent),
54    fAODEventIn(copy.fAODEventIn),
55    fAODEventOut(copy.fAODEventOut),
56    fMCOnly(copy.fMCOnly),
57    fRsnEvent(),
58    fInfoList(0x0),
59    fTaskInfo(copy.fTaskInfo)
60 {
61 //
62 // Copy constructor.
63 // Defined for coding conventions compliance but never used.
64 //
65 }
66
67 //_____________________________________________________________________________
68 void AliRsnVAnalysisTaskSE::LocalInit()
69 {
70 //
71 // Local initialization.
72 // Defines the debug message level and calls the mother class LocalInit().
73 //
74
75    AliAnalysisTaskSE::LocalInit();
76    SetDebugForAllClasses();
77 }
78
79 //_____________________________________________________________________________
80 Bool_t AliRsnVAnalysisTaskSE::UserNotify()
81 {
82 //
83 // Calls the mother class Notify()
84 //
85
86    return AliAnalysisTaskSE::UserNotify();
87 }
88
89 //_____________________________________________________________________________
90 void AliRsnVAnalysisTaskSE::ConnectInputData(Option_t *opt)
91 {
92 //
93 // Connect input data, which consist in initializing properly
94 // the pointer to the input event, which is dynamically casted
95 // to all available types, and this allows to know its type.
96 // Calls also the mother class omonyme method.
97 //
98
99    AliAnalysisTaskSE::ConnectInputData(opt);
100
101    // get AliESDEvent and, if successful
102    // retrieve the corresponding MC if exists
103    fESDEvent = dynamic_cast<AliESDEvent *>(fInputEvent);
104    if (fESDEvent) {
105       fMCEvent = (AliMCEvent*) MCEvent();
106       AliInfo(Form("Input event is of type ESD   (%p)", fESDEvent));
107       if (fMCEvent) AliInfo(Form("Input has an associated MC (%p)", fMCEvent));
108    }
109
110    // get AliAODEvent from input and, if successful
111    // it will contain both the reconstructed and MC informations
112    fAODEventIn = dynamic_cast<AliAODEvent *>(fInputEvent);
113    if (fAODEventIn) {
114       AliInfo(Form("Input event if of type native AOD (%p)", fAODEventIn));
115    }
116
117    // get AliAODEvent from output of previous task
118    fAODEventOut = dynamic_cast<AliAODEvent *>(AODEvent());
119    if (fAODEventOut) {
120       AliInfo(Form("Input event if of type produced AOD from previous step (%p)", fAODEventOut));
121    }
122 }
123
124 //_____________________________________________________________________________
125 void AliRsnVAnalysisTaskSE::UserCreateOutputObjects()
126 {
127 //
128 // Creates and links to task all output objects.
129 // Does explicitly the initialization for the event info class,
130 // and then calls the customized function which must be overloaded
131 // in the applications of this base class.
132 //
133
134    SetDebugForAllClasses();
135
136    // set event info outputs
137    fInfoList = new TList();
138    fInfoList->SetOwner();
139    fTaskInfo.GenerateInfoList(fInfoList);
140
141    // create customized outputs
142    RsnUserCreateOutputObjects();
143
144    PostData(1, fInfoList);
145 }
146
147 //_____________________________________________________________________________
148 void AliRsnVAnalysisTaskSE::UserExec(Option_t* opt)
149 {
150 //
151 // Prepares for execution, setting the correct pointers of the
152 // RSN package event interface, which will point to the not NULL
153 // objects obtained from dynamic-casts called in ConnectInputData().
154 //
155
156    if (fMCOnly && fMCEvent) {
157       fRsnEvent.SetRef(fMCEvent);
158       fRsnEvent.SetRefMC(fMCEvent);
159    } else if (fESDEvent) {
160       fRsnEvent.SetRef(fESDEvent);
161       fRsnEvent.SetRefMC(fMCEvent);
162    } else if (fAODEventOut) {
163       fRsnEvent.SetRef(fAODEventOut);
164       fRsnEvent.SetRefMC(fAODEventOut);
165    } else if (fAODEventIn) {
166       fRsnEvent.SetRef(fAODEventIn);
167       fRsnEvent.SetRefMC(fAODEventIn);
168    } else {
169       AliError("Unknown input event format. Skipping");
170       return;
171    }
172
173    // call event preprocessing...
174    Bool_t preCheck = EventProcess();
175    // ...then fill the information object and print informations...
176    fTaskInfo.FillInfo(&fRsnEvent);
177    fTaskInfo.PrintInfo(fTaskInfo.GetNumerOfEventsProcessed());
178    // ...and return if event did not pass selections
179    if (!preCheck) {
180       AliDebug(AliLog::kDebug, "Event preprocessing has failed. Skipping event");
181       return;
182    }
183
184
185    // call customized implementation for execution
186    RsnUserExec(opt);
187
188    // post outputs for the info object
189    // (eventually others are done in the derived classes)
190    PostData(1, fInfoList);
191 }
192
193 //_____________________________________________________________________________
194 void AliRsnVAnalysisTaskSE::Terminate(Option_t* opt)
195 {
196 //
197 // Termination routines.
198 // Stores all histograms (after checking they exist)
199 // and includes to the TList all task informations.
200 //
201
202    AliAnalysisTask::Terminate();
203
204    TList* list  = dynamic_cast<TList*>(GetOutputData(1));
205    if (!list) {
206       AliError(Form("At end of analysis, fOutList is %p", list));
207       return;
208    }
209
210    RsnTerminate(opt);
211
212    TH1I *hEventInfo = (TH1I*) list->FindObject(fTaskInfo.GetEventHistogramName());
213    if (!hEventInfo) {
214       AliError(Form("hEventInfo is %p", hEventInfo));
215       return;
216    }
217    AliInfo(Form("=== %s ==================", GetName()));
218    AliInfo(Form("Number Of Events Processed : %10lld", (Long64_t)hEventInfo->Integral()));
219    AliInfo(Form("Number Of Events Accepted  : %10lld", (Long64_t)hEventInfo->GetBinContent(2)));
220    AliInfo(Form("Number Of Events Skipped   : %10lld", (Long64_t)hEventInfo->GetBinContent(1)));
221    AliInfo(Form("=== end %s ==============", GetName()));
222
223    AliDebug(AliLog::kDebug + 2, "->");
224 }
225
226 //_____________________________________________________________________________
227 void AliRsnVAnalysisTaskSE::RsnUserCreateOutputObjects()
228 {
229 //
230 // Define here all instructions to create output objects.
231 // This method will be called inside the "UserCreateOutputObjects"
232 // in the used task.
233 //
234
235    AliWarning("Implement this in derived classes");
236 }
237
238 //_____________________________________________________________________________
239 void AliRsnVAnalysisTaskSE::RsnUserExec(Option_t*)
240 {
241 //
242 //
243 //
244
245    AliWarning("Implement this in derived classes");
246 }
247
248 //_____________________________________________________________________________
249 void AliRsnVAnalysisTaskSE::RsnTerminate(Option_t*)
250 {
251 //
252 // Overload this to add additional termination operations
253 //
254
255    AliWarning("Implement this in derived classes");
256 }
257
258 //_____________________________________________________________________________
259 Bool_t AliRsnVAnalysisTaskSE::EventProcess()
260 {
261 //
262 // Performs some pre-processing of current event,
263 // which is useful for all the operations which
264 // need to be done only once for each event.
265 //
266
267    // in this case, return always a success
268    return kTRUE;
269 }
270
271 //_____________________________________________________________________________
272 void AliRsnVAnalysisTaskSE::SetDebugForAllClasses()
273 {
274 //
275 // Set debug level for all classes for which it is required
276 //
277
278    TObjArray  *array = fLogClassesString.Tokenize(":");
279    TObjString *objStr;
280    TString     str;
281    Int_t       i, n = array->GetEntriesFast();
282
283    for (i = 0; i < n; i++) {
284       objStr = (TObjString*)array->At(i);
285       str    = objStr->GetString();
286       AliLog::SetClassDebugLevel(str.Data(), fLogType);
287       AliInfo(Form("Setting Debug to %s", str.Data()));
288    }
289 }
290