Merge branch 'multipleThreads' into newdevel
[u/mrichter/AliRoot.git] / EVE / EveHLT / AliEveEventBuffer.cxx
CommitLineData
30e7579c 1#include <iostream>
2
3#include "TObjArray.h"
4#include "TTimer.h"
5#include "TThread.h"
6#include "AliEveEventBuffer.h"
7
8
9//Not needed, only for debug
10#include "AliESDEvent.h"
11
12using namespace std;
13
14ClassImp(AliEveEventBuffer)
15
16///_______________________________________________________________________
17AliEveEventBuffer::AliEveEventBuffer() :
18 fBufferSize(10),
19 fPreBuffer(4),
20 fBusy(kFALSE),
21 fEventBuffer(NULL),
22 fCurrentEvent(NULL),
23 fBIndex(),
24 fTimer(NULL),
25 fThread(NULL),
b088c0a1 26 fEventId(),
27 fBufferMonStarted(kFALSE)
30e7579c 28 {
29 // see header file for class documentation
30 fEventBuffer = new TObjArray(10, 0);
31 fEventBuffer->SetOwner(kTRUE);
32
33 for(int id = 0; id < kSize; id++) {
34 fBIndex[id] = -1;
35 }
36
37 fTimer = new TTimer();
38 fTimer->Connect("Timeout()", "AliEveEventBuffer", this, "MonitorBuffer()");
39
40 fEventId = new Int_t[fBufferSize];
41
42
43}
44
45
46
47///_______________________________________________________________________
48AliEveEventBuffer::~AliEveEventBuffer() {
49 // see header file for class documentation
50
51 if ( fEventBuffer ) {
52 fEventBuffer->Clear();
53 delete fEventBuffer;
54 }
55 fEventBuffer = NULL;
56
57 if(fCurrentEvent)
58 delete fCurrentEvent;
59 fCurrentEvent = NULL;
60
61}
62
63///___________________________________________________________________________
64void * AliEveEventBuffer::BufferThread(void * buffer) {
b088c0a1 65 if(buffer) {
66 if (!reinterpret_cast<AliEveEventBuffer*>(buffer)->GetBufferMonStarted()) {
67 reinterpret_cast<AliEveEventBuffer*>(buffer)->StartBufferMonitor();
68 }
69 }
30e7579c 70 return (void*)0;
71}
72
73///_____________________________________________________________________________
74void AliEveEventBuffer::MonitorBuffer() {
75 cout << "Monitorbuffer: " << endl;
76 if(fBusy) {
77 cout << "Already called FetchEvent()" << endl;
78 return;
79 } else {
80 cout << "fbusy = false"<<endl;
81
82 if ( (CalculateDifference(fBIndex[kTop],fBIndex[kLast]) < fPreBuffer) ) {
83 fBusy = kTRUE;
84 FetchEvent();
85 fBusy = kFALSE;
86 } else {
87 //StopBufferMonitor();
88 fBusy = kFALSE;
89 }
90 }
91}
92
93///_______________________________________________________________________________
94TObject * AliEveEventBuffer::NextEvent() {
95 //See header file for documentation
96 if(fBusy) {
97 cout << "Event Buffer busy"<<endl;
98 return NULL;
99 }
100 else SetBusy(kTRUE);
101 cout << "In enxtevent"<<endl;
102 TObject * nextEvent = GetNextUnSeen();
103 SetBusy(kFALSE);
104 return nextEvent;
105}
106
107///______________________________________________________________________________
108TObject * AliEveEventBuffer::Back() {
109 cout << "go back"<<endl;
110 PrintIndeces();
111 Int_t prevId = CalculatePrevious(fBIndex[kCurrent]);
112 if(prevId == fBIndex[kTop]) {
113 cout << "returning NULL" << endl;
114 return NULL;
115 } else {
116 fBIndex[kCurrent] = prevId;
117 PrintIndeces();
118 cout <<"returning: "<< fBIndex[kCurrent] << " " << fEventBuffer->At(fBIndex[kCurrent]);
119 return fEventBuffer->At(fBIndex[kCurrent]);
120 }
121}
122
123///______________________________________________________________________________
124TObject * AliEveEventBuffer::Fwd() {
125 PrintIndeces();
126 if (fBIndex[kCurrent] == fBIndex[kLast]) {
127 cout<< "returning NULL"<<endl;
128 return NULL;
129 }
130
131 fBIndex[kCurrent] = CalculateNext(fBIndex[kCurrent]);
132 TObject * event = fEventBuffer->At(fBIndex[kCurrent]);
133 return event;
134}
135
136
137
138///________________________________________________________________________________
139TObject * AliEveEventBuffer::GetNextUnSeen() {
140 //See header file for documentation
141 cout << "GetNextUnSeend"<<endl;
142 PrintIndeces();
143 if(CalculateDifference(fBIndex[kTop], fBIndex[kLast])) {
144 fBIndex[kLast] = CalculateNext(fBIndex[kLast]);
145 fBIndex[kCurrent] = fBIndex[kLast];
146 PrintIndeces();
147 return fEventBuffer->At(fBIndex[kCurrent]);
148 } else {
149 cout << "No new event available, only events in buffer available!"<<endl;
150 return NULL;
151 }
152}
153///_________________________________________________________________________________
154void AliEveEventBuffer::PrintIndeces() {
155 for(Int_t i = 0; i < kSize; i++) {
156 cout << i << ": " << fBIndex[i] << endl;
157 }
158}
159///_________________________________________________________________________________
160void AliEveEventBuffer::PrintBuffer() {
161 for(Int_t i = 0; i < 10; i++) {
162 AliESDEvent * event = dynamic_cast<AliESDEvent*>(fEventBuffer->At(i));
163 if(event) {
164 cout << i << ": " <<event << " " << event->GetEventNumberInFile() << endl;;
165 }
166 }
167}
168
169///____________________________________________________________________________________
170void AliEveEventBuffer::FetchEvent() {
171 cout << "FetchEvent " << endl;
172 TObject * event = GetEventFromSource();
173 if(event) AddToBuffer(event);
174 PrintIndeces();
175 cout << "FetchedEvent " << endl;
176
177}
178
179///_________________________________________________________________________________
180void AliEveEventBuffer::AddToBuffer(TObject * event) {
181 cout << "Add to buffer"<<endl;
182 if(!event) return;
183
184 fBIndex[kTop] = CalculateNext(fBIndex[kTop]);
185 //Delete the event already there (ok to delete as object, not aliesdevent, TList?)
186 TObject * object = fEventBuffer->At(fBIndex[kTop]);
187 if (object) delete object;
188 fEventBuffer->AddAt(event, fBIndex[kTop]);
189}
190
191
192
193///_____________________________________________________________________________________
194Int_t AliEveEventBuffer::CalculateNext(Int_t current) {
195 //See header file for documentation
196 current++;
197 if(current == fBufferSize) current = 0;
198 return current;
199}
200
201
202///_____________________________________________________________________________________
203Int_t AliEveEventBuffer::CalculatePrevious(Int_t current) {
204 //See header file for documentation
205 cout << "CalculatePrev: " << current;
206 current--;
207 if(current == -1) current += fBufferSize;
208 cout << "... " << current << endl;
209 return current;
210}
211
212///__________________________________________________________________________________
213Int_t AliEveEventBuffer::CalculateDifference(Int_t top, Int_t low) {
214 //See header file for documentation
215 if (top > low) {
216 // cout << "top > low"<<endl;
217 return (top - low);
218 } else if (top < low) {
219 // cout << "low < top"<<endl;
220 return (fBufferSize - low + top);
221 } else {
222 //cout << "calculated to 0"<<endl;
223 return 0;
224 }
225}
226
227///___________________________________________________________________________________
228void AliEveEventBuffer::StartBufferMonitor() {
229 //cout << "NOT !!! starting buffer mon"<<endl;
230 cout << "starting buffer mon"<<endl;
231 fTimer->Start(5000);
232}
233///___________________________________________________________________________________
234void AliEveEventBuffer::StopBufferMonitor() {
235 cout << "Stopping buffer mon"<<endl;
236 fTimer->Stop();
237}
238
239
240// //_________________________________________________________________________________
241// Int_t AliEveEventBuffer::NavigateEventBufferBack() {
242// // see header file for class documentation
243
244// // -- reached the end of the buffer
245// if ( fNavigateBufferIdx == fBufferLowIdx )
246// return -1;
247
248// Int_t newIdx = fNavigateBufferIdx - 1;
249// if ( newIdx == -1 )
250// newIdx = BUFFERSIZE-1;
251
252// fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
253
254// return newIdx;
255// }
256
257// //_______________________________________________________________
258// Int_t AliEveEventBuffer::NavigateEventBufferFwd() {
259// // see header file for class documentation
260
261// // -- reached the top of the buffer
262// if ( fNavigateBufferIdx == fBufferTopIdx )
263// return -1;
264
265// Int_t newIdx = fNavigateBufferIdx + 1;
266// if ( newIdx == BUFFERSIZE )
267// newIdx = 0;
268
269// fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
270
271// return newIdx;
272// }
273
274// void AliEveEventBuffer::MonitorBuffer() {
275// //See header file for documentation
276// if( GetNAvailableEvents() < 10) {
277// StopBufferChecker();
278// StartLoop();
279// }
280// }
281
282// void AliEveEventBuffer::StartLoop() {
283// //See header file for documentation
284// fTimer->Start(2000);
285// }
286// void AliEveEventBuffer::StopLoop() {
287// //See header file for documentation
288// fTimer->Stop();
289// }
290
291// void AliEveEventBuffer::StartBufferChecker() {
292// //See header file for documentation
293// fBufferTimer->Start(2000);
294// }
295// void AliEveEventBuffer::StopBufferChecker() {
296// //See header file for documentation
297// fBufferTimer->Stop();
298// }
299
300// AliESDEvent * GetNextEvent() {
301
302// tree->GetEntry(fEvent++);
303
304// AliESDEvent * event = new AliESDEvent();
305// event->ReadFromTree(fTree);
306// if (event) {
307// return event;
308// } else {
309// cout << "error getting event" << endl;
310// return NULL;
311// }
312// }