9 void glViewerLOD(Int_t reqNodes = 1000, Bool_t randomDist = kTRUE,
10 Bool_t reqSpheres = kTRUE, Bool_t reqTubes = kTRUE)
12 TGeoManager * geom =
new TGeoManager(
"LODTest",
"GL viewer LOD test");
13 geom->SetNsegments(4);
14 TGeoMaterial *matEmptySpace =
new TGeoMaterial(
"EmptySpace", 0, 0, 0);
15 TGeoMaterial *matSolid =
new TGeoMaterial(
"Solid" , .938, 1., 10000.);
17 TGeoMedium *medEmptySpace =
new TGeoMedium(
"Empty", 1, matEmptySpace);
18 TGeoMedium *medSolid =
new TGeoMedium(
"Solid", 1, matSolid);
20 Double_t sizeBase = 20.0;
23 worldRadius = pow(reqNodes,.5)*sizeBase;
25 worldRadius = pow(reqNodes,.3)*sizeBase;
28 TGeoVolume *top = geom->MakeBox
29 (
"WORLD", medEmptySpace, worldRadius, worldRadius, worldRadius);
30 geom->SetTopVolume(top);
36 UInt_t volumeCount = gRandom->Integer(reqNodes/4)+1;
37 TGeoVolume ** volumes =
new TGeoVolume *[volumeCount];
42 for (i = 0; i < volumeCount; i++) {
44 sprintf(name,
"Volume_%d", i);
48 if (reqSpheres && reqTubes) {
49 type = gRandom->Integer(2);
51 type += gRandom->Integer(3);
56 type = 1 + gRandom->Integer(3);
59 Double_t rMin = gRandom->Rndm() * sizeBase;
60 Double_t rMax = rMin + gRandom->Rndm() * sizeBase * 2.0;
61 Double_t dz = pow(gRandom->Rndm(),2.0) * sizeBase * 15.0;
62 Double_t phi1 = gRandom->Rndm() * 90.0;
63 Double_t phi2 = phi1 + gRandom->Rndm() * 270.0;
66 Int_t color = gRandom->Integer(50);
67 if (color == kBlack) color += 1;
72 volumes[i] = geom->MakeSphere(name, medSolid, 0., rMax);
73 printf(
"Volume %d : Color %d, Sphere, Radius %f\n", i, color, rMax);
77 volumes[i] = geom->MakeTube(name, medSolid, rMin, rMax, dz);
78 printf(
"Volume %d : Color %d, Tube, Inner Radius %f, "
79 "Outer Radius %f, Length %f\n",
80 i, color, rMin, rMax, dz);
84 volumes[i] = geom->MakeTubs(name, medSolid, rMin, rMax, dz,
86 printf(
"Volume %d : Color %d, Tube Seg, Inner Radius %f, "
87 "Outer Radius %f, Length %f, Phi1 %f, Phi2 %f\n",
88 i, color, rMin, rMax, dz, phi1, phi2);
92 Double_t n1[3], n2[3];
93 n1[0] = gRandom->Rndm()*.5;
94 n1[1] = gRandom->Rndm()*.5; n1[2] = -1.0 + gRandom->Rndm()*.5;
95 n2[0] = gRandom->Rndm()*.5;
96 n2[1] = gRandom->Rndm()*.5; n2[2] = 1.0 - gRandom->Rndm()*.5;
98 volumes[i] = geom->MakeCtub(name, medSolid, rMin, rMax, dz,
99 phi1, phi2, n1[0], n1[1], n1[2],
100 n2[0], n2[1], n2[2]);
101 printf(
"Volume %d : Color %d, Cut Tube, Inner Radius %f, "
102 "Outer Radius %f, Length %f, Phi1 %f, Phi2 %f, "
103 "n1 (%f,%f,%f), n2 (%f,%f,%f)\n",
104 i, color, rMin, rMax, dz, phi1, phi2,
105 n1[0], n1[1], n1[2], n2[0], n2[1], n2[2]);
113 volumes[i]->SetLineColor(color);
116 printf(
"\nCreated %d volumes\n\n", volumeCount);
120 for (i = 0; i < reqNodes; i++) {
122 UInt_t useVolume = gRandom->Integer(volumeCount);
124 TGeoTranslation * trans;
128 gRandom->Rannor(x, y);
129 gRandom->Rannor(z,dummy);
130 trans =
new TGeoTranslation(x*worldRadius, y*worldRadius, z*worldRadius);
133 gRandom->Rannor(x, y);
134 gRandom->Rannor(z,dummy);
135 rot =
new TGeoRotation(
"rot", x*360.0, y*360.0, z*360.0);
137 UInt_t perSide = pow(reqNodes,1.0/3.0)+0.5;
138 Double_t distance = sizeBase*5.0;
140 zi = i / (perSide*perSide);
141 yi = (i / perSide) % perSide;
143 trans =
new TGeoTranslation(xi*distance,yi*distance,zi*distance);
144 rot =
new TGeoRotation(
"rot",0.0, 0.0, 0.0);
146 top->AddNode(volumes[useVolume], i,
new TGeoCombiTrans(*trans, *rot));
149 geom->CloseGeometry();