Bugfixes enabling buffer navigation
[u/mrichter/AliRoot.git] / EVE / EveHLT / AliEveHOMERManager.cxx
1 //-*- Mode: C++ -*-
2
3 // $Id$
4 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007              *
5 // Author: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>                *
6 // Author: 2010 Svein Lindal <slindal@fys.uio.no>                        *
7 //         for The ALICE HLT Project.                                    *
8
9
10
11 /** @file   AliEveHOMERManager.cxx
12     @author Jochen Thaeder,  Svein Lindal <slindal@fys.uio.no>
13     @date
14     @brief  Manager for HOMER online
15 */
16
17 #if __GNUC__>= 3
18    using namespace std;
19 #endif
20
21 #include "unistd.h"
22 #include "TEveManager.h"
23 #include "TTimer.h"
24 #include "TEveScene.h"
25 #include "TEveProjectionManager.h"
26 #include "TEveBrowser.h"
27
28 #include "AliEveHOMERManager.h"
29 #include "AliHLTHOMERBlockDesc.h"
30 #include "AliHLTHOMERManager.h"
31 #include "AliHLTTriggerDecision.h"
32 #include "AliHLTEvePhos.h"
33 #include "AliHLTEveEmcal.h"
34 #include "AliHLTEveTPC.h"
35 #include "AliHLTEveHLT.h"
36 #include "AliHLTEveITS.h"
37 #include "AliHLTEveISPD.h"
38 #include "AliHLTEveISSD.h"
39 #include "AliHLTEveISDD.h"
40 #include "AliHLTEveTRD.h"
41 #include "AliHLTEveMuon.h"
42 #include "AliHLTEveAny.h"
43 #include "AliEveHOMERSourceList.h"
44
45 //#include "TTimer.h"
46
47 ClassImp(AliEveHOMERManager)
48   
49 /*
50  * ---------------------------------------------------------------------------------
51  *                            Constructor / Destructor
52  * ---------------------------------------------------------------------------------
53  */
54   
55 //##################################################################################
56 AliEveHOMERManager::AliEveHOMERManager() :
57 TEveElementList("Homer Manager"),
58   AliHLTHOMERManager(), 
59   fSrcList(NULL),
60   fRetryCount(1000),
61   fRetrySleeptime(15),
62   fGeoManager(NULL),
63   fEveManager(NULL),
64   fRPhiManager(NULL),
65   fRhoZManager(NULL),
66   fRPhiEventScene(NULL),
67   fRhoZEventScene(NULL),
68   fTimer(NULL),
69 //  fSourceListTimer(NULL),
70   fPhosElement(NULL), 
71   fEmcalElement(NULL), 
72   fTPCElement(NULL),
73   fHLTElement(NULL),
74   fITSElement(NULL),
75   fISPDElement(NULL),
76   fISSDElement(NULL),
77   fISDDElement(NULL),
78   fTRDElement(NULL),
79   fMuonElement(NULL),
80   fAnyElement(NULL),
81   fEventLoopStarted(kFALSE),
82   fCenterProjectionsAtPrimaryVertex(kFALSE),
83   fShowBarrel(kTRUE),
84   fShowMuon(kFALSE) 
85 {
86   // see header file for class documentation
87   // or
88   // refer to README to build package
89   // or
90   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
91    
92   fTimer = new TTimer();
93   fTimer->Connect("Timeout()", "AliEveHOMERManager", this, "NextHOMEREvent()" );
94
95   //fSourceListTimer = new TTimer();
96
97   fPhosElement = new AliHLTEvePhos();
98   fPhosElement->SetEventManager(this);
99    
100   fEmcalElement = new AliHLTEveEmcal();
101   fEmcalElement->SetEventManager(this);
102    
103   fTPCElement = new AliHLTEveTPC();
104   fTPCElement->SetEventManager(this);
105    
106   fHLTElement = new AliHLTEveHLT();
107   fHLTElement->SetEventManager(this);
108    
109   fITSElement = new AliHLTEveITS();
110   fITSElement->SetEventManager(this);
111   
112   fISPDElement = new AliHLTEveISPD();
113   fISPDElement->SetEventManager(this);
114
115   fISDDElement = new AliHLTEveISDD();
116   fISDDElement->SetEventManager(this);
117
118   fISSDElement = new AliHLTEveISSD();
119   fISSDElement->SetEventManager(this);
120
121   fTRDElement = new AliHLTEveTRD();
122   fTRDElement->SetEventManager(this);
123
124 }
125
126 //##################################################################################
127 AliEveHOMERManager::~AliEveHOMERManager() {
128  // see header file for class documentation 
129
130   DestroyElements();
131   DestroyDetectorElements();
132
133 }
134
135
136
137 void AliEveHOMERManager::DestroyDetectorElements(){
138   //See header file for documentation
139   if (fSrcList)
140     delete fSrcList;
141   fSrcList = NULL;
142
143   if (fPhosElement)
144     delete fPhosElement;
145   fPhosElement = NULL;
146
147   if(fEmcalElement)
148     delete fEmcalElement;
149   fEmcalElement = NULL;
150
151   if(fTPCElement)
152     delete fTPCElement;
153   fTPCElement = NULL;
154
155   if(fHLTElement)
156     delete fHLTElement;
157   fHLTElement = NULL;
158
159   if(fITSElement)
160     delete fITSElement;
161   fITSElement = NULL;
162
163   if(fISSDElement)
164     delete fISSDElement;
165   fISSDElement = NULL;
166
167   if(fISDDElement)
168     delete fISDDElement;
169   fISDDElement = NULL;
170
171   if(fISPDElement)
172     delete fISPDElement;
173   fISPDElement = NULL;
174
175   if(fTRDElement)
176     delete fTRDElement;
177   fTRDElement = NULL;
178
179   if(fMuonElement)
180     delete fMuonElement;
181   fMuonElement = NULL;
182  
183   if(fAnyElement)
184     delete fAnyElement;
185   fAnyElement = NULL;
186   
187
188 }
189
190
191
192 /*
193  * ---------------------------------------------------------------------------------
194  *                                 Source Handling
195  * ---------------------------------------------------------------------------------
196  */
197
198 //##################################################################################
199 Int_t AliEveHOMERManager::CreateEveSourcesList() {
200   // see header file for class documentation
201
202   DestroyElements();
203
204   Int_t iResult = CreateSourcesList();
205
206   //  fStateHasChanged = kTRUE;
207   
208   HLTDebug(Form("iResult XXX %d", iResult));
209   if ( iResult )
210     return iResult;
211
212
213   HLTDebug(Form("iResult %d", iResult));
214   if (fSrcList) {
215     HLTInfo(Form("delete source list", iResult));
216     DestroyElements();
217     //delete fSrcList;
218     fSrcList = NULL;
219     //fSrcList->Clear();
220     HLTInfo(Form("cleared source list", iResult));
221   }
222
223
224   // -- Create new AliEVE sources list 
225   if(!fSrcList){
226     HLTInfo(Form("no source list", iResult));
227     fSrcList = new AliEveHOMERSourceList("HLT Sources");
228     fSrcList->SetManager(this);
229     
230     AddElement(fSrcList);
231   }
232   
233   //HLTInfo(Form("createbytype", iResult));
234   fSrcList->CreateByDet();
235   
236   HLTDebug(Form("Done createing source list %d", iResult));    
237   
238   
239   
240   return iResult;
241 }
242
243 //##################################################################################
244 Int_t AliEveHOMERManager::CreateEveSourcesListLoop() {
245   // see header file for class documentation
246
247   Int_t iResult = 0;
248
249   for ( Int_t retry = 0; retry < fRetryCount ; retry++ ) {
250
251     iResult = CreateEveSourcesList();
252
253     if (!iResult) {
254       HLTInfo("Source list successfully created.");
255       break;
256     }
257     else if (iResult == 1) {
258       HLTWarning( Form("Couldn't find active services, sleeping %d s before making attempt %d out of %d", fRetrySleeptime, retry, fRetryCount) ) ;
259     }   
260     else if (iResult == 2) {
261       HLTWarning( Form("Services List empty, sleeping %d s before making new attempt.", fRetrySleeptime) ) ;
262     }
263     else {
264       HLTError( Form("Other problem ... \n") ); 
265       return iResult;
266     } 
267
268     //fSourceListTimer->Start(fRetrySleeptime, kFALSE);
269     sleep(fRetrySleeptime);
270
271   }
272
273   if ( iResult ) {
274     HLTWarning( Form("Couldn't find active services.") );
275     return iResult;
276   } 
277   
278   return iResult;
279 }
280
281 //##################################################################################
282 Int_t AliEveHOMERManager::ConnectEVEtoHOMER( TString detector ) {
283   // see header file for class documentation
284
285   HLTInfo("");
286   fStateHasChanged = fSrcList->GetSelectedSources();
287   HLTInfo(Form("has state changed % d", fStateHasChanged));
288   return ConnectHOMER(detector);
289 }
290
291
292 //##################################################################################
293 Int_t AliEveHOMERManager::ReConnectHOMER( TString /*detector*/ ){
294   // see header file for class documentation
295   
296   Int_t iResult = 0;
297
298   DisconnectHOMER();
299   iResult = CreateEveSourcesListLoop();
300   HLTInfo("Created new source list, reconnect to HOMER");
301   iResult = ConnectEVEtoHOMER();
302   if ( iResult ) {
303     HLTError(Form("Error reconnecting."));
304   }
305
306   return iResult;
307 }
308
309
310 //_____________________________________________________________________________________
311 Int_t AliEveHOMERManager::NextHOMEREvent() {
312   //See header file for documentation  
313   Int_t iResult = 0;
314
315   
316  
317   if ( NextEvent() ) {
318     
319     HLTInfo("Failed getting next event, trying to reconnect");
320     iResult = ReConnectHOMER();
321     return NextHOMEREvent();
322   }
323  
324   return ProcessEvent();
325  
326 }
327
328
329 //______________________________________________________________________________________________
330 Int_t AliEveHOMERManager::ProcessEvent() {
331
332   //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)
333   ResetDisplay();
334  
335
336   AliHLTHOMERBlockDesc * block = NULL;
337
338
339   //Process the SYNCED block list
340   if ( GetBlockList() == NULL) {
341     printf ("onlineDisplay:   No regular BlockList ... \n");
342     cout << endl;
343     //return -1;
344    
345   } else {
346     
347     if (GetBlockList()->IsEmpty() ) {
348       printf ("onlineDisplay:   No Sync Blocks in list ... \n");
349       cout<<endl;
350       //return;
351     }  
352    
353     
354     TIter next(GetBlockList());
355     while ((block = (AliHLTHOMERBlockDesc*)next())) {
356       ProcessBlock(block);
357      
358     } 
359   }
360
361
362   //Read out histograms and elements from detectors outside physics 1 partition
363   TIter anext(GetAsyncBlockList());
364
365   while ( (block = (AliHLTHOMERBlockDesc*)anext()) ) {
366     ProcessBlock(block);
367   }
368   
369   UpdateDisplay();
370
371   return 0;
372
373 }
374
375 void  AliEveHOMERManager::UpdateDisplay() {
376   //See header file for documentation
377   fPhosElement->UpdateElements();
378   fEmcalElement->UpdateElements();
379   fTPCElement->UpdateElements();
380   fHLTElement->UpdateElements();
381   fITSElement->UpdateElements();
382   fISSDElement->UpdateElements();
383   fISDDElement->UpdateElements();
384   fISPDElement->UpdateElements();
385   fTRDElement->UpdateElements();
386   if(fAnyElement) fAnyElement->UpdateElements();
387   if(fMuonElement) fMuonElement->UpdateElements();
388
389
390   // -- Set EventID in Window Title  
391   TString winTitle("Eve Main Window -- Event ID : ");
392   winTitle += Form("0x%016X ", GetEventID() );
393   GetEveManager()->GetBrowser()->SetWindowName(winTitle);
394
395   //==============================================================================
396   // -- Import global scene into projection scenes
397   //==============================================================================
398
399   // XXX Primary vertex ... to be retrieved from the ESD
400   Double_t x[3] = { 0, 0, 0 };
401   
402   TEveElement* top = GetEveManager()->GetCurrentEvent();
403   
404   if (fRPhiManager && top) {
405     fRPhiEventScene->DestroyElements();
406     if (fCenterProjectionsAtPrimaryVertex)
407       fRPhiManager->SetCenter(x[0], x[1], x[2]);
408     fRPhiManager->ImportElements(top, fRPhiEventScene);
409   }
410   
411   if (fRhoZManager && top) {
412     fRhoZEventScene->DestroyElements();
413     if (fCenterProjectionsAtPrimaryVertex)
414       fRhoZManager->SetCenter(x[0], x[1], x[2]);
415     fRhoZManager->ImportElements(top, fRhoZEventScene);
416   }
417
418
419   //Redraw the display
420   GetEveManager()->Redraw3D(0,1); // (0, 1)
421   GetEveManager()->EnableRedraw(); 
422
423 }
424
425 void AliEveHOMERManager::ProcessBlock(AliHLTHOMERBlockDesc * block) {
426   //See header file for documentation
427   
428 #if 1//DEBUG
429   printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
430   printf( "Detector           : %s\n", block->GetDetector().Data() );
431   printf( "Datatype           : %s\n", block->GetDataType().Data() );
432   if (block->IsTObject() )
433     printf( "Is TObject of class: %s\n", block->GetClassName().Data() );
434   printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
435 #endif
436
437
438   if(fShowBarrel) {
439
440     if ( ! block->GetDetector().CompareTo("PHOS") ) 
441       fPhosElement->ProcessBlock(block);
442     
443     else if ( ! block->GetDetector().CompareTo("EMCA") ) 
444       fEmcalElement->ProcessBlock(block);
445   
446     else if ( ! block->GetDetector().CompareTo("TPC") ) 
447       fTPCElement->ProcessBlock(block);
448   
449     else if ( ! block->GetDetector().CompareTo("HLT") ) 
450       fHLTElement->ProcessBlock(block);
451   
452     else if ( ! block->GetDetector().CompareTo("ITS") ) 
453       fITSElement->ProcessBlock(block);
454   
455     else if ( ! block->GetDetector().CompareTo("ISDD") ) 
456       fISDDElement->ProcessBlock(block);
457   
458     else if ( ! block->GetDetector().CompareTo("ISPD") ) 
459       fISPDElement->ProcessBlock(block);
460   
461     else if ( ! block->GetDetector().CompareTo("ISSD") ) 
462       fISSDElement->ProcessBlock(block);
463
464     else if ( ! block->GetDetector().CompareTo("TRD") ) 
465       fTRDElement->ProcessBlock(block);
466    
467     else if ( ! block->GetDetector().CompareTo("MUON") ) {
468       //Do Nothing
469        
470
471     } else {
472       if(!fAnyElement) {
473         fAnyElement = new AliHLTEveAny();
474         fAnyElement->SetEventManager(this);
475       } 
476       fAnyElement->ProcessBlock(block);
477     }
478      
479   }
480
481    
482   if(fShowMuon) {
483     if ( ! block->GetDetector().CompareTo("MUON") ) {
484       if(!fMuonElement) {
485         fMuonElement = new AliHLTEveMuon();
486         fMuonElement->SetEventManager(this);
487       }
488       fMuonElement->ProcessBlock(block);
489     }
490   }
491
492 }
493
494 void AliEveHOMERManager::ResetDisplay () {
495   //See header file for documentation
496
497  if(fPhosElement)
498    fPhosElement->ResetElements();
499  
500  if(fEmcalElement)
501    fEmcalElement->ResetElements();
502  
503  if(fTPCElement)
504    fTPCElement->ResetElements();
505  
506  if(fHLTElement)
507    fHLTElement->ResetElements();
508  
509  if(fITSElement)
510    fITSElement->ResetElements();
511  
512  if(fISPDElement)
513    fISPDElement->ResetElements();
514  
515  if(fISDDElement)
516    fISDDElement->ResetElements();
517  
518  if(fISSDElement)
519    fISSDElement->ResetElements();
520
521  if (fTRDElement)
522    fTRDElement->ResetElements();
523
524  if(fAnyElement)
525    fAnyElement->ResetElements();
526
527  if(fMuonElement)
528    fMuonElement->ResetElements();
529
530 }
531
532
533 void AliEveHOMERManager::StartLoop() {
534   //See header file for documentation
535   //fTimer->SetCommand("NextEvent()", "AliEveHOMERManager", this);
536   SetEventLoopStarted(kTRUE);
537   fTimer->Start(3000);
538 }
539
540 void AliEveHOMERManager::StopLoop() {
541   //See header file for documentation
542   fTimer->Stop();
543   SetEventLoopStarted(kFALSE);
544 }
545
546 // void AliEveHOMERManager::TimeOut(Int_t sec) {
547   
548 //   TTimer t(sec*1000, kFALSE);
549
550 //   cout << "Start timer for " << sec << " seconds" << endl;
551
552 //   while (!t.CheckTimer(gSystem->Now()))
553 //     gSystem->Sleep(100);  // 100 ms sleep
554
555 //   cout << "Timed out." << endl;
556
557 // }