ROOT logo
// $Id: ZGeoRepacker.cxx 2088 2008-11-23 20:26:46Z 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/.

//__________________________________________________________________________
// ZGeoRepacker
//
//

#include "ZGeoRepacker.h"
#include "ZGeoRepacker.c7"

#include <Stones/TGeoShapeExtract.h>

#include <TGeoManager.h>

#include <TFile.h>

ClassImp(ZGeoRepacker);

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

void ZGeoRepacker::_init()
{
  // *** Set all links to 0 ***
  mRoot = 0;
  mOutFile = "simple_geo.root";
}

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

void ZGeoRepacker::RepackGeometry()
{
  mSrcGeo = gGeoManager; // Perhaps should import it independently.

  gGeoManager = 0;
  mNeoGeo = new TGeoManager("MicroALICE", "Very Simplified ALICE geometry");
  gGeoManager = mSrcGeo;

  repack_geometry(*mRoot, 0);

  gGeoManager = mNeoGeo;
  mNeoGeo->CloseGeometry();
  mNeoGeo->Export(mOutFile.Data(), "Xilpmis");
  delete mNeoGeo;
  mNeoGeo = 0;

  gGeoManager = mSrcGeo;
}

void ZGeoRepacker::repack_geometry(ZGeoNode* zgnode, TGeoVolume* parent_volume)
{
  bool recurse_p = false;
  TGeoNode*   tnode   = 0;
  TGeoVolume* tvolume = 0;
  TGeoShape*  tshape  = 0;

  tnode = zgnode->GetTNode();
  if(tnode == 0) {
    printf("Null node for %s; assuming it's a holder and descending.\n",
	   zgnode->Identify().Data());

    recurse_p = true;
    tvolume = parent_volume;
    goto recurse_loop;
  }

  tvolume = tnode->GetVolume();
  if(tvolume == 0) {
    printf("Null volume for %s; skipping.\n", zgnode->Identify().Data());
    return;
  }

  tshape  = tvolume->GetShape();
  if(tshape && HasShape(tshape) == false) {
    mNeoGeo->AddShape(tshape);
    PutShape(tshape);
  }
  // Materials, matrices?

  if(HasVolume(tvolume) == false) {
    tvolume->ClearNodes();
    tvolume->SetNtotal(0);
    mNeoGeo->AddVolume(tvolume);
    recurse_p = true;
  }
  PutVolume(tvolume);
  if(parent_volume == 0) {
    mNeoGeo->SetTopVolume(tvolume);
  } else {
    parent_volume->AddNode(tvolume, GetVolume(tvolume), tnode->GetMatrix());
  }

 recurse_loop:

  if(recurse_p) {
    list<ZGeoNode*> l; zgnode->CopyListByGlass<ZGeoNode>(l);
    for(list<ZGeoNode*>::iterator i=l.begin(); i!=l.end(); ++i)
      repack_geometry(*i, tvolume);
  }
}

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

void ZGeoRepacker::DumpShapeTree(const Text_t* name)
{
  TGeoShapeExtract* gse = dump_shape_tree(*mRoot, 0);
  TFile f(mOutFile, "UPDATE");
  gse->Write(name);
  f.Close();
}

TGeoShapeExtract*
ZGeoRepacker::dump_shape_tree(ZGeoNode* zgnode, TGeoShapeExtract* parent)
{
  TGeoNode*   tnode   = 0;
  TGeoVolume* tvolume = 0;
  TGeoShape*  tshape  = 0;

  tnode = zgnode->GetTNode();
  if(tnode == 0) {
    printf("Null node for %s; assuming it's a holder and descending.\n",
	   zgnode->Identify().Data());
    goto do_dump;
  }

  tvolume = tnode->GetVolume();
  if(tvolume == 0) {
    printf("Null volume for %s; skipping.\n", zgnode->Identify().Data());
    return 0;
  }

  tshape  = tvolume->GetShape();

do_dump:
  ZTrans trans;
  if (parent) trans.SetFromArray(parent->mTrans);
  trans *= zgnode->RefTrans();

  TGeoShapeExtract* gse = new TGeoShapeExtract(zgnode->GetName(),
					       zgnode->GetTitle());
  gse->SetTrans(trans.Array());
  gse->SetRGBA (zgnode->PtrColor()->array());
  gse->mRnrSelf     = zgnode->GetRnrSelf();
  gse->mRnrElements = zgnode->GetRnrElements();
  gse->mShape       = tshape;

  if ( ! zgnode->IsEmpty())
  {
    gse->mElements = new TList;
    gse->mElements->SetOwner(true);

    list<ZGeoNode*> l;
    zgnode->CopyListByGlass<ZGeoNode>(l);
    for(list<ZGeoNode*>::iterator i=l.begin(); i!=l.end(); ++i)
      dump_shape_tree(*i, gse);
  }

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

  return gse;
}
 ZGeoRepacker.cxx:1
 ZGeoRepacker.cxx:2
 ZGeoRepacker.cxx:3
 ZGeoRepacker.cxx:4
 ZGeoRepacker.cxx:5
 ZGeoRepacker.cxx:6
 ZGeoRepacker.cxx:7
 ZGeoRepacker.cxx:8
 ZGeoRepacker.cxx:9
 ZGeoRepacker.cxx:10
 ZGeoRepacker.cxx:11
 ZGeoRepacker.cxx:12
 ZGeoRepacker.cxx:13
 ZGeoRepacker.cxx:14
 ZGeoRepacker.cxx:15
 ZGeoRepacker.cxx:16
 ZGeoRepacker.cxx:17
 ZGeoRepacker.cxx:18
 ZGeoRepacker.cxx:19
 ZGeoRepacker.cxx:20
 ZGeoRepacker.cxx:21
 ZGeoRepacker.cxx:22
 ZGeoRepacker.cxx:23
 ZGeoRepacker.cxx:24
 ZGeoRepacker.cxx:25
 ZGeoRepacker.cxx:26
 ZGeoRepacker.cxx:27
 ZGeoRepacker.cxx:28
 ZGeoRepacker.cxx:29
 ZGeoRepacker.cxx:30
 ZGeoRepacker.cxx:31
 ZGeoRepacker.cxx:32
 ZGeoRepacker.cxx:33
 ZGeoRepacker.cxx:34
 ZGeoRepacker.cxx:35
 ZGeoRepacker.cxx:36
 ZGeoRepacker.cxx:37
 ZGeoRepacker.cxx:38
 ZGeoRepacker.cxx:39
 ZGeoRepacker.cxx:40
 ZGeoRepacker.cxx:41
 ZGeoRepacker.cxx:42
 ZGeoRepacker.cxx:43
 ZGeoRepacker.cxx:44
 ZGeoRepacker.cxx:45
 ZGeoRepacker.cxx:46
 ZGeoRepacker.cxx:47
 ZGeoRepacker.cxx:48
 ZGeoRepacker.cxx:49
 ZGeoRepacker.cxx:50
 ZGeoRepacker.cxx:51
 ZGeoRepacker.cxx:52
 ZGeoRepacker.cxx:53
 ZGeoRepacker.cxx:54
 ZGeoRepacker.cxx:55
 ZGeoRepacker.cxx:56
 ZGeoRepacker.cxx:57
 ZGeoRepacker.cxx:58
 ZGeoRepacker.cxx:59
 ZGeoRepacker.cxx:60
 ZGeoRepacker.cxx:61
 ZGeoRepacker.cxx:62
 ZGeoRepacker.cxx:63
 ZGeoRepacker.cxx:64
 ZGeoRepacker.cxx:65
 ZGeoRepacker.cxx:66
 ZGeoRepacker.cxx:67
 ZGeoRepacker.cxx:68
 ZGeoRepacker.cxx:69
 ZGeoRepacker.cxx:70
 ZGeoRepacker.cxx:71
 ZGeoRepacker.cxx:72
 ZGeoRepacker.cxx:73
 ZGeoRepacker.cxx:74
 ZGeoRepacker.cxx:75
 ZGeoRepacker.cxx:76
 ZGeoRepacker.cxx:77
 ZGeoRepacker.cxx:78
 ZGeoRepacker.cxx:79
 ZGeoRepacker.cxx:80
 ZGeoRepacker.cxx:81
 ZGeoRepacker.cxx:82
 ZGeoRepacker.cxx:83
 ZGeoRepacker.cxx:84
 ZGeoRepacker.cxx:85
 ZGeoRepacker.cxx:86
 ZGeoRepacker.cxx:87
 ZGeoRepacker.cxx:88
 ZGeoRepacker.cxx:89
 ZGeoRepacker.cxx:90
 ZGeoRepacker.cxx:91
 ZGeoRepacker.cxx:92
 ZGeoRepacker.cxx:93
 ZGeoRepacker.cxx:94
 ZGeoRepacker.cxx:95
 ZGeoRepacker.cxx:96
 ZGeoRepacker.cxx:97
 ZGeoRepacker.cxx:98
 ZGeoRepacker.cxx:99
 ZGeoRepacker.cxx:100
 ZGeoRepacker.cxx:101
 ZGeoRepacker.cxx:102
 ZGeoRepacker.cxx:103
 ZGeoRepacker.cxx:104
 ZGeoRepacker.cxx:105
 ZGeoRepacker.cxx:106
 ZGeoRepacker.cxx:107
 ZGeoRepacker.cxx:108
 ZGeoRepacker.cxx:109
 ZGeoRepacker.cxx:110
 ZGeoRepacker.cxx:111
 ZGeoRepacker.cxx:112
 ZGeoRepacker.cxx:113
 ZGeoRepacker.cxx:114
 ZGeoRepacker.cxx:115
 ZGeoRepacker.cxx:116
 ZGeoRepacker.cxx:117
 ZGeoRepacker.cxx:118
 ZGeoRepacker.cxx:119
 ZGeoRepacker.cxx:120
 ZGeoRepacker.cxx:121
 ZGeoRepacker.cxx:122
 ZGeoRepacker.cxx:123
 ZGeoRepacker.cxx:124
 ZGeoRepacker.cxx:125
 ZGeoRepacker.cxx:126
 ZGeoRepacker.cxx:127
 ZGeoRepacker.cxx:128
 ZGeoRepacker.cxx:129
 ZGeoRepacker.cxx:130
 ZGeoRepacker.cxx:131
 ZGeoRepacker.cxx:132
 ZGeoRepacker.cxx:133
 ZGeoRepacker.cxx:134
 ZGeoRepacker.cxx:135
 ZGeoRepacker.cxx:136
 ZGeoRepacker.cxx:137
 ZGeoRepacker.cxx:138
 ZGeoRepacker.cxx:139
 ZGeoRepacker.cxx:140
 ZGeoRepacker.cxx:141
 ZGeoRepacker.cxx:142
 ZGeoRepacker.cxx:143
 ZGeoRepacker.cxx:144
 ZGeoRepacker.cxx:145
 ZGeoRepacker.cxx:146
 ZGeoRepacker.cxx:147
 ZGeoRepacker.cxx:148
 ZGeoRepacker.cxx:149
 ZGeoRepacker.cxx:150
 ZGeoRepacker.cxx:151
 ZGeoRepacker.cxx:152
 ZGeoRepacker.cxx:153
 ZGeoRepacker.cxx:154
 ZGeoRepacker.cxx:155
 ZGeoRepacker.cxx:156
 ZGeoRepacker.cxx:157
 ZGeoRepacker.cxx:158
 ZGeoRepacker.cxx:159
 ZGeoRepacker.cxx:160
 ZGeoRepacker.cxx:161
 ZGeoRepacker.cxx:162
 ZGeoRepacker.cxx:163
 ZGeoRepacker.cxx:164
 ZGeoRepacker.cxx:165