82 memset(fPriority, 0, 3*
sizeof(
Int_t));
91 Fatal(
"TGeoVoxelFinder",
"Null pointer for volume");
164 fNsliceX(vf.fNsliceX),
165 fNsliceY(vf.fNsliceY),
166 fNsliceZ(vf.fNsliceZ),
171 for(
Int_t i=0; i<3; i++) {
197 for(
Int_t i=0; i<3; i++) {
286 for (
id=0;
id<nd;
id++) {
291 for (
Int_t point=0; point<8; point++) {
294 xyz[0] = xyz[1] = pt[0];
295 xyz[2] = xyz[3] = pt[1];
296 xyz[4] = xyz[5] = pt[2];
299 for (
Int_t j=0; j<3; j++) {
300 if (pt[j] < xyz[2*j]) xyz[2*j]=pt[j];
301 if (pt[j] > xyz[2*j+1]) xyz[2*j+1]=pt[j];
305 fBoxes[6*
id+1] = 0.5*(xyz[3]-xyz[2]);
306 fBoxes[6*
id+2] = 0.5*(xyz[5]-xyz[4]);
307 fBoxes[6*
id+3] = 0.5*(xyz[0]+xyz[1]);
308 fBoxes[6*
id+4] = 0.5*(xyz[2]+xyz[3]);
309 fBoxes[6*
id+5] = 0.5*(xyz[4]+xyz[5]);
320 if (!mat) memcpy(master,local,3*
sizeof(
Double_t));
334 Double_t dxyz, minsafe2=minsafe*minsafe;
338 for (i=0; i<3; i++) {
340 if (dxyz>-1
E-6) rsq+=dxyz*dxyz;
361 for (
id=0;
id<
fIbx-1;
id++) {
365 else printf(
"Woops : slice X\n");
367 printf(
"X efficiency : %g\n", effslice);
371 for (
id=0;
id<
fIby-1;
id++) {
375 else printf(
"Woops : slice X\n");
377 printf(
"Y efficiency : %g\n", effslice);
381 for (
id=0;
id<
fIbz-1;
id++) {
385 else printf(
"Woops : slice X\n");
387 printf(
"Z efficiency : %g\n", effslice);
390 printf(
"Total efficiency : %g\n", eff);
400 Double_t xmin1, xmax1, ymin1, ymax1, zmin1, zmax1;
408 xmax = fBoxes[6*inode+3] + fBoxes[6*inode];
409 ymin = fBoxes[6*inode+4] - fBoxes[6*inode+1];
410 ymax = fBoxes[6*inode+4] + fBoxes[6*inode+1];
411 zmin = fBoxes[6*inode+5] - fBoxes[6*inode+2];
412 zmax = fBoxes[6*inode+5] + fBoxes[6*inode+2];
414 for (
Int_t ib=0; ib<nd; ib++) {
415 if (ib == inode)
continue;
416 xmin1 = fBoxes[6*ib+3] - fBoxes[6*ib];
417 xmax1 = fBoxes[6*ib+3] + fBoxes[6*ib];
418 ymin1 = fBoxes[6*ib+4] - fBoxes[6*ib+1];
419 ymax1 = fBoxes[6*ib+4] + fBoxes[6*ib+1];
420 zmin1 = fBoxes[6*ib+5] - fBoxes[6*ib+2];
421 zmax1 = fBoxes[6*ib+5] + fBoxes[6*ib+2];
425 if (ddx1*ddx2 <= 0.)
continue;
428 if (ddx1*ddx2 <= 0.)
continue;
431 if (ddx1*ddx2 <= 0.)
continue;
439 ovlps =
new Int_t[novlp];
440 memcpy(ovlps, otmp, novlp*
sizeof(
Int_t));
500 list = &
fExtraX[fOEx[islice]+2];
519 list = &
fExtraY[fOEy[islice]+2];
538 list = &
fExtraZ[fOEz[islice]+2];
556 for (icand=0; icand<ncheck; icand++) {
557 bitnumber = (
UInt_t)list[icand];
577 for (icand=0; icand<ncheck; icand++) {
578 bitnumber = (
UInt_t)list[icand];
581 byte = (~td.
fVoxBits1[loc]) & array1[loc] & (1<<bit);
598 for (icand=0; icand<ncheck; icand++) {
599 bitnumber = (
UInt_t)list[icand];
602 byte = (~td.
fVoxBits1[loc]) & array1[loc] & array2[loc] & (1<<bit);
642 if (dind[0]<0 || dind[0]>
fIbx-1)
return 0;
655 dforced[0] = dmin[0];
658 if (isXlimit)
return 0;
664 dforced[0] = dmin[0];
667 if (isXlimit)
return 0;
682 if (dind[1]<0 || dind[1]>
fIby-1)
return 0;
696 dforced[1] = dmin[1];
699 if (isYlimit)
return 0;
705 dforced[1] = dmin[1];
708 if (isYlimit)
return 0;
723 if (dind[2]<0 || dind[2]>
fIbz-1)
return 0;
737 dforced[2] = dmin[2];
740 if (isZlimit)
return 0;
746 dforced[2] = dmin[2];
749 if (isZlimit)
return 0;
772 if (dforced[1]>dslice) {
778 if (dforced[2]>dslice) {
787 if (dforced[2]>dslice) {
800 if (dforced[2]>dslice) {
814 dslice = dmin[islice];
815 if (dslice>=maxstep) {
825 Int_t ndd[2] = {0,0};
830 if (isXlimit)
return 0;
837 if ((dslice>dmin[1]) && td.
fVoxInc[1]) {
852 if ((dslice>dmin[2]) && td.
fVoxInc[2]) {
939 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
942 if (isYlimit)
return 0;
949 if ((dslice>dmin[0]) && td.
fVoxInc[0]) {
964 if ((dslice>dmin[2]) && td.
fVoxInc[2]) {
1051 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
1054 if (isZlimit)
return 0;
1061 if ((dslice>dmin[1]) && td.
fVoxInc[1]) {
1076 if ((dslice>dmin[0]) && td.
fVoxInc[0]) {
1163 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
1189 for (
Int_t i=0; i<3; i++) {
1192 td.
fVoxInc[i] = (dir[i]>0)?1:-1;
1249 memset(&nd[0], 0, 3*
sizeof(
Int_t));
1271 if (slicex && slicey) {
1316 if (point[0]<
fXb[0] || point[0]>
fXb[1])
return 0;
1319 if (point[1]<
fYb[0] || point[1]>
fYb[1])
return 0;
1323 if (point[2]<
fZb[0] || point[2]>
fZb[1])
return 0;
1333 Int_t nd[3] = {0,0,0};
1337 if ((im==-1) || (im==
fIbx-1))
return 0;
1340 if (!nd[0])
return 0;
1348 if ((im==-1) || (im==
fIby-1))
return 0;
1351 if (!nd[1])
return 0;
1364 if ((im==-1) || (im==
fIbz-1))
return 0;
1367 if (!nd[2])
return 0;
1369 if (slice1 && slice2) {
1410 Int_t nd[3] = {0,0,0};
1414 if (!nd[0])
return 0;
1421 if (!nd[1])
return 0;
1433 if (!nd[2])
return 0;
1435 if (slice1 && slice2) {
1496 Int_t nbytes = 1+((nd-1)>>3);
1501 for (current_byte=0; current_byte<nbytes; current_byte++) {
1502 byte = array1[current_byte];
1503 if (!byte)
continue;
1504 for (current_bit=0; current_bit<8; current_bit++) {
1505 if (byte & (1<<current_bit)) {
1506 result[nf++] = (current_byte<<3)+current_bit;
1513 if (ibreak)
return kTRUE;
1526 Int_t nbytes = 1+((nd-1)>>3);
1541 for (current_byte=0; current_byte<nbytes; current_byte++) {
1542 byte = array1[current_byte];
1543 icand = current_byte<<3;
1544 if (!byte)
continue;
1545 for (current_bit=0; current_bit<8; current_bit++) {
1546 if (byte & (1<<current_bit)) {
1554 if (ibreak)
return kTRUE;
1568 Int_t nbytes = 1+((nd-1)>>3);
1573 for (current_byte=0; current_byte<nbytes; current_byte++) {
1575 byte = (~td.
fVoxBits1[current_byte]) & array1[current_byte];
1576 if (!byte)
continue;
1577 for (current_bit=0; current_bit<8; current_bit++) {
1578 if (byte & (1<<current_bit)) {
1587 if (ibreak)
return kTRUE;
1601 Int_t nbytes = 1+((nd-1)>>3);
1605 for (current_byte=0; current_byte<nbytes; current_byte++) {
1606 byte = (~td.
fVoxBits1[current_byte]) & (array1[current_byte] & array2[current_byte]);
1607 if (!byte)
continue;
1608 for (current_bit=0; current_bit<8; current_bit++) {
1609 if (byte & (1<<current_bit)) {
1628 Int_t nbytes = 1+((nd-1)>>3);
1632 for (current_byte=0; current_byte<nbytes; current_byte++) {
1633 byte = (~td.
fVoxBits1[current_byte]) & (array1[current_byte] & array2[current_byte] & array3[current_byte]);
1634 if (!byte)
continue;
1635 for (current_bit=0; current_bit<8; current_bit++) {
1636 if (byte & (1<<current_bit)) {
1652 Int_t nbytes = 1+((nd-1)>>3);
1657 for (current_byte=0; current_byte<nbytes; current_byte++) {
1658 byte = array1[current_byte] & array2[current_byte];
1659 if (!byte)
continue;
1660 for (current_bit=0; current_bit<8; current_bit++) {
1661 if (byte & (1<<current_bit)) {
1662 result[nf++] = (current_byte<<3)+current_bit;
1663 if ((nf==n1) || (nf==n2)) {
1669 if (ibreak)
return kTRUE;
1682 Int_t nbytes = 1+((nd-1)>>3);
1688 for (current_byte=0; current_byte<nbytes; current_byte++) {
1689 byte = array1[current_byte] & array2[current_byte];
1690 icand = current_byte<<3;
1692 if (!byte)
continue;
1693 for (current_bit=0; current_bit<8; current_bit++) {
1694 if (byte & (1<<current_bit)) {
1709 Int_t nbytes = 1+((nd-1)>>3);
1714 for (current_byte=0; current_byte<nbytes; current_byte++) {
1715 byte = array1[current_byte] & array2[current_byte] & array3[current_byte];
1716 if (!byte)
continue;
1717 for (current_bit=0; current_bit<8; current_bit++) {
1718 if (byte & (1<<current_bit)) {
1719 result[nf++] = (current_byte<<3)+current_bit;
1720 if ((nf==n1) || (nf==n2) || (nf==n3)) {
1726 if (ibreak)
return kTRUE;
1739 Int_t nbytes = 1+((nd-1)>>3);
1745 for (current_byte=0; current_byte<nbytes; current_byte++) {
1746 byte = array1[current_byte] & array2[current_byte] & array3[current_byte];
1747 icand = current_byte<<3;
1749 if (!byte)
continue;
1750 for (current_bit=0; current_bit<8; current_bit++) {
1751 if (byte & (1<<current_bit)) {
1765 Int_t nmaxslices = 2*nd+1;
1775 if ((xmin>=xmax) || (ymin>=ymax) || (zmin>=zmax)) {
1782 for (
id=0;
id<nd;
id++) {
1785 boundaries[2*
id+1] = fBoxes[6*
id+3]+fBoxes[6*
id];
1787 boundaries[2*
id+2*nd] = fBoxes[6*
id+4]-fBoxes[6*
id+1];
1788 boundaries[2*
id+2*nd+1] = fBoxes[6*
id+4]+fBoxes[6*
id+1];
1790 boundaries[2*
id+4*nd] = fBoxes[6*
id+5]-fBoxes[6*
id+2];
1791 boundaries[2*
id+4*nd+1] = fBoxes[6*
id+5]+fBoxes[6*
id+2];
1803 Int_t nleft, nright;
1806 Double_t xxmin, xxmax, xbmin, xbmax, ddx1, ddx2;
1815 for (
id=0;
id<2*nd;
id++) {
1816 if (!ib) {temp[ib++] = boundaries[index[
id]];
continue;}
1817 if (
TMath::Abs(temp[ib-1]-boundaries[index[
id]])>1
E-10)
1818 temp[ib++] = boundaries[index[
id]];
1823 delete [] boundaries;
1828 delete [] extra_left;
1829 delete [] extra_right;
1835 if (((temp[0]-xmin)<1
E-10) && ((temp[1]-xmax)>-1
E-10)) {
1863 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
1874 for (
id=0;
id<
fNox;
id++) {
1878 extra[indextra] = extra[indextra+1] = 0;
1883 for (
Int_t ic=0; ic<nd; ic++) {
1885 xbmax = fBoxes[6*ic+3]+fBoxes[6*ic];
1887 if (ddx1>-1
E-10)
continue;
1889 if (ddx2<1
E-10)
continue;
1896 bits[loc] |= 1<<bit;
1901 if ((
id==0) || (ddx1>-1
E-10)) {
1902 extra_left[nleft++] = ic;
1905 if ((
id==(
fNoz-1)) || (ddx2<1
E-10)) {
1906 extra_right[nright++] = ic;
1910 if (
fNsliceX[
id]>0) current += nperslice;
1912 extra[indextra] = nleft;
1913 extra[indextra+1] = nright;
1914 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
1915 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
1916 indextra += 2+nleft+nright;
1924 if (indextra>nmaxslices*4)
printf(
"Woops!!!\n");
1933 for (
id=0;
id<2*nd;
id++) {
1934 if (!ib) {temp[ib++] = boundaries[2*nd+index[
id]];
continue;}
1935 if (
TMath::Abs(temp[ib-1]-boundaries[2*nd+index[
id]])>1
E-10)
1936 temp[ib++]=boundaries[2*nd+index[
id]];
1941 delete [] boundaries;
1946 delete [] extra_left;
1947 delete [] extra_right;
1953 if (((temp[0]-ymin)<1
E-10) && ((temp[1]-ymax)>-1
E-10)) {
1983 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
1994 for (
id=0;
id<
fNoy;
id++) {
1998 extra[indextra] = extra[indextra+1] = 0;
2003 for (
Int_t ic=0; ic<nd; ic++) {
2005 xbmax = fBoxes[6*ic+4]+fBoxes[6*ic+1];
2007 if (ddx1>-1
E-10)
continue;
2009 if (ddx2<1
E-10)
continue;
2016 bits[loc] |= 1<<bit;
2021 if ((
id==0) || (ddx1>-1
E-10)) {
2022 extra_left[nleft++] = ic;
2025 if ((
id==(
fNoz-1)) || (ddx2<1
E-10)) {
2026 extra_right[nright++] = ic;
2030 if (
fNsliceY[
id]>0) current += nperslice;
2032 extra[indextra] = nleft;
2033 extra[indextra+1] = nright;
2034 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
2035 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
2036 indextra += 2+nleft+nright;
2044 if (indextra>nmaxslices*4)
printf(
"Woops!!!\n");
2053 for (
id=0;
id<2*nd;
id++) {
2054 if (!ib) {temp[ib++] = boundaries[4*nd+index[
id]];
continue;}
2055 if ((
TMath::Abs(temp[ib-1]-boundaries[4*nd+index[
id]]))>1
E-10)
2056 temp[ib++]=boundaries[4*nd+index[
id]];
2061 delete [] boundaries;
2066 delete [] extra_left;
2067 delete [] extra_right;
2073 if (((temp[0]-zmin)<1
E-10) && ((temp[1]-zmax)>-1
E-10)) {
2103 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
2114 for (
id=0;
id<
fNoz;
id++) {
2118 extra[indextra] = extra[indextra+1] = 0;
2123 for (
Int_t ic=0; ic<nd; ic++) {
2125 xbmax = fBoxes[6*ic+5]+fBoxes[6*ic+2];
2127 if (ddx1>-1
E-10)
continue;
2129 if (ddx2<1
E-10)
continue;
2136 bits[loc] |= 1<<bit;
2141 if ((
id==0) || (ddx1>-1
E-10)) {
2142 extra_left[nleft++] = ic;
2145 if ((
id==(fNoz-1)) || (ddx2<1
E-10)) {
2146 extra_right[nright++] = ic;
2150 if (
fNsliceZ[
id]>0) current += nperslice;
2152 extra[indextra] = nleft;
2153 extra[indextra+1] = nright;
2154 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
2155 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
2156 indextra += 2+nleft+nright;
2164 if (indextra>nmaxslices*4)
printf(
"Woops!!!\n");
2168 delete [] boundaries;
2173 delete [] extra_left;
2174 delete [] extra_right;
2178 if (nd>1)
Error(
"SortAll",
"Volume %s: Cannot make slices on any axis",
fVolume->
GetName());
2203 for (
id=0;
id<
fIbx;
id++) {
2205 if (
id == (fIbx-1))
break;
2209 for (i=0; i<nbytes; i++) {
2211 for (bit=0; bit<8; bit++) {
2212 if (byte & (1<<bit))
printf(
" %i ", 8*i+bit);
2218 printf(
" extra_about_left = %i\n", nextra);
2220 printf(
" extra_about_right = %i\n", nextra);
2224 for (
id=0;
id<nd;
id++)
printf(
" %i ",
id);
2230 for (
id=0;
id<
fIby;
id++) {
2232 if (
id == (fIby-1))
break;
2236 for (i=0; i<nbytes; i++) {
2238 for (bit=0; bit<8; bit++) {
2239 if (byte & (1<<bit))
printf(
" %i ", 8*i+bit);
2244 printf(
" extra_about_left = %i\n", nextra);
2246 printf(
" extra_about_right = %i\n", nextra);
2250 for (
id=0;
id<nd;
id++)
printf(
" %i ",
id);
2257 for (
id=0;
id<
fIbz;
id++) {
2259 if (
id == (fIbz-1))
break;
2263 for (i=0; i<nbytes; i++) {
2265 for (bit=0; bit<8; bit++) {
2266 if (byte & (1<<bit))
printf(
" %i ", 8*i+bit);
2272 printf(
" extra_about_left = %i\n", nextra);
2274 printf(
" extra_about_right = %i\n", nextra);
2278 for (
id=0;
id<nd;
id++)
printf(
" %i ",
id);
2297 if ((im==-1) || (im==
fIbx-1)) {
2298 printf(
"Voxel X limits: OUT\n");
2305 if ((im==-1) || (im==
fIby-1)) {
2306 printf(
"Voxel Y limits: OUT\n");
2313 if ((im==-1) || (im==
fIbz-1)) {
2314 printf(
"Voxel Z limits: OUT\n");
2329 for (
Int_t i=0; i<nd; i++) {
2340 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