saveViews macro fixed. Some macros are now being compiled before using to fix issues...
[u/mrichter/AliRoot.git] / EVE / macros / display.C
CommitLineData
274799f3 1#ifndef __CINT__
2# include <TGFileDialog.h>
3# include <TGFileBrowser.h>
4# include <TControlBar.h>
5# include <TString.h>
6# include <TSystem.h>
7# include <TROOT.h>
8# include <TEveManager.h>
9# include <TSystemDirectory.h>
10# include <TEveMacro.h>
11# include <TEveBrowser.h>
12# include <TFolder.h>
13# include <TList.h>
14# include <TApplication.h>
15# include "aliroot/EVE/EveBase/AliEveEventManager.h"
16# include <iostream>
17#endif
18
19class Display
20{
21public:
22 //____________________________________________________________________
23 /** Constructor
24 @param file File or directory to read data from */
25 Display(const char* file="./")
26 : fCb(0),
27 fEnableHits(kFALSE),
28 fEnableDigits(kFALSE),
29 fEnableRaw(kFALSE),
30 fEnableESD(kFALSE),
31 fHasHits(kFALSE),
32 fHasDigits(kFALSE),
33 fHasRaw(kFALSE),
34 fHasESD(kFALSE)
35 {
162637e4 36 AliEveEventManager::SetCdbUri(TString("local://$ALICE_ROOT/OCDB"));
274799f3 37 LoadMacros();
38 Setup(file, false);
39 SetupSelect();
40 SetupControl();
41 }
42 //____________________________________________________________________
43 /** Setup the control bar */
44 void SetupControl()
45 {
46 fCb = new TControlBar("vertical", "EVE Controls");
47 const char* buts[] = { "Load ...",
48 "Select ...",
49 "Next event",
50 "Previous event",
51 "Hits",
52 "Digits",
53 "Raw",
54 "ESD",
55 "Tracks",
56 "Quit",
57 0 };
58 const char* meths[] = { "LoadFile",
59 "Select",
60 "NextEvent",
61 "PrevEvent",
62 "ToggleHits",
63 "ToggleDigits",
64 "ToggleRaw",
65 "ToggleESD",
66 "ToggleTracks",
67 "Quit",
68 0 };
69 const char* hints[] = { "Specify input" ,
70 "Select which detectors to show",
71 "Get next event",
72 "Get previous event",
73 "Toggle display of hits",
74 "Toggle display of simulated digits",
75 "Toggle display of raw digits",
76 "Toggle display of event summary data",
77 "Toggle display of tracks",
78 "Quit",
79 0 };
80
81 char** but = const_cast<char**>(buts);
82 char** meth = const_cast<char**>(meths);
83 char** hint = const_cast<char**>(hints);
84 while (*but) {
85 fCb->AddButton(*but, Form("Display::Instance()->%s()", *meth), *hint);
86 but++;
87 meth++;
88 hint++;
89 }
90 fCb->Show();
91 }
92 //____________________________________________________________________
93 /** Setup the selection bar */
94 void SetupSelect()
95 {
96 fSelect = new TControlBar("vertical", "Detector selection");
97 char* dets[] = { "emcal",
98 "fmd",
99 "its",
100 "pmd",
101 "t0",
102 "tof",
103 "tpc",
104 "trd",
105 "vzero",
106 "kine",
107 "esd",
108 0 };
109 char** det = dets;
110 while (*det) {
111 // TString cmd(Form("Display::Instance()->Enable(\"%s\")", *det));
112 // TString help(Form("Enable display of %s data", name.Data()));
113 fSelect->AddButton(*det,
114 Form("Display::Instance()->Enable(\"%s\")", *det),
115 Form("Enable display of %s data", *det));
116 det++;
117 }
118 std::cout << "Adding \"Hide\" to select" << std::endl;
119 fSelect->AddButton("Hide", "Display::Instance()->HideSelect()",
120 "Hide the detector selection menu");
121 }
122 //____________________________________________________________________
123 /** Load macros used by EVE */
124 void LoadMacros()
125 {
126 std::cout << "Loading macros ... " << std::flush;
127 TString savdir(gSystem->pwd());
128 TString macdir("$(ALICE_ROOT)/EVE/alice-macros");
129 gSystem->ExpandPathName(macdir);
130
131 TFolder* f = gEve->GetMacroFolder();
132 TSystemDirectory* dir = new TSystemDirectory(macdir.Data(),
133 macdir.Data());
134 TList* files = dir->GetListOfFiles();
135 files->Sort();
136 TIter next(files);
137 TSystemFile* file = 0;
138 while ((file = static_cast<TSystemFile*>(next()))) {
139 if (file->IsDirectory()) continue;
140 TString name(gSystem->ConcatFileName(macdir.Data(),file->GetName()));
141 if (!name.EndsWith(".C")) continue;
142 f->Add(new TEveMacro(name.Data()));
143 }
144
145 gROOT->GetListOfBrowsables()->Add(dir);
146
147 {
148 TEveBrowser* b = gEve->GetBrowser();
149 TGFileBrowser* fb = b->GetFileBrowser();
150 fb->GotoDir(macdir);
151 {
152 b->StartEmbedding(0);
153 fb = b->MakeFileBrowser();
154 fb->BrowseObj(f);
155 fb->Show();
156 b->StopEmbedding(0);
157 b->SetTabTitle("Macros", 0);
158 b->SetTab(0,0);
159 }
160 }
161 gSystem->cd(savdir);
162 std::cout << "done" << std::endl;
163 }
164 //____________________________________________________________________
165 /** Set-up load location, etc.
166 @param file File or directory to read data from
167 @param refresh Force a refresh */
168 void Setup(const char* file, bool refresh)
169 {
170 TString fileName(gSystem->BaseName(file));
171 TString dirName(gSystem->DirName(file));
172
173 if (fileName.Contains("ESD")) {
174 std::cout << "Adding ESD file " << fileName << std::endl;
a284ebe7 175 AliEveEventManager::SetESDFileName(fileName);
274799f3 176 }
177 else if (fileName.EndsWith(".root") || fileName.EndsWith(".raw")) {
178 std::cout << "Adding raw file " << fileName << std::endl;
a284ebe7 179 AliEveEventManager::SetRawFileName(fileName);
274799f3 180 }
181 else if (fileName.IsNull()) {
182 std::cout << "No file given!" << std::endl;
183 // std::cout << "Adding raw directory " << dirName.Data() << std::endl;
184 // AliEveEventManager::SetRawFileName(dirName.Data());
185 }
186 else {
187 std::cerr << "Don't know how to deal with '" << fileName << "'"
188 << std::endl;
189 return;
190 }
191 std::cout << "Opening " << fileName << " (" << dirName << ")" << std::endl;
192
4d62585e 193 if (AliEveEventManager::GetMaster()) delete AliEveEventManager::GetMaster();
ba5d58f2 194 TString eventName("Event"); // CINT has trouble with direct "Event".
a284ebe7 195 /* AliEveEventManager::GetMaster() =*/
196 new AliEveEventManager(eventName, dirName, 0);
4d62585e 197 gEve->AddEvent(AliEveEventManager::GetMaster());
274799f3 198
199 if (refresh) Refresh();
200 }
201 //____________________________________________________________________
202 /** Executed in response to hitting the "Load ..." button. */
203 void
204 LoadFile()
205 {
206 fCb->SetButtonState("Load ...", 1);
207 TGFileInfo fi;
208 fi.fIniDir = StrDup(gSystem->pwd());
209 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDOpen, &fi);
210 Setup(fi.fFilename, true);
211 fCb->SetButtonState("Load ...", 0);
212 }
213 //____________________________________________________________________
214 /** Pop-up or down the selection menu */
215 void
216 Select()
217 {
218 fSelect->Show();
219 fCb->SetButtonState("Select ...", 1);
220 }
221 //____________________________________________________________________
222 /** Enable a detector or type of display */
223 void
224 Enable(const char* what)
225 {
226 TObject* o = fEnabled.FindObject(what);
227 //TString n(what);
228 // n.ToUpper();
229 std::cout << "Enable " << what << "?" << std::endl;
230 if (o) {
231 fEnabled.Remove(o);
232 fSelect->SetButtonState(what, 0);
233 delete o;
234 }
235 else {
236 fEnabled.Add(new TObjString(what));
237 fSelect->SetButtonState(what, 1);
238 }
239 Refresh();
240 }
241 //____________________________________________________________________
242 /** Pop-down the selection menu */
243 void
244 HideSelect()
245 {
246 fCb->SetButtonState("Select ...", 0);
247 fSelect->Hide();
248 }
249 //____________________________________________________________________
250 /** Prepare for a new event */
251 void
252 Prepare()
253 {
254 fHasHits = kFALSE;
255 fHasDigits = kFALSE;
256 fHasRaw = kFALSE;
257 fHasESD = kFALSE;
258 fHasTracks = kFALSE;
259 }
260 //____________________________________________________________________
261 /** Get the next event */
262 void
263 NextEvent()
264 {
265 Prepare();
266 std::cout << "Getting next event, please wait ... " << std::flush;
267 gROOT->Macro("event_next.C");
268 std::cout << "done" << std::endl;
269 Refresh();
270 }
271 //____________________________________________________________________
272 /** Get the previous event */
273 void
274 PrevEvent()
275 {
276 Prepare();
277 std::cout << "Getting previous event, please wait ... " << std::flush;
278 gROOT->Macro("event_prev.C");
279 std::cout << "done" << std::endl;
280 Refresh();
281 }
282 //____________________________________________________________________
283 /** Reload the current event */
284 void
285 Reload()
286 {
287 Prepare();
4d62585e 288 Int_t event = AliEveEventManager::GetMaster()->GetEventId();
274799f3 289 std::cout << "Getting event " << event
290 << ", please wait ... " << std::flush;
291 gROOT->Macro(Form("event_goto.C(%d)", event));
292 std::cout << "done" << std::endl;
293 Refresh();
294 }
295 //__________________________________________________________________
296 /** Refresh the display of something
297 @param enabled Whether this something is enabled or not
298 @param has Whether we have already shown this data
299 @param what What data to show */
300 void
301 RefreshOne(Bool_t enabled, Bool_t& has, const char* what)
302 {
303 if (!enabled || has) return;
304 std::cout << what << "..." << std::flush;
305 TIter next(&fEnabled);
306 TObject* o = 0;
307 while ((o = next())) {
308 TMacro* macro = gEve->GetMacro(Form("%s_%s", o->GetName(), what));
309 if (macro) macro->Exec();
310 }
311 has = kTRUE;
312 }
313
314 //____________________________________________________________________
315 /** Refresh the display of the data */
316 void
317 Refresh()
318 {
319 std::cout << "Drawing ... " << std::flush;
320 RefreshOne(fEnableTracks, fHasTracks, "tracks");
a284ebe7 321 RefreshOne(fEnableHits, fHasHits, "hits");
274799f3 322 RefreshOne(fEnableDigits, fHasDigits, "digits");
323 RefreshOne(fEnableRaw, fHasRaw, "raw");
324 RefreshOne(fEnableESD, fHasESD, "esd");
325 std::cout << "done" << std::endl;
326 }
327 //____________________________________________________________________
328 /** Toggle the diplay of some data */
329 void
330 Toggle(Bool_t& what, const char* name)
331 {
332 what = !what;
333 fCb->SetButtonState(name, what ? 1 : 0);
334 if (!what) Reload();
335 Refresh();
336 }
337 //____________________________________________________________________
338 /** Toggle the diplay the simulated hits */
339 void ToggleHits() { Toggle(fEnableHits, "Hits"); }
340 //____________________________________________________________________
341 /** Toggle the diplay the simulated digits */
342 void ToggleDigits() { Toggle(fEnableDigits, "Digits"); }
343 //____________________________________________________________________
344 /** Toggle the diplay the raw digits */
345 void ToggleRaw() { Toggle(fEnableRaw, "Raw"); }
346 //____________________________________________________________________
347 /** Toggle the diplay the Event Summary Data */
348 void ToggleESD() { Toggle(fEnableESD, "ESD"); }
349 //____________________________________________________________________
350 /** Toggle the diplay of tracks */
351 void ToggleTracks() { Toggle(fEnableTracks, "Tracks"); }
352 //____________________________________________________________________
353 /** Pop-down both menues */
354 void Quit()
355 {
356 fCb->Hide();
357 fSelect->Hide();
358 fgInstance = 0;
359 delete this;
360 }
361 //____________________________________________________________________
362 /** Get the static instance */
46d7488d 363 static Display* Instance(const char* file=0) {
364 if (!fgInstance) fgInstance = new Display(file);
274799f3 365 return fgInstance;
366 }
367protected:
368 TControlBar* fCb; // Control bar
369 TControlBar* fSelect; // Selection bar
370 Bool_t fEnableHits; // Whether simulated hits are enabled
371 Bool_t fEnableDigits; // Whether simulated digits are enabled
372 Bool_t fEnableRaw; // Whehter raw data digits are enabled
373 Bool_t fEnableESD; // Whehter Event Summary Data is enabled
374 Bool_t fEnableTracks; // Whether tracks are shown
375 Bool_t fHasHits; // Whether simulated hits are rendered
376 Bool_t fHasDigits; // Whether simulated digits are rendered
377 Bool_t fHasRaw; // Whether raw data digits are rendered
378 Bool_t fHasESD; // Whether Event Summary Data is rendered
379 Bool_t fHasTracks; // Whether tracks are rendered
380 TList fEnabled;
381 static Display* fgInstance; // Static singleton instance
382};
383Display* Display::fgInstance = 0;
384
385
386//____________________________________________________________________
46d7488d 387Display* display(const char* file="")
274799f3 388{
46d7488d 389 // TGeoManager::Import(geom);
162637e4 390 // AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
a284ebe7 391 // AliCDBManager::Instance()->SetRun(0);
392 // AliGeomManager::LoadGeometry("geometry.root");
274799f3 393
46d7488d 394 Display* d = Display::Instance(file);
274799f3 395 return d;
396
397}
398//____________________________________________________________________
399//
400// EOF
401//