1. Fixing memory leaks in alistorage
[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   fM->GotoEvent(1);
219
220 }
221
222 //______________________________________________________________________________
223 void AliEveEventManagerWindow::DoNextEvent()
224 {
225   // Load next event
226   // fM->NextEvent();
227   fM->GotoEvent(2);
228
229 }
230
231 //______________________________________________________________________________
232 void AliEveEventManagerWindow::DoLastEvent()
233 {
234   // Load previous event
235   fM->GotoEvent(-1);
236 }
237
238 //______________________________________________________________________________
239 void AliEveEventManagerWindow::DoMarkEvent()
240 {
241   // Mark current event
242   fM->MarkCurrentEvent();
243 }
244
245 //______________________________________________________________________________
246 void AliEveEventManagerWindow::DoSetEvent()
247 {
248   // Set current event
249   fM->GotoEvent((Int_t) fEventId->GetNumber());
250 }
251
252 //______________________________________________________________________________
253 void AliEveEventManagerWindow::DoRefresh()
254 {
255   // Refresh event status.
256
257   Int_t ev = fM->GetEventId();
258   fM->Close();
259   fM->Open();
260   fM->GotoEvent(ev);
261 }
262
263 //______________________________________________________________________________
264 void AliEveEventManagerWindow::DoSetAutoLoad()
265 {
266   // Set the auto-load flag
267
268   fM->SetAutoLoad(fAutoLoad->IsOn());
269   Update();
270 }
271
272 //______________________________________________________________________________
273 void AliEveEventManagerWindow::DoSetAutoLoadTime()
274 {
275   // Set the auto-load time in seconds
276
277   fM->SetAutoLoadTime(fAutoLoadTime->GetValue());
278 }
279
280 //______________________________________________________________________________
281 void AliEveEventManagerWindow::DoSetTrigSel()
282 {
283   // Set the trigger selection
284
285   fM->SetTrigSel(fTrigSel->GetSelectedEntry()->EntryId());
286 }
287
288 //______________________________________________________________________________
289 void AliEveEventManagerWindow::Update()
290 {
291   // Update current event, number of available events, list of active triggers
292
293   Bool_t autoLoad = fM->GetAutoLoad();
294   Bool_t extCtrl  = fM->IsUnderExternalControl();
295   Bool_t evNavOn  = !autoLoad && !extCtrl;
296
297   // fFirstEvent->SetEnabled(evNavOn);
298   // fPrevEvent ->SetEnabled(evNavOn);
299   // fLastEvent ->SetEnabled(evNavOn);
300   fFirstEvent->SetEnabled(!autoLoad);
301   fPrevEvent ->SetEnabled(!autoLoad);
302   fLastEvent ->SetEnabled(!autoLoad);
303   fNextEvent ->SetEnabled(!autoLoad);
304   fRefresh   ->SetEnabled(evNavOn);
305
306   fEventId->SetNumber(fM->GetEventId());
307   fEventId->SetState(evNavOn);
308   fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
309
310   fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp);
311   fAutoLoadTime->SetValue(fM->GetAutoLoadTime());
312
313   // Loop over active trigger classes
314   if (fM->GetESD()) {
315     for(Int_t iTrig = 0; iTrig < AliESDRun::kNTriggerClasses; iTrig++) {
316       TString trigName = fM->GetESD()->GetESDRun()->GetTriggerClass(iTrig);
317       if (trigName.IsNull()) {
318         if (fTrigSel->GetListBox()->GetEntry(iTrig)) {
319           if (fTrigSel->GetSelected() == iTrig) fTrigSel->Select(-1);
320           fTrigSel->RemoveEntry(iTrig);
321         }
322         continue;
323       }
324       if (!fTrigSel->FindEntry(trigName.Data()))
325         fTrigSel->AddEntry(trigName.Data(),iTrig);
326     }
327   }
328   fTrigSel->SetEnabled(!evNavOn);
329
330   fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal());
331
332   Layout();
333 }
334
335 void AliEveEventManagerWindow::StorageManagerChangedState(int state)
336 {
337     if (state == 0)
338     {
339         fStorageStatus->SetText("Storage: DOWN");
340         fMarkEvent->SetEnabled(false);
341     }
342     else if(state == 1)
343     {
344         fStorageStatus->SetText("Storage: OK");
345         fMarkEvent->SetEnabled(true);
346     }
347 }
348
349 //------------------------------------------------------------------------------
350 // Protected methods
351 //------------------------------------------------------------------------------
352
353 //______________________________________________________________________________
354 TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p,
355                                                     const char* txt, Int_t width,
356                                                     Int_t lo, Int_t ro, Int_t to, Int_t bo)
357 {
358   // Create a standard button.
359   // If width is not zero, the fixed-width flag is set.
360
361   TGTextButton* b = new TGTextButton(p, txt);
362   if (width > 0) {
363     b->SetWidth(width);
364     b->ChangeOptions(b->GetOptions() | kFixedWidth);
365   }
366   p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
367   return b;
368 }
369
370 //______________________________________________________________________________
371 TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
372                                            const char* txt, Int_t width,
373                                            Int_t lo, Int_t ro, Int_t to, Int_t bo)
374 {
375   // Create a standard button.
376   // If width is not zero, the fixed-width flag is set.
377
378   TGLabel* l = new TGLabel(p, txt);
379   if (width > 0) {
380     l->SetWidth(width);
381     l->ChangeOptions(l->GetOptions() | kFixedWidth);
382   }
383   p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
384   return l;
385 }
386