2 // Author: Matevz Tadel 2007
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 **************************************************************************/
10 #include "AliEveEventManagerEditor.h"
11 #include "AliEveEventManager.h"
13 #include <AliESDEvent.h>
15 #include <TVirtualPad.h>
18 #include <TEveGValuators.h>
20 #include <TGTextView.h>
23 //______________________________________________________________________________
24 // GUI editor for AliEveEventManager.
27 ClassImp(AliEveEventManagerEditor)
29 //______________________________________________________________________________
30 AliEveEventManagerEditor::AliEveEventManagerEditor(const TGWindow *p, Int_t width, Int_t height,
31 UInt_t options, Pixel_t back) :
32 TGedFrame(p, width, height, options | kVerticalFrame, back),
39 MakeTitle("AliEveEventManager");
42 TGHorizontalFrame* f = new TGHorizontalFrame(this);
43 fNextEvent = new TGTextButton(f, "Next Event");
44 fNextEvent->SetWidth(100);
45 fNextEvent->ChangeOptions(fNextEvent->GetOptions() | kFixedWidth);
46 f->AddFrame(fNextEvent, new TGLayoutHints(kLHintsNormal, 4,0,0,0));
47 fNextEvent->Connect("Clicked()",
48 "AliEveEventManagerEditor", this, "DoNextEvent()");
49 AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
52 TGVerticalFrame* f = new TGVerticalFrame(this);
54 TGLabel *eventInfoLabel = new TGLabel(f, "Event Information:");
55 f->AddFrame(eventInfoLabel, new TGLayoutHints(kLHintsNormal, 0,0,6,2));
57 fEventInfo = new TGTextView(f, 200, 300);
58 f->AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
60 AddFrame(f, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
64 /******************************************************************************/
66 //______________________________________________________________________________
67 void AliEveEventManagerEditor::SetModel(TObject* obj)
71 fM = dynamic_cast<AliEveEventManager*>(obj);
73 fEventInfo->LoadBuffer(fM->GetEventInfoVertical());
76 /******************************************************************************/
78 //______________________________________________________________________________
79 void AliEveEventManagerEditor::DoNextEvent()
87 //==============================================================================
88 // AliEveEventManagerWindow
89 //==============================================================================
91 //______________________________________________________________________________
93 // Horizontal GUI for AliEveEventManager, to be placed in the
94 // bottom part of ROOT browser.
96 ClassImp(AliEveEventManagerWindow)
98 AliEveEventManagerWindow::AliEveEventManagerWindow(AliEveEventManager* mgr) :
99 TGMainFrame(gClient->GetRoot(), 400, 100, kVerticalFrame),
115 const TString cls("AliEveEventManagerWindow");
120 TGHorizontalFrame* f = new TGHorizontalFrame(this);
121 AddFrame(f, new TGLayoutHints(kLHintsExpandX, 0,0,2,2));
123 fFirstEvent = b = MkTxtButton(f, "First", width);
124 b->Connect("Clicked()", cls, this, "DoFirstEvent()");
125 fPrevEvent = b = MkTxtButton(f, "Prev", width);
126 b->Connect("Clicked()", cls, this, "DoPrevEvent()");
128 fEventId = new TGNumberEntry(f, 0, 5, -1,TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
129 TGNumberFormat::kNELLimitMinMax, 0, 10000);
130 f->AddFrame(fEventId, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
131 fEventId->Connect("ValueSet(Long_t)", cls, this, "DoSetEvent()");
132 fInfoLabel = new TGLabel(f);
133 f->AddFrame(fInfoLabel, new TGLayoutHints(kLHintsNormal, 5, 10, 4, 0));
135 fNextEvent = b = MkTxtButton(f, "Next", width);
136 b->Connect("Clicked()", cls, this, "DoNextEvent()");
137 fLastEvent = b = MkTxtButton(f, "Last", width);
138 b->Connect("Clicked()", cls, this, "DoLastEvent()");
140 MkLabel(f, "||", 0, 8, 8);
142 fRefresh = b = MkTxtButton(f, "Refresh", width + 8);
143 b->Connect("Clicked()",cls, this, "DoRefresh()");
145 MkLabel(f, "||", 0, 8, 8);
147 fAutoLoad = new TGCheckButton(f, "Autoload");
148 f->AddFrame(fAutoLoad, new TGLayoutHints(kLHintsLeft, 0, 4, 3, 0));
149 fAutoLoad->SetToolTipText("Automatic event loading.");
150 fAutoLoad->Connect("Toggled(Bool_t)", cls, this, "DoSetAutoLoad()");
152 fAutoLoadTime = new TEveGValuator(f, "Time: ", 110, 0);
153 f->AddFrame(fAutoLoadTime);
154 fAutoLoadTime->SetShowSlider(kFALSE);
155 fAutoLoadTime->SetNELength(4);
156 fAutoLoadTime->Build();
157 fAutoLoadTime->SetLimits(0, 1000);
158 fAutoLoadTime->SetToolTip("Automatic event loading time in seconds.");
159 fAutoLoadTime->Connect("ValueSet(Double_t)", cls, this, "DoSetAutoLoadTime()");
161 MkLabel(f, "||", 0, 8, 8);
163 MkLabel(f, "TRG select:", 0, 0, 4, 4);
164 fTrigger = new TGComboBox(f);
165 f->AddFrame(fTrigger, new TGLayoutHints(kLHintsNormal));
166 fTrigger->Resize(75,20);
167 //fTrigger->EnableTextInput(kTRUE);
168 fTrigger->Connect("Selected(const char*)", cls, this, "DoSetTriggerType(const char*)");
171 fEventInfo = new TGTextView(this, 400, 600);
172 AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
174 fM->Connect("NewEventLoaded()", cls, this, "Update()");
176 SetCleanup(kDeepCleanup);
182 //______________________________________________________________________________
183 AliEveEventManagerWindow::~AliEveEventManagerWindow()
187 fM->Disconnect("NewEventLoaded()", this);
190 //______________________________________________________________________________
191 void AliEveEventManagerWindow::DoFirstEvent()
193 // Load previous event
197 //______________________________________________________________________________
198 void AliEveEventManagerWindow::DoPrevEvent()
200 // Load previous event
204 //______________________________________________________________________________
205 void AliEveEventManagerWindow::DoNextEvent()
211 //______________________________________________________________________________
212 void AliEveEventManagerWindow::DoLastEvent()
214 // Load previous event
218 //______________________________________________________________________________
219 void AliEveEventManagerWindow::DoSetEvent()
222 fM->GotoEvent((Int_t) fEventId->GetNumber());
225 //______________________________________________________________________________
226 void AliEveEventManagerWindow::DoRefresh()
228 // Refresh event status.
230 Int_t ev = fM->GetEventId();
236 //______________________________________________________________________________
237 void AliEveEventManagerWindow::DoSetAutoLoad()
239 // Set the auto-load flag
241 fM->SetAutoLoad(fAutoLoad->IsOn());
245 //______________________________________________________________________________
246 void AliEveEventManagerWindow::DoSetAutoLoadTime()
248 // Set the auto-load time in seconds
250 fM->SetAutoLoadTime(fAutoLoadTime->GetValue());
253 //______________________________________________________________________________
254 void AliEveEventManagerWindow::DoSetTriggerType(const char* type)
256 // Slot for setting trigger type.
258 TString typestr = type;
261 fM->SetSelectOnTriggerType(kFALSE);
265 fM->SetTriggerType( typestr );
266 fM->SetSelectOnTriggerType(kTRUE);
270 //______________________________________________________________________________
271 void AliEveEventManagerWindow::Update()
273 // Update current event, number of available events, list of active triggers
275 Bool_t autoLoad = fM->GetAutoLoad();
276 Bool_t extCtrl = fM->IsUnderExternalControl();
277 Bool_t evNavOn = !autoLoad && !extCtrl;
279 fFirstEvent->SetEnabled(evNavOn);
280 fPrevEvent ->SetEnabled(evNavOn);
281 fLastEvent ->SetEnabled(evNavOn);
282 fNextEvent ->SetEnabled(!autoLoad);
283 fRefresh ->SetEnabled(evNavOn);
285 fEventId->SetNumber(fM->GetEventId());
286 fEventId->SetState(evNavOn);
287 fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId()));
289 fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp);
290 fAutoLoadTime->SetValue(fM->GetAutoLoadTime());
292 fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal());
294 SetupTriggerSelect();
299 //------------------------------------------------------------------------------
301 //------------------------------------------------------------------------------
303 //______________________________________________________________________________
304 TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p,
305 const char* txt, Int_t width,
306 Int_t lo, Int_t ro, Int_t to, Int_t bo)
308 // Create a standard button.
309 // If width is not zero, the fixed-width flag is set.
311 TGTextButton* b = new TGTextButton(p, txt);
314 b->ChangeOptions(b->GetOptions() | kFixedWidth);
316 p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
320 //______________________________________________________________________________
321 TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
322 const char* txt, Int_t width,
323 Int_t lo, Int_t ro, Int_t to, Int_t bo)
325 // Create a standard button.
326 // If width is not zero, the fixed-width flag is set.
328 TGLabel* l = new TGLabel(p, txt);
331 l->ChangeOptions(l->GetOptions() | kFixedWidth);
333 p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
337 void AliEveEventManagerWindow::SetupTriggerSelect()
339 // Do nothing if already enabled.
340 if (fTrigger->GetNumberOfEntries() > 0)
343 AliESDEvent* esd = fM->GetESD();
344 if (esd && fM->GetESDFile() != 0)
346 TString activetrg = esd->GetESDRun()->GetActiveTriggerClasses(); //Get list of active classes
347 TObjArray* activetrgarr = activetrg.Tokenize(" "); //break up the classes string, space as separator
348 Int_t entries = activetrgarr->GetEntries(); //how many triggerclasses
349 TString entry; //to hold the triger class name
350 TObjString* entryobj;
353 fTrigger->SetEnabled(kFALSE); //no trigger classes
357 fTrigger->RemoveAll(); //some initial cleanup
358 fTrigger->SetEnabled(kTRUE); //no trigger classes
359 fTrigger->AddEntry("",-1); //first entry empty - select to not filter by trigger
360 for (Int_t i=0;i<entries;i++)
362 entryobj = (TObjString*)activetrgarr->At(i);
363 entry = entryobj->GetString();
364 fTrigger->AddEntry(entry.Data(), i);
367 fTrigger->Select(-1, kTRUE); //set default no filtering and emit
368 fTrigger->SetEnabled(kTRUE);
372 fTrigger->SetEnabled(kFALSE);