ROOT logo
// @(#)root/geom:$Id: TGeoVolume.cxx 27731 2009-03-09 17:40:56Z brun $
// Author: Andrei Gheata   30/05/02
// Divide(), CheckOverlaps() implemented by Mihaela Gheata

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

//Begin_Html
/*
<img src="gif/t_volume.jpg">
*/
//End_Html

////////////////////////////////////////////////////////////////////////////////
//   TGeoVolume - the base class representing solids. 
//
//   Volumes are the basic objects used in building the geometrical hierarchy.
// They represent unpositioned objects but store all information about the
// placement of the other volumes they may contain. Therefore a volume can
// be replicated several times in the geometry. In order to create a volume, one
// has to put togeather a shape and a medium which are already defined. Volumes
// have to be named by users at creation time. Every different name may represent a 
// an unique volume object, but may also represent more general a family (class)
// of volume objects having the same shape type and medium, but possibly
// different shape parameters. It is the user's task to provide different names
// for different volume families in order to avoid ambiguities at tracking time.
// A generic family rather than a single volume is created only in two cases : 
// when a generic shape is provided to the volume constructor or when a division
// operation is applied. Each volume in the geometry stores an unique
// ID corresponding to its family. In order to ease-up their creation, the manager
// class is providing an API that allows making a shape and a volume in a single step.
//
//   Volumes are objects that can be visualized, therefore having visibility,
// colour, line and fill attributes that can be defined or modified any time after
// the volume creation. It is advisable however to define these properties just
// after the first creation of a volume namespace, since in case of volume families
// any new member created by the modeler inherits these properties. 
//
//    In order to provide navigation features, volumes have to be able to find
// the proper container of any point defined in the local reference frame. This
// can be the volume itself, one of its positioned daughter volumes or none if 
// the point is actually outside. On the other hand, volumes have to provide also
// other navigation methods such as finding the distances to its shape boundaries
// or which daughter will be crossed first. The implementation of these features
// is done at shape level, but the local mother-daughters management is handled
// by volumes that builds additional optimisation structures upon geometry closure.
// In order to have navigation features properly working one has to follow the
// general rules for building a valid geometry (see TGeoManager class).
//
//   Now let's make a simple volume representing a copper wire. We suppose that
// a medium is already created (see TGeoMedium class on how to create media). 
// We will create a TUBE shape for our wire, having Rmin=0cm, Rmax=0.01cm
// and a half-length dZ=1cm :
//
//   TGeoTube *tube = new TGeoTube("wire_tube", 0, 0.01, 1);
//
// One may ommit the name for the shape if no retreiving by name is further needed
// during geometry building. The same shape can be shared by different volumes 
// having different names and materials. Now let's make the volume for our wire.
// The prototype for volumes constructor looks like :
//
//   TGeoVolume::TGeoVolume(const char *name, TGeoShape *shape, TGeoMedium *med)
//
// Since TGeoTube derives brom the base shape class, we can provide it to the volume
// constructor :
//
//   TGeoVolume *wire_co = new TGeoVolume("WIRE_CO", tube, ptrCOPPER);
//
// Do not bother to delete neither the media, shapes or volumes that you have
// created since all will be automatically cleaned on exit by the manager class.
// If we would have taken a look inside TGeoManager::MakeTube() method, we would
// have been able to create our wire with a single line :
//
//   TGeoVolume *wire_co = gGeoManager->MakeTube("WIRE_CO", ptrCOPPER, 0, 0.01, 1);
//
// The same applies for all primitive shapes, for which there can be found
// corresponding MakeSHAPE() methods. Their usage is much more convenient unless 
// a shape has to be shared between more volumes. Let's make now an aluminium wire 
// having the same shape, supposing that we have created the copper wire with the 
// line above :
//
//   TGeoVolume *wire_al = new TGeoVolume("WIRE_AL", wire_co->GetShape(), ptrAL);
//
// Now that we have learned how to create elementary volumes, let's see how we
// can create a geometrical hierarchy.
//
//
//   Positioning volumes
// -----------------------
//
//   When creating a volume one does not specify if this will contain or not other
// volumes. Adding daughters to a volume implies creating those and adding them 
// one by one to the list of daughters. Since the volume has to know the position 
// of all its daughters, we will have to supply at the same time a geometrical 
// transformation with respect to its local reference frame for each of them.
// The objects referencing a volume and a transformation are called NODES and
// their creation is fully handled by the modeler. They represent the link 
// elements in the hierarchy of volumes. Nodes are unique and distinct geometrical
// objects ONLY from their container point of view. Since volumes can be replicated
// in the geometry, the same node may be found on different branches.
//
//Begin_Html
/*
<img src="gif/t_example.jpg">
*/
//End_Html
//
//   An important observation is that volume objects are owned by the TGeoManager
// class. This stores a list of all volumes in the geometry, that is cleaned
// upon destruction.
//
//   Let's consider positioning now our wire in the middle of a gas chamber. We 
// need first to define the gas chamber :
//
//   TGeoVolume *chamber = gGeoManager->MakeTube("CHAMBER", ptrGAS, 0, 1, 1);
// 
// Now we can put the wire inside :
//
//   chamber->AddNode(wire_co, 1);
//
// If we inspect now the chamber volume in a browser, we will notice that it has 
// one daughter. Of course the gas has some container also, but let's keep it like 
// that for the sake of simplicity. The full prototype of AddNode() is :
//
//   TGeoVolume::AddNode(TGeoVolume *daughter, Int_t usernumber, 
//                       TGeoMatrix *matrix=gGeoIdentity)
//
// Since we did not supplied the third argument, the wire will be positioned with
// an identity transformation inside the chamber. One will notice that the inner
// radii of the wire and chamber are both zero - therefore, aren't the two volumes
// overlapping ? The answer is no, the modeler is even relaying on the fact that
// any daughter is fully contained by its mother. On the other hand, neither of
// the nodes positioned inside a volume should overlap with each other. We will
// see that there are allowed some exceptions to those rules.
//
// Overlapping volumes
// --------------------
//
//   Positioning volumes that does not overlap their neighbours nor extrude
// their container is sometimes quite strong contrain. Some parts of the geometry
// might overlap naturally, e.g. two crossing tubes. The modeller supports such
// cases only if the overlapping nodes are declared by the user. In order to do
// that, one should use TGeoVolume::AddNodeOverlap() instead of TGeoVolume::AddNode().
//   When 2 or more positioned volumes are overlapping, not all of them have to
// be declared so, but at least one. A point inside an overlapping region equally
// belongs to all overlapping nodes, but the way these are defined can enforce
// the modeler to give priorities.
//   The general rule is that the deepest node in the hierarchy containing a point
// have the highest priority. For the same geometry level, non-overlapping is
// prioritized over overlapping. In order to illustrate this, we will consider 
// few examples. We will designate non-overlapping nodes as ONLY and the others
// MANY as in GEANT3, where this concept was introduced:
//   1. The part of a MANY node B extruding its container A will never be "seen" 
// during navigation, as if B was in fact the result of the intersection of A and B.
//   2. If we have two nodes A (ONLY) and B (MANY) inside the same container, all
// points in the overlapping region of A and B will be designated as belonging to A.
//   3. If A an B in the above case were both MANY, points in the overlapping 
// part will be designated to the one defined first. Both nodes must have the 
// same medium.
//   4. The silces of a divided MANY will be as well MANY.
//
// One needs to know that navigation inside geometry parts MANY nodes is much 
// slower. Any overlapping part can be defined based on composite shapes - this
// is always recommended. 

//   Replicating volumes
// -----------------------
//
//   What can we do if our chamber contains two identical wires instead of one ?
// What if then we would need 1000 chambers in our detector ? Should we create
// 2000 wires and 1000 chamber volumes ? No, we will just need to replicate the
// ones that we have already created.
//
//   chamber->AddNode(wire_co, 1, new TGeoTranslation(-0.2,0,0));
//   chamber->AddNode(wire_co, 2, new TGeoTranslation(0.2,0,0));
//
//   The 2 nodes that we have created inside chamber will both point to a wire_co
// object, but will be completely distinct : WIRE_CO_1 and WIRE_CO_2. We will
// want now to place symetrically 1000 chabmers on a pad, following a pattern
// of 20 rows and 50 columns. One way to do this will be to replicate our chamber
// by positioning it 1000 times in different positions of the pad. Unfortunatelly,
// this is far from being the optimal way of doing what we want.
// Imagine that we would like to find out which of the 1000 chambers is containing
// a (x,y,z) point defined in the pad reference. You will never have to do that,
// since the modeller will take care of it for you, but let's guess what it has 
// to do. The most simple algorithm will just loop over all daughters, convert
// the point from mother to local reference and check if the current chamber
// contains the point or not. This might be efficient for pads with few chambers,
// but definitely not for 1000. Fortunately the modeler is smarter than that and 
// create for each volume some optimization structures called voxels (see Voxelization) 
// to minimize the penalty having too many daughters, but if you have 100 pads like 
// this in your geometry you will anyway loose a lot in your tracking performance.
//
//   The way out when volumes can be arranged acording to simple patterns is the
// usage of divisions. We will describe them in detail later on. Let's think now
// at a different situation : instead of 1000 chambers of the same type, we may
// have several types of chambers. Let's say all chambers are cylindrical and have
// a wire inside, but their dimensions are different. However, we would like all
// to be represented by a single volume family, since they have the same properties.
//
//   Volume families
// ------------------
// A volume family is represented by the class TGeoVolumeMulti. It represents
// a class of volumes having the same shape type and each member will be 
// identified by the same name and volume ID. Any operation applied to a 
// TGeoVolume equally affects all volumes in that family. The creation of a 
// family is generally not a user task, but can be forced in particular cases:
//
//      TGeoManager::Volume(const char *vname, const char *shape, Int_t nmed);
//
// where VNAME is the family name, NMED is the medium number and SHAPE is the
// shape type that can be:
//   box    - for TGeoBBox
//   trd1   - for TGeoTrd1
//   trd2   - for TGeoTrd2
//   trap   - for TGeoTrap
//   gtra   - for TGeoGtra
//   para   - for TGeoPara
//   tube, tubs - for TGeoTube, TGeoTubeSeg
//   cone, cons - for TGeoCone, TgeoCons
//   eltu   - for TGeoEltu
//   ctub   - for TGeoCtub
//   pcon   - for TGeoPcon
//   pgon   - for TGeoPgon
//
// Volumes are then added to a given family upon adding the generic name as node
// inside other volume:
//   TGeoVolume *box_family = gGeoManager->Volume("BOXES", "box", nmed);
//   ...
//   gGeoManager->Node("BOXES", Int_t copy_no, "mother_name", 
//                     Double_t x, Double_t y, Double_t z, Int_t rot_index,
//                     Bool_t is_only, Double_t *upar, Int_t npar);
// here:
//   BOXES   - name of the family of boxes
//   copy_no - user node number for the created node
//   mother_name - name of the volume to which we want to add the node
//   x,y,z   - translation components
//   rot_index   - indx of a rotation matrix in the list of matrices
//   upar    - array of actual shape parameters
//   npar    - number of parameters
// The parameters order and number are the same as in the corresponding shape
// constructors.
//
//   An other particular case where volume families are used is when we want
// that a volume positioned inside a container to match one ore more container
// limits. Suppose we want to position the same box inside 2 different volumes
// and we want the Z size to match the one of each container:
//
//   TGeoVolume *container1 = gGeoManager->MakeBox("C1", imed, 10,10,30);
//   TGeoVolume *container2 = gGeoManager->MakeBox("C2", imed, 10,10,20);
//   TGeoVolume *pvol       = gGeoManager->MakeBox("PVOL", jmed, 3,3,-1);
//   container1->AddNode(pvol, 1);
//   container2->AddNode(pvol, 1);
//
//   Note that the third parameter of PVOL is negative, which does not make sense
// as half-length on Z. This is interpreted as: when positioned, create a box
// replacing all invalid parameters with the corresponding dimensions of the
// container. This is also internally handled by the TGeoVolumeMulti class, which
// does not need to be instanciated by users.
//
//   Dividing volumes
// ------------------
//
//   Volumes can be divided according a pattern. The most simple division can
// be done along one axis, that can be: X, Y, Z, Phi, Rxy or Rxyz. Let's take 
// the most simple case: we would like to divide a box in N equal slices along X
// coordinate, representing a new volume family. Supposing we already have created
// the initial box, this can be done like:
//
//      TGeoVolume *slicex = box->Divide("SLICEX", 1, N);
//
// where SLICE is the name of the new family representing all slices and 1 is the
// slicing axis. The meaning of the axis index is the following: for all volumes
// having shapes like box, trd1, trd2, trap, gtra or para - 1,2,3 means X,Y,Z; for
// tube, tubs, cone, cons - 1 means Rxy, 2 means phi and 3 means Z; for pcon and
// pgon - 2 means phi and 3 means Z; for spheres 1 means R and 2 means phi.
//   In fact, the division operation has the same effect as positioning volumes
// in a given order inside the divided container - the advantage being that the 
// navigation in such a structure is much faster. When a volume is divided, a
// volume family corresponding to the slices is created. In case all slices can
// be represented by a single shape, only one volume is added to the family and
// positioned N times inside the divided volume, otherwise, each slice will be 
// represented by a distinct volume in the family.
//   Divisions can be also performed in a given range of one axis. For that, one
// have to specify also the starting coordinate value and the step:
//
//      TGeoVolume *slicex = box->Divide("SLICEX", 1, N, start, step);
//
// A check is always done on the resulting division range : if not fitting into
// the container limits, an error message is posted. If we will browse the divided
// volume we will notice that it will contain N nodes starting with index 1 upto
// N. The first one has the lower X limit at START position, while the last one
// will have the upper X limit at START+N*STEP. The resulting slices cannot
// be positioned inside an other volume (they are by default positioned inside the
// divided one) but can be further divided and may contain other volumes:
//
//      TGeoVolume *slicey = slicex->Divide("SLICEY", 2, N1);
//      slicey->AddNode(other_vol, index, some_matrix);
//
//   When doing that, we have to remember that SLICEY represents a family, therefore
// all members of the family will be divided on Y and the other volume will be 
// added as node inside all.
//   In the example above all the resulting slices had the same shape as the
// divided volume (box). This is not always the case. For instance, dividing a
// volume with TUBE shape on PHI axis will create equal slices having TUBESEG 
// shape. Other divisions can alsoo create slices having shapes with different
// dimensins, e.g. the division of a TRD1 volume on Z. 
//   When positioning volumes inside slices, one can do it using the generic
// volume family (e.g. slicey). This should be done as if the coordinate system
// of the generic slice was the same as the one of the divided volume. The generic
// slice in case of PHI divisioned is centered with respect to X axis. If the
// family contains slices of different sizes, ani volume positioned inside should 
// fit into the smallest one.
//    Examples for specific divisions according to shape types can be found inside
// shape classes.
// 
//        TGeoVolume::Divide(N, Xmin, Xmax, "X"); 
//
//   The GEANT3 option MANY is supported by TGeoVolumeOverlap class. An overlapping
// volume is in fact a virtual container that does not represent a physical object.
// It contains a list of nodes that are not his daughters but that must be checked 
// always before the container itself. This list must be defined by users and it 
// is checked and resolved in a priority order. Note that the feature is non-standard
// to geometrical modelers and it was introduced just to support conversions of 
// GEANT3 geometries, therefore its extensive usage should be avoided.
//
//   The following picture represent how a simple geometry tree is built in
// memory.

#include "Riostream.h"
#include "TString.h"
#include "TBrowser.h"
#include "TStyle.h"
#include "TH2F.h"
#include "TPad.h"
#include "TROOT.h"
#include "TClass.h"
#include "TEnv.h"
#include "TMap.h"
#include "TFile.h"
#include "TKey.h"

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

ClassImp(TGeoVolume)

//_____________________________________________________________________________
TGeoVolume::TGeoVolume()
{ 
// dummy constructor
   fNodes    = 0;
   fShape    = 0;
   fFinder   = 0;
   fVoxels   = 0;
   fField    = 0;
   fMedium   = 0;
   fNumber   = 0;
   fNtotal   = 0;
   fOption   = "";
   fGeoManager = gGeoManager;
   TObject::ResetBit(kVolumeImportNodes);
}

//_____________________________________________________________________________
TGeoVolume::TGeoVolume(const char *name, const TGeoShape *shape, const TGeoMedium *med)
           :TNamed(name, "")
{
// default constructor
   fName = fName.Strip();
   fNodes    = 0;
   fShape    = (TGeoShape*)shape;
   if (fShape) {
      if (fShape->TestShapeBit(TGeoShape::kGeoBad)) {
         Warning("Ctor", "volume %s has invalid shape", name);
      }
      if (!fShape->IsValid()) {
         Fatal("ctor", "Shape of volume %s invalid. Aborting!", fName.Data());
      }   
   }      
   fFinder   = 0;
   fVoxels   = 0;
   fField    = 0;
   fOption   = "";
   fMedium   = (TGeoMedium*)med;
   if (fMedium) {
      if (fMedium->GetMaterial()) fMedium->GetMaterial()->SetUsed();
   }   
   fNumber   = 0;
   fNtotal   = 0;
   fGeoManager = gGeoManager;
   if (fGeoManager) fNumber = fGeoManager->AddVolume(this);
   TObject::ResetBit(kVolumeImportNodes);
}

//_____________________________________________________________________________
TGeoVolume::TGeoVolume(const TGeoVolume& gv) :
  TNamed(gv),
  TGeoAtt(gv),
  TAttLine(gv),
  TAttFill(gv),
  TAtt3D(gv),
  fNodes(gv.fNodes),
  fShape(gv.fShape),
  fMedium(gv.fMedium),
  fFinder(gv.fFinder),
  fVoxels(gv.fVoxels),
  fGeoManager(gv.fGeoManager),
  fField(gv.fField),
  fOption(gv.fOption),
  fNumber(gv.fNumber),
  fNtotal(gv.fNtotal)
{ 
   //copy constructor
}

//_____________________________________________________________________________
TGeoVolume& TGeoVolume::operator=(const TGeoVolume& gv) 
{
   //assignment operator
   if(this!=&gv) {
      TNamed::operator=(gv);
      TGeoAtt::operator=(gv);
      TAttLine::operator=(gv);
      TAttFill::operator=(gv);
      TAtt3D::operator=(gv);
      fNodes=gv.fNodes;
      fShape=gv.fShape;
      fMedium=gv.fMedium;
      fFinder=gv.fFinder;
      fVoxels=gv.fVoxels;
      fGeoManager=gv.fGeoManager;
      fField=gv.fField;
      fOption=gv.fOption;
      fNumber=gv.fNumber;
      fNtotal=gv.fNtotal;
   } 
   return *this;
}

//_____________________________________________________________________________
TGeoVolume::~TGeoVolume()
{
// Destructor
   
   if (fNodes) { 
      if (!TObject::TestBit(kVolumeImportNodes)) {
         fNodes->Delete();
      }   
      delete fNodes;
   }
   if (fFinder && !TObject::TestBit(kVolumeImportNodes | kVolumeClone) ) delete fFinder;
   if (fVoxels) delete fVoxels;
}

//_____________________________________________________________________________
void TGeoVolume::Browse(TBrowser *b)
{
// How to browse a volume
   if (!b) return;

//   if (!GetNdaughters()) b->Add(this, GetName(), IsVisible());
   TGeoVolume *daughter;
   TString title;
   for (Int_t i=0; i<GetNdaughters(); i++) { 
      daughter = GetNode(i)->GetVolume();
      if(!strlen(daughter->GetTitle())) {
         if (daughter->IsAssembly()) title.Form("Assembly with %d daughter(s)", 
                                                daughter->GetNdaughters());
         else if (daughter->GetFinder()) {
            TString s1 = daughter->GetFinder()->ClassName();
            s1.ReplaceAll("TGeoPattern","");
            title.Form("Volume having %s shape divided in %d %s slices",
                       daughter->GetShape()->ClassName(),daughter->GetNdaughters(), s1.Data()); 
                       
         } else title.Form("Volume with %s shape having %d daughter(s)", 
                         daughter->GetShape()->ClassName(),daughter->GetNdaughters());
         daughter->SetTitle(title.Data());
      }   
      b->Add(daughter, daughter->GetName(), daughter->IsVisible());
//      if (IsVisDaughters())
//      b->AddCheckBox(daughter, daughter->IsVisible());
//      else
//         b->AddCheckBox(daughter, kFALSE);
   }
}

//_____________________________________________________________________________
Double_t TGeoVolume::Capacity() const
{
// Computes the capacity of this [cm^3] as the capacity of its shape.
// In case of assemblies, the capacity is computed as the sum of daughter's capacities.
   if (!IsAssembly()) return fShape->Capacity();
   Double_t capacity = 0.0;
   Int_t nd = GetNdaughters();
   Int_t i;
   for (i=0; i<nd; i++) capacity += GetNode(i)->GetVolume()->Capacity();
   return capacity;
}   

//_____________________________________________________________________________
void TGeoVolume::CheckGeometry(Int_t nrays, Double_t startx, Double_t starty, Double_t startz) const
{
// Shoot nrays with random directions from starting point (startx, starty, startz)
// in the reference frame of this volume. Track each ray until exiting geometry, then
// shoot backwards from exiting point and compare boundary crossing points.
   TGeoVolume *old_vol = fGeoManager->GetTopVolume();
   if (old_vol!=this) fGeoManager->SetTopVolume((TGeoVolume*)this);
   else old_vol=0;
   fGeoManager->GetTopVolume()->Draw();
   TVirtualGeoPainter *painter = fGeoManager->GetGeomPainter();
   painter->CheckGeometry(nrays, startx, starty, startz);
}         

//_____________________________________________________________________________
void TGeoVolume::CheckOverlaps(Double_t ovlp, Option_t *option) const
{
// Overlap checking tool. Check for illegal overlaps within a limit OVLP.
// Use option="s[number]" to force overlap checking by sampling volume with
// [number] points.
// Ex: myVol->CheckOverlaps(0.01, "s10000000"); // shoot 10000000 points
//     myVol->CheckOverlaps(0.01, "s"); // shoot the default value of 1e6 points

   if (!GetNdaughters() || fFinder) return;
   Bool_t sampling = kFALSE;
   TString opt(option);
   opt.ToLower();
   if (opt.Contains("s")) sampling = kTRUE;
   TVirtualGeoPainter *painter = fGeoManager->GetGeomPainter();
   if (!sampling) fGeoManager->SetNsegments(80);
   if (!fGeoManager->IsCheckingOverlaps()) {
      fGeoManager->ClearOverlaps();
//      Info("CheckOverlaps", "=== Checking overlaps for volume %s ===\n", GetName());
   }   
   painter->CheckOverlaps(this, ovlp, option);
//   if (sampling) return;
   if (!fGeoManager->IsCheckingOverlaps()) {
      fGeoManager->SortOverlaps();
      TObjArray *overlaps = fGeoManager->GetListOfOverlaps();
      Int_t novlps = overlaps->GetEntriesFast();
      TNamed *obj;
      char name[15];
      char num[15];
      Int_t ndigits=1;
      Int_t i,j, result=novlps;
      while ((result /= 10)) ndigits++;
      for (i=0; i<novlps; i++) {
         obj = (TNamed*)overlaps->At(i);
         result = i;
         name[0] = 'o';
         name[1] = 'v';
         for (j=0; j<ndigits; j++) name[j+2]='0';
         name[ndigits+2] = 0;
         sprintf(num,"%i", i);
         memcpy(name+2+ndigits-strlen(num), num, strlen(num));
         obj->SetName(name);
      }   
      if (novlps) Info("CheckOverlaps", "Number of illegal overlaps/extrusions for volume %s: %d\n", GetName(), novlps);
   }   
}

//_____________________________________________________________________________
void TGeoVolume::CleanAll()
{
// Clean data of the volume.
   ClearNodes();
   ClearShape();
}

//_____________________________________________________________________________
void TGeoVolume::ClearShape()
{
// Clear the shape of this volume from the list held by the current manager.
   fGeoManager->ClearShape(fShape);
}   

//_____________________________________________________________________________
void TGeoVolume::CheckShapes()
{
// check for negative parameters in shapes.
// THIS METHOD LEAVES SOME GARBAGE NODES -> memory leak, to be fixed
//   printf("---Checking daughters of volume %s\n", GetName());
   if (fShape->IsRunTimeShape()) {
      Error("CheckShapes", "volume %s has run-time shape", GetName());
      InspectShape();
      return;
   }   
   if (!fNodes) return;
   Int_t nd=fNodes->GetEntriesFast();
   TGeoNode *node = 0;
   TGeoNode *new_node;
   const TGeoShape *shape = 0;
   TGeoVolume *old_vol;
   for (Int_t i=0; i<nd; i++) {
      node=(TGeoNode*)fNodes->At(i);
      // check if node has name
      if (!strlen(node->GetName())) printf("Daughter %i of volume %s - NO NAME!!!\n",
                                           i, GetName());
      old_vol = node->GetVolume();
      shape = old_vol->GetShape();
      if (shape->IsRunTimeShape()) {
//         printf("   Node %s/%s has shape with negative parameters. \n", 
//                 GetName(), node->GetName());
//         old_vol->InspectShape();
         // make a copy of the node
         new_node = node->MakeCopyNode();
         TGeoShape *new_shape = shape->GetMakeRuntimeShape(fShape, node->GetMatrix());
         if (!new_shape) {
            Error("CheckShapes","cannot resolve runtime shape for volume %s/%s\n",
                   GetName(),old_vol->GetName());
            continue;
         }         
         TGeoVolume *new_volume = old_vol->MakeCopyVolume(new_shape);
//         printf(" new volume %s shape params :\n", new_volume->GetName());
//         new_volume->InspectShape();
         new_node->SetVolume(new_volume);
         // decouple the old node and put the new one instead
         fNodes->AddAt(new_node, i);
//         new_volume->CheckShapes();
      }
   }
}     

//_____________________________________________________________________________
Int_t TGeoVolume::CountNodes(Int_t nlevels, Int_t option)
{
// Count total number of subnodes starting from this volume, nlevels down
// option = 0 (default) - count only once per volume
// option = 1           - count every time
// option = 2           - count volumes on visible branches
// option = 3           - return maximum level counted already with option = 0
   static Int_t maxlevel = 0;
   static Int_t nlev = 0;
   
   if (option<0 || option>3) option = 0;
   Int_t visopt = 0;
   Int_t nd = GetNdaughters();
   Bool_t last = (!nlevels || !nd)?kTRUE:kFALSE;
   switch (option) {
      case 0:
         if (fNtotal) return fNtotal;
      case 1:   
         fNtotal = 1;
         break;
      case 2:
         visopt = fGeoManager->GetVisOption();
         if (!IsVisDaughters()) last = kTRUE;
         switch (visopt) {
            case TVirtualGeoPainter::kGeoVisDefault:
               fNtotal = (IsVisible())?1:0;
               break;   
            case TVirtualGeoPainter::kGeoVisLeaves:
               fNtotal = (IsVisible() && last)?1:0;
         }
         if (!IsVisibleDaughters()) return fNtotal;
         break;
      case 3:
         return maxlevel;   
   }      
   if (last) return fNtotal;
   if (gGeoManager->GetTopVolume() == this) {
      maxlevel=0;
      nlev = 0;
   }   
   if (nlev>maxlevel) maxlevel = nlev;   
   TGeoNode *node;
   TGeoVolume *vol;
   nlev++;
   for (Int_t i=0; i<nd; i++) {
      node = GetNode(i);
      vol = node->GetVolume();
      fNtotal += vol->CountNodes(nlevels-1, option);
   }
   nlev--;
   return fNtotal;
}

//_____________________________________________________________________________
Bool_t TGeoVolume::IsAllInvisible() const
{
// Return TRUE if volume and all daughters are invisible.
   if (IsVisible()) return kFALSE;
   Int_t nd = GetNdaughters();
   for (Int_t i=0; i<nd; i++) if (GetNode(i)->GetVolume()->IsVisible()) return kFALSE;
   return kTRUE;
}   

//_____________________________________________________________________________
void TGeoVolume::InvisibleAll(Bool_t flag)
{
// Make volume and each of it daughters (in)visible.
   SetAttVisibility(!flag);
   Int_t nd = GetNdaughters();
   TObjArray *list = new TObjArray(nd+1);
   list->Add(this);
   TGeoVolume *vol;
   for (Int_t i=0; i<nd; i++) {
      vol = GetNode(i)->GetVolume();
      vol->SetAttVisibility(!flag);
      list->Add(vol);
   }
   TIter next(gROOT->GetListOfBrowsers());
   TBrowser *browser = 0;
   while ((browser=(TBrowser*)next())) {
      for (Int_t i=0; i<nd+1; i++) {
         vol = (TGeoVolume*)list->At(i);
         browser->CheckObjectItem(vol, !flag);
      }   
      browser->Refresh();
   }
   delete list;
   fGeoManager->SetVisOption(4);
}   

//_____________________________________________________________________________
Bool_t TGeoVolume::IsFolder() const
{
// Return TRUE if volume contains nodes
//   return (GetNdaughters()?kTRUE:kFALSE);
   return kTRUE;
}

//_____________________________________________________________________________
Bool_t TGeoVolume::IsStyleDefault() const
{
// check if the visibility and attributes are the default ones
   if (!IsVisible()) return kFALSE;
   if (GetLineColor() != gStyle->GetLineColor()) return kFALSE;
   if (GetLineStyle() != gStyle->GetLineStyle()) return kFALSE;
   if (GetLineWidth() != gStyle->GetLineWidth()) return kFALSE;
   return kTRUE;
}

//_____________________________________________________________________________
Bool_t TGeoVolume::IsTopVolume() const
{
// True if this is the top volume of the geometry
   if (fGeoManager->GetTopVolume() == this) return kTRUE;
   return kFALSE;
}

//_____________________________________________________________________________
Bool_t TGeoVolume::IsRaytracing() const
{
// Check if the painter is currently ray-tracing the content of this volume.
   return TGeoAtt::IsVisRaytrace();
}

//_____________________________________________________________________________
void TGeoVolume::InspectMaterial() const
{
// Inspect the material for this volume.
   fMedium->GetMaterial()->Print();
}

//_____________________________________________________________________________
TGeoVolume *TGeoVolume::Import(const char *filename, const char *name, Option_t * /*option*/)
{
// Import a volume from a file.
   if (!gGeoManager) gGeoManager = new TGeoManager("geometry","");
   if (!filename) return 0;
   TGeoVolume *volume = 0;
   if (strstr(filename,".gdml")) {
   // import from a gdml file
   } else {
   // import from a root file
      TFile *old = gFile;
      TFile *f = TFile::Open(filename);
      if (!f || f->IsZombie()) {
         if (old) old->cd();
         printf("Error: TGeoVolume::Import : Cannot open file %s\n", filename);
         return 0;
      }
      if (name && strlen(name) > 0) {
         volume = (TGeoVolume*)f->Get(name);
      } else {
         TIter next(f->GetListOfKeys());
         TKey *key;
         while ((key = (TKey*)next())) {
            if (strcmp(key->GetClassName(),"TGeoVolume") != 0) continue;
            volume = (TGeoVolume*)key->ReadObj();
            break;
         }
      }
      if (old) old->cd();
      delete f;         
   }
   if (!volume) return NULL;
   volume->RegisterYourself();
   return volume;
}
   
//_____________________________________________________________________________
Int_t TGeoVolume::Export(const char *filename, const char *name, Option_t *option)
{
// Export this volume to a file.
   //
   // -Case 1: root file or root/xml file
   //  if filename end with ".root". The key will be named name
   //  if filename end with ".xml" a root/xml file is produced.
   //
   // -Case 2: C++ script
   //  if filename end with ".C"
   //
   // -Case 3: gdml file
   //  if filename end with ".gdml"
   //  NOTE that to use this option, the PYTHONPATH must be defined like
   //      export PYTHONPATH=$ROOTSYS/lib:$ROOTSYS/gdml
   //
   TString sfile(filename);
   if (sfile.Contains(".C")) {
      //Save volume as a C++ script
      Info("Export","Exporting volume %s as C++ code", GetName());
      SaveAs(filename, "");
      return 1;
   }
   if (sfile.Contains(".gdml")) {
     //Save geometry as a gdml file
      Info("Export","Exporting %s as gdml code - not implemented yet", GetName());
      return 0;
   }   
   if (sfile.Contains(".root") || sfile.Contains(".xml")) {  
      //Save volume in a root file
      Info("Export","Exporting %s as root file.", GetName());
      TString opt(option);
      if (!opt.Length()) opt = "recreate";
      TFile *f = TFile::Open(filename,opt.Data());
      if (!f || f->IsZombie()) {
         Error("Export","Cannot open file");
         return 0;
      }   
      char keyname[256];
      if (name) strcpy(keyname,name);
      if (strlen(keyname) == 0) strcpy(keyname,GetName());
      Int_t nbytes = Write(keyname);
      delete f;
      return nbytes;
   }
   return 0;
}

//_____________________________________________________________________________
void TGeoVolume::cd(Int_t inode) const
{
// Actualize matrix of node indexed <inode>
   if (fFinder) fFinder->cd(inode-fFinder->GetDivIndex());
}

//_____________________________________________________________________________
void TGeoVolume::AddNode(const TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat, Option_t * /*option*/)
{
// Add a TGeoNode to the list of nodes. This is the usual method for adding
// daughters inside the container volume.
   TGeoMatrix *matrix = mat;
   if (matrix==0) matrix = gGeoIdentity;
   else           matrix->RegisterYourself();
   if (!vol) {
      Error("AddNode", "Volume is NULL");
      return;
   }
   if (!vol->IsValid()) {
      Error("AddNode", "Won't add node with invalid shape");
      printf("### invalid volume was : %s\n", vol->GetName());
      return;
   }   
   if (!fNodes) fNodes = new TObjArray();   

   if (fFinder) {
      // volume already divided.
      Error("AddNode", "Cannot add node %s_%i into divided volume %s", vol->GetName(), copy_no, GetName());
      return;
   }

   TGeoNodeMatrix *node = 0;
   char *name = 0;         
   node = new TGeoNodeMatrix(vol, matrix);
   node->SetMotherVolume(this);
   fNodes->Add(node);
   name = new char[strlen(vol->GetName())+15];
   sprintf(name, "%s_%i", vol->GetName(), copy_no);
   if (fNodes->FindObject(name))
      Warning("AddNode", "Volume %s : added node %s with same name", GetName(), name);
   node->SetName(name);
   delete [] name;
   node->SetNumber(copy_no);
}

//_____________________________________________________________________________
void TGeoVolume::AddNodeOffset(const TGeoVolume *vol, Int_t copy_no, Double_t offset, Option_t * /*option*/)
{
// Add a division node to the list of nodes. The method is called by
// TGeoVolume::Divide() for creating the division nodes.
   if (!vol) {
      Error("AddNodeOffset", "invalid volume");
      return;
   }
   if (!vol->IsValid()) {
      Error("AddNode", "Won't add node with invalid shape");
      printf("### invalid volume was : %s\n", vol->GetName());
      return;
   }   
   if (!fNodes) fNodes = new TObjArray();
   TGeoNode *node = new TGeoNodeOffset(vol, copy_no, offset);
   node->SetMotherVolume(this);
   fNodes->Add(node);
   char *name = new char[strlen(vol->GetName())+15];
   sprintf(name, "%s_%i", vol->GetName(), copy_no+1);
   node->SetName(name);
   delete [] name;
   node->SetNumber(copy_no+1);
}

//_____________________________________________________________________________
void TGeoVolume::AddNodeOverlap(const TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat, Option_t *option)
{
// Add a TGeoNode to the list of nodes. This is the usual method for adding
// daughters inside the container volume.
   if (vol->IsAssembly()) {
      Warning("AddNodeOverlap", "Declaring assembly %s as possibly overlapping inside %s not allowed. Using AddNode instead !",vol->GetName(),GetName());
      AddNode(vol, copy_no, mat, option);
      return;
   }   
   TGeoMatrix *matrix = mat;
   if (matrix==0) matrix = gGeoIdentity;
   else           matrix->RegisterYourself();
   if (!vol) {
      Error("AddNodeOverlap", "Volume is NULL");
      return;
   }
   if (!vol->IsValid()) {
      Error("AddNodeOverlap", "Won't add node with invalid shape");
      printf("### invalid volume was : %s\n", vol->GetName());
      return;
   }
   if (!fNodes) fNodes = new TObjArray();   

   if (fFinder) {
      // volume already divided.
      Error("AddNodeOverlap", "Cannot add node %s_%i into divided volume %s", vol->GetName(), copy_no, GetName());
      return;
   }

   TGeoNodeMatrix *node = 0;
   char *name = 0;

   node = new TGeoNodeMatrix(vol, matrix);
   node->SetMotherVolume(this);
   fNodes->Add(node);
   name = new char[strlen(vol->GetName())+15];
   sprintf(name, "%s_%i", vol->GetName(), copy_no);
   if (fNodes->FindObject(name))
      Warning("AddNode", "Volume %s : added node %s with same name", GetName(), name);
   node->SetName(name);
   delete [] name;
   node->SetNumber(copy_no);
   node->SetOverlapping();
   if (vol->GetMedium() == fMedium)
   node->SetVirtual();
}

//_____________________________________________________________________________
TGeoVolume *TGeoVolume::Divide(const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step, Int_t numed, Option_t *option)
{
// Division a la G3. The volume will be divided along IAXIS (see shape classes), in NDIV
// slices, from START with given STEP. The division volumes will have medium number NUMED.
// If NUMED=0 they will get the medium number of the divided volume (this). If NDIV<=0,
// all range of IAXIS will be divided and the resulting number of divisions will be centered on
// IAXIS. If STEP<=0, the real STEP will be computed as the full range of IAXIS divided by NDIV.
// Options (case insensitive):
//  N  - divide all range in NDIV cells (same effect as STEP<=0) (GSDVN in G3)
//  NX - divide range starting with START in NDIV cells          (GSDVN2 in G3)
//  S  - divide all range with given STEP. NDIV is computed and divisions will be centered
//         in full range (same effect as NDIV<=0)                (GSDVS, GSDVT in G3)
//  SX - same as DVS, but from START position.                   (GSDVS2, GSDVT2 in G3)

   if (fFinder) {
   // volume already divided.
      Fatal("Divide","volume %s already divided", GetName());
      return 0;
   }
   TString opt(option);
   opt.ToLower();
   TString stype = fShape->ClassName();
   if (!fNodes) fNodes = new TObjArray();
   Double_t xlo, xhi, range;
   range = fShape->GetAxisRange(iaxis, xlo, xhi);
   // for phi divisions correct the range
   if (!strcmp(fShape->GetAxisName(iaxis), "PHI")) {
      if ((start-xlo)<-1E-3) start+=360.;
      if (TGeoShape::IsSameWithinTolerance(range,360)) {
         xlo = start;
         xhi = start+range;
      }   
   }   
   if (range <=0) {
      InspectShape();
      Fatal("Divide", "cannot divide volume %s (%s) on %s axis", GetName(), stype.Data(), fShape->GetAxisName(iaxis));
      return 0;
   }
   if (ndiv<=0 || opt.Contains("s")) {
      if (step<=0) {
         Fatal("Divide", "invalid division type for volume %s : ndiv=%i, step=%g", GetName(), ndiv, step);
         return 0;
      }   
      if (opt.Contains("x")) {
         if ((xlo-start)>1E-3 || (xhi-start)<-1E-3) {
            Fatal("Divide", "invalid START=%g for division on axis %s of volume %s. Range is (%g, %g)",
                  start, fShape->GetAxisName(iaxis), GetName(), xlo, xhi);
            return 0;
         }
         xlo = start;
         range = xhi-xlo;
      }            
      ndiv = Int_t((range+0.1*step)/step);
      Double_t ddx = range - ndiv*step;
      // always center the division in this case
      if (ddx>1E-3) Warning("Divide", "division of volume %s on %s axis (ndiv=%d) will be centered in the full range",
                            GetName(), fShape->GetAxisName(iaxis), ndiv);
      start = xlo + 0.5*ddx;
   }
   if (step<=0 || opt.Contains("n")) {
      if (opt.Contains("x")) {
         if ((xlo-start)>1E-3 || (xhi-start)<-1E-3) {
            Fatal("Divide", "invalid START=%g for division on axis %s of volume %s. Range is (%g, %g)",
                  start, fShape->GetAxisName(iaxis), GetName(), xlo, xhi);
            return 0;
         }
         xlo = start;
         range = xhi-xlo;
      }     
      step  = range/ndiv;
      start = xlo;
   }
   
   Double_t end = start+ndiv*step;
   if (((start-xlo)<-1E-3) || ((end-xhi)>1E-3)) {
      Fatal("Divide", "division of volume %s on axis %s exceed range (%g, %g)",
            GetName(), fShape->GetAxisName(iaxis), xlo, xhi);
      return 0;
   }         
   TGeoVolume *voldiv = fShape->Divide(this, divname, iaxis, ndiv, start, step);
   if (numed) {
      TGeoMedium *medium = fGeoManager->GetMedium(numed);
      if (!medium) {
         Fatal("Divide", "invalid medium number %d for division volume %s", numed, divname);
         return voldiv;
      }   
      voldiv->SetMedium(medium);
      if (medium->GetMaterial()) medium->GetMaterial()->SetUsed();
   }   
   return voldiv; 
}

//_____________________________________________________________________________
Int_t TGeoVolume::DistancetoPrimitive(Int_t px, Int_t py)
{
// compute the closest distance of approach from point px,py to this volume
   if (gGeoManager != fGeoManager) gGeoManager = fGeoManager;
   TVirtualGeoPainter *painter = fGeoManager->GetPainter();
   Int_t dist = 9999;
   if (!painter) return dist;
   dist = painter->DistanceToPrimitiveVol(this, px, py);
   return dist;
}

//_____________________________________________________________________________
void TGeoVolume::Draw(Option_t *option)
{
// draw top volume according to option
   if (gGeoManager != fGeoManager) gGeoManager = fGeoManager;
   TVirtualGeoPainter *painter = fGeoManager->GetGeomPainter();
   TGeoAtt::SetVisRaytrace(kFALSE);
   if (!IsVisContainers()) SetVisLeaves();
   if (option && strlen(option) > 0) {
      painter->DrawVolume(this, option); 
   } else {
      painter->DrawVolume(this, gEnv->GetValue("Viewer3D.DefaultDrawOption",""));
   }  
}

//_____________________________________________________________________________
void TGeoVolume::DrawOnly(Option_t *option)
{
// draw only this volume
   if (IsAssembly()) {
      Info("DrawOnly", "Volume assemblies do not support this option.");
      return;
   }   
   if (gGeoManager != fGeoManager) gGeoManager = fGeoManager;
   SetVisOnly();
   TGeoAtt::SetVisRaytrace(kFALSE);
   TVirtualGeoPainter *painter = fGeoManager->GetGeomPainter();
   if (option && strlen(option) > 0) {
      painter->DrawVolume(this, option); 
   } else {
      painter->DrawVolume(this, gEnv->GetValue("Viewer3D.DefaultDrawOption",""));
   }  
}

//_____________________________________________________________________________
Bool_t TGeoVolume::OptimizeVoxels()
{
// Perform an exensive sampling to find which type of voxelization is
// most efficient.
   printf("Optimizing volume %s ...\n", GetName());
   TVirtualGeoPainter *painter = fGeoManager->GetGeomPainter();
   return painter->TestVoxels(this);   
}

//_____________________________________________________________________________
void TGeoVolume::Paint(Option_t *option)
{
// paint volume
   TVirtualGeoPainter *painter = fGeoManager->GetGeomPainter();
   painter->SetTopVolume(this);
//   painter->Paint(option);   
   if (option && strlen(option) > 0) {
      painter->Paint(option); 
   } else {
      painter->Paint(gEnv->GetValue("Viewer3D.DefaultDrawOption",""));
   }  
}

//_____________________________________________________________________________
void TGeoVolume::PrintVoxels() const
{
// Print the voxels for this volume.
   if (fVoxels) fVoxels->Print();
}

//_____________________________________________________________________________
void TGeoVolume::PrintNodes() const
{
// print nodes
   Int_t nd = GetNdaughters();
   for (Int_t i=0; i<nd; i++) {
      printf("%s\n", GetNode(i)->GetName());
      cd(i);
      GetNode(i)->GetMatrix()->Print();
   }   
}
//______________________________________________________________________________
TH2F *TGeoVolume::LegoPlot(Int_t ntheta, Double_t themin, Double_t themax,
                            Int_t nphi,   Double_t phimin, Double_t phimax,
                            Double_t rmin, Double_t rmax, Option_t *option)
{
// Generate a lego plot fot the top volume, according to option.
   TVirtualGeoPainter *p = fGeoManager->GetGeomPainter();
   TGeoVolume *old_vol = fGeoManager->GetTopVolume();
   if (old_vol!=this) fGeoManager->SetTopVolume(this);
   else old_vol=0;
   TH2F *hist = p->LegoPlot(ntheta, themin, themax, nphi, phimin, phimax, rmin, rmax, option);   
   hist->Draw("lego1sph");
   return hist;
}

//_____________________________________________________________________________
void TGeoVolume::RegisterYourself(Option_t *option)
{
// Register the volume and all materials/media/matrices/shapes to the manager.
   if (fGeoManager->GetListOfVolumes()->FindObject(this)) return;
   // Register volume
   fGeoManager->AddVolume(this);
   // Register shape
   if (!fGeoManager->GetListOfShapes()->FindObject(fShape)) {
      if (fShape->IsComposite()) {
         TGeoCompositeShape *comp = (TGeoCompositeShape*)fShape;
         comp->RegisterYourself();
      } else {
         fGeoManager->AddShape(fShape);   
      }
   }   
   // Register medium/material
   if (fMedium && !fGeoManager->GetListOfMedia()->FindObject(fMedium)) {
      fGeoManager->GetListOfMedia()->Add(fMedium);
      if (!fGeoManager->GetListOfMaterials()->FindObject(fMedium->GetMaterial()))
         fGeoManager->AddMaterial(fMedium->GetMaterial());
   }
   // Register matrices for nodes.
   TGeoMatrix *matrix;
   TGeoNode *node;
   Int_t nd = GetNdaughters();
   Int_t i;
   for (i=0; i<nd; i++) {
      node = GetNode(i);
      matrix = node->GetMatrix();
      if (!matrix->IsRegistered()) matrix->RegisterYourself();
      else if (!fGeoManager->GetListOfMatrices()->FindObject(matrix)) {
         fGeoManager->GetListOfMatrices()->Add(matrix);
      }
   }
   // Call RegisterYourself recursively
   for (i=0; i<nd; i++) GetNode(i)->GetVolume()->RegisterYourself(option);
}      
      
//_____________________________________________________________________________
void TGeoVolume::RandomPoints(Int_t npoints, Option_t *option)
{
// Draw random points in the bounding box of this volume.
   if (gGeoManager != fGeoManager) gGeoManager = fGeoManager;
   TGeoVolume *old_vol = fGeoManager->GetTopVolume();
   if (old_vol!=this) fGeoManager->SetTopVolume(this);
   else old_vol=0;
   fGeoManager->RandomPoints(this, npoints, option);
   if (old_vol) fGeoManager->SetTopVolume(old_vol);
}

//_____________________________________________________________________________
void TGeoVolume::RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz)
{
// Random raytracing method.
   if (gGeoManager != fGeoManager) gGeoManager = fGeoManager;
   TGeoVolume *old_vol = fGeoManager->GetTopVolume();
   if (old_vol!=this) fGeoManager->SetTopVolume(this);
   else old_vol=0;
   fGeoManager->RandomRays(nrays, startx, starty, startz);
   if (old_vol) fGeoManager->SetTopVolume(old_vol);
}

//_____________________________________________________________________________
void TGeoVolume::Raytrace(Bool_t flag)
{
// Draw this volume with current settings and perform raytracing in the pad.
   TGeoAtt::SetVisRaytrace(kFALSE);
   if (gGeoManager != fGeoManager) gGeoManager = fGeoManager;
   TVirtualGeoPainter *painter = fGeoManager->GetGeomPainter();
   Bool_t drawn = (painter->GetDrawnVolume()==this)?kTRUE:kFALSE;   
   if (!drawn) {
      painter->DrawVolume(this, "");
      TGeoAtt::SetVisRaytrace(flag);
      painter->ModifiedPad();
      return;
   }   
   TGeoAtt::SetVisRaytrace(flag);
   painter->ModifiedPad();
}   

//______________________________________________________________________________
void TGeoVolume::SaveAs(const char *filename, Option_t *option) const
{
//  Save geometry having this as top volume as a C++ macro.
   if (!filename) return;
   ofstream out;
   out.open(filename, ios::out);
   if (out.bad()) {
      Error("SavePrimitive", "Bad file name: %s", filename);
      return;
   }
   if (fGeoManager->GetTopVolume() != this) fGeoManager->SetTopVolume((TGeoVolume*)this);
   
   char fname[1000];
   strcpy(fname,filename);
   char *dot = strstr(fname,".");
   if (dot) *dot = 0;  
   out << "void "<<fname<<"() {" << endl;
   out << "   gSystem->Load(\"libGeom\");" << endl;
   ((TGeoVolume*)this)->SavePrimitive(out,option);
   out << "}" << endl;
}   

//______________________________________________________________________________
void TGeoVolume::SavePrimitive(ostream &out, Option_t *option /*= ""*/)
{
   // Save a primitive as a C++ statement(s) on output stream "out".
   out.precision(6);
   out.setf(ios::fixed);
   Int_t i,icopy;
   Int_t nd = GetNdaughters();
   TGeoVolume *dvol;
   TGeoNode *dnode;
   TGeoMatrix *matrix;

   // check if we need to save shape/volume
   Bool_t mustDraw = kFALSE;
   if (fGeoManager->GetGeomPainter()->GetTopVolume()==this) mustDraw = kTRUE;
   if (!strlen(option)) {
      fGeoManager->SetAllIndex();
      out << "   new TGeoManager(\"" << fGeoManager->GetName() << "\", \"" << fGeoManager->GetTitle() << "\");" << endl << endl;
//      if (mustDraw) out << "   Bool_t mustDraw = kTRUE;" << endl;
//      else          out << "   Bool_t mustDraw = kFALSE;" << endl;
      out << "   Double_t dx,dy,dz;" << endl;
      out << "   Double_t dx1, dx2, dy1, dy2;" << endl;
      out << "   Double_t vert[20], par[20];" << endl;
      out << "   Double_t theta, phi, h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2;" << endl;
      out << "   Double_t twist;" << endl;
      out << "   Double_t origin[3];" << endl;
      out << "   Double_t rmin, rmax, rmin1, rmax1, rmin2, rmax2;" << endl;
      out << "   Double_t r, rlo, rhi;" << endl;
      out << "   Double_t phi1, phi2;" << endl;
      out << "   Double_t a,b;" << endl;
      out << "   Double_t point[3], norm[3];" << endl;
      out << "   Double_t rin, stin, rout, stout;" << endl;
      out << "   Double_t thx, phx, thy, phy, thz, phz;" << endl;
      out << "   Double_t alpha, theta1, theta2, phi1, phi2, dphi;" << endl;
      out << "   Double_t tr[3], rot[9];" << endl;
      out << "   Double_t z, density, radl, absl, w;" << endl;
      out << "   Double_t lx,ly,lz,tx,ty,tz;" << endl;
      out << "   Double_t xvert[50], yvert[50];" << endl;
      out << "   Double_t zsect,x0,y0,scale0;" << endl;
      out << "   Int_t nel, numed, nz, nedges, nvert;" << endl;
      out << "   TGeoBoolNode *pBoolNode = 0;" << endl << endl;
      // first save materials/media
      out << "   // MATERIALS, MIXTURES AND TRACKING MEDIA" << endl;
      SavePrimitive(out, "m");
      // then, save matrices
      out << endl << "   // TRANSFORMATION MATRICES" << endl;
      SavePrimitive(out, "x");
      // save this volume and shape
      SavePrimitive(out, "s");
      out << endl << "   // SET TOP VOLUME OF GEOMETRY" << endl;
      out << "   gGeoManager->SetTopVolume(" << GetPointerName() << ");" << endl;
      // save daughters
      out << endl << "   // SHAPES, VOLUMES AND GEOMETRICAL HIERARCHY" << endl;
      SavePrimitive(out, "d");
      out << endl << "   // CLOSE GEOMETRY" << endl;
      out << "   gGeoManager->CloseGeometry();" << endl;
      if (mustDraw) {
         if (!IsRaytracing()) out << "   gGeoManager->GetTopVolume()->Draw();" << endl;
         else                 out << "   gGeoManager->GetTopVolume()->Raytrace();" << endl;
      }
      return;
   }
   // check if we need to save shape/volume
   if (!strcmp(option, "s")) {
      // create the shape for this volume
      if (TestAttBit(TGeoAtt::kSavePrimitiveAtt)) return;
      if (!IsAssembly()) {
         fShape->SavePrimitive(out,option);      
         out << "   // Volume: " << GetName() << endl;
         out << "   " << GetPointerName() << " = new TGeoVolume(\"" << GetName() << "\"," << fShape->GetPointerName() << ", "<< fMedium->GetPointerName() << ");" << endl;
      } else {
         out << "   // Assembly: " << GetName() << endl;
         out << "   " << GetPointerName() << " = new TGeoVolumeAssembly(\"" << GetName() << "\"" << ");" << endl;
      }           
      if (fLineColor != 1) out << "   " << GetPointerName() << "->SetLineColor(" << fLineColor << ");" << endl;
      if (fLineWidth != 1) out << "   " << GetPointerName() << "->SetLineWidth(" << fLineWidth << ");" << endl;
      if (fLineStyle != 1) out << "   " << GetPointerName() << "->SetLineStyle(" << fLineStyle << ");" << endl;
      if (!IsVisible() && !IsAssembly()) out << "   " << GetPointerName() << "->SetVisibility(kFALSE);" << endl;
      if (!IsVisibleDaughters()) out << "   " << GetPointerName() << "->VisibleDaughters(kFALSE);" << endl;
      if (IsVisContainers()) out << "   " << GetPointerName() << "->SetVisContainers(kTRUE);" << endl;
      if (IsVisLeaves()) out << "   " << GetPointerName() << "->SetVisLeaves(kTRUE);" << endl;
      SetAttBit(TGeoAtt::kSavePrimitiveAtt);
   }   
   // check if we need to save the media
   if (!strcmp(option, "m")) {
      if (fMedium) fMedium->SavePrimitive(out,option);
      for (i=0; i<nd; i++) {
         dvol = GetNode(i)->GetVolume();
         dvol->SavePrimitive(out,option);
      }
      return;      
   }   
   // check if we need to save the matrices
   if (!strcmp(option, "x")) {
      if (fFinder) {
         dvol = GetNode(0)->GetVolume();
         dvol->SavePrimitive(out,option);
         return;
      }
      for (i=0; i<nd; i++) {
         dnode = GetNode(i);
         matrix = dnode->GetMatrix();
         if (!matrix->IsIdentity()) matrix->SavePrimitive(out,option);
         dnode->GetVolume()->SavePrimitive(out,option);
      }
      return;      
   } 
   // check if we need to save volume daughters
   if (!strcmp(option, "d")) {
      if (!nd) return;
      if (TestAttBit(TGeoAtt::kSaveNodesAtt)) return;
      SetAttBit(TGeoAtt::kSaveNodesAtt);     
      if (fFinder) {
         // volume divided: generate volume->Divide()
         dnode = GetNode(0);
         dvol = dnode->GetVolume();
         out << "   TGeoVolume *" << dvol->GetPointerName() << " = ";
         out << GetPointerName() << "->Divide(\"" << dvol->GetName() << "\", ";
         fFinder->SavePrimitive(out,option);
         if (fMedium != dvol->GetMedium()) {
            out << ", " << dvol->GetMedium()->GetId();
         }
         out << ");" << endl;   
         dvol->SavePrimitive(out,"d");   
         return;
      }
      for (i=0; i<nd; i++) {
         dnode = GetNode(i);
         dvol = dnode->GetVolume();
         dvol->SavePrimitive(out,"s");
         matrix = dnode->GetMatrix();
         icopy = dnode->GetNumber();
         // generate AddNode()
         out << "   " << GetPointerName() << "->AddNode";
         if (dnode->IsOverlapping()) out << "Overlap";
         out << "(" << dvol->GetPointerName() << ", " << icopy;
         if (!matrix->IsIdentity()) out << ", " << matrix->GetPointerName();
         out << ");" << endl;
      }
      // Recursive loop to daughters
      for (i=0; i<nd; i++) {
         dnode = GetNode(i);
         dvol = dnode->GetVolume();
         dvol->SavePrimitive(out,"d");
      } 
   }   
}

//_____________________________________________________________________________
void TGeoVolume::UnmarkSaved()
{
// Reset SavePrimitive bits.
   ResetAttBit(TGeoAtt::kSavePrimitiveAtt);
   ResetAttBit(TGeoAtt::kSaveNodesAtt);
   if (fShape) fShape->ResetBit(TGeoShape::kGeoSavePrimitive);
}   

//_____________________________________________________________________________
void TGeoVolume::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
// Execute mouse actions on this volume.
   TVirtualGeoPainter *painter = fGeoManager->GetPainter();
   if (!painter) return;
   painter->ExecuteVolumeEvent(this, event, px, py);
}

//_____________________________________________________________________________
TGeoNode *TGeoVolume::FindNode(const char *name) const
{
// search a daughter inside the list of nodes
   return ((TGeoNode*)fNodes->FindObject(name));
}

//_____________________________________________________________________________
Int_t TGeoVolume::GetNodeIndex(const TGeoNode *node, Int_t *check_list, Int_t ncheck) const
{
// Get the index of a daugther within check_list by providing the node pointer.
   TGeoNode *current = 0;
   for (Int_t i=0; i<ncheck; i++) {
      current = (TGeoNode*)fNodes->At(check_list[i]);
      if (current==node) return check_list[i];
   }
   return -1;
}

//_____________________________________________________________________________
Int_t TGeoVolume::GetIndex(const TGeoNode *node) const
{
// get index number for a given daughter
   TGeoNode *current = 0;
   Int_t nd = GetNdaughters();
   if (!nd) return -1;
   for (Int_t i=0; i<nd; i++) {
      current = (TGeoNode*)fNodes->At(i);
      if (current==node) return i;
   }
   return -1;
}

//_____________________________________________________________________________
char *TGeoVolume::GetObjectInfo(Int_t px, Int_t py) const
{
// Get volume info for the browser.
   TGeoVolume *vol = (TGeoVolume*)this;
   TVirtualGeoPainter *painter = fGeoManager->GetPainter();
   if (!painter) return 0;
   return painter->GetVolumeInfo(vol, px, py);
}

//_____________________________________________________________________________
Bool_t TGeoVolume::GetOptimalVoxels() const
{
//--- Returns true if cylindrical voxelization is optimal.
   Int_t nd = GetNdaughters();
   if (!nd) return kFALSE;
   Int_t id;
   Int_t ncyl = 0;
   TGeoNode *node;
   for (id=0; id<nd; id++) {
      node = (TGeoNode*)fNodes->At(id);
      ncyl += node->GetOptimalVoxels();
   }
   if (ncyl>(nd/2)) return kTRUE;
   return kFALSE;
}      

//_____________________________________________________________________________
char *TGeoVolume::GetPointerName() const
{
// Provide a pointer name containing uid.
   static char name[40];
//   Int_t uid = GetUniqueID();
//   if (uid) sprintf(name,"p%s_%i", GetName(),uid);
//   else     sprintf(name,"p%s", GetName());
   sprintf(name, "p%s_%lx", GetName(), (ULong_t)this);
   return name;
}

//_____________________________________________________________________________
TGeoVoxelFinder *TGeoVolume::GetVoxels() const
{
// Getter for optimization structure.
   if (fVoxels && !fVoxels->IsInvalid()) return fVoxels;
   return NULL;
}   

//_____________________________________________________________________________
void TGeoVolume::GrabFocus()
{
// Move perspective view focus to this volume
   TVirtualGeoPainter *painter = fGeoManager->GetPainter();
   if (painter) painter->GrabFocus();
}   

//_____________________________________________________________________________
TGeoVolume *TGeoVolume::CloneVolume() const
{
// Clone this volume.
   // build a volume with same name, shape and medium
   TGeoVolume *vol = new TGeoVolume(GetName(), fShape, fMedium);
   Int_t i;
   // copy volume attributes
   vol->SetLineColor(GetLineColor());
   vol->SetLineStyle(GetLineStyle());
   vol->SetLineWidth(GetLineWidth());
   vol->SetFillColor(GetFillColor());
   vol->SetFillStyle(GetFillStyle());
   // copy other attributes
   Int_t nbits = 8*sizeof(UInt_t);
   for (i=0; i<nbits; i++) 
      vol->SetAttBit(1<<i, TGeoAtt::TestAttBit(1<<i));
   for (i=14; i<24; i++)
      vol->SetBit(1<<i, TestBit(1<<i));   
   
   // copy field
   vol->SetField(fField);
   // Set bits
   for (i=0; i<nbits; i++) 
      vol->SetBit(1<<i, TObject::TestBit(1<<i));
   vol->SetBit(kVolumeClone);   
   // copy nodes
//   CloneNodesAndConnect(vol);
   vol->MakeCopyNodes(this);   
   // if volume is divided, copy finder
   vol->SetFinder(fFinder);
   // copy voxels
   TGeoVoxelFinder *voxels = 0;
   if (fVoxels) {
      voxels = new TGeoVoxelFinder(vol);
      vol->SetVoxelFinder(voxels);
   }   
   // copy option, uid
   vol->SetOption(fOption);
   vol->SetNumber(fNumber);
   vol->SetNtotal(fNtotal);
   return vol;
}

//_____________________________________________________________________________
void TGeoVolume::CloneNodesAndConnect(TGeoVolume *newmother) const
{
// Clone the array of nodes.
   if (!fNodes) return;
   TGeoNode *node;
   Int_t nd = fNodes->GetEntriesFast();
   if (!nd) return;
   // create new list of nodes
   TObjArray *list = new TObjArray(nd);
   // attach it to new volume
   newmother->SetNodes(list);
//   ((TObject*)newmother)->SetBit(kVolumeImportNodes);
   for (Int_t i=0; i<nd; i++) {
      //create copies of nodes and add them to list
      node = GetNode(i)->MakeCopyNode();
      node->SetMotherVolume(newmother);
      list->Add(node);
   }
}

//_____________________________________________________________________________
void TGeoVolume::MakeCopyNodes(const TGeoVolume *other)
{
// make a new list of nodes and copy all nodes of other volume inside
   Int_t nd = other->GetNdaughters();
   if (!nd) return;
   if (fNodes) delete fNodes;   
   fNodes = new TObjArray();
   for (Int_t i=0; i<nd; i++) fNodes->Add(other->GetNode(i));
   TObject::SetBit(kVolumeImportNodes);
}      

//_____________________________________________________________________________
TGeoVolume *TGeoVolume::MakeCopyVolume(TGeoShape *newshape)
{
    // make a copy of this volume
   // build a volume with same name, shape and medium
   TGeoVolume *vol = new TGeoVolume(GetName(), newshape, fMedium);
   // copy volume attributes
   vol->SetVisibility(IsVisible());
   vol->SetLineColor(GetLineColor());
   vol->SetLineStyle(GetLineStyle());
   vol->SetLineWidth(GetLineWidth());
   vol->SetFillColor(GetFillColor());
   vol->SetFillStyle(GetFillStyle());
   // copy field
   vol->SetField(fField);
   // if divided, copy division object
   if (fFinder) {
//       Error("MakeCopyVolume", "volume %s divided", GetName());
      vol->SetFinder(fFinder);
   }   
   CloneNodesAndConnect(vol);
//   ((TObject*)vol)->SetBit(kVolumeImportNodes);
   ((TObject*)vol)->SetBit(kVolumeClone);
   return vol;       
}    

//_____________________________________________________________________________
TGeoVolume *TGeoVolume::MakeReflectedVolume(const char *newname) const
{
// Make a copy of this volume which is reflected with respect to XY plane.
   static TMap map(100);
   if (!fGeoManager->IsClosed()) {
      Error("MakeReflectedVolume", "Geometry must be closed.");
      return NULL;
   }   
   TGeoVolume *vol = (TGeoVolume*)map.GetValue(this);
   if (vol) {
      if (strlen(newname)) vol->SetName(newname);
      return vol;
   }
//   printf("Making reflection for volume: %s\n", GetName());   
   vol = CloneVolume();
   map.Add((TObject*)this, vol);
   if (strlen(newname)) vol->SetName(newname);
   delete vol->GetNodes();
   vol->SetNodes(NULL);
   vol->SetBit(kVolumeImportNodes, kFALSE);
   CloneNodesAndConnect(vol);
   // The volume is now properly cloned, but with the same shape.
   // Reflect the shape (if any) and connect it.
   if (fShape) {
      TGeoShape *reflected_shape = 
         TGeoScaledShape::MakeScaledShape("", fShape, new TGeoScale(1.,1.,-1.));
      vol->SetShape(reflected_shape);
   }   
   // Reflect the daughters.
   Int_t nd = vol->GetNdaughters();
   if (!nd) return vol;
   TGeoNodeMatrix *node;
   TGeoMatrix *local, *local_cloned;
   TGeoVolume *new_vol;
   if (!vol->GetFinder()) {
      for (Int_t i=0; i<nd; i++) {
         node = (TGeoNodeMatrix*)vol->GetNode(i);
         local = node->GetMatrix();
//         printf("%s before\n", node->GetName());
//         local->Print();
         Bool_t reflected = local->IsReflection();
         local_cloned = new TGeoCombiTrans(*local);
         local_cloned->RegisterYourself();
         node->SetMatrix(local_cloned);
         if (!reflected) {
         // We need to reflect only the translation and propagate to daughters.
            // H' = Sz * H * Sz
            local_cloned->ReflectZ(kTRUE);
            local_cloned->ReflectZ(kFALSE);
//            printf("%s after\n", node->GetName());
//            node->GetMatrix()->Print();
            new_vol = node->GetVolume()->MakeReflectedVolume();
            node->SetVolume(new_vol);
            continue;
         }
         // The next daughter is already reflected, so reflect on Z everything and stop
         local_cloned->ReflectZ(kTRUE); // rot + tr
//         printf("%s already reflected... After:\n", node->GetName());
//         node->GetMatrix()->Print();
      }
      if (vol->GetVoxels()) vol->GetVoxels()->Voxelize();
      return vol;
   }
   // Volume is divided, so we have to reflect the division.
//   printf("   ... divided %s\n", fFinder->ClassName());
   TGeoPatternFinder *new_finder = fFinder->MakeCopy(kTRUE);
   new_finder->SetVolume(vol);
   vol->SetFinder(new_finder);
   TGeoNodeOffset *nodeoff;
   new_vol = 0;
   for (Int_t i=0; i<nd; i++) {
      nodeoff = (TGeoNodeOffset*)vol->GetNode(i);
      nodeoff->SetFinder(new_finder);
      new_vol = nodeoff->GetVolume()->MakeReflectedVolume();
      nodeoff->SetVolume(new_vol); 
   }   
   return vol;
}
   
//_____________________________________________________________________________
void TGeoVolume::SetAsTopVolume()
{
// Set this volume as the TOP one (the whole geometry starts from here)
   fGeoManager->SetTopVolume(this);
}

//_____________________________________________________________________________
void TGeoVolume::SetCurrentPoint(Double_t x, Double_t y, Double_t z)
{
// Set the current tracking point.
   fGeoManager->SetCurrentPoint(x,y,z);
}

//_____________________________________________________________________________
void TGeoVolume::SetShape(const TGeoShape *shape)
{
// set the shape associated with this volume
   if (!shape) {
      Error("SetShape", "No shape");
      return;
   }
   fShape = (TGeoShape*)shape;  
}

//_____________________________________________________________________________
void TGeoVolume::SortNodes()
{
// sort nodes by decreasing volume of the bounding box. ONLY nodes comes first,
// then overlapping nodes and finally division nodes.
   if (!Valid()) {
      Error("SortNodes", "Bounding box not valid");
      return;
   }
   Int_t nd = GetNdaughters();
//   printf("volume : %s, nd=%i\n", GetName(), nd);
   if (!nd) return;
   if (fFinder) return;
//   printf("Nodes for %s\n", GetName());
   Int_t id = 0;
   TGeoNode *node = 0;
   TObjArray *nodes = new TObjArray(nd);
   Int_t inode = 0;
   // first put ONLY's
   for (id=0; id<nd; id++) {
      node = GetNode(id);
      if (node->InheritsFrom("TGeoNodeOffset") || node->IsOverlapping()) continue;
      nodes->Add(node);
//      printf("inode %i ONLY\n", inode);
      inode++;
   }
   // second put overlapping nodes
   for (id=0; id<nd; id++) {
      node = GetNode(id);
      if (node->InheritsFrom("TGeoNodeOffset") || (!node->IsOverlapping())) continue;
      nodes->Add(node);
//      printf("inode %i MANY\n", inode);
      inode++;
   }
   // third put the divided nodes
   if (fFinder) {
      fFinder->SetDivIndex(inode);
      for (id=0; id<nd; id++) {
         node = GetNode(id);
         if (!node->InheritsFrom("TGeoNodeOffset")) continue;
         nodes->Add(node);
//         printf("inode %i DIV\n", inode);
         inode++;
      }
   }
   if (inode != nd) printf(" volume %s : number of nodes does not match!!!\n", GetName());
   delete fNodes;
   fNodes = nodes;
}

//_____________________________________________________________________________
void TGeoVolume::Streamer(TBuffer &R__b)
{
   // Stream an object of class TGeoVolume.
   if (R__b.IsReading()) {
      R__b.ReadClassBuffer(TGeoVolume::Class(), this);
      if (fVoxels && fVoxels->IsInvalid()) Voxelize("");
   } else {
      if (!fVoxels) {
         R__b.WriteClassBuffer(TGeoVolume::Class(), this);
      } else {
         if (!fGeoManager->IsStreamingVoxels()) {
            TGeoVoxelFinder *voxels = fVoxels;
            fVoxels = 0;
            R__b.WriteClassBuffer(TGeoVolume::Class(), this);
            fVoxels = voxels;
         } else {
            R__b.WriteClassBuffer(TGeoVolume::Class(), this);
         }
      }
   }
}

//_____________________________________________________________________________
void TGeoVolume::SetOption(const char * /*option*/)
{
// Set the current options (none implemented)
}

//_____________________________________________________________________________
void TGeoVolume::SetLineColor(Color_t lcolor) 
{
// Set the line color.
   TAttLine::SetLineColor(lcolor);
}   

//_____________________________________________________________________________
void TGeoVolume::SetLineStyle(Style_t lstyle) 
{
// Set the line style.
   TAttLine::SetLineStyle(lstyle);
}   

//_____________________________________________________________________________
void TGeoVolume::SetLineWidth(Style_t lwidth) 
{
// Set the line width.
   TAttLine::SetLineWidth(lwidth);
}   

//_____________________________________________________________________________
TGeoNode *TGeoVolume::GetNode(const char *name) const
{
// get the pointer to a daughter node
   if (!fNodes) return 0;
   TGeoNode *node = (TGeoNode *)fNodes->FindObject(name);
   return node;
}

//_____________________________________________________________________________
Int_t TGeoVolume::GetByteCount() const
{
// get the total size in bytes for this volume
   Int_t count = 28+2+6+4+0;    // TNamed+TGeoAtt+TAttLine+TAttFill+TAtt3D
   count += strlen(GetName()) + strlen(GetTitle()); // name+title
   count += 4+4+4+4+4; // fShape + fMedium + fFinder + fField + fNodes
   count += 8 + strlen(fOption.Data()); // fOption
   if (fShape)  count += fShape->GetByteCount();
   if (fFinder) count += fFinder->GetByteCount();
   if (fNodes) {
      count += 32 + 4*fNodes->GetEntries(); // TObjArray
      TIter next(fNodes);
      TGeoNode *node;
      while ((node=(TGeoNode*)next())) count += node->GetByteCount();
   }
   return count;
}

//_____________________________________________________________________________
void TGeoVolume::FindOverlaps() const
{
// loop all nodes marked as overlaps and find overlaping brothers
   if (!Valid()) {
      Error("FindOverlaps","Bounding box not valid");
      return;
   }   
   if (!fVoxels) return;
   Int_t nd = GetNdaughters();
   if (!nd) return;
   TGeoNode *node=0;
   Int_t inode = 0;
   for (inode=0; inode<nd; inode++) {
      node = GetNode(inode);
      if (!node->IsOverlapping()) continue;
      fVoxels->FindOverlaps(inode);
   }
}

//_____________________________________________________________________________
void TGeoVolume::RemoveNode(TGeoNode *node) 
{
// Remove an existing daughter.
   if (!fNodes || !fNodes->GetEntriesFast()) return;
   if (!fNodes->Remove(node)) return;
   fNodes->Compress();
   if (fVoxels) fVoxels->SetNeedRebuild();
   if (IsAssembly()) fShape->ComputeBBox();
}   

//_____________________________________________________________________________
TGeoNode *TGeoVolume::ReplaceNode(TGeoNode *nodeorig, TGeoShape *newshape, TGeoMatrix *newpos, TGeoMedium *newmed) 
{
// Replace an existing daughter with a new volume having the same name but
// possibly a new shape, position or medium. Not allowed for positioned assemblies.
// For division cells, the new shape/matrix are ignored.
   Int_t ind = GetIndex(nodeorig);
   if (ind < 0) return NULL;
   TGeoVolume *oldvol = nodeorig->GetVolume();
   if (oldvol->IsAssembly()) {
      Error("ReplaceNode", "Cannot replace node %s since it is an assembly", nodeorig->GetName());
      return NULL;
   }   
   TGeoShape  *shape = oldvol->GetShape();
   if (newshape && !nodeorig->IsOffset()) shape = newshape;
   TGeoMatrix *pos = nodeorig->GetMatrix();
   if (newpos && !nodeorig->IsOffset())   pos = newpos;
   TGeoMedium *med = oldvol->GetMedium();
   if (newmed) med = newmed;
   // Make a new volume
   TGeoVolume *vol = new TGeoVolume(oldvol->GetName(), shape, med);
   // copy volume attributes
   vol->SetVisibility(oldvol->IsVisible());
   vol->SetLineColor(oldvol->GetLineColor());
   vol->SetLineStyle(oldvol->GetLineStyle());
   vol->SetLineWidth(oldvol->GetLineWidth());
   vol->SetFillColor(oldvol->GetFillColor());
   vol->SetFillStyle(oldvol->GetFillStyle());
   // copy field
   vol->SetField(oldvol->GetField());
   // Make a copy of the node
   TGeoNode *newnode = nodeorig->MakeCopyNode();
   // Change the volume for the new node
   newnode->SetVolume(vol);
   // Replace nodeorig with new one
   fNodes->RemoveAt(ind);
   fNodes->AddAt(newnode, ind);   
   if (fVoxels) fVoxels->SetNeedRebuild();
   if (IsAssembly()) fShape->ComputeBBox();
   return newnode;
}      

//_____________________________________________________________________________
void TGeoVolume::SelectVolume(Bool_t clear)
{
// Select this volume as matching an arbitrary criteria. The volume is added to
// a static list and the flag TGeoVolume::kVolumeSelected is set. All flags need
// to be reset at the end by calling the method with CLEAR=true. This will also clear 
// the list.
   static TObjArray array(256);
   static Int_t len = 0;
   Int_t i;
   TObject *vol;
   if (clear) {
      for (i=0; i<len; i++) {
         vol = array.At(i);
         vol->ResetBit(TGeoVolume::kVolumeSelected);
      }
      array.Clear();
      len = 0;
      return;
   }
   SetBit(TGeoVolume::kVolumeSelected);
   array.AddAtAndExpand(this, len++);
}      

//_____________________________________________________________________________
void TGeoVolume::SetVisibility(Bool_t vis)
{
// set visibility of this volume
   if (IsAssembly()) {
      Info("SetVisibility", "Volume assemblies do not have visibility");
      return;
   }   
   TGeoAtt::SetVisibility(vis);
   if (fGeoManager->IsClosed()) SetVisTouched(kTRUE);
   fGeoManager->SetVisOption(4);
   TSeqCollection *brlist = gROOT->GetListOfBrowsers();
   TIter next(brlist);
   TBrowser *browser = 0;
   while ((browser=(TBrowser*)next())) {
      browser->CheckObjectItem(this, vis);
      browser->Refresh();
   }
}   

//_____________________________________________________________________________
void TGeoVolume::SetVisContainers(Bool_t flag)
{
// Set visibility for containers.
   TGeoAtt::SetVisContainers(flag);
   if (fGeoManager && fGeoManager->IsClosed()) {
      if (flag) fGeoManager->SetVisOption(TVirtualGeoPainter::kGeoVisDefault);
      else      fGeoManager->SetVisOption(TVirtualGeoPainter::kGeoVisLeaves);
   }   
}
   
//_____________________________________________________________________________
void TGeoVolume::SetVisLeaves(Bool_t flag)
{
// Set visibility for leaves.
   TGeoAtt::SetVisLeaves(flag);
   if (fGeoManager && fGeoManager->IsClosed()) {
      if (flag) fGeoManager->SetVisOption(TVirtualGeoPainter::kGeoVisLeaves);
      else      fGeoManager->SetVisOption(TVirtualGeoPainter::kGeoVisDefault);
   }   
}

//_____________________________________________________________________________
void TGeoVolume::SetVisOnly(Bool_t flag)
{
// Set visibility for leaves.
   if (IsAssembly()) return;
   TGeoAtt::SetVisOnly(flag);
   if (fGeoManager && fGeoManager->IsClosed()) {
      if (flag) fGeoManager->SetVisOption(TVirtualGeoPainter::kGeoVisOnly);
      else      fGeoManager->SetVisOption(TVirtualGeoPainter::kGeoVisLeaves);
   }   
}

//_____________________________________________________________________________
Bool_t TGeoVolume::Valid() const
{
// Check if the shape of this volume is valid.
   return fShape->IsValidBox();
}

//_____________________________________________________________________________
Bool_t TGeoVolume::FindMatrixOfDaughterVolume(TGeoVolume *vol) const
{
// Find a daughter node having VOL as volume and fill TGeoManager::fHMatrix
// with its global matrix.
   if (vol == this) return kTRUE;
   Int_t nd = GetNdaughters();
   if (!nd) return kFALSE;
   TGeoHMatrix *global = fGeoManager->GetHMatrix();
   TGeoNode *dnode;
   TGeoVolume *dvol;
   TGeoMatrix *local;
   Int_t i;
   for (i=0; i<nd; i++) {
      dnode = GetNode(i);
      dvol = dnode->GetVolume();
      if (dvol == vol) {
         local = dnode->GetMatrix();
         global->MultiplyLeft(local);
         return kTRUE;
      }
   }
   for (i=0; i<nd; i++) {
      dnode = GetNode(i);
      dvol = dnode->GetVolume();
      if (dvol->FindMatrixOfDaughterVolume(vol)) return kTRUE;
   }
   return kFALSE;
}                    

//_____________________________________________________________________________
void TGeoVolume::VisibleDaughters(Bool_t vis)
{
// set visibility for daughters
   SetVisDaughters(vis);
   if (fGeoManager->IsClosed()) SetVisTouched(kTRUE);
   fGeoManager->SetVisOption(4);
}

//_____________________________________________________________________________
void TGeoVolume::Voxelize(Option_t *option)
{
// build the voxels for this volume 
   if (!Valid()) {
      Error("Voxelize", "Bounding box not valid");
      return; 
   }   
   // do not voxelize divided volumes
   if (fFinder) return;
   // or final leaves
   Int_t nd = GetNdaughters();
   if (!nd) return;
   // If this is an assembly, re-compute bounding box
   if (IsAssembly()) fShape->ComputeBBox();
   // delete old voxelization if any
   if (fVoxels) {
      if (!TObject::TestBit(kVolumeClone)) delete fVoxels;
      fVoxels = 0;
   }   
   // Create the voxels structure
   fVoxels = new TGeoVoxelFinder(this);
   fVoxels->Voxelize(option);
   if (fVoxels) {
      if (fVoxels->IsInvalid()) {
         delete fVoxels;
         fVoxels = 0;
      }
   }      
}

//_____________________________________________________________________________
Double_t TGeoVolume::Weight(Double_t precision, Option_t *option)
{
// Estimate the weight of a volume (in kg) with SIGMA(M)/M better than PRECISION.
// Option can contain : v - verbose, a - analytical  (default)
   TGeoVolume *top = fGeoManager->GetTopVolume();
   if (top != this) fGeoManager->SetTopVolume(this);
   else top = 0;
   Double_t weight =  fGeoManager->Weight(precision, option);
   if (top) fGeoManager->SetTopVolume(top);
   return weight;
}   

//_____________________________________________________________________________
Double_t TGeoVolume::WeightA() const
{
// Analytical computation of the weight.
   Double_t capacity = Capacity();
   Double_t weight = 0.0;
   Int_t i;
   Int_t nd = GetNdaughters();
   TGeoVolume *daughter;
   for (i=0; i<nd; i++) {
      daughter = GetNode(i)->GetVolume();
      weight += daughter->WeightA();
      capacity -= daughter->Capacity();
   }
   Double_t density = 0.0;
   if (!IsAssembly()) {
      if (fMedium) density = fMedium->GetMaterial()->GetDensity();
      if (density<0.01) density = 0.0; // do not weight gases
   }   
   weight += 0.001*capacity * density; //[kg]
   return weight;
}

ClassImp(TGeoVolumeMulti)


//_____________________________________________________________________________
TGeoVolumeMulti::TGeoVolumeMulti()
{ 
// dummy constructor
   fVolumes   = 0;
   fDivision = 0;
   fNumed = 0;
   fNdiv = 0;
   fAxis = 0;
   fStart = 0;
   fStep = 0;
   fAttSet = kFALSE;
   TObject::SetBit(kVolumeMulti);
}

//_____________________________________________________________________________
TGeoVolumeMulti::TGeoVolumeMulti(const char *name, TGeoMedium *med)
{
// default constructor
   fVolumes = new TObjArray();
   fDivision = 0;
   fNumed = 0;
   fNdiv = 0;
   fAxis = 0;
   fStart = 0;
   fStep = 0;
   fAttSet = kFALSE;
   TObject::SetBit(kVolumeMulti);
   SetName(name);
   SetMedium(med);
   fGeoManager->AddVolume(this);
//   printf("--- volume multi %s created\n", name);
}

//_____________________________________________________________________________
TGeoVolumeMulti::TGeoVolumeMulti(const TGeoVolumeMulti& vm) :
  TGeoVolume(vm),
  fVolumes(vm.fVolumes),
  fDivision(vm.fDivision),
  fNumed(vm.fNumed),
  fNdiv(vm.fNdiv),
  fAxis(vm.fAxis),
  fStart(vm.fStart),
  fStep(vm.fStep),
  fAttSet(vm.fAttSet)
{ 
   //copy constructor
}

//_____________________________________________________________________________
TGeoVolumeMulti& TGeoVolumeMulti::operator=(const TGeoVolumeMulti& vm) 
{
   //assignment operator
   if(this!=&vm) {
      TGeoVolume::operator=(vm);
      fVolumes=vm.fVolumes;
      fDivision=vm.fDivision;
      fNumed=vm.fNumed;
      fNdiv=vm.fNdiv;
      fAxis=vm.fAxis;
      fStart=vm.fStart;
      fStep=vm.fStep;
      fAttSet=vm.fAttSet;
   } 
   return *this;
}

//_____________________________________________________________________________
TGeoVolumeMulti::~TGeoVolumeMulti()
{
// Destructor
   if (fVolumes) delete fVolumes;
}

//_____________________________________________________________________________
void TGeoVolumeMulti::AddVolume(TGeoVolume *vol) 
{
// Add a volume with valid shape to the list of volumes. Copy all existing nodes
// to this volume
   Int_t idx = fVolumes->GetEntriesFast();
   fVolumes->AddAtAndExpand(vol,idx);
   vol->SetUniqueID(idx+1);
   TGeoVolumeMulti *div;
   TGeoVolume *cell;
   if (fDivision) {
      div = (TGeoVolumeMulti*)vol->Divide(fDivision->GetName(), fAxis, fNdiv, fStart, fStep, fNumed, fOption.Data());
      for (Int_t i=0; i<div->GetNvolumes(); i++) {
         cell = div->GetVolume(i);
         fDivision->AddVolume(cell);
      }
   }      
   if (fNodes) {
      Int_t nd = fNodes->GetEntriesFast();
      for (Int_t id=0; id<nd; id++) {
         TGeoNode *node = (TGeoNode*)fNodes->At(id);
         Bool_t many = node->IsOverlapping();
         if (many) vol->AddNodeOverlap(node->GetVolume(), node->GetNumber(), node->GetMatrix());
         else      vol->AddNode(node->GetVolume(), node->GetNumber(), node->GetMatrix());
      }
   }      
//      vol->MakeCopyNodes(this);
}
   

//_____________________________________________________________________________
void TGeoVolumeMulti::AddNode(const TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat, Option_t *option)
{
// Add a new node to the list of nodes. This is the usual method for adding
// daughters inside the container volume.
   TGeoVolume::AddNode(vol, copy_no, mat, option);
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoVolume *volume = 0;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      volume = GetVolume(ivo);
      volume->SetLineColor(GetLineColor());
      volume->SetLineStyle(GetLineStyle());
      volume->SetLineWidth(GetLineWidth());
      volume->SetVisibility(IsVisible());
      volume->AddNode(vol, copy_no, mat, option); 
   }
//   printf("--- vmulti %s : node %s added to %i components\n", GetName(), vol->GetName(), nvolumes);
}

//_____________________________________________________________________________
void TGeoVolumeMulti::AddNodeOverlap(const TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat, Option_t *option)
{
// Add a new node to the list of nodes, This node is possibly overlapping with other
// daughters of the volume or extruding the volume.
   TGeoVolume::AddNodeOverlap(vol, copy_no, mat, option);
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoVolume *volume = 0;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      volume = GetVolume(ivo);
      volume->SetLineColor(GetLineColor());
      volume->SetLineStyle(GetLineStyle());
      volume->SetLineWidth(GetLineWidth());
      volume->SetVisibility(IsVisible());
      volume->AddNodeOverlap(vol, copy_no, mat, option); 
   }
//   printf("--- vmulti %s : node ovlp %s added to %i components\n", GetName(), vol->GetName(), nvolumes);
}


//_____________________________________________________________________________
TGeoVolume *TGeoVolumeMulti::Divide(const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step, Int_t numed, const char *option)
{
// division of multiple volumes
   if (fDivision) {
      Error("Divide", "volume %s already divided", GetName());
      return 0;
   }   
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoMedium *medium = fMedium;
   if (numed) {
      medium = fGeoManager->GetMedium(numed);
      if (!medium) {
         Error("Divide", "Invalid medium number %d for division volume %s", numed, divname);
         medium = fMedium;
      }
   }      
   if (!nvolumes) {
      // this is a virtual volume
      fDivision = new TGeoVolumeMulti(divname, medium);
      fNumed = medium->GetId();
      fOption = option;
      fAxis = iaxis;
      fNdiv = ndiv;
      fStart = start;
      fStep = step;
      // nothing else to do at this stage
      return fDivision;
   }      
   TGeoVolume *vol = 0;
   fDivision = new TGeoVolumeMulti(divname, medium);
   if (medium) fNumed = medium->GetId();
   fOption = option;
   fAxis = iaxis;
   fNdiv = ndiv;
   fStart = start;
   fStep = step;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      vol = GetVolume(ivo);
      vol->SetLineColor(GetLineColor());
      vol->SetLineStyle(GetLineStyle());
      vol->SetLineWidth(GetLineWidth());
      vol->SetVisibility(IsVisible());
      fDivision->AddVolume(vol->Divide(divname,iaxis,ndiv,start,step, numed, option)); 
   }
//   printf("--- volume multi %s (%i volumes) divided\n", GetName(), nvolumes);
   if (numed) fDivision->SetMedium(medium);
   return fDivision;
}

//_____________________________________________________________________________
TGeoVolume *TGeoVolumeMulti::MakeCopyVolume(TGeoShape *newshape)
{
    // make a copy of this volume
//    printf("   Making a copy of %s\n", GetName());
   char *name = new char[strlen(GetName())+1];
   sprintf(name, "%s", GetName());
   // build a volume with same name, shape and medium
   TGeoVolume *vol = new TGeoVolume(name, newshape, fMedium);
   delete [] name;
   Int_t i=0;
   // copy volume attributes
   vol->SetVisibility(IsVisible());
   vol->SetLineColor(GetLineColor());
   vol->SetLineStyle(GetLineStyle());
   vol->SetLineWidth(GetLineWidth());
   vol->SetFillColor(GetFillColor());
   vol->SetFillStyle(GetFillStyle());
   // copy field
   vol->SetField(fField);
   // if divided, copy division object
//    if (fFinder) {
//       Error("MakeCopyVolume", "volume %s divided", GetName());
//       vol->SetFinder(fFinder);
//    }
   if (fDivision) {
      TGeoVolume *cell;
      TGeoVolumeMulti *div = (TGeoVolumeMulti*)vol->Divide(fDivision->GetName(), fAxis, fNdiv, fStart, fStep, fNumed, fOption.Data());
      for (i=0; i<div->GetNvolumes(); i++) {
         cell = div->GetVolume(i);
         fDivision->AddVolume(cell);
      }
   }      
                 
   if (!fNodes) return vol;
   TGeoNode *node;
   Int_t nd = fNodes->GetEntriesFast();
   if (!nd) return vol;
   // create new list of nodes
   TObjArray *list = new TObjArray();
   // attach it to new volume
   vol->SetNodes(list);
   ((TObject*)vol)->SetBit(kVolumeImportNodes);
   for (i=0; i<nd; i++) {
      //create copies of nodes and add them to list
      node = GetNode(i)->MakeCopyNode();
      node->SetMotherVolume(vol);
      list->Add(node);
   }
   return vol;       
}    

//_____________________________________________________________________________
void TGeoVolumeMulti::SetLineColor(Color_t lcolor) 
{
// Set the line color for all components.
   TGeoVolume::SetLineColor(lcolor);
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoVolume *vol = 0;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      vol = GetVolume(ivo);
      vol->SetLineColor(lcolor); 
   }
}

//_____________________________________________________________________________
void TGeoVolumeMulti::SetLineStyle(Style_t lstyle) 
{
// Set the line style for all components.
   TGeoVolume::SetLineStyle(lstyle); 
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoVolume *vol = 0;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      vol = GetVolume(ivo);
      vol->SetLineStyle(lstyle); 
   }
}

//_____________________________________________________________________________
void TGeoVolumeMulti::SetLineWidth(Width_t lwidth) 
{
// Set the line width for all components.
   TGeoVolume::SetLineWidth(lwidth);
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoVolume *vol = 0;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      vol = GetVolume(ivo);
      vol->SetLineWidth(lwidth); 
   }
}

//_____________________________________________________________________________
void TGeoVolumeMulti::SetMedium(TGeoMedium *med)
{
// Set medium for a multiple volume.
   TGeoVolume::SetMedium(med);
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoVolume *vol = 0;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      vol = GetVolume(ivo);
      vol->SetMedium(med); 
   }
}   


//_____________________________________________________________________________
void TGeoVolumeMulti::SetVisibility(Bool_t vis) 
{
// Set visibility for all components.
   TGeoVolume::SetVisibility(vis); 
   Int_t nvolumes = fVolumes->GetEntriesFast();
   TGeoVolume *vol = 0;
   for (Int_t ivo=0; ivo<nvolumes; ivo++) {
      vol = GetVolume(ivo);
      vol->SetVisibility(vis); 
   }
}

ClassImp(TGeoVolumeAssembly)

//_____________________________________________________________________________
TGeoVolumeAssembly::TGeoVolumeAssembly()
                   :TGeoVolume()
{
// Default constructor
   fCurrent = -1;
   fNext = -1;
}

//_____________________________________________________________________________
TGeoVolumeAssembly::TGeoVolumeAssembly(const char *name)
                   :TGeoVolume()
{
// Constructor. Just the name has to be provided. Assemblies does not have their own
// shape or medium.
   fName = name;
   fName = fName.Strip();
   fCurrent = -1;
   fNext = -1;
   fShape = new TGeoShapeAssembly(this);
   if (fGeoManager) fNumber = fGeoManager->AddVolume(this);
}

//_____________________________________________________________________________
TGeoVolumeAssembly::~TGeoVolumeAssembly()
{
// Destructor. The assembly is owner of its "shape".
   if (fShape) delete fShape;
}   

//_____________________________________________________________________________
void TGeoVolumeAssembly::AddNode(const TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat, Option_t *option)
{
// Add a component to the assembly. 
   TGeoVolume::AddNode(vol,copy_no,mat,option);
   fShape->ComputeBBox();
}   

//_____________________________________________________________________________
void TGeoVolumeAssembly::AddNodeOverlap(const TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat, Option_t *option)
{
// Add an overlapping node - not allowed for assemblies.
   Warning("AddNodeOverlap", "Declaring assembly %s as possibly overlapping inside %s not allowed. Using AddNode instead !",vol->GetName(),GetName());
   AddNode(vol, copy_no, mat, option);
}   

//_____________________________________________________________________________
TGeoVolume *TGeoVolumeAssembly::CloneVolume() const
{
// Clone this volume.
   // build a volume with same name, shape and medium
   TGeoVolume *vol = new TGeoVolumeAssembly(GetName());
   Int_t i;
   // copy other attributes
   Int_t nbits = 8*sizeof(UInt_t);
   for (i=0; i<nbits; i++) 
      vol->SetAttBit(1<<i, TGeoAtt::TestAttBit(1<<i));
   for (i=14; i<24; i++)
      vol->SetBit(1<<i, TestBit(1<<i));   
   
   // copy field
   vol->SetField(fField);
   // Set bits
   for (i=0; i<nbits; i++) 
      vol->SetBit(1<<i, TObject::TestBit(1<<i));
   vol->SetBit(kVolumeClone);   
   // make copy nodes
   vol->MakeCopyNodes(this);
//   CloneNodesAndConnect(vol);
   vol->GetShape()->ComputeBBox();
   // copy voxels
   TGeoVoxelFinder *voxels = 0;
   if (fVoxels) {
      voxels = new TGeoVoxelFinder(vol);
      vol->SetVoxelFinder(voxels);
   }   
   // copy option, uid
   vol->SetOption(fOption);
   vol->SetNumber(fNumber);
   vol->SetNtotal(fNtotal);
   return vol;
}

//_____________________________________________________________________________
TGeoVolume *TGeoVolumeAssembly::Divide(const char *, Int_t, Int_t, Double_t, Double_t, Int_t, Option_t *)
{
// Division makes no sense for assemblies.
   Error("Divide","Assemblies cannot be divided");
   return 0;
}

//_____________________________________________________________________________
TGeoVolumeAssembly *TGeoVolumeAssembly::MakeAssemblyFromVolume(TGeoVolume *volorig)
{
// Make a clone of volume VOL but which is an assembly.
   if (volorig->IsAssembly() || volorig->IsVolumeMulti()) return 0;
   Int_t nd = volorig->GetNdaughters();
   if (!nd) return 0;
   TGeoVolumeAssembly *vol = new TGeoVolumeAssembly(volorig->GetName());
   Int_t i;
   // copy other attributes
   Int_t nbits = 8*sizeof(UInt_t);
   for (i=0; i<nbits; i++) 
      vol->SetAttBit(1<<i, volorig->TestAttBit(1<<i));
   for (i=14; i<24; i++)
      vol->SetBit(1<<i, volorig->TestBit(1<<i));   
   
   // copy field
   vol->SetField(volorig->GetField());
   // Set bits
   for (i=0; i<nbits; i++) 
      vol->SetBit(1<<i, volorig->TestBit(1<<i));
   vol->SetBit(kVolumeClone);   
   // make copy nodes
   vol->MakeCopyNodes(volorig);
//   volorig->CloneNodesAndConnect(vol);
   vol->GetShape()->ComputeBBox();
   // copy voxels
   TGeoVoxelFinder *voxels = 0;
   if (volorig->GetVoxels()) {
      voxels = new TGeoVoxelFinder(vol);
      vol->SetVoxelFinder(voxels);
   }   
   // copy option, uid
   vol->SetOption(volorig->GetOption());
   vol->SetNumber(volorig->GetNumber());
   vol->SetNtotal(volorig->GetNtotal());
   return vol;
}   
 TGeoVolume.cxx:1
 TGeoVolume.cxx:2
 TGeoVolume.cxx:3
 TGeoVolume.cxx:4
 TGeoVolume.cxx:5
 TGeoVolume.cxx:6
 TGeoVolume.cxx:7
 TGeoVolume.cxx:8
 TGeoVolume.cxx:9
 TGeoVolume.cxx:10
 TGeoVolume.cxx:11
 TGeoVolume.cxx:12
 TGeoVolume.cxx:13
 TGeoVolume.cxx:14
 TGeoVolume.cxx:15
 TGeoVolume.cxx:16
 TGeoVolume.cxx:17
 TGeoVolume.cxx:18
 TGeoVolume.cxx:19
 TGeoVolume.cxx:20
 TGeoVolume.cxx:21
 TGeoVolume.cxx:22
 TGeoVolume.cxx:23
 TGeoVolume.cxx:24
 TGeoVolume.cxx:25
 TGeoVolume.cxx:26
 TGeoVolume.cxx:27
 TGeoVolume.cxx:28
 TGeoVolume.cxx:29
 TGeoVolume.cxx:30
 TGeoVolume.cxx:31
 TGeoVolume.cxx:32
 TGeoVolume.cxx:33
 TGeoVolume.cxx:34
 TGeoVolume.cxx:35
 TGeoVolume.cxx:36
 TGeoVolume.cxx:37
 TGeoVolume.cxx:38
 TGeoVolume.cxx:39
 TGeoVolume.cxx:40
 TGeoVolume.cxx:41
 TGeoVolume.cxx:42
 TGeoVolume.cxx:43
 TGeoVolume.cxx:44
 TGeoVolume.cxx:45
 TGeoVolume.cxx:46
 TGeoVolume.cxx:47
 TGeoVolume.cxx:48
 TGeoVolume.cxx:49
 TGeoVolume.cxx:50
 TGeoVolume.cxx:51
 TGeoVolume.cxx:52
 TGeoVolume.cxx:53
 TGeoVolume.cxx:54
 TGeoVolume.cxx:55
 TGeoVolume.cxx:56
 TGeoVolume.cxx:57
 TGeoVolume.cxx:58
 TGeoVolume.cxx:59
 TGeoVolume.cxx:60
 TGeoVolume.cxx:61
 TGeoVolume.cxx:62
 TGeoVolume.cxx:63
 TGeoVolume.cxx:64
 TGeoVolume.cxx:65
 TGeoVolume.cxx:66
 TGeoVolume.cxx:67
 TGeoVolume.cxx:68
 TGeoVolume.cxx:69
 TGeoVolume.cxx:70
 TGeoVolume.cxx:71
 TGeoVolume.cxx:72
 TGeoVolume.cxx:73
 TGeoVolume.cxx:74
 TGeoVolume.cxx:75
 TGeoVolume.cxx:76
 TGeoVolume.cxx:77
 TGeoVolume.cxx:78
 TGeoVolume.cxx:79
 TGeoVolume.cxx:80
 TGeoVolume.cxx:81
 TGeoVolume.cxx:82
 TGeoVolume.cxx:83
 TGeoVolume.cxx:84
 TGeoVolume.cxx:85
 TGeoVolume.cxx:86
 TGeoVolume.cxx:87
 TGeoVolume.cxx:88
 TGeoVolume.cxx:89
 TGeoVolume.cxx:90
 TGeoVolume.cxx:91
 TGeoVolume.cxx:92
 TGeoVolume.cxx:93
 TGeoVolume.cxx:94
 TGeoVolume.cxx:95
 TGeoVolume.cxx:96
 TGeoVolume.cxx:97
 TGeoVolume.cxx:98
 TGeoVolume.cxx:99
 TGeoVolume.cxx:100
 TGeoVolume.cxx:101
 TGeoVolume.cxx:102
 TGeoVolume.cxx:103
 TGeoVolume.cxx:104
 TGeoVolume.cxx:105
 TGeoVolume.cxx:106
 TGeoVolume.cxx:107
 TGeoVolume.cxx:108
 TGeoVolume.cxx:109
 TGeoVolume.cxx:110
 TGeoVolume.cxx:111
 TGeoVolume.cxx:112
 TGeoVolume.cxx:113
 TGeoVolume.cxx:114
 TGeoVolume.cxx:115
 TGeoVolume.cxx:116
 TGeoVolume.cxx:117
 TGeoVolume.cxx:118
 TGeoVolume.cxx:119
 TGeoVolume.cxx:120
 TGeoVolume.cxx:121
 TGeoVolume.cxx:122
 TGeoVolume.cxx:123
 TGeoVolume.cxx:124
 TGeoVolume.cxx:125
 TGeoVolume.cxx:126
 TGeoVolume.cxx:127
 TGeoVolume.cxx:128
 TGeoVolume.cxx:129
 TGeoVolume.cxx:130
 TGeoVolume.cxx:131
 TGeoVolume.cxx:132
 TGeoVolume.cxx:133
 TGeoVolume.cxx:134
 TGeoVolume.cxx:135
 TGeoVolume.cxx:136
 TGeoVolume.cxx:137
 TGeoVolume.cxx:138
 TGeoVolume.cxx:139
 TGeoVolume.cxx:140
 TGeoVolume.cxx:141
 TGeoVolume.cxx:142
 TGeoVolume.cxx:143
 TGeoVolume.cxx:144
 TGeoVolume.cxx:145
 TGeoVolume.cxx:146
 TGeoVolume.cxx:147
 TGeoVolume.cxx:148
 TGeoVolume.cxx:149
 TGeoVolume.cxx:150
 TGeoVolume.cxx:151
 TGeoVolume.cxx:152
 TGeoVolume.cxx:153
 TGeoVolume.cxx:154
 TGeoVolume.cxx:155
 TGeoVolume.cxx:156
 TGeoVolume.cxx:157
 TGeoVolume.cxx:158
 TGeoVolume.cxx:159
 TGeoVolume.cxx:160
 TGeoVolume.cxx:161
 TGeoVolume.cxx:162
 TGeoVolume.cxx:163
 TGeoVolume.cxx:164
 TGeoVolume.cxx:165
 TGeoVolume.cxx:166
 TGeoVolume.cxx:167
 TGeoVolume.cxx:168
 TGeoVolume.cxx:169
 TGeoVolume.cxx:170
 TGeoVolume.cxx:171
 TGeoVolume.cxx:172
 TGeoVolume.cxx:173
 TGeoVolume.cxx:174
 TGeoVolume.cxx:175
 TGeoVolume.cxx:176
 TGeoVolume.cxx:177
 TGeoVolume.cxx:178
 TGeoVolume.cxx:179
 TGeoVolume.cxx:180
 TGeoVolume.cxx:181
 TGeoVolume.cxx:182
 TGeoVolume.cxx:183
 TGeoVolume.cxx:184
 TGeoVolume.cxx:185
 TGeoVolume.cxx:186
 TGeoVolume.cxx:187
 TGeoVolume.cxx:188
 TGeoVolume.cxx:189
 TGeoVolume.cxx:190
 TGeoVolume.cxx:191
 TGeoVolume.cxx:192
 TGeoVolume.cxx:193
 TGeoVolume.cxx:194
 TGeoVolume.cxx:195
 TGeoVolume.cxx:196
 TGeoVolume.cxx:197
 TGeoVolume.cxx:198
 TGeoVolume.cxx:199
 TGeoVolume.cxx:200
 TGeoVolume.cxx:201
 TGeoVolume.cxx:202
 TGeoVolume.cxx:203
 TGeoVolume.cxx:204
 TGeoVolume.cxx:205
 TGeoVolume.cxx:206
 TGeoVolume.cxx:207
 TGeoVolume.cxx:208
 TGeoVolume.cxx:209
 TGeoVolume.cxx:210
 TGeoVolume.cxx:211
 TGeoVolume.cxx:212
 TGeoVolume.cxx:213
 TGeoVolume.cxx:214
 TGeoVolume.cxx:215
 TGeoVolume.cxx:216
 TGeoVolume.cxx:217
 TGeoVolume.cxx:218
 TGeoVolume.cxx:219
 TGeoVolume.cxx:220
 TGeoVolume.cxx:221
 TGeoVolume.cxx:222
 TGeoVolume.cxx:223
 TGeoVolume.cxx:224
 TGeoVolume.cxx:225
 TGeoVolume.cxx:226
 TGeoVolume.cxx:227
 TGeoVolume.cxx:228
 TGeoVolume.cxx:229
 TGeoVolume.cxx:230
 TGeoVolume.cxx:231
 TGeoVolume.cxx:232
 TGeoVolume.cxx:233
 TGeoVolume.cxx:234
 TGeoVolume.cxx:235
 TGeoVolume.cxx:236
 TGeoVolume.cxx:237
 TGeoVolume.cxx:238
 TGeoVolume.cxx:239
 TGeoVolume.cxx:240
 TGeoVolume.cxx:241
 TGeoVolume.cxx:242
 TGeoVolume.cxx:243
 TGeoVolume.cxx:244
 TGeoVolume.cxx:245
 TGeoVolume.cxx:246
 TGeoVolume.cxx:247
 TGeoVolume.cxx:248
 TGeoVolume.cxx:249
 TGeoVolume.cxx:250
 TGeoVolume.cxx:251
 TGeoVolume.cxx:252
 TGeoVolume.cxx:253
 TGeoVolume.cxx:254
 TGeoVolume.cxx:255
 TGeoVolume.cxx:256
 TGeoVolume.cxx:257
 TGeoVolume.cxx:258
 TGeoVolume.cxx:259
 TGeoVolume.cxx:260
 TGeoVolume.cxx:261
 TGeoVolume.cxx:262
 TGeoVolume.cxx:263
 TGeoVolume.cxx:264
 TGeoVolume.cxx:265
 TGeoVolume.cxx:266
 TGeoVolume.cxx:267
 TGeoVolume.cxx:268
 TGeoVolume.cxx:269
 TGeoVolume.cxx:270
 TGeoVolume.cxx:271
 TGeoVolume.cxx:272
 TGeoVolume.cxx:273
 TGeoVolume.cxx:274
 TGeoVolume.cxx:275
 TGeoVolume.cxx:276
 TGeoVolume.cxx:277
 TGeoVolume.cxx:278
 TGeoVolume.cxx:279
 TGeoVolume.cxx:280
 TGeoVolume.cxx:281
 TGeoVolume.cxx:282
 TGeoVolume.cxx:283
 TGeoVolume.cxx:284
 TGeoVolume.cxx:285
 TGeoVolume.cxx:286
 TGeoVolume.cxx:287
 TGeoVolume.cxx:288
 TGeoVolume.cxx:289
 TGeoVolume.cxx:290
 TGeoVolume.cxx:291
 TGeoVolume.cxx:292
 TGeoVolume.cxx:293
 TGeoVolume.cxx:294
 TGeoVolume.cxx:295
 TGeoVolume.cxx:296
 TGeoVolume.cxx:297
 TGeoVolume.cxx:298
 TGeoVolume.cxx:299
 TGeoVolume.cxx:300
 TGeoVolume.cxx:301
 TGeoVolume.cxx:302
 TGeoVolume.cxx:303
 TGeoVolume.cxx:304
 TGeoVolume.cxx:305
 TGeoVolume.cxx:306
 TGeoVolume.cxx:307
 TGeoVolume.cxx:308
 TGeoVolume.cxx:309
 TGeoVolume.cxx:310
 TGeoVolume.cxx:311
 TGeoVolume.cxx:312
 TGeoVolume.cxx:313
 TGeoVolume.cxx:314
 TGeoVolume.cxx:315
 TGeoVolume.cxx:316
 TGeoVolume.cxx:317
 TGeoVolume.cxx:318
 TGeoVolume.cxx:319
 TGeoVolume.cxx:320
 TGeoVolume.cxx:321
 TGeoVolume.cxx:322
 TGeoVolume.cxx:323
 TGeoVolume.cxx:324
 TGeoVolume.cxx:325
 TGeoVolume.cxx:326
 TGeoVolume.cxx:327
 TGeoVolume.cxx:328
 TGeoVolume.cxx:329
 TGeoVolume.cxx:330
 TGeoVolume.cxx:331
 TGeoVolume.cxx:332
 TGeoVolume.cxx:333
 TGeoVolume.cxx:334
 TGeoVolume.cxx:335
 TGeoVolume.cxx:336
 TGeoVolume.cxx:337
 TGeoVolume.cxx:338
 TGeoVolume.cxx:339
 TGeoVolume.cxx:340
 TGeoVolume.cxx:341
 TGeoVolume.cxx:342
 TGeoVolume.cxx:343
 TGeoVolume.cxx:344
 TGeoVolume.cxx:345
 TGeoVolume.cxx:346
 TGeoVolume.cxx:347
 TGeoVolume.cxx:348
 TGeoVolume.cxx:349
 TGeoVolume.cxx:350
 TGeoVolume.cxx:351
 TGeoVolume.cxx:352
 TGeoVolume.cxx:353
 TGeoVolume.cxx:354
 TGeoVolume.cxx:355
 TGeoVolume.cxx:356
 TGeoVolume.cxx:357
 TGeoVolume.cxx:358
 TGeoVolume.cxx:359
 TGeoVolume.cxx:360
 TGeoVolume.cxx:361
 TGeoVolume.cxx:362
 TGeoVolume.cxx:363
 TGeoVolume.cxx:364
 TGeoVolume.cxx:365
 TGeoVolume.cxx:366
 TGeoVolume.cxx:367
 TGeoVolume.cxx:368
 TGeoVolume.cxx:369
 TGeoVolume.cxx:370
 TGeoVolume.cxx:371
 TGeoVolume.cxx:372
 TGeoVolume.cxx:373
 TGeoVolume.cxx:374
 TGeoVolume.cxx:375
 TGeoVolume.cxx:376
 TGeoVolume.cxx:377
 TGeoVolume.cxx:378
 TGeoVolume.cxx:379
 TGeoVolume.cxx:380
 TGeoVolume.cxx:381
 TGeoVolume.cxx:382
 TGeoVolume.cxx:383
 TGeoVolume.cxx:384
 TGeoVolume.cxx:385
 TGeoVolume.cxx:386
 TGeoVolume.cxx:387
 TGeoVolume.cxx:388
 TGeoVolume.cxx:389
 TGeoVolume.cxx:390
 TGeoVolume.cxx:391
 TGeoVolume.cxx:392
 TGeoVolume.cxx:393
 TGeoVolume.cxx:394
 TGeoVolume.cxx:395
 TGeoVolume.cxx:396
 TGeoVolume.cxx:397
 TGeoVolume.cxx:398
 TGeoVolume.cxx:399
 TGeoVolume.cxx:400
 TGeoVolume.cxx:401
 TGeoVolume.cxx:402
 TGeoVolume.cxx:403
 TGeoVolume.cxx:404
 TGeoVolume.cxx:405
 TGeoVolume.cxx:406
 TGeoVolume.cxx:407
 TGeoVolume.cxx:408
 TGeoVolume.cxx:409
 TGeoVolume.cxx:410
 TGeoVolume.cxx:411
 TGeoVolume.cxx:412
 TGeoVolume.cxx:413
 TGeoVolume.cxx:414
 TGeoVolume.cxx:415
 TGeoVolume.cxx:416
 TGeoVolume.cxx:417
 TGeoVolume.cxx:418
 TGeoVolume.cxx:419
 TGeoVolume.cxx:420
 TGeoVolume.cxx:421
 TGeoVolume.cxx:422
 TGeoVolume.cxx:423
 TGeoVolume.cxx:424
 TGeoVolume.cxx:425
 TGeoVolume.cxx:426
 TGeoVolume.cxx:427
 TGeoVolume.cxx:428
 TGeoVolume.cxx:429
 TGeoVolume.cxx:430
 TGeoVolume.cxx:431
 TGeoVolume.cxx:432
 TGeoVolume.cxx:433
 TGeoVolume.cxx:434
 TGeoVolume.cxx:435
 TGeoVolume.cxx:436
 TGeoVolume.cxx:437
 TGeoVolume.cxx:438
 TGeoVolume.cxx:439
 TGeoVolume.cxx:440
 TGeoVolume.cxx:441
 TGeoVolume.cxx:442
 TGeoVolume.cxx:443
 TGeoVolume.cxx:444
 TGeoVolume.cxx:445
 TGeoVolume.cxx:446
 TGeoVolume.cxx:447
 TGeoVolume.cxx:448
 TGeoVolume.cxx:449
 TGeoVolume.cxx:450
 TGeoVolume.cxx:451
 TGeoVolume.cxx:452
 TGeoVolume.cxx:453
 TGeoVolume.cxx:454
 TGeoVolume.cxx:455
 TGeoVolume.cxx:456
 TGeoVolume.cxx:457
 TGeoVolume.cxx:458
 TGeoVolume.cxx:459
 TGeoVolume.cxx:460
 TGeoVolume.cxx:461
 TGeoVolume.cxx:462
 TGeoVolume.cxx:463
 TGeoVolume.cxx:464
 TGeoVolume.cxx:465
 TGeoVolume.cxx:466
 TGeoVolume.cxx:467
 TGeoVolume.cxx:468
 TGeoVolume.cxx:469
 TGeoVolume.cxx:470
 TGeoVolume.cxx:471
 TGeoVolume.cxx:472
 TGeoVolume.cxx:473
 TGeoVolume.cxx:474
 TGeoVolume.cxx:475
 TGeoVolume.cxx:476
 TGeoVolume.cxx:477
 TGeoVolume.cxx:478
 TGeoVolume.cxx:479
 TGeoVolume.cxx:480
 TGeoVolume.cxx:481
 TGeoVolume.cxx:482
 TGeoVolume.cxx:483
 TGeoVolume.cxx:484
 TGeoVolume.cxx:485
 TGeoVolume.cxx:486
 TGeoVolume.cxx:487
 TGeoVolume.cxx:488
 TGeoVolume.cxx:489
 TGeoVolume.cxx:490
 TGeoVolume.cxx:491
 TGeoVolume.cxx:492
 TGeoVolume.cxx:493
 TGeoVolume.cxx:494
 TGeoVolume.cxx:495
 TGeoVolume.cxx:496
 TGeoVolume.cxx:497
 TGeoVolume.cxx:498
 TGeoVolume.cxx:499
 TGeoVolume.cxx:500
 TGeoVolume.cxx:501
 TGeoVolume.cxx:502
 TGeoVolume.cxx:503
 TGeoVolume.cxx:504
 TGeoVolume.cxx:505
 TGeoVolume.cxx:506
 TGeoVolume.cxx:507
 TGeoVolume.cxx:508
 TGeoVolume.cxx:509
 TGeoVolume.cxx:510
 TGeoVolume.cxx:511
 TGeoVolume.cxx:512
 TGeoVolume.cxx:513
 TGeoVolume.cxx:514
 TGeoVolume.cxx:515
 TGeoVolume.cxx:516
 TGeoVolume.cxx:517
 TGeoVolume.cxx:518
 TGeoVolume.cxx:519
 TGeoVolume.cxx:520
 TGeoVolume.cxx:521
 TGeoVolume.cxx:522
 TGeoVolume.cxx:523
 TGeoVolume.cxx:524
 TGeoVolume.cxx:525
 TGeoVolume.cxx:526
 TGeoVolume.cxx:527
 TGeoVolume.cxx:528
 TGeoVolume.cxx:529
 TGeoVolume.cxx:530
 TGeoVolume.cxx:531
 TGeoVolume.cxx:532
 TGeoVolume.cxx:533
 TGeoVolume.cxx:534
 TGeoVolume.cxx:535
 TGeoVolume.cxx:536
 TGeoVolume.cxx:537
 TGeoVolume.cxx:538
 TGeoVolume.cxx:539
 TGeoVolume.cxx:540
 TGeoVolume.cxx:541
 TGeoVolume.cxx:542
 TGeoVolume.cxx:543
 TGeoVolume.cxx:544
 TGeoVolume.cxx:545
 TGeoVolume.cxx:546
 TGeoVolume.cxx:547
 TGeoVolume.cxx:548
 TGeoVolume.cxx:549
 TGeoVolume.cxx:550
 TGeoVolume.cxx:551
 TGeoVolume.cxx:552
 TGeoVolume.cxx:553
 TGeoVolume.cxx:554
 TGeoVolume.cxx:555
 TGeoVolume.cxx:556
 TGeoVolume.cxx:557
 TGeoVolume.cxx:558
 TGeoVolume.cxx:559
 TGeoVolume.cxx:560
 TGeoVolume.cxx:561
 TGeoVolume.cxx:562
 TGeoVolume.cxx:563
 TGeoVolume.cxx:564
 TGeoVolume.cxx:565
 TGeoVolume.cxx:566
 TGeoVolume.cxx:567
 TGeoVolume.cxx:568
 TGeoVolume.cxx:569
 TGeoVolume.cxx:570
 TGeoVolume.cxx:571
 TGeoVolume.cxx:572
 TGeoVolume.cxx:573
 TGeoVolume.cxx:574
 TGeoVolume.cxx:575
 TGeoVolume.cxx:576
 TGeoVolume.cxx:577
 TGeoVolume.cxx:578
 TGeoVolume.cxx:579
 TGeoVolume.cxx:580
 TGeoVolume.cxx:581
 TGeoVolume.cxx:582
 TGeoVolume.cxx:583
 TGeoVolume.cxx:584
 TGeoVolume.cxx:585
 TGeoVolume.cxx:586
 TGeoVolume.cxx:587
 TGeoVolume.cxx:588
 TGeoVolume.cxx:589
 TGeoVolume.cxx:590
 TGeoVolume.cxx:591
 TGeoVolume.cxx:592
 TGeoVolume.cxx:593
 TGeoVolume.cxx:594
 TGeoVolume.cxx:595
 TGeoVolume.cxx:596
 TGeoVolume.cxx:597
 TGeoVolume.cxx:598
 TGeoVolume.cxx:599
 TGeoVolume.cxx:600
 TGeoVolume.cxx:601
 TGeoVolume.cxx:602
 TGeoVolume.cxx:603
 TGeoVolume.cxx:604
 TGeoVolume.cxx:605
 TGeoVolume.cxx:606
 TGeoVolume.cxx:607
 TGeoVolume.cxx:608
 TGeoVolume.cxx:609
 TGeoVolume.cxx:610
 TGeoVolume.cxx:611
 TGeoVolume.cxx:612
 TGeoVolume.cxx:613
 TGeoVolume.cxx:614
 TGeoVolume.cxx:615
 TGeoVolume.cxx:616
 TGeoVolume.cxx:617
 TGeoVolume.cxx:618
 TGeoVolume.cxx:619
 TGeoVolume.cxx:620
 TGeoVolume.cxx:621
 TGeoVolume.cxx:622
 TGeoVolume.cxx:623
 TGeoVolume.cxx:624
 TGeoVolume.cxx:625
 TGeoVolume.cxx:626
 TGeoVolume.cxx:627
 TGeoVolume.cxx:628
 TGeoVolume.cxx:629
 TGeoVolume.cxx:630
 TGeoVolume.cxx:631
 TGeoVolume.cxx:632
 TGeoVolume.cxx:633
 TGeoVolume.cxx:634
 TGeoVolume.cxx:635
 TGeoVolume.cxx:636
 TGeoVolume.cxx:637
 TGeoVolume.cxx:638
 TGeoVolume.cxx:639
 TGeoVolume.cxx:640
 TGeoVolume.cxx:641
 TGeoVolume.cxx:642
 TGeoVolume.cxx:643
 TGeoVolume.cxx:644
 TGeoVolume.cxx:645
 TGeoVolume.cxx:646
 TGeoVolume.cxx:647
 TGeoVolume.cxx:648
 TGeoVolume.cxx:649
 TGeoVolume.cxx:650
 TGeoVolume.cxx:651
 TGeoVolume.cxx:652
 TGeoVolume.cxx:653
 TGeoVolume.cxx:654
 TGeoVolume.cxx:655
 TGeoVolume.cxx:656
 TGeoVolume.cxx:657
 TGeoVolume.cxx:658
 TGeoVolume.cxx:659
 TGeoVolume.cxx:660
 TGeoVolume.cxx:661
 TGeoVolume.cxx:662
 TGeoVolume.cxx:663
 TGeoVolume.cxx:664
 TGeoVolume.cxx:665
 TGeoVolume.cxx:666
 TGeoVolume.cxx:667
 TGeoVolume.cxx:668
 TGeoVolume.cxx:669
 TGeoVolume.cxx:670
 TGeoVolume.cxx:671
 TGeoVolume.cxx:672
 TGeoVolume.cxx:673
 TGeoVolume.cxx:674
 TGeoVolume.cxx:675
 TGeoVolume.cxx:676
 TGeoVolume.cxx:677
 TGeoVolume.cxx:678
 TGeoVolume.cxx:679
 TGeoVolume.cxx:680
 TGeoVolume.cxx:681
 TGeoVolume.cxx:682
 TGeoVolume.cxx:683
 TGeoVolume.cxx:684
 TGeoVolume.cxx:685
 TGeoVolume.cxx:686
 TGeoVolume.cxx:687
 TGeoVolume.cxx:688
 TGeoVolume.cxx:689
 TGeoVolume.cxx:690
 TGeoVolume.cxx:691
 TGeoVolume.cxx:692
 TGeoVolume.cxx:693
 TGeoVolume.cxx:694
 TGeoVolume.cxx:695
 TGeoVolume.cxx:696
 TGeoVolume.cxx:697
 TGeoVolume.cxx:698
 TGeoVolume.cxx:699
 TGeoVolume.cxx:700
 TGeoVolume.cxx:701
 TGeoVolume.cxx:702
 TGeoVolume.cxx:703
 TGeoVolume.cxx:704
 TGeoVolume.cxx:705
 TGeoVolume.cxx:706
 TGeoVolume.cxx:707
 TGeoVolume.cxx:708
 TGeoVolume.cxx:709
 TGeoVolume.cxx:710
 TGeoVolume.cxx:711
 TGeoVolume.cxx:712
 TGeoVolume.cxx:713
 TGeoVolume.cxx:714
 TGeoVolume.cxx:715
 TGeoVolume.cxx:716
 TGeoVolume.cxx:717
 TGeoVolume.cxx:718
 TGeoVolume.cxx:719
 TGeoVolume.cxx:720
 TGeoVolume.cxx:721
 TGeoVolume.cxx:722
 TGeoVolume.cxx:723
 TGeoVolume.cxx:724
 TGeoVolume.cxx:725
 TGeoVolume.cxx:726
 TGeoVolume.cxx:727
 TGeoVolume.cxx:728
 TGeoVolume.cxx:729
 TGeoVolume.cxx:730
 TGeoVolume.cxx:731
 TGeoVolume.cxx:732
 TGeoVolume.cxx:733
 TGeoVolume.cxx:734
 TGeoVolume.cxx:735
 TGeoVolume.cxx:736
 TGeoVolume.cxx:737
 TGeoVolume.cxx:738
 TGeoVolume.cxx:739
 TGeoVolume.cxx:740
 TGeoVolume.cxx:741
 TGeoVolume.cxx:742
 TGeoVolume.cxx:743
 TGeoVolume.cxx:744
 TGeoVolume.cxx:745
 TGeoVolume.cxx:746
 TGeoVolume.cxx:747
 TGeoVolume.cxx:748
 TGeoVolume.cxx:749
 TGeoVolume.cxx:750
 TGeoVolume.cxx:751
 TGeoVolume.cxx:752
 TGeoVolume.cxx:753
 TGeoVolume.cxx:754
 TGeoVolume.cxx:755
 TGeoVolume.cxx:756
 TGeoVolume.cxx:757
 TGeoVolume.cxx:758
 TGeoVolume.cxx:759
 TGeoVolume.cxx:760
 TGeoVolume.cxx:761
 TGeoVolume.cxx:762
 TGeoVolume.cxx:763
 TGeoVolume.cxx:764
 TGeoVolume.cxx:765
 TGeoVolume.cxx:766
 TGeoVolume.cxx:767
 TGeoVolume.cxx:768
 TGeoVolume.cxx:769
 TGeoVolume.cxx:770
 TGeoVolume.cxx:771
 TGeoVolume.cxx:772
 TGeoVolume.cxx:773
 TGeoVolume.cxx:774
 TGeoVolume.cxx:775
 TGeoVolume.cxx:776
 TGeoVolume.cxx:777
 TGeoVolume.cxx:778
 TGeoVolume.cxx:779
 TGeoVolume.cxx:780
 TGeoVolume.cxx:781
 TGeoVolume.cxx:782
 TGeoVolume.cxx:783
 TGeoVolume.cxx:784
 TGeoVolume.cxx:785
 TGeoVolume.cxx:786
 TGeoVolume.cxx:787
 TGeoVolume.cxx:788
 TGeoVolume.cxx:789
 TGeoVolume.cxx:790
 TGeoVolume.cxx:791
 TGeoVolume.cxx:792
 TGeoVolume.cxx:793
 TGeoVolume.cxx:794
 TGeoVolume.cxx:795
 TGeoVolume.cxx:796
 TGeoVolume.cxx:797
 TGeoVolume.cxx:798
 TGeoVolume.cxx:799
 TGeoVolume.cxx:800
 TGeoVolume.cxx:801
 TGeoVolume.cxx:802
 TGeoVolume.cxx:803
 TGeoVolume.cxx:804
 TGeoVolume.cxx:805
 TGeoVolume.cxx:806
 TGeoVolume.cxx:807
 TGeoVolume.cxx:808
 TGeoVolume.cxx:809
 TGeoVolume.cxx:810
 TGeoVolume.cxx:811
 TGeoVolume.cxx:812
 TGeoVolume.cxx:813
 TGeoVolume.cxx:814
 TGeoVolume.cxx:815
 TGeoVolume.cxx:816
 TGeoVolume.cxx:817
 TGeoVolume.cxx:818
 TGeoVolume.cxx:819
 TGeoVolume.cxx:820
 TGeoVolume.cxx:821
 TGeoVolume.cxx:822
 TGeoVolume.cxx:823
 TGeoVolume.cxx:824
 TGeoVolume.cxx:825
 TGeoVolume.cxx:826
 TGeoVolume.cxx:827
 TGeoVolume.cxx:828
 TGeoVolume.cxx:829
 TGeoVolume.cxx:830
 TGeoVolume.cxx:831
 TGeoVolume.cxx:832
 TGeoVolume.cxx:833
 TGeoVolume.cxx:834
 TGeoVolume.cxx:835
 TGeoVolume.cxx:836
 TGeoVolume.cxx:837
 TGeoVolume.cxx:838
 TGeoVolume.cxx:839
 TGeoVolume.cxx:840
 TGeoVolume.cxx:841
 TGeoVolume.cxx:842
 TGeoVolume.cxx:843
 TGeoVolume.cxx:844
 TGeoVolume.cxx:845
 TGeoVolume.cxx:846
 TGeoVolume.cxx:847
 TGeoVolume.cxx:848
 TGeoVolume.cxx:849
 TGeoVolume.cxx:850
 TGeoVolume.cxx:851
 TGeoVolume.cxx:852
 TGeoVolume.cxx:853
 TGeoVolume.cxx:854
 TGeoVolume.cxx:855
 TGeoVolume.cxx:856
 TGeoVolume.cxx:857
 TGeoVolume.cxx:858
 TGeoVolume.cxx:859
 TGeoVolume.cxx:860
 TGeoVolume.cxx:861
 TGeoVolume.cxx:862
 TGeoVolume.cxx:863
 TGeoVolume.cxx:864
 TGeoVolume.cxx:865
 TGeoVolume.cxx:866
 TGeoVolume.cxx:867
 TGeoVolume.cxx:868
 TGeoVolume.cxx:869
 TGeoVolume.cxx:870
 TGeoVolume.cxx:871
 TGeoVolume.cxx:872
 TGeoVolume.cxx:873
 TGeoVolume.cxx:874
 TGeoVolume.cxx:875
 TGeoVolume.cxx:876
 TGeoVolume.cxx:877
 TGeoVolume.cxx:878
 TGeoVolume.cxx:879
 TGeoVolume.cxx:880
 TGeoVolume.cxx:881
 TGeoVolume.cxx:882
 TGeoVolume.cxx:883
 TGeoVolume.cxx:884
 TGeoVolume.cxx:885
 TGeoVolume.cxx:886
 TGeoVolume.cxx:887
 TGeoVolume.cxx:888
 TGeoVolume.cxx:889
 TGeoVolume.cxx:890
 TGeoVolume.cxx:891
 TGeoVolume.cxx:892
 TGeoVolume.cxx:893
 TGeoVolume.cxx:894
 TGeoVolume.cxx:895
 TGeoVolume.cxx:896
 TGeoVolume.cxx:897
 TGeoVolume.cxx:898
 TGeoVolume.cxx:899
 TGeoVolume.cxx:900
 TGeoVolume.cxx:901
 TGeoVolume.cxx:902
 TGeoVolume.cxx:903
 TGeoVolume.cxx:904
 TGeoVolume.cxx:905
 TGeoVolume.cxx:906
 TGeoVolume.cxx:907
 TGeoVolume.cxx:908
 TGeoVolume.cxx:909
 TGeoVolume.cxx:910
 TGeoVolume.cxx:911
 TGeoVolume.cxx:912
 TGeoVolume.cxx:913
 TGeoVolume.cxx:914
 TGeoVolume.cxx:915
 TGeoVolume.cxx:916
 TGeoVolume.cxx:917
 TGeoVolume.cxx:918
 TGeoVolume.cxx:919
 TGeoVolume.cxx:920
 TGeoVolume.cxx:921
 TGeoVolume.cxx:922
 TGeoVolume.cxx:923
 TGeoVolume.cxx:924
 TGeoVolume.cxx:925
 TGeoVolume.cxx:926
 TGeoVolume.cxx:927
 TGeoVolume.cxx:928
 TGeoVolume.cxx:929
 TGeoVolume.cxx:930
 TGeoVolume.cxx:931
 TGeoVolume.cxx:932
 TGeoVolume.cxx:933
 TGeoVolume.cxx:934
 TGeoVolume.cxx:935
 TGeoVolume.cxx:936
 TGeoVolume.cxx:937
 TGeoVolume.cxx:938
 TGeoVolume.cxx:939
 TGeoVolume.cxx:940
 TGeoVolume.cxx:941
 TGeoVolume.cxx:942
 TGeoVolume.cxx:943
 TGeoVolume.cxx:944
 TGeoVolume.cxx:945
 TGeoVolume.cxx:946
 TGeoVolume.cxx:947
 TGeoVolume.cxx:948
 TGeoVolume.cxx:949
 TGeoVolume.cxx:950
 TGeoVolume.cxx:951
 TGeoVolume.cxx:952
 TGeoVolume.cxx:953
 TGeoVolume.cxx:954
 TGeoVolume.cxx:955
 TGeoVolume.cxx:956
 TGeoVolume.cxx:957
 TGeoVolume.cxx:958
 TGeoVolume.cxx:959
 TGeoVolume.cxx:960
 TGeoVolume.cxx:961
 TGeoVolume.cxx:962
 TGeoVolume.cxx:963
 TGeoVolume.cxx:964
 TGeoVolume.cxx:965
 TGeoVolume.cxx:966
 TGeoVolume.cxx:967
 TGeoVolume.cxx:968
 TGeoVolume.cxx:969
 TGeoVolume.cxx:970
 TGeoVolume.cxx:971
 TGeoVolume.cxx:972
 TGeoVolume.cxx:973
 TGeoVolume.cxx:974
 TGeoVolume.cxx:975
 TGeoVolume.cxx:976
 TGeoVolume.cxx:977
 TGeoVolume.cxx:978
 TGeoVolume.cxx:979
 TGeoVolume.cxx:980
 TGeoVolume.cxx:981
 TGeoVolume.cxx:982
 TGeoVolume.cxx:983
 TGeoVolume.cxx:984
 TGeoVolume.cxx:985
 TGeoVolume.cxx:986
 TGeoVolume.cxx:987
 TGeoVolume.cxx:988
 TGeoVolume.cxx:989
 TGeoVolume.cxx:990
 TGeoVolume.cxx:991
 TGeoVolume.cxx:992
 TGeoVolume.cxx:993
 TGeoVolume.cxx:994
 TGeoVolume.cxx:995
 TGeoVolume.cxx:996
 TGeoVolume.cxx:997
 TGeoVolume.cxx:998
 TGeoVolume.cxx:999
 TGeoVolume.cxx:1000
 TGeoVolume.cxx:1001
 TGeoVolume.cxx:1002
 TGeoVolume.cxx:1003
 TGeoVolume.cxx:1004
 TGeoVolume.cxx:1005
 TGeoVolume.cxx:1006
 TGeoVolume.cxx:1007
 TGeoVolume.cxx:1008
 TGeoVolume.cxx:1009
 TGeoVolume.cxx:1010
 TGeoVolume.cxx:1011
 TGeoVolume.cxx:1012
 TGeoVolume.cxx:1013
 TGeoVolume.cxx:1014
 TGeoVolume.cxx:1015
 TGeoVolume.cxx:1016
 TGeoVolume.cxx:1017
 TGeoVolume.cxx:1018
 TGeoVolume.cxx:1019
 TGeoVolume.cxx:1020
 TGeoVolume.cxx:1021
 TGeoVolume.cxx:1022
 TGeoVolume.cxx:1023
 TGeoVolume.cxx:1024
 TGeoVolume.cxx:1025
 TGeoVolume.cxx:1026
 TGeoVolume.cxx:1027
 TGeoVolume.cxx:1028
 TGeoVolume.cxx:1029
 TGeoVolume.cxx:1030
 TGeoVolume.cxx:1031
 TGeoVolume.cxx:1032
 TGeoVolume.cxx:1033
 TGeoVolume.cxx:1034
 TGeoVolume.cxx:1035
 TGeoVolume.cxx:1036
 TGeoVolume.cxx:1037
 TGeoVolume.cxx:1038
 TGeoVolume.cxx:1039
 TGeoVolume.cxx:1040
 TGeoVolume.cxx:1041
 TGeoVolume.cxx:1042
 TGeoVolume.cxx:1043
 TGeoVolume.cxx:1044
 TGeoVolume.cxx:1045
 TGeoVolume.cxx:1046
 TGeoVolume.cxx:1047
 TGeoVolume.cxx:1048
 TGeoVolume.cxx:1049
 TGeoVolume.cxx:1050
 TGeoVolume.cxx:1051
 TGeoVolume.cxx:1052
 TGeoVolume.cxx:1053
 TGeoVolume.cxx:1054
 TGeoVolume.cxx:1055
 TGeoVolume.cxx:1056
 TGeoVolume.cxx:1057
 TGeoVolume.cxx:1058
 TGeoVolume.cxx:1059
 TGeoVolume.cxx:1060
 TGeoVolume.cxx:1061
 TGeoVolume.cxx:1062
 TGeoVolume.cxx:1063
 TGeoVolume.cxx:1064
 TGeoVolume.cxx:1065
 TGeoVolume.cxx:1066
 TGeoVolume.cxx:1067
 TGeoVolume.cxx:1068
 TGeoVolume.cxx:1069
 TGeoVolume.cxx:1070
 TGeoVolume.cxx:1071
 TGeoVolume.cxx:1072
 TGeoVolume.cxx:1073
 TGeoVolume.cxx:1074
 TGeoVolume.cxx:1075
 TGeoVolume.cxx:1076
 TGeoVolume.cxx:1077
 TGeoVolume.cxx:1078
 TGeoVolume.cxx:1079
 TGeoVolume.cxx:1080
 TGeoVolume.cxx:1081
 TGeoVolume.cxx:1082
 TGeoVolume.cxx:1083
 TGeoVolume.cxx:1084
 TGeoVolume.cxx:1085
 TGeoVolume.cxx:1086
 TGeoVolume.cxx:1087
 TGeoVolume.cxx:1088
 TGeoVolume.cxx:1089
 TGeoVolume.cxx:1090
 TGeoVolume.cxx:1091
 TGeoVolume.cxx:1092
 TGeoVolume.cxx:1093
 TGeoVolume.cxx:1094
 TGeoVolume.cxx:1095
 TGeoVolume.cxx:1096
 TGeoVolume.cxx:1097
 TGeoVolume.cxx:1098
 TGeoVolume.cxx:1099
 TGeoVolume.cxx:1100
 TGeoVolume.cxx:1101
 TGeoVolume.cxx:1102
 TGeoVolume.cxx:1103
 TGeoVolume.cxx:1104
 TGeoVolume.cxx:1105
 TGeoVolume.cxx:1106
 TGeoVolume.cxx:1107
 TGeoVolume.cxx:1108
 TGeoVolume.cxx:1109
 TGeoVolume.cxx:1110
 TGeoVolume.cxx:1111
 TGeoVolume.cxx:1112
 TGeoVolume.cxx:1113
 TGeoVolume.cxx:1114
 TGeoVolume.cxx:1115
 TGeoVolume.cxx:1116
 TGeoVolume.cxx:1117
 TGeoVolume.cxx:1118
 TGeoVolume.cxx:1119
 TGeoVolume.cxx:1120
 TGeoVolume.cxx:1121
 TGeoVolume.cxx:1122
 TGeoVolume.cxx:1123
 TGeoVolume.cxx:1124
 TGeoVolume.cxx:1125
 TGeoVolume.cxx:1126
 TGeoVolume.cxx:1127
 TGeoVolume.cxx:1128
 TGeoVolume.cxx:1129
 TGeoVolume.cxx:1130
 TGeoVolume.cxx:1131
 TGeoVolume.cxx:1132
 TGeoVolume.cxx:1133
 TGeoVolume.cxx:1134
 TGeoVolume.cxx:1135
 TGeoVolume.cxx:1136
 TGeoVolume.cxx:1137
 TGeoVolume.cxx:1138
 TGeoVolume.cxx:1139
 TGeoVolume.cxx:1140
 TGeoVolume.cxx:1141
 TGeoVolume.cxx:1142
 TGeoVolume.cxx:1143
 TGeoVolume.cxx:1144
 TGeoVolume.cxx:1145
 TGeoVolume.cxx:1146
 TGeoVolume.cxx:1147
 TGeoVolume.cxx:1148
 TGeoVolume.cxx:1149
 TGeoVolume.cxx:1150
 TGeoVolume.cxx:1151
 TGeoVolume.cxx:1152
 TGeoVolume.cxx:1153
 TGeoVolume.cxx:1154
 TGeoVolume.cxx:1155
 TGeoVolume.cxx:1156
 TGeoVolume.cxx:1157
 TGeoVolume.cxx:1158
 TGeoVolume.cxx:1159
 TGeoVolume.cxx:1160
 TGeoVolume.cxx:1161
 TGeoVolume.cxx:1162
 TGeoVolume.cxx:1163
 TGeoVolume.cxx:1164
 TGeoVolume.cxx:1165
 TGeoVolume.cxx:1166
 TGeoVolume.cxx:1167
 TGeoVolume.cxx:1168
 TGeoVolume.cxx:1169
 TGeoVolume.cxx:1170
 TGeoVolume.cxx:1171
 TGeoVolume.cxx:1172
 TGeoVolume.cxx:1173
 TGeoVolume.cxx:1174
 TGeoVolume.cxx:1175
 TGeoVolume.cxx:1176
 TGeoVolume.cxx:1177
 TGeoVolume.cxx:1178
 TGeoVolume.cxx:1179
 TGeoVolume.cxx:1180
 TGeoVolume.cxx:1181
 TGeoVolume.cxx:1182
 TGeoVolume.cxx:1183
 TGeoVolume.cxx:1184
 TGeoVolume.cxx:1185
 TGeoVolume.cxx:1186
 TGeoVolume.cxx:1187
 TGeoVolume.cxx:1188
 TGeoVolume.cxx:1189
 TGeoVolume.cxx:1190
 TGeoVolume.cxx:1191
 TGeoVolume.cxx:1192
 TGeoVolume.cxx:1193
 TGeoVolume.cxx:1194
 TGeoVolume.cxx:1195
 TGeoVolume.cxx:1196
 TGeoVolume.cxx:1197
 TGeoVolume.cxx:1198
 TGeoVolume.cxx:1199
 TGeoVolume.cxx:1200
 TGeoVolume.cxx:1201
 TGeoVolume.cxx:1202
 TGeoVolume.cxx:1203
 TGeoVolume.cxx:1204
 TGeoVolume.cxx:1205
 TGeoVolume.cxx:1206
 TGeoVolume.cxx:1207
 TGeoVolume.cxx:1208
 TGeoVolume.cxx:1209
 TGeoVolume.cxx:1210
 TGeoVolume.cxx:1211
 TGeoVolume.cxx:1212
 TGeoVolume.cxx:1213
 TGeoVolume.cxx:1214
 TGeoVolume.cxx:1215
 TGeoVolume.cxx:1216
 TGeoVolume.cxx:1217
 TGeoVolume.cxx:1218
 TGeoVolume.cxx:1219
 TGeoVolume.cxx:1220
 TGeoVolume.cxx:1221
 TGeoVolume.cxx:1222
 TGeoVolume.cxx:1223
 TGeoVolume.cxx:1224
 TGeoVolume.cxx:1225
 TGeoVolume.cxx:1226
 TGeoVolume.cxx:1227
 TGeoVolume.cxx:1228
 TGeoVolume.cxx:1229
 TGeoVolume.cxx:1230
 TGeoVolume.cxx:1231
 TGeoVolume.cxx:1232
 TGeoVolume.cxx:1233
 TGeoVolume.cxx:1234
 TGeoVolume.cxx:1235
 TGeoVolume.cxx:1236
 TGeoVolume.cxx:1237
 TGeoVolume.cxx:1238
 TGeoVolume.cxx:1239
 TGeoVolume.cxx:1240
 TGeoVolume.cxx:1241
 TGeoVolume.cxx:1242
 TGeoVolume.cxx:1243
 TGeoVolume.cxx:1244
 TGeoVolume.cxx:1245
 TGeoVolume.cxx:1246
 TGeoVolume.cxx:1247
 TGeoVolume.cxx:1248
 TGeoVolume.cxx:1249
 TGeoVolume.cxx:1250
 TGeoVolume.cxx:1251
 TGeoVolume.cxx:1252
 TGeoVolume.cxx:1253
 TGeoVolume.cxx:1254
 TGeoVolume.cxx:1255
 TGeoVolume.cxx:1256
 TGeoVolume.cxx:1257
 TGeoVolume.cxx:1258
 TGeoVolume.cxx:1259
 TGeoVolume.cxx:1260
 TGeoVolume.cxx:1261
 TGeoVolume.cxx:1262
 TGeoVolume.cxx:1263
 TGeoVolume.cxx:1264
 TGeoVolume.cxx:1265
 TGeoVolume.cxx:1266
 TGeoVolume.cxx:1267
 TGeoVolume.cxx:1268
 TGeoVolume.cxx:1269
 TGeoVolume.cxx:1270
 TGeoVolume.cxx:1271
 TGeoVolume.cxx:1272
 TGeoVolume.cxx:1273
 TGeoVolume.cxx:1274
 TGeoVolume.cxx:1275
 TGeoVolume.cxx:1276
 TGeoVolume.cxx:1277
 TGeoVolume.cxx:1278
 TGeoVolume.cxx:1279
 TGeoVolume.cxx:1280
 TGeoVolume.cxx:1281
 TGeoVolume.cxx:1282
 TGeoVolume.cxx:1283
 TGeoVolume.cxx:1284
 TGeoVolume.cxx:1285
 TGeoVolume.cxx:1286
 TGeoVolume.cxx:1287
 TGeoVolume.cxx:1288
 TGeoVolume.cxx:1289
 TGeoVolume.cxx:1290
 TGeoVolume.cxx:1291
 TGeoVolume.cxx:1292
 TGeoVolume.cxx:1293
 TGeoVolume.cxx:1294
 TGeoVolume.cxx:1295
 TGeoVolume.cxx:1296
 TGeoVolume.cxx:1297
 TGeoVolume.cxx:1298
 TGeoVolume.cxx:1299
 TGeoVolume.cxx:1300
 TGeoVolume.cxx:1301
 TGeoVolume.cxx:1302
 TGeoVolume.cxx:1303
 TGeoVolume.cxx:1304
 TGeoVolume.cxx:1305
 TGeoVolume.cxx:1306
 TGeoVolume.cxx:1307
 TGeoVolume.cxx:1308
 TGeoVolume.cxx:1309
 TGeoVolume.cxx:1310
 TGeoVolume.cxx:1311
 TGeoVolume.cxx:1312
 TGeoVolume.cxx:1313
 TGeoVolume.cxx:1314
 TGeoVolume.cxx:1315
 TGeoVolume.cxx:1316
 TGeoVolume.cxx:1317
 TGeoVolume.cxx:1318
 TGeoVolume.cxx:1319
 TGeoVolume.cxx:1320
 TGeoVolume.cxx:1321
 TGeoVolume.cxx:1322
 TGeoVolume.cxx:1323
 TGeoVolume.cxx:1324
 TGeoVolume.cxx:1325
 TGeoVolume.cxx:1326
 TGeoVolume.cxx:1327
 TGeoVolume.cxx:1328
 TGeoVolume.cxx:1329
 TGeoVolume.cxx:1330
 TGeoVolume.cxx:1331
 TGeoVolume.cxx:1332
 TGeoVolume.cxx:1333
 TGeoVolume.cxx:1334
 TGeoVolume.cxx:1335
 TGeoVolume.cxx:1336
 TGeoVolume.cxx:1337
 TGeoVolume.cxx:1338
 TGeoVolume.cxx:1339
 TGeoVolume.cxx:1340
 TGeoVolume.cxx:1341
 TGeoVolume.cxx:1342
 TGeoVolume.cxx:1343
 TGeoVolume.cxx:1344
 TGeoVolume.cxx:1345
 TGeoVolume.cxx:1346
 TGeoVolume.cxx:1347
 TGeoVolume.cxx:1348
 TGeoVolume.cxx:1349
 TGeoVolume.cxx:1350
 TGeoVolume.cxx:1351
 TGeoVolume.cxx:1352
 TGeoVolume.cxx:1353
 TGeoVolume.cxx:1354
 TGeoVolume.cxx:1355
 TGeoVolume.cxx:1356
 TGeoVolume.cxx:1357
 TGeoVolume.cxx:1358
 TGeoVolume.cxx:1359
 TGeoVolume.cxx:1360
 TGeoVolume.cxx:1361
 TGeoVolume.cxx:1362
 TGeoVolume.cxx:1363
 TGeoVolume.cxx:1364
 TGeoVolume.cxx:1365
 TGeoVolume.cxx:1366
 TGeoVolume.cxx:1367
 TGeoVolume.cxx:1368
 TGeoVolume.cxx:1369
 TGeoVolume.cxx:1370
 TGeoVolume.cxx:1371
 TGeoVolume.cxx:1372
 TGeoVolume.cxx:1373
 TGeoVolume.cxx:1374
 TGeoVolume.cxx:1375
 TGeoVolume.cxx:1376
 TGeoVolume.cxx:1377
 TGeoVolume.cxx:1378
 TGeoVolume.cxx:1379
 TGeoVolume.cxx:1380
 TGeoVolume.cxx:1381
 TGeoVolume.cxx:1382
 TGeoVolume.cxx:1383
 TGeoVolume.cxx:1384
 TGeoVolume.cxx:1385
 TGeoVolume.cxx:1386
 TGeoVolume.cxx:1387
 TGeoVolume.cxx:1388
 TGeoVolume.cxx:1389
 TGeoVolume.cxx:1390
 TGeoVolume.cxx:1391
 TGeoVolume.cxx:1392
 TGeoVolume.cxx:1393
 TGeoVolume.cxx:1394
 TGeoVolume.cxx:1395
 TGeoVolume.cxx:1396
 TGeoVolume.cxx:1397
 TGeoVolume.cxx:1398
 TGeoVolume.cxx:1399
 TGeoVolume.cxx:1400
 TGeoVolume.cxx:1401
 TGeoVolume.cxx:1402
 TGeoVolume.cxx:1403
 TGeoVolume.cxx:1404
 TGeoVolume.cxx:1405
 TGeoVolume.cxx:1406
 TGeoVolume.cxx:1407
 TGeoVolume.cxx:1408
 TGeoVolume.cxx:1409
 TGeoVolume.cxx:1410
 TGeoVolume.cxx:1411
 TGeoVolume.cxx:1412
 TGeoVolume.cxx:1413
 TGeoVolume.cxx:1414
 TGeoVolume.cxx:1415
 TGeoVolume.cxx:1416
 TGeoVolume.cxx:1417
 TGeoVolume.cxx:1418
 TGeoVolume.cxx:1419
 TGeoVolume.cxx:1420
 TGeoVolume.cxx:1421
 TGeoVolume.cxx:1422
 TGeoVolume.cxx:1423
 TGeoVolume.cxx:1424
 TGeoVolume.cxx:1425
 TGeoVolume.cxx:1426
 TGeoVolume.cxx:1427
 TGeoVolume.cxx:1428
 TGeoVolume.cxx:1429
 TGeoVolume.cxx:1430
 TGeoVolume.cxx:1431
 TGeoVolume.cxx:1432
 TGeoVolume.cxx:1433
 TGeoVolume.cxx:1434
 TGeoVolume.cxx:1435
 TGeoVolume.cxx:1436
 TGeoVolume.cxx:1437
 TGeoVolume.cxx:1438
 TGeoVolume.cxx:1439
 TGeoVolume.cxx:1440
 TGeoVolume.cxx:1441
 TGeoVolume.cxx:1442
 TGeoVolume.cxx:1443
 TGeoVolume.cxx:1444
 TGeoVolume.cxx:1445
 TGeoVolume.cxx:1446
 TGeoVolume.cxx:1447
 TGeoVolume.cxx:1448
 TGeoVolume.cxx:1449
 TGeoVolume.cxx:1450
 TGeoVolume.cxx:1451
 TGeoVolume.cxx:1452
 TGeoVolume.cxx:1453
 TGeoVolume.cxx:1454
 TGeoVolume.cxx:1455
 TGeoVolume.cxx:1456
 TGeoVolume.cxx:1457
 TGeoVolume.cxx:1458
 TGeoVolume.cxx:1459
 TGeoVolume.cxx:1460
 TGeoVolume.cxx:1461
 TGeoVolume.cxx:1462
 TGeoVolume.cxx:1463
 TGeoVolume.cxx:1464
 TGeoVolume.cxx:1465
 TGeoVolume.cxx:1466
 TGeoVolume.cxx:1467
 TGeoVolume.cxx:1468
 TGeoVolume.cxx:1469
 TGeoVolume.cxx:1470
 TGeoVolume.cxx:1471
 TGeoVolume.cxx:1472
 TGeoVolume.cxx:1473
 TGeoVolume.cxx:1474
 TGeoVolume.cxx:1475
 TGeoVolume.cxx:1476
 TGeoVolume.cxx:1477
 TGeoVolume.cxx:1478
 TGeoVolume.cxx:1479
 TGeoVolume.cxx:1480
 TGeoVolume.cxx:1481
 TGeoVolume.cxx:1482
 TGeoVolume.cxx:1483
 TGeoVolume.cxx:1484
 TGeoVolume.cxx:1485
 TGeoVolume.cxx:1486
 TGeoVolume.cxx:1487
 TGeoVolume.cxx:1488
 TGeoVolume.cxx:1489
 TGeoVolume.cxx:1490
 TGeoVolume.cxx:1491
 TGeoVolume.cxx:1492
 TGeoVolume.cxx:1493
 TGeoVolume.cxx:1494
 TGeoVolume.cxx:1495
 TGeoVolume.cxx:1496
 TGeoVolume.cxx:1497
 TGeoVolume.cxx:1498
 TGeoVolume.cxx:1499
 TGeoVolume.cxx:1500
 TGeoVolume.cxx:1501
 TGeoVolume.cxx:1502
 TGeoVolume.cxx:1503
 TGeoVolume.cxx:1504
 TGeoVolume.cxx:1505
 TGeoVolume.cxx:1506
 TGeoVolume.cxx:1507
 TGeoVolume.cxx:1508
 TGeoVolume.cxx:1509
 TGeoVolume.cxx:1510
 TGeoVolume.cxx:1511
 TGeoVolume.cxx:1512
 TGeoVolume.cxx:1513
 TGeoVolume.cxx:1514
 TGeoVolume.cxx:1515
 TGeoVolume.cxx:1516
 TGeoVolume.cxx:1517
 TGeoVolume.cxx:1518
 TGeoVolume.cxx:1519
 TGeoVolume.cxx:1520
 TGeoVolume.cxx:1521
 TGeoVolume.cxx:1522
 TGeoVolume.cxx:1523
 TGeoVolume.cxx:1524
 TGeoVolume.cxx:1525
 TGeoVolume.cxx:1526
 TGeoVolume.cxx:1527
 TGeoVolume.cxx:1528
 TGeoVolume.cxx:1529
 TGeoVolume.cxx:1530
 TGeoVolume.cxx:1531
 TGeoVolume.cxx:1532
 TGeoVolume.cxx:1533
 TGeoVolume.cxx:1534
 TGeoVolume.cxx:1535
 TGeoVolume.cxx:1536
 TGeoVolume.cxx:1537
 TGeoVolume.cxx:1538
 TGeoVolume.cxx:1539
 TGeoVolume.cxx:1540
 TGeoVolume.cxx:1541
 TGeoVolume.cxx:1542
 TGeoVolume.cxx:1543
 TGeoVolume.cxx:1544
 TGeoVolume.cxx:1545
 TGeoVolume.cxx:1546
 TGeoVolume.cxx:1547
 TGeoVolume.cxx:1548
 TGeoVolume.cxx:1549
 TGeoVolume.cxx:1550
 TGeoVolume.cxx:1551
 TGeoVolume.cxx:1552
 TGeoVolume.cxx:1553
 TGeoVolume.cxx:1554
 TGeoVolume.cxx:1555
 TGeoVolume.cxx:1556
 TGeoVolume.cxx:1557
 TGeoVolume.cxx:1558
 TGeoVolume.cxx:1559
 TGeoVolume.cxx:1560
 TGeoVolume.cxx:1561
 TGeoVolume.cxx:1562
 TGeoVolume.cxx:1563
 TGeoVolume.cxx:1564
 TGeoVolume.cxx:1565
 TGeoVolume.cxx:1566
 TGeoVolume.cxx:1567
 TGeoVolume.cxx:1568
 TGeoVolume.cxx:1569
 TGeoVolume.cxx:1570
 TGeoVolume.cxx:1571
 TGeoVolume.cxx:1572
 TGeoVolume.cxx:1573
 TGeoVolume.cxx:1574
 TGeoVolume.cxx:1575
 TGeoVolume.cxx:1576
 TGeoVolume.cxx:1577
 TGeoVolume.cxx:1578
 TGeoVolume.cxx:1579
 TGeoVolume.cxx:1580
 TGeoVolume.cxx:1581
 TGeoVolume.cxx:1582
 TGeoVolume.cxx:1583
 TGeoVolume.cxx:1584
 TGeoVolume.cxx:1585
 TGeoVolume.cxx:1586
 TGeoVolume.cxx:1587
 TGeoVolume.cxx:1588
 TGeoVolume.cxx:1589
 TGeoVolume.cxx:1590
 TGeoVolume.cxx:1591
 TGeoVolume.cxx:1592
 TGeoVolume.cxx:1593
 TGeoVolume.cxx:1594
 TGeoVolume.cxx:1595
 TGeoVolume.cxx:1596
 TGeoVolume.cxx:1597
 TGeoVolume.cxx:1598
 TGeoVolume.cxx:1599
 TGeoVolume.cxx:1600
 TGeoVolume.cxx:1601
 TGeoVolume.cxx:1602
 TGeoVolume.cxx:1603
 TGeoVolume.cxx:1604
 TGeoVolume.cxx:1605
 TGeoVolume.cxx:1606
 TGeoVolume.cxx:1607
 TGeoVolume.cxx:1608
 TGeoVolume.cxx:1609
 TGeoVolume.cxx:1610
 TGeoVolume.cxx:1611
 TGeoVolume.cxx:1612
 TGeoVolume.cxx:1613
 TGeoVolume.cxx:1614
 TGeoVolume.cxx:1615
 TGeoVolume.cxx:1616
 TGeoVolume.cxx:1617
 TGeoVolume.cxx:1618
 TGeoVolume.cxx:1619
 TGeoVolume.cxx:1620
 TGeoVolume.cxx:1621
 TGeoVolume.cxx:1622
 TGeoVolume.cxx:1623
 TGeoVolume.cxx:1624
 TGeoVolume.cxx:1625
 TGeoVolume.cxx:1626
 TGeoVolume.cxx:1627
 TGeoVolume.cxx:1628
 TGeoVolume.cxx:1629
 TGeoVolume.cxx:1630
 TGeoVolume.cxx:1631
 TGeoVolume.cxx:1632
 TGeoVolume.cxx:1633
 TGeoVolume.cxx:1634
 TGeoVolume.cxx:1635
 TGeoVolume.cxx:1636
 TGeoVolume.cxx:1637
 TGeoVolume.cxx:1638
 TGeoVolume.cxx:1639
 TGeoVolume.cxx:1640
 TGeoVolume.cxx:1641
 TGeoVolume.cxx:1642
 TGeoVolume.cxx:1643
 TGeoVolume.cxx:1644
 TGeoVolume.cxx:1645
 TGeoVolume.cxx:1646
 TGeoVolume.cxx:1647
 TGeoVolume.cxx:1648
 TGeoVolume.cxx:1649
 TGeoVolume.cxx:1650
 TGeoVolume.cxx:1651
 TGeoVolume.cxx:1652
 TGeoVolume.cxx:1653
 TGeoVolume.cxx:1654
 TGeoVolume.cxx:1655
 TGeoVolume.cxx:1656
 TGeoVolume.cxx:1657
 TGeoVolume.cxx:1658
 TGeoVolume.cxx:1659
 TGeoVolume.cxx:1660
 TGeoVolume.cxx:1661
 TGeoVolume.cxx:1662
 TGeoVolume.cxx:1663
 TGeoVolume.cxx:1664
 TGeoVolume.cxx:1665
 TGeoVolume.cxx:1666
 TGeoVolume.cxx:1667
 TGeoVolume.cxx:1668
 TGeoVolume.cxx:1669
 TGeoVolume.cxx:1670
 TGeoVolume.cxx:1671
 TGeoVolume.cxx:1672
 TGeoVolume.cxx:1673
 TGeoVolume.cxx:1674
 TGeoVolume.cxx:1675
 TGeoVolume.cxx:1676
 TGeoVolume.cxx:1677
 TGeoVolume.cxx:1678
 TGeoVolume.cxx:1679
 TGeoVolume.cxx:1680
 TGeoVolume.cxx:1681
 TGeoVolume.cxx:1682
 TGeoVolume.cxx:1683
 TGeoVolume.cxx:1684
 TGeoVolume.cxx:1685
 TGeoVolume.cxx:1686
 TGeoVolume.cxx:1687
 TGeoVolume.cxx:1688
 TGeoVolume.cxx:1689
 TGeoVolume.cxx:1690
 TGeoVolume.cxx:1691
 TGeoVolume.cxx:1692
 TGeoVolume.cxx:1693
 TGeoVolume.cxx:1694
 TGeoVolume.cxx:1695
 TGeoVolume.cxx:1696
 TGeoVolume.cxx:1697
 TGeoVolume.cxx:1698
 TGeoVolume.cxx:1699
 TGeoVolume.cxx:1700
 TGeoVolume.cxx:1701
 TGeoVolume.cxx:1702
 TGeoVolume.cxx:1703
 TGeoVolume.cxx:1704
 TGeoVolume.cxx:1705
 TGeoVolume.cxx:1706
 TGeoVolume.cxx:1707
 TGeoVolume.cxx:1708
 TGeoVolume.cxx:1709
 TGeoVolume.cxx:1710
 TGeoVolume.cxx:1711
 TGeoVolume.cxx:1712
 TGeoVolume.cxx:1713
 TGeoVolume.cxx:1714
 TGeoVolume.cxx:1715
 TGeoVolume.cxx:1716
 TGeoVolume.cxx:1717
 TGeoVolume.cxx:1718
 TGeoVolume.cxx:1719
 TGeoVolume.cxx:1720
 TGeoVolume.cxx:1721
 TGeoVolume.cxx:1722
 TGeoVolume.cxx:1723
 TGeoVolume.cxx:1724
 TGeoVolume.cxx:1725
 TGeoVolume.cxx:1726
 TGeoVolume.cxx:1727
 TGeoVolume.cxx:1728
 TGeoVolume.cxx:1729
 TGeoVolume.cxx:1730
 TGeoVolume.cxx:1731
 TGeoVolume.cxx:1732
 TGeoVolume.cxx:1733
 TGeoVolume.cxx:1734
 TGeoVolume.cxx:1735
 TGeoVolume.cxx:1736
 TGeoVolume.cxx:1737
 TGeoVolume.cxx:1738
 TGeoVolume.cxx:1739
 TGeoVolume.cxx:1740
 TGeoVolume.cxx:1741
 TGeoVolume.cxx:1742
 TGeoVolume.cxx:1743
 TGeoVolume.cxx:1744
 TGeoVolume.cxx:1745
 TGeoVolume.cxx:1746
 TGeoVolume.cxx:1747
 TGeoVolume.cxx:1748
 TGeoVolume.cxx:1749
 TGeoVolume.cxx:1750
 TGeoVolume.cxx:1751
 TGeoVolume.cxx:1752
 TGeoVolume.cxx:1753
 TGeoVolume.cxx:1754
 TGeoVolume.cxx:1755
 TGeoVolume.cxx:1756
 TGeoVolume.cxx:1757
 TGeoVolume.cxx:1758
 TGeoVolume.cxx:1759
 TGeoVolume.cxx:1760
 TGeoVolume.cxx:1761
 TGeoVolume.cxx:1762
 TGeoVolume.cxx:1763
 TGeoVolume.cxx:1764
 TGeoVolume.cxx:1765
 TGeoVolume.cxx:1766
 TGeoVolume.cxx:1767
 TGeoVolume.cxx:1768
 TGeoVolume.cxx:1769
 TGeoVolume.cxx:1770
 TGeoVolume.cxx:1771
 TGeoVolume.cxx:1772
 TGeoVolume.cxx:1773
 TGeoVolume.cxx:1774
 TGeoVolume.cxx:1775
 TGeoVolume.cxx:1776
 TGeoVolume.cxx:1777
 TGeoVolume.cxx:1778
 TGeoVolume.cxx:1779
 TGeoVolume.cxx:1780
 TGeoVolume.cxx:1781
 TGeoVolume.cxx:1782
 TGeoVolume.cxx:1783
 TGeoVolume.cxx:1784
 TGeoVolume.cxx:1785
 TGeoVolume.cxx:1786
 TGeoVolume.cxx:1787
 TGeoVolume.cxx:1788
 TGeoVolume.cxx:1789
 TGeoVolume.cxx:1790
 TGeoVolume.cxx:1791
 TGeoVolume.cxx:1792
 TGeoVolume.cxx:1793
 TGeoVolume.cxx:1794
 TGeoVolume.cxx:1795
 TGeoVolume.cxx:1796
 TGeoVolume.cxx:1797
 TGeoVolume.cxx:1798
 TGeoVolume.cxx:1799
 TGeoVolume.cxx:1800
 TGeoVolume.cxx:1801
 TGeoVolume.cxx:1802
 TGeoVolume.cxx:1803
 TGeoVolume.cxx:1804
 TGeoVolume.cxx:1805
 TGeoVolume.cxx:1806
 TGeoVolume.cxx:1807
 TGeoVolume.cxx:1808
 TGeoVolume.cxx:1809
 TGeoVolume.cxx:1810
 TGeoVolume.cxx:1811
 TGeoVolume.cxx:1812
 TGeoVolume.cxx:1813
 TGeoVolume.cxx:1814
 TGeoVolume.cxx:1815
 TGeoVolume.cxx:1816
 TGeoVolume.cxx:1817
 TGeoVolume.cxx:1818
 TGeoVolume.cxx:1819
 TGeoVolume.cxx:1820
 TGeoVolume.cxx:1821
 TGeoVolume.cxx:1822
 TGeoVolume.cxx:1823
 TGeoVolume.cxx:1824
 TGeoVolume.cxx:1825
 TGeoVolume.cxx:1826
 TGeoVolume.cxx:1827
 TGeoVolume.cxx:1828
 TGeoVolume.cxx:1829
 TGeoVolume.cxx:1830
 TGeoVolume.cxx:1831
 TGeoVolume.cxx:1832
 TGeoVolume.cxx:1833
 TGeoVolume.cxx:1834
 TGeoVolume.cxx:1835
 TGeoVolume.cxx:1836
 TGeoVolume.cxx:1837
 TGeoVolume.cxx:1838
 TGeoVolume.cxx:1839
 TGeoVolume.cxx:1840
 TGeoVolume.cxx:1841
 TGeoVolume.cxx:1842
 TGeoVolume.cxx:1843
 TGeoVolume.cxx:1844
 TGeoVolume.cxx:1845
 TGeoVolume.cxx:1846
 TGeoVolume.cxx:1847
 TGeoVolume.cxx:1848
 TGeoVolume.cxx:1849
 TGeoVolume.cxx:1850
 TGeoVolume.cxx:1851
 TGeoVolume.cxx:1852
 TGeoVolume.cxx:1853
 TGeoVolume.cxx:1854
 TGeoVolume.cxx:1855
 TGeoVolume.cxx:1856
 TGeoVolume.cxx:1857
 TGeoVolume.cxx:1858
 TGeoVolume.cxx:1859
 TGeoVolume.cxx:1860
 TGeoVolume.cxx:1861
 TGeoVolume.cxx:1862
 TGeoVolume.cxx:1863
 TGeoVolume.cxx:1864
 TGeoVolume.cxx:1865
 TGeoVolume.cxx:1866
 TGeoVolume.cxx:1867
 TGeoVolume.cxx:1868
 TGeoVolume.cxx:1869
 TGeoVolume.cxx:1870
 TGeoVolume.cxx:1871
 TGeoVolume.cxx:1872
 TGeoVolume.cxx:1873
 TGeoVolume.cxx:1874
 TGeoVolume.cxx:1875
 TGeoVolume.cxx:1876
 TGeoVolume.cxx:1877
 TGeoVolume.cxx:1878
 TGeoVolume.cxx:1879
 TGeoVolume.cxx:1880
 TGeoVolume.cxx:1881
 TGeoVolume.cxx:1882
 TGeoVolume.cxx:1883
 TGeoVolume.cxx:1884
 TGeoVolume.cxx:1885
 TGeoVolume.cxx:1886
 TGeoVolume.cxx:1887
 TGeoVolume.cxx:1888
 TGeoVolume.cxx:1889
 TGeoVolume.cxx:1890
 TGeoVolume.cxx:1891
 TGeoVolume.cxx:1892
 TGeoVolume.cxx:1893
 TGeoVolume.cxx:1894
 TGeoVolume.cxx:1895
 TGeoVolume.cxx:1896
 TGeoVolume.cxx:1897
 TGeoVolume.cxx:1898
 TGeoVolume.cxx:1899
 TGeoVolume.cxx:1900
 TGeoVolume.cxx:1901
 TGeoVolume.cxx:1902
 TGeoVolume.cxx:1903
 TGeoVolume.cxx:1904
 TGeoVolume.cxx:1905
 TGeoVolume.cxx:1906
 TGeoVolume.cxx:1907
 TGeoVolume.cxx:1908
 TGeoVolume.cxx:1909
 TGeoVolume.cxx:1910
 TGeoVolume.cxx:1911
 TGeoVolume.cxx:1912
 TGeoVolume.cxx:1913
 TGeoVolume.cxx:1914
 TGeoVolume.cxx:1915
 TGeoVolume.cxx:1916
 TGeoVolume.cxx:1917
 TGeoVolume.cxx:1918
 TGeoVolume.cxx:1919
 TGeoVolume.cxx:1920
 TGeoVolume.cxx:1921
 TGeoVolume.cxx:1922
 TGeoVolume.cxx:1923
 TGeoVolume.cxx:1924
 TGeoVolume.cxx:1925
 TGeoVolume.cxx:1926
 TGeoVolume.cxx:1927
 TGeoVolume.cxx:1928
 TGeoVolume.cxx:1929
 TGeoVolume.cxx:1930
 TGeoVolume.cxx:1931
 TGeoVolume.cxx:1932
 TGeoVolume.cxx:1933
 TGeoVolume.cxx:1934
 TGeoVolume.cxx:1935
 TGeoVolume.cxx:1936
 TGeoVolume.cxx:1937
 TGeoVolume.cxx:1938
 TGeoVolume.cxx:1939
 TGeoVolume.cxx:1940
 TGeoVolume.cxx:1941
 TGeoVolume.cxx:1942
 TGeoVolume.cxx:1943
 TGeoVolume.cxx:1944
 TGeoVolume.cxx:1945
 TGeoVolume.cxx:1946
 TGeoVolume.cxx:1947
 TGeoVolume.cxx:1948
 TGeoVolume.cxx:1949
 TGeoVolume.cxx:1950
 TGeoVolume.cxx:1951
 TGeoVolume.cxx:1952
 TGeoVolume.cxx:1953
 TGeoVolume.cxx:1954
 TGeoVolume.cxx:1955
 TGeoVolume.cxx:1956
 TGeoVolume.cxx:1957
 TGeoVolume.cxx:1958
 TGeoVolume.cxx:1959
 TGeoVolume.cxx:1960
 TGeoVolume.cxx:1961
 TGeoVolume.cxx:1962
 TGeoVolume.cxx:1963
 TGeoVolume.cxx:1964
 TGeoVolume.cxx:1965
 TGeoVolume.cxx:1966
 TGeoVolume.cxx:1967
 TGeoVolume.cxx:1968
 TGeoVolume.cxx:1969
 TGeoVolume.cxx:1970
 TGeoVolume.cxx:1971
 TGeoVolume.cxx:1972
 TGeoVolume.cxx:1973
 TGeoVolume.cxx:1974
 TGeoVolume.cxx:1975
 TGeoVolume.cxx:1976
 TGeoVolume.cxx:1977
 TGeoVolume.cxx:1978
 TGeoVolume.cxx:1979
 TGeoVolume.cxx:1980
 TGeoVolume.cxx:1981
 TGeoVolume.cxx:1982
 TGeoVolume.cxx:1983
 TGeoVolume.cxx:1984
 TGeoVolume.cxx:1985
 TGeoVolume.cxx:1986
 TGeoVolume.cxx:1987
 TGeoVolume.cxx:1988
 TGeoVolume.cxx:1989
 TGeoVolume.cxx:1990
 TGeoVolume.cxx:1991
 TGeoVolume.cxx:1992
 TGeoVolume.cxx:1993
 TGeoVolume.cxx:1994
 TGeoVolume.cxx:1995
 TGeoVolume.cxx:1996
 TGeoVolume.cxx:1997
 TGeoVolume.cxx:1998
 TGeoVolume.cxx:1999
 TGeoVolume.cxx:2000
 TGeoVolume.cxx:2001
 TGeoVolume.cxx:2002
 TGeoVolume.cxx:2003
 TGeoVolume.cxx:2004
 TGeoVolume.cxx:2005
 TGeoVolume.cxx:2006
 TGeoVolume.cxx:2007
 TGeoVolume.cxx:2008
 TGeoVolume.cxx:2009
 TGeoVolume.cxx:2010
 TGeoVolume.cxx:2011
 TGeoVolume.cxx:2012
 TGeoVolume.cxx:2013
 TGeoVolume.cxx:2014
 TGeoVolume.cxx:2015
 TGeoVolume.cxx:2016
 TGeoVolume.cxx:2017
 TGeoVolume.cxx:2018
 TGeoVolume.cxx:2019
 TGeoVolume.cxx:2020
 TGeoVolume.cxx:2021
 TGeoVolume.cxx:2022
 TGeoVolume.cxx:2023
 TGeoVolume.cxx:2024
 TGeoVolume.cxx:2025
 TGeoVolume.cxx:2026
 TGeoVolume.cxx:2027
 TGeoVolume.cxx:2028
 TGeoVolume.cxx:2029
 TGeoVolume.cxx:2030
 TGeoVolume.cxx:2031
 TGeoVolume.cxx:2032
 TGeoVolume.cxx:2033
 TGeoVolume.cxx:2034
 TGeoVolume.cxx:2035
 TGeoVolume.cxx:2036
 TGeoVolume.cxx:2037
 TGeoVolume.cxx:2038
 TGeoVolume.cxx:2039
 TGeoVolume.cxx:2040
 TGeoVolume.cxx:2041
 TGeoVolume.cxx:2042
 TGeoVolume.cxx:2043
 TGeoVolume.cxx:2044
 TGeoVolume.cxx:2045
 TGeoVolume.cxx:2046
 TGeoVolume.cxx:2047
 TGeoVolume.cxx:2048
 TGeoVolume.cxx:2049
 TGeoVolume.cxx:2050
 TGeoVolume.cxx:2051
 TGeoVolume.cxx:2052
 TGeoVolume.cxx:2053
 TGeoVolume.cxx:2054
 TGeoVolume.cxx:2055
 TGeoVolume.cxx:2056
 TGeoVolume.cxx:2057
 TGeoVolume.cxx:2058
 TGeoVolume.cxx:2059
 TGeoVolume.cxx:2060
 TGeoVolume.cxx:2061
 TGeoVolume.cxx:2062
 TGeoVolume.cxx:2063
 TGeoVolume.cxx:2064
 TGeoVolume.cxx:2065
 TGeoVolume.cxx:2066
 TGeoVolume.cxx:2067
 TGeoVolume.cxx:2068
 TGeoVolume.cxx:2069
 TGeoVolume.cxx:2070
 TGeoVolume.cxx:2071
 TGeoVolume.cxx:2072
 TGeoVolume.cxx:2073
 TGeoVolume.cxx:2074
 TGeoVolume.cxx:2075
 TGeoVolume.cxx:2076
 TGeoVolume.cxx:2077
 TGeoVolume.cxx:2078
 TGeoVolume.cxx:2079
 TGeoVolume.cxx:2080
 TGeoVolume.cxx:2081
 TGeoVolume.cxx:2082
 TGeoVolume.cxx:2083
 TGeoVolume.cxx:2084
 TGeoVolume.cxx:2085
 TGeoVolume.cxx:2086
 TGeoVolume.cxx:2087
 TGeoVolume.cxx:2088
 TGeoVolume.cxx:2089
 TGeoVolume.cxx:2090
 TGeoVolume.cxx:2091
 TGeoVolume.cxx:2092
 TGeoVolume.cxx:2093
 TGeoVolume.cxx:2094
 TGeoVolume.cxx:2095
 TGeoVolume.cxx:2096
 TGeoVolume.cxx:2097
 TGeoVolume.cxx:2098
 TGeoVolume.cxx:2099
 TGeoVolume.cxx:2100
 TGeoVolume.cxx:2101
 TGeoVolume.cxx:2102
 TGeoVolume.cxx:2103
 TGeoVolume.cxx:2104
 TGeoVolume.cxx:2105
 TGeoVolume.cxx:2106
 TGeoVolume.cxx:2107
 TGeoVolume.cxx:2108
 TGeoVolume.cxx:2109
 TGeoVolume.cxx:2110
 TGeoVolume.cxx:2111
 TGeoVolume.cxx:2112
 TGeoVolume.cxx:2113
 TGeoVolume.cxx:2114
 TGeoVolume.cxx:2115
 TGeoVolume.cxx:2116
 TGeoVolume.cxx:2117
 TGeoVolume.cxx:2118
 TGeoVolume.cxx:2119
 TGeoVolume.cxx:2120
 TGeoVolume.cxx:2121
 TGeoVolume.cxx:2122
 TGeoVolume.cxx:2123
 TGeoVolume.cxx:2124
 TGeoVolume.cxx:2125
 TGeoVolume.cxx:2126
 TGeoVolume.cxx:2127
 TGeoVolume.cxx:2128
 TGeoVolume.cxx:2129
 TGeoVolume.cxx:2130
 TGeoVolume.cxx:2131
 TGeoVolume.cxx:2132
 TGeoVolume.cxx:2133
 TGeoVolume.cxx:2134
 TGeoVolume.cxx:2135
 TGeoVolume.cxx:2136
 TGeoVolume.cxx:2137
 TGeoVolume.cxx:2138
 TGeoVolume.cxx:2139
 TGeoVolume.cxx:2140
 TGeoVolume.cxx:2141
 TGeoVolume.cxx:2142
 TGeoVolume.cxx:2143
 TGeoVolume.cxx:2144
 TGeoVolume.cxx:2145
 TGeoVolume.cxx:2146
 TGeoVolume.cxx:2147
 TGeoVolume.cxx:2148
 TGeoVolume.cxx:2149
 TGeoVolume.cxx:2150
 TGeoVolume.cxx:2151
 TGeoVolume.cxx:2152
 TGeoVolume.cxx:2153
 TGeoVolume.cxx:2154
 TGeoVolume.cxx:2155
 TGeoVolume.cxx:2156
 TGeoVolume.cxx:2157
 TGeoVolume.cxx:2158
 TGeoVolume.cxx:2159
 TGeoVolume.cxx:2160
 TGeoVolume.cxx:2161
 TGeoVolume.cxx:2162
 TGeoVolume.cxx:2163
 TGeoVolume.cxx:2164
 TGeoVolume.cxx:2165
 TGeoVolume.cxx:2166
 TGeoVolume.cxx:2167
 TGeoVolume.cxx:2168
 TGeoVolume.cxx:2169
 TGeoVolume.cxx:2170
 TGeoVolume.cxx:2171
 TGeoVolume.cxx:2172
 TGeoVolume.cxx:2173
 TGeoVolume.cxx:2174
 TGeoVolume.cxx:2175
 TGeoVolume.cxx:2176
 TGeoVolume.cxx:2177
 TGeoVolume.cxx:2178
 TGeoVolume.cxx:2179
 TGeoVolume.cxx:2180
 TGeoVolume.cxx:2181
 TGeoVolume.cxx:2182
 TGeoVolume.cxx:2183
 TGeoVolume.cxx:2184
 TGeoVolume.cxx:2185
 TGeoVolume.cxx:2186
 TGeoVolume.cxx:2187
 TGeoVolume.cxx:2188
 TGeoVolume.cxx:2189
 TGeoVolume.cxx:2190
 TGeoVolume.cxx:2191
 TGeoVolume.cxx:2192
 TGeoVolume.cxx:2193
 TGeoVolume.cxx:2194
 TGeoVolume.cxx:2195
 TGeoVolume.cxx:2196
 TGeoVolume.cxx:2197
 TGeoVolume.cxx:2198
 TGeoVolume.cxx:2199
 TGeoVolume.cxx:2200
 TGeoVolume.cxx:2201
 TGeoVolume.cxx:2202
 TGeoVolume.cxx:2203
 TGeoVolume.cxx:2204
 TGeoVolume.cxx:2205
 TGeoVolume.cxx:2206
 TGeoVolume.cxx:2207
 TGeoVolume.cxx:2208
 TGeoVolume.cxx:2209
 TGeoVolume.cxx:2210
 TGeoVolume.cxx:2211
 TGeoVolume.cxx:2212
 TGeoVolume.cxx:2213
 TGeoVolume.cxx:2214
 TGeoVolume.cxx:2215
 TGeoVolume.cxx:2216
 TGeoVolume.cxx:2217
 TGeoVolume.cxx:2218
 TGeoVolume.cxx:2219
 TGeoVolume.cxx:2220
 TGeoVolume.cxx:2221
 TGeoVolume.cxx:2222
 TGeoVolume.cxx:2223
 TGeoVolume.cxx:2224
 TGeoVolume.cxx:2225
 TGeoVolume.cxx:2226
 TGeoVolume.cxx:2227
 TGeoVolume.cxx:2228
 TGeoVolume.cxx:2229
 TGeoVolume.cxx:2230
 TGeoVolume.cxx:2231
 TGeoVolume.cxx:2232
 TGeoVolume.cxx:2233
 TGeoVolume.cxx:2234
 TGeoVolume.cxx:2235
 TGeoVolume.cxx:2236
 TGeoVolume.cxx:2237
 TGeoVolume.cxx:2238
 TGeoVolume.cxx:2239
 TGeoVolume.cxx:2240
 TGeoVolume.cxx:2241
 TGeoVolume.cxx:2242
 TGeoVolume.cxx:2243
 TGeoVolume.cxx:2244
 TGeoVolume.cxx:2245
 TGeoVolume.cxx:2246
 TGeoVolume.cxx:2247
 TGeoVolume.cxx:2248
 TGeoVolume.cxx:2249
 TGeoVolume.cxx:2250
 TGeoVolume.cxx:2251
 TGeoVolume.cxx:2252
 TGeoVolume.cxx:2253
 TGeoVolume.cxx:2254
 TGeoVolume.cxx:2255
 TGeoVolume.cxx:2256
 TGeoVolume.cxx:2257
 TGeoVolume.cxx:2258
 TGeoVolume.cxx:2259
 TGeoVolume.cxx:2260
 TGeoVolume.cxx:2261
 TGeoVolume.cxx:2262
 TGeoVolume.cxx:2263
 TGeoVolume.cxx:2264
 TGeoVolume.cxx:2265
 TGeoVolume.cxx:2266
 TGeoVolume.cxx:2267
 TGeoVolume.cxx:2268
 TGeoVolume.cxx:2269
 TGeoVolume.cxx:2270
 TGeoVolume.cxx:2271
 TGeoVolume.cxx:2272
 TGeoVolume.cxx:2273
 TGeoVolume.cxx:2274
 TGeoVolume.cxx:2275
 TGeoVolume.cxx:2276
 TGeoVolume.cxx:2277
 TGeoVolume.cxx:2278
 TGeoVolume.cxx:2279
 TGeoVolume.cxx:2280
 TGeoVolume.cxx:2281
 TGeoVolume.cxx:2282
 TGeoVolume.cxx:2283
 TGeoVolume.cxx:2284
 TGeoVolume.cxx:2285
 TGeoVolume.cxx:2286
 TGeoVolume.cxx:2287
 TGeoVolume.cxx:2288
 TGeoVolume.cxx:2289
 TGeoVolume.cxx:2290
 TGeoVolume.cxx:2291
 TGeoVolume.cxx:2292
 TGeoVolume.cxx:2293
 TGeoVolume.cxx:2294
 TGeoVolume.cxx:2295
 TGeoVolume.cxx:2296
 TGeoVolume.cxx:2297
 TGeoVolume.cxx:2298
 TGeoVolume.cxx:2299
 TGeoVolume.cxx:2300
 TGeoVolume.cxx:2301
 TGeoVolume.cxx:2302
 TGeoVolume.cxx:2303
 TGeoVolume.cxx:2304
 TGeoVolume.cxx:2305
 TGeoVolume.cxx:2306
 TGeoVolume.cxx:2307
 TGeoVolume.cxx:2308
 TGeoVolume.cxx:2309
 TGeoVolume.cxx:2310
 TGeoVolume.cxx:2311
 TGeoVolume.cxx:2312
 TGeoVolume.cxx:2313
 TGeoVolume.cxx:2314
 TGeoVolume.cxx:2315
 TGeoVolume.cxx:2316
 TGeoVolume.cxx:2317
 TGeoVolume.cxx:2318
 TGeoVolume.cxx:2319
 TGeoVolume.cxx:2320
 TGeoVolume.cxx:2321
 TGeoVolume.cxx:2322
 TGeoVolume.cxx:2323
 TGeoVolume.cxx:2324
 TGeoVolume.cxx:2325
 TGeoVolume.cxx:2326
 TGeoVolume.cxx:2327
 TGeoVolume.cxx:2328
 TGeoVolume.cxx:2329
 TGeoVolume.cxx:2330
 TGeoVolume.cxx:2331
 TGeoVolume.cxx:2332
 TGeoVolume.cxx:2333
 TGeoVolume.cxx:2334
 TGeoVolume.cxx:2335
 TGeoVolume.cxx:2336
 TGeoVolume.cxx:2337
 TGeoVolume.cxx:2338
 TGeoVolume.cxx:2339
 TGeoVolume.cxx:2340
 TGeoVolume.cxx:2341
 TGeoVolume.cxx:2342
 TGeoVolume.cxx:2343
 TGeoVolume.cxx:2344
 TGeoVolume.cxx:2345
 TGeoVolume.cxx:2346
 TGeoVolume.cxx:2347
 TGeoVolume.cxx:2348
 TGeoVolume.cxx:2349
 TGeoVolume.cxx:2350
 TGeoVolume.cxx:2351
 TGeoVolume.cxx:2352
 TGeoVolume.cxx:2353
 TGeoVolume.cxx:2354
 TGeoVolume.cxx:2355
 TGeoVolume.cxx:2356
 TGeoVolume.cxx:2357
 TGeoVolume.cxx:2358
 TGeoVolume.cxx:2359
 TGeoVolume.cxx:2360
 TGeoVolume.cxx:2361
 TGeoVolume.cxx:2362
 TGeoVolume.cxx:2363
 TGeoVolume.cxx:2364
 TGeoVolume.cxx:2365
 TGeoVolume.cxx:2366
 TGeoVolume.cxx:2367
 TGeoVolume.cxx:2368
 TGeoVolume.cxx:2369
 TGeoVolume.cxx:2370
 TGeoVolume.cxx:2371
 TGeoVolume.cxx:2372
 TGeoVolume.cxx:2373
 TGeoVolume.cxx:2374
 TGeoVolume.cxx:2375
 TGeoVolume.cxx:2376
 TGeoVolume.cxx:2377
 TGeoVolume.cxx:2378
 TGeoVolume.cxx:2379
 TGeoVolume.cxx:2380
 TGeoVolume.cxx:2381
 TGeoVolume.cxx:2382
 TGeoVolume.cxx:2383
 TGeoVolume.cxx:2384
 TGeoVolume.cxx:2385
 TGeoVolume.cxx:2386
 TGeoVolume.cxx:2387
 TGeoVolume.cxx:2388
 TGeoVolume.cxx:2389
 TGeoVolume.cxx:2390
 TGeoVolume.cxx:2391
 TGeoVolume.cxx:2392
 TGeoVolume.cxx:2393
 TGeoVolume.cxx:2394
 TGeoVolume.cxx:2395
 TGeoVolume.cxx:2396
 TGeoVolume.cxx:2397
 TGeoVolume.cxx:2398
 TGeoVolume.cxx:2399
 TGeoVolume.cxx:2400
 TGeoVolume.cxx:2401
 TGeoVolume.cxx:2402
 TGeoVolume.cxx:2403
 TGeoVolume.cxx:2404
 TGeoVolume.cxx:2405
 TGeoVolume.cxx:2406
 TGeoVolume.cxx:2407
 TGeoVolume.cxx:2408
 TGeoVolume.cxx:2409
 TGeoVolume.cxx:2410
 TGeoVolume.cxx:2411
 TGeoVolume.cxx:2412
 TGeoVolume.cxx:2413
 TGeoVolume.cxx:2414
 TGeoVolume.cxx:2415
 TGeoVolume.cxx:2416
 TGeoVolume.cxx:2417
 TGeoVolume.cxx:2418
 TGeoVolume.cxx:2419
 TGeoVolume.cxx:2420
 TGeoVolume.cxx:2421
 TGeoVolume.cxx:2422
 TGeoVolume.cxx:2423
 TGeoVolume.cxx:2424
 TGeoVolume.cxx:2425
 TGeoVolume.cxx:2426
 TGeoVolume.cxx:2427
 TGeoVolume.cxx:2428
 TGeoVolume.cxx:2429
 TGeoVolume.cxx:2430
 TGeoVolume.cxx:2431
 TGeoVolume.cxx:2432
 TGeoVolume.cxx:2433
 TGeoVolume.cxx:2434
 TGeoVolume.cxx:2435
 TGeoVolume.cxx:2436
 TGeoVolume.cxx:2437
 TGeoVolume.cxx:2438
 TGeoVolume.cxx:2439
 TGeoVolume.cxx:2440
 TGeoVolume.cxx:2441
 TGeoVolume.cxx:2442
 TGeoVolume.cxx:2443
 TGeoVolume.cxx:2444
 TGeoVolume.cxx:2445
 TGeoVolume.cxx:2446
 TGeoVolume.cxx:2447
 TGeoVolume.cxx:2448
 TGeoVolume.cxx:2449
 TGeoVolume.cxx:2450
 TGeoVolume.cxx:2451
 TGeoVolume.cxx:2452
 TGeoVolume.cxx:2453
 TGeoVolume.cxx:2454
 TGeoVolume.cxx:2455
 TGeoVolume.cxx:2456
 TGeoVolume.cxx:2457
 TGeoVolume.cxx:2458
 TGeoVolume.cxx:2459
 TGeoVolume.cxx:2460
 TGeoVolume.cxx:2461
 TGeoVolume.cxx:2462
 TGeoVolume.cxx:2463
 TGeoVolume.cxx:2464
 TGeoVolume.cxx:2465
 TGeoVolume.cxx:2466
 TGeoVolume.cxx:2467
 TGeoVolume.cxx:2468
 TGeoVolume.cxx:2469
 TGeoVolume.cxx:2470
 TGeoVolume.cxx:2471
 TGeoVolume.cxx:2472
 TGeoVolume.cxx:2473
 TGeoVolume.cxx:2474
 TGeoVolume.cxx:2475
 TGeoVolume.cxx:2476
 TGeoVolume.cxx:2477
 TGeoVolume.cxx:2478
 TGeoVolume.cxx:2479
 TGeoVolume.cxx:2480
 TGeoVolume.cxx:2481
 TGeoVolume.cxx:2482
 TGeoVolume.cxx:2483
 TGeoVolume.cxx:2484
 TGeoVolume.cxx:2485
 TGeoVolume.cxx:2486
 TGeoVolume.cxx:2487
 TGeoVolume.cxx:2488
 TGeoVolume.cxx:2489
 TGeoVolume.cxx:2490
 TGeoVolume.cxx:2491
 TGeoVolume.cxx:2492
 TGeoVolume.cxx:2493
 TGeoVolume.cxx:2494
 TGeoVolume.cxx:2495
 TGeoVolume.cxx:2496
 TGeoVolume.cxx:2497
 TGeoVolume.cxx:2498
 TGeoVolume.cxx:2499
 TGeoVolume.cxx:2500
 TGeoVolume.cxx:2501
 TGeoVolume.cxx:2502
 TGeoVolume.cxx:2503
 TGeoVolume.cxx:2504
 TGeoVolume.cxx:2505
 TGeoVolume.cxx:2506
 TGeoVolume.cxx:2507
 TGeoVolume.cxx:2508
 TGeoVolume.cxx:2509
 TGeoVolume.cxx:2510
 TGeoVolume.cxx:2511
 TGeoVolume.cxx:2512
 TGeoVolume.cxx:2513
 TGeoVolume.cxx:2514
 TGeoVolume.cxx:2515
 TGeoVolume.cxx:2516
 TGeoVolume.cxx:2517
 TGeoVolume.cxx:2518
 TGeoVolume.cxx:2519
 TGeoVolume.cxx:2520
 TGeoVolume.cxx:2521
 TGeoVolume.cxx:2522
 TGeoVolume.cxx:2523
 TGeoVolume.cxx:2524
 TGeoVolume.cxx:2525
 TGeoVolume.cxx:2526
 TGeoVolume.cxx:2527
 TGeoVolume.cxx:2528
 TGeoVolume.cxx:2529
 TGeoVolume.cxx:2530
 TGeoVolume.cxx:2531
 TGeoVolume.cxx:2532
 TGeoVolume.cxx:2533
 TGeoVolume.cxx:2534
 TGeoVolume.cxx:2535
 TGeoVolume.cxx:2536
 TGeoVolume.cxx:2537
 TGeoVolume.cxx:2538
 TGeoVolume.cxx:2539
 TGeoVolume.cxx:2540
 TGeoVolume.cxx:2541
 TGeoVolume.cxx:2542
 TGeoVolume.cxx:2543
 TGeoVolume.cxx:2544
 TGeoVolume.cxx:2545
 TGeoVolume.cxx:2546
 TGeoVolume.cxx:2547
 TGeoVolume.cxx:2548
 TGeoVolume.cxx:2549
 TGeoVolume.cxx:2550
 TGeoVolume.cxx:2551
 TGeoVolume.cxx:2552
 TGeoVolume.cxx:2553
 TGeoVolume.cxx:2554
 TGeoVolume.cxx:2555
 TGeoVolume.cxx:2556
 TGeoVolume.cxx:2557
 TGeoVolume.cxx:2558
 TGeoVolume.cxx:2559
 TGeoVolume.cxx:2560
 TGeoVolume.cxx:2561
 TGeoVolume.cxx:2562
 TGeoVolume.cxx:2563
 TGeoVolume.cxx:2564
 TGeoVolume.cxx:2565
 TGeoVolume.cxx:2566
 TGeoVolume.cxx:2567
 TGeoVolume.cxx:2568
 TGeoVolume.cxx:2569
 TGeoVolume.cxx:2570
 TGeoVolume.cxx:2571