#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)
{
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)
{
AliDebug(AliLog::kDebug + 5, "<-");
AliDebug(AliLog::kDebug + 5, "->");
}
AliMixEventPool &AliMixEventPool::operator=(const AliMixEventPool &obj)
{
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()
{
AliDebug(AliLog::kDebug + 5, "<-");
AliDebug(AliLog::kDebug + 5, "->");
}
void AliMixEventPool::AddCut(AliMixEventCutObj *cut)
{
if (cut && cut->IsValid()) fListOfEventCuts.Add(new AliMixEventCutObj(*cut));
}
void AliMixEventPool::Print(const Option_t *option) const
{
TObjArrayIter next(&fListOfEventCuts);
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()
{
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)
{
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();
}
}
}
AliDebug(AliLog::kDebug + 5, "->");
}
TEntryList *AliMixEventPool::AddEntryList()
{
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)
{
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)
{
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));
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)
{
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)
{
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) {
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;
}