Bugfixes enabling buffer navigation
[u/mrichter/AliRoot.git] / EVE / EveHLT / AliEveHOMERManager.cxx
CommitLineData
a82a31af 1//-*- Mode: C++ -*-
2
d810d0de 3// $Id$
33791895 4// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007 *
fd31e9de 5// Author: Jochen Thaeder <thaeder@kip.uni-heidelberg.de> *
33791895 6// Author: 2010 Svein Lindal <slindal@fys.uio.no> *
fd31e9de 7// for The ALICE HLT Project. *
059c30e4 8
a82a31af 9
7279ee15 10
d810d0de 11/** @file AliEveHOMERManager.cxx
33791895 12 @author Jochen Thaeder, Svein Lindal <slindal@fys.uio.no>
51346b82 13 @date
cfa641b1 14 @brief Manager for HOMER online
059c30e4 15*/
16
17#if __GNUC__>= 3
18 using namespace std;
19#endif
20
9e78371d 21#include "unistd.h"
33791895 22#include "TEveManager.h"
23#include "TTimer.h"
24#include "TEveScene.h"
25#include "TEveProjectionManager.h"
26#include "TEveBrowser.h"
27
d810d0de 28#include "AliEveHOMERManager.h"
cfa641b1 29#include "AliHLTHOMERBlockDesc.h"
cfa641b1 30#include "AliHLTHOMERManager.h"
31#include "AliHLTTriggerDecision.h"
33791895 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"
a15e6d7d 46
d810d0de 47ClassImp(AliEveHOMERManager)
a82a31af 48
059c30e4 49/*
50 * ---------------------------------------------------------------------------------
51346b82 51 * Constructor / Destructor
52 * ---------------------------------------------------------------------------------
059c30e4 53 */
a82a31af 54
059c30e4 55//##################################################################################
a82a31af 56AliEveHOMERManager::AliEveHOMERManager() :
33791895 57TEveElementList("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)
cfa641b1 85{
33791895 86 // see header file for class documentation
a82a31af 87 // or
88 // refer to README to build package
89 // or
90 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
33791895 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
059c30e4 124}
125
059c30e4 126//##################################################################################
d810d0de 127AliEveHOMERManager::~AliEveHOMERManager() {
a82a31af 128 // see header file for class documentation
059c30e4 129
33791895 130 DestroyElements();
131 DestroyDetectorElements();
132
133}
134
135
136
137void AliEveHOMERManager::DestroyDetectorElements(){
138 //See header file for documentation
a82a31af 139 if (fSrcList)
46eadbb4 140 delete fSrcList;
141 fSrcList = NULL;
33791895 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
059c30e4 188}
189
33791895 190
191
059c30e4 192/*
193 * ---------------------------------------------------------------------------------
7279ee15 194 * Source Handling
51346b82 195 * ---------------------------------------------------------------------------------
059c30e4 196 */
197
198//##################################################################################
a82a31af 199Int_t AliEveHOMERManager::CreateEveSourcesList() {
200 // see header file for class documentation
059c30e4 201
059c30e4 202 DestroyElements();
059c30e4 203
a82a31af 204 Int_t iResult = CreateSourcesList();
33791895 205
206 // fStateHasChanged = kTRUE;
46eadbb4 207
dd407e8c 208 HLTDebug(Form("iResult XXX %d", iResult));
a82a31af 209 if ( iResult )
059c30e4 210 return iResult;
51346b82 211
33791895 212
dd407e8c 213 HLTDebug(Form("iResult %d", iResult));
33791895 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
51346b82 223
a82a31af 224 // -- Create new AliEVE sources list
33791895 225 if(!fSrcList){
226 HLTInfo(Form("no source list", iResult));
227 fSrcList = new AliEveHOMERSourceList("HLT Sources");
228 fSrcList->SetManager(this);
a82a31af 229
33791895 230 AddElement(fSrcList);
231 }
dd407e8c 232
233 //HLTInfo(Form("createbytype", iResult));
33791895 234 fSrcList->CreateByDet();
dd407e8c 235
236 HLTDebug(Form("Done createing source list %d", iResult));
237
238
33791895 239
059c30e4 240 return iResult;
241}
242
059c30e4 243//##################################################################################
9e78371d 244Int_t AliEveHOMERManager::CreateEveSourcesListLoop() {
a82a31af 245 // see header file for class documentation
059c30e4 246
247 Int_t iResult = 0;
9e78371d 248
249 for ( Int_t retry = 0; retry < fRetryCount ; retry++ ) {
33791895 250
9e78371d 251 iResult = CreateEveSourcesList();
33791895 252
253 if (!iResult) {
254 HLTInfo("Source list successfully created.");
9e78371d 255 break;
33791895 256 }
9e78371d 257 else if (iResult == 1) {
cfa641b1 258 HLTWarning( Form("Couldn't find active services, sleeping %d s before making attempt %d out of %d", fRetrySleeptime, retry, fRetryCount) ) ;
9e78371d 259 }
260 else if (iResult == 2) {
33791895 261 HLTWarning( Form("Services List empty, sleeping %d s before making new attempt.", fRetrySleeptime) ) ;
9e78371d 262 }
263 else {
264 HLTError( Form("Other problem ... \n") );
265 return iResult;
266 }
33791895 267
268 //fSourceListTimer->Start(fRetrySleeptime, kFALSE);
9e78371d 269 sleep(fRetrySleeptime);
33791895 270
9e78371d 271 }
272
273 if ( iResult ) {
703482d8 274 HLTWarning( Form("Couldn't find active services.") );
9e78371d 275 return iResult;
276 }
a82a31af 277
9e78371d 278 return iResult;
279}
059c30e4 280
9e78371d 281//##################################################################################
703482d8 282Int_t AliEveHOMERManager::ConnectEVEtoHOMER( TString detector ) {
9e78371d 283 // see header file for class documentation
059c30e4 284
33791895 285 HLTInfo("");
9e78371d 286 fStateHasChanged = fSrcList->GetSelectedSources();
33791895 287 HLTInfo(Form("has state changed % d", fStateHasChanged));
703482d8 288 return ConnectHOMER(detector);
059c30e4 289}
cfa641b1 290
33791895 291
292//##################################################################################
8b21b920 293Int_t AliEveHOMERManager::ReConnectHOMER( TString /*detector*/ ){
33791895 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//_____________________________________________________________________________________
311Int_t AliEveHOMERManager::NextHOMEREvent() {
312 //See header file for documentation
313 Int_t iResult = 0;
314
315
33791895 316
317 if ( NextEvent() ) {
318
319 HLTInfo("Failed getting next event, trying to reconnect");
320 iResult = ReConnectHOMER();
321 return NextHOMEREvent();
322 }
33791895 323
3da168a7 324 return ProcessEvent();
325
326}
327
328
329//______________________________________________________________________________________________
330Int_t AliEveHOMERManager::ProcessEvent() {
331
33791895 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();
3da168a7 334
335
336 AliHLTHOMERBlockDesc * block = NULL;
337
338
33791895 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());
33791895 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()) ) {
33791895 366 ProcessBlock(block);
33791895 367 }
368
369 UpdateDisplay();
370
371 return 0;
372
373}
374
375void 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
33791895 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
425void 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
494void 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
533void AliEveHOMERManager::StartLoop() {
534 //See header file for documentation
535 //fTimer->SetCommand("NextEvent()", "AliEveHOMERManager", this);
536 SetEventLoopStarted(kTRUE);
537 fTimer->Start(3000);
538}
539
540void 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// }