Checking Storage Manager state added to ED. Now GUI reacts depending on status of SM.
[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
13 #include <AliESDEvent.h>
14
15 #include <TVirtualPad.h>
16 #include "TColor.h"
17
18 #include <TEveGValuators.h>
19 #include <TGButton.h>
20 #include <TGTextView.h>
21 #include <TGLabel.h>
22
23 #include "Riostream.h"
24
25 //______________________________________________________________________________
26 // GUI editor for AliEveEventManager.
27 //
28
29 using std::ofstream;
30 using std::ios;
31 ClassImp(AliEveEventManagerEditor)
32
33 //______________________________________________________________________________
34 AliEveEventManagerEditor::AliEveEventManagerEditor(const TGWindow *p, Int_t width, Int_t height,
35                                                    UInt_t options, Pixel_t back) :
36   TGedFrame(p, width, height, options | kVerticalFrame, back),
37   fM(0),
38   fDumpEventInfo(0),
39   fEventInfo(0)
40 {
41   // Constructor.
42
43   MakeTitle("AliEveEventManager");
44
45   {
46     TGHorizontalFrame* f = new TGHorizontalFrame(this);
47     fDumpEventInfo = new TGTextButton(f, "Dump Event Info");
48     fDumpEventInfo->SetToolTipText("Append information about current event to event_info.txt file.");
49     fDumpEventInfo->SetWidth(120);
50     fDumpEventInfo->ChangeOptions(fDumpEventInfo->GetOptions() | kFixedWidth);
51     f->AddFrame(fDumpEventInfo, new TGLayoutHints(kLHintsNormal, 4,0,0,0));
52     fDumpEventInfo->Connect("Clicked()",
53                         "AliEveEventManagerEditor", this, "DumpEventInfo()");
54     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
55   }
56   {
57     TGVerticalFrame* f = new TGVerticalFrame(this);
58
59     TGLabel *eventInfoLabel = new TGLabel(f, "Event Information:");
60     f->AddFrame(eventInfoLabel, new TGLayoutHints(kLHintsNormal, 0,0,6,2));
61
62     fEventInfo = new TGTextView(f, 200, 300);
63     f->AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
64
65     AddFrame(f, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
66   }
67 }
68
69 /******************************************************************************/
70
71 //______________________________________________________________________________
72 void AliEveEventManagerEditor::SetModel(TObject* obj)
73 {
74   // Set model object.
75
76   fM = static_cast<AliEveEventManager*>(obj);
77
78   fEventInfo->LoadBuffer(fM->GetEventInfoVertical());
79 }
80
81 /******************************************************************************/
82
83 //______________________________________________________________________________
84 void AliEveEventManagerEditor::DumpEventInfo()
85 {
86   // Dump event-info into event_info.txt.
87   // The info is appended into the file.
88
89   ofstream f("event_info.txt", ios::out | ios::app);
90
91   f << "================================================================================\n\n";
92   f << fM->GetEventInfoHorizontal() << std::endl << std::endl;
93
94   f.close();
95 }
96
97
98 //==============================================================================
99 // AliEveEventManagerWindow
100 //==============================================================================
101
102 //______________________________________________________________________________
103 //
104 // Horizontal GUI for AliEveEventManager, to be placed in the
105 // bottom part of ROOT browser.
106
107 ClassImp(AliEveEventManagerWindow)
108
109 AliEveEventManagerWindow::AliEveEventManagerWindow(AliEveEventManager* mgr) :
110   TGMainFrame(gClient->GetRoot(), 400, 100, kVerticalFrame),
111   fM            (mgr),
112   fFirstEvent   (0),
113   fPrevEvent    (0),
114   fNextEvent    (0),
115   fLastEvent    (0),
116   fRefresh      (0),
117   fEventId      (0),
118   fInfoLabel    (0),
119   fAutoLoad     (0),
120   fAutoLoadTime (0),
121   fTrigSel      (0),
122   fEventInfo    (0)
123 {
124   // Constructor.
125
126   const TString cls("AliEveEventManagerWindow");
127   TGTextButton *b = 0;
128   {
129     Int_t width = 50;
130
131     TGHorizontalFrame* f = new TGHorizontalFrame(this);
132     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 0,0,2,2));
133
134     fFirstEvent = b = MkTxtButton(f, "First", width);
135     b->Connect("Clicked()", cls, this, "DoFirstEvent()");
136     fPrevEvent = b = MkTxtButton(f, "Prev", width);
137     b->Connect("Clicked()", cls, this, "DoPrevEvent()");
138
139     fEventId = new TGNumberEntry(f, 0, 5, -1,TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
140                                  TGNumberFormat::kNELLimitMinMax, 0, 10000);
141     f->AddFrame(fEventId, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
142     fEventId->Connect("ValueSet(Long_t)", cls, this, "DoSetEvent()");
143     fInfoLabel = new TGLabel(f);
144     f->AddFrame(fInfoLabel, new TGLayoutHints(kLHintsNormal, 5, 10, 4, 0));
145
146     fNextEvent = b = MkTxtButton(f, "Next", width);
147     b->Connect("Clicked()", cls, this, "DoNextEvent()");
148     fLastEvent = b = MkTxtButton(f, "Last", width);
149     b->Connect("Clicked()", cls, this, "DoLastEvent()");
150     fMarkEvent = b = MkTxtButton(f, "Mark", width);
151     b->Connect("Clicked()", cls, this, "DoMarkEvent()");
152
153     MkLabel(f, "||", 0, 8, 8);
154
155     fRefresh = b = MkTxtButton(f, "Refresh", width + 8);
156     b->Connect("Clicked()",cls, this, "DoRefresh()");
157
158     MkLabel(f, "||", 0, 8, 8);
159
160     fAutoLoad = new TGCheckButton(f, "Autoload");
161     f->AddFrame(fAutoLoad, new TGLayoutHints(kLHintsLeft, 0, 4, 3, 0));
162     fAutoLoad->SetToolTipText("Automatic event loading.");
163     fAutoLoad->Connect("Toggled(Bool_t)", cls, this, "DoSetAutoLoad()");
164
165     fAutoLoadTime = new TEveGValuator(f, "Time: ", 110, 0);
166     f->AddFrame(fAutoLoadTime);
167     fAutoLoadTime->SetShowSlider(kFALSE);
168     fAutoLoadTime->SetNELength(4);
169     fAutoLoadTime->Build();
170     fAutoLoadTime->SetLimits(0, 1000);
171     fAutoLoadTime->SetToolTip("Automatic event loading time in seconds.");
172     fAutoLoadTime->Connect("ValueSet(Double_t)", cls, this, "DoSetAutoLoadTime()");
173
174     fTrigSel = new TGComboBox(f);
175     fTrigSel->Resize(4*width,b->GetDefaultHeight());
176     fTrigSel->AddEntry("No trigger selection",-1);
177     fTrigSel->Select(-1,kFALSE);
178     f->AddFrame(fTrigSel, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
179     fTrigSel->Connect("Selected(char*)", cls, this, "DoSetTrigSel()");
180
181     fStorageStatus = MkLabel(f,"Storage: Waiting",0,8,8);
182       
183   }
184     
185   fEventInfo = new TGTextView(this, 400, 600);
186   AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
187
188   fM->Connect("NewEventLoaded()", cls, this, "Update()");
189     fM->Connect("StorageManagerOk()",cls,this,"StorageManagerChangedState(=1)");
190     fM->Connect("StorageManagerDown()",cls,this,"StorageManagerChangedState(=0)");
191
192   SetCleanup(kDeepCleanup);
193   Layout();
194   MapSubwindows();
195   MapWindow();
196 }
197
198 //______________________________________________________________________________
199 AliEveEventManagerWindow::~AliEveEventManagerWindow()
200 {
201   // Destructor.
202
203   fM->Disconnect("NewEventLoaded()", this);
204 }
205
206 //______________________________________________________________________________
207 void AliEveEventManagerWindow::DoFirstEvent()
208 {
209   // Load previous event
210   fM->GotoEvent(0);
211 }
212
213 //______________________________________________________________________________
214 void AliEveEventManagerWindow::DoPrevEvent()
215 {
216   // Load previous event
217   fM->PrevEvent();
218 }
219
220 //______________________________________________________________________________
221 void AliEveEventManagerWindow::DoNextEvent()
222 {
223   // Load next event
224   fM->NextEvent();
225 }
226
227 //______________________________________________________________________________
228 void AliEveEventManagerWindow::DoLastEvent()
229 {
230   // Load previous event
231   fM->GotoEvent(-1);
232 }
233
234 //______________________________________________________________________________
235 void AliEveEventManagerWindow::DoMarkEvent()
236 {
237   // Mark current event
238   fM->MarkCurrentEvent();
239 }
240
241 //______________________________________________________________________________
242 void AliEveEventManagerWindow::DoSetEvent()
243 {
244   // Set current event
245   fM->GotoEvent((Int_t) fEventId->GetNumber());
246 }
247
248 //______________________________________________________________________________
249 void AliEveEventManagerWindow::DoRefresh()
250 {
251   // Refresh event status.
252
253   Int_t ev = fM->GetEventId();
254   fM->Close();
255   fM->Open();
256   fM->GotoEvent(ev);
257 }
258
259 //______________________________________________________________________________
260 void AliEveEventManagerWindow::DoSetAutoLoad()
261 {
262   // Set the auto-load flag
263
264   fM->SetAutoLoad(fAutoLoad->IsOn());
265   Update();
266 }
267
268 //______________________________________________________________________________
269 void AliEveEventManagerWindow::DoSetAutoLoadTime()
270 {
271   // Set the auto-load time in seconds
272
273   fM->SetAutoLoadTime(fAutoLoadTime->GetValue());
274 }
275
276 //______________________________________________________________________________
277 void AliEveEventManagerWindow::DoSetTrigSel()
278 {
279   // Set the trigger selection
280
281   fM->SetTrigSel(fTrigSel->GetSelectedEntry()->EntryId());
282 }
283
284 //______________________________________________________________________________
285 void AliEveEventManagerWindow::Update()
286 {
287   // Update current event, number of available events, list of active triggers
288
289   Bool_t autoLoad = fM->GetAutoLoad();
290   Bool_t extCtrl  = fM->IsUnderExternalControl();
291   Bool_t evNavOn  = !autoLoad && !extCtrl;
292
293   fFirstEvent->SetEnabled(evNavOn);
294   fPrevEvent ->SetEnabled(evNavOn);
295   fLastEvent ->SetEnabled(evNavOn);
296   fNextEvent ->SetEnabled(!autoLoad);
297   fRefresh   ->SetEnabled(evNavOn);
298
299   fEventId->SetNumber(fM->GetEventId());
300   fEventId->SetState(evNavOn);
301   fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
302
303   fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp);
304   fAutoLoadTime->SetValue(fM->GetAutoLoadTime());
305
306   // Loop over active trigger classes
307   if (fM->GetESD()) {
308     for(Int_t iTrig = 0; iTrig < AliESDRun::kNTriggerClasses; iTrig++) {
309       TString trigName = fM->GetESD()->GetESDRun()->GetTriggerClass(iTrig);
310       if (trigName.IsNull()) {
311         if (fTrigSel->GetListBox()->GetEntry(iTrig)) {
312           if (fTrigSel->GetSelected() == iTrig) fTrigSel->Select(-1);
313           fTrigSel->RemoveEntry(iTrig);
314         }
315         continue;
316       }
317       if (!fTrigSel->FindEntry(trigName.Data()))
318         fTrigSel->AddEntry(trigName.Data(),iTrig);
319     }
320   }
321   fTrigSel->SetEnabled(!evNavOn);
322
323   fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal());
324
325   Layout();
326 }
327
328 void AliEveEventManagerWindow::StorageManagerChangedState(int state)
329 {
330     if (state == 0)
331     {
332         fStorageStatus->SetText("Storage: DOWN");
333         fMarkEvent->SetEnabled(false);
334     }
335     else if(state == 1)
336     {
337         fStorageStatus->SetText("Storage: OK");
338         fMarkEvent->SetEnabled(true);
339     }
340 }
341
342 //------------------------------------------------------------------------------
343 // Protected methods
344 //------------------------------------------------------------------------------
345
346 //______________________________________________________________________________
347 TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p,
348                                                     const char* txt, Int_t width,
349                                                     Int_t lo, Int_t ro, Int_t to, Int_t bo)
350 {
351   // Create a standard button.
352   // If width is not zero, the fixed-width flag is set.
353
354   TGTextButton* b = new TGTextButton(p, txt);
355   if (width > 0) {
356     b->SetWidth(width);
357     b->ChangeOptions(b->GetOptions() | kFixedWidth);
358   }
359   p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
360   return b;
361 }
362
363 //______________________________________________________________________________
364 TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
365                                            const char* txt, Int_t width,
366                                            Int_t lo, Int_t ro, Int_t to, Int_t bo)
367 {
368   // Create a standard button.
369   // If width is not zero, the fixed-width flag is set.
370
371   TGLabel* l = new TGLabel(p, txt);
372   if (width > 0) {
373     l->SetWidth(width);
374     l->ChangeOptions(l->GetOptions() | kFixedWidth);
375   }
376   p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
377   return l;
378 }
379