ROOT logo
// Author: Andrei Gheata   17/02/04

/*************************************************************************
 * 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.             *
 *************************************************************************/

//_____________________________________________________________________________
// TGeoParallelWorld    - base class for a flat parallel geometry.
//   The parallel geometry can be composed by both normal volumes added
// using the AddNode interface (not implemented yet) or by physical nodes 
// which will use as position their actual global matrix with respect to the top 
// volume of the main geometry. 
//   All these nodes are added as daughters to the "top" volume of
// the parallel world which acts as a navigation helper in this parallel
// world. The parallel world has to be closed before calling any navigation
// method.
//_____________________________________________________________________________

#include "TGeoParallelWorld.h"
#include "TObjString.h"
#include "TGeoManager.h"
#include "TGeoVolume.h"
#include "TGeoVoxelFinder.h"
#include "TGeoMatrix.h"
#include "TGeoPhysicalNode.h"
#include "TGeoNavigator.h"

ClassImp(TGeoParallelWorld)

//_____________________________________________________________________________
TGeoParallelWorld::TGeoParallelWorld(const char *name, TGeoManager *mgr) 
                  : TNamed(name,""),
                    fGeoManager(mgr),
                    fPaths(new TObjArray(256)),
                    fUseOverlaps(kFALSE),
                    fIsClosed(kFALSE),
                    fVolume(0),
                    fLastState(0),
                    fPhysical(new TObjArray(256))
{
// Default constructor
}

//_____________________________________________________________________________
TGeoParallelWorld::~TGeoParallelWorld()
{
// Destructor
   if (fPhysical) {fPhysical->Delete(); delete fPhysical;}
   if (fPaths) {fPaths->Delete(); delete fPaths;}
   delete fVolume;
}

//_____________________________________________________________________________
void TGeoParallelWorld::AddNode(const char *path)
{
// Add a node normally to this world. Overlapping nodes not allowed
   if (fIsClosed) Fatal("AddNode", "Cannot add nodes to a closed parallel geometry");
   if (!fGeoManager->CheckPath(path)) {
      Error("AddNode", "Path %s not valid.\nCannot add to parallel world!", path);
      return;
   }
   fPaths->Add(new TObjString(path));
}

//_____________________________________________________________________________
void TGeoParallelWorld::AddOverlap(TGeoVolume *vol, Bool_t activate)
{
// To use this optimization, the user should declare the full list of volumes
// which may overlap with any of the physical nodes of the parallel world. Better
// be done before misalignment
   if (activate) fUseOverlaps = kTRUE;
   vol->SetOverlappingCandidate(kTRUE);
}

//_____________________________________________________________________________
void TGeoParallelWorld::AddOverlap(const char *volname, Bool_t activate)
{
// To use this optimization, the user should declare the full list of volumes
// which may overlap with any of the physical nodes of the parallel world. Better
// be done before misalignment
   if (activate) fUseOverlaps = kTRUE;
   TIter next(fGeoManager->GetListOfVolumes());
   TGeoVolume *vol;
   while ((vol=(TGeoVolume*)next())) {
      if (!strcmp(vol->GetName(), volname)) vol->SetOverlappingCandidate(kTRUE);
   }
}      

//_____________________________________________________________________________
Int_t TGeoParallelWorld::PrintDetectedOverlaps() const
{
// Print the overlaps which were detected during real tracking
   TIter next(fGeoManager->GetListOfVolumes());
   TGeoVolume *vol;
   Int_t noverlaps = 0;
   while ((vol=(TGeoVolume*)next())) {
      if (vol->IsOverlappingCandidate()) {
         if (noverlaps==0) Info("PrintDetectedOverlaps", "List of detected volumes overlapping with the PW");
         noverlaps++;
         printf("volume: %s at index: %d\n", vol->GetName(), vol->GetNumber());
      }   
   }
   return noverlaps;  
}

//_____________________________________________________________________________
void TGeoParallelWorld::ResetOverlaps() const
{
// Reset overlapflag for all volumes in geometry
   TIter next(fGeoManager->GetListOfVolumes());
   TGeoVolume *vol;
   while ((vol=(TGeoVolume*)next())) vol->SetOverlappingCandidate(kFALSE);
}

//_____________________________________________________________________________
Bool_t TGeoParallelWorld::CloseGeometry()
{
// The main geometry must be closed.
   if (fIsClosed) return kTRUE;
   if (!fGeoManager->IsClosed()) Fatal("CloseGeometry", "Main geometry must be closed first");
   if (!fPaths || !fPaths->GetEntriesFast()) {
      Error("CloseGeometry", "List of paths is empty");
      return kFALSE;
   }
   RefreshPhysicalNodes();
   fIsClosed = kTRUE;
   Info("CloseGeometry", "Parallel world %s contains %d prioritised objects", GetName(), fPaths->GetEntriesFast());
   Int_t novlp = 0;
   TIter next(fGeoManager->GetListOfVolumes());
   TGeoVolume *vol;
   while ((vol=(TGeoVolume*)next())) if (vol->IsOverlappingCandidate()) novlp++;
   Info("CloseGeometry", "Number of declared overlaps: %d", novlp);
   if (fUseOverlaps) Info("CloseGeometry", "Parallel world will use declared overlaps");
   else              Info("CloseGeometry", "Parallel world will detect overlaps with other volumes");
   return kTRUE;
}   

//_____________________________________________________________________________
void TGeoParallelWorld::RefreshPhysicalNodes()
{
// Refresh the node pointers and re-voxelize. To be called mandatory in case 
// re-alignment happened.
   delete fVolume;
   fVolume = new TGeoVolumeAssembly(GetName());
   fGeoManager->GetListOfVolumes()->Remove(fVolume);
   // Loop physical nodes and add them to the navigation helper volume
   if (fPhysical) {fPhysical->Delete(); delete fPhysical;}
   fPhysical = new TObjArray(fPaths->GetEntriesFast());
   TGeoPhysicalNode *pnode;
   TObjString *objs;
   TIter next(fPaths);
   Int_t copy = 0;
   while ((objs = (TObjString*)next())) {
      pnode = new TGeoPhysicalNode(objs->GetName());
      fPhysical->AddAt(pnode, copy);
      fVolume->AddNode(pnode->GetVolume(), copy++, new TGeoHMatrix(*pnode->GetMatrix()));
   }
   // Voxelize the volume
   fVolume->GetShape()->ComputeBBox();
   fVolume->Voxelize("ALL");
}   

//_____________________________________________________________________________
TGeoPhysicalNode *TGeoParallelWorld::FindNode(Double_t point[3])
{
// Finds physical node containing the point
   if (!fIsClosed) Fatal("FindNode", "Parallel geometry must be closed first");
   TGeoNavigator *nav = fGeoManager->GetCurrentNavigator();
   // Fast return if not in an overlapping candidate
   TGeoVoxelFinder *voxels = fVolume->GetVoxels();
   Int_t id;
   Int_t ncheck = 0;
   Int_t nd = fVolume->GetNdaughters();
   // get the list of nodes passing thorough the current voxel
   TGeoNodeCache *cache = nav->GetCache();
   TGeoStateInfo &info = *cache->GetMakePWInfo(nd);
   Int_t *check_list = voxels->GetCheckList(point, ncheck, info);
//   cache->ReleaseInfo(); // no hierarchical use
   if (!check_list) return 0;
   // loop all nodes in voxel
   TGeoNode *node;
   Double_t local[3];
   for (id=0; id<ncheck; id++) {
      node = fVolume->GetNode(check_list[id]);
      node->MasterToLocal(point, local);
      if (node->GetVolume()->Contains(local)) {
         // We found a node containing the point
         fLastState = (TGeoPhysicalNode*)fPhysical->At(node->GetNumber());
         return fLastState;
      }
   }
   return 0;
}   

//_____________________________________________________________________________
TGeoPhysicalNode *TGeoParallelWorld::FindNextBoundary(Double_t point[3], Double_t dir[3],
                              Double_t &step, Double_t stepmax)
{
// Same functionality as TGeoNavigator::FindNextDaughterBoundary for the
// parallel world
   if (!fIsClosed) Fatal("FindNextBoundary", "Parallel geometry must be closed first");
   TGeoPhysicalNode *pnode = 0;
   TGeoNavigator *nav = fGeoManager->GetCurrentNavigator();
   // Fast return if not in an overlapping candidate
   if (fUseOverlaps && !nav->GetCurrentVolume()->IsOverlappingCandidate()) return 0;
//   TIter next(fPhysical);
   // Ignore the request if the current state in the main geometry matches the
   // last touched physical node in the parallel geometry
   if (fLastState && fLastState->IsMatchingState(nav)) return 0;
//   while ((pnode = (TGeoPhysicalNode*)next())) {
//      if (pnode->IsMatchingState(nav)) return 0;
//   }   
   Double_t snext = TGeoShape::Big();
   step = stepmax;
   TGeoVoxelFinder *voxels = fVolume->GetVoxels();
   Int_t idaughter = -1; // nothing crossed
   Int_t nd = fVolume->GetNdaughters();
   Int_t i;
   TGeoNode *current;
   Double_t lpoint[3], ldir[3];
//   const Double_t tolerance = TGeoShape::Tolerance();
   if (nd<5) {
   // loop over daughters
      for (i=0; i<nd; i++) {
         current = fVolume->GetNode(i);
         // validate only within stepmax
         if (voxels->IsSafeVoxel(point, i, stepmax)) continue;
         current->MasterToLocal(point, lpoint);
         current->MasterToLocalVect(dir, ldir);
         snext = current->GetVolume()->GetShape()->DistFromOutside(lpoint, ldir, 3, step);
         if (snext < step) {
            step = snext;
            idaughter = i;
         }
      }
      if (idaughter>=0) {
         pnode = (TGeoPhysicalNode*)fPhysical->At(idaughter);
         return pnode;
      }
      step = TGeoShape::Big();
      return 0;
   }      
   // Get current voxel
   Int_t ncheck = 0;
   Int_t sumchecked = 0;
   Int_t *vlist = 0;
   TGeoNodeCache *cache = nav->GetCache();
   TGeoStateInfo &info = *cache->GetMakePWInfo(nd);
//   TGeoStateInfo &info = *cache->GetInfo();
//   cache->ReleaseInfo(); // no hierarchical use
   voxels->SortCrossedVoxels(point, dir, info);
   while ((sumchecked<nd) && (vlist=voxels->GetNextVoxel(point, dir, ncheck, info))) {
      for (i=0; i<ncheck; i++) {
         pnode = (TGeoPhysicalNode*)fPhysical->At(vlist[i]);
         if (pnode->IsMatchingState(nav)) {
            step = TGeoShape::Big();
            return 0;
         }
         current = fVolume->GetNode(vlist[i]);
         current->MasterToLocal(point, lpoint);
         current->MasterToLocalVect(dir, ldir);
         snext = current->GetVolume()->GetShape()->DistFromOutside(lpoint, ldir, 3, step);
         if (snext < step - 1.E-8) {
            step = snext;
            idaughter = vlist[i];
         }
      }   
      if (idaughter>=0) {
         pnode = (TGeoPhysicalNode*)fPhysical->At(idaughter);
         // mark the overlap
         if (!fUseOverlaps && !nav->GetCurrentVolume()->IsOverlappingCandidate()) {
            AddOverlap(nav->GetCurrentVolume(),kFALSE);
//            printf("object %s overlapping with pn: %s\n", fGeoManager->GetPath(), pnode->GetName());
         }   
         return pnode;
      }
   }   
   step = TGeoShape::Big();
   return 0;
}   

//_____________________________________________________________________________
Double_t TGeoParallelWorld::Safety(Double_t point[3], Double_t safmax)
{
// Compute safety for the parallel world
   TGeoNavigator *nav = fGeoManager->GetCurrentNavigator();
   // Fast return if the state matches the last one recorded
   if (fLastState && fLastState->IsMatchingState(nav)) return TGeoShape::Big();   
   // Fast return if not in an overlapping candidate
   if (fUseOverlaps && !nav->GetCurrentVolume()->IsOverlappingCandidate()) return TGeoShape::Big();
   Double_t local[3];
   Double_t safe = safmax;
   Double_t safnext;
   TGeoPhysicalNode *pnode = 0;
   const Double_t tolerance = TGeoShape::Tolerance();
   Int_t nd = fVolume->GetNdaughters();
   TGeoNode *current;
   TGeoVoxelFinder *voxels = fVolume->GetVoxels();
   //---> check fast unsafe voxels
   Double_t *boxes = voxels->GetBoxes();
   for (Int_t id=0; id<nd; id++) {
      Int_t ist = 6*id;
      Double_t dxyz = 0.;
      Double_t dxyz0 = TMath::Abs(point[0]-boxes[ist+3])-boxes[ist];
      if (dxyz0 > safe) continue;
      Double_t dxyz1 = TMath::Abs(point[1]-boxes[ist+4])-boxes[ist+1];
      if (dxyz1 > safe) continue;
      Double_t dxyz2 = TMath::Abs(point[2]-boxes[ist+5])-boxes[ist+2];
      if (dxyz2 > safe) continue;
      if (dxyz0>0) dxyz+=dxyz0*dxyz0;
      if (dxyz1>0) dxyz+=dxyz1*dxyz1;
      if (dxyz2>0) dxyz+=dxyz2*dxyz2;
      if (dxyz >= safe*safe) continue;
      pnode = (TGeoPhysicalNode*)fPhysical->At(id);
      // Return if inside the current node
      if (pnode->IsMatchingState(nav)) return TGeoShape::Big();
      current = fVolume->GetNode(id);
      current->MasterToLocal(point, local);
      // Safety to current node
      safnext = current->Safety(local, kFALSE);
      if (safnext < tolerance) return 0.;
      if (safnext < safe) safe = safnext;
   }
   return safe;
}   

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