afd682df8f572523d915f0fb7180254f05cb4335
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManagerEditor.cxx
1 // @(#)root/eve:$Id$
2 // Author: Matevz Tadel 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveEventManagerEditor.h"
11 #include "AliEveEventManager.h"
12 #include "AliEveConfigManager.h"
13
14 #include <AliESDEvent.h>
15
16 #include <TVirtualPad.h>
17 #include "TColor.h"
18
19 #include <TEveGValuators.h>
20 #include <TGButton.h>
21 #include <TGTextView.h>
22 #include <TGLabel.h>
23
24 #include "Riostream.h"
25
26 #ifdef ZMQ
27 #include "AliStorageAdministratorPanelListEvents.h"
28 #include "AliStorageAdministratorPanelMarkEvent.h"
29 #endif
30
31 //______________________________________________________________________________
32 // GUI editor for AliEveEventManager.
33 //
34
35 using std::ofstream;
36 using std::ios;
37 ClassImp(AliEveEventManagerEditor)
38
39 //______________________________________________________________________________
40 AliEveEventManagerEditor::AliEveEventManagerEditor(const TGWindow *p, Int_t width, Int_t height,
41                                                    UInt_t options, Pixel_t back) :
42   TGedFrame(p, width, height, options | kVerticalFrame, back),
43   fM(0),
44   fDumpEventInfo(0),
45   fEventInfo(0)
46 {
47   // Constructor.
48
49   MakeTitle("AliEveEventManager");
50
51   {
52     TGHorizontalFrame* f = new TGHorizontalFrame(this);
53     fDumpEventInfo = new TGTextButton(f, "Dump Event Info");
54     fDumpEventInfo->SetToolTipText("Append information about current event to event_info.txt file.");
55     fDumpEventInfo->SetWidth(120);
56     fDumpEventInfo->ChangeOptions(fDumpEventInfo->GetOptions() | kFixedWidth);
57     f->AddFrame(fDumpEventInfo, new TGLayoutHints(kLHintsNormal, 4,0,0,0));
58     fDumpEventInfo->Connect("Clicked()",
59                         "AliEveEventManagerEditor", this, "DumpEventInfo()");
60     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
61   }
62   {
63     TGVerticalFrame* f = new TGVerticalFrame(this);
64
65     TGLabel *eventInfoLabel = new TGLabel(f, "Event Information:");
66     f->AddFrame(eventInfoLabel, new TGLayoutHints(kLHintsNormal, 0,0,6,2));
67
68     fEventInfo = new TGTextView(f, 200, 300);
69     f->AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
70
71     AddFrame(f, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
72   }
73 }
74
75 /******************************************************************************/
76
77 //______________________________________________________________________________
78 void AliEveEventManagerEditor::SetModel(TObject* obj)
79 {
80   // Set model object.
81
82   fM = static_cast<AliEveEventManager*>(obj);
83
84   fEventInfo->LoadBuffer(fM->GetEventInfoVertical());
85 }
86
87 /******************************************************************************/
88
89 //______________________________________________________________________________
90 void AliEveEventManagerEditor::DumpEventInfo()
91 {
92   // Dump event-info into event_info.txt.
93   // The info is appended into the file.
94
95   ofstream f("event_info.txt", ios::out | ios::app);
96
97   f << "================================================================================\n\n";
98   f << fM->GetEventInfoHorizontal() << std::endl << std::endl;
99
100   f.close();
101 }
102
103
104 //==============================================================================
105 // AliEveEventManagerWindow
106 //==============================================================================
107
108 //______________________________________________________________________________
109 //
110 // Horizontal GUI for AliEveEventManager, to be placed in the
111 // bottom part of ROOT browser.
112
113 ClassImp(AliEveEventManagerWindow)
114
115 AliEveEventManagerWindow::AliEveEventManagerWindow(AliEveEventManager* mgr) :
116   TGMainFrame(gClient->GetRoot(), 400, 100, kVerticalFrame),
117   fM            (mgr),
118   fFirstEvent   (0),
119   fPrevEvent    (0),
120   fNextEvent    (0),
121   fLastEvent    (0),
122   fRefresh      (0),
123   fEventId      (0),
124   fInfoLabel    (0),
125   fAutoLoad     (0),
126   fAutoLoadTime (0),
127   fTrigSel      (0),
128   fEventInfo    (0)
129 {
130   // Constructor.
131
132   const TString cls("AliEveEventManagerWindow");
133   TGTextButton *b = 0;
134   {
135     Int_t width = 50;
136
137     TGHorizontalFrame* f = new TGHorizontalFrame(this);
138     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 0,0,2,2));
139
140     fFirstEvent = b = MkTxtButton(f, "First", width);
141     b->Connect("Clicked()", cls, this, "DoFirstEvent()");
142     fPrevEvent = b = MkTxtButton(f, "Prev", width);
143     b->Connect("Clicked()", cls, this, "DoPrevEvent()");
144
145     fEventId = new TGNumberEntry(f, 0, 5, -1,TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
146                                  TGNumberFormat::kNELLimitMinMax, 0, 10000);
147     f->AddFrame(fEventId, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
148     fEventId->Connect("ValueSet(Long_t)", cls, this, "DoSetEvent()");
149     fInfoLabel = new TGLabel(f);
150     f->AddFrame(fInfoLabel, new TGLayoutHints(kLHintsNormal, 5, 10, 4, 0));
151
152     fNextEvent = b = MkTxtButton(f, "Next", width);
153     b->Connect("Clicked()", cls, this, "DoNextEvent()");
154     fLastEvent = b = MkTxtButton(f, "Last", width);
155     b->Connect("Clicked()", cls, this, "DoLastEvent()");
156     fMarkEvent = b = MkTxtButton(f, "Mark", width);
157     b->Connect("Clicked()", cls, this, "DoMarkEvent()");
158
159     MkLabel(f, "||", 0, 8, 8);
160
161     fRefresh = b = MkTxtButton(f, "Refresh", width + 8);
162     b->Connect("Clicked()",cls, this, "DoRefresh()");
163
164     MkLabel(f, "||", 0, 8, 8);
165
166     fAutoLoad = new TGCheckButton(f, "Autoload");
167     f->AddFrame(fAutoLoad, new TGLayoutHints(kLHintsLeft, 0, 4, 3, 0));
168     fAutoLoad->SetToolTipText("Automatic event loading.");
169     fAutoLoad->Connect("Toggled(Bool_t)", cls, this, "DoSetAutoLoad()");
170
171     fAutoLoadTime = new TEveGValuator(f, "Time: ", 110, 0);
172     f->AddFrame(fAutoLoadTime);
173     fAutoLoadTime->SetShowSlider(kFALSE);
174     fAutoLoadTime->SetNELength(4);
175     fAutoLoadTime->Build();
176     fAutoLoadTime->SetLimits(0, 1000);
177     fAutoLoadTime->SetToolTip("Automatic event loading time in seconds.");
178     fAutoLoadTime->Connect("ValueSet(Double_t)", cls, this, "DoSetAutoLoadTime()");
179
180     fTrigSel = new TGComboBox(f);
181     fTrigSel->Resize(4*width,b->GetDefaultHeight());
182     fTrigSel->AddEntry("No trigger selection",-1);
183     fTrigSel->Select(-1,kFALSE);
184     f->AddFrame(fTrigSel, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
185     fTrigSel->Connect("Selected(char*)", cls, this, "DoSetTrigSel()");
186
187     fStorageStatus = MkLabel(f,"Storage: Waiting",0,8,8);
188     fEventServerStatus = MkLabel(f,"Event Server: Waiting",0,10,10);
189       
190   }
191     
192   fEventInfo = new TGTextView(this, 400, 600);
193   AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
194
195    fM->Connect("NewEventLoaded()", cls, this, "Update(=1)");
196    fM->Connect("NoEventLoaded()", cls, this, "Update(=0)");
197    fM->Connect("StorageManagerOk()",cls,this,"StorageManagerChangedState(=1)");
198    fM->Connect("StorageManagerDown()",cls,this,"StorageManagerChangedState(=0)");
199
200   SetCleanup(kDeepCleanup);
201   Layout();
202   MapSubwindows();
203   MapWindow();
204 }
205
206 //______________________________________________________________________________
207 AliEveEventManagerWindow::~AliEveEventManagerWindow()
208 {
209   // Destructor.
210
211   fM->Disconnect("NewEventLoaded()", this);
212 }
213
214 //______________________________________________________________________________
215 void AliEveEventManagerWindow::DoFirstEvent()
216 {
217   // Load previous event
218   fM->GotoEvent(0);
219 }
220
221 //______________________________________________________________________________
222 void AliEveEventManagerWindow::DoPrevEvent()
223 {
224   // Load previous event
225   // fM->PrevEvent();
226   if (fM->IsOnlineMode()) {
227     fM->GotoEvent(1);
228   }
229   else {
230     fM->GotoEvent((Int_t) fEventId->GetNumber()-1);
231
232   }
233
234 }
235
236 //______________________________________________________________________________
237 void AliEveEventManagerWindow::DoNextEvent()
238 {
239   // Load next event
240   // fM->NextEvent();
241   if (fM->IsOnlineMode()) {
242     fM->GotoEvent(2);
243   }
244   else {
245     fM->GotoEvent((Int_t) fEventId->GetNumber()+1);
246   }
247 }
248
249 //______________________________________________________________________________
250 void AliEveEventManagerWindow::DoLastEvent()
251 {
252   // Load previous event
253   fM->GotoEvent(-1);
254 }
255
256 //______________________________________________________________________________
257 void AliEveEventManagerWindow::DoMarkEvent()
258 {
259   // Mark current event
260   fM->MarkCurrentEvent();
261 }
262
263 //______________________________________________________________________________
264 void AliEveEventManagerWindow::DoSetEvent()
265 {
266   // Set current event
267   fM->GotoEvent((Int_t) fEventId->GetNumber());
268 }
269
270 //______________________________________________________________________________
271 void AliEveEventManagerWindow::DoRefresh()
272 {
273   // Refresh event status.
274
275   Int_t ev = fM->GetEventId();
276   fM->Close();
277   fM->Open();
278   fM->GotoEvent(ev);
279 }
280
281 //______________________________________________________________________________
282 void AliEveEventManagerWindow::DoSetAutoLoad()
283 {
284   // Set the auto-load flag
285
286   fM->SetAutoLoad(fAutoLoad->IsOn());
287   Update(fM->NewEventAvailable());
288 }
289
290 //______________________________________________________________________________
291 void AliEveEventManagerWindow::DoSetAutoLoadTime()
292 {
293   // Set the auto-load time in seconds
294
295   fM->SetAutoLoadTime(fAutoLoadTime->GetValue());
296 }
297
298 //______________________________________________________________________________
299 void AliEveEventManagerWindow::DoSetTrigSel()
300 {
301   // Set the trigger selection
302
303   fM->SetTrigSel(fTrigSel->GetSelectedEntry()->EntryId());
304 }
305
306 //______________________________________________________________________________
307 void AliEveEventManagerWindow::Update(int state)
308 {
309
310   Bool_t autoLoad = fM->GetAutoLoad();
311   Bool_t extCtrl  = fM->IsUnderExternalControl();
312   Bool_t evNavOn  = !autoLoad && !extCtrl;
313
314 #ifdef ZMQ
315
316   AliESDEvent*  esd = fM->GetESD();
317   AliStorageAdministratorPanelListEvents* listEventsTab = AliStorageAdministratorPanelListEvents::GetInstance();
318   AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
319
320   if (!fM->IsOnlineMode()) {
321
322       listEventsTab->SetOfflineMode(kTRUE);
323       configManager->DisableStoragePopup();
324
325       fFirstEvent->SetEnabled(!autoLoad);
326       fPrevEvent ->SetEnabled(!autoLoad);
327       fLastEvent ->SetEnabled(!autoLoad);
328       fNextEvent ->SetEnabled(!autoLoad);
329       fMarkEvent ->SetEnabled(kFALSE);
330
331       fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
332
333   }
334   else if (1 == state && fStorageStatus->GetText()->Contains("DOWN")) {
335     fEventServerStatus->SetText("Event Server: OK");
336     fFirstEvent->SetEnabled(kFALSE);
337     fPrevEvent ->SetEnabled(kFALSE);
338     fLastEvent ->SetEnabled(!autoLoad);
339     fNextEvent ->SetEnabled(kFALSE);
340     fMarkEvent ->SetEnabled(kFALSE);
341     listEventsTab->SetOfflineMode(kTRUE);
342     fInfoLabel->SetText(Form("/ %d",fM->GetEventId()));
343   }
344   else if (0 == state && fStorageStatus->GetText()->Contains("DOWN")) {
345     fEventServerStatus->SetText("Event Server: Waiting");
346     fFirstEvent->SetEnabled(kFALSE);
347     fPrevEvent ->SetEnabled(kFALSE);
348     fLastEvent ->SetEnabled(!autoLoad);
349     fNextEvent ->SetEnabled(kFALSE);
350     fMarkEvent ->SetEnabled(kFALSE);
351     listEventsTab->SetOfflineMode(kTRUE);
352   }
353   else if (0 == state && fStorageStatus->GetText()->Contains("OK")) {
354     fEventServerStatus->SetText("Event Server: Waiting");
355     fFirstEvent->SetEnabled(!autoLoad);
356     fPrevEvent ->SetEnabled(!autoLoad);
357     fLastEvent ->SetEnabled(!autoLoad);
358     fNextEvent ->SetEnabled(!autoLoad);
359     fMarkEvent ->SetEnabled(kTRUE);
360     listEventsTab->SetOfflineMode(kFALSE);
361   }
362   else {
363     fEventServerStatus->SetText("Event Server: OK");
364     fFirstEvent->SetEnabled(!autoLoad);
365     fPrevEvent ->SetEnabled(!autoLoad);
366     fLastEvent ->SetEnabled(!autoLoad);
367     fNextEvent ->SetEnabled(!autoLoad);
368     fMarkEvent ->SetEnabled(kTRUE);
369     listEventsTab->SetOfflineMode(kFALSE);
370   }
371 #endif
372
373   if (1 == state) {
374     fRefresh   ->SetEnabled(evNavOn);
375
376     fEventId->SetNumber(fM->GetEventId());
377     fEventId->SetState(evNavOn);
378     // fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
379
380     fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp);
381     fAutoLoadTime->SetValue(fM->GetAutoLoadTime());
382
383     // Loop over active trigger classes
384     if (fM->GetESD()) {
385       for(Int_t iTrig = 0; iTrig < AliESDRun::kNTriggerClasses; iTrig++) {
386         TString trigName = fM->GetESD()->GetESDRun()->GetTriggerClass(iTrig);
387         if (trigName.IsNull()) {
388           if (fTrigSel->GetListBox()->GetEntry(iTrig)) {
389             if (fTrigSel->GetSelected() == iTrig) fTrigSel->Select(-1);
390             fTrigSel->RemoveEntry(iTrig);
391           }
392           continue;
393         }
394         if (!fTrigSel->FindEntry(trigName.Data()))
395           fTrigSel->AddEntry(trigName.Data(),iTrig);
396       }
397     }
398     fTrigSel->SetEnabled(!evNavOn);
399
400     fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal());
401
402     Layout();
403   }
404 }
405
406 void AliEveEventManagerWindow::StorageManagerChangedState(int state)
407 {
408 #ifdef ZMQ
409
410   Bool_t autoLoad = fM->GetAutoLoad();
411   AliStorageAdministratorPanelListEvents* listEventsTab = AliStorageAdministratorPanelListEvents::GetInstance();
412   AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
413
414   if (fM->IsOnlineMode()) {
415     if (state == 0)
416       {
417         fStorageStatus->SetText("Storage: DOWN");
418         fMarkEvent->SetEnabled(kFALSE);
419         fNextEvent->SetEnabled(kFALSE);
420         fLastEvent->SetEnabled(!autoLoad);
421         fPrevEvent->SetEnabled(kFALSE);
422         fFirstEvent->SetEnabled(kFALSE);
423         listEventsTab->SetOfflineMode(kTRUE);
424         configManager->DisableStoragePopup();
425         fEventId->SetState(kFALSE);
426       }
427     else if(state == 1)
428       {
429         listEventsTab->SetOfflineMode(kFALSE);
430
431         fStorageStatus->SetText("Storage: OK");
432         fMarkEvent->SetEnabled(kTRUE);
433         fNextEvent->SetEnabled(!autoLoad);
434         fLastEvent->SetEnabled(!autoLoad);
435         fPrevEvent->SetEnabled(!autoLoad);
436         fFirstEvent->SetEnabled(!autoLoad);
437         fEventId->SetState(!autoLoad);
438       }
439   }
440 #endif
441 }
442
443 //------------------------------------------------------------------------------
444 // Protected methods
445 //------------------------------------------------------------------------------
446
447 //______________________________________________________________________________
448 TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p,
449                                                     const char* txt, Int_t width,
450                                                     Int_t lo, Int_t ro, Int_t to, Int_t bo)
451 {
452   // Create a standard button.
453   // If width is not zero, the fixed-width flag is set.
454
455   TGTextButton* b = new TGTextButton(p, txt);
456   if (width > 0) {
457     b->SetWidth(width);
458     b->ChangeOptions(b->GetOptions() | kFixedWidth);
459   }
460   p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
461   return b;
462 }
463
464 //______________________________________________________________________________
465 TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
466                                            const char* txt, Int_t width,
467                                            Int_t lo, Int_t ro, Int_t to, Int_t bo)
468 {
469   // Create a standard button.
470   // If width is not zero, the fixed-width flag is set.
471
472   TGLabel* l = new TGLabel(p, txt);
473   if (width > 0) {
474     l->SetWidth(width);
475     l->ChangeOptions(l->GetOptions() | kFixedWidth);
476   }
477   p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
478   return l;
479 }
480