Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGeoCache.h
Go to the documentation of this file.
1 // @(#)root/geom:$Id$
2 // Author: Andrei Gheata 18/03/02
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 // Author : Andrei Gheata - date Wed 12 Dec 2001 09:45:08 AM CET
12 
13 #ifndef ROOT_TGeoCache
14 #define ROOT_TGeoCache
15 
16 #include "TGeoNode.h"
17 
18 #include "TGeoStateInfo.h"
19 
20 // forward declarations
21 class TGeoManager;
22 class TGeoHMatrix;
23 
24 class TGeoCacheState : public TObject
25 {
26 protected:
27  Int_t fCapacity; // maximum level stored
28  Int_t fLevel; // level in the current branch
29  Int_t fNmany; // number of overlapping nodes on current branch
30  Int_t fStart; // start level
31  Int_t fIdBranch[30]; // ID branch
32  Double_t fPoint[3]; // last point in master frame
33  Bool_t fOverlapping; // overlap flag
34 
35  TGeoNode **fNodeBranch; // last node branch stored
36  TGeoHMatrix **fMatrixBranch; // global matrices for last branch
37  TGeoHMatrix **fMatPtr; // array of matrix pointers
38 
39  TGeoCacheState(const TGeoCacheState&);
40  TGeoCacheState& operator=(const TGeoCacheState&);
41 
42 public:
43  TGeoCacheState();
44  TGeoCacheState(Int_t capacity);
45  virtual ~TGeoCacheState();
46 
47  void SetState(Int_t level, Int_t startlevel, Int_t nmany, Bool_t ovlp, Double_t *point=0);
48  Bool_t GetState(Int_t &level, Int_t &nmany, Double_t *point) const;
49 
50  ClassDef(TGeoCacheState, 0) // class storing the cache state
51 };
52 
53 class TGeoNodeCache : public TObject
54 {
55 private:
56  Int_t fGeoCacheMaxLevels;// maximum supported number of levels
57  Int_t fGeoCacheStackSize;// maximum size of the stack
58  Int_t fGeoInfoStackSize; // maximum size of the stack of info states
59  Int_t fLevel; // level in the current branch
60  Int_t fStackLevel; // current level in the stack
61  Int_t fInfoLevel; // current level in the stack
62  Int_t fCurrentID; // unique ID of current node
63  Int_t fIndex; // index in array of ID's
64  Int_t fIdBranch[100]; // current branch of indices
65  TString fPath; // path for current branch
66  TGeoNode *fTop; // top node
67  TGeoNode *fNode; //! current node
68  TGeoHMatrix *fMatrix; //! current matrix
69  TObjArray *fStack; // stack of cache states
70  TGeoHMatrix **fMatrixBranch; // current branch of global matrices
71  TGeoHMatrix **fMPB; // pre-built matrices
72  TGeoNode **fNodeBranch; // current branch of nodes
73  TGeoStateInfo **fInfoBranch; // current branch of nodes
74  TGeoStateInfo *fPWInfo; //! State info for the parallel world
75  Int_t *fNodeIdArray; //! array of node id's
76 
77  TGeoNodeCache(const TGeoNodeCache&); // Not implemented
78  TGeoNodeCache& operator=(const TGeoNodeCache&); // Not implemented
79 
80 public:
81  TGeoNodeCache();
82  TGeoNodeCache(TGeoNode *top, Bool_t nodeid=kFALSE, Int_t capacity=30);
83  virtual ~TGeoNodeCache();
84 
85  void BuildIdArray();
86  void BuildInfoBranch();
87  void CdNode(Int_t nodeid);
88  Bool_t CdDown(Int_t index);
89  Bool_t CdDown(TGeoNode *node);
90  void CdTop() {fLevel=1; CdUp();}
91  void CdUp();
92  void FillIdBranch(const Int_t *br, Int_t startlevel=0) {memcpy(fIdBranch+startlevel,br,(fLevel+1-startlevel)*sizeof(Int_t)); fIndex=fIdBranch[fLevel];}
93  const Int_t *GetIdBranch() const {return fIdBranch;}
94  void *GetBranch() const {return fNodeBranch;}
95  void GetBranchNames(Int_t *names) const;
96  void GetBranchNumbers(Int_t *copyNumbers, Int_t *volumeNumbers) const;
97  void GetBranchOnlys(Int_t *isonly) const;
98  void *GetMatrices() const {return fMatrixBranch;}
99  TGeoHMatrix *GetCurrentMatrix() const {return fMatrix;}
100  Int_t GetCurrentNodeId() const;
101  TGeoNode *GetMother(Int_t up=1) const {return ((fLevel-up)>=0)?fNodeBranch[fLevel-up]:0;}
102  TGeoHMatrix *GetMotherMatrix(Int_t up=1) const {return ((fLevel-up)>=0)?fMatrixBranch[fLevel-up]:0;}
103  TGeoNode *GetNode() const {return fNode;}
104  TGeoNode *GetTopNode() const {return fTop;}
105  TGeoStateInfo *GetInfo();
106  TGeoStateInfo *GetMakePWInfo(Int_t nd);
107  void ReleaseInfo();
108  Int_t GetLevel() const {return fLevel;}
109  const char *GetPath();
110  Int_t GetStackLevel() const {return fStackLevel;}
111  Int_t GetNodeId() const;
112  Bool_t HasIdArray() const {return (fNodeIdArray)?kTRUE:kFALSE;}
113  Bool_t IsDummy() const {return kTRUE;}
114 
115  void LocalToMaster(const Double_t *local, Double_t *master) const;
116  void MasterToLocal(const Double_t *master, Double_t *local) const;
117  void LocalToMasterVect(const Double_t *local, Double_t *master) const;
118  void MasterToLocalVect(const Double_t *master, Double_t *local) const;
119  void LocalToMasterBomb(const Double_t *local, Double_t *master) const;
120  void MasterToLocalBomb(const Double_t *master, Double_t *local) const;
121  Int_t PushState(Bool_t ovlp, Int_t ntmany=0, Int_t startlevel=0, Double_t *point=0);
122  Bool_t PopState(Int_t &nmany, Double_t *point=0);
123  Bool_t PopState(Int_t &nmany, Int_t level, Double_t *point=0);
124  void PopDummy(Int_t ipop=9999) {fStackLevel=(ipop>fStackLevel)?(fStackLevel-1):(ipop-1);}
125  void Refresh() {fNode=fNodeBranch[fLevel]; fMatrix=fMatrixBranch[fLevel];}
126  Bool_t RestoreState(Int_t &nmany, TGeoCacheState *state, Double_t *point=0);
127 
128  ClassDef(TGeoNodeCache, 0) // cache of reusable physical nodes
129 };
130 
131 #endif