// @(#)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.             *
 *************************************************************************/

#ifndef ROOT_TEveCalo
#define ROOT_TEveCalo

#include "TEveElement.h"
#include "TEveProjectionBases.h"
#include "TEveProjectionManager.h"

#include "TAtt3D.h"
#include "TAttBBox.h"
#include "TEveCaloData.h"

class TClass;
class TEveRGBAPalette;

class TEveCaloViz : public TEveElement,
                    public TNamed,
                    public TAtt3D,
                    public TAttBBox,
                    public TEveProjectable
{
   friend class TEveCaloVizEditor;

private:
   TEveCaloViz(const TEveCaloViz&);        // Not implemented
   TEveCaloViz& operator=(const TEveCaloViz&); // Not implemented

protected:
   TEveCaloData* fData;           // event data reference
   Bool_t        fCellIdCacheOK;  // data cell ids cache state

   Double_t      fEtaMin;
   Double_t      fEtaMax;

   Double_t      fPhi;
   Double_t      fPhiOffset;     // phi range +/- offset

   Bool_t        fAutoRange;     // set eta phi limits on DataChanged()

   Float_t       fBarrelRadius;  // barrel raidus in cm
   Float_t       fEndCapPosF;     // forward end cap z coordinate in cm
   Float_t       fEndCapPosB;     // backward end cap z coordinate in cm (should be < 0)

   Float_t       fPlotEt;        // plot E or Et.

   Float_t           fMaxTowerH;  // bounding box z dimesion
   Bool_t            fScaleAbs;
   Float_t           fMaxValAbs;

   Bool_t            fValueIsColor;   // Interpret signal value as RGBA color.
   TEveRGBAPalette*  fPalette;        // Pointer to signal-color palette.


   void AssignCaloVizParameters(TEveCaloViz* cv);

   void SetupColorHeight(Float_t value, Int_t slice, Float_t& height) const;

   virtual void BuildCellIdCache() = 0;

public:
   TEveCaloViz(TEveCaloData* data=0, const char* n="TEveCaloViz", const char* t="");

   virtual ~TEveCaloViz();

   virtual TEveElement* ForwardSelection();
   virtual TEveElement* ForwardEdit();

   virtual void Paint(Option_t* option="");

   virtual TClass* ProjectedClass(const TEveProjection* p) const;
   virtual Float_t GetValToHeight() const;
   virtual void    CellSelectionChanged() {}

   virtual void    SetScaleAbs(Bool_t x) { fScaleAbs = x; }

   TEveCaloData* GetData() const { return fData; }
   void    SetData(TEveCaloData* d);
   void    DataChanged();
   Float_t GetMaxVal() const;

   Bool_t  AssertCellIdCache() const;
   void    InvalidateCellIdCache() { fCellIdCacheOK=kFALSE; ResetBBox(); };

   Float_t GetDataSliceThreshold(Int_t slice) const;
   void    SetDataSliceThreshold(Int_t slice, Float_t val);
   Color_t GetDataSliceColor(Int_t slice) const;
   void    SetDataSliceColor(Int_t slice, Color_t col);

   Float_t GetBarrelRadius() const { return fBarrelRadius; }
   void    SetBarrelRadius(Float_t r) { fBarrelRadius = r; ResetBBox(); }
   Float_t GetEndCapPos   () const { return fEndCapPosF; } // get end cap position, assuming fEndCapPosF = -fEndCapPosB
   Float_t GetForwardEndCapPos   () const { return fEndCapPosF; }
   Float_t GetBackwardEndCapPos   () const { return fEndCapPosB; }
   void    SetEndCapPos   (Float_t z) { fEndCapPosF = z; fEndCapPosB = -z; ResetBBox(); }
   void    SetForwardEndCapPos (Float_t z) { fEndCapPosF = z; ResetBBox(); }
   void    SetBackwardEndCapPos(Float_t z) { fEndCapPosB = z; ResetBBox(); }

   Bool_t  GetPlotEt() const { return fPlotEt; }
   void    SetPlotEt(Bool_t x);

   void    SetMaxTowerH(Float_t x) { fMaxTowerH = x; }
   Float_t GetMaxTowerH() const    { return fMaxTowerH; }
   Bool_t  GetScaleAbs() const { return fScaleAbs; }
   void    SetMaxValAbs(Float_t x) { fMaxValAbs = x; }
   Float_t GetMaxValAbs() const    { return fMaxValAbs; }

   Float_t GetTransitionEta() const;
   Float_t GetTransitionEtaForward() const;
   Float_t GetTransitionEtaBackward() const;
   Float_t GetTransitionTheta() const;
   Float_t GetTransitionThetaForward() const;
   Float_t GetTransitionThetaBackward() const;

   TEveRGBAPalette* GetPalette() const { return fPalette; }
   void             SetPalette(TEveRGBAPalette* p);

   TEveRGBAPalette* AssertPalette();
   Bool_t  GetValueIsColor()   const { return fValueIsColor;}
   void    SetValueIsColor(Bool_t x) { fValueIsColor = x;}

   Bool_t  GetAutoRange()   const { return fAutoRange; }
   void    SetAutoRange(Bool_t x) { fAutoRange = x; }

   void    SetEta(Float_t l, Float_t u);
   Float_t GetEta()    const { return 0.5f*(fEtaMin+fEtaMax); }
   Float_t GetEtaMin() const { return fEtaMin; }
   Float_t GetEtaMax() const { return fEtaMax; }
   Float_t GetEtaRng() const { return fEtaMax-fEtaMin; }

   void    SetPhi(Float_t phi)    { SetPhiWithRng(phi, fPhiOffset); }
   void    SetPhiRng(Float_t rng) { SetPhiWithRng(fPhi, rng); }
   void    SetPhiWithRng(Float_t x, Float_t r);
   Float_t GetPhi()    const { return fPhi; }
   Float_t GetPhiMin() const { return fPhi-fPhiOffset; }
   Float_t GetPhiMax() const { return fPhi+fPhiOffset; }
   Float_t GetPhiRng() const { return 2.0f*fPhiOffset; }

   Bool_t  CellInEtaPhiRng (TEveCaloData::CellData_t&) const;

   ClassDef(TEveCaloViz, 0); // Base-class for visualization of calorimeter eventdata.
};

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

class TEveCalo3D : public TEveCaloViz
{
   friend class TEveCalo3DGL;
private:
   TEveCalo3D(const TEveCalo3D&);            // Not implemented
   TEveCalo3D& operator=(const TEveCalo3D&); // Not implemented

protected:
   TEveCaloData::vCellId_t fCellList;

   Bool_t    fRnrEndCapFrame;
   Bool_t    fRnrBarrelFrame;

   Float_t   fFrameWidth;
   Color_t   fFrameColor;
   Char_t    fFrameTransparency;

   virtual void BuildCellIdCache();

public:
   TEveCalo3D(TEveCaloData* d=0, const char* n="TEveCalo3D", const char* t="xx");
   virtual ~TEveCalo3D() {}
   virtual void ComputeBBox();

   void    SetFrameWidth(Float_t w) { fFrameWidth = w; }
   Float_t GetFrameWidth() const    { return fFrameWidth; }

   void SetRnrFrame(Bool_t e, Bool_t b)         { fRnrEndCapFrame = e; fRnrBarrelFrame = b; }
   void GetRnrFrame(Bool_t &e, Bool_t &b) const { e = fRnrEndCapFrame; b = fRnrBarrelFrame; }
   void SetRnrEndCapFrame(Bool_t r) { fRnrEndCapFrame = r; }
   void SetRnrBarrelFrame(Bool_t r) { fRnrBarrelFrame = r; }
   Bool_t GetRnrEndCapFrame() const { return fRnrEndCapFrame; }
   Bool_t GetRnrBarrelFrame() const { return fRnrBarrelFrame; }

   void   SetFrameTransparency(Char_t x) { fFrameTransparency = x; }
   Char_t GetFrameTransparency() const { return fFrameTransparency; }

   ClassDef(TEveCalo3D, 0); // Class for 3D visualization of calorimeter event data.
};

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

class TEveCalo2D : public TEveCaloViz,
                   public TEveProjected
{
   friend class TEveCalo2DGL;

public:
   typedef std::vector<TEveCaloData::vCellId_t*>           vBinCells_t;
   typedef std::vector<TEveCaloData::vCellId_t*>::iterator vBinCells_i;

private:
   TEveCalo2D(const TEveCalo2D&);            // Not implemented
   TEveCalo2D& operator=(const TEveCalo2D&); // Not implemented

   TEveProjection::EPType_e  fOldProjectionType;
   void CellSelectionChangedInternal(TEveCaloData::vCellId_t& cells, std::vector<TEveCaloData::vCellId_t*>& cellLists);

protected:
   std::vector<TEveCaloData::vCellId_t*>   fCellLists;

   std::vector<TEveCaloData::vCellId_t*>   fCellListsSelected;
   std::vector<TEveCaloData::vCellId_t*>   fCellListsHighlighted;

   Float_t                                 fMaxESumBin;
   Float_t                                 fMaxEtSumBin;

   virtual void BuildCellIdCache();

   virtual void SetDepthLocal(Float_t x) { fDepth = x; }

public:
   TEveCalo2D(const char* n="TEveCalo2D", const char* t="");
   virtual ~TEveCalo2D();

   virtual void SetProjection(TEveProjectionManager* proj, TEveProjectable* model);
   virtual void UpdateProjection();
   virtual void ComputeBBox();

   virtual void CellSelectionChanged();

   virtual void    SetScaleAbs(Bool_t);

   virtual Float_t GetValToHeight() const;

   const TEveCalo2D::vBinCells_t& GetBinLists() const { return fCellLists; }

   ClassDef(TEveCalo2D, 0); // Class for visualization of projected calorimeter event data.
};
/**************************************************************************/
/**************************************************************************/

class TEveCaloLego : public TEveCaloViz
{
   friend class TEveCaloLegoGL;
   friend class TEveCaloLegoOverlay;

public:
   enum EProjection_e { kAuto, k3D, k2D };
   enum E2DMode_e     { kValColor, kValSize, kValSizeOutline };
   enum EBoxMode_e    { kNone, kFrontBack, kBack};

private:
   TEveCaloLego(const TEveCaloLego&);            // Not implemented
   TEveCaloLego& operator=(const TEveCaloLego&); // Not implemented

protected:
   TEveCaloData::vCellId_t fCellList;

   Color_t                 fFontColor;
   Color_t                 fGridColor;
   Color_t                 fPlaneColor;
   Char_t                  fPlaneTransparency;

   Int_t                   fNZSteps; // Z axis label step in GeV
   Float_t                 fZAxisStep;

   Bool_t                  fAutoRebin;
   Int_t                   fPixelsPerBin;
   Bool_t                  fNormalizeRebin;

   EProjection_e           fProjection;
   E2DMode_e               f2DMode;
   EBoxMode_e              fBoxMode;  // additional scale info

   Bool_t                  fDrawHPlane;
   Float_t                 fHPlaneVal;

   Bool_t                  fHasFixedHeightIn2DMode;
   Float_t                 fFixedHeightValIn2DMode; // 1% of whole height

   Int_t                   fDrawNumberCellPixels;
   Int_t                   fCellPixelFontSize;

   virtual void BuildCellIdCache();

public:
   TEveCaloLego(TEveCaloData* data=0, const char* n="TEveCaloLego", const char* t="");
   virtual ~TEveCaloLego(){}

   virtual void ComputeBBox();
   virtual void  SetData(TEveCaloData* d);

   Color_t  GetFontColor() const { return fFontColor; }
   void     SetFontColor(Color_t ci) { fFontColor=ci; }

   Color_t  GetGridColor() const { return fGridColor; }
   void     SetGridColor(Color_t ci) { fGridColor=ci; }

   Color_t  GetPlaneColor() const { return fPlaneColor; }
   void     SetPlaneColor(Color_t ci) { fPlaneColor=ci; }

   Char_t   GetPlaneTransparency() const { return fPlaneTransparency; }
   void     SetPlaneTransparency(Char_t t) { fPlaneTransparency=t; }

   Int_t    GetNZSteps() const { return fNZSteps; }
   void     SetNZSteps(Int_t s) { fNZSteps = s;}

   Int_t    GetPixelsPerBin() const { return fPixelsPerBin; }
   void     SetPixelsPerBin(Int_t bw) { fPixelsPerBin = bw; }

   Bool_t   GetAutoRebin() const { return fAutoRebin; }
   void     SetAutoRebin(Bool_t s) { fAutoRebin = s;}

   Bool_t   GetNormalizeRebin() const { return fNormalizeRebin; }
   void     SetNormalizeRebin(Bool_t s) { fNormalizeRebin = s; fCellIdCacheOK=kFALSE;}

   EProjection_e  GetProjection() const { return fProjection; }
   void           SetProjection(EProjection_e p) { fProjection = p; }

   void       Set2DMode(E2DMode_e p) { f2DMode = p; }
   E2DMode_e  Get2DMode() { return f2DMode; }

   bool       GetHasFixedHeightIn2DMode() const { return fHasFixedHeightIn2DMode; }
   void       SetHasFixedHeightIn2DMode(bool x) { fHasFixedHeightIn2DMode = x; }

   float      GetFixedHeightValIn2DMode() const  { return fFixedHeightValIn2DMode; }
   void       SetFixedHeightValIn2DMode(float x) { fFixedHeightValIn2DMode = x; }

   void        SetBoxMode(EBoxMode_e p) { fBoxMode = p; }
   EBoxMode_e  GetBoxMode() { return fBoxMode; }

   Bool_t   GetDrawHPlane() const { return fDrawHPlane; }
   void     SetDrawHPlane(Bool_t s) { fDrawHPlane = s;}

   Float_t  GetHPlaneVal() const { return fHPlaneVal; }
   void     SetHPlaneVal(Float_t s) { fHPlaneVal = s;}

   Int_t    GetDrawNumberCellPixels() { return fDrawNumberCellPixels; }
   void     SetDrawNumberCellPixels(Int_t x) { fDrawNumberCellPixels = x; }
   Int_t    GetCellPixelFontSize() { return fCellPixelFontSize; }
   void     SetCellPixelFontSize(Int_t x) { fCellPixelFontSize = x; }

   ClassDef(TEveCaloLego, 0);  // Class for visualization of calorimeter histogram data.
};

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