// @(#)root/eve:$Id$
// Author: Matevz Tadel 2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TEveCalo2DGL.h"
#include "TEveCalo.h"
#include "TEveProjections.h"
#include "TEveProjectionManager.h"
#include "TEveRGBAPalette.h"

#include "TGLRnrCtx.h"
#include "TGLPhysicalShape.h"
#include "TGLSelectRecord.h"
#include "TGLIncludes.h"
#include "TGLUtil.h"
#include "TAxis.h"

//______________________________________________________________________________
// OpenGL renderer class for TEveCalo2D.
//

ClassImp(TEveCalo2DGL);

//______________________________________________________________________________
TEveCalo2DGL::TEveCalo2DGL() :
   TGLObject(),
   fM(0)
{
   // Constructor.

   // fDLCache = kFALSE; // Disable display list.
   fMultiColor = kTRUE;
}

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

//______________________________________________________________________________
Bool_t TEveCalo2DGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
   // Set model object.

   fM = SetModelDynCast<TEveCalo2D>(obj);
   return kTRUE;
}

//______________________________________________________________________________
void TEveCalo2DGL::SetBBox()
{
   // Set bounding box.

   SetAxisAlignedBBox(((TEveCalo2D*)fExternalObj)->AssertBBox());
}

/******************************************************************************/
//______________________________________________________________________________
Bool_t TEveCalo2DGL::IsRPhi() const
{
   // Is current projection type RPhi

   return fM->fManager->GetProjection()->GetType() == TEveProjection::kPT_RPhi;
}

//______________________________________________________________________________
void TEveCalo2DGL::MakeRPhiCell(Float_t phiMin, Float_t phiMax,
                                   Float_t towerH, Float_t offset) const
{
   // Calculate vertices for the calorimeter cell in RPhi projection.
   // Returns outside radius of the tower.

   using namespace TMath;

   Float_t r1 = fM->fBarrelRadius + offset;
   Float_t r2 = r1 + towerH;

   Float_t pnts[8];

   pnts[0] = r1*Cos(phiMin); pnts[1] = r1*Sin(phiMin);
   pnts[2] = r2*Cos(phiMin); pnts[3] = r2*Sin(phiMin);
   pnts[4] = r2*Cos(phiMax); pnts[5] = r2*Sin(phiMax);
   pnts[6] = r1*Cos(phiMax); pnts[7] = r1*Sin(phiMax);

   Float_t x, y, z;
   glBegin(GL_QUADS);
   for (Int_t i = 0; i < 4; ++i)
   {
      x = pnts[2*i];
      y = pnts[2*i+1];
      z = 0.f;
      fM->fManager->GetProjection()->ProjectPoint(x, y, z, fM->fDepth);
      glVertex3f(x, y, z);
   }
   glEnd();
}

//______________________________________________________________________________
void TEveCalo2DGL::DrawRPhi(TGLRnrCtx & rnrCtx, TEveCalo2D::vBinCells_t& cellLists) const
{
   // Draw calorimeter cells in RPhi projection.

   TEveCaloData* data = fM->GetData();
   Int_t    nSlices  = data->GetNSlices();
   Float_t *sliceVal = new Float_t[nSlices];
   TEveCaloData::CellData_t cellData;
   Float_t towerH;

   UInt_t nPhi = data->GetPhiBins()->GetNbins();
   TAxis* axis = data->GetPhiBins();
   for(UInt_t phiBin = 1; phiBin <= nPhi; ++phiBin)
   {
      if (cellLists[phiBin] )
      {
         // reset values
         Float_t off = 0;
         for (Int_t s=0; s<nSlices; ++s)
            sliceVal[s] = 0;

         // sum eta cells
         TEveCaloData::vCellId_t* cids = cellLists[phiBin];
         for (TEveCaloData::vCellId_i it = cids->begin(); it != cids->end(); it++)
         {
            data->GetCellData(*it, cellData);
            sliceVal[(*it).fSlice] += cellData.Value(fM->fPlotEt)*(*it).fFraction;
         }

         if (rnrCtx.SecSelection()) {
            glLoadName(phiBin); // set name-stack phi bin
            glPushName(0);
         }
         for (Int_t s = 0; s < nSlices; ++s)
         {
            if (rnrCtx.SecSelection())  glLoadName(s); // set name-stack slice
            fM->SetupColorHeight(sliceVal[s], s, towerH);
            MakeRPhiCell(axis->GetBinLowEdge(phiBin), axis->GetBinUpEdge(phiBin), towerH, off);
            off += towerH;
         }
         if (rnrCtx.SecSelection()) glPopName(); // slice
      }
   }

   delete [] sliceVal;
}

//______________________________________________________________________________
void TEveCalo2DGL::DrawRPhiHighlighted(std::vector<TEveCaloData::vCellId_t*>& cellLists) const
{
   // Draw selected calorimeter cells in RPhi projection.

   static const TEveException eh("TEveCalo2DGL::DrawRPhiHighlighted ");

   TEveCaloData* data = fM->fData;
   TEveCaloData::CellData_t cellData;
   Int_t  nSlices  = data->GetNSlices();
   UInt_t nPhiBins = data->GetPhiBins()->GetNbins();
   Float_t *sliceVal    = new Float_t[nSlices];
   Float_t *sliceValRef = new Float_t[nSlices];
   Float_t  towerH, towerHRef;

   TAxis* axis = data->GetPhiBins();
   for(UInt_t phiBin = 1; phiBin <= nPhiBins; ++phiBin)
   {
      if (cellLists[phiBin])
      {
         if (!fM->fCellLists[phiBin])
            throw eh + "selected cell not in cell list cache.";

         Float_t off = 0;
         // selected eta sum
         for (Int_t s=0; s<nSlices; ++s) sliceVal[s] = 0;
         TEveCaloData::vCellId_t& cids = *(cellLists[phiBin]);
         for (TEveCaloData::vCellId_i i=cids.begin(); i!=cids.end(); i++) {
            data->GetCellData((*i), cellData);
            sliceVal[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
         }
         // referenced eta sum
         for (Int_t s=0; s<nSlices; ++s) sliceValRef[s] = 0;
         TEveCaloData::vCellId_t& cidsRef = *(fM->fCellLists[phiBin]);
         for (TEveCaloData::vCellId_i i=cidsRef.begin(); i!=cidsRef.end(); i++) {
            data->GetCellData(*i, cellData);
            sliceValRef[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
         }
         // draw
         for (Int_t s = 0; s < nSlices; ++s)  {
            fM->SetupColorHeight(sliceValRef[s], s, towerHRef);
            if (sliceVal[s] > 0)
            {
               fM->SetupColorHeight(sliceVal[s], s, towerH);
               MakeRPhiCell(axis->GetBinLowEdge(phiBin), axis->GetBinUpEdge(phiBin), towerH, off);
            }
            off += towerHRef;
         }
      }
   }

   delete [] sliceVal;
   delete [] sliceValRef;
}


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

//______________________________________________________________________________
void TEveCalo2DGL::MakeRhoZCell(Float_t thetaMin, Float_t thetaMax,
                                Float_t& offset, Bool_t isBarrel,  Bool_t phiPlus, Float_t towerH) const
{
   // Draw cell in RhoZ projection.

   using namespace TMath;

   Float_t pnts[8];

   Float_t sin1 = Sin(thetaMin);
   Float_t cos1 = Cos(thetaMin);
   Float_t sin2 = Sin(thetaMax);
   Float_t cos2 = Cos(thetaMax);

   if (isBarrel)
   {
      Float_t r1 = fM->fBarrelRadius/Abs(Sin(0.5f*(thetaMin+thetaMax))) + offset;
      Float_t r2 = r1 + towerH;

      pnts[0] = r1*sin1; pnts[1] = r1*cos1;
      pnts[2] = r2*sin1; pnts[3] = r2*cos1;
      pnts[4] = r2*sin2; pnts[5] = r2*cos2;
      pnts[6] = r1*sin2; pnts[7] = r1*cos2;
   }
   else
   {
      // endcap
      Float_t zE = fM->GetForwardEndCapPos();
      // uses a different theta definition than GetTransitionThetaBackward(), so we need a conversion
      Float_t transThetaB = TEveCaloData::EtaToTheta(fM->GetTransitionEtaBackward());
      if (thetaMax >= transThetaB)
         zE = Abs(fM->GetBackwardEndCapPos());
      Float_t r1 = zE/Abs(Cos(0.5f*(thetaMin+thetaMax))) + offset;
      Float_t r2 = r1 + towerH;

      pnts[0] = r1*sin1; pnts[1] = r1*cos1;
      pnts[2] = r2*sin1; pnts[3] = r2*cos1;
      pnts[4] = r2*sin2; pnts[5] = r2*cos2;
      pnts[6] = r1*sin2; pnts[7] = r1*cos2;
   }

   glBegin(GL_QUADS);
   Float_t x, y, z;
   for (Int_t i = 0; i < 4; ++i)
   {
      x = 0.f;
      y = phiPlus ? Abs(pnts[2*i]) : -Abs(pnts[2*i]);
      z = pnts[2*i+1];
      fM->fManager->GetProjection()->ProjectPoint(x, y, z, fM->fDepth);
      glVertex3f(x, y, z);
   }
   glEnd();
}

//______________________________________________________________________________
void TEveCalo2DGL::DrawRhoZ(TGLRnrCtx & rnrCtx, TEveCalo2D::vBinCells_t& cellLists) const
{
   // Draw calorimeter in RhoZ projection.

   TEveCaloData* data = fM->GetData();
   Int_t nSlices = data->GetNSlices();

   TEveCaloData::CellData_t cellData;
   Float_t *sliceValsUp  = new Float_t[nSlices];
   Float_t *sliceValsLow = new Float_t[nSlices];
   Bool_t   isBarrel;
   Float_t  towerH;
   Float_t transEtaF = fM->GetTransitionEtaForward();
   Float_t transEtaB = fM->GetTransitionEtaBackward();

   TAxis* axis = data->GetEtaBins();
   UInt_t nEta = axis->GetNbins();
   for (UInt_t etaBin = 1; etaBin <= nEta; ++etaBin)
   {
      if (cellLists[etaBin] )
      {
         assert(fM->fCellLists[etaBin]);
         Float_t etaMin = axis->GetBinLowEdge(etaBin);
         Float_t etaMax = axis->GetBinUpEdge(etaBin);
         Float_t thetaMin = TEveCaloData::EtaToTheta(etaMax);
         Float_t thetaMax = TEveCaloData::EtaToTheta(etaMin);

         // clear
         Float_t offUp  = 0;
         Float_t offLow = 0;
         for (Int_t s = 0; s < nSlices; ++s) {
            sliceValsUp [s] = 0;
            sliceValsLow[s] = 0;
         }
         // values
         TEveCaloData::vCellId_t* cids = cellLists[etaBin];
         for (TEveCaloData::vCellId_i it = cids->begin(); it != cids->end(); ++it)
         {
            data->GetCellData(*it, cellData);
            if (cellData.IsUpperRho())
               sliceValsUp [it->fSlice] += cellData.Value(fM->fPlotEt)*(*it).fFraction;
            else
               sliceValsLow[it->fSlice] += cellData.Value(fM->fPlotEt)*(*it).fFraction;
         }

         isBarrel = !(etaMax > 0 && etaMax > transEtaF) && !(etaMin < 0 && etaMin < transEtaB);

         // draw
         if (rnrCtx.SecSelection()) glLoadName(etaBin); // name-stack eta bin
         if (rnrCtx.SecSelection()) glPushName(0);

         for (Int_t s = 0; s < nSlices; ++s)
         {
            if (rnrCtx.SecSelection()) glLoadName(s);  // name-stack slice
            if (rnrCtx.SecSelection()) glPushName(0);
            //  phi +
            if (sliceValsUp[s])
            {
               if (rnrCtx.SecSelection()) glLoadName(1);  // name-stack phi sign
               fM->SetupColorHeight(sliceValsUp[s], s, towerH);
               MakeRhoZCell(thetaMin, thetaMax, offUp, isBarrel, kTRUE , towerH);
               offUp += towerH;
            }
            // phi -
            if (sliceValsLow[s])
            {
               if (rnrCtx.SecSelection()) glLoadName(0);  // name-stack phi sign
               fM->SetupColorHeight(sliceValsLow[s], s, towerH);
               MakeRhoZCell(thetaMin, thetaMax, offLow, isBarrel, kFALSE , towerH);
               offLow += towerH;
            }
            if (rnrCtx.SecSelection())  glPopName(); // phi sign is pos
         }
         //
         if (rnrCtx.SecSelection())  glPopName(); // slice
      }
   }

   delete [] sliceValsUp;
   delete [] sliceValsLow;
}

//______________________________________________________________________________
void TEveCalo2DGL::DrawRhoZHighlighted(std::vector<TEveCaloData::vCellId_t*>& cellLists) const
{
   // Draw selected calorimeter cells in RhoZ projection.

   static const TEveException eh("TEveCalo2DGL::DrawRhoZHighlighted ");

   TEveCaloData* data = fM->GetData();
   TAxis* axis        = data->GetEtaBins();
   UInt_t nEtaBins    = axis->GetNbins();
   Int_t  nSlices     = data->GetNSlices();
   Float_t transEtaF = fM->GetTransitionEtaForward();
   Float_t transEtaB = fM->GetTransitionEtaBackward();

   Float_t *sliceValsUp     = new Float_t[nSlices];
   Float_t *sliceValsLow    = new Float_t[nSlices];
   Float_t *sliceValsUpRef  = new Float_t[nSlices];
   Float_t *sliceValsLowRef = new Float_t[nSlices];

   Bool_t   isBarrel;
   Float_t  towerH, towerHRef, offUp, offLow;
   TEveCaloData::CellData_t cellData;

   for (UInt_t etaBin = 1; etaBin <= nEtaBins; ++etaBin)
   {
      if (cellLists[etaBin])
      {
         if (!fM->fCellLists[etaBin])
            throw(eh + "selected cell not in cell list cache.");

         offUp = 0; offLow =0;
         // selected phi sum
         for (Int_t s = 0; s < nSlices; ++s) {
            sliceValsUp[s] = 0; sliceValsLow[s] = 0;
         }
         TEveCaloData::vCellId_t& cids = *(cellLists[etaBin]);
         for (TEveCaloData::vCellId_i i=cids.begin(); i!=cids.end(); i++) {
            data->GetCellData(*i, cellData);
            if (cellData.IsUpperRho())
               sliceValsUp [i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
            else
               sliceValsLow[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
         }

         // reference phi sum
         for (Int_t s = 0; s < nSlices; ++s)
         {
            sliceValsUpRef[s] = 0; sliceValsLowRef[s] = 0;
         }
         TEveCaloData::vCellId_t& cidsRef = *(fM->fCellLists[etaBin]);
         for (TEveCaloData::vCellId_i i=cidsRef.begin(); i!=cidsRef.end(); i++)
         {
            data->GetCellData(*i, cellData);
            if (cellData.IsUpperRho())
               sliceValsUpRef [i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
            else
               sliceValsLowRef[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
         }

         Float_t bincenterEta = axis->GetBinCenter(etaBin);
         isBarrel = !(bincenterEta > 0 && bincenterEta > transEtaF) && !(bincenterEta < 0 && bincenterEta < transEtaB);

         for (Int_t s = 0; s < nSlices; ++s)
         {
            Float_t thetaMin = TEveCaloData::EtaToTheta(axis->GetBinUpEdge(etaBin));
            Float_t thetaMax = TEveCaloData::EtaToTheta(axis->GetBinLowEdge(etaBin));
            //  phi +
            fM->SetupColorHeight(sliceValsUpRef[s], s, towerHRef);
            if (sliceValsUp[s] > 0) {
               fM->SetupColorHeight(sliceValsUp[s], s, towerH);
               MakeRhoZCell(thetaMin, thetaMax, offUp, isBarrel, kTRUE , towerH);
            }
            offUp += towerHRef;

            // phi -
            fM->SetupColorHeight(sliceValsLowRef[s], s, towerHRef);
            if (sliceValsLow[s] > 0) {
               fM->SetupColorHeight(sliceValsLow[s], s, towerH);
               MakeRhoZCell(thetaMin, thetaMax, offLow, isBarrel, kFALSE , towerH);
            }
            offLow += towerHRef;
         } // slices
      } // if eta bin
   } //eta bin

   delete [] sliceValsUp;
   delete [] sliceValsLow;
   delete [] sliceValsUpRef;
   delete [] sliceValsLowRef;
}

//______________________________________________________________________________
void TEveCalo2DGL::DirectDraw(TGLRnrCtx & rnrCtx) const
{
   // Render with OpenGL.

   TGLCapabilitySwitch light_off(GL_LIGHTING,  kFALSE);
   TGLCapabilitySwitch cull_off (GL_CULL_FACE, kFALSE);

   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   if (fM->fCellIdCacheOK == kFALSE)
      fM->BuildCellIdCache();

   fM->AssertPalette();

   if (rnrCtx.SecSelection()) glPushName(0);
   if (IsRPhi())
      DrawRPhi(rnrCtx, fM->fCellLists);
   else
      DrawRhoZ(rnrCtx, fM->fCellLists);
   if (rnrCtx.SecSelection()) glPopName();
   glPopAttrib();
}

//______________________________________________________________________________
void TEveCalo2DGL::DrawHighlight(TGLRnrCtx& rnrCtx, const TGLPhysicalShape* /*pshp*/, Int_t /*lvl*/) const
{
   // Draw towers in highlight mode.

   static const TEveException eh("TEveCalo2DGL::DrawHighlight ");

   if (fM->fData->GetCellsSelected().empty() && fM->fData->GetCellsHighlighted().empty())
   {
      return;
   }

   TGLCapabilitySwitch cull_off (GL_CULL_FACE, kFALSE);

   TGLUtil::LockColor();
   try
   {
      if (!fM->fData->GetCellsHighlighted().empty())
      {
         glColor4ubv(rnrCtx.ColorSet().Selection(3).CArr());

         if (IsRPhi())
            DrawRPhiHighlighted(fM->fCellListsHighlighted);
         else
            DrawRhoZHighlighted(fM->fCellListsHighlighted);
      }
      if (!fM->fData->GetCellsSelected().empty())
      {
         glColor4ubv(rnrCtx.ColorSet().Selection(1).CArr());
         if (IsRPhi())
            DrawRPhiHighlighted(fM->fCellListsSelected);
         else
            DrawRhoZHighlighted(fM->fCellListsSelected);

      }
   }
   catch (TEveException& exc)
   {
      Warning(eh, "%s", exc.what());
   }
   TGLUtil::UnlockColor();
}

//______________________________________________________________________________
void TEveCalo2DGL::ProcessSelection(TGLRnrCtx & /*rnrCtx*/, TGLSelectRecord & rec)
{
   // Processes tower selection in eta bin or phi bin.
   // Virtual function from TGLogicalShape. Called from TGLViewer.

   TEveCaloData::vCellId_t sel;
   if (rec.GetN() > 2)
   {
      Int_t bin   = rec.GetItem(1);
      Int_t slice = rec.GetItem(2);
      for (TEveCaloData::vCellId_i it = fM->fCellLists[bin]->begin();
           it != fM->fCellLists[bin]->end(); ++it)
      {
         if ((*it).fSlice == slice)
         {
            if (IsRPhi())
            {
               sel.push_back(*it);
            }
            else
            {
               assert(rec.GetN() > 3);
               Bool_t is_upper = (rec.GetItem(3) == 1);
               TEveCaloData::CellData_t cd;
               fM->fData->GetCellData(*it, cd);
               if ((is_upper && cd.IsUpperRho()) || (!is_upper && !cd.IsUpperRho()))
                  sel.push_back(*it);
            }
         }
      }
   }
   fM->fData->ProcessSelection(sel, rec);
}
 TEveCalo2DGL.cxx:1
 TEveCalo2DGL.cxx:2
 TEveCalo2DGL.cxx:3
 TEveCalo2DGL.cxx:4
 TEveCalo2DGL.cxx:5
 TEveCalo2DGL.cxx:6
 TEveCalo2DGL.cxx:7
 TEveCalo2DGL.cxx:8
 TEveCalo2DGL.cxx:9
 TEveCalo2DGL.cxx:10
 TEveCalo2DGL.cxx:11
 TEveCalo2DGL.cxx:12
 TEveCalo2DGL.cxx:13
 TEveCalo2DGL.cxx:14
 TEveCalo2DGL.cxx:15
 TEveCalo2DGL.cxx:16
 TEveCalo2DGL.cxx:17
 TEveCalo2DGL.cxx:18
 TEveCalo2DGL.cxx:19
 TEveCalo2DGL.cxx:20
 TEveCalo2DGL.cxx:21
 TEveCalo2DGL.cxx:22
 TEveCalo2DGL.cxx:23
 TEveCalo2DGL.cxx:24
 TEveCalo2DGL.cxx:25
 TEveCalo2DGL.cxx:26
 TEveCalo2DGL.cxx:27
 TEveCalo2DGL.cxx:28
 TEveCalo2DGL.cxx:29
 TEveCalo2DGL.cxx:30
 TEveCalo2DGL.cxx:31
 TEveCalo2DGL.cxx:32
 TEveCalo2DGL.cxx:33
 TEveCalo2DGL.cxx:34
 TEveCalo2DGL.cxx:35
 TEveCalo2DGL.cxx:36
 TEveCalo2DGL.cxx:37
 TEveCalo2DGL.cxx:38
 TEveCalo2DGL.cxx:39
 TEveCalo2DGL.cxx:40
 TEveCalo2DGL.cxx:41
 TEveCalo2DGL.cxx:42
 TEveCalo2DGL.cxx:43
 TEveCalo2DGL.cxx:44
 TEveCalo2DGL.cxx:45
 TEveCalo2DGL.cxx:46
 TEveCalo2DGL.cxx:47
 TEveCalo2DGL.cxx:48
 TEveCalo2DGL.cxx:49
 TEveCalo2DGL.cxx:50
 TEveCalo2DGL.cxx:51
 TEveCalo2DGL.cxx:52
 TEveCalo2DGL.cxx:53
 TEveCalo2DGL.cxx:54
 TEveCalo2DGL.cxx:55
 TEveCalo2DGL.cxx:56
 TEveCalo2DGL.cxx:57
 TEveCalo2DGL.cxx:58
 TEveCalo2DGL.cxx:59
 TEveCalo2DGL.cxx:60
 TEveCalo2DGL.cxx:61
 TEveCalo2DGL.cxx:62
 TEveCalo2DGL.cxx:63
 TEveCalo2DGL.cxx:64
 TEveCalo2DGL.cxx:65
 TEveCalo2DGL.cxx:66
 TEveCalo2DGL.cxx:67
 TEveCalo2DGL.cxx:68
 TEveCalo2DGL.cxx:69
 TEveCalo2DGL.cxx:70
 TEveCalo2DGL.cxx:71
 TEveCalo2DGL.cxx:72
 TEveCalo2DGL.cxx:73
 TEveCalo2DGL.cxx:74
 TEveCalo2DGL.cxx:75
 TEveCalo2DGL.cxx:76
 TEveCalo2DGL.cxx:77
 TEveCalo2DGL.cxx:78
 TEveCalo2DGL.cxx:79
 TEveCalo2DGL.cxx:80
 TEveCalo2DGL.cxx:81
 TEveCalo2DGL.cxx:82
 TEveCalo2DGL.cxx:83
 TEveCalo2DGL.cxx:84
 TEveCalo2DGL.cxx:85
 TEveCalo2DGL.cxx:86
 TEveCalo2DGL.cxx:87
 TEveCalo2DGL.cxx:88
 TEveCalo2DGL.cxx:89
 TEveCalo2DGL.cxx:90
 TEveCalo2DGL.cxx:91
 TEveCalo2DGL.cxx:92
 TEveCalo2DGL.cxx:93
 TEveCalo2DGL.cxx:94
 TEveCalo2DGL.cxx:95
 TEveCalo2DGL.cxx:96
 TEveCalo2DGL.cxx:97
 TEveCalo2DGL.cxx:98
 TEveCalo2DGL.cxx:99
 TEveCalo2DGL.cxx:100
 TEveCalo2DGL.cxx:101
 TEveCalo2DGL.cxx:102
 TEveCalo2DGL.cxx:103
 TEveCalo2DGL.cxx:104
 TEveCalo2DGL.cxx:105
 TEveCalo2DGL.cxx:106
 TEveCalo2DGL.cxx:107
 TEveCalo2DGL.cxx:108
 TEveCalo2DGL.cxx:109
 TEveCalo2DGL.cxx:110
 TEveCalo2DGL.cxx:111
 TEveCalo2DGL.cxx:112
 TEveCalo2DGL.cxx:113
 TEveCalo2DGL.cxx:114
 TEveCalo2DGL.cxx:115
 TEveCalo2DGL.cxx:116
 TEveCalo2DGL.cxx:117
 TEveCalo2DGL.cxx:118
 TEveCalo2DGL.cxx:119
 TEveCalo2DGL.cxx:120
 TEveCalo2DGL.cxx:121
 TEveCalo2DGL.cxx:122
 TEveCalo2DGL.cxx:123
 TEveCalo2DGL.cxx:124
 TEveCalo2DGL.cxx:125
 TEveCalo2DGL.cxx:126
 TEveCalo2DGL.cxx:127
 TEveCalo2DGL.cxx:128
 TEveCalo2DGL.cxx:129
 TEveCalo2DGL.cxx:130
 TEveCalo2DGL.cxx:131
 TEveCalo2DGL.cxx:132
 TEveCalo2DGL.cxx:133
 TEveCalo2DGL.cxx:134
 TEveCalo2DGL.cxx:135
 TEveCalo2DGL.cxx:136
 TEveCalo2DGL.cxx:137
 TEveCalo2DGL.cxx:138
 TEveCalo2DGL.cxx:139
 TEveCalo2DGL.cxx:140
 TEveCalo2DGL.cxx:141
 TEveCalo2DGL.cxx:142
 TEveCalo2DGL.cxx:143
 TEveCalo2DGL.cxx:144
 TEveCalo2DGL.cxx:145
 TEveCalo2DGL.cxx:146
 TEveCalo2DGL.cxx:147
 TEveCalo2DGL.cxx:148
 TEveCalo2DGL.cxx:149
 TEveCalo2DGL.cxx:150
 TEveCalo2DGL.cxx:151
 TEveCalo2DGL.cxx:152
 TEveCalo2DGL.cxx:153
 TEveCalo2DGL.cxx:154
 TEveCalo2DGL.cxx:155
 TEveCalo2DGL.cxx:156
 TEveCalo2DGL.cxx:157
 TEveCalo2DGL.cxx:158
 TEveCalo2DGL.cxx:159
 TEveCalo2DGL.cxx:160
 TEveCalo2DGL.cxx:161
 TEveCalo2DGL.cxx:162
 TEveCalo2DGL.cxx:163
 TEveCalo2DGL.cxx:164
 TEveCalo2DGL.cxx:165
 TEveCalo2DGL.cxx:166
 TEveCalo2DGL.cxx:167
 TEveCalo2DGL.cxx:168
 TEveCalo2DGL.cxx:169
 TEveCalo2DGL.cxx:170
 TEveCalo2DGL.cxx:171
 TEveCalo2DGL.cxx:172
 TEveCalo2DGL.cxx:173
 TEveCalo2DGL.cxx:174
 TEveCalo2DGL.cxx:175
 TEveCalo2DGL.cxx:176
 TEveCalo2DGL.cxx:177
 TEveCalo2DGL.cxx:178
 TEveCalo2DGL.cxx:179
 TEveCalo2DGL.cxx:180
 TEveCalo2DGL.cxx:181
 TEveCalo2DGL.cxx:182
 TEveCalo2DGL.cxx:183
 TEveCalo2DGL.cxx:184
 TEveCalo2DGL.cxx:185
 TEveCalo2DGL.cxx:186
 TEveCalo2DGL.cxx:187
 TEveCalo2DGL.cxx:188
 TEveCalo2DGL.cxx:189
 TEveCalo2DGL.cxx:190
 TEveCalo2DGL.cxx:191
 TEveCalo2DGL.cxx:192
 TEveCalo2DGL.cxx:193
 TEveCalo2DGL.cxx:194
 TEveCalo2DGL.cxx:195
 TEveCalo2DGL.cxx:196
 TEveCalo2DGL.cxx:197
 TEveCalo2DGL.cxx:198
 TEveCalo2DGL.cxx:199
 TEveCalo2DGL.cxx:200
 TEveCalo2DGL.cxx:201
 TEveCalo2DGL.cxx:202
 TEveCalo2DGL.cxx:203
 TEveCalo2DGL.cxx:204
 TEveCalo2DGL.cxx:205
 TEveCalo2DGL.cxx:206
 TEveCalo2DGL.cxx:207
 TEveCalo2DGL.cxx:208
 TEveCalo2DGL.cxx:209
 TEveCalo2DGL.cxx:210
 TEveCalo2DGL.cxx:211
 TEveCalo2DGL.cxx:212
 TEveCalo2DGL.cxx:213
 TEveCalo2DGL.cxx:214
 TEveCalo2DGL.cxx:215
 TEveCalo2DGL.cxx:216
 TEveCalo2DGL.cxx:217
 TEveCalo2DGL.cxx:218
 TEveCalo2DGL.cxx:219
 TEveCalo2DGL.cxx:220
 TEveCalo2DGL.cxx:221
 TEveCalo2DGL.cxx:222
 TEveCalo2DGL.cxx:223
 TEveCalo2DGL.cxx:224
 TEveCalo2DGL.cxx:225
 TEveCalo2DGL.cxx:226
 TEveCalo2DGL.cxx:227
 TEveCalo2DGL.cxx:228
 TEveCalo2DGL.cxx:229
 TEveCalo2DGL.cxx:230
 TEveCalo2DGL.cxx:231
 TEveCalo2DGL.cxx:232
 TEveCalo2DGL.cxx:233
 TEveCalo2DGL.cxx:234
 TEveCalo2DGL.cxx:235
 TEveCalo2DGL.cxx:236
 TEveCalo2DGL.cxx:237
 TEveCalo2DGL.cxx:238
 TEveCalo2DGL.cxx:239
 TEveCalo2DGL.cxx:240
 TEveCalo2DGL.cxx:241
 TEveCalo2DGL.cxx:242
 TEveCalo2DGL.cxx:243
 TEveCalo2DGL.cxx:244
 TEveCalo2DGL.cxx:245
 TEveCalo2DGL.cxx:246
 TEveCalo2DGL.cxx:247
 TEveCalo2DGL.cxx:248
 TEveCalo2DGL.cxx:249
 TEveCalo2DGL.cxx:250
 TEveCalo2DGL.cxx:251
 TEveCalo2DGL.cxx:252
 TEveCalo2DGL.cxx:253
 TEveCalo2DGL.cxx:254
 TEveCalo2DGL.cxx:255
 TEveCalo2DGL.cxx:256
 TEveCalo2DGL.cxx:257
 TEveCalo2DGL.cxx:258
 TEveCalo2DGL.cxx:259
 TEveCalo2DGL.cxx:260
 TEveCalo2DGL.cxx:261
 TEveCalo2DGL.cxx:262
 TEveCalo2DGL.cxx:263
 TEveCalo2DGL.cxx:264
 TEveCalo2DGL.cxx:265
 TEveCalo2DGL.cxx:266
 TEveCalo2DGL.cxx:267
 TEveCalo2DGL.cxx:268
 TEveCalo2DGL.cxx:269
 TEveCalo2DGL.cxx:270
 TEveCalo2DGL.cxx:271
 TEveCalo2DGL.cxx:272
 TEveCalo2DGL.cxx:273
 TEveCalo2DGL.cxx:274
 TEveCalo2DGL.cxx:275
 TEveCalo2DGL.cxx:276
 TEveCalo2DGL.cxx:277
 TEveCalo2DGL.cxx:278
 TEveCalo2DGL.cxx:279
 TEveCalo2DGL.cxx:280
 TEveCalo2DGL.cxx:281
 TEveCalo2DGL.cxx:282
 TEveCalo2DGL.cxx:283
 TEveCalo2DGL.cxx:284
 TEveCalo2DGL.cxx:285
 TEveCalo2DGL.cxx:286
 TEveCalo2DGL.cxx:287
 TEveCalo2DGL.cxx:288
 TEveCalo2DGL.cxx:289
 TEveCalo2DGL.cxx:290
 TEveCalo2DGL.cxx:291
 TEveCalo2DGL.cxx:292
 TEveCalo2DGL.cxx:293
 TEveCalo2DGL.cxx:294
 TEveCalo2DGL.cxx:295
 TEveCalo2DGL.cxx:296
 TEveCalo2DGL.cxx:297
 TEveCalo2DGL.cxx:298
 TEveCalo2DGL.cxx:299
 TEveCalo2DGL.cxx:300
 TEveCalo2DGL.cxx:301
 TEveCalo2DGL.cxx:302
 TEveCalo2DGL.cxx:303
 TEveCalo2DGL.cxx:304
 TEveCalo2DGL.cxx:305
 TEveCalo2DGL.cxx:306
 TEveCalo2DGL.cxx:307
 TEveCalo2DGL.cxx:308
 TEveCalo2DGL.cxx:309
 TEveCalo2DGL.cxx:310
 TEveCalo2DGL.cxx:311
 TEveCalo2DGL.cxx:312
 TEveCalo2DGL.cxx:313
 TEveCalo2DGL.cxx:314
 TEveCalo2DGL.cxx:315
 TEveCalo2DGL.cxx:316
 TEveCalo2DGL.cxx:317
 TEveCalo2DGL.cxx:318
 TEveCalo2DGL.cxx:319
 TEveCalo2DGL.cxx:320
 TEveCalo2DGL.cxx:321
 TEveCalo2DGL.cxx:322
 TEveCalo2DGL.cxx:323
 TEveCalo2DGL.cxx:324
 TEveCalo2DGL.cxx:325
 TEveCalo2DGL.cxx:326
 TEveCalo2DGL.cxx:327
 TEveCalo2DGL.cxx:328
 TEveCalo2DGL.cxx:329
 TEveCalo2DGL.cxx:330
 TEveCalo2DGL.cxx:331
 TEveCalo2DGL.cxx:332
 TEveCalo2DGL.cxx:333
 TEveCalo2DGL.cxx:334
 TEveCalo2DGL.cxx:335
 TEveCalo2DGL.cxx:336
 TEveCalo2DGL.cxx:337
 TEveCalo2DGL.cxx:338
 TEveCalo2DGL.cxx:339
 TEveCalo2DGL.cxx:340
 TEveCalo2DGL.cxx:341
 TEveCalo2DGL.cxx:342
 TEveCalo2DGL.cxx:343
 TEveCalo2DGL.cxx:344
 TEveCalo2DGL.cxx:345
 TEveCalo2DGL.cxx:346
 TEveCalo2DGL.cxx:347
 TEveCalo2DGL.cxx:348
 TEveCalo2DGL.cxx:349
 TEveCalo2DGL.cxx:350
 TEveCalo2DGL.cxx:351
 TEveCalo2DGL.cxx:352
 TEveCalo2DGL.cxx:353
 TEveCalo2DGL.cxx:354
 TEveCalo2DGL.cxx:355
 TEveCalo2DGL.cxx:356
 TEveCalo2DGL.cxx:357
 TEveCalo2DGL.cxx:358
 TEveCalo2DGL.cxx:359
 TEveCalo2DGL.cxx:360
 TEveCalo2DGL.cxx:361
 TEveCalo2DGL.cxx:362
 TEveCalo2DGL.cxx:363
 TEveCalo2DGL.cxx:364
 TEveCalo2DGL.cxx:365
 TEveCalo2DGL.cxx:366
 TEveCalo2DGL.cxx:367
 TEveCalo2DGL.cxx:368
 TEveCalo2DGL.cxx:369
 TEveCalo2DGL.cxx:370
 TEveCalo2DGL.cxx:371
 TEveCalo2DGL.cxx:372
 TEveCalo2DGL.cxx:373
 TEveCalo2DGL.cxx:374
 TEveCalo2DGL.cxx:375
 TEveCalo2DGL.cxx:376
 TEveCalo2DGL.cxx:377
 TEveCalo2DGL.cxx:378
 TEveCalo2DGL.cxx:379
 TEveCalo2DGL.cxx:380
 TEveCalo2DGL.cxx:381
 TEveCalo2DGL.cxx:382
 TEveCalo2DGL.cxx:383
 TEveCalo2DGL.cxx:384
 TEveCalo2DGL.cxx:385
 TEveCalo2DGL.cxx:386
 TEveCalo2DGL.cxx:387
 TEveCalo2DGL.cxx:388
 TEveCalo2DGL.cxx:389
 TEveCalo2DGL.cxx:390
 TEveCalo2DGL.cxx:391
 TEveCalo2DGL.cxx:392
 TEveCalo2DGL.cxx:393
 TEveCalo2DGL.cxx:394
 TEveCalo2DGL.cxx:395
 TEveCalo2DGL.cxx:396
 TEveCalo2DGL.cxx:397
 TEveCalo2DGL.cxx:398
 TEveCalo2DGL.cxx:399
 TEveCalo2DGL.cxx:400
 TEveCalo2DGL.cxx:401
 TEveCalo2DGL.cxx:402
 TEveCalo2DGL.cxx:403
 TEveCalo2DGL.cxx:404
 TEveCalo2DGL.cxx:405
 TEveCalo2DGL.cxx:406
 TEveCalo2DGL.cxx:407
 TEveCalo2DGL.cxx:408
 TEveCalo2DGL.cxx:409
 TEveCalo2DGL.cxx:410
 TEveCalo2DGL.cxx:411
 TEveCalo2DGL.cxx:412
 TEveCalo2DGL.cxx:413
 TEveCalo2DGL.cxx:414
 TEveCalo2DGL.cxx:415
 TEveCalo2DGL.cxx:416
 TEveCalo2DGL.cxx:417
 TEveCalo2DGL.cxx:418
 TEveCalo2DGL.cxx:419
 TEveCalo2DGL.cxx:420
 TEveCalo2DGL.cxx:421
 TEveCalo2DGL.cxx:422
 TEveCalo2DGL.cxx:423
 TEveCalo2DGL.cxx:424
 TEveCalo2DGL.cxx:425
 TEveCalo2DGL.cxx:426
 TEveCalo2DGL.cxx:427
 TEveCalo2DGL.cxx:428
 TEveCalo2DGL.cxx:429
 TEveCalo2DGL.cxx:430
 TEveCalo2DGL.cxx:431
 TEveCalo2DGL.cxx:432
 TEveCalo2DGL.cxx:433
 TEveCalo2DGL.cxx:434
 TEveCalo2DGL.cxx:435
 TEveCalo2DGL.cxx:436
 TEveCalo2DGL.cxx:437
 TEveCalo2DGL.cxx:438
 TEveCalo2DGL.cxx:439
 TEveCalo2DGL.cxx:440
 TEveCalo2DGL.cxx:441
 TEveCalo2DGL.cxx:442
 TEveCalo2DGL.cxx:443
 TEveCalo2DGL.cxx:444
 TEveCalo2DGL.cxx:445
 TEveCalo2DGL.cxx:446
 TEveCalo2DGL.cxx:447
 TEveCalo2DGL.cxx:448
 TEveCalo2DGL.cxx:449
 TEveCalo2DGL.cxx:450
 TEveCalo2DGL.cxx:451
 TEveCalo2DGL.cxx:452
 TEveCalo2DGL.cxx:453
 TEveCalo2DGL.cxx:454
 TEveCalo2DGL.cxx:455
 TEveCalo2DGL.cxx:456
 TEveCalo2DGL.cxx:457
 TEveCalo2DGL.cxx:458
 TEveCalo2DGL.cxx:459
 TEveCalo2DGL.cxx:460
 TEveCalo2DGL.cxx:461
 TEveCalo2DGL.cxx:462
 TEveCalo2DGL.cxx:463
 TEveCalo2DGL.cxx:464
 TEveCalo2DGL.cxx:465
 TEveCalo2DGL.cxx:466
 TEveCalo2DGL.cxx:467
 TEveCalo2DGL.cxx:468
 TEveCalo2DGL.cxx:469
 TEveCalo2DGL.cxx:470
 TEveCalo2DGL.cxx:471
 TEveCalo2DGL.cxx:472
 TEveCalo2DGL.cxx:473
 TEveCalo2DGL.cxx:474
 TEveCalo2DGL.cxx:475
 TEveCalo2DGL.cxx:476
 TEveCalo2DGL.cxx:477
 TEveCalo2DGL.cxx:478
 TEveCalo2DGL.cxx:479
 TEveCalo2DGL.cxx:480
 TEveCalo2DGL.cxx:481
 TEveCalo2DGL.cxx:482
 TEveCalo2DGL.cxx:483
 TEveCalo2DGL.cxx:484
 TEveCalo2DGL.cxx:485
 TEveCalo2DGL.cxx:486
 TEveCalo2DGL.cxx:487
 TEveCalo2DGL.cxx:488
 TEveCalo2DGL.cxx:489
 TEveCalo2DGL.cxx:490
 TEveCalo2DGL.cxx:491
 TEveCalo2DGL.cxx:492
 TEveCalo2DGL.cxx:493
 TEveCalo2DGL.cxx:494
 TEveCalo2DGL.cxx:495
 TEveCalo2DGL.cxx:496
 TEveCalo2DGL.cxx:497
 TEveCalo2DGL.cxx:498
 TEveCalo2DGL.cxx:499
 TEveCalo2DGL.cxx:500
 TEveCalo2DGL.cxx:501
 TEveCalo2DGL.cxx:502
 TEveCalo2DGL.cxx:503
 TEveCalo2DGL.cxx:504
 TEveCalo2DGL.cxx:505
 TEveCalo2DGL.cxx:506
 TEveCalo2DGL.cxx:507
 TEveCalo2DGL.cxx:508
 TEveCalo2DGL.cxx:509
 TEveCalo2DGL.cxx:510
 TEveCalo2DGL.cxx:511
 TEveCalo2DGL.cxx:512
 TEveCalo2DGL.cxx:513
 TEveCalo2DGL.cxx:514
 TEveCalo2DGL.cxx:515
 TEveCalo2DGL.cxx:516
 TEveCalo2DGL.cxx:517
 TEveCalo2DGL.cxx:518
 TEveCalo2DGL.cxx:519
 TEveCalo2DGL.cxx:520
 TEveCalo2DGL.cxx:521
 TEveCalo2DGL.cxx:522
 TEveCalo2DGL.cxx:523
 TEveCalo2DGL.cxx:524
 TEveCalo2DGL.cxx:525
 TEveCalo2DGL.cxx:526
 TEveCalo2DGL.cxx:527
 TEveCalo2DGL.cxx:528
 TEveCalo2DGL.cxx:529
 TEveCalo2DGL.cxx:530
 TEveCalo2DGL.cxx:531
 TEveCalo2DGL.cxx:532
 TEveCalo2DGL.cxx:533
 TEveCalo2DGL.cxx:534
 TEveCalo2DGL.cxx:535
 TEveCalo2DGL.cxx:536
 TEveCalo2DGL.cxx:537
 TEveCalo2DGL.cxx:538
 TEveCalo2DGL.cxx:539
 TEveCalo2DGL.cxx:540