76 memset(fPriority, 0, 3*
sizeof(
Int_t));
85 Fatal(
"TGeoVoxelFinder",
"Null pointer for volume");
165 for(
Int_t i=0; i<3; i++) {
191 for(
Int_t i=0; i<3; i++) {
279 for (
id=0;
id<nd;
id++) {
284 for (
Int_t point=0; point<8; point++) {
287 xyz[0] = xyz[1] = pt[0];
288 xyz[2] = xyz[3] = pt[1];
289 xyz[4] = xyz[5] = pt[2];
292 for (
Int_t j=0; j<3; j++) {
293 if (pt[j] < xyz[2*j]) xyz[2*j]=pt[j];
294 if (pt[j] > xyz[2*j+1]) xyz[2*j+1]=pt[j];
298 fBoxes[6*
id+1] = 0.5*(xyz[3]-xyz[2]);
299 fBoxes[6*
id+2] = 0.5*(xyz[5]-xyz[4]);
300 fBoxes[6*
id+3] = 0.5*(xyz[0]+xyz[1]);
301 fBoxes[6*
id+4] = 0.5*(xyz[2]+xyz[3]);
302 fBoxes[6*
id+5] = 0.5*(xyz[4]+xyz[5]);
313 if (!mat) memcpy(master,local,3*
sizeof(
Double_t));
327 Double_t dxyz, minsafe2=minsafe*minsafe;
331 for (i=0; i<3; i++) {
333 if (dxyz>-1
E-6) rsq+=dxyz*dxyz;
354 for (
id=0;
id<
fIbx-1;
id++) {
358 else printf(
"Woops : slice X\n");
360 printf(
"X efficiency : %g\n", effslice);
364 for (
id=0;
id<
fIby-1;
id++) {
368 else printf(
"Woops : slice X\n");
370 printf(
"Y efficiency : %g\n", effslice);
374 for (
id=0;
id<
fIbz-1;
id++) {
378 else printf(
"Woops : slice X\n");
380 printf(
"Z efficiency : %g\n", effslice);
383 printf(
"Total efficiency : %g\n", eff);
393 Double_t xmin1, xmax1, ymin1, ymax1, zmin1, zmax1;
401 xmax = fBoxes[6*inode+3] + fBoxes[6*inode];
402 ymin = fBoxes[6*inode+4] - fBoxes[6*inode+1];
403 ymax = fBoxes[6*inode+4] + fBoxes[6*inode+1];
404 zmin = fBoxes[6*inode+5] - fBoxes[6*inode+2];
405 zmax = fBoxes[6*inode+5] + fBoxes[6*inode+2];
407 for (
Int_t ib=0; ib<nd; ib++) {
408 if (ib == inode)
continue;
409 xmin1 = fBoxes[6*ib+3] - fBoxes[6*ib];
410 xmax1 = fBoxes[6*ib+3] + fBoxes[6*ib];
411 ymin1 = fBoxes[6*ib+4] - fBoxes[6*ib+1];
412 ymax1 = fBoxes[6*ib+4] + fBoxes[6*ib+1];
413 zmin1 = fBoxes[6*ib+5] - fBoxes[6*ib+2];
414 zmax1 = fBoxes[6*ib+5] + fBoxes[6*ib+2];
418 if (ddx1*ddx2 <= 0.)
continue;
421 if (ddx1*ddx2 <= 0.)
continue;
424 if (ddx1*ddx2 <= 0.)
continue;
432 ovlps =
new Int_t[novlp];
433 memcpy(ovlps, otmp, novlp*
sizeof(
Int_t));
493 list = &
fExtraX[fOEx[islice]+2];
512 list = &
fExtraY[fOEy[islice]+2];
531 list = &
fExtraZ[fOEz[islice]+2];
548 for (icand=0; icand<ncheck; icand++) {
549 bitnumber = (
UInt_t)list[icand];
568 for (icand=0; icand<ncheck; icand++) {
569 bitnumber = (
UInt_t)list[icand];
572 byte = (~td.
fVoxBits1[loc]) & array1[loc] & (1<<bit);
588 for (icand=0; icand<ncheck; icand++) {
589 bitnumber = (
UInt_t)list[icand];
592 byte = (~td.
fVoxBits1[loc]) & array1[loc] & array2[loc] & (1<<bit);
632 if (dind[0]<0 || dind[0]>
fIbx-1)
return 0;
645 dforced[0] = dmin[0];
648 if (isXlimit)
return 0;
654 dforced[0] = dmin[0];
657 if (isXlimit)
return 0;
672 if (dind[1]<0 || dind[1]>
fIby-1)
return 0;
686 dforced[1] = dmin[1];
689 if (isYlimit)
return 0;
695 dforced[1] = dmin[1];
698 if (isYlimit)
return 0;
713 if (dind[2]<0 || dind[2]>
fIbz-1)
return 0;
727 dforced[2] = dmin[2];
730 if (isZlimit)
return 0;
736 dforced[2] = dmin[2];
739 if (isZlimit)
return 0;
762 if (dforced[1]>dslice) {
768 if (dforced[2]>dslice) {
777 if (dforced[2]>dslice) {
790 if (dforced[2]>dslice) {
804 dslice = dmin[islice];
805 if (dslice>=maxstep) {
815 Int_t ndd[2] = {0,0};
820 if (isXlimit)
return 0;
827 if ((dslice>dmin[1]) && td.
fVoxInc[1]) {
842 if ((dslice>dmin[2]) && td.
fVoxInc[2]) {
929 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
932 if (isYlimit)
return 0;
939 if ((dslice>dmin[0]) && td.
fVoxInc[0]) {
954 if ((dslice>dmin[2]) && td.
fVoxInc[2]) {
1041 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
1044 if (isZlimit)
return 0;
1051 if ((dslice>dmin[1]) && td.
fVoxInc[1]) {
1066 if ((dslice>dmin[0]) && td.
fVoxInc[0]) {
1153 return GetValidExtra(ndd[0], slice1, ndd[1], slice2, new_list, ncheck, td);
1179 for (
Int_t i=0; i<3; i++) {
1182 td.
fVoxInc[i] = (dir[i]>0)?1:-1;
1239 memset(&nd[0], 0, 3*
sizeof(
Int_t));
1261 if (slicex && slicey) {
1306 if (point[0]<
fXb[0] || point[0]>
fXb[1])
return 0;
1309 if (point[1]<
fYb[0] || point[1]>
fYb[1])
return 0;
1313 if (point[2]<
fZb[0] || point[2]>
fZb[1])
return 0;
1323 Int_t nd[3] = {0,0,0};
1327 if ((im==-1) || (im==
fIbx-1))
return 0;
1330 if (!nd[0])
return 0;
1338 if ((im==-1) || (im==
fIby-1))
return 0;
1341 if (!nd[1])
return 0;
1354 if ((im==-1) || (im==
fIbz-1))
return 0;
1357 if (!nd[2])
return 0;
1359 if (slice1 && slice2) {
1400 Int_t nd[3] = {0,0,0};
1404 if (!nd[0])
return 0;
1411 if (!nd[1])
return 0;
1423 if (!nd[2])
return 0;
1425 if (slice1 && slice2) {
1486 Int_t nbytes = 1+((nd-1)>>3);
1491 for (current_byte=0; current_byte<nbytes; current_byte++) {
1492 byte = array1[current_byte];
1493 if (!byte)
continue;
1494 for (current_bit=0; current_bit<8; current_bit++) {
1495 if (byte & (1<<current_bit)) {
1496 result[nf++] = (current_byte<<3)+current_bit;
1503 if (ibreak)
return kTRUE;
1516 Int_t nbytes = 1+((nd-1)>>3);
1531 for (current_byte=0; current_byte<nbytes; current_byte++) {
1532 byte = array1[current_byte];
1533 icand = current_byte<<3;
1534 if (!byte)
continue;
1535 for (current_bit=0; current_bit<8; current_bit++) {
1536 if (byte & (1<<current_bit)) {
1544 if (ibreak)
return kTRUE;
1558 Int_t nbytes = 1+((nd-1)>>3);
1563 for (current_byte=0; current_byte<nbytes; current_byte++) {
1565 byte = (~td.
fVoxBits1[current_byte]) & array1[current_byte];
1566 if (!byte)
continue;
1567 for (current_bit=0; current_bit<8; current_bit++) {
1568 if (byte & (1<<current_bit)) {
1577 if (ibreak)
return kTRUE;
1591 Int_t nbytes = 1+((nd-1)>>3);
1595 for (current_byte=0; current_byte<nbytes; current_byte++) {
1596 byte = (~td.
fVoxBits1[current_byte]) & (array1[current_byte] & array2[current_byte]);
1597 if (!byte)
continue;
1598 for (current_bit=0; current_bit<8; current_bit++) {
1599 if (byte & (1<<current_bit)) {
1618 Int_t nbytes = 1+((nd-1)>>3);
1622 for (current_byte=0; current_byte<nbytes; current_byte++) {
1623 byte = (~td.
fVoxBits1[current_byte]) & (array1[current_byte] & array2[current_byte] & array3[current_byte]);
1624 if (!byte)
continue;
1625 for (current_bit=0; current_bit<8; current_bit++) {
1626 if (byte & (1<<current_bit)) {
1642 Int_t nbytes = 1+((nd-1)>>3);
1647 for (current_byte=0; current_byte<nbytes; current_byte++) {
1648 byte = array1[current_byte] & array2[current_byte];
1649 if (!byte)
continue;
1650 for (current_bit=0; current_bit<8; current_bit++) {
1651 if (byte & (1<<current_bit)) {
1652 result[nf++] = (current_byte<<3)+current_bit;
1653 if ((nf==n1) || (nf==n2)) {
1659 if (ibreak)
return kTRUE;
1672 Int_t nbytes = 1+((nd-1)>>3);
1678 for (current_byte=0; current_byte<nbytes; current_byte++) {
1679 byte = array1[current_byte] & array2[current_byte];
1680 icand = current_byte<<3;
1682 if (!byte)
continue;
1683 for (current_bit=0; current_bit<8; current_bit++) {
1684 if (byte & (1<<current_bit)) {
1699 Int_t nbytes = 1+((nd-1)>>3);
1704 for (current_byte=0; current_byte<nbytes; current_byte++) {
1705 byte = array1[current_byte] & array2[current_byte] & array3[current_byte];
1706 if (!byte)
continue;
1707 for (current_bit=0; current_bit<8; current_bit++) {
1708 if (byte & (1<<current_bit)) {
1709 result[nf++] = (current_byte<<3)+current_bit;
1710 if ((nf==n1) || (nf==n2) || (nf==n3)) {
1716 if (ibreak)
return kTRUE;
1729 Int_t nbytes = 1+((nd-1)>>3);
1735 for (current_byte=0; current_byte<nbytes; current_byte++) {
1736 byte = array1[current_byte] & array2[current_byte] & array3[current_byte];
1737 icand = current_byte<<3;
1739 if (!byte)
continue;
1740 for (current_bit=0; current_bit<8; current_bit++) {
1741 if (byte & (1<<current_bit)) {
1755 Int_t nmaxslices = 2*nd+1;
1765 if ((xmin>=xmax) || (ymin>=ymax) || (zmin>=zmax)) {
1772 for (
id=0;
id<nd;
id++) {
1775 boundaries[2*
id+1] = fBoxes[6*
id+3]+fBoxes[6*
id];
1777 boundaries[2*
id+2*nd] = fBoxes[6*
id+4]-fBoxes[6*
id+1];
1778 boundaries[2*
id+2*nd+1] = fBoxes[6*
id+4]+fBoxes[6*
id+1];
1780 boundaries[2*
id+4*nd] = fBoxes[6*
id+5]-fBoxes[6*
id+2];
1781 boundaries[2*
id+4*nd+1] = fBoxes[6*
id+5]+fBoxes[6*
id+2];
1793 Int_t nleft, nright;
1796 Double_t xxmin, xxmax, xbmin, xbmax, ddx1, ddx2;
1805 for (
id=0;
id<2*nd;
id++) {
1806 if (!ib) {temp[ib++] = boundaries[index[
id]];
continue;}
1807 if (
TMath::Abs(temp[ib-1]-boundaries[index[
id]])>1
E-10)
1808 temp[ib++] = boundaries[index[
id]];
1813 delete [] boundaries;
1818 delete [] extra_left;
1819 delete [] extra_right;
1825 if (((temp[0]-xmin)<1
E-10) && ((temp[1]-xmax)>-1
E-10)) {
1853 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
1864 for (
id=0;
id<
fNox;
id++) {
1868 extra[indextra] = extra[indextra+1] = 0;
1870 bits = &ind[current];
1873 for (
Int_t ic=0; ic<nd; ic++) {
1875 xbmax = fBoxes[6*ic+3]+fBoxes[6*ic];
1877 if (ddx1>-1
E-10)
continue;
1879 if (ddx2<1
E-10)
continue;
1886 bits[loc] |= 1<<bit;
1891 if ((
id==0) || (ddx1>-1
E-10)) {
1892 extra_left[nleft++] = ic;
1895 if ((
id==(
fNoz-1)) || (ddx2<1
E-10)) {
1896 extra_right[nright++] = ic;
1900 if (
fNsliceX[
id]>0) current += nperslice;
1902 extra[indextra] = nleft;
1903 extra[indextra+1] = nright;
1904 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
1905 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
1906 indextra += 2+nleft+nright;
1914 if (indextra>nmaxslices*4) printf(
"Woops!!!\n");
1923 for (
id=0;
id<2*nd;
id++) {
1924 if (!ib) {temp[ib++] = boundaries[2*nd+index[
id]];
continue;}
1925 if (
TMath::Abs(temp[ib-1]-boundaries[2*nd+index[
id]])>1
E-10)
1926 temp[ib++]=boundaries[2*nd+index[
id]];
1931 delete [] boundaries;
1936 delete [] extra_left;
1937 delete [] extra_right;
1943 if (((temp[0]-ymin)<1
E-10) && ((temp[1]-ymax)>-1
E-10)) {
1973 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
1984 for (
id=0;
id<
fNoy;
id++) {
1988 extra[indextra] = extra[indextra+1] = 0;
1990 bits = &ind[current];
1993 for (
Int_t ic=0; ic<nd; ic++) {
1995 xbmax = fBoxes[6*ic+4]+fBoxes[6*ic+1];
1997 if (ddx1>-1
E-10)
continue;
1999 if (ddx2<1
E-10)
continue;
2006 bits[loc] |= 1<<bit;
2011 if ((
id==0) || (ddx1>-1
E-10)) {
2012 extra_left[nleft++] = ic;
2015 if ((
id==(
fNoz-1)) || (ddx2<1
E-10)) {
2016 extra_right[nright++] = ic;
2020 if (
fNsliceY[
id]>0) current += nperslice;
2022 extra[indextra] = nleft;
2023 extra[indextra+1] = nright;
2024 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
2025 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
2026 indextra += 2+nleft+nright;
2034 if (indextra>nmaxslices*4) printf(
"Woops!!!\n");
2043 for (
id=0;
id<2*nd;
id++) {
2044 if (!ib) {temp[ib++] = boundaries[4*nd+index[
id]];
continue;}
2045 if ((
TMath::Abs(temp[ib-1]-boundaries[4*nd+index[
id]]))>1
E-10)
2046 temp[ib++]=boundaries[4*nd+index[
id]];
2051 delete [] boundaries;
2056 delete [] extra_left;
2057 delete [] extra_right;
2063 if (((temp[0]-zmin)<1
E-10) && ((temp[1]-zmax)>-1
E-10)) {
2093 memset(ind, 0, (nmaxslices*nperslice)*
sizeof(
UChar_t));
2104 for (
id=0;
id<
fNoz;
id++) {
2108 extra[indextra] = extra[indextra+1] = 0;
2110 bits = &ind[current];
2113 for (
Int_t ic=0; ic<nd; ic++) {
2115 xbmax = fBoxes[6*ic+5]+fBoxes[6*ic+2];
2117 if (ddx1>-1
E-10)
continue;
2119 if (ddx2<1
E-10)
continue;
2126 bits[loc] |= 1<<bit;
2131 if ((
id==0) || (ddx1>-1
E-10)) {
2132 extra_left[nleft++] = ic;
2135 if ((
id==(fNoz-1)) || (ddx2<1
E-10)) {
2136 extra_right[nright++] = ic;
2140 if (
fNsliceZ[
id]>0) current += nperslice;
2142 extra[indextra] = nleft;
2143 extra[indextra+1] = nright;
2144 if (nleft) memcpy(&extra[indextra+2], extra_left, nleft*
sizeof(
Int_t));
2145 if (nright) memcpy(&extra[indextra+2+nleft], extra_right, nright*
sizeof(
Int_t));
2146 indextra += 2+nleft+nright;
2154 if (indextra>nmaxslices*4) printf(
"Woops!!!\n");
2158 delete [] boundaries;
2163 delete [] extra_left;
2164 delete [] extra_right;
2168 if (nd>1)
Error(
"SortAll",
"Volume %s: Cannot make slices on any axis",
fVolume->
GetName());
2193 for (
id=0;
id<
fIbx;
id++) {
2194 printf(
"%15.10f\n",
fXb[
id]);
2195 if (
id == (fIbx-1))
break;
2196 printf(
"slice %i : %i\n",
id,
fNsliceX[
id]);
2199 for (i=0; i<nbytes; i++) {
2201 for (bit=0; bit<8; bit++) {
2202 if (byte & (1<<bit)) printf(
" %i ", 8*i+bit);
2208 printf(
" extra_about_left = %i\n", nextra);
2210 printf(
" extra_about_right = %i\n", nextra);
2213 printf(
"%15.10f\n",
fXb[0]);
2214 for (
id=0;
id<nd;
id++) printf(
" %i ",
id);
2216 printf(
"%15.10f\n",
fXb[1]);
2220 for (
id=0;
id<
fIby;
id++) {
2221 printf(
"%15.10f\n",
fYb[
id]);
2222 if (
id == (fIby-1))
break;
2223 printf(
"slice %i : %i\n",
id,
fNsliceY[
id]);
2226 for (i=0; i<nbytes; i++) {
2228 for (bit=0; bit<8; bit++) {
2229 if (byte & (1<<bit)) printf(
" %i ", 8*i+bit);
2234 printf(
" extra_about_left = %i\n", nextra);
2236 printf(
" extra_about_right = %i\n", nextra);
2239 printf(
"%15.10f\n",
fYb[0]);
2240 for (
id=0;
id<nd;
id++) printf(
" %i ",
id);
2242 printf(
"%15.10f\n",
fYb[1]);
2247 for (
id=0;
id<
fIbz;
id++) {
2248 printf(
"%15.10f\n",
fZb[
id]);
2249 if (
id == (fIbz-1))
break;
2250 printf(
"slice %i : %i\n",
id,
fNsliceZ[
id]);
2253 for (i=0; i<nbytes; i++) {
2255 for (bit=0; bit<8; bit++) {
2256 if (byte & (1<<bit)) printf(
" %i ", 8*i+bit);
2262 printf(
" extra_about_left = %i\n", nextra);
2264 printf(
" extra_about_right = %i\n", nextra);
2267 printf(
"%15.10f\n",
fZb[0]);
2268 for (
id=0;
id<nd;
id++) printf(
" %i ",
id);
2270 printf(
"%15.10f\n",
fZb[1]);
2287 if ((im==-1) || (im==
fIbx-1)) {
2288 printf(
"Voxel X limits: OUT\n");
2290 printf(
"Voxel X limits: %g %g\n",
fXb[im],
fXb[im+1]);
2295 if ((im==-1) || (im==
fIby-1)) {
2296 printf(
"Voxel Y limits: OUT\n");
2298 printf(
"Voxel Y limits: %g %g\n",
fYb[im],
fYb[im+1]);
2303 if ((im==-1) || (im==
fIbz-1)) {
2304 printf(
"Voxel Z limits: OUT\n");
2306 printf(
"Voxel Z limits: %g %g\n",
fZb[im],
fZb[im+1]);
2319 for (
Int_t i=0; i<nd; i++) {
2330 void TGeoVoxelFinder::Streamer(
TBuffer &R__b)
Statefull info for the current geometry level.
virtual const char * GetName() const
Returns name of object.
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...
virtual Double_t GetDX() const
void SetCylVoxels(Bool_t flag=kTRUE)
Geometrical transformation package.
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
TGeoNode * GetNode(const char *name) const
get the pointer to a daughter node
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) ...
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
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.
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) ...
Short_t Min(Short_t a, Short_t b)
TGeoVoxelFinder & operator=(const TGeoVoxelFinder &)
assignment operator
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
static Bool_t IsSameWithinTolerance(Double_t a, Double_t b)
Check if two numbers differ with less than a tolerance.
Bool_t NeedRebuild() const
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()
Int_t GetNdaughters() const
void SetInvalid(Bool_t flag=kTRUE)
void PrintVoxelLimits(const Double_t *point) const
print the voxel containing point
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 Print(Option_t *option="") const
Print the voxels.
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 SetBoxPoints(Double_t *points) const
Fill box vertices to an array.
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)
virtual void FindOverlaps(Int_t inode) const
create the list of nodes for which the bboxes overlap with inode's bbox
TGeoVoxelFinder()
Default constructor.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual const Double_t * GetOrigin() const
Bool_t GetIndices(const Double_t *point, TGeoStateInfo &td)
Get indices for current slices on x, y, z.
virtual Double_t GetDY() const
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.
virtual void ReadFastArray(Bool_t *b, Int_t n)=0
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 Double_t Efficiency()
Compute voxelization efficiency.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
Int_t * GetValidExtra(Int_t *list, Int_t &ncheck, TGeoStateInfo &td)
Get extra candidates that are not contained in current check list.
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.
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 ...
static RooMathCoreReg dummy
Finder class handling voxels.
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
A node represent a volume positioned inside another.They store links to both volumes and to the TGeoM...
virtual ~TGeoVoxelFinder()
Destructor.
Int_t GetNcandidates(TGeoStateInfo &td) const
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
void FindOverlaps() const
loop all nodes marked as overlaps and find overlapping brothers
TGeoShape * GetShape() const
Long64_t LocMin(Long64_t n, const T *a)
TGeoVolume * GetVolume() const
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
virtual Double_t GetDZ() const
virtual Bool_t IsAssembly() const
Returns true if the volume is an assembly or a scaled assembly.