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 #include "TList.h"
00027 #include "TObjArray.h"
00028
00029 #include "TGeoManager.h"
00030 #include "TGeoElement.h"
00031 #include "TGeoMaterial.h"
00032 #include "TGeoMedium.h"
00033 #include "TGeoMatrix.h"
00034 #include "TGeoPara.h"
00035 #include "TGeoParaboloid.h"
00036 #include "TGeoTube.h"
00037 #include "TGeoEltu.h"
00038 #include "TGeoHype.h"
00039 #include "TGeoCone.h"
00040 #include "TGeoSphere.h"
00041 #include "TGeoArb8.h"
00042 #include "TGeoPgon.h"
00043 #include "TGeoTrd1.h"
00044 #include "TGeoTrd2.h"
00045 #include "TGeoTorus.h"
00046 #include "TGeoXtru.h"
00047 #include "TGeoNode.h"
00048 #include "TGeoVolume.h"
00049
00050 #include "TGeoBuilder.h"
00051
00052 ClassImp(TGeoBuilder)
00053
00054 TGeoBuilder *TGeoBuilder::fgInstance = NULL;
00055
00056
00057 TGeoBuilder::TGeoBuilder()
00058 :fGeometry(NULL)
00059 {
00060
00061 fgInstance = this;
00062 }
00063
00064
00065 TGeoBuilder::TGeoBuilder(const TGeoBuilder& other)
00066 :TObject(other)
00067 {
00068
00069 Error("copy constructor","copying not allowed for TGeoBuilder");
00070 }
00071
00072
00073 TGeoBuilder::~TGeoBuilder()
00074 {
00075
00076 fgInstance = NULL;
00077 }
00078
00079
00080 TGeoBuilder &TGeoBuilder::operator=(const TGeoBuilder&)
00081 {
00082
00083 Error("Assignment","assignment not allowed for TGeoBuilder");
00084 return *this;
00085 }
00086
00087
00088 TGeoBuilder *TGeoBuilder::Instance(TGeoManager *geom)
00089 {
00090
00091 if (!geom) {
00092 printf("ERROR: Cannot create geometry builder with NULL geometry\n");
00093 return NULL;
00094 }
00095 if (!fgInstance) fgInstance = new TGeoBuilder();
00096 fgInstance->SetGeometry(geom);
00097 return fgInstance;
00098 }
00099
00100
00101 Int_t TGeoBuilder::AddMaterial(TGeoMaterial *material)
00102 {
00103
00104 if (!material) return -1;
00105 TList *materials = fGeometry->GetListOfMaterials();
00106 Int_t index = materials->GetSize();
00107 material->SetIndex(index);
00108 materials->Add(material);
00109 return index;
00110 }
00111
00112
00113 Int_t TGeoBuilder::AddTransformation(TGeoMatrix *matrix)
00114 {
00115
00116 Int_t index = -1;
00117 if (!matrix) return -1;
00118 TObjArray *matrices = fGeometry->GetListOfMatrices();
00119 index = matrices->GetEntriesFast();
00120 matrices->AddAtAndExpand(matrix,index);
00121 return index;
00122 }
00123
00124
00125 Int_t TGeoBuilder::AddShape(TGeoShape *shape)
00126 {
00127
00128 Int_t index = -1;
00129 if (!shape) return -1;
00130 TObjArray *shapes = fGeometry->GetListOfShapes();
00131 if (shape->IsRunTimeShape()) shapes = fGeometry->GetListOfGShapes();
00132 index = shapes->GetEntriesFast();
00133 shapes->AddAtAndExpand(shape,index);
00134 return index;
00135 }
00136
00137
00138 void TGeoBuilder::RegisterMatrix(TGeoMatrix *matrix)
00139 {
00140
00141
00142 if (matrix->IsRegistered()) return;
00143 TObjArray *matrices = fGeometry->GetListOfMatrices();
00144 Int_t nmat = matrices->GetEntriesFast();
00145 matrices->AddAtAndExpand(matrix, nmat);
00146 }
00147
00148
00149 TGeoVolume *TGeoBuilder::MakeArb8(const char *name, TGeoMedium *medium,
00150 Double_t dz, Double_t *vertices)
00151 {
00152
00153 TGeoArb8 *arb = new TGeoArb8(name, dz, vertices);
00154 TGeoVolume *vol = new TGeoVolume(name, arb, medium);
00155 return vol;
00156 }
00157
00158
00159 TGeoVolume *TGeoBuilder::MakeBox(const char *name, TGeoMedium *medium,
00160 Double_t dx, Double_t dy, Double_t dz)
00161 {
00162
00163 TGeoBBox *box = new TGeoBBox(name, dx, dy, dz);
00164 TGeoVolume *vol = 0;
00165 if (box->IsRunTimeShape()) {
00166 vol = fGeometry->MakeVolumeMulti(name, medium);
00167 vol->SetShape(box);
00168 } else {
00169 vol = new TGeoVolume(name, box, medium);
00170 }
00171 return vol;
00172 }
00173
00174
00175 TGeoVolume *TGeoBuilder::MakePara(const char *name, TGeoMedium *medium,
00176 Double_t dx, Double_t dy, Double_t dz,
00177 Double_t alpha, Double_t theta, Double_t phi)
00178 {
00179
00180 if (TMath::Abs(alpha)<TGeoShape::Tolerance() && TMath::Abs(theta)<TGeoShape::Tolerance()) {
00181 Warning("MakePara","parallelipiped %s having alpha=0, theta=0 -> making box instead", name);
00182 return MakeBox(name, medium, dx, dy, dz);
00183 }
00184 TGeoPara *para=0;
00185 para = new TGeoPara(name, dx, dy, dz, alpha, theta, phi);
00186 TGeoVolume *vol = 0;
00187 if (para->IsRunTimeShape()) {
00188 vol = fGeometry->MakeVolumeMulti(name, medium);
00189 vol->SetShape(para);
00190 } else {
00191 vol = new TGeoVolume(name, para, medium);
00192 }
00193 return vol;
00194 }
00195
00196
00197 TGeoVolume *TGeoBuilder::MakeSphere(const char *name, TGeoMedium *medium,
00198 Double_t rmin, Double_t rmax, Double_t themin, Double_t themax,
00199 Double_t phimin, Double_t phimax)
00200 {
00201
00202 TGeoSphere *sph = new TGeoSphere(name, rmin, rmax, themin, themax, phimin, phimax);
00203 TGeoVolume *vol = new TGeoVolume(name, sph, medium);
00204 return vol;
00205 }
00206
00207
00208 TGeoVolume *TGeoBuilder::MakeTorus(const char *name, TGeoMedium *medium, Double_t r,
00209 Double_t rmin, Double_t rmax, Double_t phi1, Double_t dphi)
00210 {
00211
00212 TGeoTorus *tor = new TGeoTorus(name,r,rmin,rmax,phi1,dphi);
00213 TGeoVolume *vol = new TGeoVolume(name, tor, medium);
00214 return vol;
00215 }
00216
00217
00218 TGeoVolume *TGeoBuilder::MakeTube(const char *name, TGeoMedium *medium,
00219 Double_t rmin, Double_t rmax, Double_t dz)
00220 {
00221
00222 if (rmin>rmax) {
00223 Error("MakeTube", "tube %s, Rmin=%g greater than Rmax=%g", name,rmin,rmax);
00224 }
00225 TGeoTube *tube = new TGeoTube(name, rmin, rmax, dz);
00226 TGeoVolume *vol = 0;
00227 if (tube->IsRunTimeShape()) {
00228 vol = fGeometry->MakeVolumeMulti(name, medium);
00229 vol->SetShape(tube);
00230 } else {
00231 vol = new TGeoVolume(name, tube, medium);
00232 }
00233 return vol;
00234 }
00235
00236
00237 TGeoVolume *TGeoBuilder::MakeTubs(const char *name, TGeoMedium *medium,
00238 Double_t rmin, Double_t rmax, Double_t dz,
00239 Double_t phi1, Double_t phi2)
00240 {
00241
00242 TGeoTubeSeg *tubs = new TGeoTubeSeg(name, rmin, rmax, dz, phi1, phi2);
00243 TGeoVolume *vol = 0;
00244 if (tubs->IsRunTimeShape()) {
00245 vol = fGeometry->MakeVolumeMulti(name, medium);
00246 vol->SetShape(tubs);
00247 } else {
00248 vol = new TGeoVolume(name, tubs, medium);
00249 }
00250 return vol;
00251 }
00252
00253
00254 TGeoVolume *TGeoBuilder::MakeEltu(const char *name, TGeoMedium *medium,
00255 Double_t a, Double_t b, Double_t dz)
00256 {
00257
00258 TGeoEltu *eltu = new TGeoEltu(name, a, b, dz);
00259 TGeoVolume *vol = 0;
00260 if (eltu->IsRunTimeShape()) {
00261 vol = fGeometry->MakeVolumeMulti(name, medium);
00262 vol->SetShape(eltu);
00263 } else {
00264 vol = new TGeoVolume(name, eltu, medium);
00265 }
00266 return vol;
00267 }
00268
00269
00270 TGeoVolume *TGeoBuilder::MakeHype(const char *name, TGeoMedium *medium,
00271 Double_t rin, Double_t stin, Double_t rout, Double_t stout, Double_t dz)
00272 {
00273
00274 TGeoHype * hype = new TGeoHype(name, rin,stin,rout,stout,dz);
00275 TGeoVolume *vol = 0;
00276 if (hype->IsRunTimeShape()) {
00277 vol = fGeometry->MakeVolumeMulti(name, medium);
00278 vol->SetShape(hype);
00279 } else {
00280 vol = new TGeoVolume(name, hype, medium);
00281 }
00282 return vol;
00283 }
00284
00285
00286 TGeoVolume *TGeoBuilder::MakeParaboloid(const char *name, TGeoMedium *medium,
00287 Double_t rlo, Double_t rhi, Double_t dz)
00288 {
00289
00290 TGeoParaboloid *parab = new TGeoParaboloid(name, rlo, rhi, dz);
00291 TGeoVolume *vol = 0;
00292 if (parab->IsRunTimeShape()) {
00293 vol = fGeometry->MakeVolumeMulti(name, medium);
00294 vol->SetShape(parab);
00295 } else {
00296 vol = new TGeoVolume(name, parab, medium);
00297 }
00298 return vol;
00299 }
00300
00301
00302 TGeoVolume *TGeoBuilder::MakeCtub(const char *name, TGeoMedium *medium,
00303 Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t phi2,
00304 Double_t lx, Double_t ly, Double_t lz, Double_t tx, Double_t ty, Double_t tz)
00305 {
00306
00307 TGeoCtub *ctub = new TGeoCtub(name, rmin, rmax, dz, phi1, phi2, lx, ly, lz, tx, ty, tz);
00308 TGeoVolume *vol = new TGeoVolume(name, ctub, medium);
00309 return vol;
00310 }
00311
00312
00313 TGeoVolume *TGeoBuilder::MakeCone(const char *name, TGeoMedium *medium,
00314 Double_t dz, Double_t rmin1, Double_t rmax1,
00315 Double_t rmin2, Double_t rmax2)
00316 {
00317
00318 TGeoCone *cone = new TGeoCone(dz, rmin1, rmax1, rmin2, rmax2);
00319 TGeoVolume *vol = 0;
00320 if (cone->IsRunTimeShape()) {
00321 vol = fGeometry->MakeVolumeMulti(name, medium);
00322 vol->SetShape(cone);
00323 } else {
00324 vol = new TGeoVolume(name, cone, medium);
00325 }
00326 return vol;
00327 }
00328
00329
00330 TGeoVolume *TGeoBuilder::MakeCons(const char *name, TGeoMedium *medium,
00331 Double_t dz, Double_t rmin1, Double_t rmax1,
00332 Double_t rmin2, Double_t rmax2,
00333 Double_t phi1, Double_t phi2)
00334 {
00335
00336 TGeoConeSeg *cons = new TGeoConeSeg(name, dz, rmin1, rmax1, rmin2, rmax2, phi1, phi2);
00337 TGeoVolume *vol = 0;
00338 if (cons->IsRunTimeShape()) {
00339 vol = fGeometry->MakeVolumeMulti(name, medium);
00340 vol->SetShape(cons);
00341 } else {
00342 vol = new TGeoVolume(name, cons, medium);
00343 }
00344 return vol;
00345 }
00346
00347
00348 TGeoVolume *TGeoBuilder::MakePcon(const char *name, TGeoMedium *medium,
00349 Double_t phi, Double_t dphi, Int_t nz)
00350 {
00351
00352 TGeoPcon *pcon = new TGeoPcon(name, phi, dphi, nz);
00353 TGeoVolume *vol = new TGeoVolume(name, pcon, medium);
00354 return vol;
00355 }
00356
00357
00358 TGeoVolume *TGeoBuilder::MakePgon(const char *name, TGeoMedium *medium,
00359 Double_t phi, Double_t dphi, Int_t nedges, Int_t nz)
00360 {
00361
00362 TGeoPgon *pgon = new TGeoPgon(name, phi, dphi, nedges, nz);
00363 TGeoVolume *vol = new TGeoVolume(name, pgon, medium);
00364 return vol;
00365 }
00366
00367
00368 TGeoVolume *TGeoBuilder::MakeTrd1(const char *name, TGeoMedium *medium,
00369 Double_t dx1, Double_t dx2, Double_t dy, Double_t dz)
00370 {
00371
00372 TGeoTrd1 *trd1 = new TGeoTrd1(name, dx1, dx2, dy, dz);
00373 TGeoVolume *vol = 0;
00374 if (trd1->IsRunTimeShape()) {
00375 vol = fGeometry->MakeVolumeMulti(name, medium);
00376 vol->SetShape(trd1);
00377 } else {
00378 vol = new TGeoVolume(name, trd1, medium);
00379 }
00380 return vol;
00381 }
00382
00383
00384 TGeoVolume *TGeoBuilder::MakeTrd2(const char *name, TGeoMedium *medium,
00385 Double_t dx1, Double_t dx2, Double_t dy1, Double_t dy2,
00386 Double_t dz)
00387 {
00388
00389 TGeoTrd2 *trd2 = new TGeoTrd2(name, dx1, dx2, dy1, dy2, dz);
00390 TGeoVolume *vol = 0;
00391 if (trd2->IsRunTimeShape()) {
00392 vol = fGeometry->MakeVolumeMulti(name, medium);
00393 vol->SetShape(trd2);
00394 } else {
00395 vol = new TGeoVolume(name, trd2, medium);
00396 }
00397 return vol;
00398 }
00399
00400
00401 TGeoVolume *TGeoBuilder::MakeTrap(const char *name, TGeoMedium *medium,
00402 Double_t dz, Double_t theta, Double_t phi, Double_t h1,
00403 Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2,
00404 Double_t tl2, Double_t alpha2)
00405 {
00406
00407 TGeoTrap *trap = new TGeoTrap(name, dz, theta, phi, h1, bl1, tl1, alpha1, h2, bl2,
00408 tl2, alpha2);
00409 TGeoVolume *vol = new TGeoVolume(name, trap, medium);
00410 return vol;
00411 }
00412
00413
00414 TGeoVolume *TGeoBuilder::MakeGtra(const char *name, TGeoMedium *medium,
00415 Double_t dz, Double_t theta, Double_t phi, Double_t twist, Double_t h1,
00416 Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2,
00417 Double_t tl2, Double_t alpha2)
00418 {
00419
00420 TGeoGtra *gtra = new TGeoGtra(name, dz, theta, phi, twist, h1, bl1, tl1, alpha1, h2, bl2,
00421 tl2, alpha2);
00422 TGeoVolume *vol = new TGeoVolume(name, gtra, medium);
00423 return vol;
00424 }
00425
00426 TGeoVolume *TGeoBuilder::MakeXtru(const char *name, TGeoMedium *medium, Int_t nz)
00427 {
00428
00429 TGeoXtru *xtru = new TGeoXtru(nz);
00430 xtru->SetName(name);
00431 TGeoVolume *vol = new TGeoVolume(name, xtru, medium);
00432 return vol;
00433 }
00434
00435
00436 TGeoVolumeAssembly *TGeoBuilder::MakeVolumeAssembly(const char *name)
00437 {
00438
00439 return (new TGeoVolumeAssembly(name));
00440 }
00441
00442
00443 TGeoVolumeMulti *TGeoBuilder::MakeVolumeMulti(const char *name, TGeoMedium *medium)
00444 {
00445
00446 return (new TGeoVolumeMulti(name, medium));
00447 }
00448
00449
00450
00451 TGeoVolume *TGeoBuilder::Division(const char *name, const char *mother, Int_t iaxis,
00452 Int_t ndiv, Double_t start, Double_t step, Int_t numed, Option_t *option)
00453 {
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468 TGeoVolume *amother;
00469 TString sname = name;
00470 sname = sname.Strip();
00471 const char *vname = sname.Data();
00472 TString smname = mother;
00473 smname = smname.Strip();
00474 const char *mname = smname.Data();
00475
00476 amother = (TGeoVolume*)fGeometry->GetListOfGVolumes()->FindObject(mname);
00477 if (!amother) amother = fGeometry->GetVolume(mname);
00478 if (amother) return amother->Divide(vname,iaxis,ndiv,start,step,numed, option);
00479
00480 Error("Division","VOLUME: \"%s\" not defined",mname);
00481
00482 return 0;
00483 }
00484
00485
00486 void TGeoBuilder::Matrix(Int_t index, Double_t theta1, Double_t phi1,
00487 Double_t theta2, Double_t phi2,
00488 Double_t theta3, Double_t phi3)
00489 {
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500 TGeoRotation * rot = new TGeoRotation("",theta1,phi1,theta2,phi2,theta3,phi3);
00501 rot->SetUniqueID(index);
00502 rot->RegisterYourself();
00503 }
00504
00505
00506 TGeoMaterial *TGeoBuilder::Material(const char *name, Double_t a, Double_t z, Double_t dens, Int_t uid,Double_t radlen, Double_t intlen)
00507 {
00508
00509 TGeoMaterial *material = new TGeoMaterial(name,a,z,dens,radlen,intlen);
00510 material->SetUniqueID(uid);
00511 return material;
00512 }
00513
00514
00515 TGeoMaterial *TGeoBuilder::Mixture(const char *name, Float_t *a, Float_t *z, Double_t dens,
00516 Int_t nelem, Float_t *wmat, Int_t uid)
00517 {
00518
00519
00520 TGeoMixture *mix = new TGeoMixture(name,nelem,dens);
00521 mix->SetUniqueID(uid);
00522 Int_t i;
00523 for (i=0;i<nelem;i++) {
00524 mix->DefineElement(i,a[i],z[i],wmat[i]);
00525 }
00526 return (TGeoMaterial*)mix;
00527 }
00528
00529
00530 TGeoMaterial *TGeoBuilder::Mixture(const char *name, Double_t *a, Double_t *z, Double_t dens,
00531 Int_t nelem, Double_t *wmat, Int_t uid)
00532 {
00533
00534
00535 TGeoMixture *mix = new TGeoMixture(name,nelem,dens);
00536 mix->SetUniqueID(uid);
00537 Int_t i;
00538 for (i=0;i<nelem;i++) {
00539 mix->DefineElement(i,a[i],z[i],wmat[i]);
00540 }
00541 return (TGeoMaterial*)mix;
00542 }
00543
00544
00545 TGeoMedium *TGeoBuilder::Medium(const char *name, Int_t numed, Int_t nmat, Int_t isvol,
00546 Int_t ifield, Double_t fieldm, Double_t tmaxfd,
00547 Double_t stemax, Double_t deemax, Double_t epsil,
00548 Double_t stmin)
00549 {
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568 return new TGeoMedium(name,numed,nmat,isvol,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
00569 }
00570
00571
00572 void TGeoBuilder::Node(const char *name, Int_t nr, const char *mother,
00573 Double_t x, Double_t y, Double_t z, Int_t irot,
00574 Bool_t isOnly, Float_t *upar, Int_t npar)
00575 {
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589 TGeoVolume *amother= 0;
00590 TGeoVolume *volume = 0;
00591
00592
00593 amother = fGeometry->FindVolumeFast(mother,kTRUE);
00594 if (!amother) amother = fGeometry->FindVolumeFast(mother);
00595 if (!amother) {
00596 TString mname = mother;
00597 mname = mname.Strip();
00598 Error("Node","Mother VOLUME \"%s\" not defined",mname.Data());
00599 return;
00600 }
00601 Int_t i;
00602 if (npar<=0) {
00603
00604 if (gDebug > 0) Info("Node","Calling gspos, mother=%s, name=%s, nr=%d, x=%g, y=%g, z=%g, irot=%d, konly=%i",mother,name,nr,x,y,z,irot,(Int_t)isOnly);
00605
00606 volume = fGeometry->FindVolumeFast(name,kTRUE);
00607 if (!volume) volume = fGeometry->FindVolumeFast(name);
00608 if (!volume) {
00609 TString vname = name;
00610 vname = vname.Strip();
00611 Error("Node","VOLUME: \"%s\" not defined",vname.Data());
00612 return;
00613 }
00614 if (((TObject*)volume)->TestBit(TGeoVolume::kVolumeMulti) && !volume->GetShape()) {
00615 Error("Node", "cannot add multiple-volume object %s as node", volume->GetName());
00616 return;
00617 }
00618 } else {
00619
00620 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->FindVolumeFast(name, kTRUE);
00621 if (!vmulti) {
00622 volume = fGeometry->FindVolumeFast(name);
00623 if (volume) {
00624 Warning("Node", "volume: %s is defined as single -> ignoring shape parameters", volume->GetName());
00625 Node(name,nr,mother,x,y,z,irot,isOnly, upar);
00626 return;
00627 }
00628 TString vname = name;
00629 vname = vname.Strip();
00630 Error("Node","VOLUME: \"%s\" not defined ",vname.Data());
00631 return;
00632 }
00633 TGeoMedium *medium = vmulti->GetMedium();
00634 TString sh = vmulti->GetTitle();
00635 sh.ToLower();
00636 if (sh.Contains("box")) {
00637 volume = MakeBox(name,medium,upar[0],upar[1],upar[2]);
00638 } else if (sh.Contains("trd1")) {
00639 volume = MakeTrd1(name,medium,upar[0],upar[1],upar[2],upar[3]);
00640 } else if (sh.Contains("trd2")) {
00641 volume = MakeTrd2(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00642 } else if (sh.Contains("trap")) {
00643 volume = MakeTrap(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
00644 } else if (sh.Contains("gtra")) {
00645 volume = MakeGtra(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10],upar[11]);
00646 } else if (sh.Contains("tube")) {
00647 volume = MakeTube(name,medium,upar[0],upar[1],upar[2]);
00648 } else if (sh.Contains("tubs")) {
00649 volume = MakeTubs(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00650 } else if (sh.Contains("cone")) {
00651 volume = MakeCone(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00652 } else if (sh.Contains("cons")) {
00653 volume = MakeCons(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
00654 } else if (sh.Contains("pgon")) {
00655 volume = MakePgon(name,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
00656 Int_t nz = (Int_t)upar[3];
00657 for (i=0;i<nz;i++) {
00658 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
00659 }
00660 } else if (sh.Contains("pcon")) {
00661 volume = MakePcon(name,medium,upar[0],upar[1],(Int_t)upar[2]);
00662 Int_t nz = (Int_t)upar[2];
00663 for (i=0;i<nz;i++) {
00664 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
00665 }
00666 } else if (sh.Contains("eltu")) {
00667 volume = MakeEltu(name,medium,upar[0],upar[1],upar[2]);
00668 } else if (sh.Contains("sphe")) {
00669 volume = MakeSphere(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
00670 } else if (sh.Contains("ctub")) {
00671 volume = MakeCtub(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
00672 } else if (sh.Contains("para")) {
00673 volume = MakePara(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
00674 } else {
00675 Error("Node","cannot create shape %s",sh.Data());
00676 }
00677
00678 if (!volume) return;
00679 vmulti->AddVolume(volume);
00680 }
00681 if (irot) {
00682 TGeoRotation *matrix = 0;
00683 TGeoMatrix *mat;
00684 TIter next(fGeometry->GetListOfMatrices());
00685 while ((mat=(TGeoMatrix*)next())) {
00686 if (mat->GetUniqueID()==UInt_t(irot)) {
00687 matrix = dynamic_cast<TGeoRotation*>(mat);
00688 break;
00689 }
00690 }
00691 if (!matrix) {
00692 Fatal("Node", "Node %s/%s_%d rotation %i not found",mother, name, nr ,irot);
00693 return;
00694 }
00695 if (isOnly) amother->AddNode(volume,nr,new TGeoCombiTrans(x,y,z,matrix));
00696 else amother->AddNodeOverlap(volume,nr,new TGeoCombiTrans(x,y,z,matrix));
00697 } else {
00698 if (TMath::Abs(x)<TGeoShape::Tolerance() &&
00699 TMath::Abs(y)<TGeoShape::Tolerance() &&
00700 TMath::Abs(z)<TGeoShape::Tolerance()) {
00701 if (isOnly) amother->AddNode(volume,nr);
00702 else amother->AddNodeOverlap(volume,nr);
00703 } else {
00704 if (isOnly) amother->AddNode(volume,nr,new TGeoTranslation(x,y,z));
00705 else amother->AddNodeOverlap(volume,nr,new TGeoTranslation(x,y,z));
00706 }
00707 }
00708 }
00709
00710
00711 void TGeoBuilder::Node(const char *name, Int_t nr, const char *mother,
00712 Double_t x, Double_t y, Double_t z, Int_t irot,
00713 Bool_t isOnly, Double_t *upar, Int_t npar)
00714 {
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728 TGeoVolume *amother= 0;
00729 TGeoVolume *volume = 0;
00730
00731
00732 amother = fGeometry->FindVolumeFast(mother,kTRUE);
00733 if (!amother) amother = fGeometry->FindVolumeFast(mother);
00734 if (!amother) {
00735 TString mname = mother;
00736 mname = mname.Strip();
00737 Error("Node","Mother VOLUME \"%s\" not defined",mname.Data());
00738 return;
00739 }
00740 Int_t i;
00741 if (npar<=0) {
00742
00743 if (gDebug > 0) Info("Node","Calling gspos, mother=%s, name=%s, nr=%d, x=%g, y=%g, z=%g, irot=%d, konly=%i",mother,name,nr,x,y,z,irot,(Int_t)isOnly);
00744
00745 volume = fGeometry->FindVolumeFast(name,kTRUE);
00746 if (!volume) volume = fGeometry->FindVolumeFast(name);
00747 if (!volume) {
00748 TString vname = name;
00749 vname = vname.Strip();
00750 Error("Node","VOLUME: \"%s\" not defined",vname.Data());
00751 return;
00752 }
00753 if (((TObject*)volume)->TestBit(TGeoVolume::kVolumeMulti) && !volume->GetShape()) {
00754 Error("Node", "cannot add multiple-volume object %s as node", volume->GetName());
00755 return;
00756 }
00757 } else {
00758
00759 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->FindVolumeFast(name, kTRUE);
00760 if (!vmulti) {
00761 volume = fGeometry->FindVolumeFast(name);
00762 if (volume) {
00763 Warning("Node", "volume: %s is defined as single -> ignoring shape parameters", volume->GetName());
00764 Node(name,nr,mother,x,y,z,irot,isOnly, upar);
00765 return;
00766 }
00767 TString vname = name;
00768 vname = vname.Strip();
00769 Error("Node","VOLUME: \"%s\" not defined ",vname.Data());
00770 return;
00771 }
00772 TGeoMedium *medium = vmulti->GetMedium();
00773 TString sh = vmulti->GetTitle();
00774 sh.ToLower();
00775 if (sh.Contains("box")) {
00776 volume = MakeBox(name,medium,upar[0],upar[1],upar[2]);
00777 } else if (sh.Contains("trd1")) {
00778 volume = MakeTrd1(name,medium,upar[0],upar[1],upar[2],upar[3]);
00779 } else if (sh.Contains("trd2")) {
00780 volume = MakeTrd2(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00781 } else if (sh.Contains("trap")) {
00782 volume = MakeTrap(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
00783 } else if (sh.Contains("gtra")) {
00784 volume = MakeGtra(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10],upar[11]);
00785 } else if (sh.Contains("tube")) {
00786 volume = MakeTube(name,medium,upar[0],upar[1],upar[2]);
00787 } else if (sh.Contains("tubs")) {
00788 volume = MakeTubs(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00789 } else if (sh.Contains("cone")) {
00790 volume = MakeCone(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00791 } else if (sh.Contains("cons")) {
00792 volume = MakeCons(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
00793 } else if (sh.Contains("pgon")) {
00794 volume = MakePgon(name,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
00795 Int_t nz = (Int_t)upar[3];
00796 for (i=0;i<nz;i++) {
00797 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
00798 }
00799 } else if (sh.Contains("pcon")) {
00800 volume = MakePcon(name,medium,upar[0],upar[1],(Int_t)upar[2]);
00801 Int_t nz = (Int_t)upar[2];
00802 for (i=0;i<nz;i++) {
00803 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
00804 }
00805 } else if (sh.Contains("eltu")) {
00806 volume = MakeEltu(name,medium,upar[0],upar[1],upar[2]);
00807 } else if (sh.Contains("sphe")) {
00808 volume = MakeSphere(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
00809 } else if (sh.Contains("ctub")) {
00810 volume = MakeCtub(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
00811 } else if (sh.Contains("para")) {
00812 volume = MakePara(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
00813 } else {
00814 Error("Node","cannot create shape %s",sh.Data());
00815 }
00816
00817 if (!volume) return;
00818 vmulti->AddVolume(volume);
00819 }
00820 if (irot) {
00821 TGeoRotation *matrix = 0;
00822 TGeoMatrix *mat;
00823 TIter next(fGeometry->GetListOfMatrices());
00824 while ((mat=(TGeoMatrix*)next())) {
00825 if (mat->GetUniqueID()==UInt_t(irot)) {
00826 matrix = dynamic_cast<TGeoRotation*>(mat);
00827 break;
00828 }
00829 }
00830 if (!matrix) {
00831 Fatal("Node", "Node %s/%s_%d rotation %i not found",mother, name, nr ,irot);
00832 return;
00833 }
00834 if (isOnly) amother->AddNode(volume,nr,new TGeoCombiTrans(x,y,z,matrix));
00835 else amother->AddNodeOverlap(volume,nr,new TGeoCombiTrans(x,y,z,matrix));
00836 } else {
00837 if (TMath::Abs(x)<TGeoShape::Tolerance() &&
00838 TMath::Abs(y)<TGeoShape::Tolerance() &&
00839 TMath::Abs(z)<TGeoShape::Tolerance()) {
00840 if (isOnly) amother->AddNode(volume,nr);
00841 else amother->AddNodeOverlap(volume,nr);
00842 } else {
00843 if (isOnly) amother->AddNode(volume,nr,new TGeoTranslation(x,y,z));
00844 else amother->AddNodeOverlap(volume,nr,new TGeoTranslation(x,y,z));
00845 }
00846 }
00847 }
00848
00849
00850 TGeoVolume *TGeoBuilder::Volume(const char *name, const char *shape, Int_t nmed,
00851 Float_t *upar, Int_t npar)
00852 {
00853
00854
00855
00856
00857
00858
00859 Int_t i;
00860 TGeoVolume *volume = 0;
00861 TGeoMedium *medium = fGeometry->GetMedium(nmed);
00862 if (!medium) {
00863 Error("Volume","cannot create volume: %s, medium: %d is unknown",name,nmed);
00864 return 0;
00865 }
00866 TString sh = shape;
00867 TString sname = name;
00868 sname = sname.Strip();
00869 const char *vname = sname.Data();
00870 if (npar <= 0) {
00871
00872 volume = MakeVolumeMulti(vname,medium);
00873 volume->SetTitle(shape);
00874 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->GetListOfGVolumes()->FindObject(vname);
00875 if (!vmulti) {
00876 Error("Volume","volume multi: %s not created",vname);
00877 return 0;
00878 }
00879 return vmulti;
00880 }
00881
00882 sh.ToLower();
00883 if (sh.Contains("box")) {
00884 volume = MakeBox(vname,medium,upar[0],upar[1],upar[2]);
00885 } else if (sh.Contains("trd1")) {
00886 volume = MakeTrd1(vname,medium,upar[0],upar[1],upar[2],upar[3]);
00887 } else if (sh.Contains("trd2")) {
00888 volume = MakeTrd2(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00889 } else if (sh.Contains("trap")) {
00890 volume = MakeTrap(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
00891 } else if (sh.Contains("gtra")) {
00892 volume = MakeGtra(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10],upar[11]);
00893 } else if (sh.Contains("tube")) {
00894 volume = MakeTube(vname,medium,upar[0],upar[1],upar[2]);
00895 } else if (sh.Contains("tubs")) {
00896 volume = MakeTubs(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00897 } else if (sh.Contains("cone")) {
00898 volume = MakeCone(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00899 } else if (sh.Contains("cons")) {
00900 volume = MakeCons(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
00901 } else if (sh.Contains("pgon")) {
00902 volume = MakePgon(vname,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
00903 Int_t nz = (Int_t)upar[3];
00904 for (i=0;i<nz;i++) {
00905 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
00906 }
00907 } else if (sh.Contains("pcon")) {
00908 volume = MakePcon(vname,medium,upar[0],upar[1],(Int_t)upar[2]);
00909 Int_t nz = (Int_t)upar[2];
00910 for (i=0;i<nz;i++) {
00911 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
00912 }
00913 } else if (sh.Contains("eltu")) {
00914 volume = MakeEltu(vname,medium,upar[0],upar[1],upar[2]);
00915 } else if (sh.Contains("sphe")) {
00916 volume = MakeSphere(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
00917 } else if (sh.Contains("ctub")) {
00918 volume = MakeCtub(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
00919 } else if (sh.Contains("para")) {
00920 volume = MakePara(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
00921 } else if (sh.Contains("tor")) {
00922 volume = MakeTorus(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00923 }
00924
00925 if (!volume) {
00926 Error("Volume","volume: %s not created",vname);
00927 return 0;
00928 }
00929 return volume;
00930 }
00931
00932
00933
00934 TGeoVolume *TGeoBuilder::Volume(const char *name, const char *shape, Int_t nmed,
00935 Double_t *upar, Int_t npar)
00936 {
00937
00938
00939
00940
00941
00942
00943 Int_t i;
00944 TGeoVolume *volume = 0;
00945 TGeoMedium *medium = fGeometry->GetMedium(nmed);
00946 if (!medium) {
00947 Error("Volume","cannot create volume: %s, medium: %d is unknown",name,nmed);
00948 return 0;
00949 }
00950 TString sh = shape;
00951 TString sname = name;
00952 sname = sname.Strip();
00953 const char *vname = sname.Data();
00954 if (npar <= 0) {
00955
00956 volume = MakeVolumeMulti(vname,medium);
00957 volume->SetTitle(shape);
00958 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->GetListOfGVolumes()->FindObject(vname);
00959 if (!vmulti) {
00960 Error("Volume","volume multi: %s not created",vname);
00961 return 0;
00962 }
00963 return vmulti;
00964 }
00965
00966 sh.ToLower();
00967 if (sh.Contains("box")) {
00968 volume = MakeBox(vname,medium,upar[0],upar[1],upar[2]);
00969 } else if (sh.Contains("trd1")) {
00970 volume = MakeTrd1(vname,medium,upar[0],upar[1],upar[2],upar[3]);
00971 } else if (sh.Contains("trd2")) {
00972 volume = MakeTrd2(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00973 } else if (sh.Contains("trap")) {
00974 volume = MakeTrap(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
00975 } else if (sh.Contains("gtra")) {
00976 volume = MakeGtra(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10],upar[11]);
00977 } else if (sh.Contains("tube")) {
00978 volume = MakeTube(vname,medium,upar[0],upar[1],upar[2]);
00979 } else if (sh.Contains("tubs")) {
00980 volume = MakeTubs(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00981 } else if (sh.Contains("cone")) {
00982 volume = MakeCone(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
00983 } else if (sh.Contains("cons")) {
00984 volume = MakeCons(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
00985 } else if (sh.Contains("pgon")) {
00986 volume = MakePgon(vname,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
00987 Int_t nz = (Int_t)upar[3];
00988 for (i=0;i<nz;i++) {
00989 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
00990 }
00991 } else if (sh.Contains("pcon")) {
00992 volume = MakePcon(vname,medium,upar[0],upar[1],(Int_t)upar[2]);
00993 Int_t nz = (Int_t)upar[2];
00994 for (i=0;i<nz;i++) {
00995 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
00996 }
00997 } else if (sh.Contains("eltu")) {
00998 volume = MakeEltu(vname,medium,upar[0],upar[1],upar[2]);
00999 } else if (sh.Contains("sphe")) {
01000 volume = MakeSphere(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
01001 } else if (sh.Contains("ctub")) {
01002 volume = MakeCtub(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6],upar[7],upar[8],upar[9],upar[10]);
01003 } else if (sh.Contains("para")) {
01004 volume = MakePara(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
01005 } else if (sh.Contains("tor")) {
01006 volume = MakeTorus(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
01007 }
01008
01009 if (!volume) {
01010 Error("Volume","volume: %s not created",vname);
01011 return 0;
01012 }
01013 return volume;
01014 }
01015