1 #include <TEntryList.h>
4 #include "AliAnalysisManager.h"
5 #include "AliMultiInputEventHandler.h"
6 #include "AliMixInputEventHandler.h"
7 #include "AliMCEventHandler.h"
9 #include "AliRsnEvent.h"
10 #include "AliRsnLoop.h"
11 #include "AliRsnInputHandler.h"
13 #include "AliRsnAnalysisTask.h"
15 ClassImp(AliRsnAnalysisTask)
17 //__________________________________________________________________________________________________
18 AliRsnAnalysisTask::AliRsnAnalysisTask() :
27 // Dummy constructor ALWAYS needed for I/O.
31 //__________________________________________________________________________________________________
32 AliRsnAnalysisTask::AliRsnAnalysisTask(const char *name) :
33 AliAnalysisTaskSE(name),
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
47 DefineOutput(1, TList::Class());
50 //__________________________________________________________________________________________________
51 AliRsnAnalysisTask::AliRsnAnalysisTask(const AliRsnAnalysisTask ©) :
52 AliAnalysisTaskSE(copy),
54 fRsnObjects(copy.fRsnObjects),
55 fInputEHMain(copy.fInputEHMain),
56 fInputEHMix(copy.fInputEHMix),
57 fBigOutput(copy.fBigOutput)
61 // Implemented as requested by C++ standards.
62 // Can be used in PROOF and by plugins.
66 //__________________________________________________________________________________________________
67 AliRsnAnalysisTask &AliRsnAnalysisTask::operator=(const AliRsnAnalysisTask ©)
70 // Assignment operator.
71 // Implemented as requested by C++ standards.
72 // Can be used in PROOF and by plugins.
74 AliAnalysisTaskSE::operator=(copy);
77 fRsnObjects = copy.fRsnObjects;
78 fInputEHMain = copy.fInputEHMain;
79 fInputEHMix = copy.fInputEHMix;
80 fBigOutput = copy.fBigOutput;
85 //__________________________________________________________________________________________________
86 AliRsnAnalysisTask::~AliRsnAnalysisTask()
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.
94 if (fOutput && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
99 //__________________________________________________________________________________________________
100 void AliRsnAnalysisTask::AddLoop(AliRsnLoop *obj)
103 // Add new computation object
106 fRsnObjects.Add(obj);
109 //__________________________________________________________________________________________________
110 void AliRsnAnalysisTask::UserCreateOutputObjects()
113 // Initialization of outputs.
114 // This is called once per worker node.
117 // sets all Inuput Handler pointers
120 // create list and set it as owner of its content (MANDATORY)
121 if (fBigOutput) OpenFile(1);
122 fOutput = new TList();
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);
133 TObjArrayIter nextIH(fInputEHMain->InputEventHandlers());
135 while ( (obj = nextIH()) ) {
136 if (obj->IsA() == AliRsnInputHandler::Class()) {
137 AliRsnInputHandler *rsnIH = (AliRsnInputHandler *) obj;
138 AliRsnDaughterSelector *s = rsnIH->GetSelector();
139 TClonesArray *c = s->GetCutSetC();
140 for (Int_t is = 0; is < c->GetEntries(); is++) {
141 AliRsnCutSet *cuts = (AliRsnCutSet *)c->At(is);
149 // post data for ALL output slots >0 here, to get at least an empty histogram
150 PostData(1, fOutput);
153 //__________________________________________________________________________________________________
154 void AliRsnAnalysisTask::UserExec(Option_t *)
157 // Main loop for single-event computations.
158 // It is called for each event and executes the 'DoLoop'
159 // function of all AliRsnLoop instances stored here.
162 AliRsnEvent *evMain = 0x0;
163 AliRsnInputHandler *rsnIH = 0x0;
166 TObjArrayIter next(fInputEHMain->InputEventHandlers());
168 while ( (obj = next()) ) {
169 if (obj->IsA() == AliRsnInputHandler::Class()) {
170 rsnIH = (AliRsnInputHandler *)obj;
171 //AliInfo(Form("Found object '%s' which is RSN input handler", obj->GetName()));
172 evMain = rsnIH->GetRsnEvent();
180 TObjArrayIter next(&fRsnObjects);
181 AliRsnLoop *obj = 0x0;
182 while ( (obj = (AliRsnLoop *)next()) ) {
183 if (obj->IsMixed()) continue;
184 obj->DoLoop(evMain, rsnIH->GetSelector());
187 PostData(1, fOutput);
190 //__________________________________________________________________________________________________
191 void AliRsnAnalysisTask::UserExecMix(Option_t *)
194 // Main loop for event-mixing computations
195 // It is called for each pair of matched events
196 // and executes the 'DoLoop' function of all AliRsnLoop instances stored here.
199 AliRsnEvent *evMain = 0x0;
200 AliRsnEvent *evMix = 0x0;
202 AliRsnInputHandler *rsnIH = 0x0, *rsnMixIH = 0x0;
205 TObjArrayIter next(fInputEHMain->InputEventHandlers());
207 while ( (obj = next()) ) {
208 if (obj->IsA() == AliRsnInputHandler::Class()) {
209 rsnIH = (AliRsnInputHandler *)obj;
210 //AliInfo(Form("Found object '%s' which is RSN input handler", obj->GetName()));
211 evMain = rsnIH->GetRsnEvent();
212 id = fInputEHMain->InputEventHandlers()->IndexOf(obj);
220 // gets first input handler form mixing buffer
221 AliMultiInputEventHandler *ihMultiMix = dynamic_cast<AliMultiInputEventHandler *>(fInputEHMix->InputEventHandler(0));
223 rsnMixIH = dynamic_cast<AliRsnInputHandler *>(ihMultiMix->InputEventHandler(id));
225 evMix = rsnMixIH->GetRsnEvent();
228 TObjArrayIter next(&fRsnObjects);
229 AliRsnLoop *obj = 0x0;
230 while ( (obj = (AliRsnLoop *)next()) ) {
231 if (!obj->IsMixed()) continue;
232 obj->DoLoop(evMain, rsnIH->GetSelector(), evMix, rsnMixIH->GetSelector());
237 PostData(1, fOutput);
240 //________________________________________________________________________
241 void AliRsnAnalysisTask::Terminate(Option_t *)
244 // Draw result to screen, or perform fitting, normalizations
245 // Called once at the end of the query
248 fOutput = dynamic_cast<TList *>(GetOutputData(1));
249 if (!fOutput) { AliError("Could not retrieve TList fOutput"); return; }
252 //_____________________________________________________________________________
253 void AliRsnAnalysisTask::InitInputHandlers()
256 // Sets needed input handlers
258 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
259 fInputEHMain = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
261 fInputEHMix = dynamic_cast<AliMixInputEventHandler *>(fInputEHMain->GetFirstMultiInputHandler());