ROOT logo
//
// Class AliMixEventPool
//
// AliMixEventPool is used to find
// similar events
//
// author:
//        Martin Vala (martin.vala@cern.ch)
//

#include <TEntryList.h>

#include "AliLog.h"
#include "AliMixEventCutObj.h"

#include "AliMixEventPool.h"

ClassImp(AliMixEventPool)

//_________________________________________________________________________________________________
AliMixEventPool::AliMixEventPool(const char *name, const char *title) : TNamed(name, title),
   fListOfEntryList(),
   fListOfEventCuts(),
   fBinNumber(0),
   fBufferSize(0),
   fMixNumber(0)
{
   //
   // Default constructor.
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   AliDebug(AliLog::kDebug + 5, "->");
}
//_________________________________________________________________________________________________
AliMixEventPool::AliMixEventPool(const AliMixEventPool &obj) : TNamed(obj),
   fListOfEntryList(obj.fListOfEntryList),
   fListOfEventCuts(obj.fListOfEventCuts),
   fBinNumber(obj.fBinNumber),
   fBufferSize(obj.fBufferSize),
   fMixNumber(obj.fMixNumber)
{
   //
   // Copy constructor
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   AliDebug(AliLog::kDebug + 5, "->");
}

//_________________________________________________________________________________________________
AliMixEventPool &AliMixEventPool::operator=(const AliMixEventPool &obj)
{
   //
   // Assigned operator
   //
   if (&obj != this) {
      TNamed::operator=(obj);
      fListOfEntryList = obj.fListOfEntryList;
      fListOfEventCuts = obj.fListOfEventCuts;
      fBinNumber = obj.fBinNumber;
      fBufferSize = obj.fBufferSize;
      fMixNumber = obj.fMixNumber;
   }
   return *this;
}


//_________________________________________________________________________________________________
AliMixEventPool::~AliMixEventPool()
{
   //
   // Destructor
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   AliDebug(AliLog::kDebug + 5, "->");
}
//_________________________________________________________________________________________________
void AliMixEventPool::AddCut(AliMixEventCutObj *cut)
{
   //
   // Adds cut
   //
   if (cut && cut->IsValid()) fListOfEventCuts.Add(new AliMixEventCutObj(*cut));
}
//_________________________________________________________________________________________________
void AliMixEventPool::Print(const Option_t *option) const
{
   //
   // Prints usefull information
   //
   TObjArrayIter next(&fListOfEventCuts);
   //   Int_t c=0;
   AliMixEventCutObj *cut;
   while ((cut = (AliMixEventCutObj *) next())) {
      cut->Print(option);
   }
   AliDebug(AliLog::kDebug, Form("NumOfEntryList %d", fListOfEntryList.GetEntries()));
   TEntryList *el;
   for (Int_t i = 0; i < fListOfEntryList.GetEntries(); i++) {
      el = (TEntryList *) fListOfEntryList.At(i);
      AliDebug(AliLog::kDebug, Form("EntryList[%d] %lld", i, el->GetN()));
   }
}
//_________________________________________________________________________________________________
Int_t AliMixEventPool::Init()
{
   //
   // Init event pool
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   CreateEntryListsRecursivly(fListOfEventCuts.GetEntries() - 1);
   fBinNumber++;
   AliDebug(AliLog::kDebug, Form("fBinnumber = %d", fBinNumber));
   AddEntryList();
   AliDebug(AliLog::kDebug + 5, "->");
   return 0;
}

//_________________________________________________________________________________________________
void AliMixEventPool::CreateEntryListsRecursivly(Int_t index)
{
   //
   // Helper function which create entrylist recursivly
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   AliMixEventCutObj *cut;
   if (index >= 0) {
      AliDebug(AliLog::kDebug + 1, Form("index = %d", index));
      cut = dynamic_cast<AliMixEventCutObj *>(fListOfEventCuts.At(index));
      if (!cut) return;
      cut->Reset();
      while (cut->HasMore()) {
         cut->AddStep();
         CreateEntryListsRecursivly(index - 1);
         if (cut->HasMore()) {
            fBinNumber++;
            AliDebug(AliLog::kDebug + 1, Form("fBinnumber = %d", fBinNumber));
            AddEntryList();
            //                 PrintCurrentCutIntervals();
         }
      }
   }
   AliDebug(AliLog::kDebug + 5, "->");
}

//_________________________________________________________________________________________________
TEntryList *AliMixEventPool::AddEntryList()
{
   //
   // Adds endtry list
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   TObjArrayIter next(&fListOfEventCuts);
   AliMixEventCutObj *cut;
   while ((cut = (AliMixEventCutObj *) next())) {
      if (cut) cut->PrintCurrentInterval();
   }
   TEntryList *el = new TEntryList;
   fListOfEntryList.Add(el);
   AliDebug(AliLog::kDebug + 1, Form("Number in Entry list -> %lld", el->GetN()));
   AliDebug(AliLog::kDebug + 5, "->");
   return el;
}

//_________________________________________________________________________________________________
Bool_t AliMixEventPool::AddEntry(Long64_t entry, AliVEvent *ev)
{
   //
   // Adds entry to correct entry list
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   AliDebug(AliLog::kDebug + 5, Form("AddEntry(%lld,%p)", entry, (void *)ev));
   if (entry < 0) {
      AliDebug(AliLog::kDebug, Form("Entry %lld was NOT added !!!", entry));
      return kFALSE;
   }
   Int_t idEntryList = -1;
   TEntryList *el =  FindEntryList(ev, idEntryList);
   if (el) {
      el->Enter(entry);
      AliDebug(AliLog::kDebug, Form("Entry %lld was added with idEntryList %d !!!", entry, idEntryList));
      return kTRUE;
   }
   AliDebug(AliLog::kDebug, Form("Entry %lld was NOT added !!!", entry));
   AliDebug(AliLog::kDebug + 5, "->");
   return kFALSE;
}

//_________________________________________________________________________________________________
TEntryList *AliMixEventPool::FindEntryList(AliVEvent *ev, Int_t &idEntryList)
{
   //
   // Find entrlist in list of entrlist
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   Int_t num = fListOfEventCuts.GetEntriesFast();
   if (num < 1) return 0;
   Int_t *indexes = new Int_t[num] ;
   Int_t *lenght = new Int_t[num];
   Int_t i = 0;
   TObjArrayIter next(&fListOfEventCuts);
   AliMixEventCutObj *cut;
   while ((cut = (AliMixEventCutObj *) next())) {
      indexes[i] = cut->GetIndex(ev);
      if (indexes[i] < 0) {
         AliDebug(AliLog::kDebug, Form("idEntryList %d", -1));
         delete [] indexes;
         delete [] lenght;
         return 0;
      }
      lenght[i] = cut->GetNumberOfBins();
      AliDebug(AliLog::kDebug + 1, Form("indexes[%d] %d", i, indexes[i]));
      i++;
   }
   idEntryList = 0;
   SearchIndexRecursive(fListOfEventCuts.GetEntries() - 1, &indexes[0], &lenght[0], idEntryList);
   AliDebug(AliLog::kDebug, Form("idEntryList %d", idEntryList - 1));
   // index which start with 0 (idEntryList-1)
   delete [] indexes;
   delete [] lenght;
   AliDebug(AliLog::kDebug + 5, "->");
   return (TEntryList *) fListOfEntryList.At(idEntryList - 1);
}

//_________________________________________________________________________________________________
void AliMixEventPool::SearchIndexRecursive(Int_t num, Int_t *i, Int_t *d, Int_t &index)
{
   //
   // Search for index of entrylist
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   if (num > 0) {
      index += (i[num] - 1) * d[num - 1];
      SearchIndexRecursive(num - 1, i, d, index);
   } else {
      index += i[num];
   }
   AliDebug(AliLog::kDebug + 5, "->");
}

//_________________________________________________________________________________________________
Bool_t AliMixEventPool::SetCutValuesFromBinIndex(Int_t index)
{
   //
   // Sets cut value from bin index
   //

   Int_t numCuts = fListOfEventCuts.GetEntriesFast();
   Int_t *lenght = new Int_t[numCuts];
   Int_t *indexes = new Int_t[numCuts];
   Long64_t timesNum = 1;
   AliMixEventCutObj *cut;
   Int_t i = 0, j = 0;
   for (i = 0; i < numCuts; i++) {
      cut = (AliMixEventCutObj *) fListOfEventCuts.At(i);
      cut->Reset();
      lenght[i] = cut->GetNumberOfBins();
      indexes[i] = 1;
      timesNum *= lenght[i];
   }

   if (index < 0 || index >= timesNum) {
//       AliError(Form("index=%d is out of range !!!", index));
      delete [] lenght;
      delete [] indexes;
      return kFALSE;
   }

   Long64_t indexNum = index;
   for (i = 0; i < numCuts; i++) {
      timesNum = 1;
      for (j = 0; j < numCuts - i - 1; j++) timesNum *= lenght[j];
      indexNum /= timesNum;
      indexes[numCuts - i - 1] = indexNum + 1;
      index -= indexNum * timesNum;
      indexNum = index;
   }

   for (i = 0; i < numCuts; i++) {
      cut = (AliMixEventCutObj *) fListOfEventCuts.At(i);
      for (j = 0; j < indexes[i]; j++) cut->AddStep();
      cut->PrintCurrentInterval();

   }

   for (i = 0; i < numCuts; i++) AliDebug(AliLog::kDebug, Form("indexes[%d]=%d", i, indexes[i]));

   delete [] lenght;
   delete [] indexes;

   return kTRUE;
}
 AliMixEventPool.cxx:1
 AliMixEventPool.cxx:2
 AliMixEventPool.cxx:3
 AliMixEventPool.cxx:4
 AliMixEventPool.cxx:5
 AliMixEventPool.cxx:6
 AliMixEventPool.cxx:7
 AliMixEventPool.cxx:8
 AliMixEventPool.cxx:9
 AliMixEventPool.cxx:10
 AliMixEventPool.cxx:11
 AliMixEventPool.cxx:12
 AliMixEventPool.cxx:13
 AliMixEventPool.cxx:14
 AliMixEventPool.cxx:15
 AliMixEventPool.cxx:16
 AliMixEventPool.cxx:17
 AliMixEventPool.cxx:18
 AliMixEventPool.cxx:19
 AliMixEventPool.cxx:20
 AliMixEventPool.cxx:21
 AliMixEventPool.cxx:22
 AliMixEventPool.cxx:23
 AliMixEventPool.cxx:24
 AliMixEventPool.cxx:25
 AliMixEventPool.cxx:26
 AliMixEventPool.cxx:27
 AliMixEventPool.cxx:28
 AliMixEventPool.cxx:29
 AliMixEventPool.cxx:30
 AliMixEventPool.cxx:31
 AliMixEventPool.cxx:32
 AliMixEventPool.cxx:33
 AliMixEventPool.cxx:34
 AliMixEventPool.cxx:35
 AliMixEventPool.cxx:36
 AliMixEventPool.cxx:37
 AliMixEventPool.cxx:38
 AliMixEventPool.cxx:39
 AliMixEventPool.cxx:40
 AliMixEventPool.cxx:41
 AliMixEventPool.cxx:42
 AliMixEventPool.cxx:43
 AliMixEventPool.cxx:44
 AliMixEventPool.cxx:45
 AliMixEventPool.cxx:46
 AliMixEventPool.cxx:47
 AliMixEventPool.cxx:48
 AliMixEventPool.cxx:49
 AliMixEventPool.cxx:50
 AliMixEventPool.cxx:51
 AliMixEventPool.cxx:52
 AliMixEventPool.cxx:53
 AliMixEventPool.cxx:54
 AliMixEventPool.cxx:55
 AliMixEventPool.cxx:56
 AliMixEventPool.cxx:57
 AliMixEventPool.cxx:58
 AliMixEventPool.cxx:59
 AliMixEventPool.cxx:60
 AliMixEventPool.cxx:61
 AliMixEventPool.cxx:62
 AliMixEventPool.cxx:63
 AliMixEventPool.cxx:64
 AliMixEventPool.cxx:65
 AliMixEventPool.cxx:66
 AliMixEventPool.cxx:67
 AliMixEventPool.cxx:68
 AliMixEventPool.cxx:69
 AliMixEventPool.cxx:70
 AliMixEventPool.cxx:71
 AliMixEventPool.cxx:72
 AliMixEventPool.cxx:73
 AliMixEventPool.cxx:74
 AliMixEventPool.cxx:75
 AliMixEventPool.cxx:76
 AliMixEventPool.cxx:77
 AliMixEventPool.cxx:78
 AliMixEventPool.cxx:79
 AliMixEventPool.cxx:80
 AliMixEventPool.cxx:81
 AliMixEventPool.cxx:82
 AliMixEventPool.cxx:83
 AliMixEventPool.cxx:84
 AliMixEventPool.cxx:85
 AliMixEventPool.cxx:86
 AliMixEventPool.cxx:87
 AliMixEventPool.cxx:88
 AliMixEventPool.cxx:89
 AliMixEventPool.cxx:90
 AliMixEventPool.cxx:91
 AliMixEventPool.cxx:92
 AliMixEventPool.cxx:93
 AliMixEventPool.cxx:94
 AliMixEventPool.cxx:95
 AliMixEventPool.cxx:96
 AliMixEventPool.cxx:97
 AliMixEventPool.cxx:98
 AliMixEventPool.cxx:99
 AliMixEventPool.cxx:100
 AliMixEventPool.cxx:101
 AliMixEventPool.cxx:102
 AliMixEventPool.cxx:103
 AliMixEventPool.cxx:104
 AliMixEventPool.cxx:105
 AliMixEventPool.cxx:106
 AliMixEventPool.cxx:107
 AliMixEventPool.cxx:108
 AliMixEventPool.cxx:109
 AliMixEventPool.cxx:110
 AliMixEventPool.cxx:111
 AliMixEventPool.cxx:112
 AliMixEventPool.cxx:113
 AliMixEventPool.cxx:114
 AliMixEventPool.cxx:115
 AliMixEventPool.cxx:116
 AliMixEventPool.cxx:117
 AliMixEventPool.cxx:118
 AliMixEventPool.cxx:119
 AliMixEventPool.cxx:120
 AliMixEventPool.cxx:121
 AliMixEventPool.cxx:122
 AliMixEventPool.cxx:123
 AliMixEventPool.cxx:124
 AliMixEventPool.cxx:125
 AliMixEventPool.cxx:126
 AliMixEventPool.cxx:127
 AliMixEventPool.cxx:128
 AliMixEventPool.cxx:129
 AliMixEventPool.cxx:130
 AliMixEventPool.cxx:131
 AliMixEventPool.cxx:132
 AliMixEventPool.cxx:133
 AliMixEventPool.cxx:134
 AliMixEventPool.cxx:135
 AliMixEventPool.cxx:136
 AliMixEventPool.cxx:137
 AliMixEventPool.cxx:138
 AliMixEventPool.cxx:139
 AliMixEventPool.cxx:140
 AliMixEventPool.cxx:141
 AliMixEventPool.cxx:142
 AliMixEventPool.cxx:143
 AliMixEventPool.cxx:144
 AliMixEventPool.cxx:145
 AliMixEventPool.cxx:146
 AliMixEventPool.cxx:147
 AliMixEventPool.cxx:148
 AliMixEventPool.cxx:149
 AliMixEventPool.cxx:150
 AliMixEventPool.cxx:151
 AliMixEventPool.cxx:152
 AliMixEventPool.cxx:153
 AliMixEventPool.cxx:154
 AliMixEventPool.cxx:155
 AliMixEventPool.cxx:156
 AliMixEventPool.cxx:157
 AliMixEventPool.cxx:158
 AliMixEventPool.cxx:159
 AliMixEventPool.cxx:160
 AliMixEventPool.cxx:161
 AliMixEventPool.cxx:162
 AliMixEventPool.cxx:163
 AliMixEventPool.cxx:164
 AliMixEventPool.cxx:165
 AliMixEventPool.cxx:166
 AliMixEventPool.cxx:167
 AliMixEventPool.cxx:168
 AliMixEventPool.cxx:169
 AliMixEventPool.cxx:170
 AliMixEventPool.cxx:171
 AliMixEventPool.cxx:172
 AliMixEventPool.cxx:173
 AliMixEventPool.cxx:174
 AliMixEventPool.cxx:175
 AliMixEventPool.cxx:176
 AliMixEventPool.cxx:177
 AliMixEventPool.cxx:178
 AliMixEventPool.cxx:179
 AliMixEventPool.cxx:180
 AliMixEventPool.cxx:181
 AliMixEventPool.cxx:182
 AliMixEventPool.cxx:183
 AliMixEventPool.cxx:184
 AliMixEventPool.cxx:185
 AliMixEventPool.cxx:186
 AliMixEventPool.cxx:187
 AliMixEventPool.cxx:188
 AliMixEventPool.cxx:189
 AliMixEventPool.cxx:190
 AliMixEventPool.cxx:191
 AliMixEventPool.cxx:192
 AliMixEventPool.cxx:193
 AliMixEventPool.cxx:194
 AliMixEventPool.cxx:195
 AliMixEventPool.cxx:196
 AliMixEventPool.cxx:197
 AliMixEventPool.cxx:198
 AliMixEventPool.cxx:199
 AliMixEventPool.cxx:200
 AliMixEventPool.cxx:201
 AliMixEventPool.cxx:202
 AliMixEventPool.cxx:203
 AliMixEventPool.cxx:204
 AliMixEventPool.cxx:205
 AliMixEventPool.cxx:206
 AliMixEventPool.cxx:207
 AliMixEventPool.cxx:208
 AliMixEventPool.cxx:209
 AliMixEventPool.cxx:210
 AliMixEventPool.cxx:211
 AliMixEventPool.cxx:212
 AliMixEventPool.cxx:213
 AliMixEventPool.cxx:214
 AliMixEventPool.cxx:215
 AliMixEventPool.cxx:216
 AliMixEventPool.cxx:217
 AliMixEventPool.cxx:218
 AliMixEventPool.cxx:219
 AliMixEventPool.cxx:220
 AliMixEventPool.cxx:221
 AliMixEventPool.cxx:222
 AliMixEventPool.cxx:223
 AliMixEventPool.cxx:224
 AliMixEventPool.cxx:225
 AliMixEventPool.cxx:226
 AliMixEventPool.cxx:227
 AliMixEventPool.cxx:228
 AliMixEventPool.cxx:229
 AliMixEventPool.cxx:230
 AliMixEventPool.cxx:231
 AliMixEventPool.cxx:232
 AliMixEventPool.cxx:233
 AliMixEventPool.cxx:234
 AliMixEventPool.cxx:235
 AliMixEventPool.cxx:236
 AliMixEventPool.cxx:237
 AliMixEventPool.cxx:238
 AliMixEventPool.cxx:239
 AliMixEventPool.cxx:240
 AliMixEventPool.cxx:241
 AliMixEventPool.cxx:242
 AliMixEventPool.cxx:243
 AliMixEventPool.cxx:244
 AliMixEventPool.cxx:245
 AliMixEventPool.cxx:246
 AliMixEventPool.cxx:247
 AliMixEventPool.cxx:248
 AliMixEventPool.cxx:249
 AliMixEventPool.cxx:250
 AliMixEventPool.cxx:251
 AliMixEventPool.cxx:252
 AliMixEventPool.cxx:253
 AliMixEventPool.cxx:254
 AliMixEventPool.cxx:255
 AliMixEventPool.cxx:256
 AliMixEventPool.cxx:257
 AliMixEventPool.cxx:258
 AliMixEventPool.cxx:259
 AliMixEventPool.cxx:260
 AliMixEventPool.cxx:261
 AliMixEventPool.cxx:262
 AliMixEventPool.cxx:263
 AliMixEventPool.cxx:264
 AliMixEventPool.cxx:265
 AliMixEventPool.cxx:266
 AliMixEventPool.cxx:267
 AliMixEventPool.cxx:268
 AliMixEventPool.cxx:269
 AliMixEventPool.cxx:270
 AliMixEventPool.cxx:271
 AliMixEventPool.cxx:272
 AliMixEventPool.cxx:273
 AliMixEventPool.cxx:274
 AliMixEventPool.cxx:275
 AliMixEventPool.cxx:276
 AliMixEventPool.cxx:277
 AliMixEventPool.cxx:278
 AliMixEventPool.cxx:279
 AliMixEventPool.cxx:280
 AliMixEventPool.cxx:281
 AliMixEventPool.cxx:282
 AliMixEventPool.cxx:283
 AliMixEventPool.cxx:284
 AliMixEventPool.cxx:285
 AliMixEventPool.cxx:286
 AliMixEventPool.cxx:287
 AliMixEventPool.cxx:288
 AliMixEventPool.cxx:289
 AliMixEventPool.cxx:290
 AliMixEventPool.cxx:291