107     fSelectedNode(nullptr),
 
 
  127     fSelectedNode(nullptr),
 
 
  163   const char symbol[4] = {
'=', 
'\\', 
'|', 
'/'};
 
  164   char progress[11] = 
"          ";
 
  191      time = 
owatch->RealTime();
 
  193      time -= 3600 * 
hours;
 
  196      seconds = (
Int_t)time;
 
  218   for (i = 0; i < 
nchar; i++)
 
  221   for (i = 
nchar + 1; i < 10; i++)
 
  228   else if (
size < 100000)
 
 
  260   Info(
"CheckBoundaryErrors", 
"Top volume is %s", 
tvol->GetName());
 
  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];
 
  291   TH1F *
hnew = 
new TH1F(
"hnew", 
"Precision pushing", 30, -20., 10.);
 
  292   TH1F *
hold = 
new TH1F(
"hold", 
"Precision pulling", 30, -20., 10.);
 
  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) {
 
  333      for (
Int_t i = 0; i < 30; ++i) {
 
  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],
 
  355      for (
Int_t i = 0; i < 30; ++i) {
 
  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],
 
  397    new TCanvas(
"c3", 
"Plot", 600, 600);
 
 
  418   bug->SetBranchAddress(
"pos", xyz);
 
  419   bug->SetBranchAddress(
"dir", dir);
 
  420   bug->SetBranchAddress(
"push", &push);
 
  421   bug->SetBranchAddress(
"path", &path);
 
  422   bug->SetBranchAddress(
"cdir", &
cdir);
 
  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],
 
  446         nxyz[
j] = xyz[
j] + step * (1. + 0.1 * push) * dir[
j];
 
  460      pm->SetMarkerStyle(2);
 
  461      pm->SetMarkerSize(0.2);
 
  466         nxyz[
j] = xyz[
j] + step * dir[
j];
 
  469      pm1->SetMarkerStyle(2);
 
  470      pm1->SetMarkerSize(0.2);
 
 
  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");
 
  545   printf(
"====================================================================\n");
 
  546   printf(
"STAGE 3: Propagating %i tracks starting from vertex\n and counting number of boundary crossings...\n",
 
  548   printf(
"====================================================================\n");
 
  558   for (i = 0; i < ntracks; i++) {
 
  570      printf(
"No boundary crossed\n");
 
  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");
 
  599   while ((current = next())) {
 
  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++) {
 
  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());
 
 
  732      Error(
"SetNmeshPoints", 
"Cannot allow less than 1000 points for checking - set to 1000");
 
 
  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(),
 
 
  821   pm->SetMarkerColor(2); 
 
  822   pm->SetMarkerStyle(8);
 
  823   pm->SetMarkerSize(0.4);
 
  826   pm->SetMarkerColor(4); 
 
  827   pm->SetMarkerStyle(8);
 
  828   pm->SetMarkerSize(0.4);
 
  831   pm->SetMarkerColor(6); 
 
  832   pm->SetMarkerStyle(8);
 
  833   pm->SetMarkerSize(0.4);
 
  846   for (i = 0; i < 
nrays; i++) {
 
  868         printf(
"#### NOTHING BACK ###########################\n");
 
  877      for (
j = 0; 
j < k; 
j++) {
 
  891      dw = 
dx * dir[0] + 
dy * dir[1] + 
dz * dir[2];
 
  929            dw = 
dx + dir[0] + 
dy * dir[1] + 
dz * dir[2];
 
  963                  printf(
"### BOUNDARY MISSED BACK #########################\n");
 
 
  997   for (
Int_t i = 0; i < numPoints; i++) {
 
 
 1018   if (
vol1->IsAssembly() || 
vol2->IsAssembly())
 
 1092               nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 1097               nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 1124               nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 1129               nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 1154            nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 1159            nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 1180            nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 1185            nodeovlp->SetNextPoint(point[0], point[1], point[2]);
 
 
 1204   if (
voxels->NeedRebuild()) {
 
 1242            Error(
"CheckOverlapsBySampling", 
"No point inside volume!!! - aborting");
 
 1253      for (
id = 0; 
id < 
ncheck; 
id++) {
 
 1291               cindex = 
node1->GetVolume()->GetCurrentNodeIndex();
 
 1296            cindex = 
node2->GetVolume()->GetCurrentNodeIndex();
 
 1301               cindex = 
node2->GetVolume()->GetCurrentNodeIndex();
 
 1310         if (
nodeovlp->GetPolyMarker()->GetN() < 100)
 
 1316   nav->GetCache()->ReleaseInfo();
 
 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++) {
 
 1370      if (
node01->IsOverlapping())
 
 1372      vox->FindOverlaps(
id);
 
 1381         if (
node02->IsOverlapping())
 
 1385         if (
node01->GetVolume()->IsAssembly()) {
 
 1387            while ((node = 
next1())) {
 
 1389                  if (
node02->GetVolume()->IsAssembly()) {
 
 1392                        if (!
node1->GetVolume()->IsAssembly()) {
 
 1405            if (
node02->GetVolume()->IsAssembly()) {
 
 1408                  if (!
node1->GetVolume()->IsAssembly()) {
 
 1419      node01->SetOverlaps(
nullptr, 0);
 
 
 1466      while ((node = 
next1())) {
 
 1479                  level = 
next1.GetLevel();
 
 1490            next1.GetPath(path);
 
 1504      Warning(
"CheckOverlaps", 
"Volume %s with %i daughters but not voxelized", vol->
GetName(), nd);
 
 1507   if (
vox->NeedRebuild()) {
 
 1518   for (
id = 0; 
id < nd; 
id++) {
 
 1520      if (
node01->IsOverlapping())
 
 1522      vox->FindOverlaps(
id);
 
 1527      path = 
node01->GetName();
 
 1533         if (
node02->IsOverlapping())
 
 1543         if (
node01->GetVolume()->IsAssembly()) {
 
 1545            while ((node = 
next1())) {
 
 1547                  next1.GetPath(path);
 
 1550                  if (
node02->GetVolume()->IsAssembly()) {
 
 1553                        if (!
node1->GetVolume()->IsAssembly()) {
 
 1562                                 level = 
next2.GetLevel();
 
 1570                                    level = 
next1.GetLevel();
 
 1603                           level = 
next1.GetLevel();
 
 1626            if (
node02->GetVolume()->IsAssembly()) {
 
 1629                  if (!
node1->GetVolume()->IsAssembly()) {
 
 1638                           level = 
next2.GetLevel();
 
 1671      node01->SetOverlaps(
nullptr, 0);
 
 
 1709   printf(
"===  Check current point : (%g, %g, %g) ===\n", point[0], point[1], point[2]);
 
 1716   printf(
"Safety radius : %f\n", close);
 
 1719      sph->SetLineColor(2);
 
 1720      sph->SetLineStyle(3);
 
 1725   pm->SetMarkerColor(2);
 
 1726   pm->SetMarkerStyle(8);
 
 1727   pm->SetMarkerSize(0.5);
 
 
 1758   default: 
Error(
"CheckShape", 
"Test number %d not existent", 
testNo);
 
 
 1788   TH1D *hist = 
new TH1D(
"hTest1", 
"Residual distance from inside/outside", 200, -20, 0);
 
 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++)
 
 1839         for (
j = 0; 
j < 3; 
j++)
 
 1845         for (
j = 0; 
j < 3; 
j++) {
 
 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],
 
 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]);
 
 1885            for (
j = 0; 
j < 3; 
j++)
 
 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],
 
 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]);
 
 1916            for (
j = 0; 
j < 3; 
j++)
 
 1930   new TCanvas(
"Test01", 
"Residuals DistFromInside/Outside", 800, 600);
 
 
 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);
 
 1988            pm1->SetMarkerStyle(24);
 
 1989            pm1->SetMarkerSize(0.4);
 
 1991            pm1->SetNextPoint(point[0], point[1], point[2]);
 
 1992            pm1->SetNextPoint(point[0] + 
safe * dir[0], point[1] + 
safe * dir[1], point[2] + 
safe * dir[2]);
 
 1995            pm2->SetMarkerStyle(7);
 
 1996            pm2->SetMarkerSize(0.3);
 
 1998            pm2->SetNextPoint(point[0] + dist * dir[0], point[1] + dist * dir[1], point[2] + dist * dir[2]);
 
 
 2052   pm2->SetMarkerSize(0.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],
 
 2090               pm1->SetMarkerStyle(24);
 
 2091               pm1->SetMarkerSize(0.4);
 
 2094            pm1->SetNextPoint(point[0], point[1], point[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);
 
 2105               printf(
"         old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n", 
oldpoint[0],
 
 2113                  pm1->SetMarkerStyle(24);
 
 2114                  pm1->SetMarkerSize(0.4);
 
 2117               pm1->SetNextPoint(point[0], point[1], point[2]);
 
 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);
 
 2138               pm1->SetMarkerStyle(24);
 
 2139               pm1->SetMarkerSize(0.4);
 
 2142            pm1->SetNextPoint(point[0], point[1], point[2]);
 
 2159         if ((
itot % 10) == 0)
 
 2160            pm2->SetNextPoint(point[0], point[1], point[2]);
 
 
 2194   printf(
"=== Lego plot sph. => nrays=%i\n", 
ntot);
 
 2195   for (i = 1; i <= 
nphi; i++) {
 
 2205         start[0] = start[1] = start[2] = 1E-3;
 
 2223         while (step < 1
E10) {
 
 2251         hist->
Fill(phi, theta, 
x);
 
 
 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");
 
 
 2414         line->SetPoint(
ipoint++, start[0], start[1], start[2]);
 
 2436         } 
else if (
endnode->IsOnScreen())
 
 2440            line->SetPoint(
ipoint, point[0], point[1], point[2]);
 
 2445               normline->SetPoint(0, point[0], point[1], point[2]);
 
 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]);
 
 2465                                  point[2] + normal[2] * 
normlen);
 
 2474   for (
Int_t m = 0; 
m < 
pm->GetEntriesFast(); 
m++) {
 
 2479   printf(
"number of segments : %i\n", i);
 
 
 2525      while (
index >= 0) {
 
 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]));
 
 2586                                   point[2] - eps[2] + 2 * eps[2] * 
gRandom->
Rndm());
 
 2588      if (
node1 != node) {
 
 
 2621      printf(
"empty input array\n");
 
 2643   while (step < 1
E10) {
 
 2646         if (forward < 1E-3) {
 
 
 2726   for (i = 0; i < 
npoints; i++) {
 
 2732   printf(
"Generation time :\n");
 
 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]);
 
 
 2765   printf(
"Checking overlaps for path :\n");
 
 2822   ntpl->Draw(
"z:y:x");
 
 2829   printf(
"using FindNode...\n");
 
 2836      if (
cpath.Contains(path)) {
 
 2837         markthis->SetNextPoint(xyz[3 * 
j], xyz[3 * 
j + 1], xyz[3 * 
j + 2]);
 
 2851         pm->AddAt(marker, 
ic);
 
 2856         if (overlaps->
IndexOf(node) < 0)
 
 2857            overlaps->
Add(node);
 
 2870      printf(
"list of overlapping nodes :\n");
 
 
 2932      if ((
iin % 100000) == 0 || 
igen > 1
E8) {
 
 2945         eps = 
sigma / weight;
 
 2955               printf(
"%8dK: %14.7g kg  %g %%\n", 
igen / 1000, weight, eps * 100);
 
 
 2982      point = xyz + 3 * i;
 
 2998   nav->GetCache()->ReleaseInfo();
 
 2999   time = 
timer.CpuTime();
 
 
std::ios_base::fmtflags fFlags
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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 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 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.
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 GetPath(TString &path) const
Returns the path for the current node.
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.
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 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.
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
virtual TGeoMatrix * GetMatrix() const =0
void InspectNode() const
Inspect this node.
Base class describing geometry overlaps.
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
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()
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
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.
TGeoShape * GetShape() const
virtual void DrawOnly(Option_t *option="")
draw only this volume
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.
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.
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 GetEntriesFast() const
Int_t IndexOf(const TObject *obj) const override
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 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 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
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
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.
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.