2 // Class AliMixEventInputHandler
4 // Mixing input handler prepare N events before UserExec
7 // Martin Vala (martin.vala@cern.ch)
12 #include <TEntryList.h>
13 #include <TChainElement.h>
17 #include "AliAnalysisManager.h"
18 #include "AliInputEventHandler.h"
20 #include "AliMixEventPool.h"
21 #include "AliMixInputEventHandler.h"
22 #include "AliMixInputHandlerInfo.h"
24 #include "AliAnalysisTaskSE.h"
26 ClassImp(AliMixInputEventHandler)
28 AliMixInputEventHandler::AliMixInputEventHandler(const Int_t size, const Int_t mixNum): AliMultiInputEventHandler(size),
30 fTreeMap(size > 0 ? size : 1),
31 fMixIntupHandlerInfoTmp(0),
36 fUseDefautProcess(kFALSE),
37 fUsePreMixEvents(kTRUE),
44 // Default constructor.
46 AliDebug(AliLog::kDebug + 10, "<-");
47 fMixTrees.SetOwner(kTRUE);
49 AliDebug(AliLog::kDebug + 10, "->");
52 //_____________________________________________________________________________
53 AliInputEventHandler *AliMixInputEventHandler::InputEventHandler(const Int_t index)
56 // Returns input handler
58 AliDebug(AliLog::kDebug + 5, Form("<-"));
59 if ((index >= 0) && (index < fBufferSize)) {
60 AliMultiInputEventHandler *eh = dynamic_cast<AliMultiInputEventHandler *>(fInputHandlers.At(index));
62 return (AliInputEventHandler *) eh;
63 // return (AliInputEventHandler *) eh->InputEventHandler(0);
65 return (AliInputEventHandler *) fInputHandlers.At(index);
67 AliDebug(AliLog::kDebug + 5, Form("->"));
70 //_____________________________________________________________________________
71 void AliMixInputEventHandler::SetInputHandlerForMixing(const AliInputEventHandler *const inHandler)
74 // Create N (fBufferSize) copies of input handler
76 AliDebug(AliLog::kDebug + 5, Form("<-"));
77 fInputHandlers.Clear();
78 AliDebug(AliLog::kDebug + 5, Form("Creating %d input event handlers ...", fBufferSize));
79 for (Int_t i = 0; i < fBufferSize; i++) {
80 AliDebug(AliLog::kDebug + 5, Form("Adding %d ...", i));
81 fInputHandlers.Add((AliInputEventHandler *) inHandler->Clone());
83 AliDebug(AliLog::kDebug + 5, Form("->"));
86 //_____________________________________________________________________________
87 Bool_t AliMixInputEventHandler::Init(TTree *tree, Option_t *opt)
90 // Init(const char*path) is called for all mix input handlers.
91 // Create event pool if needed
93 AliDebug(AliLog::kDebug + 5, Form("<- %p %s", (void *)tree, opt));
96 AliDebug(AliLog::kDebug + 5, Form("->"));
99 // clears array of input handlers
101 // create AliMixInputHandlerInfo
102 if (!fMixIntupHandlerInfoTmp) {
103 // loads first file TChain (tree)
105 fMixIntupHandlerInfoTmp = new AliMixInputHandlerInfo(tree->GetName());
107 AliDebug(AliLog::kDebug + 5, Form("->"));
110 //_____________________________________________________________________________
111 Bool_t AliMixInputEventHandler::Notify()
114 // Notify() is called for all mix input handlers
116 AliDebug(AliLog::kDebug + 5, Form("<-"));
117 if (fUseDefautProcess) {
118 AliDebug(AliLog::kDebug, Form("-> SKIPPED"));
119 return AliMultiInputEventHandler::Notify();
121 AliDebug(AliLog::kDebug + 5, Form("->"));
125 //_____________________________________________________________________________
126 Bool_t AliMixInputEventHandler::Notify(const char *path)
129 // Notify(const char*path) is called for all mix input handlers
131 AliDebug(AliLog::kDebug + 5, Form("<- %s", path));
133 fMixIntupHandlerInfoTmp->AddTreeToChain(path);
134 Int_t lastIndex = fMixIntupHandlerInfoTmp->GetChain()->GetListOfFiles()->GetEntries();
135 TChainElement *che = (TChainElement *)fMixIntupHandlerInfoTmp->GetChain()->GetListOfFiles()->At(lastIndex - 1);
136 AliMixInputHandlerInfo *mixIHI = 0;
137 for (Int_t i = 0; i < fInputHandlers.GetEntries(); i++) {
138 AliDebug(AliLog::kDebug + 5, Form("fInputHandlers[%d]", i));
139 mixIHI = new AliMixInputHandlerInfo(fMixIntupHandlerInfoTmp->GetName(), fMixIntupHandlerInfoTmp->GetTitle());
140 mixIHI->PrepareEntry(che, -1, InputEventHandler(i), fAnalysisType);
141 AliDebug(AliLog::kDebug + 5, Form("chain[%d]->GetEntries() = %lld", i, mixIHI->GetChain()->GetEntries()));
142 fMixTrees.Add(mixIHI);
144 AliDebug(AliLog::kDebug + 5, Form("fEntryCounter=%lld", fEntryCounter));
145 if (fEventPool && fEventPool->NeedInit())
147 if (fUseDefautProcess) {
148 AliDebug(AliLog::kDebug, Form("-> SKIPPED"));
149 return AliMultiInputEventHandler::Notify(path);
151 AliDebug(AliLog::kDebug + 5, Form("->"));
155 //_____________________________________________________________________________
156 Bool_t AliMixInputEventHandler::BeginEvent(Long64_t entry)
159 // BeginEvent(Long64_t entry) is called for all mix input handlers
161 AliDebug(AliLog::kDebug + 5, Form("-> %lld", entry));
162 if (fUseDefautProcess) {
163 AliDebug(AliLog::kDebug, Form("-> SKIPPED"));
164 AliMultiInputEventHandler::BeginEvent(entry);/* return GetEntry();*/
166 AliDebug(AliLog::kDebug + 5, Form("->"));
169 //_____________________________________________________________________________
170 Bool_t AliMixInputEventHandler::GetEntry()
173 // All mixed events are set
175 AliDebug(AliLog::kDebug + 5, Form("<-"));
180 // if buffer size is higher then 1
181 else if (fBufferSize > 1) {
184 // if mix number is higher then 0 and buffer size is 1
185 else if (fMixNumber > 0) {
186 MixEventsMoreTimesWithOneEvent();
188 AliWarning("Not supported Mixing !!!");
190 AliDebug(AliLog::kDebug + 5, Form("->"));
194 //_____________________________________________________________________________
195 Bool_t AliMixInputEventHandler::MixStd()
198 // Mix std - No event pool
200 AliDebug(AliLog::kDebug + 5, Form("<-"));
201 AliDebug(AliLog::kDebug + 1, "Mix method");
202 // get correct handler
203 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
204 AliMultiInputEventHandler *mh = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
205 AliInputEventHandler *inEvHMain = 0;
206 if (mh) inEvHMain = dynamic_cast<AliInputEventHandler *>(mh->GetFirstInputEventHandler());
207 else inEvHMain = dynamic_cast<AliInputEventHandler *>(mgr->GetInputEventHandler());
208 if (!inEvHMain) return kFALSE;
210 // check for PhysSelection
211 if (!IsEventCurrentSelected()) return kFALSE;
213 // return in case of 0 entry in full chain
214 if (!fEntryCounter) {
215 AliDebug(AliLog::kDebug + 3, Form("-> fEntryCounter == 0"));
216 // runs UserExecMix for all tasks, if needed
217 UserExecMixAllTasks(fEntryCounter, 1, fEntryCounter, -1, 0);
221 Int_t mixNum = fMixNumber;
222 if (fUsePreMixEvents) {
223 if (fEntryCounter <= 2 * fMixNumber) mixNum = 2 * fMixNumber + 2;
226 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ BEGIN SETUP EVENT %lld +++++++++++++++++++", fEntryCounter));
229 AliMixInputHandlerInfo *mihi = 0;
230 Long64_t entryMix = 0, entryMixReal = 0;
232 for (counter = 0; counter < mixNum; counter++) {
233 entryMix = fEntryCounter - 1 - counter ;
234 AliDebug(AliLog::kDebug + 5, Form("Handler[%d] entryMix %lld ", counter, entryMix));
235 if (entryMix < 0) break;
236 entryMixReal = entryMix;
237 mihi = (AliMixInputHandlerInfo *) fMixTrees.At(0);
238 TChainElement *te = fMixIntupHandlerInfoTmp->GetEntryInTree(entryMix);
240 AliError("te is null. this is error. tell to developer (#1)")
242 mihi->PrepareEntry(te, entryMix, InputEventHandler(0), fAnalysisType);
243 // runs UserExecMix for all tasks
245 UserExecMixAllTasks(fEntryCounter, 1, fEntryCounter, entryMixReal, fNumberMixed);
246 InputEventHandler(0)->FinishEvent();
249 AliDebug(AliLog::kDebug + 3, Form("fEntryCounter=%lld fMixEventNumber=%d", fEntryCounter, fNumberMixed));
250 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld +++++++++++++++++++", fEntryCounter));
251 AliDebug(AliLog::kDebug + 5, Form("->"));
252 AliDebug(AliLog::kDebug + 5, Form("->"));
256 //_____________________________________________________________________________
257 Bool_t AliMixInputEventHandler::MixBuffer()
260 // Mix in event buffer
262 AliDebug(AliLog::kDebug + 5, Form("<-"));
263 AliDebug(AliLog::kDebug + 1, "Mix method");
264 // get correct handler
265 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
266 AliMultiInputEventHandler *mh = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
267 AliInputEventHandler *inEvHMain = 0;
268 if (mh) inEvHMain = dynamic_cast<AliInputEventHandler *>(mh->GetFirstInputEventHandler());
269 else inEvHMain = dynamic_cast<AliInputEventHandler *>(mgr->GetInputEventHandler());
270 if (!inEvHMain) return kFALSE;
272 // check for PhysSelection
273 if (!IsEventCurrentSelected()) return kFALSE;
275 // find out zero chain entries
276 Long64_t zeroChainEntries = fMixIntupHandlerInfoTmp->GetChain()->GetEntries() - inEvHMain->GetTree()->GetTree()->GetEntries();
278 Long64_t currentMainEntry = inEvHMain->GetTree()->GetTree()->GetReadEntry() + zeroChainEntries;
280 if (fEventPool && inEvHMain) fEventPool->AddEntry(currentMainEntry, inEvHMain->GetEvent());
282 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ BEGIN SETUP EVENT %lld +++++++++++++++++++", fEntryCounter));
287 Int_t idEntryList = -1;
288 if (fEventPool) el = fEventPool->FindEntryList(inEvHMain->GetEvent(), idEntryList);
289 // return in case of 0 entry in full chain
290 if (!fEntryCounter) {
291 AliDebug(AliLog::kDebug + 3, Form("-> fEntryCounter == 0"));
292 // runs UserExecMix for all tasks, if needed
293 if (el) UserExecMixAllTasks(fEntryCounter, idEntryList, currentMainEntry, -1, 0);
294 else UserExecMixAllTasks(fEntryCounter, -1, currentMainEntry, -1, 0);
298 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld SKIPPED (el null) +++++++++++++++++++", fEntryCounter));
299 UserExecMixAllTasks(fEntryCounter, -1, fEntryCounter, -1, 0);
303 if (elNum < fBufferSize + 1) {
304 UserExecMixAllTasks(fEntryCounter, idEntryList, currentMainEntry, -1, 0);
305 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld SKIPPED (%lld) +++++++++++++++++++", fEntryCounter, elNum));
309 AliMixInputHandlerInfo *mihi = 0;
310 Long64_t entryMix = 0, entryMixReal = 0;
312 AliInputEventHandler *eh = 0;
313 TObjArrayIter next(&fInputHandlers);
314 while ((eh = dynamic_cast<AliInputEventHandler *>(next()))) {
315 if (fEventPool && fEventPool->GetListOfEventCuts()->GetEntries() > 0) {
317 if (elNum >= fBufferSize) {
318 Long64_t entryInEntryList = elNum - 2 - counter;
319 if (entryInEntryList < 0) break;
320 entryMix = el->GetEntry(entryInEntryList);
323 AliDebug(AliLog::kDebug + 5, Form("Handler[%d] entryMix %lld ", counter, entryMix));
325 UserExecMixAllTasks(fEntryCounter, -1, currentMainEntry, -1, 0);
328 entryMixReal = entryMix;
329 mihi = (AliMixInputHandlerInfo *) fMixTrees.At(counter);
330 TChainElement *te = fMixIntupHandlerInfoTmp->GetEntryInTree(entryMix);
332 AliError("te is null. this is error. tell to developer (#1)")
334 AliDebug(AliLog::kDebug + 3, Form("Preparing InputEventHandler(%d)", counter));
335 mihi->PrepareEntry(te, entryMix, InputEventHandler(counter), fAnalysisType);
336 // runs UserExecMix for all tasks
337 UserExecMixAllTasks(fEntryCounter, idEntryList, fEntryCounter, entryMixReal, counter);
342 AliDebug(AliLog::kDebug + 3, Form("fEntryCounter=%lld fMixEventNumber=%d", fEntryCounter, fNumberMixed));
343 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld +++++++++++++++++++", fEntryCounter));
344 AliDebug(AliLog::kDebug + 5, Form("->"));
345 AliDebug(AliLog::kDebug + 5, Form("->"));
349 //_____________________________________________________________________________
350 Bool_t AliMixInputEventHandler::MixEventsMoreTimesWithOneEvent()
353 // Mix in history with one event in buffer
355 AliDebug(AliLog::kDebug + 5, "<-");
356 AliDebug(AliLog::kDebug + 1, "Mix method");
357 // get correct handler
358 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
359 AliMultiInputEventHandler *mh = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
360 AliInputEventHandler *inEvHMain = 0;
361 if (mh) inEvHMain = dynamic_cast<AliInputEventHandler *>(mh->GetFirstInputEventHandler());
362 else inEvHMain = dynamic_cast<AliInputEventHandler *>(mgr->GetInputEventHandler());
363 if (!inEvHMain) return kFALSE;
365 // check for PhysSelection
366 if (!IsEventCurrentSelected()) return kFALSE;
368 // find out zero chain entries
369 Long64_t zeroChainEntries = fMixIntupHandlerInfoTmp->GetChain()->GetEntries() - inEvHMain->GetTree()->GetTree()->GetEntries();
371 Long64_t currentMainEntry = inEvHMain->GetTree()->GetTree()->GetReadEntry() + zeroChainEntries;
372 if (fEventPool && inEvHMain) fEventPool->AddEntry(currentMainEntry, inEvHMain->GetEvent());
374 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ BEGIN SETUP EVENT %lld +++++++++++++++++++", fEntryCounter));
378 Int_t idEntryList = -1;
380 if (fEventPool) el = fEventPool->FindEntryList(inEvHMain->GetEvent(), idEntryList);
381 // return in case of 0 entry in full chain
382 if (!fEntryCounter) {
383 // runs UserExecMix for all tasks, if needed
384 if (el) UserExecMixAllTasks(fEntryCounter, idEntryList, currentMainEntry, -1, 0);
385 else UserExecMixAllTasks(fEntryCounter, -1, currentMainEntry, -1, 0);
386 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld SKIPPED (fEntryCounter=0, idEntryList=%d) +++++++++++++++++++", fEntryCounter, idEntryList));
391 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld SKIPPED (el null, idEntryList=%d) +++++++++++++++++++", fEntryCounter, idEntryList));
392 UserExecMixAllTasks(fEntryCounter, -1, currentMainEntry, -1, 0);
397 if (elNum < fBufferSize + 1) {
398 UserExecMixAllTasks(fEntryCounter, idEntryList, currentMainEntry, -1, 0);
399 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld SKIPPED [FIRST ENTRY in el] (elnum=%lld, idEntryList=%d) +++++++++++++++++++", fEntryCounter, elNum, idEntryList));
404 Int_t mixNum = fMixNumber;
405 if (fUsePreMixEvents) {
406 if (elNum <= 2 * fMixNumber + 1) mixNum = elNum + 1;
408 AliMixInputHandlerInfo *mihi = 0;
409 Long64_t entryMix = 0, entryMixReal = 0;
411 mihi = (AliMixInputHandlerInfo *) fMixTrees.At(0);
412 // fills num for main events
413 for (counter = 0; counter < mixNum; counter++) {
414 Long64_t entryInEntryList = elNum - 2 - counter;
415 AliDebug(AliLog::kDebug + 3, Form("entryInEntryList=%lld", entryInEntryList));
416 if (entryInEntryList < 0) break;
417 entryMix = el->GetEntry(entryInEntryList);
418 AliDebug(AliLog::kDebug + 3, Form("entryMix=%lld", entryMix));
419 if (entryMix < 0) break;
420 entryMixReal = entryMix;
421 TChainElement *te = fMixIntupHandlerInfoTmp->GetEntryInTree(entryMix);
423 AliError("te is null. this is error. tell to developer (#2)")
425 mihi->PrepareEntry(te, entryMix, InputEventHandler(0), fAnalysisType);
426 // runs UserExecMix for all tasks
428 UserExecMixAllTasks(fEntryCounter, idEntryList, currentMainEntry, entryMixReal, fNumberMixed);
429 InputEventHandler(0)->FinishEvent();
432 AliDebug(AliLog::kDebug + 3, Form("fEntryCounter=%lld fMixEventNumber=%d", fEntryCounter, fNumberMixed));
433 AliDebug(AliLog::kDebug + 3, Form("++++++++++++++ END SETUP EVENT %lld +++++++++++++++++++", fEntryCounter));
434 AliDebug(AliLog::kDebug + 5, Form("->"));
435 AliDebug(AliLog::kDebug + 5, Form("->"));
439 //_____________________________________________________________________________
440 Bool_t AliMixInputEventHandler::MixEventsMoreTimesWithBuffer()
443 // Mix more events in buffer with mixing with history
445 AliWarning("Not implemented");
449 //_____________________________________________________________________________
450 Bool_t AliMixInputEventHandler::FinishEvent()
453 // FinishEvent() is called for all mix input handlers
455 AliDebug(AliLog::kDebug + 5, Form("<-"));
456 AliMultiInputEventHandler::FinishEvent();
458 AliDebug(AliLog::kDebug + 5, Form("->"));
462 //_____________________________________________________________________________
463 void AliMixInputEventHandler::AddInputEventHandler(AliVEventHandler*)
466 // AddInputEventHandler will not be used
468 AliWarning("Function AddInputEventHandler is disabled for AliMixEventInputHandler !!!");
469 AliWarning("Use AliMixEventInputHandler::SetInputHandlerForMixing instead. Exiting ...");
472 //_____________________________________________________________________________
473 void AliMixInputEventHandler::UserExecMixAllTasks(Long64_t entryCounter, Int_t idEntryList, Long64_t entryMainReal, Long64_t entryMixReal, Int_t numMixed)
476 // Execute all task and sets mixing parameters
478 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
479 AliAnalysisTaskSE *mixTask = 0;
480 TObjArrayIter next(mgr->GetTasks());
481 while ((mixTask = (AliAnalysisTaskSE *) next())) {
482 if (dynamic_cast<AliAnalysisTaskSE *>(mixTask)) {
483 AliDebug(AliLog::kDebug, Form("%s %lld %d [%lld,%lld] %d", mixTask->GetName(), entryCounter, numMixed, entryMainReal, entryMixReal, idEntryList));
484 fCurrentEntry = entryCounter;
485 fCurrentEntryMain = entryMainReal;
486 fCurrentEntryMix = entryMixReal;
487 fCurrentBinIndex = idEntryList;
488 if (entryMixReal >= 0) mixTask->UserExecMix("");
493 //_____________________________________________________________________________
494 void AliMixInputEventHandler::SetMixNumber(const Int_t mixNum)
499 if (fMixNumber > 1 && fBufferSize > 1) {
500 AliWarning("Sleeping 10 sec to show Warning Message ...")
501 AliWarning("=========================================================================================");
502 AliWarning(Form("BufferSize(%d) higher > 1 and fMixNumber(%d) > 1, which is not supported", fBufferSize, mixNum));
504 AliWarning("\tBufferSize will be set to 1");
506 AliWarning("Hints:");
508 AliWarning("\t1.If you want to use buffer do:");
509 AliWarning(Form("\t\tAliMixInputEventHandler *mixH = new AliMixInputEventHandler(%d,1)", fBufferSize));
511 AliWarning("\t2.If you want to use mix more time with buffer size 1, then do:");
512 AliWarning(Form("\t\tAliMixInputEventHandler *mixH = new AliMixInputEventHandler(1,%d)", mixNum));
514 AliWarning("=========================================================================================");
515 gSystem->Sleep(10000);
521 Bool_t AliMixInputEventHandler::IsEventCurrentSelected()
523 AliDebug(AliLog::kDebug + 5, Form("<-"));
524 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
525 AliMultiInputEventHandler *mh = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
526 Bool_t isSelected = kTRUE;
527 if (fOfflineTriggerMask && mh->GetEventSelection()) {
528 isSelected = fOfflineTriggerMask & mh->IsEventSelected();
530 AliDebug(AliLog::kDebug + 1, Form("isSelected=%d", isSelected));
531 AliDebug(AliLog::kDebug + 5, Form("-> %d", isSelected));