2 // Class AliRsnVAnalysisTaskSE
4 // Virtual Class derivated from AliAnalysisTaskSE which will be base class
5 // for all RSN SE tasks
7 // authors: Martin Vala (martin.vala@cern.ch)
8 // Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
11 #include <Riostream.h>
13 #include "AliESDEvent.h"
14 #include "AliMCEvent.h"
15 #include "AliAODEvent.h"
16 #include "AliRsnEvent.h"
17 #include "AliRsnTarget.h"
19 #include "AliRsnVAnalysisTaskSE.h"
21 ClassImp(AliRsnVAnalysisTaskSE)
23 //_____________________________________________________________________________
24 AliRsnVAnalysisTaskSE::AliRsnVAnalysisTaskSE
25 (const char *name, Bool_t mcOnly) :
26 AliAnalysisTaskSE(name),
27 fLogType(AliLog::kInfo),
28 fLogClassesString(""),
39 // Default constructor.
40 // Define the output slot for histograms.
43 DefineOutput(1, TList::Class());
44 DefineOutput(2, TList::Class());
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),
59 fTaskInfo(copy.fTaskInfo)
63 // Defined for coding conventions compliance but never used.
67 //_____________________________________________________________________________
68 void AliRsnVAnalysisTaskSE::LocalInit()
71 // Local initialization.
72 // Defines the debug message level and calls the mother class LocalInit().
75 AliAnalysisTaskSE::LocalInit();
76 SetDebugForAllClasses();
79 //_____________________________________________________________________________
80 Bool_t AliRsnVAnalysisTaskSE::UserNotify()
83 // Calls the mother class Notify()
86 return AliAnalysisTaskSE::UserNotify();
89 //_____________________________________________________________________________
90 void AliRsnVAnalysisTaskSE::ConnectInputData(Option_t *opt)
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.
99 AliAnalysisTaskSE::ConnectInputData(opt);
101 // get AliESDEvent and, if successful
102 // retrieve the corresponding MC if exists
103 fESDEvent = dynamic_cast<AliESDEvent *>(fInputEvent);
106 fMCEvent = (AliMCEvent*) MCEvent();
107 AliInfo(Form("Input event is of type ESD (%p)", fESDEvent));
108 if (fMCEvent) AliInfo(Form("Input has an associated MC (%p)", fMCEvent));
111 // get AliAODEvent from input and, if successful
112 // it will contain both the reconstructed and MC informations
113 fAODEventIn = dynamic_cast<AliAODEvent *>(fInputEvent);
116 AliInfo(Form("Input event if of type native AOD (%p)", fAODEventIn));
119 // get AliAODEvent from output of previous task
120 fAODEventOut = dynamic_cast<AliAODEvent *>(AODEvent());
123 AliInfo(Form("Input event if of type produced AOD from previous step (%p)",fAODEventOut));
127 //_____________________________________________________________________________
128 void AliRsnVAnalysisTaskSE::UserCreateOutputObjects()
131 // Creates and links to task all output objects.
132 // Does explicitly the initialization for the event info class,
133 // and then calls the customized function which must be overloaded
134 // in the applications of this base class.
137 SetDebugForAllClasses();
139 // set event info outputs
140 fInfoList = new TList();
141 fInfoList->SetOwner();
142 fTaskInfo.GenerateInfoList(fInfoList);
144 // create customized outputs
145 RsnUserCreateOutputObjects();
147 PostData(1, fInfoList);
150 //_____________________________________________________________________________
151 void AliRsnVAnalysisTaskSE::UserExec(Option_t* opt)
154 // Prepares for execution, setting the correct pointers of the
155 // RSN package event interface, which will point to the not NULL
156 // objects obtained from dynamic-casts called in ConnectInputData().
159 if (fMCOnly && fMCEvent)
161 fRsnEvent.SetRef (fMCEvent);
162 fRsnEvent.SetRefMC(fMCEvent);
166 fRsnEvent.SetRef (fESDEvent);
167 fRsnEvent.SetRefMC(fMCEvent);
169 else if (fAODEventOut)
171 fRsnEvent.SetRef (fAODEventOut);
172 fRsnEvent.SetRefMC(fAODEventOut);
174 else if (fAODEventIn)
176 fRsnEvent.SetRef (fAODEventIn);
177 fRsnEvent.SetRefMC(fAODEventIn);
181 AliError("Unknown input event format. Skipping");
185 // since this class is for single-event analysis
186 // both static pointers of AliRsnEvent class
187 // will point to the same unique datamember
188 AliRsnEvent::SetCurrentEvent1(&fRsnEvent, fEntry);
189 AliRsnEvent::SetCurrentEvent2(&fRsnEvent, fEntry);
190 AliRsnTarget::SwitchToFirst();
192 // call event preprocessing...
193 Bool_t preCheck = EventProcess();
194 // ...then fill the information object and print informations...
195 fTaskInfo.FillInfo();
196 fTaskInfo.PrintInfo(fTaskInfo.GetNumerOfEventsProcessed());
197 // ...and return if event did not pass selections
200 AliDebug(AliLog::kDebug, "Event preprocessing has failed. Skipping event");
205 // call customized implementation for execution
208 // post outputs for the info object
209 // (eventually others are done in the derived classes)
210 PostData(1, fInfoList);
213 //_____________________________________________________________________________
214 void AliRsnVAnalysisTaskSE::Terminate(Option_t* opt)
217 // Termination routines.
218 // Stores all histograms (after checking they exist)
219 // and includes to the TList all task informations.
222 AliAnalysisTask::Terminate();
224 TList* list = dynamic_cast<TList*>(GetOutputData(1));
227 AliError(Form("At end of analysis, fOutList is %p", list));
233 TH1I *hEventInfo = (TH1I*) list->FindObject(fTaskInfo.GetEventHistogramName());
236 AliError(Form("hEventInfo is %p", hEventInfo));
239 AliInfo(Form("=== %s ==================",GetName()));
240 AliInfo(Form("Number Of Events Processed : %10lld",(Long64_t)hEventInfo->Integral()));
241 AliInfo(Form("Number Of Events Accepted : %10lld",(Long64_t)hEventInfo->GetBinContent(2)));
242 AliInfo(Form("Number Of Events Skipped : %10lld",(Long64_t)hEventInfo->GetBinContent(1)));
243 AliInfo(Form("=== end %s ==============",GetName()));
245 AliDebug(AliLog::kDebug+2, "->");
248 //_____________________________________________________________________________
249 void AliRsnVAnalysisTaskSE::RsnUserCreateOutputObjects()
252 // Define here all instructions to create output objects.
253 // This method will be called inside the "UserCreateOutputObjects"
257 AliWarning("Implement this in derived classes");
260 //_____________________________________________________________________________
261 void AliRsnVAnalysisTaskSE::RsnUserExec(Option_t*)
267 AliWarning("Implement this in derived classes");
270 //_____________________________________________________________________________
271 void AliRsnVAnalysisTaskSE::RsnTerminate(Option_t*)
274 // Overload this to add additional termination operations
277 AliWarning("Implement this in derived classes");
280 //_____________________________________________________________________________
281 Bool_t AliRsnVAnalysisTaskSE::EventProcess()
284 // Performs some pre-processing of current event,
285 // which is useful for all the operations which
286 // need to be done only once for each event.
289 // in this case, return always a success
293 //_____________________________________________________________________________
294 void AliRsnVAnalysisTaskSE::SetDebugForAllClasses()
297 // Set debug level for all classes for which it is required
300 TObjArray *array = fLogClassesString.Tokenize(":");
303 Int_t i, n = array->GetEntriesFast();
305 for (i = 0; i < n; i++)
307 objStr = (TObjString*)array->At(i);
308 str = objStr->GetString();
309 AliLog::SetClassDebugLevel(str.Data(), fLogType);
310 AliInfo(Form("Setting Debug to %s", str.Data()));