// @(#)root/eve:$Id$
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 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 "TEveGeoNode.h"
#include "TEveTrans.h"
#include "TEveManager.h"
#include "TEvePolygonSetProjected.h"

#include "TEveGeoShapeExtract.h"
#include "TEvePad.h"
#include "TEveGeoPolyShape.h"
#include "TGLScenePad.h"
#include "TGLFaceSet.h"

#include "TROOT.h"
#include "TBuffer3D.h"
#include "TVirtualViewer3D.h"
#include "TColor.h"
#include "TFile.h"

#include "TGeoShape.h"
#include "TGeoVolume.h"
#include "TGeoNode.h"
#include "TGeoShapeAssembly.h"
#include "TGeoCompositeShape.h"
#include "TGeoManager.h"
#include "TGeoMatrix.h"
#include "TVirtualGeoPainter.h"

//==============================================================================
//==============================================================================
// TEveGeoNode
//==============================================================================

//______________________________________________________________________________
//
// Wrapper for TGeoNode that allows it to be shown in GUI and controlled as a TEveElement.

ClassImp(TEveGeoNode);

Int_t                 TEveGeoNode::fgCSGExportNSeg = 64;
std::list<TGeoShape*> TEveGeoNode::fgTemporaryStore;

//______________________________________________________________________________
Int_t TEveGeoNode::GetCSGExportNSeg()
{
   // Returns number of segments used for CSG export.

   return fgCSGExportNSeg;
}

//______________________________________________________________________________
void TEveGeoNode::SetCSGExportNSeg(Int_t nseg)
{
   // Sets number of segments used for CSG export.

   fgCSGExportNSeg = nseg;
}

//______________________________________________________________________________
TEveGeoNode::TEveGeoNode(TGeoNode* node) :
   TEveElement(),
   TObject(),
   fNode(node)
{
   // Constructor.

   // Hack!! Should use cint to retrieve TAttLine::fLineColor offset.
   char* l = (char*) dynamic_cast<TAttLine*>(node->GetVolume());
   SetMainColorPtr((Color_t*)(l + sizeof(void*)));
   SetMainTransparency(fNode->GetVolume()->GetTransparency());

   SetRnrSelfChildren(fNode->IsVisible(), fNode->IsVisDaughters());
}

//______________________________________________________________________________
const char* TEveGeoNode::GetName()  const
{
   // Return name, taken from geo-node. Used via TObject.

   return fNode->GetName();
}

//______________________________________________________________________________
const char* TEveGeoNode::GetTitle() const
{
   // Return title, taken from geo-node. Used via TObject.

   return fNode->GetTitle();
}

//______________________________________________________________________________
const char* TEveGeoNode::GetElementName()  const
{
   // Return name, taken from geo-node. Used via TEveElement.

   return fNode->GetName();
}

//______________________________________________________________________________
const char* TEveGeoNode::GetElementTitle() const
{
   // Return title, taken from geo-node. Used via TEveElement.

   return fNode->GetTitle();
}

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

//______________________________________________________________________________
void TEveGeoNode::ExpandIntoListTree(TGListTree* ltree,
                                     TGListTreeItem* parent)
{
   // Checks if child-nodes have been imported ... imports them if not.
   // Then calls TEveElement::ExpandIntoListTree.

   if ( ! HasChildren() && fNode->GetVolume()->GetNdaughters() > 0)
   {
      TIter next(fNode->GetVolume()->GetNodes());
      TGeoNode* dnode;
      while ((dnode = (TGeoNode*) next()) != 0)
      {
         TEveGeoNode* node_re = new TEveGeoNode(dnode);
         AddElement(node_re);
      }
   }
   TEveElement::ExpandIntoListTree(ltree, parent);
}

//______________________________________________________________________________
void TEveGeoNode::ExpandIntoListTrees()
{
   // Expand children into all list-trees.

   for (sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
   {
      ExpandIntoListTree(i->fTree, i->fItem);
   }
}

//______________________________________________________________________________
void TEveGeoNode::ExpandIntoListTreesRecursively()
{
   // Expand children into all list-trees recursively.
   // This is useful if one wants to export extracted shapes.

   ExpandIntoListTrees();
   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TEveGeoNode *egn = dynamic_cast<TEveGeoNode*>(*i);
      if (egn)
         egn->ExpandIntoListTreesRecursively();
   }
}

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

//______________________________________________________________________________
void TEveGeoNode::AddStamp(UChar_t bits)
{
   // Override from TEveElement.
   // Process visibility changes and forward them to fNode.

   TEveElement::AddStamp(bits);
   if (bits & kCBVisibility)
   {
      fNode->SetVisibility(fRnrSelf);
      fNode->VisibleDaughters(fRnrChildren);
   }
}

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

//______________________________________________________________________________
Bool_t TEveGeoNode::CanEditMainColor() const
{
   // Can edit main-color -- not available for assemblies.

   return ! fNode->GetVolume()->IsAssembly();
}

//______________________________________________________________________________
void TEveGeoNode::SetMainColor(Color_t color)
{
   // Set color, propagate to volume's line color.

   TEveElement::SetMainColor(color);
   fNode->GetVolume()->SetLineColor(color);
}

//______________________________________________________________________________
Bool_t TEveGeoNode::CanEditMainTransparency() const
{
   // Can edit main transparency -- not available for assemblies.

   return ! fNode->GetVolume()->IsAssembly();
}

//______________________________________________________________________________
Char_t TEveGeoNode::GetMainTransparency() const
{
   // Get transparency -- it is taken from the geo node.

   return fNode->GetVolume()->GetTransparency();
}

//______________________________________________________________________________
void TEveGeoNode::SetMainTransparency(Char_t t)
{
   // Set transparency, propagate to volume's transparency.

   TEveElement::SetMainTransparency(t);
   fNode->GetVolume()->SetTransparency(t);
}

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

//______________________________________________________________________________
void TEveGeoNode::UpdateNode(TGeoNode* node)
{
   // Updates all reve-browsers having the node in their contents.
   // All 3D-pads updated if any change found.
   //
   // Should (could?) be optimized with some assumptions about
   // volume/node structure (search for parent, know the same node can not
   // reoccur on lower level once found).

   static const TEveException eH("TEveGeoNode::UpdateNode ");

   // printf("%s node %s %p\n", eH.Data(), node->GetName(), node);

   if (fNode == node)
      StampColorSelection();

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
      ((TEveGeoNode*)(*i))->UpdateNode(node);
   }
}

//______________________________________________________________________________
void TEveGeoNode::UpdateVolume(TGeoVolume* volume)
{
   // Updates all reve-browsers having the volume in their contents.
   // All 3D-pads updated if any change found.
   //
   // Should (could?) be optimized with some assumptions about
   // volume/node structure (search for parent, know the same node can not
   // reoccur on lower level once found).

   static const TEveException eH("TEveGeoNode::UpdateVolume ");

   // printf("%s volume %s %p\n", eH.Data(), volume->GetName(), volume);

   if(fNode->GetVolume() == volume)
      StampColorSelection();

   for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
      ((TEveGeoNode*)(*i))->UpdateVolume(volume);
   }
}

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

//______________________________________________________________________________
void TEveGeoNode::Draw(Option_t* option)
{
   // Draw the object.

   TString opt("SAME");
   opt += option;
   fNode->GetVolume()->Draw(opt);
}

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

//______________________________________________________________________________
void TEveGeoNode::Save(const char* file, const char* name, Bool_t leafs_only)
{
   // Save TEveGeoShapeExtract tree starting at this node.
   // This function is obsolete, use SaveExtract() instead.

   Warning("Save()", "This function is deprecated, use SaveExtract() instead.");
   SaveExtract(file, name, leafs_only);
}

//______________________________________________________________________________
void TEveGeoNode::SaveExtract(const char* file, const char* name, Bool_t leafs_only)
{
   // Save the shape tree as TEveGeoShapeExtract.
   // File is always recreated.

   TEveGeoShapeExtract* gse = DumpShapeTree(this, 0, leafs_only);
   if (gse)
   {
      TFile f(file, "RECREATE");
      gse->Write(name);
      f.Close();
   }

   for (std::list<TGeoShape*>::iterator i = fgTemporaryStore.begin(); i != fgTemporaryStore.end(); ++i)
      delete *i;
   fgTemporaryStore.clear();
}

//______________________________________________________________________________
void TEveGeoNode::WriteExtract(const char* name, Bool_t leafs_only)
{
   // Write the shape tree as TEveGeoShapeExtract to current directory.

   TEveGeoShapeExtract* gse = DumpShapeTree(this, 0, leafs_only);
   if (gse)
   {
      gse->Write(name);
   }
}

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

//______________________________________________________________________________
TEveGeoShapeExtract* TEveGeoNode::DumpShapeTree(TEveGeoNode*         geon,
                                                TEveGeoShapeExtract* parent,
                                                Bool_t               leafs_only)
{
   // Export the node hierarchy into tree of TEveGeoShapeExtract objects.

   static const TEveException eh("TEveGeoNode::DumpShapeTree ");

   TGeoNode*   tnode   = 0;
   TGeoVolume* tvolume = 0;
   TGeoShape*  tshape  = 0;

   tnode = geon->GetNode();
   if (tnode == 0)
   {
      Info(eh, "Null TGeoNode for TEveGeoNode '%s': assuming it's a holder and descending.", geon->GetName());
   }
   else
   {
      tvolume = tnode->GetVolume();
      if (tvolume == 0) {
         Warning(eh, "Null TGeoVolume for TEveGeoNode '%s'; skipping its sub-tree.\n", geon->GetName());
         return 0;
      }
      tshape  = tvolume->GetShape();
      if (tshape->IsComposite())
      {
         TEvePad pad;
         TEvePadHolder gpad(kFALSE, &pad);
         pad.GetListOfPrimitives()->Add(tshape);
         TGLScenePad scene_pad(&pad);
         pad.SetViewer3D(&scene_pad);

         {
            TEveGeoManagerHolder gmgr(tvolume->GetGeoManager(), fgCSGExportNSeg);
            gGeoManager->SetPaintVolume(tvolume);

            TGeoMatrix *gst = TGeoShape::GetTransform();
            TGeoShape::SetTransform(TEveGeoShape::GetGeoHMatrixIdentity());

            scene_pad.BeginScene();
            dynamic_cast<TGeoCompositeShape*>(tshape)->PaintComposite();
            scene_pad.EndScene();

            TGeoShape::SetTransform(gst);
         }

         pad.SetViewer3D(0);

         TGLFaceSet* fs = dynamic_cast<TGLFaceSet*>(scene_pad.FindLogical(tvolume));
         if (!fs) {
            Warning(eh, "Failed extracting CSG tesselation TEveGeoNode '%s'; skipping its sub-tree.\n", geon->GetName());
            return 0;
         }

         TEveGeoPolyShape* egps = new TEveGeoPolyShape();
         egps->SetFromFaceSet(fs);
         tshape = egps;
         fgTemporaryStore.push_back(egps);
      }
   }

   // transformation
   TEveTrans trans;
   if (parent)
      trans.SetFromArray(parent->GetTrans());
   if (tnode)
   {
      TGeoMatrix     *gm = tnode->GetMatrix();
      const Double_t *rm = gm->GetRotationMatrix();
      const Double_t *tv = gm->GetTranslation();
      TEveTrans t;
      t(1,1) = rm[0]; t(1,2) = rm[1]; t(1,3) = rm[2];
      t(2,1) = rm[3]; t(2,2) = rm[4]; t(2,3) = rm[5];
      t(3,1) = rm[6]; t(3,2) = rm[7]; t(3,3) = rm[8];
      t(1,4) = tv[0]; t(2,4) = tv[1]; t(3,4) = tv[2];
      trans *= t;
   }

   TEveGeoShapeExtract* gse = new TEveGeoShapeExtract(geon->GetName(), geon->GetTitle());
   gse->SetTrans(trans.Array());
   Int_t  ci = 0;
   Char_t transp = 0;
   if (tvolume) {
      ci = tvolume->GetLineColor();
      transp = tvolume->GetTransparency();
   }
   TColor* c = gROOT->GetColor(ci);
   Float_t rgba[4] = {1, 0, 0, 1.0f - transp/100.0f};
   if (c) {
      rgba[0] = c->GetRed();
      rgba[1] = c->GetGreen();
      rgba[2] = c->GetBlue();
   }
   gse->SetRGBA(rgba);
   rgba[3] = 1;
   c = gROOT->GetColor(TColor::GetColorDark(ci));
   if (c) {
      rgba[0] = c->GetRed();
      rgba[1] = c->GetGreen();
      rgba[2] = c->GetBlue();
   }
   gse->SetRGBALine(rgba);

   // Keep default extract line color --> black.
   Bool_t rnr     = tnode ? tnode->IsVisible()      : geon->GetRnrSelf();
   Bool_t rnr_els = tnode ? tnode->IsVisDaughters() : geon->GetRnrChildren();
   if (tvolume) {
      rnr     = rnr     && tvolume->IsVisible();
      rnr_els = rnr_els && tvolume->IsVisDaughters();
   }
   gse->SetRnrSelf    (rnr);
   gse->SetRnrElements(rnr_els);
   gse->SetRnrFrame   (kTRUE);
   gse->SetMiniFrame  (kTRUE);

   gse->SetShape((leafs_only && geon->HasChildren()) ? 0 : tshape);

   if (geon->HasChildren())
   {
      TList* ele = new TList();
      gse->SetElements(ele);
      gse->GetElements()->SetOwner(true);

      TEveElement::List_i i = geon->BeginChildren();
      while (i != geon->EndChildren())
      {
         TEveGeoNode* l = dynamic_cast<TEveGeoNode*>(*i);
         DumpShapeTree(l, gse, leafs_only);
         ++i;
      }
   }

   if (parent)
      parent->GetElements()->Add(gse);

   return gse;
}


//==============================================================================
//==============================================================================
// TEveGeoTopNode
//==============================================================================

//______________________________________________________________________________
//
// A wrapper over a TGeoNode, possibly displaced with a global
// trasformation stored in TEveElement.
//
// It holds a pointer to TGeoManager and controls for steering of
// TGeoPainter, fVisOption, fVisLevel and fMaxVisNodes. They have the
// same meaning as in TGeoManager/TGeoPainter.

ClassImp(TEveGeoTopNode);

//______________________________________________________________________________
TEveGeoTopNode::TEveGeoTopNode(TGeoManager* manager, TGeoNode* node,
                               Int_t visopt, Int_t vislvl, Int_t maxvisnds) :
   TEveGeoNode  (node),
   fManager     (manager),
   fVisOption   (visopt),
   fVisLevel    (vislvl),
   fMaxVisNodes (maxvisnds)
{
   // Constructor.

   InitMainTrans();
   fRnrSelf = kTRUE; // Override back from TEveGeoNode.
}

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

//______________________________________________________________________________
void TEveGeoTopNode::UseNodeTrans()
{
   // Use transforamtion matrix from the TGeoNode.
   // Warning: this is local transformation of the node!

   RefMainTrans().SetFrom(*fNode->GetMatrix());
}

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

//______________________________________________________________________________
void TEveGeoTopNode::AddStamp(UChar_t bits)
{
   // Revert from TEveGeoNode back to standard behaviour, that is,
   // do not pass visibility chanes to fNode as they are honoured
   // in Paint() method.

   TEveElement::AddStamp(bits);
}

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

//______________________________________________________________________________
void TEveGeoTopNode::Draw(Option_t* option)
{
   // Draw the top-node.

   AppendPad(option);
}

//______________________________________________________________________________
void TEveGeoTopNode::Paint(Option_t* option)
{
   // Paint the enclosed TGeo hierarchy with visibility level and
   // option given in data-members.
   // Uses TGeoPainter internally.

   if (fRnrSelf)
   {
      TEveGeoManagerHolder geo_holder(fManager);
      TVirtualPad *pad = gPad;
      gPad = 0;
      TGeoVolume* top_volume = fManager->GetTopVolume();
      if (fVisLevel > 0)
         fManager->SetVisLevel(fVisLevel);
      else
         fManager->SetMaxVisNodes(fMaxVisNodes);
      TVirtualGeoPainter* vgp = fManager->GetGeomPainter();
      fManager->SetTopVolume(fNode->GetVolume());
      switch (fVisOption)
      {
         case 0:
            fNode->GetVolume()->SetVisContainers(kTRUE);
            fManager->SetTopVisible(kTRUE);
            break;
         case 1:
            fNode->GetVolume()->SetVisLeaves(kTRUE);
            fManager->SetTopVisible(kFALSE);
            break;
         case 2:
            fNode->GetVolume()->SetVisOnly(kTRUE);
            break;
      }
      gPad = pad;
      if(vgp != 0) {
         vgp->SetVisOption(fVisOption);
         TGeoHMatrix geomat;
         if (HasMainTrans()) RefMainTrans().SetGeoHMatrix(geomat);
         vgp->PaintNode(fNode, option, &geomat);
      }
      fManager->SetTopVolume(top_volume);
   }
}

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

//______________________________________________________________________________
void TEveGeoTopNode::VolumeVisChanged(TGeoVolume* volume)
{
   // Callback for propagating volume visibility changes.

   static const TEveException eh("TEveGeoTopNode::VolumeVisChanged ");
   printf("%s volume %s %p\n", eh.Data(), volume->GetName(), (void*)volume);
   UpdateVolume(volume);
}

//______________________________________________________________________________
void TEveGeoTopNode::VolumeColChanged(TGeoVolume* volume)
{
   // Callback for propagating volume parameter changes.

   static const TEveException eh("TEveGeoTopNode::VolumeColChanged ");
   printf("%s volume %s %p\n", eh.Data(), volume->GetName(), (void*)volume);
   UpdateVolume(volume);
}

//______________________________________________________________________________
void TEveGeoTopNode::NodeVisChanged(TGeoNode* node)
{
   // Callback for propagating node visibility changes.

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