ROOT  6.06/09
Reference Guide
TGeoVoxelFinder.h
Go to the documentation of this file.
1 // @(#)root/geom:$Id$
2 // Author: Andrei Gheata 04/02/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 
12 #ifndef ROOT_TGeoVoxelFinder
13 #define ROOT_TGeoVoxelFinder
14 
15 #ifndef ROOT_TObject
16 #include "TObject.h"
17 #endif
18 
19 class TGeoVolume;
20 struct TGeoStateInfo;
21 
22 /*************************************************************************
23  * TGeoVoxelFinder - finder class handling voxels
24  *
25  *************************************************************************/
26 
27 class TGeoVoxelFinder : public TObject
28 {
29 public:
33 };
34 
35 protected:
36  TGeoVolume *fVolume; // volume to which applies
37 
38  Int_t fIbx; // number of different boundaries on X axis
39  Int_t fIby; // number of different boundaries on Y axis
40  Int_t fIbz; // number of different boundaries on Z axis
41  Int_t fNboxes; // length of boxes array
42  Int_t fNox; // length of array of X offsets
43  Int_t fNoy; // length of array of Y offsets
44  Int_t fNoz; // length of array of Z offsets
45  Int_t fNex; // length of array of X extra offsets
46  Int_t fNey; // length of array of Y extra offsets
47  Int_t fNez; // length of array of Z extra offsets
48  Int_t fNx; // length of array of X voxels
49  Int_t fNy; // length of array of Y voxels
50  Int_t fNz; // length of array of Z voxels
51  Int_t fPriority[3]; // priority for each axis
52  Double_t *fBoxes; //[fNboxes] list of bounding boxes
53  Double_t *fXb; //[fIbx] ordered array of X box boundaries
54  Double_t *fYb; //[fIby] ordered array of Y box boundaries
55  Double_t *fZb; //[fIbz] ordered array of Z box boundaries
56  Int_t *fOBx; //[fNox] offsets of daughter indices for slices X
57  Int_t *fOBy; //[fNoy] offsets of daughter indices for slices Y
58  Int_t *fOBz; //[fNoz] offsets of daughter indices for slices Z
59  Int_t *fOEx; //[fNox] offsets of extra indices for slices X
60  Int_t *fOEy; //[fNoy] offsets of extra indices for slices Y
61  Int_t *fOEz; //[fNoz] offsets of extra indices for slices Z
62  Int_t *fExtraX; //[fNex] indices of extra daughters in X slices
63  Int_t *fExtraY; //[fNey] indices of extra daughters in Y slices
64  Int_t *fExtraZ; //[fNez] indices of extra daughters in Z slices
65  Int_t *fNsliceX; //[fNox] number of candidates in X slice
66  Int_t *fNsliceY; //[fNoy] number of candidates in Y slice
67  Int_t *fNsliceZ; //[fNoz] number of candidates in Z slice
68  UChar_t *fIndcX; //[fNx] array of slices bits on X
69  UChar_t *fIndcY; //[fNy] array of slices bits on Y
70  UChar_t *fIndcZ; //[fNz] array of slices bits on Z
71 
74 
75  void BuildVoxelLimits();
76  Int_t *GetExtraX(Int_t islice, Bool_t left, Int_t &nextra) const;
77  Int_t *GetExtraY(Int_t islice, Bool_t left, Int_t &nextra) const;
78  Int_t *GetExtraZ(Int_t islice, Bool_t left, Int_t &nextra) const;
79  Bool_t GetIndices(const Double_t *point, TGeoStateInfo &td);
80  Int_t GetPriority(Int_t iaxis) const {return fPriority[iaxis];}
82  Int_t *GetValidExtra(Int_t *list, Int_t &ncheck, TGeoStateInfo &td);
83  Int_t *GetValidExtra(Int_t n1, UChar_t *array1, Int_t *list, Int_t &ncheck, TGeoStateInfo &td);
84  Int_t *GetValidExtra(Int_t n1, UChar_t *array1, Int_t n2, UChar_t *array2, Int_t *list, Int_t &ncheck, TGeoStateInfo &td);
86  Bool_t Intersect(Int_t n1, UChar_t *array1, Int_t &nf, Int_t *result);
87  Bool_t Intersect(Int_t n1, UChar_t *array1, Int_t n2, UChar_t *array2,
88  Int_t &nf, Int_t *result);
89  Bool_t Intersect(Int_t n1, UChar_t *array1, Int_t n2, UChar_t *array2,
90  Int_t n3, UChar_t *array3, Int_t &nf, Int_t *result);
92  Bool_t IntersectAndStore(Int_t n1, UChar_t *array1, Int_t n2, UChar_t *array2, TGeoStateInfo &td);
93  Bool_t IntersectAndStore(Int_t n1, UChar_t *array1, Int_t n2, UChar_t *array2,
94  Int_t n3, UChar_t *array3, TGeoStateInfo &td);
95  void SortAll(Option_t *option="");
96  Bool_t Union(Int_t n1, UChar_t *array1, TGeoStateInfo &td);
97  Bool_t Union(Int_t n1, UChar_t *array1, Int_t n2, UChar_t *array2, TGeoStateInfo &td);
98  Bool_t Union(Int_t n1, UChar_t *array1, Int_t n2, UChar_t *array2,
99  Int_t n3, UChar_t *array3, TGeoStateInfo &td);
100 public :
101  TGeoVoxelFinder();
103  virtual ~TGeoVoxelFinder();
104  void DaughterToMother(Int_t id, const Double_t *local, Double_t *master) const;
105  virtual Double_t Efficiency();
106  virtual Int_t *GetCheckList(const Double_t *point, Int_t &nelem, TGeoStateInfo &td);
107  Int_t *GetCheckList(Int_t &nelem, TGeoStateInfo &td) const;
108  virtual Int_t *GetNextCandidates(const Double_t *point, Int_t &ncheck, TGeoStateInfo &td);
109  virtual void FindOverlaps(Int_t inode) const;
112  Double_t *GetBoxes() const {return fBoxes;}
113  Bool_t IsSafeVoxel(const Double_t *point, Int_t inode, Double_t minsafe) const;
114  virtual void Print(Option_t *option="") const;
115  void PrintVoxelLimits(const Double_t *point) const;
118  virtual Int_t *GetNextVoxel(const Double_t *point, const Double_t *dir, Int_t &ncheck, TGeoStateInfo &td);
119  virtual void SortCrossedVoxels(const Double_t *point, const Double_t *dir, TGeoStateInfo &td);
120  virtual void Voxelize(Option_t *option="");
121 
122  ClassDef(TGeoVoxelFinder, 4) // voxel finder class
123 };
124 
125 #endif
Bool_t Union(Int_t n1, UChar_t *array1, TGeoStateInfo &td)
make union of older bits with new array printf("Union - one slice\n");
virtual void Voxelize(Option_t *option="")
Voxelize attached volume according to option If the volume is an assembly, make sure the bbox is comp...
const char Option_t
Definition: RtypesCore.h:62
virtual Int_t * GetCheckList(const Double_t *point, Int_t &nelem, TGeoStateInfo &td)
get the list of daughter indices for which point is inside their bbox
virtual void Print(Option_t *option="") const
Print the voxels.
#define BIT(n)
Definition: Rtypes.h:120
Int_t * GetExtraZ(Int_t islice, Bool_t left, Int_t &nextra) const
— Return the list of extra candidates in a given Z slice compared to another (left or right) ...
Bool_t Intersect(Int_t n1, UChar_t *array1, Int_t &nf, Int_t *result)
return the list of nodes corresponding to one array of bits
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
TGeoVoxelFinder & operator=(const TGeoVoxelFinder &)
assignment operator
Int_t * GetExtraY(Int_t islice, Bool_t left, Int_t &nextra) const
— Return the list of extra candidates in a given Y slice compared to another (left or right) ...
virtual void SortCrossedVoxels(const Double_t *point, const Double_t *dir, TGeoStateInfo &td)
get the list in the next voxel crossed by a ray
Bool_t NeedRebuild() const
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:732
Int_t * GetExtraX(Int_t islice, Bool_t left, Int_t &nextra) const
— Return the list of extra candidates in a given X slice compared to another (left or right) ...
virtual Int_t * GetNextVoxel(const Double_t *point, const Double_t *dir, Int_t &ncheck, TGeoStateInfo &td)
get the list of new candidates for the next voxel crossed by current ray printf("### GetNextVoxel\n")...
void SetInvalid(Bool_t flag=kTRUE)
#define ClassDef(name, id)
Definition: Rtypes.h:254
void DaughterToMother(Int_t id, const Double_t *local, Double_t *master) const
convert a point from the local reference system of node id to reference system of mother volume ...
Bool_t IsInvalid() const
Double_t * fBoxes
void SortAll(Option_t *option="")
order bounding boxes along x, y, z
Int_t * GetVoxelCandidates(Int_t i, Int_t j, Int_t k, Int_t &ncheck, TGeoStateInfo &td)
get the list of candidates in voxel (i,j,k) - no check
void SetNeedRebuild(Bool_t flag=kTRUE)
Int_t GetPriority(Int_t iaxis) const
Bool_t TestBit(UInt_t f) const
Definition: TObject.h:173
Bool_t IsSafeVoxel(const Double_t *point, Int_t inode, Double_t minsafe) const
Computes squared distance from POINT to the voxel(s) containing node INODE.
Bool_t GetIndices(const Double_t *point, TGeoStateInfo &td)
Getindices for current slices on x, y, z.
virtual Double_t Efficiency()
— Compute voxelization efficiency.
TGeoVolume * fVolume
Int_t * GetValidExtra(Int_t *list, Int_t &ncheck, TGeoStateInfo &td)
Get extra candidates that are not contained in current check list UChar_t *bits = gGeoManager->GetBit...
double Double_t
Definition: RtypesCore.h:55
virtual Int_t * GetNextCandidates(const Double_t *point, Int_t &ncheck, TGeoStateInfo &td)
Returns list of new candidates in next voxel.
Mother of all ROOT objects.
Definition: TObject.h:58
void BuildVoxelLimits()
build the array of bounding boxes of the nodes inside
Bool_t IntersectAndStore(Int_t n1, UChar_t *array1, TGeoStateInfo &td)
return the list of nodes corresponding to one array of bits
Int_t GetNcandidates(TGeoStateInfo &td) const
virtual ~TGeoVoxelFinder()
Destructor printf("deleting finder of %s\n", fVolume->GetName());.
Double_t * GetBoxes() const
double result[121]
unsigned char UChar_t
Definition: RtypesCore.h:34
virtual void FindOverlaps(Int_t inode) const
create the list of nodes for which the bboxes overlap with inode's bbox
void PrintVoxelLimits(const Double_t *point) const
print the voxel containing point
const Bool_t kTRUE
Definition: Rtypes.h:91