79e4884dc3c16b5b81b6455e2596967d188eb6a1
[u/mrichter/AliRoot.git] / ANALYSIS / EventMixing / AliMixEventPool.cxx
1 //
2 // Class AliMixEventPool
3 //
4 // AliMixEventPool is used to find
5 // similar events
6 //
7 // author:
8 //        Martin Vala (martin.vala@cern.ch)
9 //
10
11 #include <TEntryList.h>
12
13 #include "AliLog.h"
14 #include "AliMixEventCutObj.h"
15
16 #include "AliMixEventPool.h"
17
18 ClassImp(AliMixEventPool)
19
20 //_________________________________________________________________________________________________
21 AliMixEventPool::AliMixEventPool(const char *name, const char *title) : TNamed(name, title),
22    fListOfEntryList(),
23    fListOfEventCuts(),
24    fBinNumber(0),
25    fBufferSize(0),
26    fMixNumber(0)
27 {
28    //
29    // Default constructor.
30    //
31    AliDebug(AliLog::kDebug + 5, "<-");
32    AliDebug(AliLog::kDebug + 5, "->");
33 }
34 //_________________________________________________________________________________________________
35 AliMixEventPool::AliMixEventPool(const AliMixEventPool &obj) : TNamed(obj),
36    fListOfEntryList(obj.fListOfEntryList),
37    fListOfEventCuts(obj.fListOfEventCuts),
38    fBinNumber(obj.fBinNumber),
39    fBufferSize(obj.fBufferSize),
40    fMixNumber(obj.fMixNumber)
41 {
42    //
43    // Copy constructor
44    //
45    AliDebug(AliLog::kDebug + 5, "<-");
46    AliDebug(AliLog::kDebug + 5, "->");
47 }
48
49 //_________________________________________________________________________________________________
50 AliMixEventPool& AliMixEventPool::operator=(const AliMixEventPool& obj)
51 {
52    //
53    // Assigned operator
54    //
55    if (&obj != this) {
56       TNamed::operator=(obj);
57       fListOfEntryList = obj.fListOfEntryList;
58       fListOfEventCuts = obj.fListOfEventCuts;
59       fBinNumber = obj.fBinNumber;
60       fBufferSize = obj.fBufferSize;
61       fMixNumber = obj.fMixNumber;
62    }
63    return *this;
64 }
65
66
67 //_________________________________________________________________________________________________
68 AliMixEventPool::~AliMixEventPool()
69 {
70    //
71    // Destructor
72    //
73    AliDebug(AliLog::kDebug + 5, "<-");
74    AliDebug(AliLog::kDebug + 5, "->");
75 }
76 //_________________________________________________________________________________________________
77 void AliMixEventPool::AddCut(AliMixEventCutObj *cut)
78 {
79    //
80    // Adds cut
81    //
82    if (cut) fListOfEventCuts.Add(new AliMixEventCutObj(*cut));
83 }
84 //_________________________________________________________________________________________________
85 void AliMixEventPool::Print(const Option_t *option) const
86 {
87    //
88    // Prints usefull information
89    //
90    TObjArrayIter next(&fListOfEventCuts);
91    //   Int_t c=0;
92    AliMixEventCutObj *cut;
93    while ((cut = (AliMixEventCutObj *) next())) {
94       cut->Print(option);
95    }
96    AliDebug(AliLog::kDebug, Form("NumOfEntryList %d", fListOfEntryList.GetEntries()));
97    TEntryList *el;
98    for (Int_t i = 0; i < fListOfEntryList.GetEntries(); i++) {
99       el = (TEntryList *) fListOfEntryList.At(i);
100       AliDebug(AliLog::kDebug, Form("EntryList[%d] %lld", i, el->GetN()));
101    }
102 }
103 //_________________________________________________________________________________________________
104 Int_t AliMixEventPool::Init()
105 {
106    //
107    // Init event pool
108    //
109    AliDebug(AliLog::kDebug + 5, "<-");
110    CreateEntryListsRecursivly(fListOfEventCuts.GetEntries() - 1);
111    fBinNumber++;
112    AliDebug(AliLog::kDebug, Form("fBinnumber = %d", fBinNumber));
113    AddEntryList();
114    AliDebug(AliLog::kDebug + 5, "->");
115    return 0;
116 }
117
118 //_________________________________________________________________________________________________
119 void AliMixEventPool::CreateEntryListsRecursivly(Int_t index)
120 {
121    //
122    // Helper function which create entrylist recursivly
123    //
124    AliDebug(AliLog::kDebug + 5, "<-");
125    AliMixEventCutObj *cut;
126    if (index >= 0) {
127       AliDebug(AliLog::kDebug, Form("index = %d", index));
128       cut = dynamic_cast<AliMixEventCutObj *>(fListOfEventCuts.At(index));
129       cut->Reset();
130       while (cut->HasMore()) {
131          cut->AddStep();
132          CreateEntryListsRecursivly(index - 1);
133          if (cut->HasMore()) {
134             fBinNumber++;
135             AliDebug(AliLog::kDebug, Form("fBinnumber = %d", fBinNumber));
136             AddEntryList();
137             //                 PrintCurrentCutIntervals();
138          }
139       }
140    }
141    AliDebug(AliLog::kDebug + 5, "->");
142 }
143
144 //_________________________________________________________________________________________________
145 TEntryList *AliMixEventPool::AddEntryList()
146 {
147    //
148    // Adds endtry list
149    //
150    AliDebug(AliLog::kDebug + 5, "<-");
151    TObjArrayIter next(&fListOfEventCuts);
152    AliMixEventCutObj *cut;
153    while ((cut = (AliMixEventCutObj *) next())) {
154       if (cut) cut->PrintCurrentInterval();
155    }
156    TEntryList *el = new TEntryList;
157    fListOfEntryList.Add(el);
158    AliDebug(AliLog::kDebug, Form("Number in Entry list -> %lld", el->GetN()));
159    AliDebug(AliLog::kDebug + 5, "->");
160    return el;
161 }
162
163 //_________________________________________________________________________________________________
164 Bool_t AliMixEventPool::AddEntry(Long64_t entry, AliVEvent *ev)
165 {
166    //
167    // Adds entry to correct entry list
168    //
169    AliDebug(AliLog::kDebug + 5, "<-");
170    AliDebug(AliLog::kDebug + 5, Form("AddEntry(%lld,%p)", entry, (void *)ev));
171    if (entry < 0) {
172       AliDebug(AliLog::kDebug, Form("Entry %lld was NOT added !!!", entry));
173       return kFALSE;
174    }
175    Int_t idEntryList = -1;
176    TEntryList *el =  FindEntryList(ev, idEntryList);
177    if (el) {
178       el->Enter(entry);
179       AliDebug(AliLog::kDebug, Form("Entry %lld was added with idEntryList %d !!!", entry, idEntryList));
180       return kTRUE;
181    }
182    AliDebug(AliLog::kDebug, Form("Entry %lld was NOT added !!!", entry));
183    AliDebug(AliLog::kDebug + 5, "->");
184    return kFALSE;
185 }
186
187 //_________________________________________________________________________________________________
188 TEntryList *AliMixEventPool::FindEntryList(AliVEvent *ev, Int_t &idEntryList)
189 {
190    //
191    // Find entrlist in list of entrlist
192    //
193    AliDebug(AliLog::kDebug + 5, "<-");
194    Int_t num = fListOfEventCuts.GetEntriesFast();
195    if (num < 1) return 0;
196    Int_t *indexes = new Int_t[num] ;
197    Int_t *lenght = new Int_t[num];
198    Int_t i = 0;
199    TObjArrayIter next(&fListOfEventCuts);
200    AliMixEventCutObj *cut;
201    while ((cut = (AliMixEventCutObj *) next())) {
202       indexes[i] = cut->GetIndex(ev);
203       if (indexes[i] < 0) {
204          AliDebug(AliLog::kDebug, Form("idEntryList %d", -1));
205          delete [] indexes;
206          delete [] lenght;
207          return 0;
208       }
209       lenght[i] = cut->GetNumberOfBins();
210       AliDebug(AliLog::kDebug + 1, Form("indexes[%d] %d", i, indexes[i]));
211       i++;
212    }
213    idEntryList = 0;
214    SearchIndexRecursive(fListOfEventCuts.GetEntries() - 1, &indexes[0], &lenght[0], idEntryList);
215    AliDebug(AliLog::kDebug, Form("idEntryList %d", idEntryList - 1));
216    // index which start with 0 (idEntryList-1)
217    delete [] indexes;
218    delete [] lenght;
219    AliDebug(AliLog::kDebug + 5, "->");
220    return (TEntryList *) fListOfEntryList.At(idEntryList - 1);
221 }
222
223 //_________________________________________________________________________________________________
224 void AliMixEventPool::SearchIndexRecursive(Int_t num, Int_t *i, Int_t *d, Int_t &index)
225 {
226    //
227    // Search for index of entrylist
228    //
229    AliDebug(AliLog::kDebug + 5, "<-");
230    if (num > 0) {
231       index += (i[num] - 1) * d[num-1];
232       SearchIndexRecursive(num - 1, i, d, index);
233    } else {
234       index += i[num];
235    }
236    AliDebug(AliLog::kDebug + 5, "->");
237 }
238
239 //_________________________________________________________________________________________________
240 void AliMixEventPool::SetCutValuesFromBinIndex(Int_t index)
241 {
242    //
243    // Sets cut value from bin index
244    //
245    Int_t numCuts = fListOfEventCuts.GetEntriesFast();
246    Int_t *lenght = new Int_t[numCuts];
247    Int_t *indexes = new Int_t[numCuts];
248    Long64_t timesNum = 1;
249    AliMixEventCutObj *cut;
250    Int_t i = 0, j = 0;
251    for (i = 0; i < numCuts; i++) {
252       cut = (AliMixEventCutObj *) fListOfEventCuts.At(i);
253       cut->Reset();
254       lenght[i] = cut->GetNumberOfBins();
255       indexes[i] = 1;
256       timesNum *= lenght[i];
257    }
258
259    if (index < 0 || index >= timesNum) {
260       AliError(Form("index=%d is out of range !!!", index));
261       return;
262    }
263
264    Long64_t indexNum = index;
265    for (i = 0; i < numCuts; i++) {
266       timesNum = 1;
267       for (j = 0; j < numCuts - i - 1; j++) timesNum *= lenght[j];
268       indexNum /= timesNum;
269       indexes[numCuts-i-1] = indexNum + 1;
270       index -= indexNum * timesNum;
271       indexNum = index;
272    }
273
274    for (i = 0; i < numCuts; i++) {
275       cut = (AliMixEventCutObj *) fListOfEventCuts.At(i);
276       for (j = 0; j < indexes[i]; j++) cut->AddStep();
277       cut->PrintCurrentInterval();
278
279    }
280
281    for (i = 0; i < numCuts; i++) AliDebug(AliLog::kDebug, Form("indexes[%d]=%d", i, indexes[i]));
282
283    delete [] lenght;
284    delete [] indexes;
285 }