8b03fef1c9d15d5764649a54263959ab22f4d9ba
[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   //
26   // Default constructor.
27   //
28
29   AliDebug(AliLog::kDebug + 5, "<-");
30   AliDebug(AliLog::kDebug + 5, "->");
31 }
32 //_________________________________________________________________________________________________
33 AliMixEventPool::AliMixEventPool(const AliMixEventPool& obj) : TNamed(obj),
34     fListOfEntryList(obj.fListOfEntryList),
35     fListOfEventCuts(obj.fListOfEventCuts),
36     fBinNumber(obj.fBinNumber) {
37   //
38   // Copy constructor
39   //
40   AliDebug(AliLog::kDebug + 5, "<-");
41   AliDebug(AliLog::kDebug + 5, "->");
42 }
43 //_________________________________________________________________________________________________
44 AliMixEventPool::~AliMixEventPool() {
45   //
46   // Destructor
47   //
48   AliDebug(AliLog::kDebug + 5, "<-");
49   AliDebug(AliLog::kDebug + 5, "->");
50 }
51 //_________________________________________________________________________________________________
52 void AliMixEventPool::AddCut(AliMixEventCutObj* cut) {
53   //
54   // Adds cut
55   //
56
57   if (cut) fListOfEventCuts.Add(cut);
58 }
59 //_________________________________________________________________________________________________
60 void AliMixEventPool::Print(const Option_t* option) const {
61   //
62   // Prints usefull information
63   //
64
65   TObjArrayIter next(&fListOfEventCuts);
66   //   Int_t c=0;
67   AliMixEventCutObj *cut;
68   while ((cut = (AliMixEventCutObj *) next())) {
69     cut->Print(option);
70   }
71
72   AliInfo(Form("NumOfEntryList %d", fListOfEntryList.GetEntries()));
73
74   TEntryList *el;
75   for (Int_t i = 0;i < fListOfEntryList.GetEntries();i++) {
76     el = (TEntryList*) fListOfEntryList.At(i);
77
78     AliInfo(Form("EntryList[%d] %lld", i, el->GetN()));
79   }
80 }
81 //_________________________________________________________________________________________________
82 Int_t AliMixEventPool::Init() {
83   //
84   // Init event pool
85   //
86   AliDebug(AliLog::kDebug+5,"<-");
87   CreateEntryListsRecursivly(fListOfEventCuts.GetEntries() - 1);
88
89   fBinNumber++;
90   AliDebug(AliLog::kDebug, Form("fBinnumber = %d", fBinNumber));
91
92   AddEntryList();
93   AliDebug(AliLog::kDebug+5,"->");
94   return 0;
95 }
96
97 //_________________________________________________________________________________________________
98 void AliMixEventPool::CreateEntryListsRecursivly(Int_t index) {
99   //
100   // Helper function which create entrylist recursivly
101   //
102   AliDebug(AliLog::kDebug+5,"<-");
103   AliMixEventCutObj *cut;
104   if (index >= 0) {
105     AliDebug(AliLog::kDebug, Form("index = %d", index));
106     cut = dynamic_cast<AliMixEventCutObj*>(fListOfEventCuts.At(index));
107     cut->Reset();
108
109     while (cut->HasMore()) {
110       cut->AddStep();
111       CreateEntryListsRecursivly(index - 1);
112       if (cut->HasMore()) {
113         fBinNumber++;
114         AliDebug(AliLog::kDebug, Form("fBinnumber = %d", fBinNumber));
115         AddEntryList();
116         //                 PrintCurrentCutIntervals();
117       }
118     }
119
120   }
121   AliDebug(AliLog::kDebug+5,"->");
122 }
123
124 //_________________________________________________________________________________________________
125 TEntryList* AliMixEventPool::AddEntryList() {
126   //
127   // Adds endtry list
128   //
129   
130   AliDebug(AliLog::kDebug+5,"<-");
131   
132   TObjArrayIter next(&fListOfEventCuts);
133   AliMixEventCutObj *cut;
134   while ((cut = (AliMixEventCutObj*) next())) {
135     if (cut) cut->PrintCurrentInterval();
136   }
137
138   TEntryList *el = new TEntryList;
139   fListOfEntryList.Add(el);
140
141   AliDebug(AliLog::kDebug, Form("Number in Entry list -> %lld", el->GetN()));
142   AliDebug(AliLog::kDebug+5,"->");
143   return el;
144 }
145
146 //_________________________________________________________________________________________________
147 Bool_t AliMixEventPool::AddEntry(Long64_t entry, AliVEvent* ev) {
148   //
149   // Adds entry to correct entry list
150   //
151   
152   AliDebug(AliLog::kDebug+5,"<-");
153   AliDebug(AliLog::kDebug + 5, Form("AddEntry(%lld,%p)", entry, ev));
154   if (entry < 0) {
155     AliDebug(AliLog::kDebug, Form("Entry %lld was NOT added !!!", entry));
156     return kFALSE;
157
158   }
159
160   TEntryList *el =  FindEntryList(ev);
161   if (el) {
162     el->Enter(entry);
163     AliDebug(AliLog::kDebug, Form("Entry %lld was added !!!", entry));
164     return kTRUE;
165   }
166
167   AliDebug(AliLog::kDebug, Form("Entry %lld was NOT added !!!", entry));
168   AliDebug(AliLog::kDebug+5,"->");
169   return kFALSE;
170 }
171
172 //_________________________________________________________________________________________________
173 TEntryList* AliMixEventPool::FindEntryList(AliVEvent* ev) {
174   //
175   // Find entrlist in list of entrlist
176   //
177   
178   AliDebug(AliLog::kDebug+5,"<-");
179   const Int_t num = fListOfEventCuts.GetEntries();
180   if (num <= 0) return 0;
181
182   Int_t indexes[num];
183   Int_t lenght[num];
184   Int_t i = 0;
185   TObjArrayIter next(&fListOfEventCuts);
186   AliMixEventCutObj *cut;
187   while ((cut = (AliMixEventCutObj*) next())) {
188     indexes[i] = cut->GetIndex(ev);
189     if (indexes[i] < 0) {
190       AliDebug(AliLog::kDebug, Form("retIndex %d", -1));
191       return 0;
192     }
193     lenght[i] = cut->GetNumberOfBins();
194     AliDebug(AliLog::kDebug + 1, Form("indexes[%d] %d", i, indexes[i]));
195     i++;
196   }
197
198   Int_t retIndex = 0;
199   SearchIndexRecursive(fListOfEventCuts.GetEntries() - 1, &indexes[0], &lenght[0], retIndex);
200   AliDebug(AliLog::kDebug, Form("retIndex %d", retIndex - 1));
201   // index which start with 0 (retIndex-1)
202   AliDebug(AliLog::kDebug+5,"->");
203   return (TEntryList*) fListOfEntryList.At(retIndex - 1);
204 }
205
206 //_________________________________________________________________________________________________
207 void AliMixEventPool::SearchIndexRecursive(Int_t num, Int_t* i, Int_t* d, Int_t& index) {
208   //
209   // Search for index of entrylist
210   //
211   
212   AliDebug(AliLog::kDebug+5,"<-");
213   if (num > 0) {
214     index += (i[num] - 1) * d[num-1];
215     SearchIndexRecursive(num - 1, i, d, index);
216   } else {
217     index += i[num];
218   }
219   AliDebug(AliLog::kDebug+5,"->");
220 }