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. *
11 /** @file AliEveHOMERManager.cxx
12 @author Jochen Thaeder, Svein Lindal <slindal@fys.uio.no>
14 @brief Manager for HOMER online
22 #include "TEveManager.h"
24 #include "TEveScene.h"
25 #include "TEveProjectionManager.h"
26 #include "TEveBrowser.h"
27 #include "TGLViewer.h"
28 #include "TEveViewer.h"
30 #include "AliEveHOMERManager.h"
31 #include "AliHLTHOMERBlockDesc.h"
32 #include "AliHLTHOMERManager.h"
33 #include "AliHLTTriggerDecision.h"
34 #include "AliHLTEvePhos.h"
35 #include "AliHLTEveEmcal.h"
36 #include "AliHLTEveTPC.h"
37 #include "AliHLTEveHLT.h"
38 #include "AliHLTEveITS.h"
39 #include "AliHLTEveISPD.h"
40 #include "AliHLTEveISSD.h"
41 #include "AliHLTEveISDD.h"
42 #include "AliHLTEveTRD.h"
43 #include "AliHLTEveMuon.h"
44 #include "AliHLTEveAny.h"
45 #include "AliEveHOMERSourceList.h"
49 ClassImp(AliEveHOMERManager)
52 * ---------------------------------------------------------------------------------
53 * Constructor / Destructor
54 * ---------------------------------------------------------------------------------
57 //##################################################################################
58 AliEveHOMERManager::AliEveHOMERManager() :
59 TEveElementList("Homer Manager"),
68 fRPhiEventScene(NULL),
69 fRhoZEventScene(NULL),
73 // fSourceListTimer(NULL),
85 fEventLoopStarted(kFALSE),
86 fCenterProjectionsAtPrimaryVertex(kFALSE),
90 // see header file for class documentation
92 // refer to README to build package
94 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
96 fTimer = new TTimer();
97 fTimer->Connect("Timeout()", "AliEveHOMERManager", this, "NextHOMEREvent()" );
99 //fSourceListTimer = new TTimer();
101 fPhosElement = new AliHLTEvePhos();
102 fPhosElement->SetEventManager(this);
104 fEmcalElement = new AliHLTEveEmcal();
105 fEmcalElement->SetEventManager(this);
107 fTPCElement = new AliHLTEveTPC();
108 fTPCElement->SetEventManager(this);
110 fHLTElement = new AliHLTEveHLT();
111 fHLTElement->SetEventManager(this);
113 fITSElement = new AliHLTEveITS();
114 fITSElement->SetEventManager(this);
116 fISPDElement = new AliHLTEveISPD();
117 fISPDElement->SetEventManager(this);
119 fISDDElement = new AliHLTEveISDD();
120 fISDDElement->SetEventManager(this);
122 fISSDElement = new AliHLTEveISSD();
123 fISSDElement->SetEventManager(this);
125 fTRDElement = new AliHLTEveTRD();
126 fTRDElement->SetEventManager(this);
130 //##################################################################################
131 AliEveHOMERManager::~AliEveHOMERManager() {
132 // see header file for class documentation
135 DestroyDetectorElements();
141 void AliEveHOMERManager::DestroyDetectorElements(){
142 //See header file for documentation
152 delete fEmcalElement;
153 fEmcalElement = NULL;
197 * ---------------------------------------------------------------------------------
199 * ---------------------------------------------------------------------------------
202 //##################################################################################
203 Int_t AliEveHOMERManager::CreateEveSourcesList() {
204 // see header file for class documentation
208 Int_t iResult = CreateSourcesList();
210 // fStateHasChanged = kTRUE;
212 HLTDebug(Form("iResult XXX %d", iResult));
217 HLTDebug(Form("iResult %d", iResult));
219 HLTInfo(Form("delete source list", iResult));
224 HLTInfo(Form("cleared source list", iResult));
228 // -- Create new AliEVE sources list
230 HLTInfo(Form("no source list", iResult));
231 fSrcList = new AliEveHOMERSourceList("HLT Sources");
232 fSrcList->SetManager(this);
234 AddElement(fSrcList);
237 //HLTInfo(Form("createbytype", iResult));
238 fSrcList->CreateByDet();
240 HLTDebug(Form("Done createing source list %d", iResult));
247 //##################################################################################
248 Int_t AliEveHOMERManager::CreateEveSourcesListLoop() {
249 // see header file for class documentation
253 for ( Int_t retry = 0; retry < fRetryCount ; retry++ ) {
255 iResult = CreateEveSourcesList();
258 HLTInfo("Source list successfully created.");
261 else if (iResult == 1) {
262 HLTWarning( Form("Couldn't find active services, sleeping %d s before making attempt %d out of %d", fRetrySleeptime, retry, fRetryCount) ) ;
264 else if (iResult == 2) {
265 HLTWarning( Form("Services List empty, sleeping %d s before making new attempt.", fRetrySleeptime) ) ;
268 HLTError( Form("Other problem ... \n") );
272 //fSourceListTimer->Start(fRetrySleeptime, kFALSE);
273 sleep(fRetrySleeptime);
278 HLTWarning( Form("Couldn't find active services.") );
285 //##################################################################################
286 Int_t AliEveHOMERManager::ConnectEVEtoHOMER( TString detector ) {
287 // see header file for class documentation
290 fStateHasChanged = fSrcList->GetSelectedSources();
291 HLTInfo(Form("has state changed % d", fStateHasChanged));
292 return ConnectHOMER(detector);
296 //##################################################################################
297 Int_t AliEveHOMERManager::ReConnectHOMER( TString /*detector*/ ){
298 // see header file for class documentation
303 iResult = CreateEveSourcesListLoop();
304 HLTInfo("Created new source list, reconnect to HOMER");
305 iResult = ConnectEVEtoHOMER();
307 HLTError(Form("Error reconnecting."));
314 //_____________________________________________________________________________________
315 Int_t AliEveHOMERManager::NextHOMEREvent() {
316 //See header file for documentation
323 HLTInfo("Failed getting next event, trying to reconnect");
324 iResult = ReConnectHOMER();
325 return NextHOMEREvent();
328 return ProcessEvent();
333 //______________________________________________________________________________________________
334 Int_t AliEveHOMERManager::ProcessEvent() {
336 //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)
340 AliHLTHOMERBlockDesc * block = NULL;
343 //Process the SYNCED block list
344 if ( GetBlockList() == NULL) {
345 printf ("onlineDisplay: No regular BlockList ... \n");
351 if (GetBlockList()->IsEmpty() ) {
352 printf ("onlineDisplay: No Sync Blocks in list ... \n");
358 TIter next(GetBlockList());
359 while ((block = (AliHLTHOMERBlockDesc*)next())) {
366 //Read out histograms and elements from detectors outside physics 1 partition
367 TIter anext(GetAsyncBlockList());
369 while ( (block = (AliHLTHOMERBlockDesc*)anext()) ) {
379 void AliEveHOMERManager::UpdateDisplay() {
380 //See header file for documentation
381 fPhosElement->UpdateElements();
382 fEmcalElement->UpdateElements();
383 fTPCElement->UpdateElements();
384 fHLTElement->UpdateElements();
385 fITSElement->UpdateElements();
386 fISSDElement->UpdateElements();
387 fISDDElement->UpdateElements();
388 fISPDElement->UpdateElements();
389 fTRDElement->UpdateElements();
390 if(fAnyElement) fAnyElement->UpdateElements();
391 if(fMuonElement) fMuonElement->UpdateElements();
394 // -- Set EventID in Window Title
395 TString winTitle("Eve Main Window -- Event ID : ");
396 winTitle += Form("0x%016X ", GetEventID() );
397 GetEveManager()->GetBrowser()->SetWindowName(winTitle);
399 //==============================================================================
400 // -- Import global scene into projection scenes
401 //==============================================================================
403 // XXX Primary vertex ... to be retrieved from the ESD
404 Double_t x[3] = { 0, 0, 0 };
406 TEveElement* top = GetEveManager()->GetCurrentEvent();
408 if (fRPhiManager && top) {
409 fRPhiEventScene->DestroyElements();
410 if (fCenterProjectionsAtPrimaryVertex)
411 fRPhiManager->SetCenter(x[0], x[1], x[2]);
412 fRPhiManager->ImportElements(top, fRPhiEventScene);
415 if (fRhoZManager && top) {
416 fRhoZEventScene->DestroyElements();
417 if (fCenterProjectionsAtPrimaryVertex)
418 fRhoZManager->SetCenter(x[0], x[1], x[2]);
419 fRhoZManager->ImportElements(top, fRhoZEventScene);
424 GetEveManager()->Redraw3D(0,1); // (0, 1)
425 GetEveManager()->EnableRedraw();
429 void AliEveHOMERManager::ProcessBlock(AliHLTHOMERBlockDesc * block) {
430 //See header file for documentation
433 printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
434 printf( "Detector : %s\n", block->GetDetector().Data() );
435 printf( "Datatype : %s\n", block->GetDataType().Data() );
436 if (block->IsTObject() )
437 printf( "Is TObject of class: %s\n", block->GetClassName().Data() );
438 printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
444 if ( ! block->GetDetector().CompareTo("PHOS") )
445 fPhosElement->ProcessBlock(block);
447 else if ( ! block->GetDetector().CompareTo("EMCA") )
448 fEmcalElement->ProcessBlock(block);
450 else if ( ! block->GetDetector().CompareTo("TPC") )
451 fTPCElement->ProcessBlock(block);
453 else if ( ! block->GetDetector().CompareTo("HLT") )
454 fHLTElement->ProcessBlock(block);
456 else if ( ! block->GetDetector().CompareTo("ITS") )
457 fITSElement->ProcessBlock(block);
459 else if ( ! block->GetDetector().CompareTo("ISDD") )
460 fISDDElement->ProcessBlock(block);
462 else if ( ! block->GetDetector().CompareTo("ISPD") )
463 fISPDElement->ProcessBlock(block);
465 else if ( ! block->GetDetector().CompareTo("ISSD") )
466 fISSDElement->ProcessBlock(block);
468 else if ( ! block->GetDetector().CompareTo("TRD") )
469 fTRDElement->ProcessBlock(block);
471 else if ( ! block->GetDetector().CompareTo("MUON") ) {
477 fAnyElement = new AliHLTEveAny();
478 fAnyElement->SetEventManager(this);
480 fAnyElement->ProcessBlock(block);
487 if ( ! block->GetDetector().CompareTo("MUON") ) {
489 fMuonElement = new AliHLTEveMuon();
490 fMuonElement->SetEventManager(this);
492 fMuonElement->ProcessBlock(block);
498 void AliEveHOMERManager::ResetDisplay () {
499 //See header file for documentation
502 fPhosElement->ResetElements();
505 fEmcalElement->ResetElements();
508 fTPCElement->ResetElements();
511 fHLTElement->ResetElements();
514 fITSElement->ResetElements();
517 fISPDElement->ResetElements();
520 fISDDElement->ResetElements();
523 fISSDElement->ResetElements();
526 fTRDElement->ResetElements();
529 fAnyElement->ResetElements();
532 fMuonElement->ResetElements();
537 void AliEveHOMERManager::PrintScreens() {
538 //See header file for documentation
540 fEveManager->GetDefaultGLViewer()->SavePicture("3D.gif");
541 fRhoZViewer->GetGLViewer()->SavePicture("RhoZ.gif");
542 fRPhiViewer->GetGLViewer()->SavePicture("RPhi.gif");
546 void AliEveHOMERManager::StartLoop() {
547 //See header file for documentation
548 //fTimer->SetCommand("NextEvent()", "AliEveHOMERManager", this);
549 SetEventLoopStarted(kTRUE);
553 void AliEveHOMERManager::StopLoop() {
554 //See header file for documentation
556 SetEventLoopStarted(kFALSE);
559 // void AliEveHOMERManager::TimeOut(Int_t sec) {
561 // TTimer t(sec*1000, kFALSE);
563 // cout << "Start timer for " << sec << " seconds" << endl;
565 // while (!t.CheckTimer(gSystem->Now()))
566 // gSystem->Sleep(100); // 100 ms sleep
568 // cout << "Timed out." << endl;