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);
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));
110 // get AliAODEvent from input and, if successful
111 // it will contain both the reconstructed and MC informations
112 fAODEventIn = dynamic_cast<AliAODEvent *>(fInputEvent);
114 AliInfo(Form("Input event if of type native AOD (%p)", fAODEventIn));
117 // get AliAODEvent from output of previous task
118 fAODEventOut = dynamic_cast<AliAODEvent *>(AODEvent());
120 AliInfo(Form("Input event if of type produced AOD from previous step (%p)", fAODEventOut));
124 //_____________________________________________________________________________
125 void AliRsnVAnalysisTaskSE::UserCreateOutputObjects()
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.
134 SetDebugForAllClasses();
136 // set event info outputs
137 fInfoList = new TList();
138 fInfoList->SetOwner();
139 fTaskInfo.GenerateInfoList(fInfoList);
141 // create customized outputs
142 RsnUserCreateOutputObjects();
144 PostData(1, fInfoList);
147 //_____________________________________________________________________________
148 void AliRsnVAnalysisTaskSE::UserExec(Option_t* opt)
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().
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);
169 AliError("Unknown input event format. Skipping");
173 // since this class is for single-event analysis
174 // both static pointers of AliRsnEvent class
175 // will point to the same unique datamember
176 AliRsnEvent::SetCurrentEvent1(&fRsnEvent, fEntry);
177 AliRsnEvent::SetCurrentEvent2(&fRsnEvent, fEntry);
178 AliRsnTarget::SwitchToFirst();
180 // call event preprocessing...
181 Bool_t preCheck = EventProcess();
182 // ...then fill the information object and print informations...
183 fTaskInfo.FillInfo();
184 fTaskInfo.PrintInfo(fTaskInfo.GetNumerOfEventsProcessed());
185 // ...and return if event did not pass selections
187 AliDebug(AliLog::kDebug, "Event preprocessing has failed. Skipping event");
192 // call customized implementation for execution
195 // post outputs for the info object
196 // (eventually others are done in the derived classes)
197 PostData(1, fInfoList);
200 //_____________________________________________________________________________
201 void AliRsnVAnalysisTaskSE::Terminate(Option_t* opt)
204 // Termination routines.
205 // Stores all histograms (after checking they exist)
206 // and includes to the TList all task informations.
209 AliAnalysisTask::Terminate();
211 TList* list = dynamic_cast<TList*>(GetOutputData(1));
213 AliError(Form("At end of analysis, fOutList is %p", list));
219 TH1I *hEventInfo = (TH1I*) list->FindObject(fTaskInfo.GetEventHistogramName());
221 AliError(Form("hEventInfo is %p", hEventInfo));
224 AliInfo(Form("=== %s ==================", GetName()));
225 AliInfo(Form("Number Of Events Processed : %10lld", (Long64_t)hEventInfo->Integral()));
226 AliInfo(Form("Number Of Events Accepted : %10lld", (Long64_t)hEventInfo->GetBinContent(2)));
227 AliInfo(Form("Number Of Events Skipped : %10lld", (Long64_t)hEventInfo->GetBinContent(1)));
228 AliInfo(Form("=== end %s ==============", GetName()));
230 AliDebug(AliLog::kDebug + 2, "->");
233 //_____________________________________________________________________________
234 void AliRsnVAnalysisTaskSE::RsnUserCreateOutputObjects()
237 // Define here all instructions to create output objects.
238 // This method will be called inside the "UserCreateOutputObjects"
242 AliWarning("Implement this in derived classes");
245 //_____________________________________________________________________________
246 void AliRsnVAnalysisTaskSE::RsnUserExec(Option_t*)
252 AliWarning("Implement this in derived classes");
255 //_____________________________________________________________________________
256 void AliRsnVAnalysisTaskSE::RsnTerminate(Option_t*)
259 // Overload this to add additional termination operations
262 AliWarning("Implement this in derived classes");
265 //_____________________________________________________________________________
266 Bool_t AliRsnVAnalysisTaskSE::EventProcess()
269 // Performs some pre-processing of current event,
270 // which is useful for all the operations which
271 // need to be done only once for each event.
274 // in this case, return always a success
278 //_____________________________________________________________________________
279 void AliRsnVAnalysisTaskSE::SetDebugForAllClasses()
282 // Set debug level for all classes for which it is required
285 TObjArray *array = fLogClassesString.Tokenize(":");
288 Int_t i, n = array->GetEntriesFast();
290 for (i = 0; i < n; i++) {
291 objStr = (TObjString*)array->At(i);
292 str = objStr->GetString();
293 AliLog::SetClassDebugLevel(str.Data(), fLogType);
294 AliInfo(Form("Setting Debug to %s", str.Data()));