ROOT logo
// Author: Stefano Carrazza 2010

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

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TGLViewer.h>
#include <TGLWidget.h>
#include <TH2.h>
#include <TMath.h>
#include <TTree.h>
#include <TEveBrowser.h>
#include <TEveCalo.h>
#include <TEveCaloData.h>
#include <TEveCaloLegoOverlay.h>
#include <TEveLegoEventHandler.h>
#include <TEveManager.h>
#include <TEveProjectionManager.h>
#include <TEveProjectionAxes.h>
#include <TEveScene.h>
#include <TEveTrans.h>
#include <TEveViewer.h>
#include <TEveWindow.h>

#include <AliESDEvent.h>
#include <AliEveEventManager.h>
#endif

double pi = TMath::Pi();
TEveViewer *g_histo2d_all_events_v0 = 0;
TEveViewer *g_histo2d_all_events_v1 = 0;
TEveViewer *g_histo2d_all_events_v2 = 0;
TEveViewer *g_histo2d_all_events_v3 = 0;
TEveScene  *g_histo2d_all_events_s0 = 0;
TEveScene  *g_histo2d_all_events_s1 = 0;
TEveScene  *g_histo2d_all_events_s2 = 0;
TEveScene  *g_histo2d_all_events_s3 = 0;
TEveCaloLegoOverlay* g_histo2d_all_events_lego_overlay = 0;
TEveWindowSlot* g_histo2d_all_events_slot = 0;

Double_t GetPhi(Double_t phi);
TEveCaloLego* CreateHistoLego(TEveCaloData* data, TEveWindowSlot* slot);
TEveCalo3D* Create3DView(TEveCaloData* data, TEveWindowSlot* slot);
void CreateProjections(TEveCaloData* data, TEveCalo3D *calo3d, TEveWindowSlot* slot1, TEveWindowSlot* slot2);

TEveCaloDataHist* histo2d_all_events()
{

   TEveCaloDataHist* data_t;
   
   if ( g_histo2d_all_events_slot == 0 ) {
      Info("histo2d_all_events", "Filling histogram...");
   
      // Access to esdTree
      AliESDEvent* esd = AliEveEventManager::AssertESD();
      TTree* t = AliEveEventManager::GetMaster()->GetESDTree();

      // Creating 2D histograms
      TH2F *histopos_t = new TH2F("histopos_t","Histo 2d positive",
                                 100,-1.5,1.5,80,-pi,pi);
      TH2F *histoneg_t = new TH2F("histoneg_t","Histo 2d negative",
                                 100,-1.5,1.5,80,-pi,pi);

         // Getting current tracks for each event, filling histograms 
         for ( int event = 0; event < t->GetEntries(); event++ ) {	
            t->GetEntry(event);
               for ( int n = 0; n < esd->GetNumberOfTracks(); ++n ) {    
  
                  if ( esd->GetTrack(n)->GetSign() > 0 ) {
                     histopos_t->Fill(esd->GetTrack(n)->Eta(),
	      	                      GetPhi(esd->GetTrack(n)->Phi()),
                                      fabs(esd->GetTrack(n)->Pt()));
                  } else {
                     histoneg_t->Fill(esd->GetTrack(n)->Eta(),
                                      GetPhi(esd->GetTrack(n)->Phi()),
                                      fabs(esd->GetTrack(n)->Pt()));
                  }
               }
         }

      data_t = new TEveCaloDataHist();
      data_t->AddHistogram(histoneg_t);
      data_t->RefSliceInfo(0).Setup("NegCg:", 0, kBlue);
      data_t->AddHistogram(histopos_t);
      data_t->RefSliceInfo(1).Setup("PosCg:", 0, kRed);
      data_t->GetEtaBins()->SetTitleFont(120);
      data_t->GetEtaBins()->SetTitle("h");
      data_t->GetPhiBins()->SetTitleFont(120);
      data_t->GetPhiBins()->SetTitle("f");
      data_t->IncDenyDestroy();

      // Creating frames
      g_histo2d_all_events_slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
      TEveWindowPack* packH = g_histo2d_all_events_slot->MakePack();
      packH->SetElementName("Projections");
      packH->SetHorizontal();
      packH->SetShowTitleBar(kFALSE);

      g_histo2d_all_events_slot = packH->NewSlot();
      TEveWindowPack* pack0 = g_histo2d_all_events_slot->MakePack();
      pack0->SetShowTitleBar(kFALSE);
      TEveWindowSlot*  slotLeftTop   = pack0->NewSlot();
      TEveWindowSlot* slotLeftBottom = pack0->NewSlot();

      g_histo2d_all_events_slot = packH->NewSlot();
      TEveWindowPack* pack1 = g_histo2d_all_events_slot->MakePack();
      pack1->SetShowTitleBar(kFALSE);
      TEveWindowSlot* slotRightTop    = pack1->NewSlot();
      TEveWindowSlot* slotRightBottom = pack1->NewSlot();

      // Creating viewers and scenes   
      TEveCalo3D* calo3d = Create3DView(data_t, slotLeftTop);
      CreateHistoLego(data_t, slotLeftBottom);
      CreateProjections(data_t, calo3d, slotRightTop, slotRightBottom);

      gEve->Redraw3D(kTRUE);

      Info("histo2d_all_events", "...Finished");
   }

   return data_t;
}

//______________________________________________________________________________
Double_t GetPhi(Double_t phi)
{
   if (phi > pi) {
      phi -= 2*pi;
   }
   return phi;
}

//______________________________________________________________________________
TEveCaloLego* CreateHistoLego(TEveCaloData* data, TEveWindowSlot* slot){

   TEveCaloLego* lego;

   // Viewer initialization, tab creation
   if ( g_histo2d_all_events_v0 == 0 ) {

      TEveBrowser *browser = gEve->GetBrowser();
      slot->MakeCurrent();
      g_histo2d_all_events_v0 = gEve->SpawnNewViewer("2D Lego Histogram", "2D Lego Histogram");
      g_histo2d_all_events_s0 = gEve->SpawnNewScene("2D Lego Histogram", "2D Lego Histogram");
      g_histo2d_all_events_v0->AddScene(g_histo2d_all_events_s0);
      g_histo2d_all_events_v0->SetElementName("2D Lego Viewer");
      g_histo2d_all_events_s0->SetElementName("2D Lego Scene");

      TGLViewer* glv = g_histo2d_all_events_v0->GetGLViewer();
      g_histo2d_all_events_lego_overlay = new TEveCaloLegoOverlay();
      glv->AddOverlayElement(g_histo2d_all_events_lego_overlay);
      glv->SetCurrentCamera(TGLViewer::kCameraPerspXOY);

      // Plotting histogram lego
      lego = new TEveCaloLego(data);
      g_histo2d_all_events_s0->AddElement(lego);

      // Move to real world coordinates
      lego->InitMainTrans();
      Float_t sc = TMath::Min(lego->GetEtaRng(), lego->GetPhiRng());
      lego->RefMainTrans().SetScale(sc, sc, sc);

      // Set event handler to move from perspective to orthographic view.
      glv->SetEventHandler(new TEveLegoEventHandler(glv->GetGLWidget(), glv, lego));

      g_histo2d_all_events_lego_overlay->SetCaloLego(lego);
   }

   return lego;
}

//______________________________________________________________________________
TEveCalo3D* Create3DView(TEveCaloData* data, TEveWindowSlot* slot){

   TEveCalo3D* calo3d;

   if ( g_histo2d_all_events_v1 == 0 ) {
      
      TEveBrowser *browser = gEve->GetBrowser();
      slot->MakeCurrent();
      g_histo2d_all_events_v1 = gEve->SpawnNewViewer("3D Histogram", "3D Histogram");
      g_histo2d_all_events_s1 = gEve->SpawnNewScene("3D Histogram", "3D Histogram");
      g_histo2d_all_events_v1->AddScene(g_histo2d_all_events_s1);
      g_histo2d_all_events_v1->SetElementName("3D Histogram Viewer");
      g_histo2d_all_events_s1->SetElementName("3D Histogram Scene");

      calo3d = new TEveCalo3D(data);
   
      calo3d->SetBarrelRadius(550);
      calo3d->SetEndCapPos(550);
      g_histo2d_all_events_s1->AddElement(calo3d);
   } 

   return calo3d;
}

//______________________________________________________________________________
void CreateProjections(TEveCaloData* data, TEveCalo3D *calo3d, TEveWindowSlot* slot1, TEveWindowSlot* slot2){

   if ( g_histo2d_all_events_v2 == 0 ) {
      
      TEveBrowser *browser = gEve->GetBrowser();
      slot1->MakeCurrent();
      g_histo2d_all_events_v2 = gEve->SpawnNewViewer("RPhi projection", "RPhi projection");
      g_histo2d_all_events_s2 = gEve->SpawnNewScene("RPhi projection", "RPhi projection");
      g_histo2d_all_events_v2->AddScene(g_histo2d_all_events_s2);
      g_histo2d_all_events_v2->SetElementName("RPhi Projection Viewer");
      g_histo2d_all_events_s2->SetElementName("RPhi Projection Scene");

      TEveProjectionManager* mng1 = new TEveProjectionManager();
      mng1->SetProjection(TEveProjection::kPT_RPhi);

      TEveProjectionAxes* axeg_histo2d_all_events_s1 = new TEveProjectionAxes(mng1);
      g_histo2d_all_events_s2->AddElement(axeg_histo2d_all_events_s1);
      TEveCalo2D* calo2d1 = (TEveCalo2D*) mng1->ImportElements(calo3d);
      g_histo2d_all_events_s2->AddElement(calo2d1);

      g_histo2d_all_events_v2->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   } 

   if ( g_histo2d_all_events_v3 == 0 ) {
      
      TEveBrowser *browser = gEve->GetBrowser();
      slot2->MakeCurrent();
      g_histo2d_all_events_v3 = gEve->SpawnNewViewer("RhoZ projection", "RhoZ projection");
      g_histo2d_all_events_s3 = gEve->SpawnNewScene("RhoZ projection", "RhoZ projection");
      g_histo2d_all_events_v3->AddScene(g_histo2d_all_events_s3);
      g_histo2d_all_events_v3->SetElementName("RhoZ Projection Viewer");
      g_histo2d_all_events_s3->SetElementName("RhoZ Projection Viewer");

      TEveProjectionManager* mng2 = new TEveProjectionManager();
      mng2->SetProjection(TEveProjection::kPT_RhoZ);

      TEveProjectionAxes* axeg_histo2d_all_events_s2 = new TEveProjectionAxes(mng2);
      g_histo2d_all_events_s3->AddElement(axeg_histo2d_all_events_s2);
      TEveCalo2D* calo2d2 = (TEveCalo2D*) mng2->ImportElements(calo3d);
      g_histo2d_all_events_s3->AddElement(calo2d2);

      g_histo2d_all_events_v3->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   } 

   return;
}
 histo2d_all_events.C:1
 histo2d_all_events.C:2
 histo2d_all_events.C:3
 histo2d_all_events.C:4
 histo2d_all_events.C:5
 histo2d_all_events.C:6
 histo2d_all_events.C:7
 histo2d_all_events.C:8
 histo2d_all_events.C:9
 histo2d_all_events.C:10
 histo2d_all_events.C:11
 histo2d_all_events.C:12
 histo2d_all_events.C:13
 histo2d_all_events.C:14
 histo2d_all_events.C:15
 histo2d_all_events.C:16
 histo2d_all_events.C:17
 histo2d_all_events.C:18
 histo2d_all_events.C:19
 histo2d_all_events.C:20
 histo2d_all_events.C:21
 histo2d_all_events.C:22
 histo2d_all_events.C:23
 histo2d_all_events.C:24
 histo2d_all_events.C:25
 histo2d_all_events.C:26
 histo2d_all_events.C:27
 histo2d_all_events.C:28
 histo2d_all_events.C:29
 histo2d_all_events.C:30
 histo2d_all_events.C:31
 histo2d_all_events.C:32
 histo2d_all_events.C:33
 histo2d_all_events.C:34
 histo2d_all_events.C:35
 histo2d_all_events.C:36
 histo2d_all_events.C:37
 histo2d_all_events.C:38
 histo2d_all_events.C:39
 histo2d_all_events.C:40
 histo2d_all_events.C:41
 histo2d_all_events.C:42
 histo2d_all_events.C:43
 histo2d_all_events.C:44
 histo2d_all_events.C:45
 histo2d_all_events.C:46
 histo2d_all_events.C:47
 histo2d_all_events.C:48
 histo2d_all_events.C:49
 histo2d_all_events.C:50
 histo2d_all_events.C:51
 histo2d_all_events.C:52
 histo2d_all_events.C:53
 histo2d_all_events.C:54
 histo2d_all_events.C:55
 histo2d_all_events.C:56
 histo2d_all_events.C:57
 histo2d_all_events.C:58
 histo2d_all_events.C:59
 histo2d_all_events.C:60
 histo2d_all_events.C:61
 histo2d_all_events.C:62
 histo2d_all_events.C:63
 histo2d_all_events.C:64
 histo2d_all_events.C:65
 histo2d_all_events.C:66
 histo2d_all_events.C:67
 histo2d_all_events.C:68
 histo2d_all_events.C:69
 histo2d_all_events.C:70
 histo2d_all_events.C:71
 histo2d_all_events.C:72
 histo2d_all_events.C:73
 histo2d_all_events.C:74
 histo2d_all_events.C:75
 histo2d_all_events.C:76
 histo2d_all_events.C:77
 histo2d_all_events.C:78
 histo2d_all_events.C:79
 histo2d_all_events.C:80
 histo2d_all_events.C:81
 histo2d_all_events.C:82
 histo2d_all_events.C:83
 histo2d_all_events.C:84
 histo2d_all_events.C:85
 histo2d_all_events.C:86
 histo2d_all_events.C:87
 histo2d_all_events.C:88
 histo2d_all_events.C:89
 histo2d_all_events.C:90
 histo2d_all_events.C:91
 histo2d_all_events.C:92
 histo2d_all_events.C:93
 histo2d_all_events.C:94
 histo2d_all_events.C:95
 histo2d_all_events.C:96
 histo2d_all_events.C:97
 histo2d_all_events.C:98
 histo2d_all_events.C:99
 histo2d_all_events.C:100
 histo2d_all_events.C:101
 histo2d_all_events.C:102
 histo2d_all_events.C:103
 histo2d_all_events.C:104
 histo2d_all_events.C:105
 histo2d_all_events.C:106
 histo2d_all_events.C:107
 histo2d_all_events.C:108
 histo2d_all_events.C:109
 histo2d_all_events.C:110
 histo2d_all_events.C:111
 histo2d_all_events.C:112
 histo2d_all_events.C:113
 histo2d_all_events.C:114
 histo2d_all_events.C:115
 histo2d_all_events.C:116
 histo2d_all_events.C:117
 histo2d_all_events.C:118
 histo2d_all_events.C:119
 histo2d_all_events.C:120
 histo2d_all_events.C:121
 histo2d_all_events.C:122
 histo2d_all_events.C:123
 histo2d_all_events.C:124
 histo2d_all_events.C:125
 histo2d_all_events.C:126
 histo2d_all_events.C:127
 histo2d_all_events.C:128
 histo2d_all_events.C:129
 histo2d_all_events.C:130
 histo2d_all_events.C:131
 histo2d_all_events.C:132
 histo2d_all_events.C:133
 histo2d_all_events.C:134
 histo2d_all_events.C:135
 histo2d_all_events.C:136
 histo2d_all_events.C:137
 histo2d_all_events.C:138
 histo2d_all_events.C:139
 histo2d_all_events.C:140
 histo2d_all_events.C:141
 histo2d_all_events.C:142
 histo2d_all_events.C:143
 histo2d_all_events.C:144
 histo2d_all_events.C:145
 histo2d_all_events.C:146
 histo2d_all_events.C:147
 histo2d_all_events.C:148
 histo2d_all_events.C:149
 histo2d_all_events.C:150
 histo2d_all_events.C:151
 histo2d_all_events.C:152
 histo2d_all_events.C:153
 histo2d_all_events.C:154
 histo2d_all_events.C:155
 histo2d_all_events.C:156
 histo2d_all_events.C:157
 histo2d_all_events.C:158
 histo2d_all_events.C:159
 histo2d_all_events.C:160
 histo2d_all_events.C:161
 histo2d_all_events.C:162
 histo2d_all_events.C:163
 histo2d_all_events.C:164
 histo2d_all_events.C:165
 histo2d_all_events.C:166
 histo2d_all_events.C:167
 histo2d_all_events.C:168
 histo2d_all_events.C:169
 histo2d_all_events.C:170
 histo2d_all_events.C:171
 histo2d_all_events.C:172
 histo2d_all_events.C:173
 histo2d_all_events.C:174
 histo2d_all_events.C:175
 histo2d_all_events.C:176
 histo2d_all_events.C:177
 histo2d_all_events.C:178
 histo2d_all_events.C:179
 histo2d_all_events.C:180
 histo2d_all_events.C:181
 histo2d_all_events.C:182
 histo2d_all_events.C:183
 histo2d_all_events.C:184
 histo2d_all_events.C:185
 histo2d_all_events.C:186
 histo2d_all_events.C:187
 histo2d_all_events.C:188
 histo2d_all_events.C:189
 histo2d_all_events.C:190
 histo2d_all_events.C:191
 histo2d_all_events.C:192
 histo2d_all_events.C:193
 histo2d_all_events.C:194
 histo2d_all_events.C:195
 histo2d_all_events.C:196
 histo2d_all_events.C:197
 histo2d_all_events.C:198
 histo2d_all_events.C:199
 histo2d_all_events.C:200
 histo2d_all_events.C:201
 histo2d_all_events.C:202
 histo2d_all_events.C:203
 histo2d_all_events.C:204
 histo2d_all_events.C:205
 histo2d_all_events.C:206
 histo2d_all_events.C:207
 histo2d_all_events.C:208
 histo2d_all_events.C:209
 histo2d_all_events.C:210
 histo2d_all_events.C:211
 histo2d_all_events.C:212
 histo2d_all_events.C:213
 histo2d_all_events.C:214
 histo2d_all_events.C:215
 histo2d_all_events.C:216
 histo2d_all_events.C:217
 histo2d_all_events.C:218
 histo2d_all_events.C:219
 histo2d_all_events.C:220
 histo2d_all_events.C:221
 histo2d_all_events.C:222
 histo2d_all_events.C:223
 histo2d_all_events.C:224
 histo2d_all_events.C:225
 histo2d_all_events.C:226
 histo2d_all_events.C:227
 histo2d_all_events.C:228
 histo2d_all_events.C:229
 histo2d_all_events.C:230
 histo2d_all_events.C:231
 histo2d_all_events.C:232
 histo2d_all_events.C:233
 histo2d_all_events.C:234
 histo2d_all_events.C:235
 histo2d_all_events.C:236
 histo2d_all_events.C:237
 histo2d_all_events.C:238
 histo2d_all_events.C:239
 histo2d_all_events.C:240
 histo2d_all_events.C:241
 histo2d_all_events.C:242
 histo2d_all_events.C:243
 histo2d_all_events.C:244
 histo2d_all_events.C:245
 histo2d_all_events.C:246
 histo2d_all_events.C:247