154 static Int_t oseconds = 0;
157 static Int_t nrefresh = 0;
158 const char symbol[4] = {
'=',
'\\',
'|',
'/'};
159 char progress[11] =
" ";
160 Int_t ichar = icount%4;
171 if (ocurrent > osize) ocurrent=osize;
181 if (owatch && !last) {
184 hours = (
Int_t)(time/3600.);
186 minutes = (
Int_t)(time/60.);
188 seconds = (
Int_t)time;
190 if (oseconds==seconds) {
194 oneoftwo = !oneoftwo;
198 if (refresh && oneoftwo) {
204 Double_t percent = 100.0*ocurrent/osize;
206 if (nchar>10) nchar=10;
208 for (i=0; i<nchar; i++) progress[i] =
'=';
209 progress[nchar] = symbol[ichar];
210 for (i=nchar+1; i<10; i++) progress[i] =
' ';
214 if(
size<10000) fprintf(stderr,
"%s [%10s] %4lld ", oname.
Data(), progress, ocurrent);
215 else if(
size<100000) fprintf(stderr,
"%s [%10s] %5lld ",oname.
Data(), progress, ocurrent);
216 else fprintf(stderr,
"%s [%10s] %7lld ",oname.
Data(), progress, ocurrent);
217 if (time>0.) fprintf(stderr,
"[%6.2f %%] TIME %.2d:%.2d:%.2d %s\r", percent, hours, minutes, seconds, message.
Data());
218 else fprintf(stderr,
"[%6.2f %%] %s\r", percent, message.
Data());
219 if (refresh && oneoftwo) oname = nname;
229 fprintf(stderr,
"\n");
241 Info(
"CheckBoundaryErrors",
"Top volume is %s",tvol->
GetName());
255 TTree *bug=
new TTree(
"bug",
"Geometrical problems");
256 bug->
Branch(
"pos",xyz,
"xyz[3]/D");
257 bug->
Branch(
"dir",dir,
"dir[3]/D");
258 bug->
Branch(
"push",&relp,
"push/D");
259 bug->
Branch(
"path",&path,
"path/C");
260 bug->
Branch(
"cdir",&cdir,
"cdir/C");
262 dl[0] =
box->GetDX();
263 dl[1] =
box->GetDY();
264 dl[2] =
box->GetDZ();
265 ori[0] = (
box->GetOrigin())[0];
266 ori[1] = (
box->GetOrigin())[1];
267 ori[2] = (
box->GetOrigin())[2];
269 dl[0] = dl[1] = dl[2] = radius;
272 TH1F *hnew =
new TH1F(
"hnew",
"Precision pushing",30,-20.,10.);
273 TH1F *hold =
new TH1F(
"hold",
"Precision pulling", 30,-20.,10.);
274 TH2F *hplotS =
new TH2F(
"hplotS",
"Problematic points",100,-dl[0],dl[0],100,-dl[1],dl[1]);
280 Long_t n100 = ntracks/100;
282 printf(
"Random box : %f, %f, %f, %f, %f, %f\n", ori[0], ori[1], ori[2], dl[0], dl[1], dl[2]);
283 printf(
"Start... %i points\n", ntracks);
287 while (igen<ntracks) {
299 if (n100 && !(igen%n100))
312 for(
Int_t i=0; i<30; ++i) {
314 for(
Int_t j=0; j<3; ++j) nxyz[j]=xyz[j]+step*(1.+relp)*dir[j];
321 Double_t dotp = norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2];
322 printf(
"Forward error i=%d p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
323 i,xyz[0],xyz[1],xyz[2],step,dotp,path);
325 strncpy(cdir,
"Forward",10);
333 for(
Int_t i=0; i<30; ++i) {
335 for(
Int_t j=0; j<3; ++j) nxyz[j]=xyz[j]+step*(1.+relp)*dir[j];
342 Double_t dotp = norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2];
343 printf(
"Backward error i=%d p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
344 i,xyz[0],xyz[1],xyz[2],step,dotp,path);
345 strncpy(cdir,
"Backward",10);
354 if (itry) printf(
"CPU time/point = %5.2emus: Real time/point = %5.2emus\n",
363 if (itry) printf(
"Effic = %3.1f%%\n",(100.*igen)/itry);
372 new TCanvas(
"c3",
"Plot",600,600);
373 hplotS->
Draw(
"cont0");
404 printf(
"%-9s error push=%g p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
405 cdir,push,xyz[0],xyz[1],xyz[2],1.,1.,path);
412 printf(
"%-9s error push=%g p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n",
413 cdir,push,xyz[0],xyz[1],xyz[2],1.,1.,path);
419 for (
Int_t j=0; j<3; j++) nxyz[j]=xyz[j]+step*(1.+0.1*push)*dir[j];
422 printf(
" -> next = %s push=%g change=%d\n", next->
GetName(),push, (
UInt_t)change);
437 for (
Int_t j=0; j<3; j++) nxyz[j]=xyz[j]+step*dir[j];
487 printf(
"====================================================================\n");
488 printf(
"STAGE 1: Overlap checking by sampling within 10 microns\n");
489 printf(
"====================================================================\n");
493 printf(
"====================================================================\n");
494 printf(
"STAGE 2: Global overlap/extrusion checking within 10 microns\n");
495 printf(
"====================================================================\n");
499 if (!checkcrossings) {
515 printf(
"====================================================================\n");
516 printf(
"STAGE 3: Propagating %i tracks starting from vertex\n and counting number of boundary crossings...\n", ntracks);
517 printf(
"====================================================================\n");
521 memset(point, 0, 3*
sizeof(
Double_t));
526 for (i=0; i<ntracks; i++) {
537 printf(
"No boundary crossed\n");
545 printf(
"Time for crossing %i boundaries: %g [ms]\n", nbound, time1);
546 printf(
"Time per track for full geometry traversal: %g [ms], per crossing: %g [ms]\n", time2, time3);
550 printf(
"====================================================================\n");
551 printf(
"STAGE 4: How much navigation time per volume per next+safety call\n");
552 printf(
"====================================================================\n");
562 strncpy(volname, vol->
GetName(),15);
566 while ((current=next())) {
569 if (
fFlags[uid])
continue;
573 strncpy(volname, vol->
GetName(),15);
583 c1->SetTopMargin(0.15);
584 TFile *
f =
new TFile(
"statistics.root",
"RECREATE");
585 TH1F *
h =
new TH1F(
"h",
"number of boundary crossings per volume",3,0,3);
591 for (i=0; i<nuid; i++) {
597 time_tot_pertrack /= ntracks;
599 h->LabelsOption(
">",
"X");
603 TCanvas *
c2 =
new TCanvas(
"c3",
"time spent per volume in navigation",10,10,900,500);
605 c2->SetTopMargin(0.15);
606 TH2F *h2 =
new TH2F(
"h2",
"time per FNB call vs. ndaughters", 100, 0,100,100,0,15);
609 TH1F *
h1 =
new TH1F(
"h1",
"percent of time spent per volume",3,0,3);
613 for (i=0; i<nuid; i++) {
616 value =
fVal1[i]*
fVal2[i]/ntracks/time_tot_pertrack;
625 c3->SetTopMargin(0.15);
652 printf(
"Error in trying to cross boundary of %s\n", current->
GetName());
698 Error(
"SetNmeshPoints",
"Cannot allow less than 1000 points for checking - set to 1000");
718 Double_t point[3], dir[3], lpt[3], ldir[3];
724 for (
Int_t i=0; i<1000000; i++) {
763 printf(
"Time for volume %s (assemb=%d): %g [ms] ndaughters=%d ncross=%d\n", vol->
GetName(), vol->
IsAssembly(), time_per_track, vol->
GetNdaughters(), ncrossings);
764 return time_per_track;
798 Int_t nelem1, nelem2;
799 Int_t dim1=1000, dim2=1000;
800 if ((startx==0) && (starty==0) && (startz==0)) eps=1E-3;
801 start[0] = startx+eps;
802 start[1] = starty+eps;
803 start[2] = startz+eps;
807 Int_t ist1, ist2, ifound;
808 for (i=0; i<nrays; i++) {
810 if ((i%n10) == 0) printf(
"%i percent\n",
Int_t(100*i/nrays));
820 array1 =
ShootRay(&start[0], dir[0], dir[1], dir[2], array1, nelem1, dim1);
821 if (!nelem1)
continue;
823 memcpy(&end[0], &array1[3*(nelem1-1)], 3*
sizeof(
Double_t));
826 array2 =
ShootRay(&end[0], -dir[0], -dir[1], -dir[2], array2, nelem2, dim2, &start[0]);
828 printf(
"#### NOTHING BACK ###########################\n");
829 for (j=0; j<nelem1; j++) {
831 pm->
SetNextPoint(array1[3*j], array1[3*j+1], array1[3*j+2]);
837 for (j=0; j<k; j++) {
838 memcpy(&dummy[0], &array2[3*j], 3*
sizeof(
Double_t));
839 memcpy(&array2[3*j], &array2[3*(nelem2-1-j)], 3*
sizeof(
Double_t));
840 memcpy(&array2[3*(nelem2-1-j)], &dummy[0], 3*
sizeof(
Double_t));
843 if (nelem1!=nelem2) printf(
"### DIFFERENT SIZES : nelem1=%i nelem2=%i ##########\n", nelem1, nelem2);
847 dx = array1[3*ist1]-array2[3*ist2];
848 dy = array1[3*ist1+1]-array2[3*ist2+1];
849 dz = array1[3*ist1+2]-array2[3*ist2+2];
850 dw = dx*dir[0]+dy*dir[1]+dz*dir[2];
859 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);
861 pm->
SetNextPoint(array2[3*ist2], array2[3*ist2+1], array2[3*ist2+2]);
870 while ((ist1<nelem1-1) && (ist2<nelem2)) {
876 dx = array1[3*ist1+3]-array1[3*ist1];
877 dy = array1[3*ist1+4]-array1[3*ist1+1];
878 dz = array1[3*ist1+5]-array1[3*ist1+2];
880 dwmin = dx+dir[0]+dy*dir[1]+dz*dir[2];
881 while (ist2<nelem2) {
883 dx = array2[3*ist2]-array1[3*ist1];
884 dy = array2[3*ist2+1]-array1[3*ist1+1];
885 dz = array2[3*ist2+2]-array1[3*ist1+2];
886 dw = dx+dir[0]+dy*dir[1]+dz*dir[2];
907 pm->
SetNextPoint(array2[3*ist2], array2[3*ist2+1], array2[3*ist2+2]);
908 printf(
"### EXTRA BOUNDARY %i : %s found at DCLOSE=%f\n", ist2,
fGeoManager->
GetPath(), dw);
918 pm->
SetNextPoint(array2[3*ist1+3], array2[3*ist1+4], array2[3*ist1+5]);
919 printf(
"### BOUNDARY MISSED BACK #########################\n");
953 for (
Int_t i=0; i<numPoints; i++) {
956 if (rsq < 1.e-10)
continue;
979 Bool_t extrude, isextrusion, isoverlapping;
1027 for (ip=0; ip<numPoints2; ip++) {
1028 memcpy(local, &points2[3*ip], 3*
sizeof(
Double_t));
1032 extrude = !shape1->
Contains(local);
1035 if (safety<ovlp) extrude=
kFALSE;
1039 isextrusion =
kTRUE;
1050 for (ip=0; ip<numPoints1; ip++) {
1051 memcpy(local, &points1[3*ip], 3*
sizeof(
Double_t));
1052 if (local[0]<1
e-10 && local[1]<1
e-10)
continue;
1055 extrude = shape2->
Contains(local1);
1063 if (safety<ovlp) extrude=
kFALSE;
1068 isextrusion =
kTRUE;
1083 for (ip=0; ip<numPoints1; ip++) {
1084 memcpy(local, &points1[3*ip], 3*
sizeof(
Double_t));
1085 if (local[0]<1
e-10 && local[1]<1
e-10)
continue;
1091 if (safety<ovlp) overlap=
kFALSE;
1094 if (!isoverlapping) {
1095 isoverlapping =
kTRUE;
1106 for (ip=0; ip<numPoints2; ip++) {
1107 memcpy(local, &points2[3*ip], 3*
sizeof(
Double_t));
1108 if (local[0]<1
e-10 && local[1]<1
e-10)
continue;
1114 if (safety<ovlp) overlap=
kFALSE;
1117 if (!isoverlapping) {
1118 isoverlapping =
kTRUE;
1140 if (!voxels)
return;
1153 Int_t *check_list =
nullptr;
1159 Int_t id=0, id0=0, id1=0;
1171 while (ipoint < npoints) {
1178 if (itry>10000 && !ipoint) {
1179 Error(
"CheckOverlapsBySampling",
"No point inside volume!!! - aborting");
1188 if (!check_list || ncheck<2)
continue;
1189 for (
id=0;
id<ncheck;
id++) {
1190 id0 = check_list[
id];
1197 if (!incrt)
continue;
1209 if (flags)
delete [] flags;
1220 while (cindex >= 0) {
1230 while (cindex >= 0) {
1238 &mat1,&mat2,
kTRUE, safe);
1239 flags[nd*id1+id0] = nodeovlp;
1248 if (flags)
delete [] flags;
1249 if (!novlps)
return;
1253 Info(
"CheckOverlapsBySampling",
"#Found %d overlaps adding-up to %g +/- %g [cm3] for daughters of %s",
1254 novlps, capacity, err*capacity, vol->
GetName());
1272 while ((node=next1())) {
1284 if (nd<2)
return nchecks;
1286 if (!vox)
return nchecks;
1294 for (
id=0;
id<nd;
id++) {
1299 if (!ovlps)
continue;
1300 for (ko=0; ko<novlp; ko++) {
1302 if (io<=
id)
continue;
1309 while ((node=next1())) {
1313 while ((node1=next2())) {
1329 while ((node1=next2())) {
1365 if (!npoints) npoints = 1000000;
1382 while ((node=next1())) {
1396 while ((nodecheck=next1.
GetNode(level--))) {
1417 Warning(
"CheckOverlaps",
"Volume %s with %i daughters but not voxelized", vol->
GetName(),nd);
1431 for (
id=0;
id<nd;
id++) {
1436 if (!ovlps)
continue;
1439 for (ko=0; ko<novlp; ko++) {
1441 if (io<=
id)
continue;
1453 while ((node=next1())) {
1460 while ((node1=next2())) {
1470 while ((nodecheck=next2.
GetNode(level--))) {
1476 while ((nodecheck=next1.
GetNode(level--))) {
1504 while ((nodecheck=next1.
GetNode(level--))) {
1524 while ((node1=next2())) {
1534 while ((nodecheck=next2.
GetNode(level--))) {
1596 printf(
"=== Check current point : (%g, %g, %g) ===\n", point[0], point[1], point[2]);
1602 printf(
"Safety radius : %f\n", close);
1648 Error(
"CheckShape",
"Test number %d not existent", testNo);
1670 const Int_t kNtracks = 1000;
1671 Int_t n10 = nsamples/10;
1678 TH1D *hist =
new TH1D(
"hTest1",
"Residual distance from inside/outside",200,-20, 0);
1686 while (itot<nsamples) {
1696 if ((itot%n10) == 0) printf(
"%i percent\n",
Int_t(100*itot/nsamples));
1698 for (i=0; i<kNtracks; i++) {
1711 printf(
"DistFromInside: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) %f/%f(max)\n",
1712 point[0],point[1],point[2],dir[0],dir[1],dir[2], d1,dmove);
1717 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1718 for (j=0; j<3; j++) pnew[j] = point[j] + d1*dir[j];
1720 pmfrominside->
Draw();
1730 for (j=0; j<3; j++) {
1731 pnew[j] = point[j] + dmove*dir[j];
1736 delta = dmove-d1-d2;
1741 printf(
"Error: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d2=%f dmove=%f\n",
1742 point[0],point[1],point[2],dir[0],dir[1],dir[2], d1,d2,dmove);
1744 printf(
" (*)DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1749 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1750 point[0]+d1*dir[0],point[1]+d1*dir[1], point[2]+d1*dir[2], dir[0],dir[1],dir[2],
dnext);
1752 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) = %f\n",
1753 pnew[0],pnew[1],pnew[2],dnew[0],dnew[1],dnew[2], d2);
1758 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1759 for (j=0; j<3; j++) point[j] += d1*dir[j];
1760 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1761 pmfrominside->
Draw();
1768 for (j=0; j<3; j++) pnew[j] += d2*dnew[j];
1769 if (d2<1E10) pmfromoutside->
SetNextPoint(pnew[0],pnew[1],pnew[2]);
1770 pmfromoutside->
Draw();
1779 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d1p=%f\n",
1780 pnew[0],pnew[1],pnew[2],dnew[0],dnew[1],dnew[2],d1,
dnext);
1785 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1786 for (j=0; j<3; j++) point[j] += d1*dir[j];
1787 pmfrominside->
SetNextPoint(point[0],point[1],point[2]);
1788 pmfrominside->
Draw();
1795 for (j=0; j<3; j++) pnew[j] +=
dnext*dnew[j];
1796 if (d2<1E10) pmfromoutside->
SetNextPoint(pnew[0],pnew[1],pnew[2]);
1797 pmfromoutside->
Draw();
1800 if (
TMath::Abs(delta) < 1E-20) delta = 1E-30;
1806 new TCanvas(
"Test01",
"Residuals DistFromInside/Outside", 800, 600);
1822 const Int_t kNtracks = 1000;
1823 Int_t n10 = nsamples/10;
1835 while (itot<nsamples) {
1844 if ((itot%n10) == 0) printf(
"%i percent\n",
Int_t(100*itot/nsamples));
1846 for (i=0; i<kNtracks; i++) {
1855 printf(
"Error safety (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) safe=%f dist=%f\n",
1856 point[0],point[1],point[2], dir[0], dir[1], dir[2], safe, dist);
1864 pm1->
SetNextPoint(point[0]+safe*dir[0],point[1]+safe*dir[1],point[2]+safe*dir[2]);
1870 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;
1901 while (itot<nsamples) {
1907 inside = shape->
Contains(&spoint[3*itot]);
1916 Double_t point[3],newpoint[3], oldpoint[3];
1918 Double_t norm[3], newnorm[3], oldnorm[3];
1929 for (itot = 0; itot<nsamples; itot++) {
1931 if ((itot%n10) == 0) printf(
"%i percent\n",
Int_t(100*itot/nsamples));
1933 oldnorm[0] = oldnorm[1] = oldnorm[2] = 0.;
1935 for (
Int_t j=0; j<3; j++) {
1936 oldpoint[j] = point[j] = spoint[3*itot+j];
1937 olddir[j] = dir[j] = sdir[3*itot+j];
1939 for (i=0; i<kNtracks; i++) {
1940 if (errcnt>0)
break;
1942 for (
Int_t j=0; j<3; j++) {
1943 newpoint[j] = point[j] + dist*dir[j];
1947 dot = olddir[0]*oldnorm[0]+olddir[1]*oldnorm[1]+ olddir[2]*oldnorm[2];
1950 printf(
"Error point outside (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
1951 point[0],point[1],point[2], dir[0], dir[1], dir[2], dist, olddist);
1952 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n",
1953 oldpoint[0],oldpoint[1],oldpoint[2], olddir[0], olddir[1], olddir[2]);
1962 pm1->
SetNextPoint(oldpoint[0],oldpoint[1],oldpoint[2]);
1969 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
1970 point[0],point[1],point[2], dir[0], dir[1], dir[2], dist, olddist);
1971 printf(
" new norm: (%g, %g, %g)\n", newnorm[0], newnorm[1], newnorm[2]);
1972 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n",
1973 oldpoint[0],oldpoint[1],oldpoint[2], olddir[0], olddir[1], olddir[2]);
1974 printf(
" old norm: (%g, %g, %g)\n", oldnorm[0], oldnorm[1], oldnorm[2]);
1983 pm1->
SetNextPoint(oldpoint[0],oldpoint[1],oldpoint[2]);
1989 for (
Int_t j=0; j<3; j++) {
1990 oldpoint[j] = point[j];
1991 point[j] += dist*dir[j];
1996 printf(
"Error safety (%19.15f, %19.15f, %19.15f) safe=%g\n",
1997 point[0],point[1],point[2], safe);
2010 memcpy(oldnorm, norm, 3*
sizeof(
Double_t));
2011 memcpy(olddir, dir, 3*
sizeof(
Double_t));
2018 ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
2021 if ((itot%10) == 0) pm2->
SetNextPoint(point[0],point[1],point[2]);
2044 TH2F *hist =
new TH2F(
"lego", option, nphi, phimin, phimax, ntheta, themin, themax);
2053 Int_t ntot = ntheta * nphi;
2054 Int_t n10 = ntot/10;
2055 Int_t igen = 0, iloop=0;
2056 printf(
"=== Lego plot sph. => nrays=%i\n", ntot);
2057 for (i=1; i<=nphi; i++) {
2058 for (j=1; j<=ntheta; j++) {
2061 if ((igen%n10) == 0) printf(
"%i percent\n",
Int_t(100*igen/ntot));
2066 start[0] = start[1] = start[2] = 1E-3;
2092 if (iloop>1000) printf(
"%i steps\n", iloop);
2096 if (endnode==0 && step>1E10)
break;
2098 startnode = endnode;
2109 hist->
Fill(phi, theta,
x);
2136 printf(
"Random box : %f, %f, %f\n", dx, dy, dz);
2138 printf(
"Start... %i points\n", npoints);
2142 Int_t n10 = npoints/10;
2144 while (igen<npoints) {
2151 if ((igen%n10) == 0) printf(
"%i percent\n",
Int_t(100*igen/npoints));
2154 if (!node)
continue;
2160 if ((ic<0) || (ic>=128)) ic = 1;
2167 pm->
AddAt(marker, ic);
2172 printf(
"Number of visible points : %i\n", i);
2174 printf(
"efficiency : %g\n", ratio);
2177 if (marker) marker->
Draw(
"SAME");
2181 printf(
"---Make them visible with : gGeoManager->GetTopVolume()->VisibleDaughters();\n");
2208 printf(
"Start... %i rays\n", nrays);
2212 Int_t ipoint, inull;
2225 while (itot<nrays) {
2230 if ((itot%n10) == 0) printf(
"%i percent\n",
Int_t(100*itot/nrays));
2258 line->SetPoint(ipoint++, start[0], start[1], start[2]);
2278 line->SetPoint(ipoint, point[0], point[1], point[2]);
2279 if (!vis2 && check_norm) {
2283 normline->
SetPoint(0, point[0], point[1], point[2]);
2284 normline->
SetPoint(1, point[0]+normal[0]*normlen,
2285 point[1]+normal[1]*normlen,
2286 point[2]+normal[2]*normlen);
2296 line->SetPoint(ipoint++, point[0], point[1], point[2]);
2302 normline->
SetPoint(0, point[0], point[1], point[2]);
2303 normline->
SetPoint(1, point[0]+normal[0]*normlen,
2304 point[1]+normal[1]*normlen,
2305 point[2]+normal[2]*normlen);
2308 if (!random) pm->
Add(normline);
2317 printf(
"number of segments : %i\n", i);
2337 if (!node) {dist=-1;
return 0;}
2339 if (strlen(g3path)) hasg3 =
kTRUE;
2352 eps[0] = epsil; eps[1]=epsil; eps[2]=epsil;
2359 index = spath.
Index(
"/", index+1);
2361 name = spath(0, index);
2362 if (strstr(g3path,
name.Data())) {
2369 if (strlen(common.
Data())) {
2380 if (!nodegeo)
return 0;
2381 if (!nodeg3)
return 0;
2385 for (
Int_t i=0; i<npoints; i++) {
2386 xyz[0] = point[0] - eps[0] + 2*eps[0]*
gRandom->
Rndm();
2387 xyz[1] = point[1] - eps[1] + 2*eps[1]*
gRandom->
Rndm();
2388 xyz[2] = point[2] - eps[2] + 2*eps[2]*
gRandom->
Rndm();
2391 dist1 =
TMath::Sqrt((xyz[0]-point[0])*(xyz[0]-point[0])+
2392 (xyz[1]-point[1])*(xyz[1]-point[1])+(xyz[2]-point[2])*(xyz[2]-point[2]));
2404 if (!node_close) dist = -1;
2409 memcpy(&point[0], pointg, 3*
sizeof(
Double_t));
2410 for (
Int_t i=0; i<npoints; i++) {
2417 dist1 =
TMath::Sqrt((point[0]-pointg[0])*(point[0]-pointg[0])+
2418 (point[1]-pointg[1])*(point[1]-pointg[1])+(point[2]-pointg[2])*(point[2]-pointg[2]));
2422 memcpy(&closest[0], pointg, 3*
sizeof(
Double_t));
2432 if (!node_close) dist=-1;
2446 printf(
"empty input array\n");
2464 if (step>1E10)
return array;
2469 forward = dirx*(endpoint[0]-point[0])+diry*(endpoint[1]-point[1])+dirz*(endpoint[2]-point[2]);
2478 memcpy(temparray, array, 3*dim*
sizeof(
Double_t));
2483 memcpy(&array[3*nelem], point, 3*
sizeof(
Double_t));
2487 if (endnode==0 && step>1E10) {
2506 if (istep>0) printf(
"%i steps\n", istep);
2509 memcpy(temparray, array, 3*dim*
sizeof(
Double_t));
2514 memcpy(&array[3*nelem], point, 3*
sizeof(
Double_t));
2533 Bool_t recheck = !strcmp(option,
"RECHECK");
2534 if (recheck) printf(
"RECHECK\n");
2544 printf(
"Random box : %f, %f, %f\n", dx, dy, dz);
2547 for (i=0; i<npoints; i++) {
2553 printf(
"Generation time :\n");
2557 printf(
"Start... %i points\n", npoints);
2559 for (i=0; i<npoints; i++) {
2565 if (node1 != node) {
2566 printf(
"Difference for x=%g y=%g z=%g\n", xyz[3*i], xyz[3*i+1], xyz[3*i+2]);
2567 printf(
" from top : %s\n", node->
GetName());
2584 printf(
"Checking overlaps for path :\n");
2589 Int_t npoints = 1000000;
2617 if (!shape->
Contains(point))
continue;
2639 ntpl->
Draw(
"z:y:x");
2646 printf(
"using FindNode...\n");
2647 for (
Int_t j=0; j<npoints; j++) {
2654 markthis->
SetNextPoint(xyz[3*j], xyz[3*j+1], xyz[3*j+2]);
2660 if (ic >= 128) ic = 0;
2665 pm->
AddAt(marker, ic);
2668 marker->
SetNextPoint(xyz[3*j], xyz[3*j+1], xyz[3*j+2]);
2670 if (overlaps->
IndexOf(node) < 0) overlaps->
Add(node);
2678 markthis->
Draw(
"SAME");
2682 printf(
"list of overlapping nodes :\n");
2686 else printf(
"%s ONLY\n", node->
GetName());
2688 }
else printf(
"No overlaps\n");
2703 if (!nmat)
return 0;
2705 memset(nin, 0, nmat*
sizeof(
Int_t));
2732 if (!node)
continue;
2735 if (indmat<0)
continue;
2738 if ((iin%100000)==0 || igen>1E8) {
2741 for (indmat=0; indmat<nmat; indmat++) {
2744 if (dens<1E-2) dens=0;
2746 weight += dens*
Double_t(nin[indmat]);
2747 sigma += dens*dens*nin[indmat];
2753 if (eps<precision || igen>1E8) {
2755 printf(
"=== Weight of %s : %g +/- %g [kg]\n",
2760 if (isverbose && eps<0.5*eps0) {
2761 printf(
"%8dK: %14.7g kg %g %%\n",
2762 igen/1000, weight, eps*100);
2788 for (
Int_t i=0; i<npoints; i++) {
2790 if (!shape->
Contains(point))
continue;
2792 if (!checklist)
continue;
2793 if (!ncheck)
continue;
2794 for (
Int_t id=0;
id<ncheck;
id++) {
2795 node = vol->
GetNode(checklist[
id]);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
R__EXTERN TGeoIdentity * gGeoIdentity
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
R__EXTERN TStyle * gStyle
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual Color_t GetLineColor() const
Return the line color.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
Generic 3D primitive description class.
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.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Geometry checking package.
Int_t PropagateInGeom(Double_t *, Double_t *)
Propagate from START along DIR from boundary to boundary until exiting geometry.
Int_t fNchecks
Selected node for overlap checking.
void CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option)
Test for shape navigation methods.
Bool_t * fFlags
Array of timing per volume.
TStopwatch * fTimer
Array of flags per volume.
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...
TGeoChecker()
Default constructor.
virtual ~TGeoChecker()
Destructor.
void ShapeNormal(TGeoShape *shape, Int_t nsamples, Option_t *option)
Check of validity of the normal for a given shape.
void CheckOverlaps(const TGeoVolume *vol, Double_t ovlp=0.1, Option_t *option="")
Check illegal overlaps for volume VOL within a limit OVLP.
void TestOverlaps(const char *path)
Geometry overlap checker based on sampling.
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.
Double_t * fVal2
Array of number of crossings per volume.
TGeoManager * fGeoManager
void ShapeDistances(TGeoShape *shape, Int_t nsamples, Option_t *option)
Test TGeoShape::DistFromInside/Outside.
Int_t NChecksPerVolume(TGeoVolume *vol)
Compute number of overlaps combinations to check per volume.
void ShapeSafety(TGeoShape *shape, Int_t nsamples, Option_t *option)
Check of validity of safe distance for a given shape.
void Score(TGeoVolume *, Int_t, Double_t)
Score a hit for VOL.
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 CleanPoints(Double_t *points, Int_t &numPoints) const
Number of points on mesh to be checked.
TGeoNode * SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil, const char *g3path)
shoot npoints randomly in a box of 1E-5 around current point.
TGeoNode * fSelectedNode
Timer.
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.
void CheckGeometryFull(Bool_t checkoverlaps=kTRUE, Bool_t checkcrossings=kTRUE, Int_t nrays=10000, const Double_t *vertex=NULL)
Geometry checking.
Int_t fNmeshPoints
Number of checks for current volume.
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...
virtual void CheckBoundaryReference(Int_t icheck=-1)
Check the boundary errors reference file created by CheckBoundaryErrors method.
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 daughters of the volume containing this point.
void SetNmeshPoints(Int_t npoints=1000)
Set number of points to be generated on the shape outline when checking for overlaps.
void PrintOverlaps() const
Print the current list of overlaps held by the manager class.
void Test(Int_t npoints, Option_t *option)
Check time of finding "Where am I" for n points.
Double_t TimingPerVolume(TGeoVolume *)
Compute timing per "FindNextBoundary" + "Safety" call.
Bool_t TestVoxels(TGeoVolume *vol, Int_t npoints=1000000)
Returns optimal voxelization type for volume vol.
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.
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...
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 RandomPoints(TGeoVolume *vol, Int_t npoints, Option_t *option)
Draw random points in the bounding box of a volume.
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...
Double_t CheckVoxels(TGeoVolume *vol, TGeoVoxelFinder *voxels, Double_t *xyz, Int_t npoints)
count voxel timing
Matrix class used for computing global transformations Should NOT be used for node definition.
void Multiply(const TGeoMatrix *right)
multiply to the right with an other transformation if right is identity matrix, just return
const TGeoMatrix * GetCurrentMatrix() const
Returns global matrix for current node.
void SetTopName(const char *name)
Set the top name for path.
void Reset(TGeoVolume *top=0)
Resets the iterator for volume TOP.
void GetPath(TString &path) const
Returns the path for the current node.
TGeoNode * GetNode(Int_t level) const
Returns current node at a given level.
void Skip()
Stop iterating the current branch.
The manager class for any TGeo geometry.
TGeoNode * GetMother(Int_t up=1) const
Double_t * FindNormalFast()
Computes fast normal to next crossed boundary, assuming that the current point is close enough to the...
TObjArray * GetListOfUVolumes() const
TObjArray * GetListOfOverlaps()
void CdUp()
Go one level up in geometry.
virtual Bool_t cd(const char *path="")
Browse the tree of nodes starting from fTopNode according to pathname.
void LocalToMaster(const Double_t *local, Double_t *master) const
void RestoreMasterVolume()
Restore the master volume of the geometry.
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.
TGeoNavigator * GetCurrentNavigator() const
Returns current navigator for the calling thread.
TGeoVolume * GetMasterVolume() const
TGeoNode * GetCurrentNode() const
void SetCurrentDirection(Double_t *dir)
void SetVisLevel(Int_t level=3)
set default level down to which visualization is performed
TGeoNode * FindNextBoundary(Double_t stepmax=TGeoShape::Big(), const char *path="", Bool_t frombdr=kFALSE)
Find distance to next boundary and store it in fStep.
TGeoNode * Step(Bool_t is_geom=kTRUE, Bool_t cross=kTRUE)
Make a rectilinear step of length fStep from current point (fPoint) on current direction (fDirection)...
TGeoVolume * GetVolume(const char *name) const
Search for a named volume. All trailing blanks stripped.
TGeoNode * FindNextBoundaryAndStep(Double_t stepmax=TGeoShape::Big(), Bool_t compsafe=kFALSE)
Compute distance to next boundary within STEPMAX.
void SetCurrentPoint(Double_t *point)
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 ...
TGeoNode * FindNode(Bool_t safe_start=kTRUE)
Returns deepest node containing current point.
const Double_t * GetCurrentPoint() const
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.
TGeoNode * InitTrack(const Double_t *point, const Double_t *dir)
Initialize current point and current direction vector (normalized) in MARS.
TGeoHMatrix * GetCurrentMatrix() const
TGeoNode * GetTopNode() 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.
const char * GetPath() const
Get path to the current node in the form /node0/node1/...
Int_t AddOverlap(const TNamed *ovlp)
Add an illegal overlap/extrusion to the list.
static void SetVerboseLevel(Int_t vl)
Return current verbosity level (static function).
void SetStep(Double_t step)
TGeoVolume * GetCurrentVolume() const
static Int_t GetVerboseLevel()
Set verbosity level (static function).
void CdTop()
Make top level node the current node.
Double_t Safety(Bool_t inside=kFALSE)
Compute safe distance from the current point.
void MasterToLocal(const Double_t *master, Double_t *local) const
void ResetState()
Reset current state flags.
void CdDown(Int_t index)
Make a daughter of current node current.
TList * GetListOfMaterials() const
TGeoVolume * GetTopVolume() const
void SetTopVisible(Bool_t vis=kTRUE)
make top volume visible on screen
void CheckOverlaps(Double_t ovlp=0.1, Option_t *option="")
Check all geometry for illegal overlaps within a limit OVLP.
Bool_t IsEntering() const
Base class describing materials.
Int_t GetIndex()
Retrieve material index in the list of materials.
virtual Double_t GetRadLen() const
virtual Double_t GetDensity() const
Geometrical transformation package.
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
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 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
TGeoMaterial * GetMaterial() const
Class providing navigation API for TGeo geometries.
TGeoNodeCache * GetCache() const
TGeoStateInfo * GetInfo()
Get next state info pointer.
void ReleaseInfo()
Release last used state info pointer.
A node represent a volume positioned inside another.They store links to both volumes and to the TGeoM...
Bool_t IsOverlapping() const
Bool_t IsOnScreen() const
check if this node is drawn. Assumes that this node is current
TGeoVolume * GetVolume() const
void SetOverlaps(Int_t *ovlp, Int_t novlp)
set the list of overlaps for this node (ovlp must be created with operator new)
virtual TGeoMatrix * GetMatrix() const =0
Int_t * GetOverlaps(Int_t &novlp) const
virtual void MasterToLocal(const Double_t *master, Double_t *local) const
Convert the point coordinates from mother reference to local reference system.
void InspectNode() const
Inspect this node.
Base class describing geometry overlaps.
TPolyMarker3D * GetPolyMarker() const
void SetNextPoint(Double_t x, Double_t y, Double_t z)
Set next overlapping point.
void SetOverlap(Double_t ovlp)
virtual void PrintInfo() const
Print some info.
Double_t GetOverlap() const
Base abstract class for all shapes.
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)=0
virtual void GetMeshNumbers(Int_t &, Int_t &, Int_t &) const
virtual Bool_t GetPointsOnSegments(Int_t npoints, Double_t *array) const =0
static void SetTransform(TGeoMatrix *matrix)
Set current transformation matrix that applies to shape.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const =0
virtual const char * GetName() const
Get the shape name.
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 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 Double_t Capacity() const =0
virtual Bool_t Contains(const Double_t *point) const =0
static Double_t Tolerance()
virtual void SetPoints(Double_t *points) const =0
virtual void Draw(Option_t *option="")
Draw this shape.
Class describing translations.
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
TGeoMedium * GetMedium() const
Bool_t Contains(const Double_t *point) const
TGeoMaterial * GetMaterial() const
Int_t GetNdaughters() const
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=0, Option_t *option="")
Add a TGeoNode to the list of nodes.
void VisibleDaughters(Bool_t vis=kTRUE)
set visibility for daughters
void FindOverlaps() const
loop all nodes marked as overlaps and find overlapping brothers
TGeoNode * GetNode(const char *name) const
get the pointer to a daughter node
virtual void SetVisibility(Bool_t vis=kTRUE)
set visibility of this volume
Int_t GetIndex(const TGeoNode *node) const
get index number for a given daughter
TGeoPatternFinder * GetFinder() const
TGeoVoxelFinder * GetVoxels() const
Getter for optimization structure.
TGeoShape * GetShape() const
virtual void Draw(Option_t *option="")
draw top volume according to option
virtual Int_t GetCurrentNodeIndex() const
virtual void DrawOnly(Option_t *option="")
draw only this volume
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual Bool_t IsAssembly() const
Returns true if the volume is an assembly or a scaled assembly.
virtual Bool_t IsVisible() const
void InspectShape() const
Finder class handling voxels.
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 Voxelize(Option_t *option="")
Voxelize attached volume according to option If the volume is an assembly, make sure the bbox is comp...
virtual void FindOverlaps(Int_t inode) const
create the list of nodes for which the bboxes overlap with inode's bbox
Bool_t NeedRebuild() const
1-D histogram with a double per channel (see TH1 documentation)}
1-D histogram with a float per channel (see TH1 documentation)}
virtual void LabelsOption(Option_t *option="h", Option_t *axis="X")
Sort bins with labels or set option(s) to draw axis with labels.
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
TAxis * GetXaxis()
Get the behaviour adopted by the object about the statoverflows. See EStatOverflows for more informat...
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
virtual UInt_t SetCanExtend(UInt_t extendBitMask)
Make the histogram axes extendable / not extendable according to the bit mask returns the previous bi...
virtual void Draw(Option_t *option="")
Draw this histogram with options.
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.
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
2-D histogram with a float per channel (see TH1 documentation)}
Int_t Fill(Double_t)
Invalid Fill method.
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
virtual const char * GetName() const
Returns name of object.
A simple TTree restricted to a list of float variables only.
virtual Int_t Fill()
Fill a Ntuple with current values in fArgs.
Int_t IndexOf(const TObject *obj) const
Int_t GetEntriesFast() const
Int_t GetEntries() const
Return the number of objects in array (i.e.
virtual void AddAt(TObject *obj, Int_t idx)
Add object at position ids.
virtual TObject * RemoveAt(Int_t idx)
Remove object at index idx.
TObject * At(Int_t idx) const
Mother of all ROOT objects.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
A 3-dimensional polyline.
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 GetN() const
virtual Int_t SetNextPoint(Double_t x, Double_t y, Double_t z)
Set point following LastPoint to x, y, z.
virtual void Draw(Option_t *option="")
Draws 3-D polymarker with its current attributes.
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
virtual Double_t Rndm()
Machine independent random number generator.
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
Double_t CpuTime()
Stop the stopwatch (if it is running) and return the cputime (in seconds) passed between the start an...
void Continue()
Resume a stopped stopwatch.
void Stop()
Stop the stopwatch.
void Print(Option_t *option="") const
Print the real and cpu time passed between the start and stop events.
void ToLower()
Change string to lower-case.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
const char * Data() const
TString & Remove(Ssiz_t pos)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
A TTree represents a columnar dataset.
virtual Int_t Fill()
Fill all branches.
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
virtual Int_t SetBranchAddress(const char *bname, void *add, TBranch **ptr=0)
Change branch address, dealing with clone trees properly.
virtual Long64_t GetEntries() const
TBranch * Branch(const char *name, T *obj, Int_t bufsize=32000, Int_t splitlevel=99)
Add a new branch, and infer the data type from the type of obj being passed.
virtual void Draw(Option_t *opt)
Default Draw method for all objects.
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Short_t Max(Short_t a, Short_t b)
Double_t Sqrt(Double_t x)
Short_t Min(Short_t a, Short_t b)
constexpr Double_t TwoPi()
Statefull info for the current geometry level.
#define dnext(otri1, otri2)
#define lnext(otri1, otri2)