ROOT logo
//
// Class AliAnalysisTaskMixInfo
//
// AliAnalysisTaskMixInfo is task
// for mixing info
//
// Mixing info can be enabled by setting one of following lines in UserCreateOutput() in your task
//       // prints mixing info
//       AliLog::SetClassDebugLevel("AliAnalysisTaskMixInfo", AliLog::kDebug);
//       // prints mixing info + event info for both (main and mixed) events
//       AliLog::SetClassDebugLevel("AliAnalysisTaskMixInfo", AliLog::kDebug+1);
//
// authors:
//          Martin Vala (martin.vala@cern.ch)
//

#include <TList.h>
#include <TObjString.h>

#include "AliAnalysisManager.h"

#include "AliMixInputEventHandler.h"
#include "AliAnalysisTaskMixInfo.h"
#include "AliMixInfo.h"
#include "AliMixEventPool.h"
#include "AliMixEventCutObj.h"


ClassImp(AliAnalysisTaskMixInfo)

//________________________________________________________________________
AliAnalysisTaskMixInfo::AliAnalysisTaskMixInfo(const char *name)
   : AliAnalysisTaskSE(name),
     fInputEHMain(0),
     fInputEHMix(0),
     fOutputList(0),
     fMixInfo(0),
     fCurrentEntryTmp(-1),
     fLogType(AliLog::kInfo),
     fLogClassesString()
{
   //
   // Constructor
   //
   DefineOutput(1, TList::Class());
}

//________________________________________________________________________
AliAnalysisTaskMixInfo::~AliAnalysisTaskMixInfo()
{
   //
   // Destructor
   //
   if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fOutputList;
}

//________________________________________________________________________
void AliAnalysisTaskMixInfo::UserCreateOutputObjects()
{
   // Create histograms
   // Called once

   SetDebugForAllClasses();
   fOutputList = new TList();
   fOutputList->SetOwner(kTRUE);

   // sets all Inuput Handler pointers
   InitInputHandlers();

   // inits mix info
   InitMixInfo();

   if (fInputEHMix) {
      AliMixEventPool *evPool = fInputEHMix->GetEventPool();
      if (evPool) {
         evPool->SetBufferSize(fInputEHMix->BufferSize());
         evPool->SetMixNumber(fInputEHMix->MixNumber());
         fMixInfo->SetEventPool(evPool);
      }
   }
   if (fMixInfo) fOutputList->Add(fMixInfo);

   // Post output data.
   PostData(1, fOutputList);
}

//________________________________________________________________________
void AliAnalysisTaskMixInfo::UserExec(Option_t *)
{
   // Main loop
   // Called for each event
   if (fMixInfo && fInputEHMix) {
      if (fInputEHMix->BufferSize() > 1) {
         if (fInputEHMix->NumberMixedTimes() >= fInputEHMix->BufferSize())
            fMixInfo->FillHistogram(AliMixInfo::kMainEvents, fInputEHMix->CurrentBinIndex());
      } else {
         if ((!fInputEHMix->IsMixingIfNotEnoughEvents())) {
            if (fInputEHMix->NumberMixed() == fInputEHMix->MixNumber())
               // add main entry only when there was enough mixed events mixed
               fMixInfo->FillHistogram(AliMixInfo::kMainEvents, fInputEHMix->CurrentBinIndex());
         } else {
            fMixInfo->FillHistogram(AliMixInfo::kMainEvents, fInputEHMix->CurrentBinIndex());
         }
      }
      AliDebug(AliLog::kDebug, Form("Main %lld %d [%lld,%lld] %d", fInputEHMix->CurrentEntry(), fInputEHMix->CurrentBinIndex(), fInputEHMix->CurrentEntryMain(), fInputEHMix->CurrentEntryMix(), fInputEHMix->NumberMixed()));
   }
   // Post output data.
   PostData(1, fOutputList);
}

//________________________________________________________________________
void AliAnalysisTaskMixInfo::UserExecMix(Option_t *)
{
   // UserExecMix

   if (!fInputEHMix) return;

   // fills bin index (even when it is -1, so we know out of range combinations)
   if (fMixInfo) {
      if (fInputEHMix->CurrentBinIndex()==-1) {
         fMixInfo->FillHistogram(AliMixInfo::kMixedEvents, fInputEHMix->CurrentBinIndex());
      } else {
         for(Int_t iBuff=0; iBuff<fInputEHMix->BufferSize(); iBuff++) {
            fMixInfo->FillHistogram(AliMixInfo::kMixedEvents, fInputEHMix->CurrentBinIndex());
         }
      }
   }

   // just test
   if (fInputEHMix->CurrentEntryMix() < 0) {
      AliError("Mix entry is -1 and it should not happen !!!!!");
      return ;
   }
   AliDebug(AliLog::kDebug, Form("Mixing %lld %d [%lld,%lld] %d", fInputEHMix->CurrentEntry(), fInputEHMix->CurrentBinIndex(), fInputEHMix->CurrentEntryMain(), fInputEHMix->CurrentEntryMix(), fInputEHMix->NumberMixed()));
   if (AliLog::GetDebugLevel("", IsA()->GetName()) > AliLog::kDebug) PrintEventInfo();
   // Post output data.
   PostData(1, fOutputList);
}

//________________________________________________________________________
void AliAnalysisTaskMixInfo::FinishTaskOutput()
{
   // FinishTaskOutput
   if (fMixInfo) fMixInfo->Print();
}


//________________________________________________________________________
void AliAnalysisTaskMixInfo::Terminate(Option_t *)
{
   // Draw result to the screen
   // Called once at the end of the query
   fOutputList = dynamic_cast<TList *>(GetOutputData(1));
   if (!fOutputList) {
      AliError("fOutputList not available");
      return;
   }
   fOutputList->Print();
   fMixInfo = (AliMixInfo *) fOutputList->FindObject("mixInfo");
   if (fMixInfo) {
      fMixInfo->Draw("HIST");
      AliMixEventPool *evPool = (AliMixEventPool *) fMixInfo->GetEventPool("mixEventPool");
      if (evPool) evPool->Print();
   }
}

//_____________________________________________________________________________
void AliAnalysisTaskMixInfo::SetLogType(AliLog::EType_t type, TString allClasses)
{
   //
   // Set Log level for this and other classes (list of their names)
   //
   AliDebug(AliLog::kDebug + 10, "<-");
   fLogType = type;
   fLogClassesString = allClasses;
   SetDebugForAllClasses();
   AliDebug(AliLog::kDebug + 10, "->");
}

//_____________________________________________________________________________
void AliAnalysisTaskMixInfo::SetDebugForAllClasses()
{
   //
   // Set debug level for all classes for which it is required
   //
   AliDebug(AliLog::kDebug + 10, "<-");
   TObjArray *array = fLogClassesString.Tokenize(":");
   TObjString *str;
   TString strr;
   for (Int_t i = 0; i < array->GetEntriesFast(); i++) {
      str = (TObjString *) array->At(i);
      strr = str->GetString();
      AliLog::SetClassDebugLevel(strr.Data(), fLogType);
      AliDebug(AliLog::kDebug + 5, Form("Setting Debug level %d to %s ...", (Int_t)fLogType - AliLog::kDebug, strr.Data()));
   }
   delete array;
   AliDebug(AliLog::kDebug + 10, "->");
}

//_____________________________________________________________________________
void AliAnalysisTaskMixInfo::InitMixInfo()
{
   //
   // Init mixing info
   //
   if (fInputEHMix) {
      fMixInfo = new AliMixInfo("mixInfo", "Mix title");
      AliMixEventPool *evPool = fInputEHMix->GetEventPool();
      if (!evPool) {
         //             TList *list = new TList;
         if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMainEvents, 1, 1, 2);
         if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMixedEvents, 1, 1, 2);
      } else {
         if (evPool->NeedInit()) evPool->Init();
         Int_t num = evPool->GetListOfEntryLists()->GetEntriesFast();
         if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMainEvents, num, 1, num + 1);
         if (fMixInfo) fMixInfo->CreateHistogram(AliMixInfo::kMixedEvents, num, 1, num + 1);
      }
   }
}

//_____________________________________________________________________________
void AliAnalysisTaskMixInfo::PrintEventInfo()
{
   //
   // Prints event info for all event mxing cuts
   //
   if (fInputEHMix) {
      TObjArrayIter next(fInputEHMix->GetEventPool()->GetListOfEventCuts());
      AliMixEventCutObj *cut;
      AliInputEventHandler *ihMain = fInputEHMain->GetFirstInputEventHandler();
      AliMultiInputEventHandler *ihMultiMix = fInputEHMix->GetFirstMultiInputHandler();
      AliInputEventHandler *ihMix = 0;
      if (ihMultiMix) ihMix = ihMultiMix->GetFirstInputEventHandler();
      if (!ihMix) return;
      while ((cut = (AliMixEventCutObj *) next())) {
         cut->PrintValues(ihMain->GetEvent(), ihMix->GetEvent());
      }
   }
}

//_____________________________________________________________________________
void AliAnalysisTaskMixInfo::InitInputHandlers()
{
   //
   // Sets needed input handlers
   //
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   fInputEHMain = dynamic_cast<AliMultiInputEventHandler *>(mgr->GetInputEventHandler());
   if (fInputEHMain) {
      fInputEHMix = dynamic_cast<AliMixInputEventHandler *>(fInputEHMain->GetFirstMultiInputHandler());
   }
}
 AliAnalysisTaskMixInfo.cxx:1
 AliAnalysisTaskMixInfo.cxx:2
 AliAnalysisTaskMixInfo.cxx:3
 AliAnalysisTaskMixInfo.cxx:4
 AliAnalysisTaskMixInfo.cxx:5
 AliAnalysisTaskMixInfo.cxx:6
 AliAnalysisTaskMixInfo.cxx:7
 AliAnalysisTaskMixInfo.cxx:8
 AliAnalysisTaskMixInfo.cxx:9
 AliAnalysisTaskMixInfo.cxx:10
 AliAnalysisTaskMixInfo.cxx:11
 AliAnalysisTaskMixInfo.cxx:12
 AliAnalysisTaskMixInfo.cxx:13
 AliAnalysisTaskMixInfo.cxx:14
 AliAnalysisTaskMixInfo.cxx:15
 AliAnalysisTaskMixInfo.cxx:16
 AliAnalysisTaskMixInfo.cxx:17
 AliAnalysisTaskMixInfo.cxx:18
 AliAnalysisTaskMixInfo.cxx:19
 AliAnalysisTaskMixInfo.cxx:20
 AliAnalysisTaskMixInfo.cxx:21
 AliAnalysisTaskMixInfo.cxx:22
 AliAnalysisTaskMixInfo.cxx:23
 AliAnalysisTaskMixInfo.cxx:24
 AliAnalysisTaskMixInfo.cxx:25
 AliAnalysisTaskMixInfo.cxx:26
 AliAnalysisTaskMixInfo.cxx:27
 AliAnalysisTaskMixInfo.cxx:28
 AliAnalysisTaskMixInfo.cxx:29
 AliAnalysisTaskMixInfo.cxx:30
 AliAnalysisTaskMixInfo.cxx:31
 AliAnalysisTaskMixInfo.cxx:32
 AliAnalysisTaskMixInfo.cxx:33
 AliAnalysisTaskMixInfo.cxx:34
 AliAnalysisTaskMixInfo.cxx:35
 AliAnalysisTaskMixInfo.cxx:36
 AliAnalysisTaskMixInfo.cxx:37
 AliAnalysisTaskMixInfo.cxx:38
 AliAnalysisTaskMixInfo.cxx:39
 AliAnalysisTaskMixInfo.cxx:40
 AliAnalysisTaskMixInfo.cxx:41
 AliAnalysisTaskMixInfo.cxx:42
 AliAnalysisTaskMixInfo.cxx:43
 AliAnalysisTaskMixInfo.cxx:44
 AliAnalysisTaskMixInfo.cxx:45
 AliAnalysisTaskMixInfo.cxx:46
 AliAnalysisTaskMixInfo.cxx:47
 AliAnalysisTaskMixInfo.cxx:48
 AliAnalysisTaskMixInfo.cxx:49
 AliAnalysisTaskMixInfo.cxx:50
 AliAnalysisTaskMixInfo.cxx:51
 AliAnalysisTaskMixInfo.cxx:52
 AliAnalysisTaskMixInfo.cxx:53
 AliAnalysisTaskMixInfo.cxx:54
 AliAnalysisTaskMixInfo.cxx:55
 AliAnalysisTaskMixInfo.cxx:56
 AliAnalysisTaskMixInfo.cxx:57
 AliAnalysisTaskMixInfo.cxx:58
 AliAnalysisTaskMixInfo.cxx:59
 AliAnalysisTaskMixInfo.cxx:60
 AliAnalysisTaskMixInfo.cxx:61
 AliAnalysisTaskMixInfo.cxx:62
 AliAnalysisTaskMixInfo.cxx:63
 AliAnalysisTaskMixInfo.cxx:64
 AliAnalysisTaskMixInfo.cxx:65
 AliAnalysisTaskMixInfo.cxx:66
 AliAnalysisTaskMixInfo.cxx:67
 AliAnalysisTaskMixInfo.cxx:68
 AliAnalysisTaskMixInfo.cxx:69
 AliAnalysisTaskMixInfo.cxx:70
 AliAnalysisTaskMixInfo.cxx:71
 AliAnalysisTaskMixInfo.cxx:72
 AliAnalysisTaskMixInfo.cxx:73
 AliAnalysisTaskMixInfo.cxx:74
 AliAnalysisTaskMixInfo.cxx:75
 AliAnalysisTaskMixInfo.cxx:76
 AliAnalysisTaskMixInfo.cxx:77
 AliAnalysisTaskMixInfo.cxx:78
 AliAnalysisTaskMixInfo.cxx:79
 AliAnalysisTaskMixInfo.cxx:80
 AliAnalysisTaskMixInfo.cxx:81
 AliAnalysisTaskMixInfo.cxx:82
 AliAnalysisTaskMixInfo.cxx:83
 AliAnalysisTaskMixInfo.cxx:84
 AliAnalysisTaskMixInfo.cxx:85
 AliAnalysisTaskMixInfo.cxx:86
 AliAnalysisTaskMixInfo.cxx:87
 AliAnalysisTaskMixInfo.cxx:88
 AliAnalysisTaskMixInfo.cxx:89
 AliAnalysisTaskMixInfo.cxx:90
 AliAnalysisTaskMixInfo.cxx:91
 AliAnalysisTaskMixInfo.cxx:92
 AliAnalysisTaskMixInfo.cxx:93
 AliAnalysisTaskMixInfo.cxx:94
 AliAnalysisTaskMixInfo.cxx:95
 AliAnalysisTaskMixInfo.cxx:96
 AliAnalysisTaskMixInfo.cxx:97
 AliAnalysisTaskMixInfo.cxx:98
 AliAnalysisTaskMixInfo.cxx:99
 AliAnalysisTaskMixInfo.cxx:100
 AliAnalysisTaskMixInfo.cxx:101
 AliAnalysisTaskMixInfo.cxx:102
 AliAnalysisTaskMixInfo.cxx:103
 AliAnalysisTaskMixInfo.cxx:104
 AliAnalysisTaskMixInfo.cxx:105
 AliAnalysisTaskMixInfo.cxx:106
 AliAnalysisTaskMixInfo.cxx:107
 AliAnalysisTaskMixInfo.cxx:108
 AliAnalysisTaskMixInfo.cxx:109
 AliAnalysisTaskMixInfo.cxx:110
 AliAnalysisTaskMixInfo.cxx:111
 AliAnalysisTaskMixInfo.cxx:112
 AliAnalysisTaskMixInfo.cxx:113
 AliAnalysisTaskMixInfo.cxx:114
 AliAnalysisTaskMixInfo.cxx:115
 AliAnalysisTaskMixInfo.cxx:116
 AliAnalysisTaskMixInfo.cxx:117
 AliAnalysisTaskMixInfo.cxx:118
 AliAnalysisTaskMixInfo.cxx:119
 AliAnalysisTaskMixInfo.cxx:120
 AliAnalysisTaskMixInfo.cxx:121
 AliAnalysisTaskMixInfo.cxx:122
 AliAnalysisTaskMixInfo.cxx:123
 AliAnalysisTaskMixInfo.cxx:124
 AliAnalysisTaskMixInfo.cxx:125
 AliAnalysisTaskMixInfo.cxx:126
 AliAnalysisTaskMixInfo.cxx:127
 AliAnalysisTaskMixInfo.cxx:128
 AliAnalysisTaskMixInfo.cxx:129
 AliAnalysisTaskMixInfo.cxx:130
 AliAnalysisTaskMixInfo.cxx:131
 AliAnalysisTaskMixInfo.cxx:132
 AliAnalysisTaskMixInfo.cxx:133
 AliAnalysisTaskMixInfo.cxx:134
 AliAnalysisTaskMixInfo.cxx:135
 AliAnalysisTaskMixInfo.cxx:136
 AliAnalysisTaskMixInfo.cxx:137
 AliAnalysisTaskMixInfo.cxx:138
 AliAnalysisTaskMixInfo.cxx:139
 AliAnalysisTaskMixInfo.cxx:140
 AliAnalysisTaskMixInfo.cxx:141
 AliAnalysisTaskMixInfo.cxx:142
 AliAnalysisTaskMixInfo.cxx:143
 AliAnalysisTaskMixInfo.cxx:144
 AliAnalysisTaskMixInfo.cxx:145
 AliAnalysisTaskMixInfo.cxx:146
 AliAnalysisTaskMixInfo.cxx:147
 AliAnalysisTaskMixInfo.cxx:148
 AliAnalysisTaskMixInfo.cxx:149
 AliAnalysisTaskMixInfo.cxx:150
 AliAnalysisTaskMixInfo.cxx:151
 AliAnalysisTaskMixInfo.cxx:152
 AliAnalysisTaskMixInfo.cxx:153
 AliAnalysisTaskMixInfo.cxx:154
 AliAnalysisTaskMixInfo.cxx:155
 AliAnalysisTaskMixInfo.cxx:156
 AliAnalysisTaskMixInfo.cxx:157
 AliAnalysisTaskMixInfo.cxx:158
 AliAnalysisTaskMixInfo.cxx:159
 AliAnalysisTaskMixInfo.cxx:160
 AliAnalysisTaskMixInfo.cxx:161
 AliAnalysisTaskMixInfo.cxx:162
 AliAnalysisTaskMixInfo.cxx:163
 AliAnalysisTaskMixInfo.cxx:164
 AliAnalysisTaskMixInfo.cxx:165
 AliAnalysisTaskMixInfo.cxx:166
 AliAnalysisTaskMixInfo.cxx:167
 AliAnalysisTaskMixInfo.cxx:168
 AliAnalysisTaskMixInfo.cxx:169
 AliAnalysisTaskMixInfo.cxx:170
 AliAnalysisTaskMixInfo.cxx:171
 AliAnalysisTaskMixInfo.cxx:172
 AliAnalysisTaskMixInfo.cxx:173
 AliAnalysisTaskMixInfo.cxx:174
 AliAnalysisTaskMixInfo.cxx:175
 AliAnalysisTaskMixInfo.cxx:176
 AliAnalysisTaskMixInfo.cxx:177
 AliAnalysisTaskMixInfo.cxx:178
 AliAnalysisTaskMixInfo.cxx:179
 AliAnalysisTaskMixInfo.cxx:180
 AliAnalysisTaskMixInfo.cxx:181
 AliAnalysisTaskMixInfo.cxx:182
 AliAnalysisTaskMixInfo.cxx:183
 AliAnalysisTaskMixInfo.cxx:184
 AliAnalysisTaskMixInfo.cxx:185
 AliAnalysisTaskMixInfo.cxx:186
 AliAnalysisTaskMixInfo.cxx:187
 AliAnalysisTaskMixInfo.cxx:188
 AliAnalysisTaskMixInfo.cxx:189
 AliAnalysisTaskMixInfo.cxx:190
 AliAnalysisTaskMixInfo.cxx:191
 AliAnalysisTaskMixInfo.cxx:192
 AliAnalysisTaskMixInfo.cxx:193
 AliAnalysisTaskMixInfo.cxx:194
 AliAnalysisTaskMixInfo.cxx:195
 AliAnalysisTaskMixInfo.cxx:196
 AliAnalysisTaskMixInfo.cxx:197
 AliAnalysisTaskMixInfo.cxx:198
 AliAnalysisTaskMixInfo.cxx:199
 AliAnalysisTaskMixInfo.cxx:200
 AliAnalysisTaskMixInfo.cxx:201
 AliAnalysisTaskMixInfo.cxx:202
 AliAnalysisTaskMixInfo.cxx:203
 AliAnalysisTaskMixInfo.cxx:204
 AliAnalysisTaskMixInfo.cxx:205
 AliAnalysisTaskMixInfo.cxx:206
 AliAnalysisTaskMixInfo.cxx:207
 AliAnalysisTaskMixInfo.cxx:208
 AliAnalysisTaskMixInfo.cxx:209
 AliAnalysisTaskMixInfo.cxx:210
 AliAnalysisTaskMixInfo.cxx:211
 AliAnalysisTaskMixInfo.cxx:212
 AliAnalysisTaskMixInfo.cxx:213
 AliAnalysisTaskMixInfo.cxx:214
 AliAnalysisTaskMixInfo.cxx:215
 AliAnalysisTaskMixInfo.cxx:216
 AliAnalysisTaskMixInfo.cxx:217
 AliAnalysisTaskMixInfo.cxx:218
 AliAnalysisTaskMixInfo.cxx:219
 AliAnalysisTaskMixInfo.cxx:220
 AliAnalysisTaskMixInfo.cxx:221
 AliAnalysisTaskMixInfo.cxx:222
 AliAnalysisTaskMixInfo.cxx:223
 AliAnalysisTaskMixInfo.cxx:224
 AliAnalysisTaskMixInfo.cxx:225
 AliAnalysisTaskMixInfo.cxx:226
 AliAnalysisTaskMixInfo.cxx:227
 AliAnalysisTaskMixInfo.cxx:228
 AliAnalysisTaskMixInfo.cxx:229
 AliAnalysisTaskMixInfo.cxx:230
 AliAnalysisTaskMixInfo.cxx:231
 AliAnalysisTaskMixInfo.cxx:232
 AliAnalysisTaskMixInfo.cxx:233
 AliAnalysisTaskMixInfo.cxx:234
 AliAnalysisTaskMixInfo.cxx:235
 AliAnalysisTaskMixInfo.cxx:236
 AliAnalysisTaskMixInfo.cxx:237
 AliAnalysisTaskMixInfo.cxx:238
 AliAnalysisTaskMixInfo.cxx:239
 AliAnalysisTaskMixInfo.cxx:240
 AliAnalysisTaskMixInfo.cxx:241
 AliAnalysisTaskMixInfo.cxx:242
 AliAnalysisTaskMixInfo.cxx:243
 AliAnalysisTaskMixInfo.cxx:244
 AliAnalysisTaskMixInfo.cxx:245
 AliAnalysisTaskMixInfo.cxx:246
 AliAnalysisTaskMixInfo.cxx:247
 AliAnalysisTaskMixInfo.cxx:248
 AliAnalysisTaskMixInfo.cxx:249
 AliAnalysisTaskMixInfo.cxx:250
 AliAnalysisTaskMixInfo.cxx:251
 AliAnalysisTaskMixInfo.cxx:252
 AliAnalysisTaskMixInfo.cxx:253