00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "G3Node.h"
00033 #include "TList.h"
00034 #include "TShape.h"
00035 #include "TTUBE.h"
00036 #include "TBRIK.h"
00037 #include "TTRD1.h"
00038 #include "TTRD2.h"
00039 #include "TTRAP.h"
00040 #include "TTUBS.h"
00041 #include "TCONE.h"
00042 #include "TCONS.h"
00043 #include "TSPHE.h"
00044 #include "TPARA.h"
00045 #include "TPGON.h"
00046 #include "TPCON.h"
00047 #include "TTUBS.h"
00048 #include "TELTU.h"
00049 #include "THYPE.h"
00050 #include "TGTRA.h"
00051 #include "TCTUB.h"
00052
00053 ClassImp(G3Node)
00054 G3Node::G3Node(const char* name, const char* title, const char* shapename,
00055 Double_t x, Double_t y, Double_t z, const char* matrixname,
00056 Option_t* option) :
00057 TNode(name, title, shapename, x, y, z, matrixname, option)
00058 {
00059 fNDivision = -1;
00060 fAxis = 0;
00061 fStartC = 0.;
00062 fStep = 0.;
00063 }
00064
00065 G3Node::G3Node(const char* name, const char* title, TShape* shape,
00066 Double_t x, Double_t y, Double_t z, TRotMatrix* matrix,
00067 Option_t* option) :
00068 TNode(name, title, shape, x, y, z, matrix, option)
00069 {
00070 fNDivision = -1;
00071 fAxis = 0;
00072 fStartC = 0.;
00073 fStep = 0.;
00074 }
00075
00076 void G3Node::SetDivision(Int_t ndiv, Int_t axis, Float_t start, Float_t step)
00077 {
00078 fNDivision = ndiv;
00079 fAxis = axis;
00080 fStartC = start;
00081 fStep = step;
00082 }
00083
00084 void G3Node::ExpandDivisions()
00085 {
00086 Int_t i;
00087 char vName[20];
00088 char nName[20];
00089
00090 char tmp[4];
00091 G3Node* node;
00092 TShape* parent = fParent->GetShape();
00093 TShape* newsh;
00094
00095 strcpy(tmp, parent->GetTitle());
00096 Int_t ndiv = fNDivision;
00097
00098
00099
00100 if (strcmp(tmp, "TUBE")==0) {
00101 TTUBE * shape = (TTUBE*) parent;
00102
00103 Float_t dZ = shape->GetDz();
00104 Float_t rMin = shape->GetRmin();
00105 Float_t rMax = shape->GetRmax();
00106
00107 if (fAxis == 1) {
00108
00109 Float_t dr = (rMax-rMin)/Float_t(fNDivision);
00110 Float_t r1, r2;
00111 for (i=0; i<ndiv; i++) {
00112 r1 = rMin+Float_t(i)*dr;
00113 r2 = r1+dr;
00114 sprintf(vName, "%sD%d", fShape->GetName(), i);
00115 sprintf(nName, "%sD%d", GetName(), i);
00116 newsh = new TTUBE(vName, "TUBE", "void", r1, r2, dZ);
00117 fParent->cd();
00118 node = new G3Node(nName,"", newsh, 0., 0., 0.);
00119 node->AddSons(fNodes);
00120 cd();
00121 }
00122
00123 } else if (fAxis == 2) {
00124
00125 Float_t dPhi = 360./Float_t(fNDivision);
00126 Float_t phi1, phi2;
00127 for (i=0; i<ndiv; i++) {
00128 phi1 = Float_t(i)*dPhi;
00129 phi2 = phi1+dPhi;
00130 sprintf(vName, "%sD%d", fShape->GetName(), i);
00131 sprintf(nName, "%sD%d", GetName(), i);
00132 newsh = new TTUBS(vName, "TUBS", "void", rMin, rMax, dZ, phi1, phi2);
00133 fParent->cd();
00134 node = new G3Node(nName, "", newsh, 0., 0., 0.);
00135 node->AddSons(fNodes);
00136 cd();
00137 }
00138 } else {
00139
00140 Float_t delZ = dZ/Float_t(fNDivision);
00141 for (i=0; i<ndiv; i++) {
00142 sprintf(vName, "%sD%d", fShape->GetName(), i);
00143 sprintf(nName, "%sD%d", GetName(), i);
00144 newsh = new TTUBE(vName, "TUBE", "void", rMin, rMax, delZ);
00145 fParent->cd();
00146 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
00147 node = new G3Node(nName, "",newsh, 0., 0., zpos);
00148 node->AddSons(fNodes);
00149 cd();
00150 }
00151 }
00152
00153
00154
00155 } else if (strcmp(tmp, "TUBS")==0) {
00156 TTUBS * shape = (TTUBS*) parent;
00157 Float_t dZ = shape->GetDz();
00158 Float_t rMin = shape->GetRmin();
00159 Float_t rMax = shape->GetRmax();
00160 Float_t phi1 = shape->GetPhi1();
00161 Float_t phi2 = shape->GetPhi2();
00162
00163 if (fAxis == 1) {
00164
00165 Float_t dr = (rMax-rMin)/Float_t(fNDivision);
00166 Float_t r1, r2;
00167 Int_t ndiv = fNDivision;
00168 for (i=0; i<ndiv; i++) {
00169 r1 = rMin+Float_t(i)*dr;
00170 r2 = r1+dr;
00171 sprintf(vName, "%sD%d", fShape->GetName(), i);
00172 sprintf(nName, "%sD%d", GetName(), i);
00173 newsh = new TTUBS(vName, "TUBS", "void", r1, r2, dZ, phi1, phi2);
00174 fParent->cd();
00175 node = new G3Node(nName,"", newsh, 0., 0., 0.);
00176 node->AddSons(fNodes);
00177 cd();
00178 }
00179
00180 } else if (fAxis == 2) {
00181
00182 Float_t dPhi = (phi2-phi1)/Float_t(fNDivision);
00183 Float_t nphi1, nphi2;
00184
00185 for (i=0; i<fNDivision; i++) {
00186 nphi1 = phi1+Float_t(i)*dPhi;
00187 nphi2 = nphi1+dPhi;
00188 sprintf(vName, "%sD%d", fShape->GetName(), i);
00189 sprintf(nName, "%sD%d", GetName(), i);
00190
00191 newsh = new TTUBS(vName, "TUBS", "void", rMin, rMax, dZ, nphi1, nphi2);
00192 fParent->cd();
00193 node = new G3Node(nName, "", newsh, 0., 0., 0.);
00194 node->AddSons(fNodes);
00195 cd();
00196 }
00197 } else {
00198
00199 Float_t delZ = dZ/Float_t(fNDivision);
00200 for (i=0; i<ndiv; i++) {
00201 sprintf(vName, "%sD%d", fShape->GetName(), i);
00202 sprintf(nName, "%sD%d", GetName(), i);
00203 newsh = new TTUBS(vName, "TUBS", "void", rMin, rMax, delZ, phi1, phi2);
00204 fParent->cd();
00205 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
00206 node = new G3Node(nName, "",newsh, 0., 0., zpos);
00207 node->AddSons(fNodes);
00208 cd();
00209 }
00210 }
00211
00212 } else if (strcmp(tmp, "CONE")==0) {
00213 TCONE * shape = (TCONE*) parent;
00214
00215 Float_t dZ = shape->GetDz();
00216 Float_t rMin1 = shape->GetRmin();
00217 Float_t rMax1 = shape->GetRmax();
00218 Float_t rMin2 = shape->GetRmin2();
00219 Float_t rMax2 = shape->GetRmax2();
00220
00221 if (fAxis == 1) {
00222
00223 Float_t dr1 = (rMax1-rMin1)/Float_t(fNDivision);
00224 Float_t dr2 = (rMax2-rMin2)/Float_t(fNDivision);
00225 Float_t r11, r12, r21, r22;
00226 for (i=0; i<ndiv; i++) {
00227 r11 = rMin1+Float_t(i)*dr1;
00228 r12 = r11+dr1;
00229 r21 = rMin2+Float_t(i)*dr2;
00230 r22 = r21+dr2;
00231
00232 sprintf(vName, "%sD%d", fShape->GetName(), i);
00233 sprintf(nName, "%sD%d", GetName(), i);
00234 newsh = new TCONE(vName, "CONE", "void", dZ, r11, r12, r21, r22);
00235 fParent->cd();
00236 node = new G3Node(nName,"", newsh, 0., 0., 0.);
00237 node->AddSons(fNodes);
00238 cd();
00239 }
00240 } else if (fAxis == 2) {
00241
00242 Float_t dPhi = 360./Float_t(fNDivision);
00243 Float_t phi1, phi2;
00244 for (i=0; i<ndiv; i++) {
00245 phi1 = Float_t(i)*dPhi;
00246 phi2 = phi1+dPhi;
00247 sprintf(vName, "%sD%d", fShape->GetName(), i);
00248 sprintf(nName, "%sD%d", GetName(), i);
00249 newsh = new TCONS(vName, "CONS", "void", dZ, rMin1, rMax1,
00250 rMin2, rMax2, phi1, phi2);
00251 fParent->cd();
00252 node = new G3Node(nName, "",newsh, 0., 0., 0.);
00253 node->AddSons(fNodes);
00254 cd();
00255 }
00256 } else {
00257
00258 Float_t delZ = dZ/Float_t(fNDivision);
00259 for (i=0; i<ndiv; i++) {
00260 sprintf(vName, "%sD%d", fShape->GetName(), i);
00261 sprintf(nName, "%sD%d", GetName(), i);
00262 newsh = new TCONE(vName, "CONE", "void", delZ, rMin1, rMax1, rMin2, rMax2);
00263 fParent->cd();
00264 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
00265 node = new G3Node(nName, "",newsh, 0., 0., zpos);
00266 node->AddSons(fNodes);
00267 cd();
00268 }
00269 }
00270
00271 } else if (strcmp(tmp, "CONS")==0) {
00272 TCONS * shape = (TCONS*) parent;
00273 Float_t dZ = shape->GetDz();
00274 Float_t rMin1 = shape->GetRmin();
00275 Float_t rMax1 = shape->GetRmax();
00276 Float_t rMin2 = shape->GetRmin2();
00277 Float_t rMax2 = shape->GetRmax2();
00278 Float_t phi1 = shape->GetPhi1();
00279 Float_t phi2 = shape->GetPhi2();
00280 if (fAxis == 1) {
00281
00282 Float_t dr1 = (rMax1-rMin1)/Float_t(fNDivision);
00283 Float_t dr2 = (rMax2-rMin2)/Float_t(fNDivision);
00284 Float_t r11, r12, r21, r22;
00285 for (i=0; i<ndiv; i++) {
00286 r11 = rMin1+Float_t(i)*dr1;
00287 r12 = r11+dr1;
00288 r21 = rMin2+Float_t(i)*dr2;
00289 r22 = r21+dr2;
00290
00291 sprintf(vName, "%sD%d", fShape->GetName(), i);
00292 sprintf(nName, "%sD%d", GetName(), i);
00293 newsh = new TCONS(vName, "CONS", "void", dZ, r11, r12, r21, r22, phi1, phi2);
00294 fParent->cd();
00295 node = new G3Node(nName,"", newsh, 0., 0., 0.);
00296 node->AddSons(fNodes);
00297 cd();
00298 }
00299
00300 } else if (fAxis == 2) {
00301
00302 Float_t dPhi = (phi2-phi1)/Float_t(fNDivision);
00303 Float_t nphi1, nphi2;
00304
00305 for (i=0; i<fNDivision; i++) {
00306 nphi1 = phi1+Float_t(i)*dPhi;
00307 nphi2 = nphi1+dPhi;
00308 sprintf(vName, "%sD%d", fShape->GetName(), i);
00309 sprintf(nName, "%sD%d", GetName(), i);
00310
00311 newsh = new TCONS(vName, "CONS", "void", dZ, rMin1, rMax1, rMin2, rMax2, nphi1, nphi2);
00312 fParent->cd();
00313 node = new G3Node(nName, "", newsh, 0., 0., 0.);
00314 node->AddSons(fNodes);
00315 cd();
00316 }
00317 } else {
00318
00319 Float_t delZ = dZ/Float_t(fNDivision);
00320 for (i=0; i<ndiv; i++) {
00321 sprintf(vName, "%sD%d", fShape->GetName(), i);
00322 sprintf(nName, "%sD%d", GetName(), i);
00323 newsh = new TCONS(vName, "CONS", "void", delZ, rMin1, rMax1, rMin2, rMax2, phi1, phi2);
00324 fParent->cd();
00325 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
00326 node = new G3Node(nName,"",newsh, 0., 0., zpos);
00327 node->AddSons(fNodes);
00328 cd();
00329 }
00330 }
00331 } else if (strcmp(tmp, "BRIK")==0) {
00332
00333
00334
00335 TBRIK * shape = (TBRIK*) parent;
00336 Float_t dX = shape->GetDx();
00337 Float_t dY = shape->GetDy();
00338 Float_t dZ = shape->GetDz();
00339
00340 if (fAxis == 1) {
00341
00342 Float_t delX = dX/Float_t(fNDivision);
00343 for (i=0; i<ndiv; i++) {
00344 sprintf(vName, "%sD%d", fShape->GetName(), i);
00345 sprintf(nName, "%sD%d", GetName(), i);
00346 newsh = new TBRIK(vName, "BRIK", "void", delX, dY, dZ);
00347 fParent->cd();
00348 Float_t xpos = -dX+delX*(2.*Float_t(i)+1.);
00349 node = new G3Node(nName,"",newsh, xpos, 0., 0.);
00350 node->AddSons(fNodes);
00351 cd();
00352 }
00353 } else if (fAxis == 2) {
00354
00355 Float_t delY = dY/Float_t(fNDivision);
00356 for (i=0; i<ndiv; i++) {
00357 sprintf(vName, "%sD%d", fShape->GetName(), i);
00358 sprintf(nName, "%sD%d", GetName(), i);
00359 newsh = new TBRIK(vName, "BRIK", "void", dX, delY, dZ);
00360 fParent->cd();
00361 Float_t ypos = -dY+delY*(2.*Float_t(i)+1.);
00362 node = new G3Node(nName,"",newsh, 0., ypos, 0.);
00363 node->AddSons(fNodes);
00364 cd();
00365 }
00366 } else {
00367
00368 Float_t delZ = dZ/Float_t(fNDivision);
00369 for (i=0; i<ndiv; i++) {
00370 sprintf(vName, "%sD%d", fShape->GetName(), i);
00371 sprintf(nName, "%sD%d", GetName(), i);
00372 newsh = new TBRIK(vName, "BRIK", "void", dX, dY, delZ);
00373 fParent->cd();
00374 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
00375 node = new G3Node(nName,"",newsh, 0., 0., zpos);
00376 node->AddSons(fNodes);
00377 cd();
00378 }
00379 }
00380 }
00381 }
00382
00383 void G3Node::AddSons(TList* list)
00384 {
00385 if (!list) return;
00386 if (!fNodes) fNodes = new TList();
00387
00388 TIter next(list);
00389 G3Node* node;
00390
00391 while((node = (G3Node*)next())) {
00392 G3Node* newNode = new G3Node(*node, this);
00393 fNodes->Add(newNode);
00394 newNode->SetParent(this);
00395 newNode->AddSons(node->GetListOfNodes());
00396 }
00397 }
00398
00399
00400 G3Node::G3Node(const G3Node &node, G3Node* parent)
00401 {
00402 fNDivision = node.Ndiv();
00403 fAxis = node.Axis();
00404 fStartC = node.StartC();
00405 fStep = node.Step();
00406 fName = node.GetName();
00407 fTitle = node.GetTitle();
00408 fX = node.GetX();
00409 fY = node.GetY();
00410 fZ = node.GetZ();
00411 fMatrix = node.GetMatrix();
00412 fNodes = 0;
00413 fParent = parent;
00414
00415
00416 if (fNDivision > 0) {
00417 fShape = new TShape(*node.GetShape());
00418 } else {
00419 fShape = (TShape*) node.GetShape()->Clone();
00420 }
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451 }
00452
00453 void G3Node::AddSon(G3Node* node)
00454 {
00455 fNodes->Add(node);
00456 }
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471