]>
Commit | Line | Data |
---|---|---|
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 | 29 | using std::ofstream; |
30 | using std::ios; | |
5655e9ce | 31 | ClassImp(AliEveEventManagerEditor) |
32 | ||
33 | //______________________________________________________________________________ | |
34 | AliEveEventManagerEditor::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 | } | |
319f3084 | 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 | ||
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 | 72 | void 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 | 84 | void 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 | ||
107 | ClassImp(AliEveEventManagerWindow) | |
108 | ||
4d62585e | 109 | AliEveEventManagerWindow::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()"); | |
f76c9e9b | 150 | |
80547f2d | 151 | MkLabel(f, "||", 0, 8, 8); |
152 | ||
153 | fRefresh = b = MkTxtButton(f, "Refresh", width + 8); | |
154 | b->Connect("Clicked()",cls, this, "DoRefresh()"); | |
155 | ||
156 | MkLabel(f, "||", 0, 8, 8); | |
157 | ||
158 | fAutoLoad = new TGCheckButton(f, "Autoload"); | |
159 | f->AddFrame(fAutoLoad, new TGLayoutHints(kLHintsLeft, 0, 4, 3, 0)); | |
160 | fAutoLoad->SetToolTipText("Automatic event loading."); | |
161 | fAutoLoad->Connect("Toggled(Bool_t)", cls, this, "DoSetAutoLoad()"); | |
162 | ||
163 | fAutoLoadTime = new TEveGValuator(f, "Time: ", 110, 0); | |
ecb84424 | 164 | f->AddFrame(fAutoLoadTime); |
80547f2d | 165 | fAutoLoadTime->SetShowSlider(kFALSE); |
166 | fAutoLoadTime->SetNELength(4); | |
167 | fAutoLoadTime->Build(); | |
168 | fAutoLoadTime->SetLimits(0, 1000); | |
169 | fAutoLoadTime->SetToolTip("Automatic event loading time in seconds."); | |
170 | fAutoLoadTime->Connect("ValueSet(Double_t)", cls, this, "DoSetAutoLoadTime()"); | |
ecb84424 | 171 | |
969d3431 | 172 | fTrigSel = new TGComboBox(f); |
173 | fTrigSel->Resize(4*width,b->GetDefaultHeight()); | |
174 | fTrigSel->AddEntry("No trigger selection",-1); | |
175 | fTrigSel->Select(-1,kFALSE); | |
176 | f->AddFrame(fTrigSel, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0)); | |
177 | fTrigSel->Connect("Selected(char*)", cls, this, "DoSetTrigSel()"); | |
12365217 | 178 | } |
179 | ||
80547f2d | 180 | fEventInfo = new TGTextView(this, 400, 600); |
181 | AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY)); | |
182 | ||
4d62585e | 183 | fM->Connect("NewEventLoaded()", cls, this, "Update()"); |
f76c9e9b | 184 | |
185 | SetCleanup(kDeepCleanup); | |
186 | Layout(); | |
187 | MapSubwindows(); | |
188 | MapWindow(); | |
189 | } | |
190 | ||
191 | //______________________________________________________________________________ | |
192 | AliEveEventManagerWindow::~AliEveEventManagerWindow() | |
193 | { | |
194 | // Destructor. | |
195 | ||
4d62585e | 196 | fM->Disconnect("NewEventLoaded()", this); |
f76c9e9b | 197 | } |
198 | ||
199 | //______________________________________________________________________________ | |
200 | void AliEveEventManagerWindow::DoFirstEvent() | |
201 | { | |
202 | // Load previous event | |
4d62585e | 203 | fM->GotoEvent(0); |
f76c9e9b | 204 | } |
205 | ||
206 | //______________________________________________________________________________ | |
207 | void AliEveEventManagerWindow::DoPrevEvent() | |
208 | { | |
209 | // Load previous event | |
4d62585e | 210 | fM->PrevEvent(); |
f76c9e9b | 211 | } |
212 | ||
213 | //______________________________________________________________________________ | |
214 | void AliEveEventManagerWindow::DoNextEvent() | |
215 | { | |
216 | // Load next event | |
4d62585e | 217 | fM->NextEvent(); |
f76c9e9b | 218 | } |
219 | ||
220 | //______________________________________________________________________________ | |
221 | void AliEveEventManagerWindow::DoLastEvent() | |
222 | { | |
223 | // Load previous event | |
4d62585e | 224 | fM->GotoEvent(-1); |
f76c9e9b | 225 | } |
226 | ||
227 | //______________________________________________________________________________ | |
228 | void AliEveEventManagerWindow::DoSetEvent() | |
229 | { | |
230 | // Set current event | |
4d62585e | 231 | fM->GotoEvent((Int_t) fEventId->GetNumber()); |
f76c9e9b | 232 | } |
233 | ||
80547f2d | 234 | //______________________________________________________________________________ |
235 | void AliEveEventManagerWindow::DoRefresh() | |
236 | { | |
237 | // Refresh event status. | |
238 | ||
4d62585e | 239 | Int_t ev = fM->GetEventId(); |
240 | fM->Close(); | |
241 | fM->Open(); | |
242 | fM->GotoEvent(ev); | |
80547f2d | 243 | } |
244 | ||
245 | //______________________________________________________________________________ | |
246 | void AliEveEventManagerWindow::DoSetAutoLoad() | |
247 | { | |
248 | // Set the auto-load flag | |
249 | ||
4d62585e | 250 | fM->SetAutoLoad(fAutoLoad->IsOn()); |
80547f2d | 251 | Update(); |
252 | } | |
253 | ||
254 | //______________________________________________________________________________ | |
255 | void AliEveEventManagerWindow::DoSetAutoLoadTime() | |
256 | { | |
257 | // Set the auto-load time in seconds | |
258 | ||
4d62585e | 259 | fM->SetAutoLoadTime(fAutoLoadTime->GetValue()); |
80547f2d | 260 | } |
261 | ||
969d3431 | 262 | //______________________________________________________________________________ |
263 | void AliEveEventManagerWindow::DoSetTrigSel() | |
264 | { | |
265 | // Set the trigger selection | |
266 | ||
267 | fM->SetTrigSel(fTrigSel->GetSelectedEntry()->EntryId()); | |
268 | } | |
269 | ||
f76c9e9b | 270 | //______________________________________________________________________________ |
271 | void AliEveEventManagerWindow::Update() | |
272 | { | |
ecb84424 | 273 | // Update current event, number of available events, list of active triggers |
f76c9e9b | 274 | |
4d62585e | 275 | Bool_t autoLoad = fM->GetAutoLoad(); |
276 | Bool_t extCtrl = fM->IsUnderExternalControl(); | |
80547f2d | 277 | Bool_t evNavOn = !autoLoad && !extCtrl; |
278 | ||
279 | fFirstEvent->SetEnabled(evNavOn); | |
280 | fPrevEvent ->SetEnabled(evNavOn); | |
281 | fLastEvent ->SetEnabled(evNavOn); | |
282 | fNextEvent ->SetEnabled(!autoLoad); | |
283 | fRefresh ->SetEnabled(evNavOn); | |
284 | ||
4d62585e | 285 | fEventId->SetNumber(fM->GetEventId()); |
80547f2d | 286 | fEventId->SetState(evNavOn); |
4d62585e | 287 | fInfoLabel->SetText(Form("/ %d", fM->GetMaxEventId())); |
12365217 | 288 | |
4d62585e | 289 | fAutoLoad->SetState(fM->GetAutoLoad() ? kButtonDown : kButtonUp); |
290 | fAutoLoadTime->SetValue(fM->GetAutoLoadTime()); | |
80547f2d | 291 | |
969d3431 | 292 | // Loop over active trigger classes |
293 | if (fM->GetESD()) { | |
294 | for(Int_t iTrig = 0; iTrig < AliESDRun::kNTriggerClasses; iTrig++) { | |
295 | TString trigName = fM->GetESD()->GetESDRun()->GetTriggerClass(iTrig); | |
296 | if (trigName.IsNull()) { | |
297 | if (fTrigSel->GetListBox()->GetEntry(iTrig)) { | |
298 | if (fTrigSel->GetSelected() == iTrig) fTrigSel->Select(-1); | |
299 | fTrigSel->RemoveEntry(iTrig); | |
300 | } | |
301 | continue; | |
302 | } | |
303 | if (!fTrigSel->FindEntry(trigName.Data())) | |
304 | fTrigSel->AddEntry(trigName.Data(),iTrig); | |
305 | } | |
306 | } | |
307 | fTrigSel->SetEnabled(!evNavOn); | |
308 | ||
4d62585e | 309 | fEventInfo->LoadBuffer(fM->GetEventInfoHorizontal()); |
12365217 | 310 | |
f76c9e9b | 311 | Layout(); |
312 | } | |
80547f2d | 313 | |
314 | //------------------------------------------------------------------------------ | |
315 | // Protected methods | |
316 | //------------------------------------------------------------------------------ | |
317 | ||
318 | //______________________________________________________________________________ | |
319 | TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p, | |
320 | const char* txt, Int_t width, | |
321 | Int_t lo, Int_t ro, Int_t to, Int_t bo) | |
322 | { | |
323 | // Create a standard button. | |
324 | // If width is not zero, the fixed-width flag is set. | |
325 | ||
326 | TGTextButton* b = new TGTextButton(p, txt); | |
327 | if (width > 0) { | |
328 | b->SetWidth(width); | |
329 | b->ChangeOptions(b->GetOptions() | kFixedWidth); | |
330 | } | |
331 | p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo)); | |
332 | return b; | |
333 | } | |
334 | ||
335 | //______________________________________________________________________________ | |
336 | TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p, | |
337 | const char* txt, Int_t width, | |
338 | Int_t lo, Int_t ro, Int_t to, Int_t bo) | |
339 | { | |
340 | // Create a standard button. | |
341 | // If width is not zero, the fixed-width flag is set. | |
342 | ||
343 | TGLabel* l = new TGLabel(p, txt); | |
344 | if (width > 0) { | |
345 | l->SetWidth(width); | |
346 | l->ChangeOptions(l->GetOptions() | kFixedWidth); | |
347 | } | |
348 | p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo)); | |
349 | return l; | |
350 | } | |
ecb84424 | 351 |