ROOT logo
// $Id$
// Author: Stefano Carrazza 2010, CERN, stefano.carrazza@cern.ch

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

#include "AliESDEvent.h"
#include "AliEveLego.h"
#include "AliEveEventManager.h"
#include "AliEveMultiView.h"
#include "AliPhysicsSelection.h"

#include "TH2F.h"
#include "TMath.h"
#include "TGLViewer.h"
#include "TEveWindow.h"
#include "TEveManager.h"
#include "TEveBrowser.h"
#include "TEveViewer.h"
#include "TEveScene.h"
#include "TEveCaloLegoOverlay.h"
#include "TEveCalo.h"
#include "TEveCaloData.h"
#include "TEveLegoEventHandler.h"
#include "TEveTrans.h"
#include "TEveProjectionManager.h"
#include "TEveProjectionAxes.h"
#include "TGLWidget.h"
#include "TStopwatch.h"

//______________________________________________________________________________
// This class provides the following features:
//
// 1) 2D and 3D calorimeter like histograms of tracks distribution,
// providing particle selection by charge (positive and negative),
// and by specie: electrons, muons, pions, kaons and protons.
//
// 2) Histograms are plotted around detectors, allowing track selection: all tracks,
// only primary tracks. It allows pT maximum and minimum threashold.
//
// 3) 2D and 3D calorimeter like histograms of particles distribution obtained
// from all events.
//
// 4) Possibility to use AliPhysicsSelection during the all events histograms creation.
// It is also possible to switch between real data and simulation data (MC).
//

ClassImp(AliEveLego)
Double_t kPi = TMath::Pi();

//______________________________________________________________________________
AliEveLego::AliEveLego(const char* name) :
  TEveElementList(name),
  fIsMC(kFALSE),
  fCollisionCandidatesOnly(kFALSE),
  fParticleTypeId(0),
  fParticleTypeIdAE(0),
  fTracksId(1),
  fMaxPt(10000),
  fTracksIdAE(0),
  fMaxPtAE(10000),
  fEsd(0),
  fPhysicsSelection(0),
  fHistopos(0),
  fHistoposAllEvents(0),
  fHistoneg(0),
  fHistonegAllEvents(0),
  fHistoElectrons(0),
  fHistoElectronsAllEvents(0),
  fHistoMuons(0),
  fHistoMuonsAllEvents(0),
  fHistoPions(0),
  fHistoPionsAllEvents(0),
  fHistoKaons(0),
  fHistoKaonsAllEvents(0),
  fHistoProtons(0),
  fHistoProtonsAllEvents(0),
  fData(0),
  fDataAllEvents(0),
  fLego(0),
  fLegoAllEvents(0),
  fCalo3d(0),
  fCalo3dAllEvents(0),
  fGlv(0),
  fHisto2dv(0),
  fHisto2ds(0),
  fHisto2ds2(0),
  fHisto2dAllEventsv0(0),
  fHisto2dAllEventsv1(0),
  fHisto2dAllEventsv2(0),
  fHisto2dAllEventsv3(0),
  fHisto2dAllEventss0(0),
  fHisto2dAllEventss1(0),
  fHisto2dAllEventss2(0),
  fHisto2dAllEventss3(0),
  fAl(0),
  fHisto2dLegoOverlay(0),
  fHisto2dAllEventsLegoOverlay(0),
  fHisto2dAllEventsSlot(0)
{
  // Constructor.
  gEve->AddToListTree(this,0);

  // Get Current ESD event
  fEsd = AliEveEventManager::AssertESD();

  // Particles types per default
  fParticleTypeId = new Bool_t[7];
  fParticleTypeIdAE = new Bool_t[7];

  for (Int_t s = 0; s < 7; s++)
  {
    if (s > 1)
    {
      fParticleTypeId[s] = kFALSE;
      fParticleTypeIdAE[s] = kFALSE;
    } else {
      fParticleTypeId[s] = kTRUE;
      fParticleTypeIdAE[s] = kTRUE;
    }
  }

  // Loading Physics Selection to determine the collision candidates
  fPhysicsSelection = new AliPhysicsSelection();
  fPhysicsSelection->Initialize(fEsd);

  fHistopos       = new TH2F("histopos","Histo 2d positive", 100, -1.5, 1.5, 80, -kPi, kPi);
  fHistoneg       = new TH2F("histoneg","Histo 2d negative", 100, -1.5, 1.5, 80, -kPi, kPi);
  fHistoElectrons = new TH2F("histoele","Histo 2d electron", 100, -1.5, 1.5, 80, -kPi, kPi);
  fHistoMuons     = new TH2F("histomuo","Histo 2d muons   ", 100, -1.5, 1.5, 80, -kPi, kPi);
  fHistoPions     = new TH2F("histopio","Histo 2d pions   ", 100, -1.5, 1.5, 80, -kPi, kPi);
  fHistoKaons     = new TH2F("histokao","Histo 2d kaons   ", 100, -1.5, 1.5, 80, -kPi, kPi);
  fHistoProtons   = new TH2F("histopro","Histo 2d protons ", 100, -1.5, 1.5, 80, -kPi, kPi);

  fHistopos->SetDirectory(0);
  fHistoneg->SetDirectory(0);
  fHistoElectrons->SetDirectory(0);
  fHistoMuons->SetDirectory(0);
  fHistoPions->SetDirectory(0);
  fHistoKaons->SetDirectory(0);
  fHistoProtons->SetDirectory(0);

  // Colors from get_pdg_color() in /alice-macros/kine_tracks.C
  static Color_t fElectro = 5;
  static Color_t fMuon = 30;
  static Color_t fPion = 3;
  static Color_t fKaon = 38;
  static Color_t fProton = 10;

  // Adding data to TEveCaloDataHist
  fData = new TEveCaloDataHist();
  fData->AddHistogram(fHistoneg);
  fData->RefSliceInfo(0).Setup("NegCg:", 0, kBlue);
  fData->AddHistogram(fHistopos);
  fData->RefSliceInfo(1).Setup("PosCg:", 0, kRed);
  fData->AddHistogram(fHistoElectrons);
  fData->RefSliceInfo(2).Setup("Elect.:", 0, fElectro);
  fData->AddHistogram(fHistoMuons);
  fData->RefSliceInfo(3).Setup("Muons:", 0, fMuon);
  fData->AddHistogram(fHistoPions);
  fData->RefSliceInfo(4).Setup("Pions:", 0, fPion);
  fData->AddHistogram(fHistoKaons);
  fData->RefSliceInfo(5).Setup("Kaons:", 0, fKaon);
  fData->AddHistogram(fHistoProtons);
  fData->RefSliceInfo(6).Setup("Proto.:", 0, fProton);

  fData->GetEtaBins()->SetTitleFont(120);
  fData->GetEtaBins()->SetTitle("h");
  fData->GetPhiBins()->SetTitleFont(120);
  fData->GetPhiBins()->SetTitle("f");
  fData->IncDenyDestroy();

  // Setting up the position of the 3D calorimeter histogram view.
  fCalo3d = new TEveCalo3D(fData);
  fCalo3d->SetBarrelRadius(550);
  fCalo3d->SetEndCapPos(550);

  // Adding data to the Lego object
  fLego = new TEveCaloLego(fData);

  // Creating projections
  fAl = AliEveMultiView::Instance();
  fAl->ImportEventRPhi(fCalo3d);
  fAl->ImportEventRhoZ(fCalo3d);

  // Update viewers and scenes
  Update();
}

//______________________________________________________________________________
AliEveLego::~AliEveLego()
{
   // Deleting variables
   delete fEsd;
   delete fPhysicsSelection;
   delete fHistopos;
   delete fHistoposAllEvents;
   delete fHistoneg;
   delete fHistonegAllEvents;
   delete fHistoElectrons;
   delete fHistoElectronsAllEvents;
   delete fHistoMuons;
   delete fHistoMuonsAllEvents;
   delete fHistoPions;
   delete fHistoPionsAllEvents;
   delete fHistoKaons;
   delete fHistoKaonsAllEvents;
   delete fHistoProtons;
   delete fHistoProtonsAllEvents;
   delete[] fParticleTypeId;
   delete[] fParticleTypeIdAE;
   delete fData;
   delete fDataAllEvents;
   delete fLego;
   delete fLegoAllEvents;
   delete fCalo3d;
   delete fCalo3dAllEvents;
   delete fGlv;
   delete fHisto2dv;
   delete fHisto2ds;
   delete fHisto2ds2;
   delete fHisto2dAllEventsv0;
   delete fHisto2dAllEventsv1;
   delete fHisto2dAllEventsv2;
   delete fHisto2dAllEventsv3;
   delete fHisto2dAllEventss0;
   delete fHisto2dAllEventss1;
   delete fHisto2dAllEventss2;
   delete fHisto2dAllEventss3;
   delete fAl;
   delete fHisto2dLegoOverlay;
   delete fHisto2dAllEventsLegoOverlay;
   delete fHisto2dAllEventsSlot;
}

namespace
{
  //____________________________________________________________________________
  Double_t getphi(Double_t phi)
  {
    // Phi correction for alice

    if (phi > TMath::Pi()) {
      phi -= TMath::TwoPi();
    }
    return phi;
  }
}

//______________________________________________________________________________
TEveCaloDataHist* AliEveLego::LoadData()
{
   // Load data from ESD tree
   fHistopos->Reset();
   fHistoneg->Reset();
   fHistoElectrons->Reset();
   fHistoMuons->Reset();
   fHistoPions->Reset();
   fHistoKaons->Reset();
   fHistoProtons->Reset();

   // Getting current tracks, filling histograms
   for (int n = 0; n < fEsd->GetNumberOfTracks(); ++n) {

     AliESDtrack *track = fEsd->GetTrack(n);
     const Double_t sign = fEsd->GetTrack(n)->GetSign();
     const Int_t prob = GetParticleType(track);     

     // Filling histograms
     if (sign > 0)
       fHistopos->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

     if (sign < 0)
       fHistoneg->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

     if (prob == 0)
       fHistoElectrons->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

     if (prob == 1)
       fHistoMuons->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

     if (prob == 2)
       fHistoPions->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

     if (prob == 3)
       fHistoKaons->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

     if (prob == 4)
       fHistoProtons->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));
   }

   fData->DataChanged();

   FilterData();

   return fData;
}

//______________________________________________________________________________
TEveCaloDataHist* AliEveLego::LoadAllData()
{
   // Load data from all events ESD
   fHistoposAllEvents->Reset();
   fHistonegAllEvents->Reset();
   fHistoElectronsAllEvents->Reset();
   fHistoMuonsAllEvents->Reset();
   fHistoPionsAllEvents->Reset();
   fHistoKaonsAllEvents->Reset();
   fHistoProtonsAllEvents->Reset();

   TTree* t = AliEveEventManager::GetMaster()->GetESDTree();

   // Getting current tracks for each event, filling histograms
   Int_t fAcceptedEvents = 0;
   for (int event = 0; event < t->GetEntries(); event++) {
      t->GetEntry(event);

      if (fCollisionCandidatesOnly == kTRUE)
        if (fPhysicsSelection->IsCollisionCandidate(fEsd) == kFALSE) continue;

      fAcceptedEvents++;

      for (int n = 0; n < fEsd->GetNumberOfTracks(); ++n) {

           AliESDtrack *track = fEsd->GetTrack(n);
           const Double_t sign = track->GetSign();
           const Int_t prob = GetParticleType(track);

           if (sign > 0)
             fHistoposAllEvents->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

           if (sign < 0)
             fHistonegAllEvents->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

           if (prob == 0)
             fHistoElectronsAllEvents->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

           if (prob == 1)
             fHistoMuonsAllEvents->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

           if (prob == 2)
             fHistoPionsAllEvents->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

           if (prob == 3)
             fHistoKaonsAllEvents->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));

           if (prob == 4)
             fHistoProtonsAllEvents->Fill(track->Eta(), getphi(track->Phi()), fabs(track->Pt()));
        }
   }

   // Setting the current view to the first event
   t->GetEntry(0);

   // Usefull information,
   // with this we can estimate the event efficiency
   printf("Number of events loaded: %i, with AliPhysicsSelection: %i\n",fAcceptedEvents,fCollisionCandidatesOnly);

   fDataAllEvents->DataChanged();

   return fDataAllEvents;
}

//______________________________________________________________________________
TEveCaloDataHist* AliEveLego::FilterData()
{
   // Tracks selection
   if ( fTracksId == 2 )
   {
      fHistopos->Reset();
      fHistoneg->Reset();
      fHistoElectrons->Reset();
      fHistoMuons->Reset();
      fHistoPions->Reset();
      fHistoKaons->Reset();
      fHistoProtons->Reset();

      const AliESDVertex *pv  = fEsd->GetPrimaryVertex();

      for (Int_t n = 0; n < pv->GetNIndices(); n++ )
      {
         AliESDtrack *at = fEsd->GetTrack(pv->GetIndices()[n]);
         const Double_t sign = at->GetSign();
         const Int_t prob = GetParticleType(at);

         if (sign > 0)
           fHistopos->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

         if (sign < 0)
           fHistoneg->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

         if (prob == 0)
           fHistoElectrons->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

         if (prob == 1)
           fHistoMuons->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

         if (prob == 2)
           fHistoPions->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

         if (prob == 3)
           fHistoKaons->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

         if (prob == 4)
           fHistoProtons->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));
      }
   }

   fData->DataChanged();

   // Max Pt threshold
   if (GetPtMax() >= fMaxPt){
      for (Int_t binx = 1; binx <= 100; binx++) {
         for (Int_t biny = 1; biny <= 80; biny++) {

           if (fHistopos->GetBinContent(binx, biny) >= fMaxPt)
             fHistopos->SetBinContent(binx, biny, fMaxPt);

           if (fHistoneg->GetBinContent(binx, biny) >= fMaxPt)
             fHistoneg->SetBinContent(binx, biny, fMaxPt);

           if (fHistoElectrons->GetBinContent(binx, biny) >= fMaxPt)
             fHistoElectrons->SetBinContent(binx, biny, fMaxPt);

           if (fHistoMuons->GetBinContent(binx, biny) >= fMaxPt)
             fHistoMuons->SetBinContent(binx, biny, fMaxPt);

           if (fHistoPions->GetBinContent(binx, biny) >= fMaxPt)
             fHistoPions->SetBinContent(binx, biny, fMaxPt);

           if (fHistoKaons->GetBinContent(binx, biny) >= fMaxPt)
             fHistoKaons->SetBinContent(binx, biny, fMaxPt);

           if (fHistoProtons->GetBinContent(binx, biny) >= fMaxPt)
             fHistoProtons->SetBinContent(binx, biny, fMaxPt);
         }
      }
   }

   // Particle type filter
   if ( fParticleTypeId[0] == kFALSE) fHistopos->Reset();
   if ( fParticleTypeId[1] == kFALSE) fHistoneg->Reset();
   if ( fParticleTypeId[2] == kFALSE) fHistoElectrons->Reset();
   if ( fParticleTypeId[3] == kFALSE) fHistoMuons->Reset();
   if ( fParticleTypeId[4] == kFALSE) fHistoPions->Reset();
   if ( fParticleTypeId[5] == kFALSE) fHistoKaons->Reset();
   if ( fParticleTypeId[6] == kFALSE) fHistoProtons->Reset();

   fData->DataChanged();

   return fData;
}

//______________________________________________________________________________
TEveCaloDataHist* AliEveLego::FilterAllData()
{
   // Tracks selection
   if ( fTracksIdAE == 2 )
   {
      fHistoposAllEvents->Reset();
      fHistonegAllEvents->Reset();
      fHistoElectronsAllEvents->Reset();
      fHistoMuonsAllEvents->Reset();
      fHistoPionsAllEvents->Reset();
      fHistoKaonsAllEvents->Reset();
      fHistoProtonsAllEvents->Reset();

      TTree* t = AliEveEventManager::GetMaster()->GetESDTree();

      // Getting current tracks for each event, filling histograms
      Int_t fAcceptedEvents = 0;
      for (int event = 0; event < t->GetEntries(); event++) {

        t->GetEntry(event);
        const AliESDVertex *pv  = fEsd->GetPrimaryVertex();

        if (fCollisionCandidatesOnly == kTRUE)
          if (fPhysicsSelection->IsCollisionCandidate(fEsd) == kFALSE) continue;

        fAcceptedEvents++;

        for (Int_t n = 0; n < pv->GetNIndices(); n++ )
        {
          AliESDtrack *at = fEsd->GetTrack(pv->GetIndices()[n]);
          const Double_t sign = at->GetSign();
          const Int_t prob = GetParticleType(at);

          if (sign > 0)
            fHistoposAllEvents->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

          if (sign < 0)
            fHistonegAllEvents->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

          if (prob == 0)
            fHistoElectronsAllEvents->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

          if (prob == 1)
            fHistoMuonsAllEvents->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

          if (prob == 2)
            fHistoPionsAllEvents->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

          if (prob == 3)
            fHistoKaonsAllEvents->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));

          if (prob == 4)
            fHistoProtonsAllEvents->Fill(at->Eta(), getphi(at->Phi()), fabs(at->Pt()));
        }
      }
      t->GetEntry(0);
      printf("Number of events loaded: %i, with AliPhysicsSelection: %i\n",fAcceptedEvents,fCollisionCandidatesOnly);

   } else {

      LoadAllData();

    }
   
   fDataAllEvents->DataChanged();

   // Max Pt threshold
   if (GetPtMaxAE() >= fMaxPtAE){
      for (Int_t binx = 1; binx <= 100; binx++) {
         for (Int_t biny = 1; biny <= 80; biny++) {

            if (fHistoposAllEvents->GetBinContent(binx, biny) >= fMaxPtAE)            
              fHistoposAllEvents->SetBinContent(binx, biny, fMaxPtAE);

            if (fHistonegAllEvents->GetBinContent(binx, biny) >= fMaxPtAE)            
              fHistonegAllEvents->SetBinContent(binx, biny, fMaxPtAE);

            if (fHistoElectronsAllEvents->GetBinContent(binx, biny) >= fMaxPt)
              fHistoElectronsAllEvents->SetBinContent(binx, biny, fMaxPt);

            if (fHistoMuonsAllEvents->GetBinContent(binx, biny) >= fMaxPt)
              fHistoMuonsAllEvents->SetBinContent(binx, biny, fMaxPt);

            if (fHistoPionsAllEvents->GetBinContent(binx, biny) >= fMaxPt)
              fHistoPionsAllEvents->SetBinContent(binx, biny, fMaxPt);

            if (fHistoKaonsAllEvents->GetBinContent(binx, biny) >= fMaxPt)
              fHistoKaonsAllEvents->SetBinContent(binx, biny, fMaxPt);

            if (fHistoProtonsAllEvents->GetBinContent(binx, biny) >= fMaxPt)
              fHistoProtonsAllEvents->SetBinContent(binx, biny, fMaxPt);
         }
      }
   }

   // Particles species and charges filter
   if ( fParticleTypeIdAE[0] == kFALSE ) fHistoposAllEvents->Reset();
   if ( fParticleTypeIdAE[1] == kFALSE ) fHistonegAllEvents->Reset();
   if ( fParticleTypeIdAE[2] == kFALSE ) fHistoElectronsAllEvents->Reset();
   if ( fParticleTypeIdAE[3] == kFALSE ) fHistoMuonsAllEvents->Reset();
   if ( fParticleTypeIdAE[4] == kFALSE ) fHistoPionsAllEvents->Reset();
   if ( fParticleTypeIdAE[5] == kFALSE ) fHistoKaonsAllEvents->Reset();
   if ( fParticleTypeIdAE[6] == kFALSE ) fHistoProtonsAllEvents->Reset();

   fDataAllEvents->DataChanged();

   gEve->Redraw3D(kTRUE);

   return fDataAllEvents;
}

//______________________________________________________________________________
void AliEveLego::Update()
{
   // Load/Reload data
   LoadData();

   // Create new histo2d
   CreateHistoLego();

   // Create 3d view
   Create3DView();

   // Update the viewers
   gEve->Redraw3D(kTRUE);
}

//______________________________________________________________________________
TEveCaloLego* AliEveLego::CreateHistoLego()
{
   // Viewer initialization, tab creation
   if (fHisto2dv == 0) {
      TEveWindowSlot *fslot    = 0;
      TEveBrowser    *fbrowser = gEve->GetBrowser();

      fslot = TEveWindow::CreateWindowInTab(fbrowser->GetTabRight());
      fslot->MakeCurrent();
      fHisto2dv = gEve->SpawnNewViewer("2D Lego Histogram", "2D Lego Histogram");
      fHisto2ds = gEve->SpawnNewScene("2D Lego Histogram", "2D Lego Histogram");
      fHisto2dv->AddScene(fHisto2ds);
      fHisto2dv->SetElementName("2D Lego Viewer");
      fHisto2ds->SetElementName("2D Lego Scene");

      fGlv = fHisto2dv->GetGLViewer();
      fHisto2dLegoOverlay = new TEveCaloLegoOverlay();
      fGlv->AddOverlayElement(fHisto2dLegoOverlay);
      fGlv->SetCurrentCamera(TGLViewer::kCameraPerspXOY);

      fHisto2ds->AddElement(fLego);

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

      // set event handler to move from perspective to orthographic view.
      fGlv->SetEventHandler(new TEveLegoEventHandler(fGlv->GetGLWidget(), fGlv, fLego));

      fHisto2dLegoOverlay->SetCaloLego(fLego);
   }

   return fLego;
}

//______________________________________________________________________________
TEveCaloLego* AliEveLego::CreateHistoLego(TEveWindowSlot *slot)
{
   // Viewer initialization, tab creation
   if (fHisto2dAllEventsv0 == 0) {

      slot->MakeCurrent();
      fHisto2dAllEventsv0 = gEve->SpawnNewViewer("2D Lego Histogram", "2D Lego Histogram");
      fHisto2dAllEventss0 = gEve->SpawnNewScene("2D Lego Histogram", "2D Lego Histogram");
      fHisto2dAllEventsv0->AddScene(fHisto2dAllEventss0);
      fHisto2dAllEventsv0->SetElementName("2D Lego Viewer");
      fHisto2dAllEventss0->SetElementName("2D Lego Scene");

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

      // Plotting histogram lego
      fLegoAllEvents = new TEveCaloLego(fDataAllEvents);
      fHisto2dAllEventss0->AddElement(fLegoAllEvents);

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

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

      fHisto2dAllEventsLegoOverlay->SetCaloLego(fLegoAllEvents);
   }

   return fLegoAllEvents;
}

//______________________________________________________________________________
TEveCalo3D* AliEveLego::Create3DView()
{
   // Initialization
   if (fHisto2ds2 == 0) {
      fHisto2ds2 = gEve->SpawnNewScene("3D Histogram", "3D Histogram");
      gEve->GetDefaultViewer()->AddScene(fHisto2ds2);
      fHisto2ds2->SetElementName("3D Histogram Scene");
      fHisto2ds2->AddElement(fCalo3d);
   }

   return fCalo3d;
}

//______________________________________________________________________________
TEveCalo3D* AliEveLego::Create3DView(TEveWindowSlot *slot)
{
   // Creates a 3d view for the 3d histogram
   if ( fHisto2dAllEventsv1 == 0 ) {

      slot->MakeCurrent();
      fHisto2dAllEventsv1 = gEve->SpawnNewViewer("3D Histogram", "3D Histogram");
      fHisto2dAllEventss1 = gEve->SpawnNewScene("3D Histogram", "3D Histogram");
      fHisto2dAllEventsv1->AddScene(fHisto2dAllEventss1);
      fHisto2dAllEventsv1->SetElementName("3D Histogram Viewer");
      fHisto2dAllEventss1->SetElementName("3D Histogram Scene");

      fCalo3dAllEvents = new TEveCalo3D(fDataAllEvents);

      fCalo3dAllEvents->SetBarrelRadius(550);
      fCalo3dAllEvents->SetEndCapPos(550);
      fHisto2dAllEventss1->AddElement(fCalo3dAllEvents);
   }

   return fCalo3dAllEvents;
}

//______________________________________________________________________________
void AliEveLego::CreateProjections(TEveWindowSlot* slot1, TEveWindowSlot* slot2)
{
   // Create projections
   if (fHisto2dAllEventsv2 == 0) {

      slot1->MakeCurrent();
      fHisto2dAllEventsv2 = gEve->SpawnNewViewer("RPhi projection", "RPhi projection");
      fHisto2dAllEventss2 = gEve->SpawnNewScene("RPhi projection", "RPhi projection");
      fHisto2dAllEventsv2->AddScene(fHisto2dAllEventss2);
      fHisto2dAllEventsv2->SetElementName("RPhi Projection Viewer");
      fHisto2dAllEventss2->SetElementName("RPhi Projection Scene");

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

      TEveProjectionAxes* axeghisto2dAllEventss1 = new TEveProjectionAxes(mng1);
      fHisto2dAllEventss2->AddElement(axeghisto2dAllEventss1);
      TEveCalo2D* fcalo2d1 = (TEveCalo2D*) mng1->ImportElements(fCalo3dAllEvents);
      fHisto2dAllEventss2->AddElement(fcalo2d1);

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

   if (fHisto2dAllEventsv3 == 0)
   {
      slot2->MakeCurrent();
      fHisto2dAllEventsv3 = gEve->SpawnNewViewer("RhoZ projection", "RhoZ projection");
      fHisto2dAllEventss3 = gEve->SpawnNewScene("RhoZ projection", "RhoZ projection");
      fHisto2dAllEventsv3->AddScene(fHisto2dAllEventss3);
      fHisto2dAllEventsv3->SetElementName("RhoZ Projection Viewer");
      fHisto2dAllEventss3->SetElementName("RhoZ Projection Viewer");

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

      TEveProjectionAxes* axeghisto2dAllEventss2 = new TEveProjectionAxes(mng2);
      fHisto2dAllEventss3->AddElement(axeghisto2dAllEventss2);
      TEveCalo2D* fcalo2d2 = (TEveCalo2D*) mng2->ImportElements(fCalo3dAllEvents);
      fHisto2dAllEventss3->AddElement(fcalo2d2);

      fHisto2dAllEventsv3->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   }
   return;
}

//______________________________________________________________________________
TEveCaloDataHist* AliEveLego::LoadAllEvents()
{
   // load all events data from ESD
   if ( fHisto2dAllEventsSlot == 0 ) {

      printf("Filling histogram...\n");
      TStopwatch timer;
      timer.Start();

      // Creating 2D histograms
      fHistoposAllEvents = new TH2F("fHistoposAllEvents","Histo 2d positive",
                                 100,-1.5,1.5,80,-kPi,kPi);
      fHistonegAllEvents = new TH2F("fHistonegAllEvents","Histo 2d negative",
                                 100,-1.5,1.5,80,-kPi,kPi);
      fHistoElectronsAllEvents = new TH2F("fHistoElectronsAllEvents","Histo 2d electrons",
                                       100,-1.5,1.5,80,-kPi,kPi);
      fHistoMuonsAllEvents = new TH2F("fHistoMuonsAllEvents","Histo 2d muons",
                                       100,-1.5,1.5,80,-kPi,kPi);
      fHistoPionsAllEvents = new TH2F("fHistoPionsAllEvents","Histo 2d pions",
                                       100,-1.5,1.5,80,-kPi,kPi);
      fHistoKaonsAllEvents = new TH2F("fHistoKaonsAllEvents","Histo 2d kaons",
                                       100,-1.5,1.5,80,-kPi,kPi);
      fHistoProtonsAllEvents = new TH2F("fHistoProtonsAllEvents","Histo 2d protons",
                                       100,-1.5,1.5,80,-kPi,kPi);

      fHistoposAllEvents->SetDirectory(0);
      fHistonegAllEvents->SetDirectory(0);
      fHistoElectronsAllEvents->SetDirectory(0);
      fHistoMuonsAllEvents->SetDirectory(0);
      fHistoPionsAllEvents->SetDirectory(0);
      fHistoKaonsAllEvents->SetDirectory(0);
      fHistoProtonsAllEvents->SetDirectory(0);

      // colors from get_pdg_color() in /alice-macros/kine_tracks.C
      static Color_t fElectro = 5;
      static Color_t fMuon = 30;
      static Color_t fPion = 3;
      static Color_t fKaon = 38;
      static Color_t fProton = 10;

      fDataAllEvents = new TEveCaloDataHist();
      fDataAllEvents->AddHistogram(fHistonegAllEvents);
      fDataAllEvents->RefSliceInfo(0).Setup("NegCg:", 0, kBlue);
      fDataAllEvents->AddHistogram(fHistoposAllEvents);
      fDataAllEvents->RefSliceInfo(1).Setup("PosCg:", 0, kRed);
      fDataAllEvents->AddHistogram(fHistoElectronsAllEvents);
      fDataAllEvents->RefSliceInfo(2).Setup("Electrons:", 0, fElectro);
      fDataAllEvents->AddHistogram(fHistoMuonsAllEvents);
      fDataAllEvents->RefSliceInfo(3).Setup("Muons:", 0, fMuon);
      fDataAllEvents->AddHistogram(fHistoPionsAllEvents);
      fDataAllEvents->RefSliceInfo(4).Setup("Pions:", 0, fPion);
      fDataAllEvents->AddHistogram(fHistoKaonsAllEvents);
      fDataAllEvents->RefSliceInfo(5).Setup("Kaons:", 0, fKaon);
      fDataAllEvents->AddHistogram(fHistoProtonsAllEvents);
      fDataAllEvents->RefSliceInfo(6).Setup("Protons:", 0, fProton);

      fDataAllEvents->GetEtaBins()->SetTitleFont(120);
      fDataAllEvents->GetEtaBins()->SetTitle("h");
      fDataAllEvents->GetPhiBins()->SetTitleFont(120);
      fDataAllEvents->GetPhiBins()->SetTitle("f");
      fDataAllEvents->IncDenyDestroy();

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

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

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

      // Creating viewers and scenes
      Create3DView(slotLeftTop);
      CreateHistoLego(slotLeftBottom);
      CreateProjections(slotRightTop, slotRightBottom);

      FilterAllData();

      gEve->Redraw3D(kTRUE);

      printf("Filling histogram... Finished\n");
      timer.Stop();
      timer.Print();
   }
   return fDataAllEvents;
}

//______________________________________________________________________________
void AliEveLego::ApplyParticleTypeSelectionAE()
{
  // Reload all events applying particle type selection
  FilterAllData();
}

//______________________________________________________________________________
Float_t AliEveLego::GetPtMax()
{
   // Return pT maximum
   return fData->GetMaxVal(fLego->GetPlotEt());
}

//______________________________________________________________________________
Float_t AliEveLego::GetPtMaxAE()
{
   // Return pT max from all events
   return fDataAllEvents->GetMaxVal(fLegoAllEvents->GetPlotEt());
}

//______________________________________________________________________________
Int_t AliEveLego::GetParticleType(AliESDtrack *track)
{
  // Determine the particle type
	Double_t prob[5]={0.};
  track->GetESDpid(prob);

  Double_t max = prob[0];
  Int_t index = 0;

  for (Int_t i = 1 ; i < 5; i++)
  {
    if (prob[i] > max){
      max = prob[i];
      index = i;
    }
  }
  return index;
}

//______________________________________________________________________________
void AliEveLego::SetParticleType(Int_t id, Bool_t status)
{
  // Activate/deactivate particles types
  fParticleTypeId[id] = status;

  Update();
}

//______________________________________________________________________________
void AliEveLego::SetParticleTypeAE(Int_t id, Bool_t status)
{
  // Activate/deactivate particles types
  fParticleTypeIdAE[id] = status;
}

//______________________________________________________________________________
void AliEveLego::SetMaxPt(Double_t val)
{
   // Add new maximum
   fMaxPt = val;   
   Update();
}

//______________________________________________________________________________
void AliEveLego::SetMaxPtAE(Double_t val)
{
   // Add new maximum
   fMaxPtAE = val;
   FilterAllData();
}

//______________________________________________________________________________
void AliEveLego::SetThreshold(Double_t val)
{  
   // Setting up the new threshold for all histograms
   fData->SetSliceThreshold(0,val);
   fData->SetSliceThreshold(1,val);
   fData->SetSliceThreshold(2,val);
   fData->SetSliceThreshold(3,val);
   fData->SetSliceThreshold(4,val);
   fData->SetSliceThreshold(5,val);
   fData->SetSliceThreshold(6,val);
   fData->DataChanged();

   gEve->Redraw3D(kTRUE);
}

//______________________________________________________________________________
void AliEveLego::SetThresholdAE(Double_t val)
{
   // Setting up the new threshold for all histograms
   fDataAllEvents->SetSliceThreshold(0,val);
   fDataAllEvents->SetSliceThreshold(1,val);
   fDataAllEvents->SetSliceThreshold(2,val);
   fDataAllEvents->SetSliceThreshold(3,val);
   fDataAllEvents->SetSliceThreshold(4,val);
   fDataAllEvents->SetSliceThreshold(5,val);
   fDataAllEvents->SetSliceThreshold(6,val);
   fDataAllEvents->DataChanged();

   gEve->Redraw3D(kTRUE);
}

//______________________________________________________________________________
void AliEveLego::SwitchDataType(Bool_t status)
{
  // Activate/deactivate MC / real data type
  fIsMC = status;

  // Removing defaul physics selection
  delete fPhysicsSelection;
  fPhysicsSelection = NULL;

  // Re-initialization of physics selection
  fPhysicsSelection = new AliPhysicsSelection();
  fPhysicsSelection->SetAnalyzeMC(fIsMC);
  fPhysicsSelection->Initialize(fEsd);
  FilterAllData();
}

//______________________________________________________________________________
void AliEveLego::SetCollisionCandidatesOnly()
{
  // Activate/deactivate MC / real data type
  if (fCollisionCandidatesOnly == 0)
  {
    fCollisionCandidatesOnly = 1;
  } else {
    fCollisionCandidatesOnly = 0;
  }
  FilterAllData();
}

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


 AliEveLego.cxx:1
 AliEveLego.cxx:2
 AliEveLego.cxx:3
 AliEveLego.cxx:4
 AliEveLego.cxx:5
 AliEveLego.cxx:6
 AliEveLego.cxx:7
 AliEveLego.cxx:8
 AliEveLego.cxx:9
 AliEveLego.cxx:10
 AliEveLego.cxx:11
 AliEveLego.cxx:12
 AliEveLego.cxx:13
 AliEveLego.cxx:14
 AliEveLego.cxx:15
 AliEveLego.cxx:16
 AliEveLego.cxx:17
 AliEveLego.cxx:18
 AliEveLego.cxx:19
 AliEveLego.cxx:20
 AliEveLego.cxx:21
 AliEveLego.cxx:22
 AliEveLego.cxx:23
 AliEveLego.cxx:24
 AliEveLego.cxx:25
 AliEveLego.cxx:26
 AliEveLego.cxx:27
 AliEveLego.cxx:28
 AliEveLego.cxx:29
 AliEveLego.cxx:30
 AliEveLego.cxx:31
 AliEveLego.cxx:32
 AliEveLego.cxx:33
 AliEveLego.cxx:34
 AliEveLego.cxx:35
 AliEveLego.cxx:36
 AliEveLego.cxx:37
 AliEveLego.cxx:38
 AliEveLego.cxx:39
 AliEveLego.cxx:40
 AliEveLego.cxx:41
 AliEveLego.cxx:42
 AliEveLego.cxx:43
 AliEveLego.cxx:44
 AliEveLego.cxx:45
 AliEveLego.cxx:46
 AliEveLego.cxx:47
 AliEveLego.cxx:48
 AliEveLego.cxx:49
 AliEveLego.cxx:50
 AliEveLego.cxx:51
 AliEveLego.cxx:52
 AliEveLego.cxx:53
 AliEveLego.cxx:54
 AliEveLego.cxx:55
 AliEveLego.cxx:56
 AliEveLego.cxx:57
 AliEveLego.cxx:58
 AliEveLego.cxx:59
 AliEveLego.cxx:60
 AliEveLego.cxx:61
 AliEveLego.cxx:62
 AliEveLego.cxx:63
 AliEveLego.cxx:64
 AliEveLego.cxx:65
 AliEveLego.cxx:66
 AliEveLego.cxx:67
 AliEveLego.cxx:68
 AliEveLego.cxx:69
 AliEveLego.cxx:70
 AliEveLego.cxx:71
 AliEveLego.cxx:72
 AliEveLego.cxx:73
 AliEveLego.cxx:74
 AliEveLego.cxx:75
 AliEveLego.cxx:76
 AliEveLego.cxx:77
 AliEveLego.cxx:78
 AliEveLego.cxx:79
 AliEveLego.cxx:80
 AliEveLego.cxx:81
 AliEveLego.cxx:82
 AliEveLego.cxx:83
 AliEveLego.cxx:84
 AliEveLego.cxx:85
 AliEveLego.cxx:86
 AliEveLego.cxx:87
 AliEveLego.cxx:88
 AliEveLego.cxx:89
 AliEveLego.cxx:90
 AliEveLego.cxx:91
 AliEveLego.cxx:92
 AliEveLego.cxx:93
 AliEveLego.cxx:94
 AliEveLego.cxx:95
 AliEveLego.cxx:96
 AliEveLego.cxx:97
 AliEveLego.cxx:98
 AliEveLego.cxx:99
 AliEveLego.cxx:100
 AliEveLego.cxx:101
 AliEveLego.cxx:102
 AliEveLego.cxx:103
 AliEveLego.cxx:104
 AliEveLego.cxx:105
 AliEveLego.cxx:106
 AliEveLego.cxx:107
 AliEveLego.cxx:108
 AliEveLego.cxx:109
 AliEveLego.cxx:110
 AliEveLego.cxx:111
 AliEveLego.cxx:112
 AliEveLego.cxx:113
 AliEveLego.cxx:114
 AliEveLego.cxx:115
 AliEveLego.cxx:116
 AliEveLego.cxx:117
 AliEveLego.cxx:118
 AliEveLego.cxx:119
 AliEveLego.cxx:120
 AliEveLego.cxx:121
 AliEveLego.cxx:122
 AliEveLego.cxx:123
 AliEveLego.cxx:124
 AliEveLego.cxx:125
 AliEveLego.cxx:126
 AliEveLego.cxx:127
 AliEveLego.cxx:128
 AliEveLego.cxx:129
 AliEveLego.cxx:130
 AliEveLego.cxx:131
 AliEveLego.cxx:132
 AliEveLego.cxx:133
 AliEveLego.cxx:134
 AliEveLego.cxx:135
 AliEveLego.cxx:136
 AliEveLego.cxx:137
 AliEveLego.cxx:138
 AliEveLego.cxx:139
 AliEveLego.cxx:140
 AliEveLego.cxx:141
 AliEveLego.cxx:142
 AliEveLego.cxx:143
 AliEveLego.cxx:144
 AliEveLego.cxx:145
 AliEveLego.cxx:146
 AliEveLego.cxx:147
 AliEveLego.cxx:148
 AliEveLego.cxx:149
 AliEveLego.cxx:150
 AliEveLego.cxx:151
 AliEveLego.cxx:152
 AliEveLego.cxx:153
 AliEveLego.cxx:154
 AliEveLego.cxx:155
 AliEveLego.cxx:156
 AliEveLego.cxx:157
 AliEveLego.cxx:158
 AliEveLego.cxx:159
 AliEveLego.cxx:160
 AliEveLego.cxx:161
 AliEveLego.cxx:162
 AliEveLego.cxx:163
 AliEveLego.cxx:164
 AliEveLego.cxx:165
 AliEveLego.cxx:166
 AliEveLego.cxx:167
 AliEveLego.cxx:168
 AliEveLego.cxx:169
 AliEveLego.cxx:170
 AliEveLego.cxx:171
 AliEveLego.cxx:172
 AliEveLego.cxx:173
 AliEveLego.cxx:174
 AliEveLego.cxx:175
 AliEveLego.cxx:176
 AliEveLego.cxx:177
 AliEveLego.cxx:178
 AliEveLego.cxx:179
 AliEveLego.cxx:180
 AliEveLego.cxx:181
 AliEveLego.cxx:182
 AliEveLego.cxx:183
 AliEveLego.cxx:184
 AliEveLego.cxx:185
 AliEveLego.cxx:186
 AliEveLego.cxx:187
 AliEveLego.cxx:188
 AliEveLego.cxx:189
 AliEveLego.cxx:190
 AliEveLego.cxx:191
 AliEveLego.cxx:192
 AliEveLego.cxx:193
 AliEveLego.cxx:194
 AliEveLego.cxx:195
 AliEveLego.cxx:196
 AliEveLego.cxx:197
 AliEveLego.cxx:198
 AliEveLego.cxx:199
 AliEveLego.cxx:200
 AliEveLego.cxx:201
 AliEveLego.cxx:202
 AliEveLego.cxx:203
 AliEveLego.cxx:204
 AliEveLego.cxx:205
 AliEveLego.cxx:206
 AliEveLego.cxx:207
 AliEveLego.cxx:208
 AliEveLego.cxx:209
 AliEveLego.cxx:210
 AliEveLego.cxx:211
 AliEveLego.cxx:212
 AliEveLego.cxx:213
 AliEveLego.cxx:214
 AliEveLego.cxx:215
 AliEveLego.cxx:216
 AliEveLego.cxx:217
 AliEveLego.cxx:218
 AliEveLego.cxx:219
 AliEveLego.cxx:220
 AliEveLego.cxx:221
 AliEveLego.cxx:222
 AliEveLego.cxx:223
 AliEveLego.cxx:224
 AliEveLego.cxx:225
 AliEveLego.cxx:226
 AliEveLego.cxx:227
 AliEveLego.cxx:228
 AliEveLego.cxx:229
 AliEveLego.cxx:230
 AliEveLego.cxx:231
 AliEveLego.cxx:232
 AliEveLego.cxx:233
 AliEveLego.cxx:234
 AliEveLego.cxx:235
 AliEveLego.cxx:236
 AliEveLego.cxx:237
 AliEveLego.cxx:238
 AliEveLego.cxx:239
 AliEveLego.cxx:240
 AliEveLego.cxx:241
 AliEveLego.cxx:242
 AliEveLego.cxx:243
 AliEveLego.cxx:244
 AliEveLego.cxx:245
 AliEveLego.cxx:246
 AliEveLego.cxx:247
 AliEveLego.cxx:248
 AliEveLego.cxx:249
 AliEveLego.cxx:250
 AliEveLego.cxx:251
 AliEveLego.cxx:252
 AliEveLego.cxx:253
 AliEveLego.cxx:254
 AliEveLego.cxx:255
 AliEveLego.cxx:256
 AliEveLego.cxx:257
 AliEveLego.cxx:258
 AliEveLego.cxx:259
 AliEveLego.cxx:260
 AliEveLego.cxx:261
 AliEveLego.cxx:262
 AliEveLego.cxx:263
 AliEveLego.cxx:264
 AliEveLego.cxx:265
 AliEveLego.cxx:266
 AliEveLego.cxx:267
 AliEveLego.cxx:268
 AliEveLego.cxx:269
 AliEveLego.cxx:270
 AliEveLego.cxx:271
 AliEveLego.cxx:272
 AliEveLego.cxx:273
 AliEveLego.cxx:274
 AliEveLego.cxx:275
 AliEveLego.cxx:276
 AliEveLego.cxx:277
 AliEveLego.cxx:278
 AliEveLego.cxx:279
 AliEveLego.cxx:280
 AliEveLego.cxx:281
 AliEveLego.cxx:282
 AliEveLego.cxx:283
 AliEveLego.cxx:284
 AliEveLego.cxx:285
 AliEveLego.cxx:286
 AliEveLego.cxx:287
 AliEveLego.cxx:288
 AliEveLego.cxx:289
 AliEveLego.cxx:290
 AliEveLego.cxx:291
 AliEveLego.cxx:292
 AliEveLego.cxx:293
 AliEveLego.cxx:294
 AliEveLego.cxx:295
 AliEveLego.cxx:296
 AliEveLego.cxx:297
 AliEveLego.cxx:298
 AliEveLego.cxx:299
 AliEveLego.cxx:300
 AliEveLego.cxx:301
 AliEveLego.cxx:302
 AliEveLego.cxx:303
 AliEveLego.cxx:304
 AliEveLego.cxx:305
 AliEveLego.cxx:306
 AliEveLego.cxx:307
 AliEveLego.cxx:308
 AliEveLego.cxx:309
 AliEveLego.cxx:310
 AliEveLego.cxx:311
 AliEveLego.cxx:312
 AliEveLego.cxx:313
 AliEveLego.cxx:314
 AliEveLego.cxx:315
 AliEveLego.cxx:316
 AliEveLego.cxx:317
 AliEveLego.cxx:318
 AliEveLego.cxx:319
 AliEveLego.cxx:320
 AliEveLego.cxx:321
 AliEveLego.cxx:322
 AliEveLego.cxx:323
 AliEveLego.cxx:324
 AliEveLego.cxx:325
 AliEveLego.cxx:326
 AliEveLego.cxx:327
 AliEveLego.cxx:328
 AliEveLego.cxx:329
 AliEveLego.cxx:330
 AliEveLego.cxx:331
 AliEveLego.cxx:332
 AliEveLego.cxx:333
 AliEveLego.cxx:334
 AliEveLego.cxx:335
 AliEveLego.cxx:336
 AliEveLego.cxx:337
 AliEveLego.cxx:338
 AliEveLego.cxx:339
 AliEveLego.cxx:340
 AliEveLego.cxx:341
 AliEveLego.cxx:342
 AliEveLego.cxx:343
 AliEveLego.cxx:344
 AliEveLego.cxx:345
 AliEveLego.cxx:346
 AliEveLego.cxx:347
 AliEveLego.cxx:348
 AliEveLego.cxx:349
 AliEveLego.cxx:350
 AliEveLego.cxx:351
 AliEveLego.cxx:352
 AliEveLego.cxx:353
 AliEveLego.cxx:354
 AliEveLego.cxx:355
 AliEveLego.cxx:356
 AliEveLego.cxx:357
 AliEveLego.cxx:358
 AliEveLego.cxx:359
 AliEveLego.cxx:360
 AliEveLego.cxx:361
 AliEveLego.cxx:362
 AliEveLego.cxx:363
 AliEveLego.cxx:364
 AliEveLego.cxx:365
 AliEveLego.cxx:366
 AliEveLego.cxx:367
 AliEveLego.cxx:368
 AliEveLego.cxx:369
 AliEveLego.cxx:370
 AliEveLego.cxx:371
 AliEveLego.cxx:372
 AliEveLego.cxx:373
 AliEveLego.cxx:374
 AliEveLego.cxx:375
 AliEveLego.cxx:376
 AliEveLego.cxx:377
 AliEveLego.cxx:378
 AliEveLego.cxx:379
 AliEveLego.cxx:380
 AliEveLego.cxx:381
 AliEveLego.cxx:382
 AliEveLego.cxx:383
 AliEveLego.cxx:384
 AliEveLego.cxx:385
 AliEveLego.cxx:386
 AliEveLego.cxx:387
 AliEveLego.cxx:388
 AliEveLego.cxx:389
 AliEveLego.cxx:390
 AliEveLego.cxx:391
 AliEveLego.cxx:392
 AliEveLego.cxx:393
 AliEveLego.cxx:394
 AliEveLego.cxx:395
 AliEveLego.cxx:396
 AliEveLego.cxx:397
 AliEveLego.cxx:398
 AliEveLego.cxx:399
 AliEveLego.cxx:400
 AliEveLego.cxx:401
 AliEveLego.cxx:402
 AliEveLego.cxx:403
 AliEveLego.cxx:404
 AliEveLego.cxx:405
 AliEveLego.cxx:406
 AliEveLego.cxx:407
 AliEveLego.cxx:408
 AliEveLego.cxx:409
 AliEveLego.cxx:410
 AliEveLego.cxx:411
 AliEveLego.cxx:412
 AliEveLego.cxx:413
 AliEveLego.cxx:414
 AliEveLego.cxx:415
 AliEveLego.cxx:416
 AliEveLego.cxx:417
 AliEveLego.cxx:418
 AliEveLego.cxx:419
 AliEveLego.cxx:420
 AliEveLego.cxx:421
 AliEveLego.cxx:422
 AliEveLego.cxx:423
 AliEveLego.cxx:424
 AliEveLego.cxx:425
 AliEveLego.cxx:426
 AliEveLego.cxx:427
 AliEveLego.cxx:428
 AliEveLego.cxx:429
 AliEveLego.cxx:430
 AliEveLego.cxx:431
 AliEveLego.cxx:432
 AliEveLego.cxx:433
 AliEveLego.cxx:434
 AliEveLego.cxx:435
 AliEveLego.cxx:436
 AliEveLego.cxx:437
 AliEveLego.cxx:438
 AliEveLego.cxx:439
 AliEveLego.cxx:440
 AliEveLego.cxx:441
 AliEveLego.cxx:442
 AliEveLego.cxx:443
 AliEveLego.cxx:444
 AliEveLego.cxx:445
 AliEveLego.cxx:446
 AliEveLego.cxx:447
 AliEveLego.cxx:448
 AliEveLego.cxx:449
 AliEveLego.cxx:450
 AliEveLego.cxx:451
 AliEveLego.cxx:452
 AliEveLego.cxx:453
 AliEveLego.cxx:454
 AliEveLego.cxx:455
 AliEveLego.cxx:456
 AliEveLego.cxx:457
 AliEveLego.cxx:458
 AliEveLego.cxx:459
 AliEveLego.cxx:460
 AliEveLego.cxx:461
 AliEveLego.cxx:462
 AliEveLego.cxx:463
 AliEveLego.cxx:464
 AliEveLego.cxx:465
 AliEveLego.cxx:466
 AliEveLego.cxx:467
 AliEveLego.cxx:468
 AliEveLego.cxx:469
 AliEveLego.cxx:470
 AliEveLego.cxx:471
 AliEveLego.cxx:472
 AliEveLego.cxx:473
 AliEveLego.cxx:474
 AliEveLego.cxx:475
 AliEveLego.cxx:476
 AliEveLego.cxx:477
 AliEveLego.cxx:478
 AliEveLego.cxx:479
 AliEveLego.cxx:480
 AliEveLego.cxx:481
 AliEveLego.cxx:482
 AliEveLego.cxx:483
 AliEveLego.cxx:484
 AliEveLego.cxx:485
 AliEveLego.cxx:486
 AliEveLego.cxx:487
 AliEveLego.cxx:488
 AliEveLego.cxx:489
 AliEveLego.cxx:490
 AliEveLego.cxx:491
 AliEveLego.cxx:492
 AliEveLego.cxx:493
 AliEveLego.cxx:494
 AliEveLego.cxx:495
 AliEveLego.cxx:496
 AliEveLego.cxx:497
 AliEveLego.cxx:498
 AliEveLego.cxx:499
 AliEveLego.cxx:500
 AliEveLego.cxx:501
 AliEveLego.cxx:502
 AliEveLego.cxx:503
 AliEveLego.cxx:504
 AliEveLego.cxx:505
 AliEveLego.cxx:506
 AliEveLego.cxx:507
 AliEveLego.cxx:508
 AliEveLego.cxx:509
 AliEveLego.cxx:510
 AliEveLego.cxx:511
 AliEveLego.cxx:512
 AliEveLego.cxx:513
 AliEveLego.cxx:514
 AliEveLego.cxx:515
 AliEveLego.cxx:516
 AliEveLego.cxx:517
 AliEveLego.cxx:518
 AliEveLego.cxx:519
 AliEveLego.cxx:520
 AliEveLego.cxx:521
 AliEveLego.cxx:522
 AliEveLego.cxx:523
 AliEveLego.cxx:524
 AliEveLego.cxx:525
 AliEveLego.cxx:526
 AliEveLego.cxx:527
 AliEveLego.cxx:528
 AliEveLego.cxx:529
 AliEveLego.cxx:530
 AliEveLego.cxx:531
 AliEveLego.cxx:532
 AliEveLego.cxx:533
 AliEveLego.cxx:534
 AliEveLego.cxx:535
 AliEveLego.cxx:536
 AliEveLego.cxx:537
 AliEveLego.cxx:538
 AliEveLego.cxx:539
 AliEveLego.cxx:540
 AliEveLego.cxx:541
 AliEveLego.cxx:542
 AliEveLego.cxx:543
 AliEveLego.cxx:544
 AliEveLego.cxx:545
 AliEveLego.cxx:546
 AliEveLego.cxx:547
 AliEveLego.cxx:548
 AliEveLego.cxx:549
 AliEveLego.cxx:550
 AliEveLego.cxx:551
 AliEveLego.cxx:552
 AliEveLego.cxx:553
 AliEveLego.cxx:554
 AliEveLego.cxx:555
 AliEveLego.cxx:556
 AliEveLego.cxx:557
 AliEveLego.cxx:558
 AliEveLego.cxx:559
 AliEveLego.cxx:560
 AliEveLego.cxx:561
 AliEveLego.cxx:562
 AliEveLego.cxx:563
 AliEveLego.cxx:564
 AliEveLego.cxx:565
 AliEveLego.cxx:566
 AliEveLego.cxx:567
 AliEveLego.cxx:568
 AliEveLego.cxx:569
 AliEveLego.cxx:570
 AliEveLego.cxx:571
 AliEveLego.cxx:572
 AliEveLego.cxx:573
 AliEveLego.cxx:574
 AliEveLego.cxx:575
 AliEveLego.cxx:576
 AliEveLego.cxx:577
 AliEveLego.cxx:578
 AliEveLego.cxx:579
 AliEveLego.cxx:580
 AliEveLego.cxx:581
 AliEveLego.cxx:582
 AliEveLego.cxx:583
 AliEveLego.cxx:584
 AliEveLego.cxx:585
 AliEveLego.cxx:586
 AliEveLego.cxx:587
 AliEveLego.cxx:588
 AliEveLego.cxx:589
 AliEveLego.cxx:590
 AliEveLego.cxx:591
 AliEveLego.cxx:592
 AliEveLego.cxx:593
 AliEveLego.cxx:594
 AliEveLego.cxx:595
 AliEveLego.cxx:596
 AliEveLego.cxx:597
 AliEveLego.cxx:598
 AliEveLego.cxx:599
 AliEveLego.cxx:600
 AliEveLego.cxx:601
 AliEveLego.cxx:602
 AliEveLego.cxx:603
 AliEveLego.cxx:604
 AliEveLego.cxx:605
 AliEveLego.cxx:606
 AliEveLego.cxx:607
 AliEveLego.cxx:608
 AliEveLego.cxx:609
 AliEveLego.cxx:610
 AliEveLego.cxx:611
 AliEveLego.cxx:612
 AliEveLego.cxx:613
 AliEveLego.cxx:614
 AliEveLego.cxx:615
 AliEveLego.cxx:616
 AliEveLego.cxx:617
 AliEveLego.cxx:618
 AliEveLego.cxx:619
 AliEveLego.cxx:620
 AliEveLego.cxx:621
 AliEveLego.cxx:622
 AliEveLego.cxx:623
 AliEveLego.cxx:624
 AliEveLego.cxx:625
 AliEveLego.cxx:626
 AliEveLego.cxx:627
 AliEveLego.cxx:628
 AliEveLego.cxx:629
 AliEveLego.cxx:630
 AliEveLego.cxx:631
 AliEveLego.cxx:632
 AliEveLego.cxx:633
 AliEveLego.cxx:634
 AliEveLego.cxx:635
 AliEveLego.cxx:636
 AliEveLego.cxx:637
 AliEveLego.cxx:638
 AliEveLego.cxx:639
 AliEveLego.cxx:640
 AliEveLego.cxx:641
 AliEveLego.cxx:642
 AliEveLego.cxx:643
 AliEveLego.cxx:644
 AliEveLego.cxx:645
 AliEveLego.cxx:646
 AliEveLego.cxx:647
 AliEveLego.cxx:648
 AliEveLego.cxx:649
 AliEveLego.cxx:650
 AliEveLego.cxx:651
 AliEveLego.cxx:652
 AliEveLego.cxx:653
 AliEveLego.cxx:654
 AliEveLego.cxx:655
 AliEveLego.cxx:656
 AliEveLego.cxx:657
 AliEveLego.cxx:658
 AliEveLego.cxx:659
 AliEveLego.cxx:660
 AliEveLego.cxx:661
 AliEveLego.cxx:662
 AliEveLego.cxx:663
 AliEveLego.cxx:664
 AliEveLego.cxx:665
 AliEveLego.cxx:666
 AliEveLego.cxx:667
 AliEveLego.cxx:668
 AliEveLego.cxx:669
 AliEveLego.cxx:670
 AliEveLego.cxx:671
 AliEveLego.cxx:672
 AliEveLego.cxx:673
 AliEveLego.cxx:674
 AliEveLego.cxx:675
 AliEveLego.cxx:676
 AliEveLego.cxx:677
 AliEveLego.cxx:678
 AliEveLego.cxx:679
 AliEveLego.cxx:680
 AliEveLego.cxx:681
 AliEveLego.cxx:682
 AliEveLego.cxx:683
 AliEveLego.cxx:684
 AliEveLego.cxx:685
 AliEveLego.cxx:686
 AliEveLego.cxx:687
 AliEveLego.cxx:688
 AliEveLego.cxx:689
 AliEveLego.cxx:690
 AliEveLego.cxx:691
 AliEveLego.cxx:692
 AliEveLego.cxx:693
 AliEveLego.cxx:694
 AliEveLego.cxx:695
 AliEveLego.cxx:696
 AliEveLego.cxx:697
 AliEveLego.cxx:698
 AliEveLego.cxx:699
 AliEveLego.cxx:700
 AliEveLego.cxx:701
 AliEveLego.cxx:702
 AliEveLego.cxx:703
 AliEveLego.cxx:704
 AliEveLego.cxx:705
 AliEveLego.cxx:706
 AliEveLego.cxx:707
 AliEveLego.cxx:708
 AliEveLego.cxx:709
 AliEveLego.cxx:710
 AliEveLego.cxx:711
 AliEveLego.cxx:712
 AliEveLego.cxx:713
 AliEveLego.cxx:714
 AliEveLego.cxx:715
 AliEveLego.cxx:716
 AliEveLego.cxx:717
 AliEveLego.cxx:718
 AliEveLego.cxx:719
 AliEveLego.cxx:720
 AliEveLego.cxx:721
 AliEveLego.cxx:722
 AliEveLego.cxx:723
 AliEveLego.cxx:724
 AliEveLego.cxx:725
 AliEveLego.cxx:726
 AliEveLego.cxx:727
 AliEveLego.cxx:728
 AliEveLego.cxx:729
 AliEveLego.cxx:730
 AliEveLego.cxx:731
 AliEveLego.cxx:732
 AliEveLego.cxx:733
 AliEveLego.cxx:734
 AliEveLego.cxx:735
 AliEveLego.cxx:736
 AliEveLego.cxx:737
 AliEveLego.cxx:738
 AliEveLego.cxx:739
 AliEveLego.cxx:740
 AliEveLego.cxx:741
 AliEveLego.cxx:742
 AliEveLego.cxx:743
 AliEveLego.cxx:744
 AliEveLego.cxx:745
 AliEveLego.cxx:746
 AliEveLego.cxx:747
 AliEveLego.cxx:748
 AliEveLego.cxx:749
 AliEveLego.cxx:750
 AliEveLego.cxx:751
 AliEveLego.cxx:752
 AliEveLego.cxx:753
 AliEveLego.cxx:754
 AliEveLego.cxx:755
 AliEveLego.cxx:756
 AliEveLego.cxx:757
 AliEveLego.cxx:758
 AliEveLego.cxx:759
 AliEveLego.cxx:760
 AliEveLego.cxx:761
 AliEveLego.cxx:762
 AliEveLego.cxx:763
 AliEveLego.cxx:764
 AliEveLego.cxx:765
 AliEveLego.cxx:766
 AliEveLego.cxx:767
 AliEveLego.cxx:768
 AliEveLego.cxx:769
 AliEveLego.cxx:770
 AliEveLego.cxx:771
 AliEveLego.cxx:772
 AliEveLego.cxx:773
 AliEveLego.cxx:774
 AliEveLego.cxx:775
 AliEveLego.cxx:776
 AliEveLego.cxx:777
 AliEveLego.cxx:778
 AliEveLego.cxx:779
 AliEveLego.cxx:780
 AliEveLego.cxx:781
 AliEveLego.cxx:782
 AliEveLego.cxx:783
 AliEveLego.cxx:784
 AliEveLego.cxx:785
 AliEveLego.cxx:786
 AliEveLego.cxx:787
 AliEveLego.cxx:788
 AliEveLego.cxx:789
 AliEveLego.cxx:790
 AliEveLego.cxx:791
 AliEveLego.cxx:792
 AliEveLego.cxx:793
 AliEveLego.cxx:794
 AliEveLego.cxx:795
 AliEveLego.cxx:796
 AliEveLego.cxx:797
 AliEveLego.cxx:798
 AliEveLego.cxx:799
 AliEveLego.cxx:800
 AliEveLego.cxx:801
 AliEveLego.cxx:802
 AliEveLego.cxx:803
 AliEveLego.cxx:804
 AliEveLego.cxx:805
 AliEveLego.cxx:806
 AliEveLego.cxx:807
 AliEveLego.cxx:808
 AliEveLego.cxx:809
 AliEveLego.cxx:810
 AliEveLego.cxx:811
 AliEveLego.cxx:812
 AliEveLego.cxx:813
 AliEveLego.cxx:814
 AliEveLego.cxx:815
 AliEveLego.cxx:816
 AliEveLego.cxx:817
 AliEveLego.cxx:818
 AliEveLego.cxx:819
 AliEveLego.cxx:820
 AliEveLego.cxx:821
 AliEveLego.cxx:822
 AliEveLego.cxx:823
 AliEveLego.cxx:824
 AliEveLego.cxx:825
 AliEveLego.cxx:826
 AliEveLego.cxx:827
 AliEveLego.cxx:828
 AliEveLego.cxx:829
 AliEveLego.cxx:830
 AliEveLego.cxx:831
 AliEveLego.cxx:832
 AliEveLego.cxx:833
 AliEveLego.cxx:834
 AliEveLego.cxx:835
 AliEveLego.cxx:836
 AliEveLego.cxx:837
 AliEveLego.cxx:838
 AliEveLego.cxx:839
 AliEveLego.cxx:840
 AliEveLego.cxx:841
 AliEveLego.cxx:842
 AliEveLego.cxx:843
 AliEveLego.cxx:844
 AliEveLego.cxx:845
 AliEveLego.cxx:846
 AliEveLego.cxx:847
 AliEveLego.cxx:848
 AliEveLego.cxx:849
 AliEveLego.cxx:850
 AliEveLego.cxx:851
 AliEveLego.cxx:852
 AliEveLego.cxx:853
 AliEveLego.cxx:854
 AliEveLego.cxx:855
 AliEveLego.cxx:856
 AliEveLego.cxx:857
 AliEveLego.cxx:858
 AliEveLego.cxx:859
 AliEveLego.cxx:860
 AliEveLego.cxx:861
 AliEveLego.cxx:862
 AliEveLego.cxx:863
 AliEveLego.cxx:864
 AliEveLego.cxx:865
 AliEveLego.cxx:866
 AliEveLego.cxx:867
 AliEveLego.cxx:868
 AliEveLego.cxx:869
 AliEveLego.cxx:870
 AliEveLego.cxx:871
 AliEveLego.cxx:872
 AliEveLego.cxx:873
 AliEveLego.cxx:874
 AliEveLego.cxx:875
 AliEveLego.cxx:876
 AliEveLego.cxx:877
 AliEveLego.cxx:878
 AliEveLego.cxx:879
 AliEveLego.cxx:880
 AliEveLego.cxx:881
 AliEveLego.cxx:882
 AliEveLego.cxx:883
 AliEveLego.cxx:884
 AliEveLego.cxx:885
 AliEveLego.cxx:886
 AliEveLego.cxx:887
 AliEveLego.cxx:888
 AliEveLego.cxx:889
 AliEveLego.cxx:890
 AliEveLego.cxx:891
 AliEveLego.cxx:892
 AliEveLego.cxx:893
 AliEveLego.cxx:894
 AliEveLego.cxx:895
 AliEveLego.cxx:896
 AliEveLego.cxx:897
 AliEveLego.cxx:898
 AliEveLego.cxx:899
 AliEveLego.cxx:900
 AliEveLego.cxx:901
 AliEveLego.cxx:902
 AliEveLego.cxx:903
 AliEveLego.cxx:904
 AliEveLego.cxx:905
 AliEveLego.cxx:906
 AliEveLego.cxx:907
 AliEveLego.cxx:908
 AliEveLego.cxx:909
 AliEveLego.cxx:910
 AliEveLego.cxx:911
 AliEveLego.cxx:912
 AliEveLego.cxx:913
 AliEveLego.cxx:914
 AliEveLego.cxx:915
 AliEveLego.cxx:916
 AliEveLego.cxx:917
 AliEveLego.cxx:918
 AliEveLego.cxx:919
 AliEveLego.cxx:920
 AliEveLego.cxx:921
 AliEveLego.cxx:922
 AliEveLego.cxx:923
 AliEveLego.cxx:924
 AliEveLego.cxx:925
 AliEveLego.cxx:926
 AliEveLego.cxx:927
 AliEveLego.cxx:928
 AliEveLego.cxx:929
 AliEveLego.cxx:930
 AliEveLego.cxx:931
 AliEveLego.cxx:932
 AliEveLego.cxx:933
 AliEveLego.cxx:934
 AliEveLego.cxx:935
 AliEveLego.cxx:936
 AliEveLego.cxx:937
 AliEveLego.cxx:938
 AliEveLego.cxx:939
 AliEveLego.cxx:940
 AliEveLego.cxx:941
 AliEveLego.cxx:942
 AliEveLego.cxx:943
 AliEveLego.cxx:944
 AliEveLego.cxx:945
 AliEveLego.cxx:946
 AliEveLego.cxx:947
 AliEveLego.cxx:948
 AliEveLego.cxx:949
 AliEveLego.cxx:950
 AliEveLego.cxx:951
 AliEveLego.cxx:952
 AliEveLego.cxx:953
 AliEveLego.cxx:954
 AliEveLego.cxx:955
 AliEveLego.cxx:956
 AliEveLego.cxx:957
 AliEveLego.cxx:958
 AliEveLego.cxx:959
 AliEveLego.cxx:960
 AliEveLego.cxx:961
 AliEveLego.cxx:962
 AliEveLego.cxx:963
 AliEveLego.cxx:964
 AliEveLego.cxx:965
 AliEveLego.cxx:966
 AliEveLego.cxx:967
 AliEveLego.cxx:968
 AliEveLego.cxx:969
 AliEveLego.cxx:970
 AliEveLego.cxx:971
 AliEveLego.cxx:972
 AliEveLego.cxx:973
 AliEveLego.cxx:974
 AliEveLego.cxx:975
 AliEveLego.cxx:976