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