2f8c4031f52322b594e93759760c5233f73feefa
[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   AliESDEvent*  esd = fM->GetESD();
310   AliStorageAdministratorPanelListEvents* listEventsTab = AliStorageAdministratorPanelListEvents::GetInstance();
311   AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
312
313   Bool_t autoLoad = fM->GetAutoLoad();
314   Bool_t extCtrl  = fM->IsUnderExternalControl();
315   Bool_t evNavOn  = !autoLoad && !extCtrl;
316
317   if (!fM->IsOnlineMode()) {
318
319       listEventsTab->SetOfflineMode(kTRUE);
320       configManager->DisableStoragePopup();
321
322       fFirstEvent->SetEnabled(!autoLoad);
323       fPrevEvent ->SetEnabled(!autoLoad);
324       fLastEvent ->SetEnabled(!autoLoad);
325       fNextEvent ->SetEnabled(!autoLoad);
326       fMarkEvent ->SetEnabled(kFALSE);
327
328       fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
329
330   }
331   else if (1 == state && fStorageStatus->GetText()->Contains("DOWN")) {
332     fEventServerStatus->SetText("Event Server: OK");
333     fFirstEvent->SetEnabled(kFALSE);
334     fPrevEvent ->SetEnabled(kFALSE);
335     fLastEvent ->SetEnabled(!autoLoad);
336     fNextEvent ->SetEnabled(kFALSE);
337     fMarkEvent ->SetEnabled(kFALSE);
338     listEventsTab->SetOfflineMode(kTRUE);
339     fInfoLabel->SetText(Form("/ %d",fM->GetEventId()));
340   }
341   else if (0 == state && fStorageStatus->GetText()->Contains("DOWN")) {
342     fEventServerStatus->SetText("Event Server: Waiting");
343     fFirstEvent->SetEnabled(kFALSE);
344     fPrevEvent ->SetEnabled(kFALSE);
345     fLastEvent ->SetEnabled(!autoLoad);
346     fNextEvent ->SetEnabled(kFALSE);
347     fMarkEvent ->SetEnabled(kFALSE);
348     listEventsTab->SetOfflineMode(kTRUE);
349   }
350   else if (0 == state && fStorageStatus->GetText()->Contains("OK")) {
351     fEventServerStatus->SetText("Event Server: Waiting");
352     fFirstEvent->SetEnabled(!autoLoad);
353     fPrevEvent ->SetEnabled(!autoLoad);
354     fLastEvent ->SetEnabled(!autoLoad);
355     fNextEvent ->SetEnabled(!autoLoad);
356     fMarkEvent ->SetEnabled(kTRUE);
357     listEventsTab->SetOfflineMode(kFALSE);
358   }
359   else {
360     fEventServerStatus->SetText("Event Server: OK");
361     fFirstEvent->SetEnabled(!autoLoad);
362     fPrevEvent ->SetEnabled(!autoLoad);
363     fLastEvent ->SetEnabled(!autoLoad);
364     fNextEvent ->SetEnabled(!autoLoad);
365     fMarkEvent ->SetEnabled(kTRUE);
366     listEventsTab->SetOfflineMode(kFALSE);
367   }
368
369   if (1 == state) {
370     fRefresh   ->SetEnabled(evNavOn);
371
372     fEventId->SetNumber(fM->GetEventId());
373     fEventId->SetState(evNavOn);
374     // fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
375
376     fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp);
377     fAutoLoadTime->SetValue(fM->GetAutoLoadTime());
378
379     // Loop over active trigger classes
380     if (fM->GetESD()) {
381       for(Int_t iTrig = 0; iTrig < AliESDRun::kNTriggerClasses; iTrig++) {
382         TString trigName = fM->GetESD()->GetESDRun()->GetTriggerClass(iTrig);
383         if (trigName.IsNull()) {
384           if (fTrigSel->GetListBox()->GetEntry(iTrig)) {
385             if (fTrigSel->GetSelected() == iTrig) fTrigSel->Select(-1);
386             fTrigSel->RemoveEntry(iTrig);
387           }
388           continue;
389         }
390         if (!fTrigSel->FindEntry(trigName.Data()))
391           fTrigSel->AddEntry(trigName.Data(),iTrig);
392       }
393     }
394     fTrigSel->SetEnabled(!evNavOn);
395
396     fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal());
397
398     Layout();
399   }
400 }
401
402 void AliEveEventManagerWindow::StorageManagerChangedState(int state)
403 {
404   Bool_t autoLoad = fM->GetAutoLoad();
405   AliStorageAdministratorPanelListEvents* listEventsTab = AliStorageAdministratorPanelListEvents::GetInstance();
406   AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
407
408   if (fM->IsOnlineMode()) {
409     if (state == 0)
410       {
411         fStorageStatus->SetText("Storage: DOWN");
412         fMarkEvent->SetEnabled(kFALSE);
413         fNextEvent->SetEnabled(kFALSE);
414         fLastEvent->SetEnabled(!autoLoad);
415         fPrevEvent->SetEnabled(kFALSE);
416         fFirstEvent->SetEnabled(kFALSE);
417         listEventsTab->SetOfflineMode(kTRUE);
418         configManager->DisableStoragePopup();
419         fEventId->SetState(kFALSE);
420       }
421     else if(state == 1)
422       {
423         listEventsTab->SetOfflineMode(kFALSE);
424
425         fStorageStatus->SetText("Storage: OK");
426         fMarkEvent->SetEnabled(kTRUE);
427         fNextEvent->SetEnabled(!autoLoad);
428         fLastEvent->SetEnabled(!autoLoad);
429         fPrevEvent->SetEnabled(!autoLoad);
430         fFirstEvent->SetEnabled(!autoLoad);
431         fEventId->SetState(!autoLoad);
432       }
433   }
434 }
435
436 //------------------------------------------------------------------------------
437 // Protected methods
438 //------------------------------------------------------------------------------
439
440 //______________________________________________________________________________
441 TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p,
442                                                     const char* txt, Int_t width,
443                                                     Int_t lo, Int_t ro, Int_t to, Int_t bo)
444 {
445   // Create a standard button.
446   // If width is not zero, the fixed-width flag is set.
447
448   TGTextButton* b = new TGTextButton(p, txt);
449   if (width > 0) {
450     b->SetWidth(width);
451     b->ChangeOptions(b->GetOptions() | kFixedWidth);
452   }
453   p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
454   return b;
455 }
456
457 //______________________________________________________________________________
458 TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
459                                            const char* txt, Int_t width,
460                                            Int_t lo, Int_t ro, Int_t to, Int_t bo)
461 {
462   // Create a standard button.
463   // If width is not zero, the fixed-width flag is set.
464
465   TGLabel* l = new TGLabel(p, txt);
466   if (width > 0) {
467     l->SetWidth(width);
468     l->ChangeOptions(l->GetOptions() | kFixedWidth);
469   }
470   p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
471   return l;
472 }
473