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]);
2457 line->SetPoint(
ipoint++, point[0], point[1], point[2]);
2463 normline->SetPoint(0, point[0], point[1], point[2]);
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 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 void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) 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.
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.