2 // Class AliAnalysisTaskMixInfo
4 // AliAnalysisTaskMixInfo is task
7 // Mixing info can be enabled by setting one of following lines in UserCreateOutput() in your task
8 // // prints mixing info
9 // AliLog::SetClassDebugLevel("AliAnalysisTaskMixInfo", AliLog::kDebug);
10 // // prints mixing info + event info for both (main and mixed) events
11 // AliLog::SetClassDebugLevel("AliAnalysisTaskMixInfo", AliLog::kDebug+1);
14 // Martin Vala (martin.vala@cern.ch)
18 #include <TObjString.h>
20 #include "AliAnalysisManager.h"
22 #include "AliMixInputEventHandler.h"
23 #include "AliAnalysisTaskMixInfo.h"
24 #include "AliMixInfo.h"
25 #include "AliMixEventPool.h"
26 #include "AliMixEventCutObj.h"
29 ClassImp(AliAnalysisTaskMixInfo)
31 //________________________________________________________________________
32 AliAnalysisTaskMixInfo::AliAnalysisTaskMixInfo(const char *name)
33 : AliAnalysisTaskSE(name),
39 fLogType(AliLog::kInfo),
45 DefineOutput(1, TList::Class());
48 //________________________________________________________________________
49 AliAnalysisTaskMixInfo::~AliAnalysisTaskMixInfo()
54 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fOutputList;
57 //________________________________________________________________________
58 void AliAnalysisTaskMixInfo::UserCreateOutputObjects()
63 SetDebugForAllClasses();
64 fOutputList = new TList();
65 fOutputList->SetOwner(kTRUE);
67 // sets all Inuput Handler pointers
74 AliMixEventPool *evPool = fInputEHMix->GetEventPool();
76 evPool->SetBufferSize(fInputEHMix->BufferSize());
77 evPool->SetMixNumber(fInputEHMix->MixNumber());
78 fMixInfo->SetEventPool(evPool);
81 if (fMixInfo) fOutputList->Add(fMixInfo);
84 PostData(1, fOutputList);
87 //________________________________________________________________________
88 void AliAnalysisTaskMixInfo::UserExec(Option_t *)
91 // Called for each event
92 if (fMixInfo && fInputEHMix) {
93 if (fInputEHMix->BufferSize() > 1) {
94 if (fInputEHMix->NumberMixedTimes() >= fInputEHMix->BufferSize())
95 fMixInfo->FillHistogram(AliMixInfo::kMainEvents, fInputEHMix->CurrentBinIndex());
97 if ((!fInputEHMix->IsMixingIfNotEnoughEvents())) {
98 if (fInputEHMix->NumberMixed() == fInputEHMix->MixNumber())
99 // add main entry only when there was enough mixed events mixed
100 fMixInfo->FillHistogram(AliMixInfo::kMainEvents, fInputEHMix->CurrentBinIndex());
102 fMixInfo->FillHistogram(AliMixInfo::kMainEvents, fInputEHMix->CurrentBinIndex());
105 AliDebug(AliLog::kDebug, Form("Main %lld %d [%lld,%lld] %d", fInputEHMix->CurrentEntry(), fInputEHMix->CurrentBinIndex(), fInputEHMix->CurrentEntryMain(), fInputEHMix->CurrentEntryMix(), fInputEHMix->NumberMixed()));
108 PostData(1, fOutputList);
111 //________________________________________________________________________
112 void AliAnalysisTaskMixInfo::UserExecMix(Option_t *)
116 if (!fInputEHMix) return;
118 // fills bin index (even when it is -1, so we know out of range combinations)
120 if (fInputEHMix->CurrentBinIndex()==-1) {
121 fMixInfo->FillHistogram(AliMixInfo::kMixedEvents, fInputEHMix->CurrentBinIndex());
123 for(Int_t iBuff=0; iBuff<fInputEHMix->BufferSize(); iBuff++) {
124 fMixInfo->FillHistogram(AliMixInfo::kMixedEvents, fInputEHMix->CurrentBinIndex());
130 if (fInputEHMix->CurrentEntryMix() < 0) {
131 AliError("Mix entry is -1 and it should not happen !!!!!");
134 AliDebug(AliLog::kDebug, Form("Mixing %lld %d [%lld,%lld] %d", fInputEHMix->CurrentEntry(), fInputEHMix->CurrentBinIndex(), fInputEHMix->CurrentEntryMain(), fInputEHMix->CurrentEntryMix(), fInputEHMix->NumberMixed()));
135 if (AliLog::GetDebugLevel("", IsA()->GetName()) > AliLog::kDebug) PrintEventInfo();
137 PostData(1, fOutputList);
140 //________________________________________________________________________
141 void AliAnalysisTaskMixInfo::FinishTaskOutput()
144 if (fMixInfo) fMixInfo->Print();
148 //________________________________________________________________________
149 void AliAnalysisTaskMixInfo::Terminate(Option_t *)
151 // Draw result to the screen
152 // Called once at the end of the query
153 fOutputList = dynamic_cast<TList *>(GetOutputData(1));
155 AliError("fOutputList not available");
158 fOutputList->Print();
159 fMixInfo = (AliMixInfo *) fOutputList->FindObject("mixInfo");
161 fMixInfo->Draw("HIST");
162 AliMixEventPool *evPool = (AliMixEventPool *) fMixInfo->GetEventPool("mixEventPool");
163 if (evPool) evPool->Print();
167 //_____________________________________________________________________________
168 void AliAnalysisTaskMixInfo::SetLogType(AliLog::EType_t type, TString allClasses)
171 // Set Log level for this and other classes (list of their names)
173 AliDebug(AliLog::kDebug + 10, "<-");
175 fLogClassesString = allClasses;
176 SetDebugForAllClasses();
177 AliDebug(AliLog::kDebug + 10, "->");
180 //_____________________________________________________________________________
181 void AliAnalysisTaskMixInfo::SetDebugForAllClasses()
184 // Set debug level for all classes for which it is required
186 AliDebug(AliLog::kDebug + 10, "<-");
187 TObjArray *array = fLogClassesString.Tokenize(":");
190 for (Int_t i = 0; i < array->GetEntriesFast(); i++) {
191 str = (TObjString *) array->At(i);
192 strr = str->GetString();
193 AliLog::SetClassDebugLevel(strr.Data(), fLogType);
194 AliDebug(AliLog::kDebug + 5, Form("Setting Debug level %d to %s ...", (Int_t)fLogType - AliLog::kDebug, strr.Data()));
196 AliDebug(AliLog::kDebug + 10, "->");
199 //_____________________________________________________________________________
200 void AliAnalysisTaskMixInfo::InitMixInfo()
206 fMixInfo = new AliMixInfo("mixInfo", "Mix title");
207 AliMixEventPool *evPool = fInputEHMix->GetEventPool();
209 // TList *list = new TList;
210 if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMainEvents, 1, 1, 2);
211 if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMixedEvents, 1, 1, 2);
213 if (evPool->NeedInit()) evPool->Init();
214 Int_t num = evPool->GetListOfEntryLists()->GetEntriesFast();
215 if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMainEvents, num, 1, num + 1);
216 if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMixedEvents, num, 1, num + 1);
221 //_____________________________________________________________________________
222 void AliAnalysisTaskMixInfo::PrintEventInfo()
225 // Prints event info for all event mxing cuts
228 TObjArrayIter next(fInputEHMix->GetEventPool()->GetListOfEventCuts());
229 AliMixEventCutObj *cut;
230 AliInputEventHandler *ihMain = fInputEHMain->GetFirstInputEventHandler();
231 AliMultiInputEventHandler *ihMultiMix = fInputEHMix->GetFirstMultiInputHandler();
232 AliInputEventHandler *ihMix = 0;
233 if (ihMultiMix) ihMix = ihMultiMix->GetFirstInputEventHandler();
235 while ((cut = (AliMixEventCutObj *) next())) {
236 cut->PrintValues(ihMain->GetEvent(), ihMix->GetEvent());
241 //_____________________________________________________________________________
242 void AliAnalysisTaskMixInfo::InitInputHandlers()
245 // Sets needed input handlers
247 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
248 fInputEHMain = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
250 fInputEHMix = dynamic_cast<AliMixInputEventHandler *>(fInputEHMain->GetFirstMultiInputHandler());