107 fSelectedNode(nullptr),
127 fSelectedNode(nullptr),
152 Bool_t refresh,
const char *msg)
159 static Int_t oseconds = 0;
162 static Int_t nrefresh = 0;
163 const char symbol[4] = {
'=',
'\\',
'|',
'/'};
164 char progress[11] =
" ";
165 Int_t ichar = icount % 4;
177 if (ocurrent > osize)
189 if (owatch && !last) {
192 hours = (
Int_t)(time / 3600.);
193 time -= 3600 * hours;
194 minutes = (
Int_t)(time / 60.);
195 time -= 60 * minutes;
196 seconds = (
Int_t)time;
198 if (oseconds == seconds) {
202 oneoftwo = !oneoftwo;
206 if (refresh && oneoftwo) {
218 for (i = 0; i <
nchar; i++)
220 progress[
nchar] = symbol[ichar];
221 for (i =
nchar + 1; i < 10; i++)
227 fprintf(stderr,
"%s [%10s] %4lld ", oname.
Data(), progress, ocurrent);
228 else if (
size < 100000)
229 fprintf(stderr,
"%s [%10s] %5lld ", oname.
Data(), progress, ocurrent);
231 fprintf(stderr,
"%s [%10s] %7lld ", oname.
Data(), progress, ocurrent);
233 fprintf(stderr,
"[%6.2f %%] TIME %.2d:%.2d:%.2d %s\r",
percent, hours, minutes, seconds, message.
Data());
235 fprintf(stderr,
"[%6.2f %%] %s\r",
percent, message.
Data());
236 if (refresh && oneoftwo)
248 fprintf(stderr,
"\n");
260 Info(
"CheckBoundaryErrors",
"Top volume is %s", tvol->
GetName());
274 TTree *bug =
new TTree(
"bug",
"Geometrical problems");
275 bug->
Branch(
"pos", xyz,
"xyz[3]/D");
276 bug->
Branch(
"dir", dir,
"dir[3]/D");
277 bug->
Branch(
"push", &relp,
"push/D");
278 bug->
Branch(
"path", &path,
"path/C");
279 bug->
Branch(
"cdir", &cdir,
"cdir/C");
281 dl[0] =
box->GetDX();
282 dl[1] =
box->GetDY();
283 dl[2] =
box->GetDZ();
284 ori[0] = (
box->GetOrigin())[0];
285 ori[1] = (
box->GetOrigin())[1];
286 ori[2] = (
box->GetOrigin())[2];
288 dl[0] = dl[1] = dl[2] = radius;
291 TH1F *hnew =
new TH1F(
"hnew",
"Precision pushing", 30, -20., 10.);
292 TH1F *hold =
new TH1F(
"hold",
"Precision pulling", 30, -20., 10.);
293 TH2F *hplotS =
new TH2F(
"hplotS",
"Problematic points", 100, -dl[0], dl[0], 100, -dl[1], dl[1]);
299 Long_t n100 = ntracks / 100;
301 printf(
"Random box : %f, %f, %f, %f, %f, %f\n", ori[0], ori[1], ori[2], dl[0], dl[1], dl[2]);
302 printf(
"Start... %i points\n", ntracks);
307 while (igen < ntracks) {
320 if (n100 && !(igen % n100))
333 for (
Int_t i = 0; i < 30; ++i) {
335 for (
Int_t j = 0; j < 3; ++j)
336 nxyz[j] = xyz[j] + step * (1. + relp) * dir[j];
343 Double_t dotp = norm[0] * dir[0] + norm[1] * dir[1] + norm[2] * dir[2];
344 printf(
"Forward error i=%d p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n", i, xyz[0], xyz[1], xyz[2],
347 strncpy(cdir,
"Forward", 10);
355 for (
Int_t i = 0; i < 30; ++i) {
357 for (
Int_t j = 0; j < 3; ++j)
358 nxyz[j] = xyz[j] + step * (1. + relp) * dir[j];
365 Double_t dotp = norm[0] * dir[0] + norm[1] * dir[1] + norm[2] * dir[2];
366 printf(
"Backward error i=%d p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n", i, xyz[0], xyz[1], xyz[2],
368 strncpy(cdir,
"Backward", 10);
378 printf(
"CPU time/point = %5.2emus: Real time/point = %5.2emus\n", 1000000. *
fTimer->
CpuTime() / itry,
388 printf(
"Effic = %3.1f%%\n", (100. * igen) / itry);
397 new TCanvas(
"c3",
"Plot", 600, 600);
398 hplotS->
Draw(
"cont0");
429 printf(
"%-9s error push=%g p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n", cdir, push, xyz[0], xyz[1],
430 xyz[2], 1., 1., path);
438 printf(
"%-9s error push=%g p=%5.4f %5.4f %5.4f s=%5.4f dot=%5.4f path=%s\n", cdir, push, xyz[0], xyz[1], xyz[2],
445 for (
Int_t j = 0; j < 3; j++)
446 nxyz[j] = xyz[j] + step * (1. + 0.1 * push) * dir[j];
449 printf(
" -> next = %s push=%g change=%d\n", next->
GetName(), push, (
UInt_t)change);
465 for (
Int_t j = 0; j < 3; j++)
466 nxyz[j] = xyz[j] + step * dir[j];
513 TCanvas *
c =
new TCanvas(
"overlaps",
"Overlaps by sampling", 800, 800);
517 printf(
"====================================================================\n");
518 printf(
"STAGE 1: Overlap checking by sampling within 10 microns\n");
519 printf(
"====================================================================\n");
523 printf(
"====================================================================\n");
524 printf(
"STAGE 2: Global overlap/extrusion checking within 10 microns\n");
525 printf(
"====================================================================\n");
529 if (!checkcrossings) {
545 printf(
"====================================================================\n");
546 printf(
"STAGE 3: Propagating %i tracks starting from vertex\n and counting number of boundary crossings...\n",
548 printf(
"====================================================================\n");
552 memset(point, 0, 3 *
sizeof(
Double_t));
554 memcpy(point, vertex, 3 *
sizeof(
Double_t));
558 for (i = 0; i < ntracks; i++) {
570 printf(
"No boundary crossed\n");
578 printf(
"Time for crossing %i boundaries: %g [ms]\n", nbound, time1);
579 printf(
"Time per track for full geometry traversal: %g [ms], per crossing: %g [ms]\n", time2, time3);
583 printf(
"====================================================================\n");
584 printf(
"STAGE 4: How much navigation time per volume per next+safety call\n");
585 printf(
"====================================================================\n");
595 strncpy(volname, vol->
GetName(), 15);
599 while ((current = next())) {
607 strncpy(volname, vol->
GetName(), 15);
617 c1->SetTopMargin(0.15);
618 TFile *
f =
new TFile(
"statistics.root",
"RECREATE");
619 TH1F *
h =
new TH1F(
"h",
"number of boundary crossings per volume", 3, 0, 3);
625 for (i = 0; i < nuid; i++) {
632 time_tot_pertrack /= ntracks;
634 h->LabelsOption(
">",
"X");
637 TCanvas *
c2 =
new TCanvas(
"c3",
"time spent per volume in navigation", 10, 10, 900, 500);
639 c2->SetTopMargin(0.15);
640 TH2F *h2 =
new TH2F(
"h2",
"time per FNB call vs. ndaughters", 100, 0, 100, 100, 0, 15);
642 h2->SetMarkerStyle(2);
643 TH1F *
h1 =
new TH1F(
"h1",
"percent of time spent per volume", 3, 0, 3);
647 for (i = 0; i < nuid; i++) {
660 c3->SetTopMargin(0.15);
687 printf(
"Error in trying to cross boundary of %s\n", current->
GetName());
731 if (npoints < 1000) {
732 Error(
"SetNmeshPoints",
"Cannot allow less than 1000 points for checking - set to 1000");
752 Double_t point[3], dir[3], lpt[3], ldir[3];
758 for (
Int_t i = 0; i < 1000000; i++) {
796 printf(
"Time for volume %s (shape=%s): %g [ms] ndaughters=%d ncross=%d\n", vol->
GetName(),
799 printf(
"Time for volume %s (assemb=%d): %g [ms] ndaughters=%d ncross=%d\n", vol->
GetName(), vol->
IsAssembly(),
801 return time_per_track;
835 Int_t nelem1, nelem2;
836 Int_t dim1 = 1000, dim2 = 1000;
837 if ((startx == 0) && (starty == 0) && (startz == 0))
839 start[0] = startx + eps;
840 start[1] = starty + eps;
841 start[2] = startz + eps;
842 Int_t n10 = nrays / 10;
845 Int_t ist1, ist2, ifound;
846 for (i = 0; i < nrays; i++) {
849 printf(
"%i percent\n",
Int_t(100 * i / nrays));
859 array1 =
ShootRay(&start[0], dir[0], dir[1], dir[2], array1, nelem1, dim1);
863 memcpy(&end[0], &array1[3 * (nelem1 - 1)], 3 *
sizeof(
Double_t));
866 array2 =
ShootRay(&end[0], -dir[0], -dir[1], -dir[2], array2, nelem2, dim2, &start[0]);
868 printf(
"#### NOTHING BACK ###########################\n");
869 for (j = 0; j < nelem1; j++) {
871 pm->
SetNextPoint(array1[3 * j], array1[3 * j + 1], array1[3 * j + 2]);
876 Int_t k = nelem2 >> 1;
877 for (j = 0; j < k; j++) {
878 memcpy(&dummy[0], &array2[3 * j], 3 *
sizeof(
Double_t));
879 memcpy(&array2[3 * j], &array2[3 * (nelem2 - 1 - j)], 3 *
sizeof(
Double_t));
880 memcpy(&array2[3 * (nelem2 - 1 - j)], &dummy[0], 3 *
sizeof(
Double_t));
883 if (nelem1 != nelem2)
884 printf(
"### DIFFERENT SIZES : nelem1=%i nelem2=%i ##########\n", nelem1, nelem2);
888 dx = array1[3 * ist1] - array2[3 * ist2];
889 dy = array1[3 * ist1 + 1] - array2[3 * ist2 + 1];
890 dz = array1[3 * ist1 + 2] - array2[3 * ist2 + 2];
891 dw = dx * dir[0] + dy * dir[1] + dz * dir[2];
900 printf(
"### NOT MATCHING %i f:(%f, %f, %f) b:(%f %f %f) DCLOSE=%f\n", ist2, array1[3 * ist1],
901 array1[3 * ist1 + 1], array1[3 * ist1 + 2], array2[3 * ist2], array2[3 * ist2 + 1],
902 array2[3 * ist2 + 2], dw);
904 pm->
SetNextPoint(array2[3 * ist2], array2[3 * ist2 + 1], array2[3 * ist2 + 2]);
913 while ((ist1 < nelem1 - 1) && (ist2 < nelem2)) {
919 dx = array1[3 * ist1 + 3] - array1[3 * ist1];
920 dy = array1[3 * ist1 + 4] - array1[3 * ist1 + 1];
921 dz = array1[3 * ist1 + 5] - array1[3 * ist1 + 2];
923 dwmin = dx + dir[0] + dy * dir[1] + dz * dir[2];
924 while (ist2 < nelem2) {
926 dx = array2[3 * ist2] - array1[3 * ist1];
927 dy = array2[3 * ist2 + 1] - array1[3 * ist1 + 1];
928 dz = array2[3 * ist2 + 2] - array1[3 * ist1 + 2];
929 dw = dx + dir[0] + dy * dir[1] + dz * dir[2];
951 pm->
SetNextPoint(array2[3 * ist2], array2[3 * ist2 + 1], array2[3 * ist2 + 2]);
952 printf(
"### EXTRA BOUNDARY %i : %s found at DCLOSE=%f\n", ist2,
fGeoManager->
GetPath(), dw);
962 pm->
SetNextPoint(array2[3 * ist1 + 3], array2[3 * ist1 + 4], array2[3 * ist1 + 5]);
963 printf(
"### BOUNDARY MISSED BACK #########################\n");
997 for (
Int_t i = 0; i < numPoints; i++) {
1029 Bool_t extrude, isextrusion, isoverlapping;
1076 for (ip = 0; ip < numPoints2; ip++) {
1077 memcpy(local, &points2[3 * ip], 3 *
sizeof(
Double_t));
1082 extrude = !shape1->
Contains(local);
1090 isextrusion =
kTRUE;
1102 for (ip = 0; ip < numPoints1; ip++) {
1103 memcpy(local, &points1[3 * ip], 3 *
sizeof(
Double_t));
1104 if (local[0] < 1
e-10 && local[1] < 1
e-10)
1108 extrude = shape2->
Contains(local1);
1112 if (safety > 1E-6) {
1122 isextrusion =
kTRUE;
1138 for (ip = 0; ip < numPoints1; ip++) {
1139 memcpy(local, &points1[3 * ip], 3 *
sizeof(
Double_t));
1140 if (local[0] < 1
e-10 && local[1] < 1
e-10)
1151 if (!isoverlapping) {
1152 isoverlapping =
kTRUE;
1164 for (ip = 0; ip < numPoints2; ip++) {
1165 memcpy(local, &points2[3 * ip], 3 *
sizeof(
Double_t));
1166 if (local[0] < 1
e-10 && local[1] < 1
e-10)
1177 if (!isoverlapping) {
1178 isoverlapping =
kTRUE;
1216 Int_t *check_list =
nullptr;
1222 Int_t id = 0, id0 = 0, id1 = 0;
1234 while (ipoint < npoints) {
1241 if (itry > 10000 && !ipoint) {
1242 Error(
"CheckOverlapsBySampling",
"No point inside volume!!! - aborting");
1251 if (!check_list || ncheck < 2)
1253 for (
id = 0;
id < ncheck;
id++) {
1254 id0 = check_list[
id];
1271 if (safe < ovlp)
continue;
1278 memset(flags, 0, nd * nd *
sizeof(
TGeoOverlap *));
1306 flags[nd * id1 + id0] = nodeovlp;
1324 Info(
"CheckOverlapsBySampling",
"#Found %d overlaps adding-up to %g +/- %g [cm3] for daughters of %s", novlps,
1325 capacity, err * capacity, vol->
GetName());
1345 while ((node = next1())) {
1368 for (
id = 0;
id < nd;
id++) {
1376 for (ko = 0; ko < novlp; ko++) {
1387 while ((node = next1())) {
1391 while ((node1 = next2())) {
1407 while ((node1 = next2())) {
1466 while ((node = next1())) {
1480 while ((nodecheck = next1.
GetNode(level--))) {
1504 Warning(
"CheckOverlaps",
"Volume %s with %i daughters but not voxelized", vol->
GetName(), nd);
1518 for (
id = 0;
id < nd;
id++) {
1528 for (ko = 0; ko < novlp; ko++) {
1545 while ((node = next1())) {
1552 while ((node1 = next2())) {
1563 while ((nodecheck = next2.
GetNode(level--))) {
1571 while ((nodecheck = next1.
GetNode(level--))) {
1604 while ((nodecheck = next1.
GetNode(level--))) {
1628 while ((node1 = next2())) {
1639 while ((nodecheck = next2.
GetNode(level--))) {
1709 printf(
"=== Check current point : (%g, %g, %g) ===\n", point[0], point[1], point[2]);
1716 printf(
"Safety radius : %f\n", close);
1758 default:
Error(
"CheckShape",
"Test number %d not existent", testNo);
1780 const Int_t kNtracks = 1000;
1781 Int_t n10 = nsamples / 10;
1788 TH1D *hist =
new TH1D(
"hTest1",
"Residual distance from inside/outside", 200, -20, 0);
1797 while (itot < nsamples) {
1807 if ((itot % n10) == 0)
1808 printf(
"%i percent\n",
Int_t(100 * itot / nsamples));
1810 for (i = 0; i < kNtracks; i++) {
1823 printf(
"DistFromInside: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) %f/%f(max)\n", point[0],
1824 point[1], point[2], dir[0], dir[1], dir[2], d1, dmove);
1829 pmfrominside->
SetNextPoint(point[0], point[1], point[2]);
1830 for (j = 0; j < 3; j++)
1831 pnew[j] = point[j] + d1 * dir[j];
1833 pmfrominside->
Draw();
1839 for (j = 0; j < 3; j++)
1842 if (d1 + dnext < dmax)
1843 dmove = d1 + 0.5 * dnext;
1845 for (j = 0; j < 3; j++) {
1846 pnew[j] = point[j] + dmove * dir[j];
1851 delta = dmove - d1 - d2;
1856 printf(
"Error: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d2=%f dmove=%f\n", point[0],
1857 point[1], point[2], dir[0], dir[1], dir[2], d1, d2, dmove);
1859 printf(
" (*)DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1864 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1865 point[0] + d1 * dir[0], point[1] + d1 * dir[1], point[2] + d1 * dir[2], dir[0], dir[1], dir[2],
1868 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) = %f\n", pnew[0], pnew[1],
1869 pnew[2], dnew[0], dnew[1], dnew[2], d2);
1874 pmfrominside->
SetNextPoint(point[0], point[1], point[2]);
1875 for (j = 0; j < 3; j++)
1876 point[j] += d1 * dir[j];
1877 pmfrominside->
SetNextPoint(point[0], point[1], point[2]);
1878 pmfrominside->
Draw();
1884 pmfromoutside->
SetNextPoint(pnew[0], pnew[1], pnew[2]);
1885 for (j = 0; j < 3; j++)
1886 pnew[j] += d2 * dnew[j];
1888 pmfromoutside->
SetNextPoint(pnew[0], pnew[1], pnew[2]);
1889 pmfromoutside->
Draw();
1893 for (j = 0; j < 3; j++)
1899 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d1p=%f\n", pnew[0],
1900 pnew[1], pnew[2], dnew[0], dnew[1], dnew[2], d1, dnext);
1905 pmfrominside->
SetNextPoint(point[0], point[1], point[2]);
1906 for (j = 0; j < 3; j++)
1907 point[j] += d1 * dir[j];
1908 pmfrominside->
SetNextPoint(point[0], point[1], point[2]);
1909 pmfrominside->
Draw();
1915 pmfromoutside->
SetNextPoint(pnew[0], pnew[1], pnew[2]);
1916 for (j = 0; j < 3; j++)
1917 pnew[j] += dnext * dnew[j];
1919 pmfromoutside->
SetNextPoint(pnew[0], pnew[1], pnew[2]);
1920 pmfromoutside->
Draw();
1930 new TCanvas(
"Test01",
"Residuals DistFromInside/Outside", 800, 600);
1946 const Int_t kNtracks = 1000;
1947 Int_t n10 = nsamples / 10;
1960 while (itot < nsamples) {
1969 if ((itot % n10) == 0)
1970 printf(
"%i percent\n",
Int_t(100 * itot / nsamples));
1972 for (i = 0; i < kNtracks; i++) {
1983 printf(
"Error safety (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) safe=%f dist=%f\n", point[0],
1984 point[1], point[2], dir[0], dir[1], dir[2], safe, dist);
1992 pm1->
SetNextPoint(point[0] + safe * dir[0], point[1] + safe * dir[1], point[2] + safe * dir[2]);
1998 pm2->
SetNextPoint(point[0] + dist * dir[0], point[1] + dist * dir[1], point[2] + dist * dir[2]);
2021 const Int_t kNtracks = 1000;
2022 Int_t n10 = nsamples / 10;
2023 Int_t itot = 0, errcnt = 0, errsame = 0;
2029 while (itot < nsamples) {
2035 inside = shape->
Contains(&spoint[3 * itot]);
2044 Double_t point[3], newpoint[3], oldpoint[3];
2046 Double_t norm[3], newnorm[3], oldnorm[3];
2058 for (itot = 0; itot < nsamples; itot++) {
2060 if ((itot % n10) == 0)
2061 printf(
"%i percent\n",
Int_t(100 * itot / nsamples));
2063 oldnorm[0] = oldnorm[1] = oldnorm[2] = 0.;
2065 for (
Int_t j = 0; j < 3; j++) {
2066 oldpoint[j] = point[j] = spoint[3 * itot + j];
2067 olddir[j] = dir[j] = sdir[3 * itot + j];
2069 for (i = 0; i < kNtracks; i++) {
2073 for (
Int_t j = 0; j < 3; j++) {
2074 newpoint[j] = point[j] + dist * dir[j];
2078 dot = olddir[0] * oldnorm[0] + olddir[1] * oldnorm[1] + olddir[2] * oldnorm[2];
2081 printf(
"Error point outside (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
2082 point[0], point[1], point[2], dir[0], dir[1], dir[2], dist, olddist);
2083 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n", oldpoint[0],
2084 oldpoint[1], oldpoint[2], olddir[0], olddir[1], olddir[2]);
2095 pm1->
SetNextPoint(oldpoint[0], oldpoint[1], oldpoint[2]);
2102 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
2103 point[0], point[1], point[2], dir[0], dir[1], dir[2], dist, olddist);
2104 printf(
" new norm: (%g, %g, %g)\n", newnorm[0], newnorm[1], newnorm[2]);
2105 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n", oldpoint[0],
2106 oldpoint[1], oldpoint[2], olddir[0], olddir[1], olddir[2]);
2107 printf(
" old norm: (%g, %g, %g)\n", oldnorm[0], oldnorm[1], oldnorm[2]);
2118 pm1->
SetNextPoint(oldpoint[0], oldpoint[1], oldpoint[2]);
2125 for (
Int_t j = 0; j < 3; j++) {
2126 oldpoint[j] = point[j];
2127 point[j] += dist * dir[j];
2132 printf(
"Error safety (%19.15f, %19.15f, %19.15f) safe=%g\n", point[0], point[1], point[2], safe);
2147 memcpy(oldnorm, norm, 3 *
sizeof(
Double_t));
2148 memcpy(olddir, dir, 3 *
sizeof(
Double_t));
2155 ndotd = dir[0] * norm[0] + dir[1] * norm[1] + dir[2] * norm[2];
2159 if ((itot % 10) == 0)
2182 TH2F *hist =
new TH2F(
"lego",
option, nphi, phimin, phimax, ntheta, themin, themax);
2191 Int_t ntot = ntheta * nphi;
2192 Int_t n10 = ntot / 10;
2193 Int_t igen = 0, iloop = 0;
2194 printf(
"=== Lego plot sph. => nrays=%i\n", ntot);
2195 for (i = 1; i <= nphi; i++) {
2196 for (j = 1; j <= ntheta; j++) {
2199 if ((igen % n10) == 0)
2200 printf(
"%i percent\n",
Int_t(100 * igen / ntot));
2205 start[0] = start[1] = start[2] = 1E-3;
2212 startnode =
nullptr;
2223 while (step < 1E10) {
2233 printf(
"%i steps\n", iloop);
2235 x += step / matprop;
2237 if (endnode ==
nullptr && step > 1E10)
2240 startnode = endnode;
2251 hist->
Fill(phi, theta,
x);
2279 printf(
"Random box : %f, %f, %f\n", dx, dy, dz);
2281 printf(
"Start... %i points\n", npoints);
2285 Int_t n10 = npoints / 10;
2287 while (igen < npoints) {
2294 if ((igen % n10) == 0)
2295 printf(
"%i percent\n",
Int_t(100 * igen / npoints));
2308 if ((ic < 0) || (ic >= 128))
2316 pm->
AddAt(marker, ic);
2321 printf(
"Number of visible points : %i\n", i);
2324 printf(
"efficiency : %g\n", ratio);
2328 marker->
Draw(
"SAME");
2332 printf(
"---Make them visible with : gGeoManager->GetTopVolume()->VisibleDaughters();\n");
2360 printf(
"Start... %i rays\n", nrays);
2364 Int_t ipoint, inull;
2366 Int_t n10 = nrays / 10;
2367 Double_t theta, phi, step, normlen;
2377 while (itot < nrays) {
2382 if ((itot % n10) == 0)
2383 printf(
"%i percent\n",
Int_t(100 * itot / nrays));
2402 startnode =
nullptr;
2414 line->SetPoint(ipoint++, start[0], start[1], start[2]);
2440 line->SetPoint(ipoint, point[0], point[1], point[2]);
2441 if (!vis2 && check_norm) {
2445 normline->
SetPoint(0, point[0], point[1], point[2]);
2446 normline->
SetPoint(1, point[0] + normal[0] * normlen, point[1] + normal[1] * normlen,
2447 point[2] + normal[2] * normlen);
2457 line->SetPoint(ipoint++, point[0], point[1], point[2]);
2463 normline->
SetPoint(0, point[0], point[1], point[2]);
2464 normline->
SetPoint(1, point[0] + normal[0] * normlen, point[1] + normal[1] * normlen,
2465 point[2] + normal[2] * normlen);
2479 printf(
"number of segments : %i\n", i);
2525 while (
index >= 0) {
2529 if (strstr(g3path,
name.Data())) {
2537 if (strlen(common.
Data())) {
2555 for (
Int_t i = 0; i < npoints; i++) {
2556 xyz[0] = point[0] - eps[0] + 2 * eps[0] *
gRandom->
Rndm();
2557 xyz[1] = point[1] - eps[1] + 2 * eps[1] *
gRandom->
Rndm();
2558 xyz[2] = point[2] - eps[2] + 2 * eps[2] *
gRandom->
Rndm();
2562 dist1 =
TMath::Sqrt((xyz[0] - point[0]) * (xyz[0] - point[0]) + (xyz[1] - point[1]) * (xyz[1] - point[1]) +
2563 (xyz[2] - point[2]) * (xyz[2] - point[2]));
2581 memcpy(&point[0], pointg, 3 *
sizeof(
Double_t));
2582 for (
Int_t i = 0; i < npoints; i++) {
2586 point[2] - eps[2] + 2 * eps[2] *
gRandom->
Rndm());
2588 if (node1 != node) {
2589 dist1 =
TMath::Sqrt((point[0] - pointg[0]) * (point[0] - pointg[0]) +
2590 (point[1] - pointg[1]) * (point[1] - pointg[1]) +
2591 (point[2] - pointg[2]) * (point[2] - pointg[2]));
2595 memcpy(&closest[0], pointg, 3 *
sizeof(
Double_t));
2621 printf(
"empty input array\n");
2643 while (step < 1E10) {
2645 forward = dirx * (endpoint[0] - point[0]) + diry * (endpoint[1] - point[1]) + dirz * (endpoint[2] - point[2]);
2646 if (forward < 1E-3) {
2654 memcpy(temparray, array, 3 * dim *
sizeof(
Double_t));
2659 memcpy(&array[3 * nelem], point, 3 *
sizeof(
Double_t));
2663 if (endnode ==
nullptr && step > 1E10) {
2684 printf(
"%i steps\n", istep);
2687 memcpy(temparray, array, 3 * dim *
sizeof(
Double_t));
2692 memcpy(&array[3 * nelem], point, 3 *
sizeof(
Double_t));
2713 printf(
"RECHECK\n");
2723 printf(
"Random box : %f, %f, %f\n", dx, dy, dz);
2726 for (i = 0; i < npoints; i++) {
2728 xyz[3 * i + 1] = oy - dy + 2 * dy *
gRandom->
Rndm();
2729 xyz[3 * i + 2] = oz - dz + 2 * dz *
gRandom->
Rndm();
2732 printf(
"Generation time :\n");
2736 printf(
"Start... %i points\n", npoints);
2738 for (i = 0; i < npoints; i++) {
2745 if (node1 != node) {
2746 printf(
"Difference for x=%g y=%g z=%g\n", xyz[3 * i], xyz[3 * i + 1], xyz[3 * i + 2]);
2747 printf(
" from top : %s\n", node->
GetName());
2765 printf(
"Checking overlaps for path :\n");
2771 Int_t npoints = 1000000;
2795 while (i < npoints) {
2822 ntpl->
Draw(
"z:y:x");
2829 printf(
"using FindNode...\n");
2830 for (
Int_t j = 0; j < npoints; j++) {
2837 markthis->
SetNextPoint(xyz[3 * j], xyz[3 * j + 1], xyz[3 * j + 2]);
2851 pm->
AddAt(marker, ic);
2854 marker->
SetNextPoint(xyz[3 * j], xyz[3 * j + 1], xyz[3 * j + 2]);
2856 if (overlaps->
IndexOf(node) < 0)
2857 overlaps->
Add(node);
2865 markthis->
Draw(
"SAME");
2870 printf(
"list of overlapping nodes :\n");
2874 printf(
"%s MANY\n", node->
GetName());
2876 printf(
"%s ONLY\n", node->
GetName());
2879 printf(
"No overlaps\n");
2897 memset(nin, 0, nmat *
sizeof(
Int_t));
2911 Double_t vbox = 0.000008 * dx * dy * dz;
2932 if ((iin % 100000) == 0 || igen > 1E8) {
2935 for (indmat = 0; indmat < nmat; indmat++) {
2941 weight += dens *
Double_t(nin[indmat]);
2942 sigma += dens * dens * nin[indmat];
2945 eps =
sigma / weight;
2948 if (eps < precision || igen > 1E8) {
2954 if (isverbose && eps < 0.5 * eps0) {
2955 printf(
"%8dK: %14.7g kg %g %%\n", igen / 1000, weight, eps * 100);
2981 for (
Int_t i = 0; i < npoints; i++) {
2982 point = xyz + 3 * i;
2990 for (
Int_t id = 0;
id < ncheck;
id++) {
2991 node = vol->
GetNode(checklist[
id]);
std::ios_base::fmtflags fFlags
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t nchar
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
Option_t Option_t TPoint TPoint percent
R__EXTERN TGeoIdentity * gGeoIdentity
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
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 an on-disk file, usually with extension .root, that stores objects in a file-system-li...
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.
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 CheckGeometryFull(Bool_t checkoverlaps=kTRUE, Bool_t checkcrossings=kTRUE, Int_t nrays=10000, const Double_t *vertex=nullptr)
Geometry checking.
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=nullptr) 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.
void CheckPoint(Double_t x=0, Double_t y=0, Double_t z=0, Option_t *option="", Double_t safety=0.)
Draw point (x,y,z) over the picture of the daughters of the volume containing this 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.
~TGeoChecker() override
Destructor.
void OpProgress(const char *opname, Long64_t current, Long64_t size, TStopwatch *watch=nullptr, Bool_t last=kFALSE, Bool_t refresh=kFALSE, const char *msg="")
Print current operation progress.
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 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 RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz, const char *target_vol=nullptr, 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
void Reset(TGeoVolume *top=nullptr)
Resets the iterator for volume TOP.
const TGeoMatrix * GetCurrentMatrix() const
Returns global matrix for current node.
void SetTopName(const char *name)
Set the top name for path.
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 Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const =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.
void Draw(Option_t *option="") override
Draw this shape.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const =0
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const =0
const char * GetName() const override
Get the shape name.
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
Class describing translations.
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
void SetVisibility(Bool_t vis=kTRUE) override
set visibility of this volume
TGeoMedium * GetMedium() const
Bool_t Contains(const Double_t *point) const
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
Add a TGeoNode to the list of nodes.
void Draw(Option_t *option="") override
draw top volume according to option
TGeoMaterial * GetMaterial() const
Int_t GetNdaughters() const
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
Int_t GetIndex(const TGeoNode *node) const
get index number for a given daughter
TGeoPatternFinder * GetFinder() const
TGeoVoxelFinder * GetVoxels() const
Getter for optimization structure.
void SetLineColor(Color_t lcolor) override
Set the line color.
TGeoShape * GetShape() const
virtual Int_t GetCurrentNodeIndex() const
virtual void DrawOnly(Option_t *option="")
draw only this volume
void SetLineStyle(Style_t lstyle) override
Set the line style.
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.
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
void Draw(Option_t *option="") override
Draw this histogram with options.
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 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) override
Invalid Fill method.
TObject * At(Int_t idx) const override
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.
const char * GetName() const override
Returns name of object.
A simple TTree restricted to a list of float variables only.
Int_t Fill() override
Fill a Ntuple with current values in fArgs.
Int_t GetEntriesFast() const
Int_t IndexOf(const TObject *obj) const override
void AddAt(TObject *obj, Int_t idx) override
Add object at position ids.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
TObject * RemoveAt(Int_t idx) override
Remove object at index idx.
void Add(TObject *obj) override
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.
void Draw(Option_t *option="") override
Draws 3-D polymarker with its current attributes.
Double_t Rndm() override
Machine independent random number generator.
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
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 override
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.
void Draw(Option_t *opt) override
Default Draw method for all objects.
virtual Int_t SetBranchAddress(const char *bname, void *add, TBranch **ptr=nullptr)
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.
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override
Write this object to the current directory.
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Double_t ACos(Double_t)
Returns the principal value of the arc cosine of x, expressed in radians.
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
constexpr Double_t TwoPi()
Statefull info for the current geometry level.