Added AliRsnCutEventUtils class: interface to /Users/bellini/alisoft/aliroot/last_tru...
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / AliRsnAnalysisTask.cxx
1 #include <TEntryList.h>
2
3 #include "AliLog.h"
4 #include "AliAnalysisManager.h"
5 #include "AliMultiInputEventHandler.h"
6 #include "AliMixInputEventHandler.h"
7 #include "AliMCEventHandler.h"
8
9 #include "AliRsnEvent.h"
10 #include "AliRsnLoop.h"
11 #include "AliRsnInputHandler.h"
12
13 #include "AliRsnAnalysisTask.h"
14
15 ClassImp(AliRsnAnalysisTask)
16
17 //__________________________________________________________________________________________________
18 AliRsnAnalysisTask::AliRsnAnalysisTask() :
19    AliAnalysisTaskSE(),
20    fOutput(0),
21    fRsnObjects(0),
22    fInputEHMain(0),
23    fInputEHMix(0),
24    fBigOutput(kFALSE)
25 {
26 //
27 // Dummy constructor ALWAYS needed for I/O.
28 //
29 }
30
31 //__________________________________________________________________________________________________
32 AliRsnAnalysisTask::AliRsnAnalysisTask(const char *name) :
33    AliAnalysisTaskSE(name),
34    fOutput(0),
35    fRsnObjects(0),
36    fInputEHMain(0),
37    fInputEHMix(0),
38    fBigOutput(kFALSE)
39 {
40 //
41 // Default constructor.
42 // Define input and output slots here (never in the dummy constructor)
43 // Input slot #0 works with a TChain - it is connected to the default input container
44 // Output slot #1 writes into a TH1 container
45 //
46
47    DefineOutput(1, TList::Class());
48 }
49
50 //__________________________________________________________________________________________________
51 AliRsnAnalysisTask::AliRsnAnalysisTask(const AliRsnAnalysisTask &copy) :
52    AliAnalysisTaskSE(copy),
53    fOutput(0),
54    fRsnObjects(copy.fRsnObjects),
55    fInputEHMain(copy.fInputEHMain),
56    fInputEHMix(copy.fInputEHMix),
57    fBigOutput(copy.fBigOutput)
58 {
59 //
60 // Copy constructor.
61 // Implemented as requested by C++ standards.
62 // Can be used in PROOF and by plugins.
63 //
64 }
65
66 //__________________________________________________________________________________________________
67 AliRsnAnalysisTask &AliRsnAnalysisTask::operator=(const AliRsnAnalysisTask &copy)
68 {
69 //
70 // Assignment operator.
71 // Implemented as requested by C++ standards.
72 // Can be used in PROOF and by plugins.
73 //
74    AliAnalysisTaskSE::operator=(copy);
75    if (this == &copy)
76       return *this;
77    fRsnObjects = copy.fRsnObjects;
78    fInputEHMain = copy.fInputEHMain;
79    fInputEHMix = copy.fInputEHMix;
80    fBigOutput = copy.fBigOutput;
81
82    return (*this);
83 }
84
85 //__________________________________________________________________________________________________
86 AliRsnAnalysisTask::~AliRsnAnalysisTask()
87 {
88 //
89 // Destructor.
90 // Clean-up the output list, but not the histograms that are put inside
91 // (the list is owner and will clean-up these histograms). Protect in PROOF case.
92 //
93
94    if (fOutput && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
95       delete fOutput;
96    }
97 }
98
99 //__________________________________________________________________________________________________
100 void AliRsnAnalysisTask::AddLoop(AliRsnLoop *obj)
101 {
102 //
103 // Add new computation object
104 //
105
106    fRsnObjects.Add(obj);
107 }
108
109 //__________________________________________________________________________________________________
110 void AliRsnAnalysisTask::UserCreateOutputObjects()
111 {
112 //
113 // Initialization of outputs.
114 // This is called once per worker node.
115 //
116
117    // sets all Inuput Handler pointers
118    InitInputHandlers();
119
120    // create list and set it as owner of its content (MANDATORY)
121    if (fBigOutput) OpenFile(1);
122    fOutput = new TList();
123    fOutput->SetOwner();
124
125    // loop on computators and initialize all their outputs
126    TObjArrayIter next(&fRsnObjects);
127    AliRsnLoop *objLoop = 0x0;
128    while ( (objLoop = (AliRsnLoop *)next()) ) {
129       objLoop->Init(GetName(), fOutput);
130    }
131
132    if (fInputEHMain) {
133       TObjArrayIter nextIH(fInputEHMain->InputEventHandlers());
134       TObject *obj = 0x0;
135       AliRsnInputHandler *rsnIH;
136       AliRsnDaughterSelector *s;
137       TClonesArray *c;
138       AliRsnCutSet *cuts;
139       while ( (obj = nextIH()) ) {
140          if (obj->IsA() == AliRsnInputHandler::Class()) {
141             rsnIH = (AliRsnInputHandler *) obj;
142             s = rsnIH->GetSelector();
143             s->InitActions(fOutput);
144             c = s->GetCutSetC();
145             for (Int_t is = 0; is < c->GetEntries(); is++) {
146                cuts = (AliRsnCutSet *)c->At(is);
147                cuts->Init(fOutput);
148             }
149          }
150       }
151    }
152
153
154    // post data for ALL output slots >0 here, to get at least an empty histogram
155    PostData(1, fOutput);
156 }
157
158 //__________________________________________________________________________________________________
159 void AliRsnAnalysisTask::UserExec(Option_t *)
160 {
161 //
162 // Main loop for single-event computations.
163 // It is called for each event and executes the 'DoLoop'
164 // function of all AliRsnLoop instances stored here.
165 //
166
167    AliRsnEvent *evMain = 0x0;
168    AliRsnInputHandler *rsnIH = 0x0;
169
170    if (fInputEHMain) {
171       TObjArrayIter next(fInputEHMain->InputEventHandlers());
172       TObject *obj = 0x0;
173       while ( (obj = next()) ) {
174          if (obj->IsA() == AliRsnInputHandler::Class()) {
175             rsnIH = (AliRsnInputHandler *)obj;
176             //AliInfo(Form("Found object '%s' which is RSN input handler", obj->GetName()));
177             evMain = rsnIH->GetRsnEvent();
178             break;
179          }
180       }
181    }
182
183    if (!evMain) return;
184
185    TObjArrayIter next(&fRsnObjects);
186    AliRsnLoop *obj = 0x0;
187    while ( (obj = (AliRsnLoop *)next()) ) {
188       if (obj->IsMixed()) continue;
189       obj->DoLoop(evMain, rsnIH->GetSelector());
190    }
191
192    PostData(1, fOutput);
193 }
194
195 //__________________________________________________________________________________________________
196 void AliRsnAnalysisTask::UserExecMix(Option_t *)
197 {
198 //
199 // Main loop for event-mixing computations
200 // It is called for each pair of matched events
201 // and executes the 'DoLoop' function of all AliRsnLoop instances stored here.
202 //
203
204    AliRsnEvent *evMain = 0x0;
205    AliRsnEvent *evMix  = 0x0;
206    Int_t        id     = -1;
207    AliRsnInputHandler *rsnIH = 0x0, *rsnMixIH = 0x0;
208
209    if (fInputEHMain) {
210       TObjArrayIter next(fInputEHMain->InputEventHandlers());
211       TObject *obj = 0x0;
212       while ( (obj = next()) ) {
213          if (obj->IsA() == AliRsnInputHandler::Class()) {
214             rsnIH = (AliRsnInputHandler *)obj;
215             //AliInfo(Form("Found object '%s' which is RSN input handler", obj->GetName()));
216             evMain = rsnIH->GetRsnEvent();
217             id = fInputEHMain->InputEventHandlers()->IndexOf(obj);
218             break;
219          }
220       }
221    }
222
223    if (!evMain) return;
224
225    // gets first input handler form mixing buffer
226    AliMultiInputEventHandler *ihMultiMix = dynamic_cast<AliMultiInputEventHandler *>(fInputEHMix->InputEventHandler(0));
227    if (ihMultiMix) {
228       rsnMixIH = dynamic_cast<AliRsnInputHandler *>(ihMultiMix->InputEventHandler(id));
229       if (rsnMixIH) {
230          evMix = rsnMixIH->GetRsnEvent();
231          if (!evMix) return;
232
233          TObjArrayIter next(&fRsnObjects);
234          AliRsnLoop *obj = 0x0;
235          while ( (obj = (AliRsnLoop *)next()) ) {
236             if (!obj->IsMixed()) continue;
237             obj->DoLoop(evMain, rsnIH->GetSelector(), evMix, rsnMixIH->GetSelector());
238          }
239       }
240    }
241
242    PostData(1, fOutput);
243 }
244
245 //________________________________________________________________________
246 void AliRsnAnalysisTask::Terminate(Option_t *)
247 {
248 //
249 // Draw result to screen, or perform fitting, normalizations
250 // Called once at the end of the query
251 //
252
253    fOutput = dynamic_cast<TList *>(GetOutputData(1));
254    if (!fOutput) { AliError("Could not retrieve TList fOutput"); return; }
255 }
256
257 //_____________________________________________________________________________
258 void AliRsnAnalysisTask::InitInputHandlers()
259 {
260 //
261 // Sets needed input handlers
262 //
263    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
264    fInputEHMain = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
265    if (fInputEHMain) {
266       fInputEHMix = dynamic_cast<AliMixInputEventHandler *>(fInputEHMain->GetFirstMultiInputHandler());
267    }
268 }
269