ROOT logo
// $Id: ZGeoNode.cxx 2127 2009-02-03 12:42:27Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

//__________________________________________________________________________
// ZGeoNode
//
// A ZGeoNode serves for representation of root TGeoNode
// object in Gled framework.
//

#include "ZGeoNode.h"
#include "ZGeoNode.c7"

#include <Glasses/ZQueen.h>
#include <Stones/ZComet.h>

#include <TGeoMatrix.h>
#include <TROOT.h>
#include <TFile.h>
#include <TBuffer3D.h>
#include <TGLFaceSet.h>
#include <TColor.h>

typedef list<ZGeoNode*>           lpZGeoNode_t;
typedef list<ZGeoNode*>::iterator lpZGeoNode_i;

ClassImp(ZGeoNode);

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

void ZGeoNode::_init()
{
  mTNode     = 0;
  mNNodes    = 0;
  mNodeAlpha = 1;
  mDefFile   = "ZGeoNodes.root";
}

void ZGeoNode::_assert_tnode(const Exc_t& _eh, bool ggeo_fallbackp)
{
  if(mTNode == 0)
  {
    if(ggeo_fallbackp && gGeoManager && gGeoManager->GetTopNode())
      mTNode = gGeoManager->GetTopNode();
    else
      throw(_eh + "top-node can not be resolved.");
  }
}

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

void ZGeoNode::SetTNode(TGeoNode* n)
{
  mTNode = n;
  mTNodeName = n ? n->GetName() : "";
  Stamp(FID());
}

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

void ZGeoNode::AssertUserData()
{
  // Creates TGLFaceSet object rendered by ZGeoNode_GL_Rnr
  // and saves it in TGeoVolume.

  TGeoVolume* v = GetVolume();
  if (v && ! v->IsAssembly()) {
    GeoUserData* userdata = dynamic_cast<GeoUserData*>(v->GetField());

    if (v->GetField() == 0) {
      userdata = new GeoUserData();
      v->SetField(userdata);
    }

    if (userdata->fFaceSet == 0) {
      TGeoVolume* vol = GetVolume();
      const TBuffer3D& buff = GetVolume()->GetShape()->
	GetBuffer3D(TBuffer3D::kRawSizes|TBuffer3D::kRaw, false);
      TGLFaceSet* fs = new TGLFaceSet(buff);
      userdata->fFaceSet = fs;
      userdata->bIsImported = true;
      vol->SetField(userdata);
    }
  }
}

void ZGeoNode::AssignGGeoTopNode()
{
  static const Exc_t _eh("ZGeoNode::AssignGGeoTopNode ");
  _assert_tnode(_eh, true);
}

/**************************************************************************/
// Top-level imports from gGeoManager.
/**************************************************************************/

void ZGeoNode::ImportByRegExp(const Text_t* target, TRegexp filter)
{
  // Imports mTGeoNode and groups the created nodes by given regular
  // expression.

  static const Exc_t _eh("ZGeoNode::ImportByRegExp ");

  _assert_tnode(_eh, true);
  if(target == 0) target = "";

  // split target into list of node names
  lStr_t node_names;
  GledNS::split_string(target, node_names, '/');
  ZGeoNode* holder = set_holder(node_names);
  TIter next_node(mTNode->GetNodes());
  TGeoNode* geon;
  Int_t ni=0;
  while((geon = (TGeoNode*)next_node())) {
    TString vname = "<no-vol>";
    TString sname = "<no-shp>";

    TGeoVolume* v = geon->GetVolume();
    if(v) {
      vname = v->GetName();

      // add only nodes with volume names maching filter
      if (!vname.Contains(filter)){
	continue;
      }

      TGeoShape* s = v->GetShape();
      if(s) {
	sname = s->GetName();
      }
    }
    insert_node(geon, holder, GForm("%s::%s", vname.Data(), sname.Data()));
    ni++;
  }
  if(ni) SetRnrSelf(false);
}

void ZGeoNode::ImportByRegExp(const Text_t* target, const Text_t* filter)
{
  TRegexp re_filter(filter);
  ImportByRegExp(target, re_filter);
}

void ZGeoNode::ImportUnimported(const Text_t* target)
{
  static const Exc_t _eh("ZGeoNode::ImportUnimported ");

  _assert_tnode(_eh, true);
  Int_t ni=0;
  ZGeoNode* holder = dynamic_cast<ZGeoNode*>(GetElementByName(target));
  if ( holder == 0 ){
    // printf("create holder node %s \n", target);
    holder = new  ZGeoNode(target);
    mQueen->CheckIn(holder);
    Add(holder);
  }

  TIter next_node(mTNode->GetNodes());
  TGeoNode* geon;

  while((geon = (TGeoNode*)next_node())) {
    const char* vname = "<no-vol>";
    const char* sname = "<no-shp>";

    TGeoVolume* v = geon->GetVolume();
    if(v) {
      vname = v->GetName();
      TGeoShape* s = v->GetShape();
      if(s) {
	sname = s->GetName();
      }

      GeoUserData* ud = dynamic_cast<GeoUserData*> (v->GetField());
      if (ud == 0) {
        insert_node(geon, holder, GForm("%s::%s", vname, sname));
      }

      if (ud && ((ud->bIsImported) == false)) {
        insert_node(geon, holder, GForm("%s::%s", vname, sname));
      }
      ni++;
    }
  }
  if(ni) SetRnrSelf(false);
}

/**************************************************************************/
// Importers/Collapsors for daughters.
/**************************************************************************/

void ZGeoNode::ImportNodes()
{
  // Reads mTGeoNode and creates
  // representative ZGeoNode node.

  static const Exc_t _eh("ZGeoNode::ImportNodes ");
  _assert_tnode(_eh);

  RemoveLensesViaQueen(true);

  Int_t ni=0;
  TIter next_node(mTNode->GetNodes());
  TGeoNode* geon;

  while((geon = (TGeoNode*)next_node())) {
    const char* vname = "<no-vol>";
    const char* sname = "<no-shp>";

    TGeoVolume* v = geon->GetVolume();
    if(v) {
      vname = v->GetName();
      TGeoShape* s = v->GetShape();
      if(s) {
	sname = s->GetName();
      }
    }
    insert_node(geon, this, GForm("%s::%s", vname, sname));
    ni++;
  }
  if(ni) SetRnrSelf(false);
}

void  ZGeoNode::Collapse()
{
  RemoveLensesViaQueen(true);
  SetRnrSelf(true);
}

void ZGeoNode::ImportNodesWCollect()
{
  // Import mTGeoNode and groups the nodes by
  // mother volume name.

  static const Exc_t _eh("ZGeoNode::ImportNodesWCollect ");

  _assert_tnode(_eh);

  RemoveLensesViaQueen(true);

  map<TString, ZGeoNode*> nmap;
  TIter next_node(mTNode->GetNodes());
  TGeoNode* geon;
  Int_t ni=0;
  while((geon = (TGeoNode*)next_node())) {
    const char* vname = "<no-vol>";
    const char* sname = "<no-shp>";

    TGeoVolume* v = geon->GetVolume();
    if(v) {
      vname = v->GetName();
      TGeoShape* s = v->GetShape();
      if(s) {
	sname = s->GetName();
      }
    }

    ZGeoNode* holder = 0;
    map<TString, ZGeoNode*>::iterator i = nmap.find(vname);
    if(i == nmap.end()) {
      ZGeoNode* n = new ZGeoNode(vname);
      mQueen->CheckIn(n);
      Add(n);
      nmap[vname] = n;
      holder = n;
    } else {
      holder = i->second;
    }
    insert_node(geon, holder, GForm("%s::%s", vname, sname));
    ni++;
  }
  if(ni) SetRnrSelf(false);
}

void ZGeoNode::ImportNodesRec(Int_t depth)
{
  ImportNodes();

  if(depth > 0) {
    lpZGeoNode_t l; CopyListByGlass<ZGeoNode>(l);

    for(lpZGeoNode_i n=l.begin(); n!=l.end(); ++n) {
      if((*n)->mNNodes > 0)
	(*n)->ImportNodesRec(depth - 1);
    }
  }
}

/**************************************************************************/
// Save/Load/Restore
/***************************************************************************/

void ZGeoNode::SaveToFile(Bool_t as_top_level, Bool_t save_links,
			  const Text_t* file)
{
  static const Exc_t _eh("ZGeoNode::SaveToFile ");

  if(file == 0 || strcmp(file,"") == 0) file = mDefFile.Data();
  ISdebug(1, _eh + "saving to '" + file + "'.");

  ZComet c("ZGeoNodes");
  if(save_links)
    c.mIgnoredLinks.insert("ZNode::Parent");

  if(as_top_level) {
    c.AddTopLevel(this, save_links, true, -1);
  } else {
    GMutexHolder llck(mListMutex);
    Stepper<> s(this);
    while(s.step())
      c.AddTopLevel(*s, save_links, true, -1);
  }
  TFile f(file, "RECREATE");
  c.Write();
  f.Close();
}

void ZGeoNode::LoadFromFile(const Text_t* file)
{
  static const Exc_t _eh("ZGeoNode::LoadFromFile ");

  if(file == 0 || strcmp(file,"") == 0) file = mDefFile.Data();
  ISdebug(1, _eh + "loading from '" + file + "'.");

  RemoveLensesViaQueen(true);

  TFile f(file, "READ");
  auto_ptr<ZComet> c( dynamic_cast<ZComet*>(f.Get("ZGeoNodes")) );
  f.Close();
  if(c.get() == 0) {
    // This check should be more elaborate ... but need common infrastructure
    // anyway.
    throw(_eh + "could not read 'ZGeoNodes' from file '" + file + "'.");
  }
  mQueen->AdoptComet(this, 0, c.get());
}

void ZGeoNode::Restore()
{
  // Has to be called after Load to reinitialize pointers to TGeo
  // structures. The method is virtual and overriden by ZGeoOvl.

  static const Exc_t _eh("ZGeoNode::Restore");

  ISdebug(1, GForm("%s", _eh.Data()));
  // printf("restoring node %s:%p \n", GetName(), this);
  if (! mTNodeName.IsNull()) {
    // search TGeoVolume to set it to zgeonode
    TGeoNode* sp =  get_tnode_search_point();
    if(sp && locate_tnode(this, sp)){
      // printf("Asserting faceset/user-data for TGeoNode '%s'.\n", GetTNode()->GetName());
      AssertUserData();
    }
  }
  {
    GMutexHolder llck(mListMutex);
    Stepper<ZGeoNode> s(this);
    while(s.step())
      s->Restore();
  }
}

/**************************************************************************/
// Protected methods
/*************************************************************************/


void ZGeoNode::setup_ztrans(ZNode* zn, const TGeoMatrix* gm)
{
  const Double_t* rm = gm->GetRotationMatrix();
  const Double_t* tv = gm->GetTranslation();
  ZTrans 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];
  zn->SetTrans(t);
}

void ZGeoNode::setup_color(Float_t alpha)
{
  Int_t ci = ((mTNode->GetColour() % 8) - 1) * 4;
  if(ci < 0) ci = 0;
  TColor* c = gROOT->GetColor(ci);
  if (c) {
    SetColor(c->GetRed(), c->GetGreen(), c->GetBlue(), alpha);
  } else {
    SetColor(1, 0, 0, alpha);
  }
}

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

ZGeoNode* ZGeoNode::insert_node(TGeoNode* geon, ZNode* holder,
			        const Text_t* title)
{
  // Creates ZGeoNode object from exported TGeoNode and adds it
  // to mGlasses list.

  TGeoVolume* v = geon->GetVolume();
  ZGeoNode *nn = new ZGeoNode(geon->GetName(), title);

  nn->mTNode = geon;
  setup_ztrans(nn, geon->GetMatrix());
  nn->mTNodeName = geon->GetName();
  TGeoMaterial* gmat = v->GetMedium() ? v->GetMaterial() : 0;
  TString m(gmat ? gmat->GetName() : "<null>");
  int j = m.First("$");
  if(j != kNPOS)
    m = m(0,j);
  nn->SetMaterial(m.Data());
  nn->mNNodes = geon->GetNdaughters();
  mQueen->CheckIn(nn);
  holder->Add(nn);
  nn->AssertUserData();
  nn->setup_color(mNodeAlpha);

  // printf("%-16s %-6s  [%p]\n", geon->GetName(), title,  v);
  return nn;
}

TGeoNode* ZGeoNode::get_tnode_search_point()
{
  static const Exc_t _eh("ZGeoNode::get_tnode_search_point ");

  ZGeoNode* p = dynamic_cast<ZGeoNode*>(GetParent());
  if(p && p->GetTNode() != 0) {
    return p->GetTNode();
  } else {
    // printf("GetTNodeSearchPoint searching from TOP node \n");
    if(!gGeoManager) {
      ISerr(GForm("%s gGeoManager not set.", _eh.Data()) );
      return 0;
    }
    return gGeoManager->GetTopNode();
  }
}

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

ZGeoNode* ZGeoNode::set_holder(lStr_t& node_names)
{
  if(node_names.empty()) return this;

  TString& name = node_names.front();
  ZGeoNode* next = dynamic_cast<ZGeoNode*>(GetElementByName(name));
  if(next == 0) {
    // printf("Create new node in LocateNode %s \n", name.Data());
    next = new ZGeoNode(name.Data());
    mQueen->CheckIn(next);
    Add(next);
  }

  node_names.pop_front();
  return next->set_holder(node_names);
}

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

Bool_t ZGeoNode::locate_tnode(ZGeoNode* zn, TGeoNode* cur_node)
{
  // Searches TGeoNode from cur_node whith name zn->mTNodeName
  // and sets the mTNode value to zn. The function is needed when
  // restoring geometry from *.root files.

  TGeoVolume* vol = cur_node->GetVolume();

  TGeoNode* n = 0;
  if(vol->GetNodes()) {
    n = vol->FindNode(zn->GetTNodeName());
    if(n) {
      zn->SetTNode(n);
      return true;
    }
  }

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