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

// Author: Andrei Gheata   30/06/14

#ifndef ROOT_TGeoParallelWorld
#define ROOT_TGeoParallelWorld


#ifndef ROOT_TGeoVolume
#include "TGeoVolume.h"
#endif

// forward declarations
class TGeoManager;
class TGeoPhysicalNode;
class TGeoVolume;

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoParallelWorld - base class for a flat world that can be navigated  //
//   in parallel                                                          //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoParallelWorld : public TNamed
{
protected :
   TGeoManager       *fGeoManager;     // base geometry
   TObjArray         *fPaths;          // array of paths
   Bool_t             fUseOverlaps;    // Activated if user defined overlapping candidates
   Bool_t             fIsClosed;       //! Closed flag
   TGeoVolume        *fVolume;         //! helper volume
   TGeoPhysicalNode  *fLastState;      //! Last PN touched
   TObjArray         *fPhysical;       //! array of physical nodes

   TGeoParallelWorld(const TGeoParallelWorld&);
   TGeoParallelWorld& operator=(const TGeoParallelWorld&);

public:
   // constructors
   TGeoParallelWorld() : TNamed(),fGeoManager(0),fPaths(0),fUseOverlaps(kFALSE),fIsClosed(kFALSE),fVolume(0),fLastState(0),fPhysical(0) {}
   TGeoParallelWorld(const char *name, TGeoManager *mgr);

   // destructor
   virtual ~TGeoParallelWorld();
   // API for adding components nodes
   void              AddNode(const char *path);
   // Activate/deactivate  overlap usage
   void              SetUseOverlaps(Bool_t flag) {fUseOverlaps = flag;}
   Bool_t            IsUsingOverlaps() const {return fUseOverlaps;}
   void              ResetOverlaps() const;
   // Adding overlap candidates can highly improve performance.
   void              AddOverlap(TGeoVolume *vol, Bool_t activate=kTRUE);
   void              AddOverlap(const char *volname, Bool_t activate=kTRUE);
   // The normal PW mode (without declaring overlaps) does detect them
   Int_t             PrintDetectedOverlaps() const;
   
   // Closing a parallel geometry is mandatory
   Bool_t            CloseGeometry();
   // Refresh structures in case of re-alignment
   void              RefreshPhysicalNodes();

   // Navigation interface
   TGeoPhysicalNode *FindNode(Double_t point[3]);
   TGeoPhysicalNode *FindNextBoundary(Double_t point[3], Double_t dir[3], Double_t &step, Double_t stepmax=1.E30);
   Double_t          Safety(Double_t point[3], Double_t safmax=1.E30);

   // Getters
   TGeoManager      *GetGeometry() const {return fGeoManager;}
   Bool_t            IsClosed() const    {return fIsClosed;}
   TGeoVolume       *GetVolume() const   {return fVolume;}

   // Utilities
   void              CheckOverlaps(Double_t ovlp=0.001); // default 10 microns
   void              Draw(Option_t *option);

   ClassDef(TGeoParallelWorld, 3)     // parallel world base clas
};

#endif

 TGeoParallelWorld.h:1
 TGeoParallelWorld.h:2
 TGeoParallelWorld.h:3
 TGeoParallelWorld.h:4
 TGeoParallelWorld.h:5
 TGeoParallelWorld.h:6
 TGeoParallelWorld.h:7
 TGeoParallelWorld.h:8
 TGeoParallelWorld.h:9
 TGeoParallelWorld.h:10
 TGeoParallelWorld.h:11
 TGeoParallelWorld.h:12
 TGeoParallelWorld.h:13
 TGeoParallelWorld.h:14
 TGeoParallelWorld.h:15
 TGeoParallelWorld.h:16
 TGeoParallelWorld.h:17
 TGeoParallelWorld.h:18
 TGeoParallelWorld.h:19
 TGeoParallelWorld.h:20
 TGeoParallelWorld.h:21
 TGeoParallelWorld.h:22
 TGeoParallelWorld.h:23
 TGeoParallelWorld.h:24
 TGeoParallelWorld.h:25
 TGeoParallelWorld.h:26
 TGeoParallelWorld.h:27
 TGeoParallelWorld.h:28
 TGeoParallelWorld.h:29
 TGeoParallelWorld.h:30
 TGeoParallelWorld.h:31
 TGeoParallelWorld.h:32
 TGeoParallelWorld.h:33
 TGeoParallelWorld.h:34
 TGeoParallelWorld.h:35
 TGeoParallelWorld.h:36
 TGeoParallelWorld.h:37
 TGeoParallelWorld.h:38
 TGeoParallelWorld.h:39
 TGeoParallelWorld.h:40
 TGeoParallelWorld.h:41
 TGeoParallelWorld.h:42
 TGeoParallelWorld.h:43
 TGeoParallelWorld.h:44
 TGeoParallelWorld.h:45
 TGeoParallelWorld.h:46
 TGeoParallelWorld.h:47
 TGeoParallelWorld.h:48
 TGeoParallelWorld.h:49
 TGeoParallelWorld.h:50
 TGeoParallelWorld.h:51
 TGeoParallelWorld.h:52
 TGeoParallelWorld.h:53
 TGeoParallelWorld.h:54
 TGeoParallelWorld.h:55
 TGeoParallelWorld.h:56
 TGeoParallelWorld.h:57
 TGeoParallelWorld.h:58
 TGeoParallelWorld.h:59
 TGeoParallelWorld.h:60
 TGeoParallelWorld.h:61
 TGeoParallelWorld.h:62
 TGeoParallelWorld.h:63
 TGeoParallelWorld.h:64
 TGeoParallelWorld.h:65
 TGeoParallelWorld.h:66
 TGeoParallelWorld.h:67
 TGeoParallelWorld.h:68
 TGeoParallelWorld.h:69
 TGeoParallelWorld.h:70
 TGeoParallelWorld.h:71
 TGeoParallelWorld.h:72
 TGeoParallelWorld.h:73
 TGeoParallelWorld.h:74
 TGeoParallelWorld.h:75
 TGeoParallelWorld.h:76
 TGeoParallelWorld.h:77
 TGeoParallelWorld.h:78
 TGeoParallelWorld.h:79
 TGeoParallelWorld.h:80
 TGeoParallelWorld.h:81
 TGeoParallelWorld.h:82
 TGeoParallelWorld.h:83
 TGeoParallelWorld.h:84
 TGeoParallelWorld.h:85
 TGeoParallelWorld.h:86
 TGeoParallelWorld.h:87