105 fSelectedNode(nullptr),
125 fSelectedNode(nullptr),
161 const char symbol[4] = {
'=',
'\\',
'|',
'/'};
162 char progress[11] =
" ";
189 time =
owatch->RealTime();
191 time -= 3600 *
hours;
194 seconds = (
Int_t)time;
216 for (i = 0; i <
nchar; i++)
219 for (i =
nchar + 1; i < 10; i++)
226 else if (
size < 100000)
258 Info(
"CheckBoundaryErrors",
"Top volume is %s",
tvol->GetName());
273 bug->Branch(
"pos", xyz,
"xyz[3]/D");
274 bug->Branch(
"dir", dir,
"dir[3]/D");
275 bug->Branch(
"push", &
relp,
"push/D");
276 bug->Branch(
"path", &path,
"path/C");
277 bug->Branch(
"cdir", &
cdir,
"cdir/C");
279 dl[0] =
box->GetDX();
280 dl[1] =
box->GetDY();
281 dl[2] =
box->GetDZ();
282 ori[0] = (
box->GetOrigin())[0];
283 ori[1] = (
box->GetOrigin())[1];
284 ori[2] = (
box->GetOrigin())[2];
289 TH1F *
hnew =
new TH1F(
"hnew",
"Precision pushing", 30, -20., 10.);
290 TH1F *
hold =
new TH1F(
"hold",
"Precision pulling", 30, -20., 10.);
299 printf(
"Random box : %f, %f, %f, %f, %f, %f\n",
ori[0],
ori[1],
ori[2],
dl[0],
dl[1],
dl[2]);
300 printf(
"Start... %i points\n", ntracks);
305 while (
igen < ntracks) {
331 for (
Int_t i = 0; i < 30; ++i) {
342 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],
353 for (
Int_t i = 0; i < 30; ++i) {
364 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],
395 new TCanvas(
"c3",
"Plot", 600, 600);
416 bug->SetBranchAddress(
"pos", xyz);
417 bug->SetBranchAddress(
"dir", dir);
418 bug->SetBranchAddress(
"push", &push);
419 bug->SetBranchAddress(
"path", &path);
420 bug->SetBranchAddress(
"cdir", &
cdir);
427 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],
428 xyz[2], 1., 1., path);
436 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],
444 nxyz[
j] = xyz[
j] + step * (1. + 0.1 * push) * dir[
j];
458 pm->SetMarkerStyle(2);
459 pm->SetMarkerSize(0.2);
464 nxyz[
j] = xyz[
j] + step * dir[
j];
467 pm1->SetMarkerStyle(2);
468 pm1->SetMarkerSize(0.2);
511 TCanvas *
c =
new TCanvas(
"overlaps",
"Overlaps by sampling", 800, 800);
515 printf(
"====================================================================\n");
516 printf(
"STAGE 1: Overlap checking by sampling within 10 microns\n");
517 printf(
"====================================================================\n");
521 printf(
"====================================================================\n");
522 printf(
"STAGE 2: Global overlap/extrusion checking within 10 microns\n");
523 printf(
"====================================================================\n");
543 printf(
"====================================================================\n");
544 printf(
"STAGE 3: Propagating %i tracks starting from vertex\n and counting number of boundary crossings...\n",
546 printf(
"====================================================================\n");
556 for (i = 0; i < ntracks; i++) {
568 printf(
"No boundary crossed\n");
577 printf(
"Time per track for full geometry traversal: %g [ms], per crossing: %g [ms]\n",
time2,
time3);
581 printf(
"====================================================================\n");
582 printf(
"STAGE 4: How much navigation time per volume per next+safety call\n");
583 printf(
"====================================================================\n");
597 while ((current = next())) {
615 c1->SetTopMargin(0.15);
616 TFile *
f =
new TFile(
"statistics.root",
"RECREATE");
617 TH1F *
h =
new TH1F(
"h",
"number of boundary crossings per volume", 3, 0, 3);
623 for (i = 0; i <
nuid; i++) {
632 h->LabelsOption(
">",
"X");
635 TCanvas *
c2 =
new TCanvas(
"c3",
"time spent per volume in navigation", 10, 10, 900, 500);
637 c2->SetTopMargin(0.15);
638 TH2F *h2 =
new TH2F(
"h2",
"time per FNB call vs. ndaughters", 100, 0, 100, 100, 0, 15);
640 h2->SetMarkerStyle(2);
641 TH1F *
h1 =
new TH1F(
"h1",
"percent of time spent per volume", 3, 0, 3);
645 for (i = 0; i <
nuid; i++) {
658 c3->SetTopMargin(0.15);
685 printf(
"Error in trying to cross boundary of %s\n", current->
GetName());
730 Error(
"SetNmeshPoints",
"Cannot allow less than 1000 points for checking - set to 1000");
756 for (
Int_t i = 0; i < 1000000; i++) {
794 printf(
"Time for volume %s (shape=%s): %g [ms] ndaughters=%d ncross=%d\n", vol->
GetName(),
819 pm->SetMarkerColor(2);
820 pm->SetMarkerStyle(8);
821 pm->SetMarkerSize(0.4);
824 pm->SetMarkerColor(4);
825 pm->SetMarkerStyle(8);
826 pm->SetMarkerSize(0.4);
829 pm->SetMarkerColor(6);
830 pm->SetMarkerStyle(8);
831 pm->SetMarkerSize(0.4);
844 for (i = 0; i <
nrays; i++) {
866 printf(
"#### NOTHING BACK ###########################\n");
875 for (
j = 0;
j < k;
j++) {
889 dw =
dx * dir[0] +
dy * dir[1] +
dz * dir[2];
927 dw =
dx + dir[0] +
dy * dir[1] +
dz * dir[2];
961 printf(
"### BOUNDARY MISSED BACK #########################\n");
995 for (
Int_t i = 0; i < numPoints; i++) {
1016 if (
vol1->IsAssembly() ||
vol2->IsAssembly())
1090 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1095 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1122 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1127 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1152 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1157 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1178 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1183 nodeovlp->SetNextPoint(point[0], point[1], point[2]);
1202 if (
voxels->NeedRebuild()) {
1240 Error(
"CheckOverlapsBySampling",
"No point inside volume!!! - aborting");
1251 for (
id = 0;
id <
ncheck;
id++) {
1289 cindex =
node1->GetVolume()->GetCurrentNodeIndex();
1294 cindex =
node2->GetVolume()->GetCurrentNodeIndex();
1299 cindex =
node2->GetVolume()->GetCurrentNodeIndex();
1308 if (
nodeovlp->GetPolyMarker()->GetN() < 100)
1314 nav->GetCache()->ReleaseInfo();
1322 Info(
"CheckOverlapsBySampling",
"#Found %d overlaps adding-up to %g +/- %g [cm3] for daughters of %s",
novlps,
1323 capacity, err * capacity, vol->
GetName());
1343 while ((node =
next1())) {
1366 for (
id = 0;
id < nd;
id++) {
1368 if (
node01->IsOverlapping())
1370 vox->FindOverlaps(
id);
1379 if (
node02->IsOverlapping())
1383 if (
node01->GetVolume()->IsAssembly()) {
1385 while ((node =
next1())) {
1387 if (
node02->GetVolume()->IsAssembly()) {
1390 if (!
node1->GetVolume()->IsAssembly()) {
1403 if (
node02->GetVolume()->IsAssembly()) {
1406 if (!
node1->GetVolume()->IsAssembly()) {
1417 node01->SetOverlaps(
nullptr, 0);
1464 while ((node =
next1())) {
1477 level =
next1.GetLevel();
1488 next1.GetPath(path);
1502 Warning(
"CheckOverlaps",
"Volume %s with %i daughters but not voxelized", vol->
GetName(), nd);
1505 if (
vox->NeedRebuild()) {
1516 for (
id = 0;
id < nd;
id++) {
1518 if (
node01->IsOverlapping())
1520 vox->FindOverlaps(
id);
1525 path =
node01->GetName();
1531 if (
node02->IsOverlapping())
1541 if (
node01->GetVolume()->IsAssembly()) {
1543 while ((node =
next1())) {
1545 next1.GetPath(path);
1548 if (
node02->GetVolume()->IsAssembly()) {
1551 if (!
node1->GetVolume()->IsAssembly()) {
1560 level =
next2.GetLevel();
1568 level =
next1.GetLevel();
1601 level =
next1.GetLevel();
1624 if (
node02->GetVolume()->IsAssembly()) {
1627 if (!
node1->GetVolume()->IsAssembly()) {
1636 level =
next2.GetLevel();
1669 node01->SetOverlaps(
nullptr, 0);
1707 printf(
"=== Check current point : (%g, %g, %g) ===\n", point[0], point[1], point[2]);
1714 printf(
"Safety radius : %f\n", close);
1717 sph->SetLineColor(2);
1718 sph->SetLineStyle(3);
1723 pm->SetMarkerColor(2);
1724 pm->SetMarkerStyle(8);
1725 pm->SetMarkerSize(0.5);
1756 default:
Error(
"CheckShape",
"Test number %d not existent",
testNo);
1786 TH1D *hist =
new TH1D(
"hTest1",
"Residual distance from inside/outside", 200, -20, 0);
1821 printf(
"DistFromInside: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) %f/%f(max)\n", point[0],
1822 point[1], point[2], dir[0], dir[1], dir[2],
d1,
dmove);
1827 pmfrominside->SetNextPoint(point[0], point[1], point[2]);
1828 for (
j = 0;
j < 3;
j++)
1837 for (
j = 0;
j < 3;
j++)
1843 for (
j = 0;
j < 3;
j++) {
1854 printf(
"Error: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d2=%f dmove=%f\n", point[0],
1855 point[1], point[2], dir[0], dir[1], dir[2],
d1,
d2,
dmove);
1857 printf(
" (*)DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1862 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) dnext = %f\n",
1863 point[0] +
d1 * dir[0], point[1] +
d1 * dir[1], point[2] +
d1 * dir[2], dir[0], dir[1], dir[2],
1866 printf(
" DistFromOutside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) = %f\n",
pnew[0],
pnew[1],
1872 pmfrominside->SetNextPoint(point[0], point[1], point[2]);
1873 for (
j = 0;
j < 3;
j++)
1874 point[
j] +=
d1 * dir[
j];
1875 pmfrominside->SetNextPoint(point[0], point[1], point[2]);
1883 for (
j = 0;
j < 3;
j++)
1891 for (
j = 0;
j < 3;
j++)
1897 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) d1=%f d1p=%f\n",
pnew[0],
1903 pmfrominside->SetNextPoint(point[0], point[1], point[2]);
1904 for (
j = 0;
j < 3;
j++)
1905 point[
j] +=
d1 * dir[
j];
1906 pmfrominside->SetNextPoint(point[0], point[1], point[2]);
1914 for (
j = 0;
j < 3;
j++)
1928 new TCanvas(
"Test01",
"Residuals DistFromInside/Outside", 800, 600);
1981 printf(
"Error safety (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) safe=%f dist=%f\n", point[0],
1982 point[1], point[2], dir[0], dir[1], dir[2],
safe, dist);
1986 pm1->SetMarkerStyle(24);
1987 pm1->SetMarkerSize(0.4);
1989 pm1->SetNextPoint(point[0], point[1], point[2]);
1990 pm1->SetNextPoint(point[0] +
safe * dir[0], point[1] +
safe * dir[1], point[2] +
safe * dir[2]);
1993 pm2->SetMarkerStyle(7);
1994 pm2->SetMarkerSize(0.3);
1996 pm2->SetNextPoint(point[0] + dist * dir[0], point[1] + dist * dir[1], point[2] + dist * dir[2]);
2050 pm2->SetMarkerSize(0.2);
2079 printf(
"Error point outside (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
2080 point[0], point[1], point[2], dir[0], dir[1], dir[2], dist,
olddist);
2081 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n",
oldpoint[0],
2088 pm1->SetMarkerStyle(24);
2089 pm1->SetMarkerSize(0.4);
2092 pm1->SetNextPoint(point[0], point[1], point[2]);
2100 printf(
"Error DistFromInside(%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f) =%g olddist=%g\n",
2101 point[0], point[1], point[2], dir[0], dir[1], dir[2], dist,
olddist);
2103 printf(
" old point: (%19.15f, %19.15f, %19.15f, %19.15f, %19.15f, %19.15f)\n",
oldpoint[0],
2111 pm1->SetMarkerStyle(24);
2112 pm1->SetMarkerSize(0.4);
2115 pm1->SetNextPoint(point[0], point[1], point[2]);
2125 point[
j] += dist * dir[
j];
2130 printf(
"Error safety (%19.15f, %19.15f, %19.15f) safe=%g\n", point[0], point[1], point[2],
safe);
2136 pm1->SetMarkerStyle(24);
2137 pm1->SetMarkerSize(0.4);
2140 pm1->SetNextPoint(point[0], point[1], point[2]);
2157 if ((
itot % 10) == 0)
2158 pm2->SetNextPoint(point[0], point[1], point[2]);
2192 printf(
"=== Lego plot sph. => nrays=%i\n",
ntot);
2193 for (i = 1; i <=
nphi; i++) {
2203 start[0] = start[1] = start[2] = 1E-3;
2221 while (step < 1
E10) {
2249 hist->
Fill(phi, theta,
x);
2306 if ((
ic < 0) || (
ic >= 128))
2314 pm->AddAt(marker,
ic);
2319 printf(
"Number of visible points : %i\n", i);
2322 printf(
"efficiency : %g\n", ratio);
2326 marker->
Draw(
"SAME");
2330 printf(
"---Make them visible with : gGeoManager->GetTopVolume()->VisibleDaughters();\n");
2412 line->SetPoint(
ipoint++, start[0], start[1], start[2]);
2434 }
else if (
endnode->IsOnScreen())
2438 line->SetPoint(
ipoint, point[0], point[1], point[2]);
2443 normline->SetPoint(0, point[0], point[1], point[2]);
2455 line->SetPoint(
ipoint++, point[0], point[1], point[2]);
2461 normline->SetPoint(0, point[0], point[1], point[2]);
2472 for (
Int_t m = 0;
m <
pm->GetEntriesFast();
m++) {
2477 printf(
"number of segments : %i\n", i);
2523 while (
index >= 0) {
2554 xyz[0] = point[0] - eps[0] + 2 * eps[0] *
gRandom->
Rndm();
2555 xyz[1] = point[1] - eps[1] + 2 * eps[1] *
gRandom->
Rndm();
2556 xyz[2] = point[2] - eps[2] + 2 * eps[2] *
gRandom->
Rndm();
2560 dist1 =
TMath::Sqrt((xyz[0] - point[0]) * (xyz[0] - point[0]) + (xyz[1] - point[1]) * (xyz[1] - point[1]) +
2561 (xyz[2] - point[2]) * (xyz[2] - point[2]));
2584 point[2] - eps[2] + 2 * eps[2] *
gRandom->
Rndm());
2586 if (
node1 != node) {
2619 printf(
"empty input array\n");
2641 while (step < 1
E10) {
2644 if (forward < 1E-3) {
2724 for (i = 0; i <
npoints; i++) {
2730 printf(
"Generation time :\n");
2736 for (i = 0; i <
npoints; i++) {
2743 if (
node1 != node) {
2744 printf(
"Difference for x=%g y=%g z=%g\n", xyz[3 * i], xyz[3 * i + 1], xyz[3 * i + 2]);
2763 printf(
"Checking overlaps for path :\n");
2820 ntpl->Draw(
"z:y:x");
2827 printf(
"using FindNode...\n");
2834 if (
cpath.Contains(path)) {
2835 markthis->SetNextPoint(xyz[3 *
j], xyz[3 *
j + 1], xyz[3 *
j + 2]);
2849 pm->AddAt(marker,
ic);
2854 if (overlaps->
IndexOf(node) < 0)
2855 overlaps->
Add(node);
2868 printf(
"list of overlapping nodes :\n");
2930 if ((
iin % 100000) == 0 ||
igen > 1
E8) {
2943 eps =
sigma / weight;
2953 printf(
"%8dK: %14.7g kg %g %%\n",
igen / 1000, weight, eps * 100);
2980 point = xyz + 3 * i;
2996 nav->GetCache()->ReleaseInfo();
2997 time =
timer.CpuTime();
std::ios_base::fmtflags fFlags
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Signed integer 4 bytes (int)
char Char_t
Character 1 byte (char)
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
double Double_t
Double 8 bytes.
long long Long64_t
Portable signed long integer 8 bytes.
const char Option_t
Option string (const char)
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.
Bool_t * fFlags
Array of timing per volume.
TStopwatch * fTimer
Array of flags per volume.
void CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option) override
Test for shape navigation methods.
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 OpProgress(const char *opname, Long64_t current, Long64_t size, TStopwatch *watch=nullptr, Bool_t last=kFALSE, Bool_t refresh=kFALSE, const char *msg="") override
Print current operation progress.
TGeoNode * SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil, const char *g3path) override
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.) override
Draw point (x,y,z) over the picture of the daughters of the volume containing this point.
Double_t Weight(Double_t precision=0.01, Option_t *option="v") override
Estimate weight of top level volume with a precision SIGMA(W)/W better than PRECISION.
void ShapeNormal(TGeoShape *shape, Int_t nsamples, Option_t *option)
Check of validity of the normal for a given shape.
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.
void CheckBoundaryReference(Int_t icheck=-1) override
Check the boundary errors reference file created by CheckBoundaryErrors method.
Double_t * fVal2
Array of number of crossings per volume.
Bool_t TestVoxels(TGeoVolume *vol, Int_t npoints=1000000) override
Returns optimal voxelization type for volume vol.
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.
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="") override
Generate a lego plot fot the top volume, according to option.
void CheckGeometry(Int_t nrays, Double_t startx, Double_t starty, Double_t startz) const override
Shoot nrays with random directions from starting point (startx, starty, startz) in the reference fram...
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.
void PrintOverlaps() const override
Print the current list of overlaps held by the manager class.
TGeoNode * fSelectedNode
Timer.
void CheckGeometryFull(Bool_t checkoverlaps=kTRUE, Bool_t checkcrossings=kTRUE, Int_t nrays=10000, const Double_t *vertex=nullptr) override
Geometry checking.
void SetNmeshPoints(Int_t npoints=1000) override
Set number of points to be generated on the shape outline when checking for overlaps.
void CheckBoundaryErrors(Int_t ntracks=1000000, Double_t radius=-1.) override
Check pushes and pulls needed to cross the next boundary with respect to the position given by FindNe...
~TGeoChecker() override
Destructor.
Int_t fNmeshPoints
Number of checks for current volume.
void TestOverlaps(const char *path) override
Geometry overlap checker based on sampling.
void Test(Int_t npoints, Option_t *option) override
Check time of finding "Where am I" for n points.
Double_t TimingPerVolume(TGeoVolume *)
Compute timing per "FindNextBoundary" + "Safety" call.
void RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz, const char *target_vol=nullptr, Bool_t check_norm=kFALSE) override
Randomly shoot nrays from point (startx,starty,startz) and plot intersections with surfaces for curre...
void RandomPoints(TGeoVolume *vol, Int_t npoints, Option_t *option) override
Draw random points in the bounding box of a volume.
void CheckOverlaps(const TGeoVolume *vol, Double_t ovlp=0.1, Option_t *option="") override
Check illegal overlaps for volume VOL within a limit OVLP.
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.
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.
Abstract class for geometry checkers.
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.