ROOT logo
#ifndef __CINT__
# include <TGFileDialog.h>
# include <TGFileBrowser.h>
# include <TControlBar.h>
# include <TString.h>
# include <TSystem.h>
# include <TROOT.h>
# include <TEveManager.h>
# include <TSystemDirectory.h>
# include <TEveMacro.h>
# include <TEveBrowser.h>
# include <TFolder.h>
# include <TList.h>
# include <TApplication.h>
# include "aliroot/EVE/EveBase/AliEveEventManager.h"
# include <iostream>
#endif

class Display
{
public:
  //____________________________________________________________________
  /** Constructor 
      @param file File or directory to read data from */
  Display(const char* file="./")
    : fCb(0), 
      fEnableHits(kFALSE),
      fEnableDigits(kFALSE),
      fEnableRaw(kFALSE),
      fEnableESD(kFALSE),
      fHasHits(kFALSE),
      fHasDigits(kFALSE),
      fHasRaw(kFALSE),
      fHasESD(kFALSE)
  {
    AliEveEventManager::SetCdbUri(TString("local://$ALICE_ROOT/OCDB"));
    LoadMacros();
    Setup(file, false);
    SetupSelect();
    SetupControl();
  }
  //____________________________________________________________________
  /** Setup the control bar */
  void SetupControl()
  {
    fCb = new TControlBar("vertical", "EVE Controls");
    const char* buts[] = { "Load ...", 
			   "Select ...",
			   "Next event", 
			   "Previous event", 
			   "Hits", 
			   "Digits", 
			   "Raw", 
			   "ESD", 
			   "Tracks", 
			   "Quit", 
			   0 }; 
    const char* meths[] = { "LoadFile", 
			    "Select",
			    "NextEvent", 
			    "PrevEvent", 
			    "ToggleHits", 
			    "ToggleDigits", 
			    "ToggleRaw", 
			    "ToggleESD", 
			    "ToggleTracks", 
			    "Quit", 
			    0 };
    const char* hints[] = { "Specify input" , 
			    "Select which detectors to show",
			    "Get next event", 
			    "Get previous event", 
			    "Toggle display of hits", 
			    "Toggle display of simulated digits", 
			    "Toggle display of raw digits", 
			    "Toggle display of event summary data", 
			    "Toggle display of tracks", 
			    "Quit", 
			    0 };
			    
    char** but  = const_cast<char**>(buts);
    char** meth = const_cast<char**>(meths);
    char** hint = const_cast<char**>(hints);
    while (*but) { 
      fCb->AddButton(*but, Form("Display::Instance()->%s()", *meth), *hint);
      but++;
      meth++;
      hint++;
    }
    fCb->Show();
  }
  //____________________________________________________________________
  /** Setup the selection bar */
  void SetupSelect()
  {
    fSelect = new TControlBar("vertical", "Detector selection");
    char* dets[] = { "emcal", 
		     "fmd", 
		     "its", 
		     "pmd", 
		     "t0", 
		     "tof", 
		     "tpc", 
		     "trd", 
		     "vzero",
		     "kine", 
		     "esd",
		     0 };
    char** det = dets;
    while (*det) { 
      // TString cmd(Form("Display::Instance()->Enable(\"%s\")", *det));
      // TString help(Form("Enable display of %s data", name.Data()));
      fSelect->AddButton(*det, 
			 Form("Display::Instance()->Enable(\"%s\")", *det),
			 Form("Enable display of %s data", *det));
      det++;
    }
    std::cout << "Adding \"Hide\" to select" << std::endl;
    fSelect->AddButton("Hide", "Display::Instance()->HideSelect()", 
		       "Hide the detector selection menu");
  }
  //____________________________________________________________________
  /** Load macros used by EVE */
  void LoadMacros()
  {
    std::cout << "Loading macros ... " << std::flush;
    TString savdir(gSystem->pwd());
    TString macdir("$(ALICE_ROOT)/EVE/alice-macros");
    gSystem->ExpandPathName(macdir);
  
    TFolder*          f     = gEve->GetMacroFolder();
    TSystemDirectory* dir   = new TSystemDirectory(macdir.Data(), 
						   macdir.Data());
    TList*            files = dir->GetListOfFiles();
    files->Sort();
    TIter             next(files);
    TSystemFile*      file  = 0;
    while ((file = static_cast<TSystemFile*>(next()))) { 
      if (file->IsDirectory()) continue;
      TString name(gSystem->ConcatFileName(macdir.Data(),file->GetName()));
      if (!name.EndsWith(".C")) continue;
      f->Add(new TEveMacro(name.Data()));
    }
    
    gROOT->GetListOfBrowsables()->Add(dir);
  
    {
      TEveBrowser*   b  = gEve->GetBrowser();
      TGFileBrowser* fb = b->GetFileBrowser();
      fb->GotoDir(macdir);
      { 
	b->StartEmbedding(0);
	fb = b->MakeFileBrowser();
	fb->BrowseObj(f);
	fb->Show();
	b->StopEmbedding(0);
	b->SetTabTitle("Macros", 0);
	b->SetTab(0,0);
      }
    }
    gSystem->cd(savdir);
    std::cout << "done" << std::endl;
  }
  //____________________________________________________________________
  /** Set-up load location, etc. 
      @param file File or directory to read data from 
      @param refresh Force a refresh */
  void Setup(const char* file, bool refresh)
  {
    TString fileName(gSystem->BaseName(file));
    TString dirName(gSystem->DirName(file));
    
    if (fileName.Contains("ESD")) { 
      std::cout << "Adding ESD file " << fileName << std::endl;
      AliEveEventManager::SetESDFileName(fileName);
    }
    else if (fileName.EndsWith(".root") || fileName.EndsWith(".raw")) { 
      std::cout << "Adding raw file " << fileName << std::endl;
      AliEveEventManager::SetRawFileName(fileName);
    }
    else if (fileName.IsNull()) { 
      std::cout << "No file given!" << std::endl;
      // std::cout << "Adding raw directory " << dirName.Data() << std::endl;
      // AliEveEventManager::SetRawFileName(dirName.Data());
    }
    else {
      std::cerr << "Don't know how to deal with '" << fileName << "'" 
		<< std::endl;
      return;
    }
    std::cout << "Opening " << fileName << " (" << dirName << ")" << std::endl;
    
    if (AliEveEventManager::GetMaster()) delete AliEveEventManager::GetMaster();
    TString eventName("Event"); // CINT has trouble with direct "Event".
    /* AliEveEventManager::GetMaster() =*/
    new AliEveEventManager(eventName, dirName, 0);
    gEve->AddEvent(AliEveEventManager::GetMaster());
    
    if (refresh) Refresh();
  }
  //____________________________________________________________________
  /** Executed in response to hitting the "Load ..." button. */
  void 
  LoadFile()
  {
    fCb->SetButtonState("Load ...", 1);
    TGFileInfo fi;
    fi.fIniDir = StrDup(gSystem->pwd());
    new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDOpen, &fi);
    Setup(fi.fFilename, true);
    fCb->SetButtonState("Load ...", 0);
  }
  //____________________________________________________________________
  /** Pop-up or down the selection menu */
  void 
  Select()
  {
    fSelect->Show();
    fCb->SetButtonState("Select ...", 1);
  }
  //____________________________________________________________________
  /** Enable a detector or type of display */
  void 
  Enable(const char* what)
  {
    TObject* o = fEnabled.FindObject(what);
    //TString n(what);
    // n.ToUpper();
    std::cout << "Enable " << what << "?" << std::endl;
    if (o) { 
      fEnabled.Remove(o);
      fSelect->SetButtonState(what, 0);
      delete o;
    }
    else { 
      fEnabled.Add(new TObjString(what));
      fSelect->SetButtonState(what, 1);
    }
    Refresh();
  }
  //____________________________________________________________________
  /** Pop-down the selection menu */
  void 
  HideSelect()
  {
    fCb->SetButtonState("Select ...", 0);
    fSelect->Hide();
  }
  //____________________________________________________________________
  /** Prepare for a new event */
  void 
  Prepare()
  {
    fHasHits   = kFALSE;
    fHasDigits = kFALSE;
    fHasRaw    = kFALSE;
    fHasESD    = kFALSE;
    fHasTracks = kFALSE;
  }
  //____________________________________________________________________
  /** Get the next event */
  void 
  NextEvent()
  {
    Prepare();
    std::cout << "Getting next event, please wait ... " << std::flush;
    gROOT->Macro("event_next.C");
    std::cout << "done" << std::endl;
    Refresh();
  }
  //____________________________________________________________________
  /** Get the previous event */
  void 
  PrevEvent()
  {
    Prepare();
    std::cout << "Getting previous event, please wait ... " << std::flush;
    gROOT->Macro("event_prev.C"); 
    std::cout << "done" << std::endl;
    Refresh();
  }
  //____________________________________________________________________
  /** Reload the current event */
  void
  Reload()
  {
    Prepare();
    Int_t event = AliEveEventManager::GetMaster()->GetEventId();
    std::cout << "Getting event " << event 
	      << ", please wait ... " << std::flush;
    gROOT->Macro(Form("event_goto.C(%d)", event));
    std::cout << "done" << std::endl;
    Refresh();
  }
  //__________________________________________________________________
  /** Refresh the display of something
      @param enabled Whether this something is enabled or not 
      @param has     Whether we have already shown this data 
      @param what    What data to show */
  void 
  RefreshOne(Bool_t enabled, Bool_t& has, const char* what)
  {
    if (!enabled || has) return;
    std::cout << what << "..." << std::flush;
    TIter next(&fEnabled);
    TObject* o = 0;
    while ((o = next())) { 
      TMacro* macro = gEve->GetMacro(Form("%s_%s", o->GetName(), what));
      if (macro) macro->Exec();
    }
    has = kTRUE;
  }
  
  //____________________________________________________________________
  /** Refresh the display of the data */
  void 
  Refresh()
  {
    std::cout << "Drawing ... " << std::flush;
    RefreshOne(fEnableTracks, fHasTracks, "tracks");
    RefreshOne(fEnableHits,   fHasHits,   "hits");
    RefreshOne(fEnableDigits, fHasDigits, "digits");
    RefreshOne(fEnableRaw,    fHasRaw,    "raw");
    RefreshOne(fEnableESD,    fHasESD,    "esd");
    std::cout << "done" << std::endl;
  }
  //____________________________________________________________________
  /** Toggle the diplay of some data */
  void 
  Toggle(Bool_t& what, const char* name)
  {
    what = !what;
    fCb->SetButtonState(name, what ? 1 : 0);
    if (!what) Reload();
    Refresh();
  }
  //____________________________________________________________________
  /** Toggle the diplay the simulated hits */
  void ToggleHits() { Toggle(fEnableHits, "Hits"); } 
  //____________________________________________________________________
  /** Toggle the diplay the simulated digits */
  void ToggleDigits() { Toggle(fEnableDigits, "Digits"); }
  //____________________________________________________________________
  /** Toggle the diplay the raw digits */
  void ToggleRaw() { Toggle(fEnableRaw, "Raw"); }
  //____________________________________________________________________
  /** Toggle the diplay the Event Summary Data */
  void ToggleESD() { Toggle(fEnableESD, "ESD"); }
  //____________________________________________________________________
  /** Toggle the diplay of tracks */
  void ToggleTracks() { Toggle(fEnableTracks, "Tracks"); }
  //____________________________________________________________________
  /** Pop-down both menues */
  void Quit() 
  { 
    fCb->Hide();
    fSelect->Hide();
    fgInstance = 0;
    delete this;
  }
  //____________________________________________________________________
  /** Get the static instance */
  static Display* Instance(const char* file=0) { 
    if (!fgInstance) fgInstance = new Display(file);
    return fgInstance;
  }
protected:
  TControlBar* fCb;       // Control bar
  TControlBar* fSelect;   // Selection bar
  Bool_t fEnableHits;     // Whether simulated hits are enabled 
  Bool_t fEnableDigits;   // Whether simulated digits are enabled 
  Bool_t fEnableRaw;      // Whehter raw data digits are enabled
  Bool_t fEnableESD;      // Whehter Event Summary Data is enabled
  Bool_t fEnableTracks;   // Whether tracks are shown
  Bool_t fHasHits;        // Whether simulated hits are rendered
  Bool_t fHasDigits;      // Whether simulated digits are rendered
  Bool_t fHasRaw;         // Whether raw data digits are rendered
  Bool_t fHasESD;         // Whether Event Summary Data is rendered
  Bool_t fHasTracks;      // Whether tracks are rendered
  TList  fEnabled;
  static Display* fgInstance; // Static singleton instance 
};
Display* Display::fgInstance = 0;


//____________________________________________________________________
Display* display(const char* file="")
{
  // TGeoManager::Import(geom);
  // AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  // AliCDBManager::Instance()->SetRun(0);
  // AliGeomManager::LoadGeometry("geometry.root");

  Display* d = Display::Instance(file);
  return d;

}
//____________________________________________________________________
//
// EOF
//
 display.C:1
 display.C:2
 display.C:3
 display.C:4
 display.C:5
 display.C:6
 display.C:7
 display.C:8
 display.C:9
 display.C:10
 display.C:11
 display.C:12
 display.C:13
 display.C:14
 display.C:15
 display.C:16
 display.C:17
 display.C:18
 display.C:19
 display.C:20
 display.C:21
 display.C:22
 display.C:23
 display.C:24
 display.C:25
 display.C:26
 display.C:27
 display.C:28
 display.C:29
 display.C:30
 display.C:31
 display.C:32
 display.C:33
 display.C:34
 display.C:35
 display.C:36
 display.C:37
 display.C:38
 display.C:39
 display.C:40
 display.C:41
 display.C:42
 display.C:43
 display.C:44
 display.C:45
 display.C:46
 display.C:47
 display.C:48
 display.C:49
 display.C:50
 display.C:51
 display.C:52
 display.C:53
 display.C:54
 display.C:55
 display.C:56
 display.C:57
 display.C:58
 display.C:59
 display.C:60
 display.C:61
 display.C:62
 display.C:63
 display.C:64
 display.C:65
 display.C:66
 display.C:67
 display.C:68
 display.C:69
 display.C:70
 display.C:71
 display.C:72
 display.C:73
 display.C:74
 display.C:75
 display.C:76
 display.C:77
 display.C:78
 display.C:79
 display.C:80
 display.C:81
 display.C:82
 display.C:83
 display.C:84
 display.C:85
 display.C:86
 display.C:87
 display.C:88
 display.C:89
 display.C:90
 display.C:91
 display.C:92
 display.C:93
 display.C:94
 display.C:95
 display.C:96
 display.C:97
 display.C:98
 display.C:99
 display.C:100
 display.C:101
 display.C:102
 display.C:103
 display.C:104
 display.C:105
 display.C:106
 display.C:107
 display.C:108
 display.C:109
 display.C:110
 display.C:111
 display.C:112
 display.C:113
 display.C:114
 display.C:115
 display.C:116
 display.C:117
 display.C:118
 display.C:119
 display.C:120
 display.C:121
 display.C:122
 display.C:123
 display.C:124
 display.C:125
 display.C:126
 display.C:127
 display.C:128
 display.C:129
 display.C:130
 display.C:131
 display.C:132
 display.C:133
 display.C:134
 display.C:135
 display.C:136
 display.C:137
 display.C:138
 display.C:139
 display.C:140
 display.C:141
 display.C:142
 display.C:143
 display.C:144
 display.C:145
 display.C:146
 display.C:147
 display.C:148
 display.C:149
 display.C:150
 display.C:151
 display.C:152
 display.C:153
 display.C:154
 display.C:155
 display.C:156
 display.C:157
 display.C:158
 display.C:159
 display.C:160
 display.C:161
 display.C:162
 display.C:163
 display.C:164
 display.C:165
 display.C:166
 display.C:167
 display.C:168
 display.C:169
 display.C:170
 display.C:171
 display.C:172
 display.C:173
 display.C:174
 display.C:175
 display.C:176
 display.C:177
 display.C:178
 display.C:179
 display.C:180
 display.C:181
 display.C:182
 display.C:183
 display.C:184
 display.C:185
 display.C:186
 display.C:187
 display.C:188
 display.C:189
 display.C:190
 display.C:191
 display.C:192
 display.C:193
 display.C:194
 display.C:195
 display.C:196
 display.C:197
 display.C:198
 display.C:199
 display.C:200
 display.C:201
 display.C:202
 display.C:203
 display.C:204
 display.C:205
 display.C:206
 display.C:207
 display.C:208
 display.C:209
 display.C:210
 display.C:211
 display.C:212
 display.C:213
 display.C:214
 display.C:215
 display.C:216
 display.C:217
 display.C:218
 display.C:219
 display.C:220
 display.C:221
 display.C:222
 display.C:223
 display.C:224
 display.C:225
 display.C:226
 display.C:227
 display.C:228
 display.C:229
 display.C:230
 display.C:231
 display.C:232
 display.C:233
 display.C:234
 display.C:235
 display.C:236
 display.C:237
 display.C:238
 display.C:239
 display.C:240
 display.C:241
 display.C:242
 display.C:243
 display.C:244
 display.C:245
 display.C:246
 display.C:247
 display.C:248
 display.C:249
 display.C:250
 display.C:251
 display.C:252
 display.C:253
 display.C:254
 display.C:255
 display.C:256
 display.C:257
 display.C:258
 display.C:259
 display.C:260
 display.C:261
 display.C:262
 display.C:263
 display.C:264
 display.C:265
 display.C:266
 display.C:267
 display.C:268
 display.C:269
 display.C:270
 display.C:271
 display.C:272
 display.C:273
 display.C:274
 display.C:275
 display.C:276
 display.C:277
 display.C:278
 display.C:279
 display.C:280
 display.C:281
 display.C:282
 display.C:283
 display.C:284
 display.C:285
 display.C:286
 display.C:287
 display.C:288
 display.C:289
 display.C:290
 display.C:291
 display.C:292
 display.C:293
 display.C:294
 display.C:295
 display.C:296
 display.C:297
 display.C:298
 display.C:299
 display.C:300
 display.C:301
 display.C:302
 display.C:303
 display.C:304
 display.C:305
 display.C:306
 display.C:307
 display.C:308
 display.C:309
 display.C:310
 display.C:311
 display.C:312
 display.C:313
 display.C:314
 display.C:315
 display.C:316
 display.C:317
 display.C:318
 display.C:319
 display.C:320
 display.C:321
 display.C:322
 display.C:323
 display.C:324
 display.C:325
 display.C:326
 display.C:327
 display.C:328
 display.C:329
 display.C:330
 display.C:331
 display.C:332
 display.C:333
 display.C:334
 display.C:335
 display.C:336
 display.C:337
 display.C:338
 display.C:339
 display.C:340
 display.C:341
 display.C:342
 display.C:343
 display.C:344
 display.C:345
 display.C:346
 display.C:347
 display.C:348
 display.C:349
 display.C:350
 display.C:351
 display.C:352
 display.C:353
 display.C:354
 display.C:355
 display.C:356
 display.C:357
 display.C:358
 display.C:359
 display.C:360
 display.C:361
 display.C:362
 display.C:363
 display.C:364
 display.C:365
 display.C:366
 display.C:367
 display.C:368
 display.C:369
 display.C:370
 display.C:371
 display.C:372
 display.C:373
 display.C:374
 display.C:375
 display.C:376
 display.C:377
 display.C:378
 display.C:379
 display.C:380
 display.C:381
 display.C:382
 display.C:383
 display.C:384
 display.C:385
 display.C:386
 display.C:387
 display.C:388
 display.C:389
 display.C:390
 display.C:391
 display.C:392
 display.C:393
 display.C:394
 display.C:395
 display.C:396
 display.C:397
 display.C:398
 display.C:399
 display.C:400
 display.C:401
 display.C:402