Checking Storage Manager state added to ED. Now GUI reacts depending on status of SM.
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManagerEditor.cxx
CommitLineData
5655e9ce 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
b3b7b8d3 13#include <AliESDEvent.h>
14
15#include <TVirtualPad.h>
5655e9ce 16#include "TColor.h"
17
319f3084 18#include <TEveGValuators.h>
19#include <TGButton.h>
20#include <TGTextView.h>
21#include <TGLabel.h>
5655e9ce 22
fa6aa785 23#include "Riostream.h"
24
5655e9ce 25//______________________________________________________________________________
26// GUI editor for AliEveEventManager.
27//
28
f65f2d99 29using std::ofstream;
30using std::ios;
5655e9ce 31ClassImp(AliEveEventManagerEditor)
32
33//______________________________________________________________________________
34AliEveEventManagerEditor::AliEveEventManagerEditor(const TGWindow *p, Int_t width, Int_t height,
80547f2d 35 UInt_t options, Pixel_t back) :
5655e9ce 36 TGedFrame(p, width, height, options | kVerticalFrame, back),
319f3084 37 fM(0),
fa6aa785 38 fDumpEventInfo(0),
319f3084 39 fEventInfo(0)
5655e9ce 40{
41 // Constructor.
42
43 MakeTitle("AliEveEventManager");
44
319f3084 45 {
46 TGHorizontalFrame* f = new TGHorizontalFrame(this);
fa6aa785 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()");
319f3084 54 AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
55 }
ca49b003 56 {
319f3084 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
ec835ab5 62 fEventInfo = new TGTextView(f, 200, 300);
319f3084 63 f->AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
64
65 AddFrame(f, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
66 }
5655e9ce 67}
68
69/******************************************************************************/
70
80547f2d 71//______________________________________________________________________________
5655e9ce 72void AliEveEventManagerEditor::SetModel(TObject* obj)
73{
74 // Set model object.
75
04a6d27f 76 fM = static_cast<AliEveEventManager*>(obj);
5655e9ce 77
12365217 78 fEventInfo->LoadBuffer(fM->GetEventInfoVertical());
5655e9ce 79}
80
81/******************************************************************************/
82
319f3084 83//______________________________________________________________________________
fa6aa785 84void AliEveEventManagerEditor::DumpEventInfo()
319f3084 85{
fa6aa785 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;
ca49b003 93
fa6aa785 94 f.close();
ca49b003 95}
f76c9e9b 96
97
80547f2d 98//==============================================================================
f76c9e9b 99// AliEveEventManagerWindow
80547f2d 100//==============================================================================
f76c9e9b 101
102//______________________________________________________________________________
103//
104// Horizontal GUI for AliEveEventManager, to be placed in the
105// bottom part of ROOT browser.
106
107ClassImp(AliEveEventManagerWindow)
108
4d62585e 109AliEveEventManagerWindow::AliEveEventManagerWindow(AliEveEventManager* mgr) :
12365217 110 TGMainFrame(gClient->GetRoot(), 400, 100, kVerticalFrame),
4d62585e 111 fM (mgr),
80547f2d 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),
969d3431 121 fTrigSel (0),
80547f2d 122 fEventInfo (0)
f76c9e9b 123{
124 // Constructor.
125
488869c1 126 const TString cls("AliEveEventManagerWindow");
80547f2d 127 TGTextButton *b = 0;
f76c9e9b 128 {
129 Int_t width = 50;
130
131 TGHorizontalFrame* f = new TGHorizontalFrame(this);
80547f2d 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()");
f76c9e9b 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));
80547f2d 142 fEventId->Connect("ValueSet(Long_t)", cls, this, "DoSetEvent()");
f76c9e9b 143 fInfoLabel = new TGLabel(f);
144 f->AddFrame(fInfoLabel, new TGLayoutHints(kLHintsNormal, 5, 10, 4, 0));
145
80547f2d 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()");
164d3d29 150 fMarkEvent = b = MkTxtButton(f, "Mark", width);
151 b->Connect("Clicked()", cls, this, "DoMarkEvent()");
f76c9e9b 152
80547f2d 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);
ecb84424 166 f->AddFrame(fAutoLoadTime);
80547f2d 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()");
ecb84424 173
969d3431 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()");
12365217 180
0790c3e6 181 fStorageStatus = MkLabel(f,"Storage: Waiting",0,8,8);
182
183 }
184
80547f2d 185 fEventInfo = new TGTextView(this, 400, 600);
186 AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
187
4d62585e 188 fM->Connect("NewEventLoaded()", cls, this, "Update()");
0790c3e6 189 fM->Connect("StorageManagerOk()",cls,this,"StorageManagerChangedState(=1)");
190 fM->Connect("StorageManagerDown()",cls,this,"StorageManagerChangedState(=0)");
f76c9e9b 191
192 SetCleanup(kDeepCleanup);
193 Layout();
194 MapSubwindows();
195 MapWindow();
196}
197
198//______________________________________________________________________________
199AliEveEventManagerWindow::~AliEveEventManagerWindow()
200{
201 // Destructor.
202
4d62585e 203 fM->Disconnect("NewEventLoaded()", this);
f76c9e9b 204}
205
206//______________________________________________________________________________
207void AliEveEventManagerWindow::DoFirstEvent()
208{
209 // Load previous event
4d62585e 210 fM->GotoEvent(0);
f76c9e9b 211}
212
213//______________________________________________________________________________
214void AliEveEventManagerWindow::DoPrevEvent()
215{
216 // Load previous event
4d62585e 217 fM->PrevEvent();
f76c9e9b 218}
219
220//______________________________________________________________________________
221void AliEveEventManagerWindow::DoNextEvent()
222{
223 // Load next event
4d62585e 224 fM->NextEvent();
f76c9e9b 225}
226
227//______________________________________________________________________________
228void AliEveEventManagerWindow::DoLastEvent()
229{
230 // Load previous event
4d62585e 231 fM->GotoEvent(-1);
f76c9e9b 232}
233
234//______________________________________________________________________________
164d3d29 235void AliEveEventManagerWindow::DoMarkEvent()
236{
237 // Mark current event
238 fM->MarkCurrentEvent();
239}
240
241//______________________________________________________________________________
f76c9e9b 242void AliEveEventManagerWindow::DoSetEvent()
243{
244 // Set current event
4d62585e 245 fM->GotoEvent((Int_t) fEventId->GetNumber());
f76c9e9b 246}
247
248//______________________________________________________________________________
80547f2d 249void AliEveEventManagerWindow::DoRefresh()
250{
251 // Refresh event status.
252
4d62585e 253 Int_t ev = fM->GetEventId();
254 fM->Close();
255 fM->Open();
256 fM->GotoEvent(ev);
80547f2d 257}
258
259//______________________________________________________________________________
260void AliEveEventManagerWindow::DoSetAutoLoad()
261{
262 // Set the auto-load flag
263
4d62585e 264 fM->SetAutoLoad(fAutoLoad->IsOn());
80547f2d 265 Update();
266}
267
268//______________________________________________________________________________
269void AliEveEventManagerWindow::DoSetAutoLoadTime()
270{
271 // Set the auto-load time in seconds
272
4d62585e 273 fM->SetAutoLoadTime(fAutoLoadTime->GetValue());
80547f2d 274}
275
276//______________________________________________________________________________
969d3431 277void AliEveEventManagerWindow::DoSetTrigSel()
278{
279 // Set the trigger selection
280
281 fM->SetTrigSel(fTrigSel->GetSelectedEntry()->EntryId());
282}
283
284//______________________________________________________________________________
f76c9e9b 285void AliEveEventManagerWindow::Update()
286{
ecb84424 287 // Update current event, number of available events, list of active triggers
f76c9e9b 288
4d62585e 289 Bool_t autoLoad = fM->GetAutoLoad();
290 Bool_t extCtrl = fM->IsUnderExternalControl();
80547f2d 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
4d62585e 299 fEventId->SetNumber(fM->GetEventId());
80547f2d 300 fEventId->SetState(evNavOn);
4d62585e 301 fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
12365217 302
4d62585e 303 fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp);
304 fAutoLoadTime->SetValue(fM->GetAutoLoadTime());
80547f2d 305
969d3431 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
4d62585e 323 fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal());
12365217 324
f76c9e9b 325 Layout();
326}
80547f2d 327
0790c3e6 328void 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
80547f2d 342//------------------------------------------------------------------------------
343// Protected methods
344//------------------------------------------------------------------------------
345
346//______________________________________________________________________________
347TGTextButton* 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//______________________________________________________________________________
364TGLabel* 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}
ecb84424 379