81 memset(fPriority, 0, 3*
sizeof(
Int_t));
90 Fatal(
"TGeoVoxelFinder",
"Null pointer for volume");
163 fNsliceX(vf.fNsliceX),
164 fNsliceY(vf.fNsliceY),
165 fNsliceZ(vf.fNsliceZ),
170 for(
Int_t i=0; i<3; i++) {
196 for(
Int_t i=0; i<3; i++) {
285 for (
id=0;
id<nd;
id++) {
290 for (
Int_t point=0; point<8; point++) {
293 xyz[0] = xyz[1] = pt[0];
294 xyz[2] = xyz[3] = pt[1];
295 xyz[4] = xyz[5] = pt[2];
298 for (
Int_t j=0; j<3; j++) {
299 if (pt[j] < xyz[2*j]) xyz[2*j]=pt[j];
300 if (pt[j] > xyz[2*j+1]) xyz[2*j+1]=pt[j];
304 fBoxes[6*
id+1] = 0.5*(xyz[3]-xyz[2]);
305 fBoxes[6*
id+2] = 0.5*(xyz[5]-xyz[4]);
306 fBoxes[6*
id+3] = 0.5*(xyz[0]+xyz[1]);
307 fBoxes[6*
id+4] = 0.5*(xyz[2]+xyz[3]);
308 fBoxes[6*
id+5] = 0.5*(xyz[4]+xyz[5]);
319 if (!mat) memcpy(master,local,3*
sizeof(
Double_t));
333 Double_t dxyz, minsafe2=minsafe*minsafe;
337 for (i=0; i<3; i++) {
339 if (dxyz>-1
E-6) rsq+=dxyz*dxyz;
360 for (
id=0;
id<
fIbx-1;
id++) {
364 else printf(
"Woops : slice X\n");
366 printf(
"X efficiency : %g\n", effslice);
370 for (
id=0;
id<
fIby-1;
id++) {
374 else printf(
"Woops : slice X\n");
376 printf(
"Y efficiency : %g\n", effslice);
380 for (
id=0;
id<
fIbz-1;
id++) {
384 else printf(
"Woops : slice X\n");
386 printf(
"Z efficiency : %g\n", effslice);
389 printf(
"Total efficiency : %g\n", eff);
399 Double_t xmin1, xmax1, ymin1, ymax1, zmin1, zmax1;
407 xmax = fBoxes[6*inode+3] + fBoxes[6*inode];
408 ymin = fBoxes[6*inode+4] - fBoxes[6*inode+1];
409 ymax = fBoxes[6*inode+4] + fBoxes[6*inode+1];
410 zmin = fBoxes[6*inode+5] - fBoxes[6*inode+2];
411 zmax = fBoxes[6*inode+5] + fBoxes[6*inode+2];
413 for (
Int_t ib=0; ib<nd; ib++) {
414 if (ib == inode)
continue;
415 xmin1 = fBoxes[6*ib+3] - fBoxes[6*ib];
416 xmax1 = fBoxes[6*ib+3] + fBoxes[6*ib];
417 ymin1 = fBoxes[6*ib+4] - fBoxes[6*ib+1];
418 ymax1 = fBoxes[6*ib+4] + fBoxes[6*ib+1];
419 zmin1 = fBoxes[6*ib+5] - fBoxes[6*ib+2];
420 zmax1 = fBoxes[6*ib+5] + fBoxes[6*ib+2];
424 if (ddx1*ddx2 <= 0.)
continue;
427 if (ddx1*ddx2 <= 0.)
continue;
430 if (ddx1*ddx2 <= 0.)
continue;
438 ovlps =
new Int_t[novlp];
439 memcpy(ovlps, otmp, novlp*
sizeof(
Int_t));
499 list = &
fExtraX[fOEx[islice]+2];
518 list = &
fExtraY[fOEy[islice]+2];
537 list = &
fExtraZ[fOEz[islice]+2];
555 for (icand=0; icand<ncheck; icand++) {
556 bitnumber = (
UInt_t)list[icand];
576 for (icand=0; icand<ncheck; icand++) {
577 bitnumber = (
UInt_t)list[icand];
580 byte = (~td.
fVoxBits1[loc]) & array1[loc] & (1<<bit);
597 for (icand=0; icand<ncheck; icand++) {
598 bitnumber = (
UInt_t)list[icand];
601 byte = (~td.
fVoxBits1[loc]) & array1[loc] & array2[loc] & (1<<bit);
641 if (dind[0]<0 || dind[0]>
fIbx-1)
return 0;
654 dforced[0] = dmin[0];
657 if (isXlimit)
return 0;
663 dforced[0] = dmin[0];
666 if (isXlimit)
return 0;
681 if (dind[1]<0 || dind[1]>
fIby-1)
return 0;
695 dforced[1] = dmin[1];
698 if (isYlimit)
return 0;
704 dforced[1] = dmin[1];
707 if (isYlimit)
return 0;
722 if (dind[2]<0 || dind[2]>
fIbz-1)
return 0;
736 dforced[2] = dmin[2];
739 if (isZlimit)
return 0;
745 dforced[2] = dmin[2];
748 if (isZlimit)
return 0;
771 if (dforced[1]>dslice) {
777 if (dforced[2]>dslice) {
786 if (dforced[2]>dslice) {
799 if (dforced[2]>dslice) {
813 dslice = dmin[islice];
814 if (dslice>=maxstep) {
824 Int_t ndd[2] = {0,0};
829 if (isXlimit)
return 0;
836 if ((dslice>dmin[1]) && td.
fVoxInc[1]) {
851 if ((dslice>dmin[2]) && td.
fVoxInc[2]) {
938 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
941 if (isYlimit)
return 0;
948 if ((dslice>dmin[0]) && td.
fVoxInc[0]) {
963 if ((dslice>dmin[2]) && td.
fVoxInc[2]) {
1050 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
1053 if (isZlimit)
return 0;
1060 if ((dslice>dmin[1]) && td.
fVoxInc[1]) {
1075 if ((dslice>dmin[0]) && td.
fVoxInc[0]) {
1162 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
1188 for (
Int_t i=0; i<3; i++) {
1191 td.
fVoxInc[i] = (dir[i]>0)?1:-1;
1248 memset(&nd[0], 0, 3*
sizeof(
Int_t));
1270 if (slicex && slicey) {
1315 if (point[0]<
fXb[0] || point[0]>
fXb[1])
return 0;
1318 if (point[1]<
fYb[0] || point[1]>
fYb[1])
return 0;
1322 if (point[2]<
fZb[0] || point[2]>
fZb[1])
return 0;
1332 Int_t nd[3] = {0,0,0};
1336 if ((im==-1) || (im==
fIbx-1))
return 0;
1339 if (!nd[0])
return 0;
1347 if ((im==-1) || (im==
fIby-1))
return 0;
1350 if (!nd[1])
return 0;
1363 if ((im==-1) || (im==
fIbz-1))
return 0;
1366 if (!nd[2])
return 0;
1368 if (slice1 && slice2) {
1409 Int_t nd[3] = {0,0,0};
1413 if (!nd[0])
return 0;
1420 if (!nd[1])
return 0;
1432 if (!nd[2])
return 0;
1434 if (slice1 && slice2) {
1495 Int_t nbytes = 1+((nd-1)>>3);
1500 for (current_byte=0; current_byte<nbytes; current_byte++) {
1501 byte = array1[current_byte];
1502 if (!byte)
continue;
1503 for (current_bit=0; current_bit<8; current_bit++) {
1504 if (byte & (1<<current_bit)) {
1505 result[nf++] = (current_byte<<3)+current_bit;
1512 if (ibreak)
return kTRUE;
1525 Int_t nbytes = 1+((nd-1)>>3);
1540 for (current_byte=0; current_byte<nbytes; current_byte++) {
1541 byte = array1[current_byte];
1542 icand = current_byte<<3;
1543 if (!byte)
continue;
1544 for (current_bit=0; current_bit<8; current_bit++) {
1545 if (byte & (1<<current_bit)) {
1553 if (ibreak)
return kTRUE;
1567 Int_t nbytes = 1+((nd-1)>>3);
1572 for (current_byte=0; current_byte<nbytes; current_byte++) {
1574 byte = (~td.
fVoxBits1[current_byte]) & array1[current_byte];
1575 if (!byte)
continue;
1576 for (current_bit=0; current_bit<8; current_bit++) {
1577 if (byte & (1<<current_bit)) {
1586 if (ibreak)
return kTRUE;
1600 Int_t nbytes = 1+((nd-1)>>3);
1604 for (current_byte=0; current_byte<nbytes; current_byte++) {
1605 byte = (~td.
fVoxBits1[current_byte]) & (array1[current_byte] & array2[current_byte]);
1606 if (!byte)
continue;
1607 for (current_bit=0; current_bit<8; current_bit++) {
1608 if (byte & (1<<current_bit)) {
1627 Int_t nbytes = 1+((nd-1)>>3);
1631 for (current_byte=0; current_byte<nbytes; current_byte++) {
1632 byte = (~td.
fVoxBits1[current_byte]) & (array1[current_byte] & array2[current_byte] & array3[current_byte]);
1633 if (!byte)
continue;
1634 for (current_bit=0; current_bit<8; current_bit++) {
1635 if (byte & (1<<current_bit)) {
1651 Int_t nbytes = 1+((nd-1)>>3);
1656 for (current_byte=0; current_byte<nbytes; current_byte++) {
1657 byte = array1[current_byte] & array2[current_byte];
1658 if (!byte)
continue;
1659 for (current_bit=0; current_bit<8; current_bit++) {
1660 if (byte & (1<<current_bit)) {
1661 result[nf++] = (current_byte<<3)+current_bit;
1662 if ((nf==n1) || (nf==n2)) {
1668 if (ibreak)
return kTRUE;
1681 Int_t nbytes = 1+((nd-1)>>3);
1687 for (current_byte=0; current_byte<nbytes; current_byte++) {
1688 byte = array1[current_byte] & array2[current_byte];
1689 icand = current_byte<<3;
1691 if (!byte)
continue;
1692 for (current_bit=0; current_bit<8; current_bit++) {
1693 if (byte & (1<<current_bit)) {
1708 Int_t nbytes = 1+((nd-1)>>3);
1713 for (current_byte=0; current_byte<nbytes; current_byte++) {
1714 byte = array1[current_byte] & array2[current_byte] & array3[current_byte];
1715 if (!byte)
continue;
1716 for (current_bit=0; current_bit<8; current_bit++) {
1717 if (byte & (1<<current_bit)) {
1718 result[nf++] = (current_byte<<3)+current_bit;
1719 if ((nf==n1) || (nf==n2) || (nf==n3)) {
1725 if (ibreak)
return kTRUE;
1738 Int_t nbytes = 1+((nd-1)>>3);
1744 for (current_byte=0; current_byte<nbytes; current_byte++) {
1745 byte = array1[current_byte] & array2[current_byte] & array3[current_byte];
1746 icand = current_byte<<3;
1748 if (!byte)
continue;
1749 for (current_bit=0; current_bit<8; current_bit++) {
1750 if (byte & (1<<current_bit)) {
1764 Int_t nmaxslices = 2*nd+1;
1774 if ((xmin>=xmax) || (ymin>=ymax) || (zmin>=zmax)) {
1781 for (
id=0;
id<nd;
id++) {
1784 boundaries[2*
id+1] = fBoxes[6*
id+3]+fBoxes[6*
id];
1786 boundaries[2*
id+2*nd] = fBoxes[6*
id+4]-fBoxes[6*
id+1];
1787 boundaries[2*
id+2*nd+1] = fBoxes[6*
id+4]+fBoxes[6*
id+1];
1789 boundaries[2*
id+4*nd] = fBoxes[6*
id+5]-fBoxes[6*
id+2];
1790 boundaries[2*
id+4*nd+1] = fBoxes[6*
id+5]+fBoxes[6*
id+2];
1802 Int_t nleft, nright;
1805 Double_t xxmin, xxmax, xbmin, xbmax, ddx1, ddx2;
1814 for (
id=0;
id<2*nd;
id++) {
1815 if (!ib) {temp[ib++] = boundaries[index[
id]];
continue;}
1816 if (
TMath::Abs(temp[ib-1]-boundaries[index[
id]])>1
E-10)
1817 temp[ib++] = boundaries[index[
id]];
1822 delete [] boundaries;
1827 delete [] extra_left;
1828 delete [] extra_right;
1834 if (((temp[0]-xmin)<1
E-10) && ((temp[1]-xmax)>-1
E-10)) {
1862 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
1873 for (
id=0;
id<
fNox;
id++) {
1877 extra[indextra] = extra[indextra+1] = 0;
1879 bits = &ind[current];
1882 for (
Int_t ic=0; ic<nd; ic++) {
1884 xbmax = fBoxes[6*ic+3]+fBoxes[6*ic];
1886 if (ddx1>-1
E-10)
continue;
1888 if (ddx2<1
E-10)
continue;
1895 bits[loc] |= 1<<bit;
1900 if ((
id==0) || (ddx1>-1
E-10)) {
1901 extra_left[nleft++] = ic;
1904 if ((
id==(
fNoz-1)) || (ddx2<1
E-10)) {
1905 extra_right[nright++] = ic;
1909 if (
fNsliceX[
id]>0) current += nperslice;
1911 extra[indextra] = nleft;
1912 extra[indextra+1] = nright;
1913 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
1914 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
1915 indextra += 2+nleft+nright;
1923 if (indextra>nmaxslices*4)
printf(
"Woops!!!\n");
1932 for (
id=0;
id<2*nd;
id++) {
1933 if (!ib) {temp[ib++] = boundaries[2*nd+index[
id]];
continue;}
1934 if (
TMath::Abs(temp[ib-1]-boundaries[2*nd+index[
id]])>1
E-10)
1935 temp[ib++]=boundaries[2*nd+index[
id]];
1940 delete [] boundaries;
1945 delete [] extra_left;
1946 delete [] extra_right;
1952 if (((temp[0]-ymin)<1
E-10) && ((temp[1]-ymax)>-1
E-10)) {
1982 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
1993 for (
id=0;
id<
fNoy;
id++) {
1997 extra[indextra] = extra[indextra+1] = 0;
1999 bits = &ind[current];
2002 for (
Int_t ic=0; ic<nd; ic++) {
2004 xbmax = fBoxes[6*ic+4]+fBoxes[6*ic+1];
2006 if (ddx1>-1
E-10)
continue;
2008 if (ddx2<1
E-10)
continue;
2015 bits[loc] |= 1<<bit;
2020 if ((
id==0) || (ddx1>-1
E-10)) {
2021 extra_left[nleft++] = ic;
2024 if ((
id==(
fNoz-1)) || (ddx2<1
E-10)) {
2025 extra_right[nright++] = ic;
2029 if (
fNsliceY[
id]>0) current += nperslice;
2031 extra[indextra] = nleft;
2032 extra[indextra+1] = nright;
2033 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
2034 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
2035 indextra += 2+nleft+nright;
2043 if (indextra>nmaxslices*4)
printf(
"Woops!!!\n");
2052 for (
id=0;
id<2*nd;
id++) {
2053 if (!ib) {temp[ib++] = boundaries[4*nd+index[
id]];
continue;}
2054 if ((
TMath::Abs(temp[ib-1]-boundaries[4*nd+index[
id]]))>1
E-10)
2055 temp[ib++]=boundaries[4*nd+index[
id]];
2060 delete [] boundaries;
2065 delete [] extra_left;
2066 delete [] extra_right;
2072 if (((temp[0]-zmin)<1
E-10) && ((temp[1]-zmax)>-1
E-10)) {
2102 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
2113 for (
id=0;
id<
fNoz;
id++) {
2117 extra[indextra] = extra[indextra+1] = 0;
2119 bits = &ind[current];
2122 for (
Int_t ic=0; ic<nd; ic++) {
2124 xbmax = fBoxes[6*ic+5]+fBoxes[6*ic+2];
2126 if (ddx1>-1
E-10)
continue;
2128 if (ddx2<1
E-10)
continue;
2135 bits[loc] |= 1<<bit;
2140 if ((
id==0) || (ddx1>-1
E-10)) {
2141 extra_left[nleft++] = ic;
2144 if ((
id==(fNoz-1)) || (ddx2<1
E-10)) {
2145 extra_right[nright++] = ic;
2149 if (
fNsliceZ[
id]>0) current += nperslice;
2151 extra[indextra] = nleft;
2152 extra[indextra+1] = nright;
2153 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
2154 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
2155 indextra += 2+nleft+nright;
2163 if (indextra>nmaxslices*4)
printf(
"Woops!!!\n");
2167 delete [] boundaries;
2172 delete [] extra_left;
2173 delete [] extra_right;
2177 if (nd>1)
Error(
"SortAll",
"Volume %s: Cannot make slices on any axis",
fVolume->
GetName());
2202 for (
id=0;
id<
fIbx;
id++) {
2204 if (
id == (fIbx-1))
break;
2208 for (i=0; i<nbytes; i++) {
2210 for (bit=0; bit<8; bit++) {
2211 if (byte & (1<<bit))
printf(
" %i ", 8*i+bit);
2217 printf(
" extra_about_left = %i\n", nextra);
2219 printf(
" extra_about_right = %i\n", nextra);
2223 for (
id=0;
id<nd;
id++)
printf(
" %i ",
id);
2229 for (
id=0;
id<
fIby;
id++) {
2231 if (
id == (fIby-1))
break;
2235 for (i=0; i<nbytes; i++) {
2237 for (bit=0; bit<8; bit++) {
2238 if (byte & (1<<bit))
printf(
" %i ", 8*i+bit);
2243 printf(
" extra_about_left = %i\n", nextra);
2245 printf(
" extra_about_right = %i\n", nextra);
2249 for (
id=0;
id<nd;
id++)
printf(
" %i ",
id);
2256 for (
id=0;
id<
fIbz;
id++) {
2258 if (
id == (fIbz-1))
break;
2262 for (i=0; i<nbytes; i++) {
2264 for (bit=0; bit<8; bit++) {
2265 if (byte & (1<<bit))
printf(
" %i ", 8*i+bit);
2271 printf(
" extra_about_left = %i\n", nextra);
2273 printf(
" extra_about_right = %i\n", nextra);
2277 for (
id=0;
id<nd;
id++)
printf(
" %i ",
id);
2296 if ((im==-1) || (im==
fIbx-1)) {
2297 printf(
"Voxel X limits: OUT\n");
2304 if ((im==-1) || (im==
fIby-1)) {
2305 printf(
"Voxel Y limits: OUT\n");
2312 if ((im==-1) || (im==
fIbz-1)) {
2313 printf(
"Voxel Z limits: OUT\n");
2328 for (
Int_t i=0; i<nd; i++) {
2339 void TGeoVoxelFinder::Streamer(
TBuffer &R__b)
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
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...
TGeoVolume * GetVolume() const
void SetCylVoxels(Bool_t flag=kTRUE)
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.
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
Buffer base class used for serializing objects.
Short_t Min(Short_t a, Short_t b)
virtual Double_t GetDY() const
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) ...
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
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
virtual Double_t GetDZ() const
Int_t GetNdaughters() const
static Bool_t IsSameWithinTolerance(Double_t a, Double_t b)
Check if two numbers differ with less than a tolerance.
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")...
static Double_t Tolerance()
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
void SetInvalid(Bool_t flag=kTRUE)
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 ...
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
virtual TGeoMatrix * GetMatrix() const =0
TObject & operator=(const TObject &rhs)
TObject assignment operator.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual const Double_t * GetOrigin() const
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
virtual Double_t GetDX() const
void SetNeedRebuild(Bool_t flag=kTRUE)
ClassImp(TGeoVoxelFinder) TGeoVoxelFinder
Default constructor.
void SetBoxPoints(Double_t *points) const
Fill box vertices to an array.
virtual Bool_t IsAssembly() const
Returns true if the volume is an assembly or a scaled assembly.
virtual void LocalToMaster(const Double_t *local, Double_t *master) const
convert a point by multiplying its column vector (x, y, z, 1) to matrix inverse
virtual const char * GetName() const
Returns name of object.
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 void ReadFastArray(Bool_t *b, Int_t n)=0
TGeoNode * GetNode(const char *name) const
get the pointer to a daughter node
virtual Double_t Efficiency()
— Compute voxelization efficiency.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
Bool_t intersect(const TBBox &a, const TBBox &b)
TGeoShape * GetShape() const
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...
R__EXTERN TGeoManager * gGeoManager
virtual Int_t * GetNextCandidates(const Double_t *point, Int_t &ncheck, TGeoStateInfo &td)
Returns list of new candidates in next voxel.
ClassImp(TMCParticle) void TMCParticle printf(": p=(%7.3f,%7.3f,%9.3f) ;", fPx, fPy, fPz)
static RooMathCoreReg dummy
virtual void ComputeBBox()=0
Mother of all ROOT objects.
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());.
void FindOverlaps() const
loop all nodes marked as overlaps and find overlaping brothers
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
Long64_t LocMin(Long64_t n, const T *a)
Long64_t BinarySearch(Long64_t n, const T *array, T value)
void SetOverlaps(Int_t *ovlp, Int_t novlp)
set the list of overlaps for this node (ovlp must be created with operator new)
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0