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.