Fixing bugs in Event Display
[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       fRestartReco = b = MkTxtButton(f, "Restart reco", 2*width);
159       b->Connect("Clicked()", cls, this, "DoRestartReco()");
160       fRestartManager = b = MkTxtButton(f, "Restart manager", 2*width);
161       b->Connect("Clicked()", cls, this, "DoRestartManager()");
162       
163       
164     MkLabel(f, "||", 0, 8, 8);
165
166     fRefresh = b = MkTxtButton(f, "Refresh", width + 8);
167     b->Connect("Clicked()",cls, this, "DoRefresh()");
168
169     MkLabel(f, "||", 0, 8, 8);
170
171     fAutoLoad = new TGCheckButton(f, "Autoload");
172     f->AddFrame(fAutoLoad, new TGLayoutHints(kLHintsLeft, 0, 4, 3, 0));
173     fAutoLoad->SetToolTipText("Automatic event loading.");
174     fAutoLoad->Connect("Toggled(Bool_t)", cls, this, "DoSetAutoLoad()");
175
176     fAutoLoadTime = new TEveGValuator(f, "Time: ", 110, 0);
177     f->AddFrame(fAutoLoadTime);
178     fAutoLoadTime->SetShowSlider(kFALSE);
179     fAutoLoadTime->SetNELength(4);
180     fAutoLoadTime->Build();
181     fAutoLoadTime->SetLimits(0, 1000);
182     fAutoLoadTime->SetToolTip("Automatic event loading time in seconds.");
183     fAutoLoadTime->Connect("ValueSet(Double_t)", cls, this, "DoSetAutoLoadTime()");
184
185     fTrigSel = new TGComboBox(f);
186     fTrigSel->Resize(4*width,b->GetDefaultHeight());
187     fTrigSel->AddEntry("No trigger selection",-1);
188     fTrigSel->Select(-1,kFALSE);
189     f->AddFrame(fTrigSel, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
190     fTrigSel->Connect("Selected(char*)", cls, this, "DoSetTrigSel()");
191
192     fStorageStatus = MkLabel(f,"Storage: Waiting",0,8,8);
193     fEventServerStatus = MkLabel(f,"Event Server: Waiting",0,10,10);
194       
195   }
196     
197   fEventInfo = new TGTextView(this, 400, 600);
198   AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
199
200    fM->Connect("NewEventLoaded()", cls, this, "Update(=1)");
201    fM->Connect("NoEventLoaded()", cls, this, "Update(=0)");
202    fM->Connect("StorageManagerOk()",cls,this,"StorageManagerChangedState(=1)");
203    fM->Connect("StorageManagerDown()",cls,this,"StorageManagerChangedState(=0)");
204
205   SetCleanup(kDeepCleanup);
206   Layout();
207   MapSubwindows();
208   MapWindow();
209 }
210
211 //______________________________________________________________________________
212 AliEveEventManagerWindow::~AliEveEventManagerWindow()
213 {
214   // Destructor.
215
216   fM->Disconnect("NewEventLoaded()", this);
217 }
218
219 //______________________________________________________________________________
220 void AliEveEventManagerWindow::DoFirstEvent()
221 {
222   // Load previous event
223   fM->GotoEvent(0);
224 }
225
226 //______________________________________________________________________________
227 void AliEveEventManagerWindow::DoPrevEvent()
228 {
229   // Load previous event
230   // fM->PrevEvent();
231   if (fM->IsOnlineMode()) {
232     fM->GotoEvent(1);
233   }
234   else {
235     fM->GotoEvent((Int_t) fEventId->GetNumber()-1);
236
237   }
238
239 }
240
241 //______________________________________________________________________________
242 void AliEveEventManagerWindow::DoNextEvent()
243 {
244   // Load next event
245   // fM->NextEvent();
246   if (fM->IsOnlineMode()) {
247       cout<<"next event, online node"<<endl;
248     fM->GotoEvent(2);
249   }
250   else {
251       cout<<"next event, offline mode"<<endl;
252     fM->GotoEvent((Int_t) fEventId->GetNumber()+1);
253   }
254 }
255
256 //______________________________________________________________________________
257 void AliEveEventManagerWindow::DoLastEvent()
258 {
259   // Load previous event
260   fM->GotoEvent(-1);
261 }
262
263 //______________________________________________________________________________
264 void AliEveEventManagerWindow::DoMarkEvent()
265 {
266   // Mark current event
267   fM->MarkCurrentEvent();
268 }
269
270 //______________________________________________________________________________
271 void AliEveEventManagerWindow::DoRestartReco()
272 {
273     // Kill reconstruction server
274     gSystem->Exec("ssh -n -f edis@pcald39fix \"killall alieventserver\"");
275 }
276
277 void AliEveEventManagerWindow::DoRestartManager()
278 {
279     // Kill storage manager
280     gSystem->Exec("ssh -n -f edis@pcald39fix \"killall alistorage\"");
281 }
282
283 //______________________________________________________________________________
284 void AliEveEventManagerWindow::DoSetEvent()
285 {
286   // Set current event
287   fM->GotoEvent((Int_t) fEventId->GetNumber());
288 }
289
290 //______________________________________________________________________________
291 void AliEveEventManagerWindow::DoRefresh()
292 {
293   // Refresh event status.
294
295   Int_t ev = fM->GetEventId();
296   fM->Close();
297   fM->Open();
298   fM->GotoEvent(ev);
299 }
300
301 //______________________________________________________________________________
302 void AliEveEventManagerWindow::DoSetAutoLoad()
303 {
304   // Set the auto-load flag
305
306   fM->SetAutoLoad(fAutoLoad->IsOn());
307   Update(fM->NewEventAvailable());
308 }
309
310 //______________________________________________________________________________
311 void AliEveEventManagerWindow::DoSetAutoLoadTime()
312 {
313   // Set the auto-load time in seconds
314
315   fM->SetAutoLoadTime(fAutoLoadTime->GetValue());
316 }
317
318 //______________________________________________________________________________
319 void AliEveEventManagerWindow::DoSetTrigSel()
320 {
321   // Set the trigger selection
322
323   fM->SetTrigSel(fTrigSel->GetSelectedEntry()->EntryId());
324 }
325
326 //______________________________________________________________________________
327 void AliEveEventManagerWindow::Update(int state)
328 {
329
330   Bool_t autoLoad = fM->GetAutoLoad();
331   Bool_t extCtrl  = fM->IsUnderExternalControl();
332   Bool_t evNavOn  = !autoLoad && !extCtrl;
333
334 #ifdef ZMQ
335
336   AliESDEvent*  esd = fM->GetESD();
337   AliStorageAdministratorPanelListEvents* listEventsTab = AliStorageAdministratorPanelListEvents::GetInstance();
338   AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
339
340   if (!fM->IsOnlineMode()) {
341
342       listEventsTab->SetOfflineMode(kTRUE);
343
344       fFirstEvent->SetEnabled(!autoLoad);
345       fPrevEvent ->SetEnabled(!autoLoad);
346       fLastEvent ->SetEnabled(!autoLoad);
347       fNextEvent ->SetEnabled(!autoLoad);
348       fMarkEvent ->SetEnabled(kFALSE);
349
350       fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
351
352   }
353   else if (1 == state && fStorageStatus->GetText()->Contains("DOWN")) {
354     fEventServerStatus->SetText("Event Server: OK");
355     fFirstEvent->SetEnabled(kFALSE);
356     fPrevEvent ->SetEnabled(kFALSE);
357     fLastEvent ->SetEnabled(!autoLoad);
358     fNextEvent ->SetEnabled(kFALSE);
359     fMarkEvent ->SetEnabled(kFALSE);
360     listEventsTab->SetOfflineMode(kTRUE);
361     fInfoLabel->SetText(Form("/ %d",fM->GetEventId()));
362   }
363   else if (0 == state && fStorageStatus->GetText()->Contains("DOWN")) {
364     fEventServerStatus->SetText("Event Server: Waiting");
365     fFirstEvent->SetEnabled(kFALSE);
366     fPrevEvent ->SetEnabled(kFALSE);
367     fLastEvent ->SetEnabled(!autoLoad);
368     fNextEvent ->SetEnabled(kFALSE);
369     fMarkEvent ->SetEnabled(kFALSE);
370     listEventsTab->SetOfflineMode(kTRUE);
371   }
372   else if (0 == state && fStorageStatus->GetText()->Contains("OK")) {
373     fEventServerStatus->SetText("Event Server: Waiting");
374     fFirstEvent->SetEnabled(!autoLoad);
375     fPrevEvent ->SetEnabled(!autoLoad);
376     fLastEvent ->SetEnabled(!autoLoad);
377     fNextEvent ->SetEnabled(!autoLoad);
378     fMarkEvent ->SetEnabled(kTRUE);
379     listEventsTab->SetOfflineMode(kFALSE);
380   }
381   else {
382     fEventServerStatus->SetText("Event Server: OK");
383     fFirstEvent->SetEnabled(!autoLoad);
384     fPrevEvent ->SetEnabled(!autoLoad);
385     fLastEvent ->SetEnabled(!autoLoad);
386     fNextEvent ->SetEnabled(!autoLoad);
387     fMarkEvent ->SetEnabled(kTRUE);
388     listEventsTab->SetOfflineMode(kFALSE);
389   }
390 #endif
391
392   if (1 == state) {
393     fRefresh   ->SetEnabled(evNavOn);
394
395     fEventId->SetNumber(fM->GetEventId());
396     fEventId->SetState(evNavOn);
397     // fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
398
399     fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp);
400     fAutoLoadTime->SetValue(fM->GetAutoLoadTime());
401
402     // Loop over active trigger classes
403     if (fM->GetESD()) {
404       for(Int_t iTrig = 0; iTrig < AliESDRun::kNTriggerClasses; iTrig++) {
405         TString trigName = fM->GetESD()->GetESDRun()->GetTriggerClass(iTrig);
406         if (trigName.IsNull()) {
407           if (fTrigSel->GetListBox()->GetEntry(iTrig)) {
408             if (fTrigSel->GetSelected() == iTrig) fTrigSel->Select(-1);
409             fTrigSel->RemoveEntry(iTrig);
410           }
411           continue;
412         }
413         if (!fTrigSel->FindEntry(trigName.Data()))
414           fTrigSel->AddEntry(trigName.Data(),iTrig);
415       }
416     }
417     fTrigSel->SetEnabled(!evNavOn);
418
419     fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal());
420
421     Layout();
422   }
423 }
424
425 void AliEveEventManagerWindow::StorageManagerChangedState(int state)
426 {
427 #ifdef ZMQ
428
429   Bool_t autoLoad = fM->GetAutoLoad();
430   AliStorageAdministratorPanelListEvents* listEventsTab = AliStorageAdministratorPanelListEvents::GetInstance();
431   AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
432
433   if (fM->IsOnlineMode()) {
434     if (state == 0)
435       {
436         fStorageStatus->SetText("Storage: DOWN");
437         fMarkEvent->SetEnabled(kFALSE);
438         fNextEvent->SetEnabled(kFALSE);
439         fLastEvent->SetEnabled(!autoLoad);
440         fPrevEvent->SetEnabled(kFALSE);
441         fFirstEvent->SetEnabled(kFALSE);
442         listEventsTab->SetOfflineMode(kTRUE);
443         fEventId->SetState(kFALSE);
444       }
445     else if(state == 1)
446       {
447         listEventsTab->SetOfflineMode(kFALSE);
448
449         fStorageStatus->SetText("Storage: OK");
450         fMarkEvent->SetEnabled(kTRUE);
451         fNextEvent->SetEnabled(!autoLoad);
452         fLastEvent->SetEnabled(!autoLoad);
453         fPrevEvent->SetEnabled(!autoLoad);
454         fFirstEvent->SetEnabled(!autoLoad);
455         fEventId->SetState(!autoLoad);
456       }
457   }
458 #endif
459 }
460
461 //------------------------------------------------------------------------------
462 // Protected methods
463 //------------------------------------------------------------------------------
464
465 //______________________________________________________________________________
466 TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p,
467                                                     const char* txt, Int_t width,
468                                                     Int_t lo, Int_t ro, Int_t to, Int_t bo)
469 {
470   // Create a standard button.
471   // If width is not zero, the fixed-width flag is set.
472
473   TGTextButton* b = new TGTextButton(p, txt);
474   if (width > 0) {
475     b->SetWidth(width);
476     b->ChangeOptions(b->GetOptions() | kFixedWidth);
477   }
478   p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
479   return b;
480 }
481
482 //______________________________________________________________________________
483 TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
484                                            const char* txt, Int_t width,
485                                            Int_t lo, Int_t ro, Int_t to, Int_t bo)
486 {
487   // Create a standard button.
488   // If width is not zero, the fixed-width flag is set.
489
490   TGLabel* l = new TGLabel(p, txt);
491   if (width > 0) {
492     l->SetWidth(width);
493     l->ChangeOptions(l->GetOptions() | kFixedWidth);
494   }
495   p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
496   return l;
497 }
498