45std::string getOptions()
48 if (grotate) opt.append(
"rotate;");
49 if (axis) opt.append(
"axis;");
54auto geomViewer = std::make_shared<ROOT::Experimental::RGeomViewer>();
62 geomViewer->SetShowHierarchy(
false);
64 geomViewer->Show({600, 600, 160, 0});
71 geomViewer->SetDrawOptions(getOptions());
78 geomViewer->SetDrawOptions(getOptions());
86 helpWindow->CloseConnections();
99 return (1+
Int_t(color));
103std::string AddDbl(
const char *datamember,
Double_t value,
const char *comment)
109std::string AddInt(
const char *datamember,
Int_t value,
const char *comment)
115void help(
const std::vector<std::string> &info = {},
TGeoVolume *fvol =
nullptr,
Int_t iaxis = 0,
const std::vector<std::string> &info2 = {})
117 if (!info.empty() && !comments)
120 std::vector<std::string> lines({
121 " >>>>>>> web geometry viewer <<<<<< ",
122 " Demo for building TGeo basic shapes and simple geometry. Shape parameters are",
123 " displayed in the right pad",
124 "- Click left mouse button to execute one demo",
125 "- While pointing the mouse to the pad containing the geometry, do:",
126 "- .... click-and-move to rotate",
127 "- .... use mouse wheel for zooming",
128 "- .... double click for reset position",
129 "- Execute box(1,8) to divide a box in 8 equal slices along X",
130 "- Most shapes can be divided on X,Y,Z,Rxy or Phi :",
131 "- .... root[0] <shape>(IAXIS, NDIV, START, STEP);",
132 " .... IAXIS = 1,2,3 meaning (X,Y,Z) or (Rxy, Phi, Z)",
133 " .... NDIV = number of slices",
134 " .... START = start slicing position",
135 " .... STEP = division step",
136 "- Click Comments ON/OFF to toggle comments",
137 "- Click Ideal/Align geometry to see how alignment works"
140 helpWindow->SetDefaultPage(
"file:webhelp.html");
142 unsigned connid = helpWindow->GetDisplayConnection();
150 lines.emplace_back(
Form(
"Division of %s on axis %d (%s)", volume->
GetName(), iaxis, sh->
GetAxisName(iaxis)));
151 lines.emplace_back(AddInt(
"fNdiv",finder->
GetNdiv(),
"number of divisions"));
152 lines.emplace_back(AddDbl(
"fStart",finder->
GetStart(),
"start divisioning position"));
153 lines.emplace_back(AddDbl(
"fStep",finder->
GetStep(),
"division step"));
156 lines.insert(lines.end(), info2.begin(), info2.end());
159 if (lines.size() > 10)
height = 50 + lines.size()*20;
161 if (!connid) connid = helpWindow->Show({600,
height, 160, 650});
163 std::string msg =
"";
165 for (
auto &
line : lines) {
166 if (
line.empty())
continue;
167 std::string
style =
"",
p =
"<p style='";
169 else if (
line.find(
"----")==0) {
style =
"color:red"; }
170 else if (
line.find(
"Execute")==0) {
style =
"color:blue"; }
171 else if (
line.find(
"Division")==0) {
style =
"font-size:120%;color:green"; }
172 if (
style.empty())
p =
"<p>";
else {
p.append(
style);
p.append(
"'>"); }
179 helpWindow->Send(connid,
"Initial text");
181 helpWindow->Send(connid, msg);
187 if (iaxis<0 || iaxis>3) {
188 printf(
"Wrong division axis. Range is 1-3.\n");
213 help({
"TGeoBBox - box class",
214 AddDbl(
"fDX",bbox->
GetDX(),
"half length in X"),
215 AddDbl(
"fDY",bbox->
GetDY(),
"half length in Y"),
216 AddDbl(
"fDZ",bbox->
GetDZ(),
"half length in Z"),
217 AddDbl(
"fOrigin[0]",(bbox->
GetOrigin())[0],
"box origin on X"),
218 AddDbl(
"fOrigin[1]",(bbox->
GetOrigin())[1],
"box origin on Y"),
219 AddDbl(
"fOrigin[2]",(bbox->
GetOrigin())[2],
"box origin on Z")},
221 {
"Execute: box(iaxis, ndiv, start, step) to divide this.",
222 "----- IAXIS can be 1, 2 or 3 (X, Y, Z)",
223 "----- NDIV must be a positive integer",
224 "----- START must be a valid axis offset within shape range on divided axis",
225 "----- STEP is the division step. START+NDIV*STEP must be in range also",
226 "----- If START and STEP are omitted, all range of the axis will be divided"});
232 if (iaxis<0 || iaxis>3) {
233 printf(
"Wrong division axis. Range is 1-3.\n");
258 help({
"TGeoPara - parallelepiped class",
259 AddDbl(
"fX", para->
GetX(),
"half length in X"),
260 AddDbl(
"fY", para->
GetY(),
"half length in Y"),
261 AddDbl(
"fZ", para->
GetZ(),
"half length in Z"),
262 AddDbl(
"fAlpha", para->
GetAlpha(),
"angle about Y of the Z bases"),
263 AddDbl(
"fTheta", para->
GetTheta(),
"inclination of para axis about Z"),
264 AddDbl(
"fPhi", para->
GetPhi(),
"phi angle of para axis")},
266 {
"Execute: para(iaxis, ndiv, start, step) to divide this.",
267 "----- IAXIS can be 1, 2 or 3 (X, Y, Z)",
"----- NDIV must be a positive integer",
268 "----- START must be a valid axis offset within shape range on divided axis",
269 "----- STEP is the division step. START+NDIV*STEP must be in range also",
270 "----- If START and STEP are omitted, all range of the axis will be divided"});
277 if (iaxis<0 || iaxis>3) {
278 printf(
"Wrong division axis. Range is 1-3.\n");
303 help({
"TGeoTube - tube class",
304 AddDbl(
"fRmin",tube->
GetRmin(),
"minimum radius"),
305 AddDbl(
"fRmax",tube->
GetRmax(),
"maximum radius"),
306 AddDbl(
"fDZ", tube->
GetDZ(),
"half length in Z")},
308 {
"Execute: tube(iaxis, ndiv, start, step) to divide this.",
309 "----- IAXIS can be 1, 2 or 3 (Rxy, Phi, Z)",
310 "----- NDIV must be a positive integer",
311 "----- START must be a valid axis offset within shape range on divided axis",
312 "----- STEP is the division step. START+NDIV*STEP must be in range also",
313 "----- If START and STEP are omitted, all range of the axis will be divided"});
321 if (iaxis<0 || iaxis>3) {
322 printf(
"Wrong division axis. Range is 1-3.\n");
349 help({
"TGeoTubeSeg - tube segment class",
350 AddDbl(
"fRmin",tubeseg->
GetRmin(),
"minimum radius"),
351 AddDbl(
"fRmax",tubeseg->
GetRmax(),
"maximum radius"),
352 AddDbl(
"fDZ", tubeseg->
GetDZ(),
"half length in Z"),
353 AddDbl(
"fPhi1",tubeseg->
GetPhi1(),
"first phi limit"),
354 AddDbl(
"fPhi2",tubeseg->
GetPhi2(),
"second phi limit")},
356 {
"Execute: tubeseg(iaxis, ndiv, start, step) to divide this.",
357 "----- IAXIS can be 1, 2 or 3 (Rxy, Phi, Z)",
358 "----- NDIV must be a positive integer",
359 "----- START must be a valid axis offset within shape range on divided axis",
360 "----- STEP is the division step. START+NDIV*STEP must be in range also",
361 "----- If START and STEP are omitted, all range of the axis will be divided"});
368 if (iaxis<0 || iaxis>2) {
369 printf(
"Wrong division axis. Range is 1-2.\n");
391 TGeoVolume *vol =
gGeoManager->
MakeCtub(
"CTUB",med, 20,30,40,-30,250, nlow[0], nlow[1], nlow[2], nhi[0],nhi[1],nhi[2]);
408 help({
"TGeoTubeSeg - tube segment class",
409 AddDbl(
"fRmin",tubeseg->
GetRmin(),
"minimum radius"),
410 AddDbl(
"fRmax",tubeseg->
GetRmax(),
"maximum radius"),
411 AddDbl(
"fDZ", tubeseg->
GetDZ(),
"half length in Z"),
412 AddDbl(
"fPhi1",tubeseg->
GetPhi1(),
"first phi limit"),
413 AddDbl(
"fPhi2",tubeseg->
GetPhi2(),
"second phi limit")},
421 if (iaxis<0 || iaxis>3) {
422 printf(
"Wrong division axis. Range is 1-3.\n");
424 }
else if (iaxis==1) {
425 printf(
"cannot divide cone on Rxy\n");
451 help({
"TGeoCone - cone class",
452 AddDbl(
"fDZ", cone->
GetDZ(),
"half length in Z"),
453 AddDbl(
"fRmin1",cone->
GetRmin1(),
"inner radius at -dz"),
454 AddDbl(
"fRmax1",cone->
GetRmax1(),
"outer radius at -dz"),
455 AddDbl(
"fRmin2",cone->
GetRmin2(),
"inner radius at +dz"),
456 AddDbl(
"fRmax2",cone->
GetRmax2(),
"outer radius at +dz")},
458 {
"Execute: cone(iaxis, ndiv, start, step) to divide this.",
459 "----- IAXIS can be 2 or 3 (Phi, Z)",
460 "----- NDIV must be a positive integer",
461 "----- START must be a valid axis offset within shape range on divided axis",
462 "----- STEP is the division step. START+NDIV*STEP must be in range also",
463 "----- If START and STEP are omitted, all range of the axis will be divided"});
470 if (iaxis<0 || iaxis>3) {
471 printf(
"Wrong division axis. Range is 1-3.\n");
497 help({
"TGeoConeSeg - coneseg class",
498 AddDbl(
"fDZ", coneseg->
GetDZ(),
"half length in Z"),
499 AddDbl(
"fRmin1",coneseg->
GetRmin1(),
"inner radius at -dz"),
500 AddDbl(
"fRmax1",coneseg->
GetRmax1(),
"outer radius at -dz"),
501 AddDbl(
"fRmin2",coneseg->
GetRmin1(),
"inner radius at +dz"),
502 AddDbl(
"fRmax2",coneseg->
GetRmax1(),
"outer radius at +dz"),
503 AddDbl(
"fPhi1",coneseg->
GetPhi1(),
"first phi limit"),
504 AddDbl(
"fPhi2",coneseg->
GetPhi2(),
"second phi limit")},
506 {
"Execute: coneseg(iaxis, ndiv, start, step) to divide this.",
507 "----- IAXIS can be 2 or 3 (Phi, Z)",
508 "----- NDIV must be a positive integer",
509 "----- START must be a valid axis offset within shape range on divided axis",
510 "----- STEP is the division step. START+NDIV*STEP must be in range also",
511 "----- If START and STEP are omitted, all range of the axis will be divided"});
540 help({
"TGeoEltu - eltu class",
541 AddDbl(
"fA",eltu->
GetA(),
"semi-axis along x"),
542 AddDbl(
"fB",eltu->
GetB(),
"semi-axis along y"),
543 AddDbl(
"fDZ", eltu->
GetDZ(),
"half length in Z")},
545 {
"Execute: eltu(iaxis, ndiv, start, step) to divide this.",
546 "----- IAXIS can be 2 or 3 (Phi, Z)",
547 "----- NDIV must be a positive integer",
548 "----- START must be a valid axis offset within shape range on divided axis",
549 "----- STEP is the division step. START+NDIV*STEP must be in range also",
550 "----- If START and STEP are omitted, all range of the axis will be divided"});
558 printf(
"Cannot divide spheres\n");
584 help({
"TGeoSphere- sphere class",
585 AddDbl(
"fRmin",sphere->
GetRmin(),
"inner radius"),
586 AddDbl(
"fRmax",sphere->
GetRmax(),
"outer radius"),
587 AddDbl(
"fTheta1",sphere->
GetTheta1(),
"lower theta limit"),
588 AddDbl(
"fTheta2",sphere->
GetTheta2(),
"higher theta limit"),
589 AddDbl(
"fPhi1",sphere->
GetPhi1(),
"lower phi limit"),
590 AddDbl(
"fPhi2",sphere->
GetPhi2(),
"higher phi limit")},
599 printf(
"Cannot divide a torus\n");
624 help({
"TGeoTorus - torus class",
625 AddDbl(
"fR",tor->
GetR(),
"radius of the ring"),
626 AddDbl(
"fRmin",tor->
GetRmin(),
"minimum radius"),
627 AddDbl(
"fRmax",tor->
GetRmax(),
"maximum radius"),
628 AddDbl(
"fPhi1", tor->
GetPhi1(),
"starting phi angle"),
629 AddDbl(
"fDphi", tor->
GetDphi(),
"phi range")},
636 if (iaxis<0 || iaxis>3) {
637 printf(
"Wrong division axis. Range is 1-3.\n");
639 }
else if (iaxis==1) {
640 printf(
"Cannot divide trd1 on X axis\n");
667 help({
"TGeoTrd1 - Trd1 class",
668 AddDbl(
"fDx1",trd1->
GetDx1(),
"half length in X at lower Z surface(-dz)"),
669 AddDbl(
"fDx2",trd1->
GetDx2(),
"half length in X at higher Z surface(+dz)"),
670 AddDbl(
"fDy",trd1->
GetDy(),
"half length in Y"),
671 AddDbl(
"fDz",trd1->
GetDz(),
"half length in Z")},
673 {
"Execute: trd1(iaxis, ndiv, start, step) to divide this.",
674 "----- IAXIS can be 2 or 3 (Y, Z)",
675 "----- NDIV must be a positive integer",
676 "----- START must be a valid axis offset within shape range on divided axis",
677 "----- STEP is the division step. START+NDIV*STEP must be in range also",
678 "----- If START and STEP are omitted, all range of the axis will be divided"});
701 help({
"TGeoParaboloid - Paraboloid class",
702 AddDbl(
"fRlo",par->
GetRlo(),
"radius at Z=-dz"),
703 AddDbl(
"fRhi",par->
GetRhi(),
"radius at Z=+dz"),
704 AddDbl(
"fDz",par->
GetDz(),
"half-length on Z axis"),
705 "----- A paraboloid is described by the equation:",
706 "----- z = a*r*r + b; where: r = x*x + y*y",
707 "----- Create with: TGeoParaboloid *parab = new TGeoParaboloid(rlo, rhi, dz);",
708 "----- dz: half-length in Z (range from -dz to +dz",
709 "----- rlo: radius at z=-dz given by: -dz = a*rlo*rlo + b",
710 "----- rhi: radius at z=+dz given by: dz = a*rhi*rhi + b",
711 "----- rlo != rhi; both >= 0"});
733 help({
"TGeoHype - Hyperboloid class",
734 AddDbl(
"fRmin",hype->
GetRmin(),
"minimum inner radius"),
735 AddDbl(
"fStIn",hype->
GetStIn(),
"inner surface stereo angle [deg]"),
736 AddDbl(
"fRmax",hype->
GetRmax(),
"minimum outer radius"),
737 AddDbl(
"fStOut",hype->
GetStOut(),
"outer surface stereo angle [deg]"),
738 AddDbl(
"fDz",hype->
GetDz(),
"half-length on Z axis"),
739 "----- A hyperboloid is described by the equation:",
740 "----- r^2 - (tan(stereo)*z)^2 = rmin^2; where: r = x*x + y*y",
741 "----- Create with: TGeoHype *hype = new TGeoHype(rin, stin, rout, stout, dz);",
742 "----- rin < rout; rout > 0",
743 "----- rin = 0; stin > 0 => inner surface conical",
744 "----- stin/stout = 0 => corresponding surface cylindrical"});
750 if (iaxis<0 || iaxis>3) {
751 printf(
"Wrong division axis. Range is 1-3.\n");
753 }
else if (iaxis==1) {
754 printf(
"Cannot divide pcon on Rxy\n");
783 std::vector<std::string> lines = {
"TGeoPcon - pcon class",
784 AddDbl(
"fPhi1",pcon->
GetPhi1(),
"lower phi limit"),
785 AddDbl(
"fDphi",pcon->
GetDphi(),
"phi range"),
786 AddDbl(
"fNz",pcon->
GetNz(),
"number of z planes")};
789 lines.emplace_back(
Form(
"fZ[%i]=%5.2f fRmin[%i]=%5.2f fRmax[%i]=%5.2f",
792 help(lines, vol, iaxis,
793 {
"Execute: pcon(iaxis, ndiv, start, step) to divide this.",
794 "----- IAXIS can be 2 or 3 (Phi, Z)",
795 "----- NDIV must be a positive integer",
796 "----- START must be a valid axis offset within shape range on divided axis",
797 "----- STEP is the division step. START+NDIV*STEP must be in range also",
798 "----- If START and STEP are omitted, all range of the axis will be divided"});
805 if (iaxis<0 || iaxis>3) {
806 printf(
"Wrong division axis. Range is 1-3.\n");
808 }
else if (iaxis==1) {
809 printf(
"Cannot divide pgon on Rxy\n");
838 std::vector<std::string> lines({
"TGeoPgon - pgon class",
839 AddDbl(
"fPhi1",pgon->
GetPhi1(),
"lower phi limit"),
840 AddDbl(
"fDphi",pgon->
GetDphi(),
"phi range"),
841 AddDbl(
"fNedges",pgon->
GetNedges(),
"number of edges"),
842 AddDbl(
"fNz",pgon->
GetNz(),
"number of z planes")});
845 lines.emplace_back(
Form(
"fZ[%i]=%5.2f fRmin[%i]=%5.2f fRmax[%i]=%5.2f",
848 help(lines, vol, iaxis,
849 {
"Execute: pgon(iaxis, ndiv, start, step) to divide this.",
850 "----- IAXIS can be 2 or 3 (Phi, Z)",
851 "----- NDIV must be a positive integer",
852 "----- START must be a valid axis offset within shape range on divided axis",
853 "----- STEP is the division step. START+NDIV*STEP must be in range also",
854 "----- If START and STEP are omitted, all range of the axis will be divided"});
863 printf(
"Cannot divide arb8\n");
896 std::vector<std::string> lines({
"TGeoArb8 - arb8 class",
897 AddDbl(
"fDz",arb->
GetDz(),
"Z half length"),
898 "Vertices on lower Z plane:"});
901 for (
Int_t i=0; i<8; i++) {
902 if (i==4) lines.emplace_back(
"Vertices on higher Z plane:");
903 lines.emplace_back(
Form(
" fXY[%d] = (%5.2f, %5.2f)", i, vert[2*i], vert[2*i+1]));
906 help(lines, vol, iaxis);
913 if (iaxis && iaxis!=3) {
914 printf(
"Wrong division axis. trd2 can divide only in Z (3)\n");
940 help({
"TGeoTrd2 - Trd2 class",
941 AddDbl(
"fDx1",trd2->
GetDx1(),
"half length in X at lower Z surface(-dz)"),
942 AddDbl(
"fDx2",trd2->
GetDx2(),
"half length in X at higher Z surface(+dz)"),
943 AddDbl(
"fDy1",trd2->
GetDy1(),
"half length in Y at lower Z surface(-dz)"),
944 AddDbl(
"fDy2",trd2->
GetDy2(),
"half length in Y at higher Z surface(-dz)"),
945 AddDbl(
"fDz",trd2->
GetDz(),
"half length in Z")},
947 {
"Execute: trd2(iaxis, ndiv, start, step) to divide this.",
948 "----- IAXIS can be only 3 (Z)",
949 "----- NDIV must be a positive integer",
950 "----- START must be a valid axis offset within shape range on divided axis",
951 "----- STEP is the division step. START+NDIV*STEP must be in range also",
952 "----- If START and STEP are omitted, all range of the axis will be divided"});
959 if (iaxis && iaxis!=3) {
960 printf(
"Wrong division axis. Can divide only in Z (3)\n");
970 TGeoVolume *vol =
gGeoManager->
MakeTrap(
"Trap",med, 30,15,30,20,10,15,0,20,10,15,0);
986 help({
"TGeoTrap - Trapezoid class",
987 AddDbl(
"fDz",trap->
GetDz(),
"half length in Z"),
988 AddDbl(
"fTheta",trap->
GetTheta(),
"theta angle of trapezoid axis"),
989 AddDbl(
"fPhi",trap->
GetPhi(),
"phi angle of trapezoid axis"),
990 AddDbl(
"fH1",trap->
GetH1(),
"half length in y at -fDz"),
991 AddDbl(
"fAlpha1",trap->
GetAlpha1(),
"angle between centers of x edges and y axis at -fDz"),
992 AddDbl(
"fBl1",trap->
GetBl1(),
"half length in x at -dZ and y=-fH1"),
993 AddDbl(
"fTl1",trap->
GetTl1(),
"half length in x at -dZ and y=+fH1"),
994 AddDbl(
"fH2",trap->
GetH2(),
"half length in y at +fDz"),
995 AddDbl(
"fBl2",trap->
GetBl2(),
"half length in x at +dZ and y=-fH1"),
996 AddDbl(
"fTl2",trap->
GetTl2(),
"half length in x at +dZ and y=+fH1"),
997 AddDbl(
"fAlpha2",trap->
GetAlpha2(),
"angle between centers of x edges and y axis at +fDz")},
999 {
"Execute: trap(iaxis, ndiv, start, step) to divide this.",
1000 "----- IAXIS can be only 3 (Z)",
1001 "----- NDIV must be a positive integer",
1002 "----- START must be a valid axis offset within shape range on divided axis",
1003 "----- STEP is the division step. START+NDIV*STEP must be in range also",
1004 "----- If START and STEP are omitted, all range of the axis will be divided"});
1011 if (iaxis && iaxis!=3) {
1012 printf(
"Wrong division axis. Can divide only in Z (3)\n");
1022 TGeoVolume *vol =
gGeoManager->
MakeGtra(
"Gtra",med, 30,15,30,30,20,10,15,0,20,10,15,0);
1038 help({
"TGeoGtra - Twisted trapezoid class",
1039 AddDbl(
"fDz",trap->
GetDz(),
"half length in Z"),
1040 AddDbl(
"fTheta",trap->
GetTheta(),
"theta angle of trapezoid axis"),
1041 AddDbl(
"fPhi",trap->
GetPhi(),
"phi angle of trapezoid axis"),
1043 AddDbl(
"fH1",trap->
GetH1(),
"half length in y at -fDz"),
1044 AddDbl(
"fAlpha1",trap->
GetAlpha1(),
"angle between centers of x edges and y axis at -fDz"),
1045 AddDbl(
"fBl1",trap->
GetBl1(),
"half length in x at -dZ and y=-fH1"),
1046 AddDbl(
"fTl1",trap->
GetTl1(),
"half length in x at -dZ and y=+fH1"),
1047 AddDbl(
"fH2",trap->
GetH2(),
"half length in y at +fDz"),
1048 AddDbl(
"fBl2",trap->
GetBl2(),
"half length in x at +dZ and y=-fH1"),
1049 AddDbl(
"fTl2",trap->
GetTl2(),
"half length in x at +dZ and y=+fH1"),
1050 AddDbl(
"fAlpha2",trap->
GetAlpha2(),
"angle between centers of x edges and y axis at +fDz")},
1052 {
"Execute: gtra(iaxis, ndiv, start, step) to divide this.",
1053 "----- IAXIS can be only 3 (Z)",
1054 "----- NDIV must be a positive integer",
1055 "----- START must be a valid axis offset within shape range on divided axis",
1056 "----- STEP is the division step. START+NDIV*STEP must be in range also",
1057 "----- If START and STEP are omitted, all range of the axis will be divided"});
1072 Double_t x[8] = {-30,-30,30,30,15,15,-15,-15};
1073 Double_t y[8] = {-30,30,30,-30,-30,15,15,-30};
1087 help({
"TGeoXtru - Polygonal extrusion class",
1088 AddDbl(
"fNvert",xtru->
GetNvert(),
"number of polygone vertices"),
1089 AddDbl(
"fNz",xtru->
GetNz(),
"number of Z sections"),
1090 "----- Any Z section is an arbitrary polygone",
1091 "----- The shape can have an arbitrary number of Z sections, as for pcon/pgon",
1092 "----- Create with: TGeoXtru *xtru = new TGeoXtru(nz);",
1093 "----- Define the blueprint polygon :",
1094 "----- Double_t x[8] = {-30,-30,30,30,15,15,-15,-15};",
1095 "----- Double_t y[8] = {-30,30,30,-30,-30,15,15,-30};",
1096 "----- xtru->DefinePolygon(8,x,y);",
1097 "----- Define translations/scales of the blueprint for Z sections :",
1098 "----- xtru->DefineSection(i, Zsection, x0, y0, scale);",
1099 "----- Sections have to be defined in increasing Z order",
1100 "----- 2 sections can be defined at same Z (not for first/last sections)"});
1115 std::vector<Tessellated::Vertex_t> vert;
1117 vert.emplace_back(0, 0.5 * (1 + sqrt5), -1); vert.emplace_back(0, 0.5 * (-1 + sqrt5), 0.5 * (-1 - sqrt5)); vert.emplace_back(-1, 0, 0.5 * (-1 - sqrt5)); vert.emplace_back(-1, 1, -1);
1118 vert.emplace_back(1, 1, -1); vert.emplace_back(0, 0.5 * (1 + sqrt5), -1); vert.emplace_back(0, 0.5 * (-1 + sqrt5), 0.5 * (-1 - sqrt5)); vert.emplace_back(1, 0, 0.5 * (-1 - sqrt5));
1119 vert.emplace_back(1, 1, -1); vert.emplace_back(0, 0.5 * (1 + sqrt5), -1); vert.emplace_back(0.5 * (-1 + sqrt5), 0.5 * (1 + sqrt5), 0); vert.emplace_back(0.5 * (1 + sqrt5), 1, 0);
1120 vert.emplace_back(0.5 * (1 - sqrt5), 0.5 * (1 + sqrt5), 0); vert.emplace_back(0, 0.5 * (1 + sqrt5), -1); vert.emplace_back(0.5 * (-1 + sqrt5), 0.5 * (1 + sqrt5), 0); vert.emplace_back(0, 0.5 * (1 + sqrt5), 1);
1121 vert.emplace_back(0.5 * (1 - sqrt5), 0.5 * (1 + sqrt5), 0); vert.emplace_back(0, 0.5 * (1 + sqrt5), -1); vert.emplace_back(-1, 1, -1); vert.emplace_back(0.5 * (-1 - sqrt5), 1, 0);
1122 vert.emplace_back(1, 1, -1); vert.emplace_back(0.5 * (1 + sqrt5), 1, 0); vert.emplace_back(0.5 * (1 + sqrt5), 0, 0.5 * (1 - sqrt5)); vert.emplace_back(1, 0, 0.5 * (-1 - sqrt5));
1123 vert.emplace_back(0.5 * (1 + sqrt5), 0, 0.5 * (1 - sqrt5)); vert.emplace_back(0.5 * (1 + sqrt5), -1, 0); vert.emplace_back(1, -1, -1); vert.emplace_back(1, 0, 0.5 * (-1 - sqrt5));
1124 vert.emplace_back(1, -1, -1); vert.emplace_back(0, 0.5 * (-1 - sqrt5), -1); vert.emplace_back(0, 0.5 * (1 - sqrt5), 0.5 * (-1 - sqrt5)); vert.emplace_back(1, 0, 0.5 * (-1 - sqrt5));
1125 vert.emplace_back(1, 0, 0.5 * (-1 - sqrt5)); vert.emplace_back(0, 0.5 * (-1 + sqrt5), 0.5 * (-1 - sqrt5)); vert.emplace_back(-1, 0, 0.5 * (-1 - sqrt5)); vert.emplace_back(0, 0.5 * (1 - sqrt5), 0.5 * (-1 - sqrt5));
1126 vert.emplace_back(0.5 * (-1 + sqrt5), 0.5 * (1 + sqrt5), 0); vert.emplace_back(0.5 * (1 + sqrt5), 1, 0); vert.emplace_back(1, 1, 1); vert.emplace_back(0, 0.5 * (1 + sqrt5), 1);
1127 vert.emplace_back(0.5 * (1 + sqrt5), 1, 0); vert.emplace_back(1, 1, 1); vert.emplace_back(1, 0, 0.5 * (1 + sqrt5)); vert.emplace_back(0.5 * (1 + sqrt5), 0, 0.5 * (-1 + sqrt5));
1128 vert.emplace_back(0.5 * (1 + sqrt5), 0, 0.5 * (1 - sqrt5)); vert.emplace_back(0.5 * (1 + sqrt5), 1, 0); vert.emplace_back(0.5 * (1 + sqrt5), 0, 0.5 * (-1 + sqrt5)); vert.emplace_back(0.5 * (1 + sqrt5), -1, 0);
1129 vert.emplace_back(0.5 * (1 - sqrt5), 0.5 * (1 + sqrt5), 0); vert.emplace_back(0, 0.5 * (1 + sqrt5), 1); vert.emplace_back(-1, 1, 1); vert.emplace_back(0.5 * (-1 - sqrt5), 1, 0);
1130 vert.emplace_back(0, 0.5 * (1 + sqrt5), 1); vert.emplace_back(0, 0.5 * (-1 + sqrt5), 0.5 * (1 + sqrt5)); vert.emplace_back(-1, 0, 0.5 * (1 + sqrt5)); vert.emplace_back(-1, 1, 1);
1131 vert.emplace_back(1, 1, 1); vert.emplace_back(0, 0.5 * (1 + sqrt5), 1); vert.emplace_back(0, 0.5 * (-1 + sqrt5), 0.5 * (1 + sqrt5)); vert.emplace_back(1, 0, 0.5 * (1 + sqrt5));
1132 vert.emplace_back(0, 0.5 * (1 - sqrt5), 0.5 * (1 + sqrt5)); vert.emplace_back(-1, 0, 0.5 * (1 + sqrt5)); vert.emplace_back(0, 0.5 * (-1 + sqrt5), 0.5 * (1 + sqrt5)); vert.emplace_back(1, 0, 0.5 * (1 + sqrt5));
1133 vert.emplace_back(0, 0.5 * (1 - sqrt5), 0.5 * (1 + sqrt5)); vert.emplace_back(1, 0, 0.5 * (1 + sqrt5)); vert.emplace_back(1, -1, 1); vert.emplace_back(0, 0.5 * (-1 - sqrt5), 1);
1134 vert.emplace_back(0.5 * (1 + sqrt5), 0, 0.5 * (-1 + sqrt5)); vert.emplace_back(0.5 * (1 + sqrt5), -1, 0); vert.emplace_back(1, -1, 1); vert.emplace_back(1, 0, 0.5 * (1 + sqrt5));
1135 vert.emplace_back(-1, 0, 0.5 * (1 + sqrt5)); vert.emplace_back(-1, 1, 1); vert.emplace_back(0.5 * (-1 - sqrt5), 1, 0); vert.emplace_back(0.5 * (-1 - sqrt5), 0, 0.5 * (-1 + sqrt5));
1136 vert.emplace_back(-1, -1, 1); vert.emplace_back(-1, 0, 0.5 * (1 + sqrt5)); vert.emplace_back(0.5 * (-1 - sqrt5), 0, 0.5 * (-1 + sqrt5)); vert.emplace_back(0.5 * (-1 - sqrt5), -1, 0);
1137 vert.emplace_back(0, 0.5 * (1 - sqrt5), 0.5 * (1 + sqrt5)); vert.emplace_back(-1, 0, 0.5 * (1 + sqrt5)); vert.emplace_back(-1, -1, 1); vert.emplace_back(0, 0.5 * (-1 - sqrt5), 1);
1138 vert.emplace_back(0.5 * (-1 - sqrt5), -1, 0); vert.emplace_back(0.5 * (-1 - sqrt5), 0, 0.5 * (1 - sqrt5)); vert.emplace_back(0.5 * (-1 - sqrt5), 1, 0); vert.emplace_back(0.5 * (-1 - sqrt5), 0, 0.5 * (-1 + sqrt5));
1139 vert.emplace_back(0.5 * (-1 - sqrt5), -1, 0); vert.emplace_back(0.5 * (-1 - sqrt5), 0, 0.5 * (1 - sqrt5)); vert.emplace_back(-1, 0, 0.5 * (-1 - sqrt5)); vert.emplace_back(-1, -1, -1);
1140 vert.emplace_back(0, 0.5 * (-1 - sqrt5), -1); vert.emplace_back(0.5 * (1 - sqrt5), 0.5 * (-1 - sqrt5), 0); vert.emplace_back(0.5 * (-1 - sqrt5), -1, 0); vert.emplace_back(-1, -1, -1);
1141 vert.emplace_back(0.5 * (1 - sqrt5), 0.5 * (-1 - sqrt5), 0); vert.emplace_back(0.5 * (-1 - sqrt5), -1, 0); vert.emplace_back(-1, -1, 1); vert.emplace_back(0, 0.5 * (-1 - sqrt5), 1);
1142 vert.emplace_back(-1, 1, -1); vert.emplace_back(-1, 0, 0.5 * (-1 - sqrt5)); vert.emplace_back(0.5 * (-1 - sqrt5), 0, 0.5 * (1 - sqrt5)); vert.emplace_back(0.5 * (-1 - sqrt5), 1, 0);
1143 vert.emplace_back(0, 0.5 * (-1 - sqrt5), -1); vert.emplace_back(0, 0.5 * (1 - sqrt5), 0.5 * (-1 - sqrt5)); vert.emplace_back(-1, 0, 0.5 * (-1 - sqrt5)); vert.emplace_back(-1, -1, -1);
1144 vert.emplace_back(0, 0.5 * (-1 - sqrt5), -1); vert.emplace_back(0.5 * (1 - sqrt5), 0.5 * (-1 - sqrt5), 0); vert.emplace_back(0, 0.5 * (-1 - sqrt5), 1); vert.emplace_back(0.5 * (-1 + sqrt5), 0.5 * (-1 - sqrt5), 0);
1145 vert.emplace_back(1, -1, -1); vert.emplace_back(0.5 * (1 + sqrt5), -1, 0); vert.emplace_back(0.5 * (-1 + sqrt5), 0.5 * (-1 - sqrt5), 0); vert.emplace_back(0, 0.5 * (-1 - sqrt5), -1);
1146 vert.emplace_back(0.5 * (1 + sqrt5), -1, 0); vert.emplace_back(1, -1, 1); vert.emplace_back(0, 0.5 * (-1 - sqrt5), 1); vert.emplace_back(0.5 * (-1 + sqrt5), 0.5 * (-1 - sqrt5), 0);
1148 tsl->
AddFacet(vert[0], vert[1], vert[2], vert[3]);
1149 tsl->
AddFacet(vert[4], vert[7], vert[6], vert[5]);
1150 tsl->
AddFacet(vert[8], vert[9], vert[10], vert[11]);
1151 tsl->
AddFacet(vert[12], vert[15], vert[14], vert[13]);
1152 tsl->
AddFacet(vert[16], vert[17], vert[18], vert[19]);
1153 tsl->
AddFacet(vert[20], vert[21], vert[22], vert[23]);
1154 tsl->
AddFacet(vert[24], vert[25], vert[26], vert[27]);
1155 tsl->
AddFacet(vert[28], vert[29], vert[30], vert[31]);
1156 tsl->
AddFacet(vert[32], vert[35], vert[34], vert[33]);
1157 tsl->
AddFacet(vert[36], vert[39], vert[38], vert[37]);
1158 tsl->
AddFacet(vert[40], vert[41], vert[42], vert[43]);
1159 tsl->
AddFacet(vert[44], vert[45], vert[46], vert[47]);
1160 tsl->
AddFacet(vert[48], vert[51], vert[50], vert[49]);
1161 tsl->
AddFacet(vert[52], vert[55], vert[54], vert[53]);
1162 tsl->
AddFacet(vert[56], vert[57], vert[58], vert[59]);
1163 tsl->
AddFacet(vert[60], vert[63], vert[62], vert[61]);
1164 tsl->
AddFacet(vert[64], vert[67], vert[66], vert[65]);
1165 tsl->
AddFacet(vert[68], vert[71], vert[70], vert[69]);
1166 tsl->
AddFacet(vert[72], vert[73], vert[74], vert[75]);
1167 tsl->
AddFacet(vert[76], vert[77], vert[78], vert[79]);
1168 tsl->
AddFacet(vert[80], vert[81], vert[82], vert[83]);
1169 tsl->
AddFacet(vert[84], vert[87], vert[86], vert[85]);
1170 tsl->
AddFacet(vert[88], vert[89], vert[90], vert[91]);
1171 tsl->
AddFacet(vert[92], vert[93], vert[94], vert[95]);
1172 tsl->
AddFacet(vert[96], vert[99], vert[98], vert[97]);
1173 tsl->
AddFacet(vert[100], vert[101], vert[102], vert[103]);
1174 tsl->
AddFacet(vert[104], vert[107], vert[106], vert[105]);
1175 tsl->
AddFacet(vert[108], vert[111], vert[110], vert[109]);
1176 tsl->
AddFacet(vert[112], vert[113], vert[114], vert[115]);
1177 tsl->
AddFacet(vert[116], vert[117], vert[118], vert[119]);
1187 help( {
"TGeoTessellated - Tessellated shape class",
1188 AddInt(
"fNfacets",tsl->
GetNfacets(),
"number of facets"),
1189 AddInt(
"fNvertices",tsl->
GetNvertices(),
"number of vertices"),
1190 "----- A tessellated shape is defined by the number of facets",
1191 "----- facets can be added using AddFacet",
1192 "----- Create with: TGeoTessellated *tsl = new TGeoTessellated(nfacets);"});
1228 help({
"TGeoCompositeShape - composite shape class",
1229 "----- Define the shape components and don't forget to name them",
1230 "----- Define geometrical transformations that apply to shape components",
1231 "----- Name all transformations and register them",
1232 "----- Define the composite shape based on a Boolean expression",
1233 " TGeoCompositeShape(\"someName\", \"expression\")",
1234 "----- Expression is made of <shapeName:transfName> components related by Boolean operators",
1235 "----- Boolean operators can be: (+) union, (-) subtraction and (*) intersection",
1236 "----- Use parenthesis in the expression to force precedence"});
1294 help({
"Ideal / Aligned geometry",
1295 "-- Create physical nodes for the objects you want to align",
1296 "-- You must start from a valid CLOSED geometry",
1297 " TGeoPhysicalNode *node = gGeoManager->MakePhysicalNode(const char *path)",
1298 " + creates a physical node represented by path, e.g. TOP_1/A_2/B_3",
1299 " node->Align(TGeoMatrix *newmat, TGeoShape *newshape, Bool_t check=kFALSE)",
1300 " + newmat = new matrix to replace final node LOCAL matrix",
1301 " + newshape = new shape to replace final node shape",
1302 " + check = optional check if the new aligned node is overlapping"});
1310 printf(
"Click: <Ideal geometry> first\n");
1317 for (
Int_t i=1; i<=10; i++) {
1318 for (
Int_t j=1; j<=10; j++) {
1320 sprintf(
name,
"TOP_1/SX_%d/SY_%d/CELL_1",i,j);
1339 mainWindow->TerminateROOT();
1347 mainWindow->SetDefaultPage(
"file:webdemo.html");
1350 mainWindow->SetDataCallBack([](
unsigned connid,
const std::string &arg) {
1351 gROOT->ProcessLine(arg.c_str());
1354 mainWindow->Show({150,750, 0,0});
1356 geomViewer->SetDrawOptions(getOptions());
winID h TVirtualViewer3D TVirtualGLPainter p
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 height
R__EXTERN TGeoManager * gGeoManager
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
An arbitrary trapezoid with less than 8 vertices standing on two parallel planes perpendicular to Z a...
virtual void SetVertex(Int_t vnum, Double_t x, Double_t y)
Set values for a given vertex.
virtual const Double_t * GetOrigin() const
virtual Double_t GetDX() const
virtual Double_t GetDZ() const
virtual Double_t GetDY() const
Composite shapes are Boolean combinations of two or more shape components.
A cone segment is a cone having a range in phi.
The cones are defined by 5 parameters:
virtual Double_t GetRmax2() const
virtual Double_t GetRmin2() const
virtual Double_t GetRmin1() const
virtual Double_t GetRmax1() const
An elliptical tube is defined by the two semi-axes A and B.
virtual Double_t GetA() const
virtual Double_t GetB() const
Double_t GetTwistAngle() const
A hyperboloid is represented as a solid limited by two planes perpendicular to the Z axis (top and bo...
Double_t GetStOut() const
The manager class for any TGeo geometry.
TGeoVolume * MakeCone(const char *name, TGeoMedium *medium, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
Make in one step a volume pointing to a cone shape with given medium.
TGeoVolume * MakeXtru(const char *name, TGeoMedium *medium, Int_t nz)
Make a TGeoXtru-shaped volume with nz planes.
TGeoVolume * MakePcon(const char *name, TGeoMedium *medium, Double_t phi, Double_t dphi, Int_t nz)
Make in one step a volume pointing to a polycone shape with given medium.
TGeoVolume * MakeTube(const char *name, TGeoMedium *medium, Double_t rmin, Double_t rmax, Double_t dz)
Make in one step a volume pointing to a tube shape with given medium.
TGeoVolume * MakeCons(const char *name, TGeoMedium *medium, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2)
Make in one step a volume pointing to a cone segment shape with given medium.
TGeoVolume * MakePara(const char *name, TGeoMedium *medium, Double_t dx, Double_t dy, Double_t dz, Double_t alpha, Double_t theta, Double_t phi)
Make in one step a volume pointing to a parallelepiped shape with given medium.
TGeoPhysicalNode * MakePhysicalNode(const char *path=nullptr)
Makes a physical node corresponding to a path.
TGeoVolume * MakeTorus(const char *name, TGeoMedium *medium, Double_t r, Double_t rmin, Double_t rmax, Double_t phi1=0, Double_t dphi=360)
Make in one step a volume pointing to a torus shape with given medium.
void CloseGeometry(Option_t *option="d")
Closing geometry implies checking the geometry validity, fixing shapes with negative parameters (run-...
TGeoVolume * MakeTrd2(const char *name, TGeoMedium *medium, Double_t dx1, Double_t dx2, Double_t dy1, Double_t dy2, Double_t dz)
Make in one step a volume pointing to a TGeoTrd2 shape with given medium.
TGeoVolume * MakeGtra(const char *name, TGeoMedium *medium, Double_t dz, Double_t theta, Double_t phi, Double_t twist, Double_t h1, Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2, Double_t tl2, Double_t alpha2)
Make in one step a volume pointing to a twisted trapezoid shape with given medium.
TGeoVolume * MakeBox(const char *name, TGeoMedium *medium, Double_t dx, Double_t dy, Double_t dz)
Make in one step a volume pointing to a box shape with given medium.
TGeoVolume * MakeTrd1(const char *name, TGeoMedium *medium, Double_t dx1, Double_t dx2, Double_t dy, Double_t dz)
Make in one step a volume pointing to a TGeoTrd1 shape with given medium.
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.
void SetTopVolume(TGeoVolume *vol)
Set the top volume and corresponding node as starting point of the geometry.
TGeoVolume * MakeCtub(const char *name, TGeoMedium *medium, Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t phi2, Double_t lx, Double_t ly, Double_t lz, Double_t tx, Double_t ty, Double_t tz)
Make in one step a volume pointing to a tube segment shape with given medium.
TGeoVolume * MakePgon(const char *name, TGeoMedium *medium, Double_t phi, Double_t dphi, Int_t nedges, Int_t nz)
Make in one step a volume pointing to a polygone shape with given medium.
TGeoVolume * MakeTrap(const char *name, TGeoMedium *medium, Double_t dz, Double_t theta, Double_t phi, Double_t h1, Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2, Double_t tl2, Double_t alpha2)
Make in one step a volume pointing to a trapezoid shape with given medium.
void SetNsegments(Int_t nseg)
Set number of segments for approximating circles in drawing.
TObjArray * GetListOfPhysicalNodes()
TGeoVolume * MakeHype(const char *name, TGeoMedium *medium, Double_t rin, Double_t stin, Double_t rout, Double_t stout, Double_t dz)
Make in one step a volume pointing to a tube shape with given medium.
TGeoVolume * MakeParaboloid(const char *name, TGeoMedium *medium, Double_t rlo, Double_t rhi, Double_t dz)
Make in one step a volume pointing to a tube shape with given medium.
TGeoVolume * MakeTubs(const char *name, TGeoMedium *medium, Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t phi2)
Make in one step a volume pointing to a tube segment shape with given medium.
TGeoVolume * MakeEltu(const char *name, TGeoMedium *medium, Double_t a, Double_t b, Double_t dz)
Make in one step a volume pointing to a tube shape with given medium.
Base class describing materials.
virtual void RegisterYourself()
Register the matrix in the current manager, which will become the owner.
Media are used to store properties related to tracking and which are useful only when using geometry ...
virtual TGeoMatrix * GetMatrix() const =0
Double_t GetAlpha() const
Double_t GetTheta() const
A paraboloid is defined by the revolution surface generated by a parabola and is bounded by two plane...
Base finder class for patterns.
TGeoVolume * GetVolume() const
Double_t GetStart() const
A polycone is represented by a sequence of tubes/cones, glued together at defined Z planes.
Double_t * GetRmax() const
virtual void DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax)
Defines z position of a section plane, rmin and rmax at this z.
Double_t * GetRmin() const
Polygons are defined in the same way as polycones, the difference being just that the segments betwee...
Physical nodes are the actual 'touchable' objects in the geometry, representing a path of positioned ...
TGeoNode * GetNode(Int_t level=-1) const
Return node in branch at LEVEL. If not specified, return last leaf.
Bool_t Align(TGeoMatrix *newmat=nullptr, TGeoShape *newshape=nullptr, Bool_t check=kFALSE, Double_t ovlp=0.001)
Align a physical node with a new relative matrix/shape.
Base abstract class for all shapes.
virtual const char * GetAxisName(Int_t iaxis) const =0
TGeoSphere are not just balls having internal and external radii, but sectors of a sphere having defi...
virtual Double_t GetRmin() const
Double_t GetTheta2() const
virtual Double_t GetRmax() const
Double_t GetTheta1() const
bool AddFacet(const Vertex_t &pt0, const Vertex_t &pt1, const Vertex_t &pt2)
Adding a triangular facet from vertex positions in absolute coordinates.
The torus is defined by its axial radius, its inner and outer radius.
Class describing translations.
void SetTranslation(Double_t dx, Double_t dy, Double_t dz)
Set translation components.
Double_t GetAlpha2() const
Double_t GetTheta() const
Double_t GetAlpha1() const
A trapezoid with only X varying with Z.
A trapezoid with only X varying with Z.
A tube segment is a tube having a range in phi.
virtual Double_t GetRmin() const
virtual Double_t GetDz() const
virtual Double_t GetRmax() const
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
Add a TGeoNode to the list of nodes.
TGeoPatternFinder * GetFinder() const
TGeoShape * GetShape() const
virtual TGeoVolume * Divide(const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step, Int_t numed=0, Option_t *option="")
Division a la G3.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
A TGeoXtru shape is represented by the extrusion of an arbitrary polygon with fixed outline between s...
Bool_t DefinePolygon(Int_t nvert, const Double_t *xv, const Double_t *yv)
Creates the polygon representing the blueprint of any Xtru section.
virtual void DefineSection(Int_t snum, Double_t z, Double_t x0=0., Double_t y0=0., Double_t scale=1.)
defines z position of a section plane, rmin and rmax at this z.
const char * GetName() const override
Returns name of object.
virtual void SetName(const char *name)
Set the name of the TNamed.
TObject * At(Int_t idx) const override
Mother of all ROOT objects.
Double_t Rndm() override
Machine independent random number generator.
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.
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Double_t Sqrt(Double_t x)
Returns the square root of x.
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.