ec820f0d4b31caf0e2da0cfab0a3eb4fb3acacb2
[u/mrichter/AliRoot.git] / EVE / EveHLT / AliEveHLTEventManager.cxx
1 #include "TEveManager.h"
2 #include "TEveScene.h"
3 #include "TEveProjectionManager.h"
4 #include "TEveBrowser.h"
5 #include "TGLViewer.h"
6 #include "TEveViewer.h"
7 #include "TEveEventManager.h"
8
9 #include "AliHLTEvePhos.h"
10 #include "AliHLTEveEmcal.h"
11 #include "AliHLTEveTPC.h"
12 #include "AliHLTEveHLT.h"
13 #include "AliHLTEveITS.h"
14 #include "AliHLTEveISPD.h"
15 #include "AliHLTEveISSD.h"
16 #include "AliHLTEveISDD.h"
17 #include "AliHLTEveTRD.h"
18 #include "AliHLTEveMuon.h"
19 #include "AliHLTEveAny.h"
20
21 #include "AliEveHLTEventManager.h"
22 #include "AliEveHOMERManager.h"
23 #include "AliEveEventBuffer.h"
24
25 #include "TList.h"
26 #include "TTimer.h"
27
28 #include "TThread.h"
29
30 ClassImp(AliEveHLTEventManager);
31
32 AliEveHLTEventManager::AliEveHLTEventManager() : 
33   TEveElementList("Event Manager"),
34   fGeoManager(NULL),
35   fEveManager(NULL),
36   fRPhiManager(NULL),
37   fRhoZManager(NULL),
38   fRPhiEventScene(NULL),
39   fRhoZEventScene(NULL),
40   fRhoZViewer(NULL),
41   fRPhiViewer(NULL),
42   fTimer(NULL),
43   fPhosElement(NULL), 
44   fEmcalElement(NULL), 
45   fTPCElement(NULL),
46   fHLTElement(NULL),
47   fITSElement(NULL),
48   fISPDElement(NULL),
49   fISSDElement(NULL),
50   fISDDElement(NULL),
51   fTRDElement(NULL),
52   fMuonElement(NULL),
53   fAnyElement(NULL),
54   fEventLoopStarted(kFALSE),
55   fCenterProjectionsAtPrimaryVertex(kFALSE),
56   fShowBarrel(kTRUE),
57   fShowMuon(kFALSE), 
58   fRunNumber(-1),
59   fEventId(-1)
60 {
61   // see header file for class documentation
62   // or
63   // refer to README to build package
64   // or
65   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
66    
67   fTimer = new TTimer();
68   fTimer->Connect("Timeout()", "AliEveHLTEventManager", this, "NextEvent()" );
69
70 }
71  
72 AliEveHLTEventManager::~AliEveHLTEventManager() {
73   
74   //DestroyElements();
75   //DestroyDetectorElements();  
76   
77 }
78
79
80 void AliEveHLTEventManager::DestroyDetectorElements(){
81   //See header file for documentation
82
83   if (fPhosElement)
84     delete fPhosElement;
85   fPhosElement = NULL;
86
87   if(fEmcalElement)
88     delete fEmcalElement;
89   fEmcalElement = NULL;
90
91   if(fTPCElement)
92     delete fTPCElement;
93   fTPCElement = NULL;
94
95   if(fHLTElement)
96     delete fHLTElement;
97   fHLTElement = NULL;
98
99   if(fITSElement)
100     delete fITSElement;
101   fITSElement = NULL;
102
103   if(fISSDElement)
104     delete fISSDElement;
105   fISSDElement = NULL;
106
107   if(fISDDElement)
108     delete fISDDElement;
109   fISDDElement = NULL;
110
111   if(fISPDElement)
112     delete fISPDElement;
113   fISPDElement = NULL;
114
115   if(fTRDElement)
116     delete fTRDElement;
117   fTRDElement = NULL;
118
119   if(fMuonElement)
120     delete fMuonElement;
121   fMuonElement = NULL;
122  
123   if(fAnyElement)
124     delete fAnyElement;
125   fAnyElement = NULL;
126   
127
128 }
129
130 ///_______________________________________________________________________________________
131 void AliEveHLTEventManager::ConnectEventBuffer() {
132   GetEventBuffer()->ConnectToSource();
133 }
134
135
136 ///___________________________________________________________________________________________
137 void AliEveHLTEventManager::StartBufferMonitor() { 
138   AliEveEventBuffer * buffer = GetEventBuffer();
139   buffer->StartBufferMonitor();
140 }
141
142 //______________________________________________________________________________________________
143 Int_t AliEveHLTEventManager::ProcessEvent(AliESDEvent * event) {
144
145   //We have a new event, reset display items (need to check if there really is anything interesting in event before resetting. ie not just histos)
146
147   gEve->DisableRedraw();
148
149   // -- Set EventID in Window Title  
150   TString winTitle("Eve Main Window");
151   SetRunNumber(event->GetRunNumber());
152   SetEventId(GetEventBuffer()->GetEventId());
153   winTitle += Form("-- Run Number: %d", GetRunNumber()); 
154   winTitle += Form("-- Event ID : 0x%016lX ", GetEventId() );
155   GetEveManager()->GetBrowser()->SetWindowName(winTitle);
156
157
158   
159   cout << "reset()"<<endl;
160   
161   ResetDisplay();
162   
163   cout << "process()"<<endl;
164   if(!fHLTElement) {
165     fHLTElement = new AliHLTEveHLT();
166     fHLTElement->SetEventManager(this);
167     gEve->AddElement(fHLTElement);
168  }
169   fHLTElement->ProcessEsdEvent(event);
170
171   if(!fPhosElement) CreatePhosElement();
172   fPhosElement->ProcessEvent(event);
173   
174   if(!fEmcalElement) CreateEmcalElement();
175   fEmcalElement->ProcessEvent(event);
176   
177   cout << "update()"<<endl;
178   UpdateDisplay();
179
180   gEve->Redraw3D(0, 1);
181   gEve->EnableRedraw();
182
183   return 0;
184
185 }
186
187
188
189 //______________________________________________________________________________________________
190 Int_t AliEveHLTEventManager::ProcessEvent(TList * blockList) {
191
192   //We have a new event, reset display items (need to check if there really is anything interesting in event before resetting. ie not just histos)
193   
194   if(!blockList) {
195     cout << "Block list is NULL pointer, return " << endl;
196     return -1;
197   }
198  
199   AliHLTHOMERBlockDesc * block = NULL;
200   TIter next(blockList);
201   while ((block = (AliHLTHOMERBlockDesc*)next())) {
202     cout <<"Process Block"<<endl;
203     ProcessBlock(block);
204   } 
205   
206   return 0;
207
208 }
209 ///___________________________________________________________________________________________
210
211 void AliEveHLTEventManager::ProcessBlock(AliHLTHOMERBlockDesc * block) {
212   //See header file for documentation
213   
214 #if 1//DEBUG
215   printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
216   printf( "Detector           : %s\n", block->GetDetector().Data() );
217   printf( "Datatype           : %s\n", block->GetDataType().Data() );
218   if (block->IsTObject() )
219     printf( "Is TObject of class: %s\n", block->GetClassName().Data() );
220   printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
221 #endif
222
223
224   if(fShowBarrel) {
225
226     if ( ! block->GetDetector().CompareTo("PHOS") ) {
227       if(!fPhosElement) CreatePhosElement();
228       fPhosElement->ProcessBlock(block);
229     }
230     
231     else if ( ! block->GetDetector().CompareTo("EMCA") ) {
232       if(!fEmcalElement) CreateEmcalElement();
233       fEmcalElement->ProcessBlock(block);
234     }  
235     
236     else if ( ! block->GetDetector().CompareTo("TPC") ) {
237       if(!fTPCElement) CreateTPCElement();
238       fTPCElement->ProcessBlock(block);
239     }
240     
241     else if ( ! block->GetDetector().CompareTo("HLT") ) {
242       if(!fHLTElement) CreateHLTElement();
243       
244       if(!block->GetDataType().CompareTo("ALIESDV0")) {
245         AliESDEvent * event = dynamic_cast<AliESDEvent *>(block->GetTObject());
246         if(event) {
247           ProcessEvent(event);
248         }
249       } else {
250         fHLTElement->ProcessBlock(block);
251       }
252     }
253
254     else if ( ! block->GetDetector().CompareTo("ITS") ) {
255       if(!fITSElement) CreateITSElement();
256       fITSElement->ProcessBlock(block);
257     }
258     
259     else if ( ! block->GetDetector().CompareTo("ISDD") ) {
260       if(!fISDDElement) CreateISDDElement();
261       fISDDElement->ProcessBlock(block);
262     }
263     
264     else if ( ! block->GetDetector().CompareTo("ISPD") ) {
265       if(!fISPDElement) CreateISPDElement();
266       fISPDElement->ProcessBlock(block);
267     }
268     
269     else if ( ! block->GetDetector().CompareTo("ISSD") ) {
270       if(!fISSDElement) CreateISSDElement();
271       fISSDElement->ProcessBlock(block);
272     }
273     
274     else if ( ! block->GetDetector().CompareTo("TRD") ) {
275       if(!fTRDElement) CreateTRDElement();
276       fTRDElement->ProcessBlock(block);
277     }
278     
279     else if ( ! block->GetDetector().CompareTo("MUON") ) {
280       //Do Nothing
281     } else {
282       if(!fAnyElement) {
283         fAnyElement = new AliHLTEveAny();
284         fAnyElement->SetEventManager(this);
285       } 
286       fAnyElement->ProcessBlock(block);
287     }
288      
289   }
290
291    
292   if(fShowMuon) {
293     if ( ! block->GetDetector().CompareTo("MUON") ) {
294       if(!fMuonElement) {
295         fMuonElement = new AliHLTEveMuon();
296         fMuonElement->SetEventManager(this);
297         gEve->AddElement(fMuonElement);
298       }
299       fMuonElement->ProcessBlock(block);
300     }
301   }
302
303 }
304
305 void AliEveHLTEventManager::ResetDisplay () {
306   //See header file for documentation
307
308  if(fPhosElement)
309    fPhosElement->ResetElements();
310  
311  if(fEmcalElement)
312    fEmcalElement->ResetElements();
313  
314  if(fTPCElement)
315    fTPCElement->ResetElements();
316  
317  if(fHLTElement)
318    fHLTElement->ResetElements();
319  
320  if(fITSElement)
321    fITSElement->ResetElements();
322  
323  if(fISPDElement)
324    fISPDElement->ResetElements();
325  
326  if(fISDDElement)
327    fISDDElement->ResetElements();
328  
329  if(fISSDElement)
330    fISSDElement->ResetElements();
331
332  if (fTRDElement)
333    fTRDElement->ResetElements();
334
335  if(fAnyElement)
336    fAnyElement->ResetElements();
337
338  if(fMuonElement)
339    fMuonElement->ResetElements();
340
341 }
342
343
344 void AliEveHLTEventManager::PrintScreens() {
345 //   //See header file for documentation
346
347   fEveManager->GetDefaultGLViewer()->SavePicture(Form("%d_0x%016lX_3D.gif", fRunNumber, GetEventId()));
348   fRhoZViewer->GetGLViewer()->SavePicture(Form("%d_0x%016lX_RhoZ.gif", fRunNumber, GetEventId()));
349   fRPhiViewer->GetGLViewer()->SavePicture(Form("%d_0x%016lX_RPhi.gif", fRunNumber, GetEventId()));
350   return;
351 }
352
353
354 void AliEveHLTEventManager::StartLoop() {
355   //See header file for documentation
356   //fTimer->SetCommand("NextEvent()", "AliEveHLTEventManager", this);
357   NextEvent();
358   SetEventLoopStarted(kTRUE);
359   fTimer->Start(15000);
360 }
361
362 void AliEveHLTEventManager::StopLoop() {
363   //See header file for documentation
364   fTimer->Stop();
365   SetEventLoopStarted(kFALSE);
366 }
367
368
369 // void AliEveHLTEventManager::NavigateBack() {
370   
371 //   if (fHomerManager->NavigateEventBufferBack()) {
372 //     //return -1;
373 //   } else {
374     
375 //     TList * blockList = fHomerManager->GetBlockList();
376 //     if(blockList) {      
377 //       ProcessEvent(blockList);
378 //     } else {
379 //       cout << "BALLE Error blocklist NULL pointer even though it's navigateable"<<endl;
380 //     }
381 //   }   
382
383 // }
384
385 // void AliEveHLTEventManager::NavigateFwd() {
386
387 //   if (fHomerManager->NavigateEventBufferFwd()) {
388 //     cout << "No event available" << endl;
389 //     return;
390 //     //return -1;
391 //   } else {
392 //     cout << "Getting block list" << endl;
393 //     TList * blockList = fHomerManager->GetBlockList();
394 //     if (blockList){
395 //       ProcessEvent(blockList);
396 //     } else {
397 //       cout << "blockList is NULL pointer"<<endl;
398 //     }
399 //   }
400
401 // }
402
403 void  AliEveHLTEventManager::UpdateDisplay() {
404   //See header file for documentation
405   if(fPhosElement) fPhosElement->UpdateElements();
406   if(fEmcalElement) fEmcalElement->UpdateElements();
407   if(fTPCElement) fTPCElement->UpdateElements();
408   if(fHLTElement) fHLTElement->UpdateElements();
409   if(fITSElement) fITSElement->UpdateElements();
410   if(fISSDElement) fISSDElement->UpdateElements();
411   if(fISDDElement) fISDDElement->UpdateElements();
412   if(fISPDElement) fISPDElement->UpdateElements();
413   if(fTRDElement) fTRDElement->UpdateElements();
414   if(fAnyElement) fAnyElement->UpdateElements();
415   if(fMuonElement) fMuonElement->UpdateElements();
416
417
418   //==============================================================================
419   // -- Import global scene into projection scenes
420   //==============================================================================
421
422   Double_t x[3] = { 0, 0, 0 };
423   
424   TEveElement* top = GetEveManager()->GetCurrentEvent();
425   
426   if (fRPhiManager && top) {
427     fRPhiEventScene->DestroyElements();
428     if (fCenterProjectionsAtPrimaryVertex)
429       fRPhiManager->SetCenter(x[0], x[1], x[2]);
430     fRPhiManager->ImportElements(top, fRPhiEventScene);
431   }
432   
433   if (fRhoZManager && top) {
434     fRhoZEventScene->DestroyElements();
435     if (fCenterProjectionsAtPrimaryVertex)
436       fRhoZManager->SetCenter(x[0], x[1], x[2]);
437     fRhoZManager->ImportElements(top, fRhoZEventScene);
438   }
439
440
441   //Redraw the display
442   GetEveManager()->Redraw3D(0,1); // (0, 1)
443   GetEveManager()->EnableRedraw(); 
444
445 }
446
447 void AliEveHLTEventManager::SaveEveryThing() {
448
449   PrintScreens();
450
451   GetEventBuffer()->WriteToFile(GetRunNumber());
452   //Save everything to file
453   //fEventBuffer->SaveBlockList();
454   //fEventBuffer->SaveAsyncBlockList();
455
456
457 }
458
459
460
461 void AliEveHLTEventManager::CreatePhosElement() {
462   fPhosElement = new AliHLTEvePhos();
463   fPhosElement->SetEventManager(this);
464   gEve->AddElement(fPhosElement);
465 }
466
467 void AliEveHLTEventManager::CreateEmcalElement() {
468   fEmcalElement = new AliHLTEveEmcal();
469   fEmcalElement->SetEventManager(this);
470   gEve->AddElement(fEmcalElement);
471 }
472 void AliEveHLTEventManager::CreateTPCElement() {
473   fTPCElement = new AliHLTEveTPC();
474   fTPCElement->SetEventManager(this);
475   gEve->AddElement(fTPCElement);
476 }
477 void AliEveHLTEventManager::CreateITSElement() {
478   fITSElement = new AliHLTEveITS();
479   fITSElement->SetEventManager(this);
480   gEve->AddElement(fITSElement);
481 }
482 void AliEveHLTEventManager::CreateISPDElement() {
483   fISPDElement = new AliHLTEveISPD();
484   fISPDElement->SetEventManager(this);
485   gEve->AddElement(fISPDElement);
486 }
487 void AliEveHLTEventManager::CreateISDDElement() {
488   fISDDElement = new AliHLTEveISDD();
489   fISDDElement->SetEventManager(this);
490   gEve->AddElement(fISSDElement);
491 }
492 void AliEveHLTEventManager::CreateISSDElement() {
493   fISSDElement = new AliHLTEveISSD();
494   fISSDElement->SetEventManager(this);
495   gEve->AddElement(fISSDElement);
496 }
497 void AliEveHLTEventManager::CreateTRDElement() {
498   fTRDElement = new AliHLTEveTRD();
499   fTRDElement->SetEventManager(this);
500   gEve->AddElement(fTRDElement);
501 }
502 void AliEveHLTEventManager::CreateHLTElement() {
503   fHLTElement = new AliHLTEveHLT();
504   fHLTElement->SetEventManager(this);
505   gEve->AddElement(fHLTElement);
506 }
507
508