ROOT logo
// $Id$

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

/// \ingroup evemacros
/// \file muon_init.C
///
/// \author P. Pillot, L. Aphecetche; Subatech

class AliEveMacroExecutor;
class TEveProjectionManager;
class TEveGeoShape;
class TEveUtil;
class TSystem;
class TInterpreter;

Bool_t gShowMuonRPhi = kFALSE;
Bool_t gShowMuonRhoZ = kTRUE;
Bool_t gShowMuon = kTRUE;

Bool_t gCenterProjectionsAtPrimaryVertex = kFALSE;


void muon_init(const TString& cdburi = "",
               const TString& path   = ".",
	       Bool_t showBarrel = kFALSE)
{
  if (gSystem->Getenv("ALICE_ROOT") != 0)
  {
    gInterpreter->AddIncludePath(Form("%s/MUON", gSystem->Getenv("ALICE_ROOT")));
    gInterpreter->AddIncludePath(Form("%s/MUON/mapping", gSystem->Getenv("ALICE_ROOT")));
  }
  
  if (cdburi.IsNull() && ! AliCDBManager::Instance()->IsDefaultStorageSet())
  {
    gEnv->SetValue("Root.Stacktrace", "no");
    Fatal("muon_init.C", "OCDB path MUST be specified as the first argument.");
  }
  
  TEveUtil::LoadMacro("alieve_init.C");
  path.Remove(TString::kTrailing, '/');
  if (path.BeginsWith("alien:")) AliEveEventManager::SearchRawForCentralReconstruction();
  alieve_init(cdburi, path, -1);
  
  TEveUtil::AssertMacro("VizDB_scan.C");
  
  AliEveMacroExecutor *exec    = AliEveEventManager::GetMaster()->GetExecutor();
  TEveBrowser         *browser = gEve->GetBrowser();
  browser->ShowCloseTab(kFALSE);
  
  
  //==============================================================================
  // Geometry, scenes, projections and viewers
  //==============================================================================
  
  AliEveMultiView *mv = new AliEveMultiView;
  
  mv->SetDepth(-10);
  
  TEveUtil::LoadMacro("geom_gentle.C");
  TEveUtil::LoadMacro("geom_gentle_muon.C+");

  mv->InitGeomGentle(geom_gentle(), geom_gentle_rphi(), geom_gentle_rhoz(), geom_gentle_muon(kFALSE));
  
  mv->InitGeomGentleMuon(geom_gentle_muon(kFALSE), gShowMuonRPhi, gShowMuonRhoZ, gShowMuon);
  
  mv->SetDepth(0);
  
  //==============================================================================
  // Registration of per-event macros
  //==============================================================================
  
  exec->AddMacro(new AliEveMacro(AliEveMacro::kRunLoader, "SIM Track","kine_tracks.C+",   "kine_tracks",  "", kFALSE));

  exec->AddMacro(new AliEveMacro(AliEveMacro::kRunLoader, "SIM TrackRef","muon_trackRefs.C+","muon_trackRefs","kTRUE", kTRUE));
  
  exec->AddMacro(new AliEveMacro(AliEveMacro::kRawReader, "RAW MUON", "muon_raw.C+",     "muon_raw",     "", kTRUE));

  exec->AddMacro(new AliEveMacro(AliEveMacro::kRunLoader, "DIG MUON", "muon_digits.C+",  "muon_digits",  "", kFALSE));
  
  exec->AddMacro(new AliEveMacro(AliEveMacro::kRunLoader, "CLU MUON", "muon_clusters.C+","muon_clusters","", kTRUE));

  exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC Track", "esd_muon_tracks.C+", "esd_muon_tracks","kTRUE,kTRUE", kTRUE));

  if (showBarrel) {
    exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC PVTX", "primary_vertex.C+", "primary_vertex", "", kTRUE));
    exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC PVTX SPD", "primary_vertex.C+", "primary_vertex_spd", "", kTRUE));
    exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC Tracks by category", "esd_tracks.C+", "esd_tracks_by_category", "", kTRUE));
  }
  
  //==============================================================================
  // Additional GUI components
  //==============================================================================
  
  // Macro / data selection
  slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());
  slot->StartEmbedding();
  AliEveMacroExecutorWindow* exewin = new AliEveMacroExecutorWindow(exec);
  slot->StopEmbedding("DataSelection");
  exewin->PopulateMacros();
  
  // Event selection tab
  slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());
  slot->StartEmbedding();
  new AliEveEventSelectorWindow(gClient->GetRoot(), 600, 400, AliEveEventManager::GetMaster()->GetEventSelector());
  slot->StopEmbedding("Selections");
  
  // QA viewer
  slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());
  slot->StartEmbedding();
  new AliQAHistViewer(gClient->GetRoot(), 600, 400, kTRUE);
  slot->StopEmbedding("QA histograms");
  
  browser->GetTabRight()->SetTab(1);
  
  browser->StartEmbedding(TRootBrowser::kBottom);
  new AliEveEventManagerWindow(AliEveEventManager::GetMaster());
  browser->StopEmbedding("EventCtrl");
  
  slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());
  TEveWindowTab *store_tab = slot->MakeTab();
  store_tab->SetElementNameTitle("WindowStore",
				 "Undocked windows whose previous container is not known\n"
				 "are placed here when the main-frame is closed.");
  gEve->GetWindowManager()->SetDefaultContainer(store_tab);
  
  
  //==============================================================================
  // AliEve objects - global tools
  //==============================================================================
  
  AliEveTrackCounter* g_trkcnt = new AliEveTrackCounter("Primary Counter");
  gEve->AddToListTree(g_trkcnt, kFALSE);
  
  
  //==============================================================================
  // Final stuff
  //==============================================================================
  
  // A refresh to show proper window.
  //gEve->GetViewers()->SwitchColorSet();
  gEve->Redraw3D(kTRUE);
  gSystem->ProcessEvents();
  
  // Register command to call on each event.
  AliEveEventManager::GetMaster()->AddNewEventCommand("on_new_event();");
  AliEveEventManager::GetMaster()->GotoEvent(0);
  
  gEve->EditElement(g_trkcnt);
  
  gEve->Redraw3D(kTRUE);
  
  // Assure 3D view rotates around the origin.
  gSystem->ProcessEvents();
  AliEveMultiView::Instance()->Get3DView()->GetGLViewer()->CurrentCamera().SetCenterVec(0,0,0);
  AliEveMultiView::Instance()->Get3DView()->GetGLViewer()->RequestDraw();
}

/******************************************************************************/

void on_new_event()
{
  Double_t x[3] = { 0, 0, 0 };
  
  if (AliEveEventManager::HasESD())
  {
    AliESDEvent* esd = AliEveEventManager::AssertESD();
    esd->GetPrimaryVertex()->GetXYZ(x);
    
    TTimeStamp ts(esd->GetTimeStamp());
    TString win_title("Eve Main Window -- Timestamp: ");
    win_title += ts.AsString("s");
    win_title += "; Event # in ESD file: ";
    win_title += esd->GetEventNumberInFile();
    gEve->GetBrowser()->SetWindowName(win_title);
  }
  
  TEveElement* top = gEve->GetCurrentEvent();
  
  AliEveMultiView *mv = AliEveMultiView::Instance();
  
  mv->DestroyEventRPhi();
  if (gCenterProjectionsAtPrimaryVertex)
    mv->SetCenterRPhi(x[0], x[1], x[2]);
  mv->ImportEventRPhi(top);
  
  mv->DestroyEventRhoZ();
  if (gCenterProjectionsAtPrimaryVertex)
    mv->SetCenterRhoZ(x[0], x[1], x[2]);
  mv->ImportEventRhoZ(top);
}
 muon_init.C:1
 muon_init.C:2
 muon_init.C:3
 muon_init.C:4
 muon_init.C:5
 muon_init.C:6
 muon_init.C:7
 muon_init.C:8
 muon_init.C:9
 muon_init.C:10
 muon_init.C:11
 muon_init.C:12
 muon_init.C:13
 muon_init.C:14
 muon_init.C:15
 muon_init.C:16
 muon_init.C:17
 muon_init.C:18
 muon_init.C:19
 muon_init.C:20
 muon_init.C:21
 muon_init.C:22
 muon_init.C:23
 muon_init.C:24
 muon_init.C:25
 muon_init.C:26
 muon_init.C:27
 muon_init.C:28
 muon_init.C:29
 muon_init.C:30
 muon_init.C:31
 muon_init.C:32
 muon_init.C:33
 muon_init.C:34
 muon_init.C:35
 muon_init.C:36
 muon_init.C:37
 muon_init.C:38
 muon_init.C:39
 muon_init.C:40
 muon_init.C:41
 muon_init.C:42
 muon_init.C:43
 muon_init.C:44
 muon_init.C:45
 muon_init.C:46
 muon_init.C:47
 muon_init.C:48
 muon_init.C:49
 muon_init.C:50
 muon_init.C:51
 muon_init.C:52
 muon_init.C:53
 muon_init.C:54
 muon_init.C:55
 muon_init.C:56
 muon_init.C:57
 muon_init.C:58
 muon_init.C:59
 muon_init.C:60
 muon_init.C:61
 muon_init.C:62
 muon_init.C:63
 muon_init.C:64
 muon_init.C:65
 muon_init.C:66
 muon_init.C:67
 muon_init.C:68
 muon_init.C:69
 muon_init.C:70
 muon_init.C:71
 muon_init.C:72
 muon_init.C:73
 muon_init.C:74
 muon_init.C:75
 muon_init.C:76
 muon_init.C:77
 muon_init.C:78
 muon_init.C:79
 muon_init.C:80
 muon_init.C:81
 muon_init.C:82
 muon_init.C:83
 muon_init.C:84
 muon_init.C:85
 muon_init.C:86
 muon_init.C:87
 muon_init.C:88
 muon_init.C:89
 muon_init.C:90
 muon_init.C:91
 muon_init.C:92
 muon_init.C:93
 muon_init.C:94
 muon_init.C:95
 muon_init.C:96
 muon_init.C:97
 muon_init.C:98
 muon_init.C:99
 muon_init.C:100
 muon_init.C:101
 muon_init.C:102
 muon_init.C:103
 muon_init.C:104
 muon_init.C:105
 muon_init.C:106
 muon_init.C:107
 muon_init.C:108
 muon_init.C:109
 muon_init.C:110
 muon_init.C:111
 muon_init.C:112
 muon_init.C:113
 muon_init.C:114
 muon_init.C:115
 muon_init.C:116
 muon_init.C:117
 muon_init.C:118
 muon_init.C:119
 muon_init.C:120
 muon_init.C:121
 muon_init.C:122
 muon_init.C:123
 muon_init.C:124
 muon_init.C:125
 muon_init.C:126
 muon_init.C:127
 muon_init.C:128
 muon_init.C:129
 muon_init.C:130
 muon_init.C:131
 muon_init.C:132
 muon_init.C:133
 muon_init.C:134
 muon_init.C:135
 muon_init.C:136
 muon_init.C:137
 muon_init.C:138
 muon_init.C:139
 muon_init.C:140
 muon_init.C:141
 muon_init.C:142
 muon_init.C:143
 muon_init.C:144
 muon_init.C:145
 muon_init.C:146
 muon_init.C:147
 muon_init.C:148
 muon_init.C:149
 muon_init.C:150
 muon_init.C:151
 muon_init.C:152
 muon_init.C:153
 muon_init.C:154
 muon_init.C:155
 muon_init.C:156
 muon_init.C:157
 muon_init.C:158
 muon_init.C:159
 muon_init.C:160
 muon_init.C:161
 muon_init.C:162
 muon_init.C:163
 muon_init.C:164
 muon_init.C:165
 muon_init.C:166
 muon_init.C:167
 muon_init.C:168
 muon_init.C:169
 muon_init.C:170
 muon_init.C:171
 muon_init.C:172
 muon_init.C:173
 muon_init.C:174
 muon_init.C:175
 muon_init.C:176
 muon_init.C:177
 muon_init.C:178
 muon_init.C:179
 muon_init.C:180
 muon_init.C:181
 muon_init.C:182
 muon_init.C:183
 muon_init.C:184
 muon_init.C:185
 muon_init.C:186
 muon_init.C:187
 muon_init.C:188
 muon_init.C:189
 muon_init.C:190
 muon_init.C:191
 muon_init.C:192
 muon_init.C:193
 muon_init.C:194
 muon_init.C:195
 muon_init.C:196