161 static Int_t oseconds = 0;
164 static Int_t nrefresh = 0;
165 const char symbol[4] = {
'=',
'\\',
'|',
'/'};
166 char progress[11] =
" ";
167 Int_t ichar = icount%4;
178 if (ocurrent > osize) ocurrent=osize;
188 if (owatch && !last) {
191 hours = (
Int_t)(time/3600.);
193 minutes = (
Int_t)(time/60.);
195 seconds = (
Int_t)time;
197 if (oseconds==seconds) {
201 oneoftwo = !oneoftwo;
205 if (refresh && oneoftwo) {
211 Double_t percent = 100.0*ocurrent/osize;
213 if (nchar>10) nchar=10;
215 for (i=0; i<nchar; i++) progress[i] =
'=';
216 progress[nchar] = symbol[ichar];
217 for (i=nchar+1; i<10; i++) progress[i] =
' ';
221 if(size<10000) fprintf(stderr,
"%s [%10s] %4lld ", oname.
Data(), progress, ocurrent);
222 else if(size<100000) fprintf(stderr,
"%s [%10s] %5lld ",oname.
Data(), progress, ocurrent);
223 else fprintf(stderr,
"%s [%10s] %7lld ",oname.
Data(), progress, ocurrent);
224 if (time>0.) fprintf(stderr,
"[%6.2f %%] TIME %.2d:%.2d:%.2d %s\r", percent, hours, minutes, seconds, message.
Data());
225 else fprintf(stderr,
"[%6.2f %%] %s\r", percent, message.
Data());
226 if (refresh && oneoftwo) oname = nname;
236 fprintf(stderr,
"\n");
248 Info(
"CheckBoundaryErrors",
"Top volume is %s",tvol->
GetName());
262 TTree *bug=
new TTree(
"bug",
"Geometrical problems");
263 bug->
Branch(
"pos",xyz,
"xyz[3]/D");
264 bug->
Branch(
"dir",dir,
"dir[3]/D");
265 bug->
Branch(
"push",&relp,
"push/D");
266 bug->
Branch(
"path",&path,
"path/C");
267 bug->
Branch(
"cdir",&cdir,
"cdir/C");
269 dl[0] = box->
GetDX();
270 dl[1] = box->
GetDY();
271 dl[2] = box->
GetDZ();
276 dl[0] = dl[1] = dl[2] = radius;
279 TH1F *hnew =
new TH1F(
"hnew",
"Precision pushing",30,-20.,10.);
280 TH1F *hold =
new TH1F(
"hold",
"Precision pulling", 30,-20.,10.);
281 TH2F *hplotS =
new TH2F(
"hplotS",
"Problematic points",100,-dl[0],dl[0],100,-dl[1],dl[1]);
287 Long_t n100 = ntracks/100;
289 printf(
"Random box : %f, %f, %f, %f, %f, %f\n", ori[0], ori[1], ori[2], dl[0], dl[1], dl[2]);
290 printf(
"Start... %i points\n", ntracks);
294 while (igen<ntracks) {
306 if (n100 && !(igen%n100))
319 for(
Int_t i=0; i<30; ++i) {
321 for(
Int_t j=0; j<3; ++j) nxyz[j]=xyz[j]+step*(1.+relp)*dir[j];
328 Double_t dotp = norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2];
329 printf(
"Forward error i=%d p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
330 i,xyz[0],xyz[1],xyz[2],step,dotp,path);
332 strncpy(cdir,
"Forward",10);
340 for(
Int_t i=0; i<30; ++i) {
342 for(
Int_t j=0; j<3; ++j) nxyz[j]=xyz[j]+step*(1.+relp)*dir[j];
349 Double_t dotp = norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2];
350 printf(
"Backward error i=%d p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
351 i,xyz[0],xyz[1],xyz[2],step,dotp,path);
352 strncpy(cdir,
"Backward",10);
361 if (itry)
printf(
"CPU time/point = %5.2emus: Real time/point = %5.2emus\n",
370 if (itry)
printf(
"Effic = %3.1f%%\n",(100.*igen)/itry);
379 new TCanvas(
"c3",
"Plot",600,600);
380 hplotS->
Draw(
"cont0");
407 printf(
"nentries %d\n",nentries);
411 printf(
"%-9s error push=%g p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
412 cdir,push,xyz[0],xyz[1],xyz[2],1.,1.,path);
415 if (icheck>=nentries)
return;
419 printf(
"%-9s error push=%g p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
420 cdir,push,xyz[0],xyz[1],xyz[2],1.,1.,path);
426 for (
Int_t j=0; j<3; j++) nxyz[j]=xyz[j]+step*(1.+0.1*push)*dir[j];
444 for (
Int_t j=0; j<3; j++) nxyz[j]=xyz[j]+step*dir[j];
490 printf(
"====================================================================\n");
491 printf(
"STAGE 1: Overlap checking by sampling within 10 microns\n");
492 printf(
"====================================================================\n");
496 printf(
"====================================================================\n");
497 printf(
"STAGE 2: Global overlap/extrusion checking within 10 microns\n");
498 printf(
"====================================================================\n");
502 if (!checkcrossings) {
518 printf(
"====================================================================\n");
519 printf(
"STAGE 3: Propagating %i tracks starting from vertex\n and conting number of boundary crossings...\n", ntracks);
520 printf(
"====================================================================\n");
524 memset(point, 0, 3*
sizeof(
Double_t));
525 if (vertex) memcpy(point, vertex, 3*
sizeof(
Double_t));
529 for (i=0; i<ntracks; i++) {
540 printf(
"No boundary crossed\n");
548 printf(
"Time for crossing %i boundaries: %g [ms]\n", nbound, time1);
549 printf(
"Time per track for full geometry traversal: %g [ms], per crossing: %g [ms]\n", time2, time3);
553 printf(
"====================================================================\n");
554 printf(
"STAGE 4: How much navigation time per volume per next+safety call\n");
555 printf(
"====================================================================\n");
565 strncpy(volname, vol->
GetName(),15);
569 while ((current=
next())) {
570 vol = current->GetVolume();
572 if (
fFlags[uid])
continue;
576 strncpy(volname, vol->
GetName(),15);
587 TFile *
f =
new TFile(
"statistics.root",
"RECREATE");
588 TH1F *
h =
new TH1F(
"h",
"number of boundary crossings per volume",3,0,3);
594 for (i=0; i<nuid; i++) {
600 time_tot_pertrack /= ntracks;
606 TCanvas *
c2 =
new TCanvas(
"c3",
"time spent per volume in navigation",10,10,900,500);
609 TH2F *h2 =
new TH2F(
"h2",
"time per FNB call vs. ndaughters", 100, 0,100,100,0,15);
612 TH1F *
h1 =
new TH1F(
"h1",
"percent of time spent per volume",3,0,3);
616 for (i=0; i<nuid; i++) {
619 value =
fVal1[i]*
fVal2[i]/ntracks/time_tot_pertrack;
655 printf(
"Error in trying to cross boundary of %s\n", current->
GetName());
701 Error(
"SetNmeshPoints",
"Cannot allow less than 1000 points for checking - set to 1000");
721 Double_t point[3], dir[3], lpt[3], ldir[3];
728 for (
Int_t i=0; i<1000000; i++) {
769 return time_per_track;
803 Int_t nelem1, nelem2;
804 Int_t dim1=1000, dim2=1000;
805 if ((startx==0) && (starty==0) && (startz==0)) eps=1
E-3;
806 start[0] = startx+eps;
807 start[1] = starty+eps;
808 start[2] = startz+eps;
812 Int_t ist1, ist2, ifound;
813 for (i=0; i<nrays; i++) {
815 if ((i%n10) == 0)
printf(
"%i percent\n",
Int_t(100*i/nrays));
825 array1 =
ShootRay(&start[0], dir[0], dir[1], dir[2], array1, nelem1, dim1);
826 if (!nelem1)
continue;
828 memcpy(&end[0], &array1[3*(nelem1-1)], 3*
sizeof(
Double_t));
831 array2 =
ShootRay(&end[0], -dir[0], -dir[1], -dir[2], array2, nelem2, dim2, &start[0]);
833 printf(
"#### NOTHING BACK ###########################\n");
834 for (j=0; j<nelem1; j++) {
836 pm->
SetNextPoint(array1[3*j], array1[3*j+1], array1[3*j+2]);
842 for (j=0; j<k; j++) {
843 memcpy(&dummy[0], &array2[3*j], 3*
sizeof(
Double_t));
844 memcpy(&array2[3*j], &array2[3*(nelem2-1-j)], 3*
sizeof(
Double_t));
845 memcpy(&array2[3*(nelem2-1-j)], &dummy[0], 3*
sizeof(
Double_t));
848 if (nelem1!=nelem2)
printf(
"### DIFFERENT SIZES : nelem1=%i nelem2=%i ##########\n", nelem1, nelem2);
852 dx = array1[3*ist1]-array2[3*ist2];
853 dy = array1[3*ist1+1]-array2[3*ist2+1];
854 dz = array1[3*ist1+2]-array2[3*ist2+2];
855 dw = dx*dir[0]+dy*dir[1]+dz*dir[2];
864 printf(
"### NOT MATCHING %i f:(%f, %f, %f) b:(%f %f %f) DCLOSE=%f\n", ist2, array1[3*ist1], array1[3*ist1+1], array1[3*ist1+2], array2[3*ist2], array2[3*ist2+1], array2[3*ist2+2],dw);
866 pm->
SetNextPoint(array2[3*ist2], array2[3*ist2+1], array2[3*ist2+2]);
875 while ((ist1<nelem1-1) && (ist2<nelem2)) {
881 dx = array1[3*ist1+3]-array1[3*ist1];
882 dy = array1[3*ist1+4]-array1[3*ist1+1];
883 dz = array1[3*ist1+5]-array1[3*ist1+2];
885 dwmin = dx+dir[0]+dy*dir[1]+dz*dir[2];
886 while (ist2<nelem2) {
888 dx = array2[3*ist2]-array1[3*ist1];
889 dy = array2[3*ist2+1]-array1[3*ist1+1];
890 dz = array2[3*ist2+2]-array1[3*ist1+2];
891 dw = dx+dir[0]+dy*dir[1]+dz*dir[2];
912 pm->
SetNextPoint(array2[3*ist2], array2[3*ist2+1], array2[3*ist2+2]);
923 pm->
SetNextPoint(array2[3*ist1+3], array2[3*ist1+4], array2[3*ist1+5]);
924 printf(
"### BOUNDARY MISSED BACK #########################\n");
957 for (
Int_t i=0; i<numPoints; i++) {
959 rsq = points[j]*points[j]+points[j+1]*points[j+1];
960 if (rsq < 1.e-10)
continue;
961 points[k] = points[j];
962 points[k+1] = points[j+1];
963 points[k+2] = points[j+2];
983 Bool_t extrude, isextrusion, isoverlapping;
1031 for (ip=0; ip<numPoints2; ip++) {
1032 memcpy(local, &points2[3*ip], 3*
sizeof(
Double_t));
1036 extrude = !shape1->
Contains(local);
1039 if (safety<ovlp) extrude=
kFALSE;
1043 isextrusion =
kTRUE;
1054 for (ip=0; ip<numPoints1; ip++) {
1055 memcpy(local, &points1[3*ip], 3*
sizeof(
Double_t));
1056 if (local[0]<1e-10 && local[1]<1e-10)
continue;
1059 extrude = shape2->
Contains(local1);
1067 if (safety<ovlp) extrude=
kFALSE;
1072 isextrusion =
kTRUE;
1089 for (ip=0; ip<numPoints1; ip++) {
1090 memcpy(local, &points1[3*ip], 3*
sizeof(
Double_t));
1091 if (local[0]<1e-10 && local[1]<1e-10)
continue;
1097 if (safety<ovlp) overlap=
kFALSE;
1100 if (!isoverlapping) {
1101 isoverlapping =
kTRUE;
1112 for (ip=0; ip<numPoints2; ip++) {
1113 memcpy(local, &points2[3*ip], 3*
sizeof(
Double_t));
1114 if (local[0]<1e-10 && local[1]<1e-10)
continue;
1120 if (safety<ovlp) overlap=
kFALSE;
1123 if (!isoverlapping) {
1124 isoverlapping =
kTRUE;
1146 if (!voxels)
return;
1159 Int_t *check_list = 0;
1165 Int_t id=0, id0=0, id1=0;
1177 while (ipoint < npoints) {
1184 if (itry>10000 && !ipoint) {
1185 Error(
"CheckOverlapsBySampling",
"No point inside volume!!! - aborting");
1194 if (!check_list || ncheck<2)
continue;
1195 for (
id=0;
id<ncheck;
id++) {
1196 id0 = check_list[
id];
1203 if (!incrt)
continue;
1225 while (cindex >= 0) {
1235 while (cindex >= 0) {
1243 &mat1,&mat2,
kTRUE, safe);
1244 flags[nd*id1+id0] = nodeovlp;
1253 if (flags)
delete [] flags;
1254 if (!novlps)
return;
1258 Info(
"CheckOverlapsBySampling",
"#Found %d overlaps adding-up to %g +/- %g [cm3] for daughters of %s",
1259 novlps, capacity, err*capacity, vol->
GetName());
1277 while ((node=next1())) {
1289 if (nd<2)
return nchecks;
1291 if (!vox)
return nchecks;
1299 for (
id=0;
id<nd;
id++) {
1304 if (!ovlps)
continue;
1305 for (ko=0; ko<novlp; ko++) {
1307 if (io<=
id)
continue;
1314 while ((node=next1())) {
1318 while ((node1=next2())) {
1334 while ((node1=next2())) {
1370 if (!npoints) npoints = 1000000;
1387 while ((node=next1())) {
1401 while ((nodecheck=next1.
GetNode(level--))) {
1422 Warning(
"CheckOverlaps",
"Volume %s with %i daughters but not voxelized", vol->
GetName(),nd);
1436 for (
id=0;
id<nd;
id++) {
1441 if (!ovlps)
continue;
1444 for (ko=0; ko<novlp; ko++) {
1446 if (io<=
id)
continue;
1458 while ((node=next1())) {
1465 while ((node1=next2())) {
1475 while ((nodecheck=next2.
GetNode(level--))) {
1481 while ((nodecheck=next1.
GetNode(level--))) {
1509 while ((nodecheck=next1.
GetNode(level--))) {
1529 while ((node1=next2())) {
1539 while ((nodecheck=next2.
GetNode(level--))) {
1601 printf(
"=== Check current point : (%g, %g, %g) ===\n", point[0], point[1], point[2]);
1607 printf(
"Safety radius : %f\n", close);
1654 Error(
"CheckShape",
"Test number %d not existent", testNo);
1676 const Int_t kNtracks = 1000;
1677 Int_t n10 = nsamples/10;
1686 TH1D *hist =
new TH1D(
"hTest1",
"Residual distance from inside/outside",200,-20, 0);
1694 while (itot<nsamples) {
1704 if ((itot%n10) == 0)
printf(
"%i percent\n",
Int_t(100*itot/nsamples));
1706 for (i=0; i<kNtracks; i++) {
1717 printf(
"DistFromInside: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) %f/%f(max)\n",
1718 point[0],point[1],point[2],dir[0],dir[1],dir[2], d1,dmove);
1723 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1724 for (j=0; j<3; j++) pnew[j] = point[j] + d1*dir[j];
1726 pmfrominside->
Draw();
1734 if (d1+dnext<dmax) dmove = d1+0.5*
dnext;
1736 for (j=0; j<3; j++) {
1737 pnew[j] = point[j] + dmove*dir[j];
1742 delta = dmove-d1-d2;
1745 printf(
"Error: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d2=%f dmove=%f\n",
1746 point[0],point[1],point[2],dir[0],dir[1],dir[2], d1,d2,dmove);
1748 printf(
" (*)DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1753 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1754 point[0]+d1*dir[0],point[1]+d1*dir[1], point[2]+d1*dir[2], dir[0],dir[1],dir[2],dnext);
1756 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) = %f\n",
1757 pnew[0],pnew[1],pnew[2],dnew[0],dnew[1],dnew[2], d2);
1762 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1763 for (j=0; j<3; j++) point[j] += d1*dir[j];
1764 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1765 pmfrominside->
Draw();
1772 for (j=0; j<3; j++) pnew[j] += d2*dnew[j];
1773 if (d2<1E10) pmfromoutside->
SetNextPoint(pnew[0],pnew[1],pnew[2]);
1774 pmfromoutside->
Draw();
1781 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d1p=%f\n",
1782 pnew[0],pnew[1],pnew[2],dnew[0],dnew[1],dnew[2],d1,dnext);
1787 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1788 for (j=0; j<3; j++) point[j] += d1*dir[j];
1789 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1790 pmfrominside->
Draw();
1797 for (j=0; j<3; j++) pnew[j] += dnext*dnew[j];
1798 if (d2<1E10) pmfromoutside->
SetNextPoint(pnew[0],pnew[1],pnew[2]);
1799 pmfromoutside->
Draw();
1808 new TCanvas(
"Test01",
"Residuals DistFromInside/Outside", 800, 600);
1824 const Int_t kNtracks = 1000;
1825 Int_t n10 = nsamples/10;
1837 while (itot<nsamples) {
1846 if ((itot%n10) == 0)
printf(
"%i percent\n",
Int_t(100*itot/nsamples));
1848 for (i=0; i<kNtracks; i++) {
1857 printf(
"Error safety (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) safe=%f dist=%f\n",
1858 point[0],point[1],point[2], dir[0], dir[1], dir[2], safe, dist);
1866 pm1->
SetNextPoint(point[0]+safe*dir[0],point[1]+safe*dir[1],point[2]+safe*dir[2]);
1872 pm2->
SetNextPoint(point[0]+dist*dir[0],point[1]+dist*dir[1],point[2]+dist*dir[2]);
1893 const Int_t kNtracks = 1000;
1894 Int_t n10 = nsamples/10;
1895 Int_t itot = 0, errcnt = 0, errsame=0;
1898 Double_t point[3],newpoint[3], oldpoint[3];
1912 while (itot<nsamples) {
1925 oldnorm[0] = oldnorm[1] = oldnorm[2] = 0.;
1929 if ((itot%n10) == 0)
printf(
"%i percent\n",
Int_t(100*itot/nsamples));
1931 for (i=0; i<kNtracks; i++) {
1932 if (errcnt>0)
break;
1934 for (
Int_t j=0; j<3; j++) {
1935 newpoint[j] = point[j] + dist*dir[j];
1939 dot = olddir[0]*oldnorm[0]+olddir[1]*oldnorm[1]+ olddir[2]*oldnorm[2];
1942 printf(
"Error point outside (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
1943 point[0],point[1],point[2], dir[0], dir[1], dir[2], dist, olddist);
1944 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n",
1945 oldpoint[0],oldpoint[1],oldpoint[2], olddir[0], olddir[1], olddir[2]);
1954 pm1->
SetNextPoint(oldpoint[0],oldpoint[1],oldpoint[2]);
1961 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
1962 point[0],point[1],point[2], dir[0], dir[1], dir[2], dist, olddist);
1963 printf(
" new norm: (%g, %g, %g)\n", newnorm[0], newnorm[1], newnorm[2]);
1964 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n",
1965 oldpoint[0],oldpoint[1],oldpoint[2], olddir[0], olddir[1], olddir[2]);
1966 printf(
" old norm: (%g, %g, %g)\n", oldnorm[0], oldnorm[1], oldnorm[2]);
1975 pm1->
SetNextPoint(oldpoint[0],oldpoint[1],oldpoint[2]);
1981 for (
Int_t j=0; j<3; j++) {
1982 oldpoint[j] = point[j];
1983 point[j] += dist*dir[j];
1988 printf(
"Error safety (%19.15f, %19.15f, %19.15f) safe=%g\n",
1989 point[0],point[1],point[2], safe);
2006 printf(
"Error: same normal for: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) = (%g,%g,%g)\n",
2007 point[0],point[1],point[2], dir[0], dir[1], dir[2], norm[0], norm[1], norm[2]);
2008 printf(
" as for: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n",
2009 oldpoint[0],oldpoint[1],oldpoint[2], olddir[0], olddir[1], olddir[2]);
2018 pm1->
SetNextPoint(oldpoint[0],oldpoint[1],oldpoint[2]);
2019 memcpy(oldnorm, norm, 3*
sizeof(
Double_t));
2022 memcpy(oldnorm, norm, 3*
sizeof(
Double_t));
2023 memcpy(olddir, dir, 3*
sizeof(
Double_t));
2030 ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
2033 if ((itot%10) == 0) pm2->
SetNextPoint(point[0],point[1],point[2]);
2052 TH2F *hist =
new TH2F(
"lego", option, nphi, phimin, phimax, ntheta, themin, themax);
2061 Int_t ntot = ntheta * nphi;
2062 Int_t n10 = ntot/10;
2063 Int_t igen = 0, iloop=0;
2064 printf(
"=== Lego plot sph. => nrays=%i\n", ntot);
2065 for (i=1; i<=nphi; i++) {
2066 for (j=1; j<=ntheta; j++) {
2069 if ((igen%n10) == 0)
printf(
"%i percent\n",
Int_t(100*igen/ntot));
2074 start[0] = start[1] = start[2] = 1
E-3;
2100 if (iloop>1000)
printf(
"%i steps\n", iloop);
2104 if (endnode==0 && step>1E10)
break;
2106 startnode = endnode;
2117 hist->
Fill(phi, theta, x);
2144 printf(
"Random box : %f, %f, %f\n", dx, dy, dz);
2146 printf(
"Start... %i points\n", npoints);
2150 Int_t n10 = npoints/10;
2152 while (igen<npoints) {
2159 if ((igen%n10) == 0)
printf(
"%i percent\n",
Int_t(100*igen/npoints));
2162 if (!node)
continue;
2168 if ((ic<0) || (ic>=128)) ic = 1;
2175 pm->
AddAt(marker, ic);
2180 printf(
"Number of visible points : %i\n", i);
2182 printf(
"efficiency : %g\n", ratio);
2185 if (marker) marker->
Draw(
"SAME");
2189 printf(
"---Make them visible with : gGeoManager->GetTopVolume()->VisibleDaughters();\n");
2216 printf(
"Start... %i rays\n", nrays);
2220 Int_t ipoint, inull;
2233 while (itot<nrays) {
2238 if ((itot%n10) == 0)
printf(
"%i percent\n",
Int_t(100*itot/nrays));
2266 line->
SetPoint(ipoint++, start[0], start[1], start[2]);
2286 line->
SetPoint(ipoint, point[0], point[1], point[2]);
2287 if (!vis2 && check_norm) {
2291 normline->
SetPoint(0, point[0], point[1], point[2]);
2292 normline->
SetPoint(1, point[0]+normal[0]*normlen,
2293 point[1]+normal[1]*normlen,
2294 point[2]+normal[2]*normlen);
2304 line->
SetPoint(ipoint++, point[0], point[1], point[2]);
2310 normline->
SetPoint(0, point[0], point[1], point[2]);
2311 normline->
SetPoint(1, point[0]+normal[0]*normlen,
2312 point[1]+normal[1]*normlen,
2313 point[2]+normal[2]*normlen);
2316 if (!random) pm->
Add(normline);
2323 if (line) line->
Draw(
"SAME");
2325 printf(
"number of segments : %i\n", i);
2345 if (!node) {dist=-1;
return 0;}
2347 if (strlen(g3path)) hasg3 =
kTRUE;
2360 eps[0] = epsil; eps[1]=epsil; eps[2]=epsil;
2367 index = spath.
Index(
"/", index+1);
2369 name = spath(0, index);
2370 if (strstr(g3path, name.
Data())) {
2377 if (strlen(common.
Data())) {
2388 if (!nodegeo)
return 0;
2389 if (!nodeg3)
return 0;
2393 for (
Int_t i=0; i<npoints; i++) {
2394 xyz[0] = point[0] - eps[0] + 2*eps[0]*
gRandom->
Rndm();
2395 xyz[1] = point[1] - eps[1] + 2*eps[1]*
gRandom->
Rndm();
2396 xyz[2] = point[2] - eps[2] + 2*eps[2]*
gRandom->
Rndm();
2399 dist1 =
TMath::Sqrt((xyz[0]-point[0])*(xyz[0]-point[0])+
2400 (xyz[1]-point[1])*(xyz[1]-point[1])+(xyz[2]-point[2])*(xyz[2]-point[2]));
2412 if (!node_close) dist = -1;
2417 memcpy(&point[0], pointg, 3*
sizeof(
Double_t));
2418 for (
Int_t i=0; i<npoints; i++) {
2425 dist1 =
TMath::Sqrt((point[0]-pointg[0])*(point[0]-pointg[0])+
2426 (point[1]-pointg[1])*(point[1]-pointg[1])+(point[2]-pointg[2])*(point[2]-pointg[2]));
2430 memcpy(&closest[0], pointg, 3*
sizeof(
Double_t));
2440 if (!node_close) dist=-1;
2454 printf(
"empty input array\n");
2472 if (step>1E10)
return array;
2477 forward = dirx*(endpoint[0]-point[0])+diry*(endpoint[1]-point[1])+dirz*(endpoint[2]-point[2]);
2486 memcpy(temparray, array, 3*dim*
sizeof(
Double_t));
2491 memcpy(&array[3*nelem], point, 3*
sizeof(
Double_t));
2495 if (endnode==0 && step>1E10) {
2514 if (istep>0)
printf(
"%i steps\n", istep);
2517 memcpy(temparray, array, 3*dim*
sizeof(
Double_t));
2522 memcpy(&array[3*nelem], point, 3*
sizeof(
Double_t));
2525 is_entering =
kTRUE;
2542 Bool_t recheck = !strcmp(option,
"RECHECK");
2543 if (recheck)
printf(
"RECHECK\n");
2553 printf(
"Random box : %f, %f, %f\n", dx, dy, dz);
2556 for (i=0; i<npoints; i++) {
2562 printf(
"Generation time :\n");
2566 printf(
"Start... %i points\n", npoints);
2568 for (i=0; i<npoints; i++) {
2574 if (node1 != node) {
2575 printf(
"Difference for x=%g y=%g z=%g\n", xyz[3*i], xyz[3*i+1], xyz[3*i+2]);
2593 printf(
"Checking overlaps for path :\n");
2598 Int_t npoints = 1000000;
2626 if (!shape->
Contains(point))
continue;
2640 ntpl->
Fill(xmin,ymin,zmin);
2641 ntpl->
Fill(xmax,ymin,zmin);
2642 ntpl->
Fill(xmin,ymax,zmin);
2643 ntpl->
Fill(xmax,ymax,zmin);
2644 ntpl->
Fill(xmin,ymin,zmax);
2645 ntpl->
Fill(xmax,ymin,zmax);
2646 ntpl->
Fill(xmin,ymax,zmax);
2647 ntpl->
Fill(xmax,ymax,zmax);
2648 ntpl->
Draw(
"z:y:x");
2655 printf(
"using FindNode...\n");
2656 for (
Int_t j=0; j<npoints; j++) {
2663 markthis->
SetNextPoint(xyz[3*j], xyz[3*j+1], xyz[3*j+2]);
2669 if (ic >= 128) ic = 0;
2674 pm->
AddAt(marker, ic);
2677 marker->
SetNextPoint(xyz[3*j], xyz[3*j+1], xyz[3*j+2]);
2679 if (overlaps->
IndexOf(node) < 0) overlaps->
Add(node);
2687 markthis->
Draw(
"SAME");
2691 printf(
"list of overlapping nodes :\n");
2697 }
else printf(
"No overlaps\n");
2712 if (!nmat)
return 0;
2714 memset(nin, 0, nmat*
sizeof(
Int_t));
2730 Double_t weight=0, sigma, eps, dens;
2741 if (!node)
continue;
2744 if (indmat<0)
continue;
2747 if ((iin%100000)==0 || igen>1E8) {
2750 for (indmat=0; indmat<nmat; indmat++) {
2753 if (dens<1
E-2) dens=0;
2755 weight += dens*
Double_t(nin[indmat]);
2756 sigma += dens*dens*nin[indmat];
2762 if (eps<precision || igen>1E8) {
2764 printf(
"=== Weight of %s : %g +/- %g [kg]\n",
2769 if (isverbose && eps<0.5*eps0) {
2770 printf(
"%8dK: %14.7g kg %g %%\n",
2771 igen/1000, weight, eps*100);
2797 for (
Int_t i=0; i<npoints; i++) {
2799 if (!shape->
Contains(point))
continue;
2801 if (!checklist)
continue;
2802 if (!ncheck)
continue;
2803 for (
Int_t id=0;
id<ncheck;
id++) {
2804 node = vol->
GetNode(checklist[
id]);
void SetTopVisible(Bool_t vis=kTRUE)
make top volume visible on screen
virtual void SetLineWidth(Width_t lwidth)
virtual ~TGeoChecker()
Destructor.
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
void TestOverlaps(const char *path)
— Geometry overlap checker based on sampling.
double dist(Rotation3D const &r1, Rotation3D const &r2)
void Print(Option_t *option="") const
Print the real and cpu time passed between the start and stop events.
TGeoNode * InitTrack(const Double_t *point, const Double_t *dir)
Initialize current point and current direction vector (normalized) in MARS.
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
TList * GetListOfMaterials() const
Bool_t IsSameLocation(Double_t x, Double_t y, Double_t z, Bool_t change=kFALSE)
Checks if point (x,y,z) is still in the current node.
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
TGeoVolume * GetMasterVolume() const
void SetCurrentDirection(Double_t *dir)
virtual void LabelsOption(Option_t *option="h", Option_t *axis="X")
Set option(s) to draw axis with labels.
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 Int_t GetCurrentNodeIndex() const
TGeoVolume * GetVolume() const
ClassImp(TGeoChecker) TGeoChecker
Default constructor.
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)=0
ClassImp(TSeqCollection) Int_t TSeqCollection TIter next(this)
Return index of object in collection.
Double_t * fVal2
Array of number of crossings per volume.
TGeoOverlap * MakeCheckOverlap(const char *name, TGeoVolume *vol1, TGeoVolume *vol2, TGeoMatrix *mat1, TGeoMatrix *mat2, Bool_t isovlp, Double_t ovlp)
Check if the 2 non-assembly volume candidates overlap/extrude. Returns overlap object.
virtual Double_t Rndm(Int_t i=0)
Machine independent random number generator.
TGeoNode * fSelectedNode
Timer.
TGeoPatternFinder * GetFinder() const
Double_t Safety(Bool_t inside=kFALSE)
Compute safe distance from the current point.
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
TGeoStateInfo * GetInfo()
Get next state info pointer.
void PrintOverlaps() const
Print the current list of overlaps held by the manager class.
void CdUp()
Go one level up in geometry.
void InspectShape() const
void CheckOverlaps(Double_t ovlp=0.1, Option_t *option="")
Check all geometry for illegal overlaps within a limit OVLP.
R__EXTERN TStyle * gStyle
void ShapeNormal(TGeoShape *shape, Int_t nsamples, Option_t *option)
Check of validity of the normal for a given shape.
virtual Int_t Fill()
Fill all branches.
virtual void CheckBoundaryErrors(Int_t ntracks=1000000, Double_t radius=-1.)
Check pushes and pulls needed to cross the next boundary with respect to the position given by FindNe...
#define lnext(otri1, otri2)
TGeoNode * GetNode(Int_t level) const
Returns current node at a given level.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
virtual Bool_t GetPointsOnSegments(Int_t npoints, Double_t *array) const =0
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format...
TVirtualPad * cd(Int_t subpadnumber=0)
Set current canvas & pad.
TH2F * LegoPlot(Int_t ntheta=60, Double_t themin=0., Double_t themax=180., Int_t nphi=90, Double_t phimin=0., Double_t phimax=360., Double_t rmin=0., Double_t rmax=9999999, Option_t *option="")
Generate a lego plot fot the top volume, according to option.
void Skip()
Stop iterating the current branch.
virtual void Draw(Option_t *option="")
draw top volume according to option
virtual TObject * Get(const char *namecycle)
Return pointer to object identified by namecycle.
static Int_t GetVerboseLevel()
Set verbosity level (static function).
static void SetVerboseLevel(Int_t vl)
Return current verbosity level (static function).
TGeoHMatrix * GetCurrentMatrix() const
virtual Int_t GetEntry(Long64_t entry=0, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
1-D histogram with a float per channel (see TH1 documentation)}
void MasterToLocal(const Double_t *master, Double_t *local) const
void Multiply(const TGeoMatrix *right)
multiply to the right with an other transformation if right is identity matrix, just return ...
Double_t CpuTime()
Stop the stopwatch (if it is running) and return the cputime (in seconds) passed between the start an...
virtual void DrawOnly(Option_t *option="")
draw only this volume
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
void VisibleDaughters(Bool_t vis=kTRUE)
set visibility for daughters
A 3-dimensional polyline.
virtual Double_t GetDY() const
Int_t GetEntriesFast() const
void Score(TGeoVolume *, Int_t, Double_t)
Score a hit for VOL.
void Reset(TGeoVolume *top=0)
Resets the iterator for volume TOP.
virtual void LocalToMasterVect(const Double_t *local, Double_t *master) const
convert a vector by multiplying its column vector (x, y, z, 1) to matrix inverse
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Int_t PropagateInGeom(Double_t *, Double_t *)
Propagate from START along DIR from boundary to boundary until exiting geometry.
Bool_t NeedRebuild() const
virtual Double_t GetDZ() const
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
Int_t GetNdaughters() const
virtual void SetTopMargin(Float_t topmargin)
Set Pad top margin in fraction of the pad height.
static Bool_t IsSameWithinTolerance(Double_t a, Double_t b)
Check if two numbers differ with less than a tolerance.
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
void InspectNode() const
Inspect this node.
static Double_t Tolerance()
void ResetState()
Reset current state flags.
Int_t fNmeshPoints
Number of checks for current volume.
const char * Data() const
void CleanPoints(Double_t *points, Int_t &numPoints) const
Number of points on mesh to be checked.
TGeoVolume * MakeSphere(const char *name, TGeoMedium *medium, Double_t rmin, Double_t rmax, Double_t themin=0, Double_t themax=180, Double_t phimin=0, Double_t phimax=360)
Make in one step a volume pointing to a sphere shape with given medium.
virtual Bool_t Contains(const Double_t *point) const =0
Double_t TimingPerVolume(TGeoVolume *)
Compute timing per "FindNextBoundary" + "Safety" call.
Double_t dot(const TVector2 &v1, const TVector2 &v2)
void Stop()
Stop the stopwatch.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
Bool_t IsOverlapping() const
virtual Int_t SetBranchAddress(const char *bname, void *add, TBranch **ptr=0)
Change branch address, dealing with clone trees properly.
void CheckOverlaps(const TGeoVolume *vol, Double_t ovlp=0.1, Option_t *option="")
Check illegal overlaps for volume VOL within a limit OVLP.
void SetCurrentPoint(Double_t *point)
TGeoNode * GetTopNode() const
void LocalToMaster(const Double_t *local, Double_t *master) const
void CdDown(Int_t index)
Make a daughter of current node current.
virtual void SetGrid(Int_t valuex=1, Int_t valuey=1)
virtual void GetMeshNumbers(Int_t &, Int_t &, Int_t &) const
Double_t * ShootRay(Double_t *start, Double_t dirx, Double_t diry, Double_t dirz, Double_t *array, Int_t &nelem, Int_t &dim, Double_t *enpoint=0) const
Shoot one ray from start point with direction (dirx,diry,dirz).
void GetPath(TString &path) const
Returns the path for the current node.
virtual void SetMarkerColor(Color_t mcolor=1)
void SetTopName(const char *name)
Set the top name for path.
void Test(Int_t npoints, Option_t *option)
Check time of finding "Where am I" for n points.
virtual void MasterToLocal(const Double_t *master, Double_t *local) const
convert a point by multiplying its column vector (x, y, z, 1) to matrix
virtual TGeoMatrix * GetMatrix() const =0
void RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz, const char *target_vol=0, Bool_t check_norm=kFALSE)
Randomly shoot nrays from point (startx,starty,startz) and plot intersections with surfaces for curre...
TGeoNode * GetCurrentNode() const
void SetNmeshPoints(Int_t npoints=1000)
Set number of points to be generated on the shape outline when checking for overlaps.
void Continue()
Resume a stopped stopwatch.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
void RestoreMasterVolume()
Restore the master volume of the geometry.
TGeoMaterial * GetMaterial() const
TGeoVolume * GetTopVolume() const
static void SetTransform(TGeoMatrix *matrix)
Set current transformation matrix that applies to shape.
void SetOverlap(Double_t ovlp)
virtual void SetPoints(Double_t *points) const =0
virtual const Double_t * GetOrigin() const
void ReleaseInfo()
Release last used state info pointer.
virtual void AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=0, Option_t *option="")
Add a TGeoNode to the list of nodes.
Int_t fNchecks
Selected node for overlap checking.
Int_t GetIndex()
Retreive material index in the list of materials.
Bool_t IsOnScreen() const
check if this node is drawn. Assumes that this node is current
Int_t AddOverlap(const TNamed *ovlp)
Add an illegal overlap/extrusion to the list.
virtual void SetLineColor(Color_t lcolor)
const TGeoMatrix * GetCurrentMatrix() const
Returns global matrix for current node.
Double_t CheckVoxels(TGeoVolume *vol, TGeoVoxelFinder *voxels, Double_t *xyz, Int_t npoints)
count voxel timing
virtual Double_t GetDX() const
const Double_t * GetCurrentPoint() const
Bool_t Contains(const Double_t *point) const
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
Bool_t TestVoxels(TGeoVolume *vol, Int_t npoints=1000000)
Returns optimal voxelization type for volume vol.
Int_t GetIndex(const TGeoNode *node) const
get index number for a given daughter
Int_t IndexOf(const TObject *obj) const
A simple TTree restricted to a list of float variables only.
void ShapeSafety(TGeoShape *shape, Int_t nsamples, Option_t *option)
Check of validity of safe distance for a given shape.
virtual void Draw(Option_t *option="")
Draw this histogram with options.
TGeoNode * Step(Bool_t is_geom=kTRUE, Bool_t cross=kTRUE)
Make a rectiliniar step of length fStep from current point (fPoint) on current direction (fDirection)...
void SetNextPoint(Double_t x, Double_t y, Double_t z)
Set next overlapping point.
virtual void SetFillColor(Color_t fcolor)
Bool_t * fFlags
Array of timing per volume.
virtual Int_t Write(const char *name=0, Int_t opt=0, Int_t bufsiz=0)
Write memory objects to this file.
TGeoNode * FindNextBoundaryAndStep(Double_t stepmax=TGeoShape::Big(), Bool_t compsafe=kFALSE)
Compute distance to next boundary within STEPMAX.
virtual Bool_t IsAssembly() const
Returns true if the volume is an assembly or a scaled assembly.
virtual TObject * RemoveAt(Int_t idx)
Remove object at index idx.
2-D histogram with a float per channel (see TH1 documentation)}
virtual const char * ClassName() const
Returns name of class to which the object belongs.
void SetStep(Double_t step)
Double_t * FindNormalFast()
Computes fast normal to next crossed boundary, assuming that the current point is close enough to the...
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const =0
void RandomPoints(TGeoVolume *vol, Int_t npoints, Option_t *option)
Draw random points in the bounding box of a volume.
virtual void CheckBoundaryReference(Int_t icheck=-1)
Check the boundary errors reference file created by CheckBoundaryErrors method.
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 void LabelsDeflate(Option_t *axis="X")
Reduce the number of bins for the axis passed in the option to the number of bins having a label...
char * Form(const char *fmt,...)
TGeoManager * fGeoManager
TGeoNode * GetMother(Int_t up=1) const
Bool_t SetRawSizes(UInt_t reqPnts, UInt_t reqPntsCapacity, UInt_t reqSegs, UInt_t reqSegsCapacity, UInt_t reqPols, UInt_t reqPolsCapacity)
Set kRaw tessellation section of buffer with supplied sizes.
Generic 3D primitive description class.
virtual const char * GetName() const
Returns name of object.
TSubString Strip(EStripType s=kTrailing, char c= ' ') const
Return a substring of self stripped at beginning and/or end.
TGeoNodeCache * GetCache() const
virtual void SetMarkerStyle(Style_t mstyle=1)
Double_t GetOverlap() const
TGeoNavigator * GetCurrentNavigator() const
Returns current navigator for the calling thread.
R__EXTERN TRandom * gRandom
virtual Color_t GetLineColor() const
1-D histogram with a double per channel (see TH1 documentation)}
virtual void Draw(Option_t *option="")
Draws 3-D polymarker with its current attributes.
TGeoNode * GetNode(const char *name) const
get the pointer to a daughter node
virtual void AddAt(TObject *obj, Int_t idx)
Add object at position ids.
virtual void SetMarkerSize(Size_t msize=1)
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=0) const =0
virtual const char * GetName() const
Get the shape name.
TGeoNode * FindNode(Bool_t safe_start=kTRUE)
Returns deepest node containing current point.
TGeoMaterial * GetMaterial() const
virtual Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=0) const =0
virtual void Draw(Option_t *option="")
Draw this 3-D polyline with its current attributes.
TString & Remove(Ssiz_t pos)
virtual Bool_t cd(const char *path="")
Browse the tree of nodes starting from fTopNode according to pathname.
virtual Int_t SetNextPoint(Double_t x, Double_t y, Double_t z)
Set point following LastPoint to x, y, z.
void OpProgress(const char *opname, Long64_t current, Long64_t size, TStopwatch *watch=0, Bool_t last=kFALSE, Bool_t refresh=kFALSE, const char *msg="")
Print current operation progress.
virtual void SetPoint(Int_t point, Double_t x, Double_t y, Double_t z)
Set point n to x, y, z.
virtual Int_t GetSize() const
TGeoShape * GetShape() const
virtual void SetVisibility(Bool_t vis=kTRUE)
set visibility of this volume
TGeoVoxelFinder * GetVoxels() const
Getter for optimization structure.
TGeoVolume * GetVolume(const char *name) const
Search for a named volume. All trailing blanks stripped.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
void CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option)
Test for shape navigation methods.
ClassImp(TMCParticle) void TMCParticle printf(": p=(%7.3f,%7.3f,%9.3f) ;", fPx, fPy, fPz)
void CdTop()
Make top level node the current node.
void CheckPoint(Double_t x=0, Double_t y=0, Double_t z=0, Option_t *option="")
— Draw point (x,y,z) over the picture of the daughers of the volume containing this point...
static RooMathCoreReg dummy
virtual void Draw(Option_t *opt)
Default Draw method for all objects.
virtual Int_t Fill()
[fNvar] Array of variables
TGeoVolume * GetCurrentVolume() const
void CheckGeometry(Int_t nrays, Double_t startx, Double_t starty, Double_t startz) const
Shoot nrays with random directions from starting point (startx, starty, startz) in the reference fram...
Int_t GetEntries() const
Return the number of objects in array (i.e.
Bool_t IsEntering() const
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
virtual Double_t Capacity() const =0
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual UInt_t SetCanExtend(UInt_t extendBitMask)
make the histogram axes extendable / not extendable according to the bit mask returns the previous bi...
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
Mother of all ROOT objects.
Double_t Weight(Double_t precision=0.01, Option_t *option="v")
Estimate weight of top level volume with a precision SIGMA(W)/W better than PRECISION.
TGeoNode * FindNextBoundary(Double_t stepmax=TGeoShape::Big(), const char *path="", Bool_t frombdr=kFALSE)
Find distance to next boundary and store it in fStep.
virtual Int_t Branch(TCollection *list, Int_t bufsize=32000, Int_t splitlevel=99, const char *name="")
Create one branch for each element in the collection.
TGeoNode * SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil, const char *g3path)
shoot npoints randomly in a box of 1E-5 arround current point.
void CheckGeometryFull(Bool_t checkoverlaps=kTRUE, Bool_t checkcrossings=kTRUE, Int_t nrays=10000, const Double_t *vertex=NULL)
Geometry checking.
virtual Double_t GetRadLen() const
TPolyMarker3D * GetPolyMarker() const
void ShapeDistances(TGeoShape *shape, Int_t nsamples, Option_t *option)
Test TGeoShape::DistFromInside/Outside.
R__EXTERN TGeoIdentity * gGeoIdentity
void SetVisLevel(Int_t level=3)
set default level down to which visualization is performed
virtual void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0)
Automatic pad generation by division.
virtual Double_t GetDensity() const
#define dnext(otri1, otri2)
virtual void MasterToLocal(const Double_t *master, Double_t *local) const
Convert the point coordinates from mother reference to local reference system.
TGeoMedium * GetMedium() const
Double_t * FindNormal(Bool_t forward=kTRUE)
Computes normal vector to the next surface that will be or was already crossed when propagating on a ...
Short_t Max(Short_t a, Short_t b)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual Bool_t IsVisible() const
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
virtual Int_t GetN() const
TObjArray * GetListOfUVolumes() const
virtual Long64_t GetEntries() const
A TTree object has a header with a name and a title.
const char * GetPath() const
Get path to the current node in the form /node0/node1/...
TStopwatch * fTimer
Array of flags per volume.
TObjArray * GetListOfOverlaps()
void FindOverlaps() const
loop all nodes marked as overlaps and find overlaping brothers
Double_t Sqrt(Double_t x)
TObject * At(Int_t idx) const
Int_t * GetOverlaps(Int_t &novlp) const
virtual void FindOverlaps(Int_t inode) const
create the list of nodes for which the bboxes overlap with inode's bbox
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
TGeoNode * FindNextDaughterBoundary(Double_t *point, Double_t *dir, Int_t &idaughter, Bool_t compmatrix=kFALSE)
Computes as fStep the distance to next daughter of the current volume.
virtual void Draw(Option_t *option="")
Draw this shape.
Int_t Fill(Double_t)
Invalid Fill method.
virtual void SetTitle(const char *title="")
Change (i.e. set) the title of the TNamed.
void CheckOverlapsBySampling(TGeoVolume *vol, Double_t ovlp=0.1, Int_t npoints=1000000) const
Check illegal overlaps for volume VOL within a limit OVLP by sampling npoints inside the volume shape...
double norm(double *x, double *p)
static int64_t push(FILE *fp, SOCKET sock, SSL *ssl, const char *buf, int64_t len)
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
void SetOverlaps(Int_t *ovlp, Int_t novlp)
set the list of overlaps for this node (ovlp must be created with operator new)
Int_t NChecksPerVolume(TGeoVolume *vol)
Compute number of overlaps combinations to check per volume.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.