TGeoBuilder.cxx

Go to the documentation of this file.
00001 // @(#)root/geom:$Id: TGeoBuilder.cxx 27731 2009-03-09 17:40:56Z brun $
00002 // Author: Mihaela Gheata   30/05/07
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //_____________________________________________________________________________
00013 // TGeoBuilder
00014 // ============
00015 //
00016 //   Utility class for creating geometry objects.These will be associated
00017 //   with the current selected geometry manager object:
00018 //
00019 //      TGeoBuilder::Instance()->SetGeometry(gGeoManager);
00020 //
00021 //   The geometry builder is a singleton that may be used to build one or more 
00022 //   geometries.
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 // Default constructor.
00061    fgInstance = this;
00062 } 
00063 
00064 //_____________________________________________________________________________
00065 TGeoBuilder::TGeoBuilder(const TGeoBuilder& other)
00066             :TObject(other)
00067 {
00068 // Copy constructor.
00069    Error("copy constructor","copying not allowed for TGeoBuilder");
00070 } 
00071 
00072 //_____________________________________________________________________________
00073 TGeoBuilder::~TGeoBuilder()
00074 {
00075 // Destructor.
00076    fgInstance = NULL;
00077 }   
00078 
00079 //_____________________________________________________________________________
00080 TGeoBuilder &TGeoBuilder::operator=(const TGeoBuilder&)
00081 {
00082 // Assignment.
00083    Error("Assignment","assignment not allowed for TGeoBuilder");
00084    return *this;
00085 }
00086 
00087 //_____________________________________________________________________________
00088 TGeoBuilder *TGeoBuilder::Instance(TGeoManager *geom) 
00089 {
00090 // Return pointer to singleton.
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 // Add a material to the list. Returns index of the material in list.
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 // Add a matrix to the list. Returns index of the matrix in list.
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 // Add a shape to the list. Returns index of the shape in list.
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 // Register a matrix to the list of matrices. It will be cleaned-up at the
00141 // destruction TGeoManager.
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 // Make an TGeoArb8 volume.
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 // Make in one step a volume pointing to a box shape with given medium.
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 // Make in one step a volume pointing to a paralelipiped shape with given medium.
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 // Make in one step a volume pointing to a sphere shape with given medium
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 // Make in one step a volume pointing to a torus shape with given medium.
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 // Make in one step a volume pointing to a tube shape with given medium.
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 // Make in one step a volume pointing to a tube segment shape with given medium.
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 // Make in one step a volume pointing to a tube shape with given medium
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 // Make in one step a volume pointing to a tube shape with given medium
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 // Make in one step a volume pointing to a tube shape with given medium
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 // Make in one step a volume pointing to a tube segment shape with given medium
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 // Make in one step a volume pointing to a cone shape with given medium.
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 // Make in one step a volume pointing to a cone segment shape with given medium
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 // Make in one step a volume pointing to a polycone shape with given medium.
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 // Make in one step a volume pointing to a polygone shape with given medium.
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 // Make in one step a volume pointing to a TGeoTrd1 shape with given medium.
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 // Make in one step a volume pointing to a TGeoTrd2 shape with given medium.
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 // Make in one step a volume pointing to a trapezoid shape with given medium.
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 // Make in one step a volume pointing to a twisted trapezoid shape with given medium.
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 // Make a TGeoXtru-shaped volume with nz planes
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 // Make an assembly of volumes.
00439    return (new TGeoVolumeAssembly(name));
00440 }
00441 
00442 //_____________________________________________________________________________
00443 TGeoVolumeMulti *TGeoBuilder::MakeVolumeMulti(const char *name, TGeoMedium *medium)
00444 {
00445 // Make a TGeoVolumeMulti handling a list of volumes.
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 // Create a new volume by dividing an existing one (GEANT3 like)
00455 //
00456 // Divides MOTHER into NDIV divisions called NAME
00457 // along axis IAXIS starting at coordinate value START
00458 // and having size STEP. The created volumes will have tracking
00459 // media ID=NUMED (if NUMED=0 -> same media as MOTHER)
00460 //    The behavior of the division operation can be triggered using OPTION :
00461 // OPTION (case insensitive) :
00462 //  N  - divide all range in NDIV cells (same effect as STEP<=0) (GSDVN in G3)
00463 //  NX - divide range starting with START in NDIV cells          (GSDVN2 in G3)
00464 //  S  - divide all range with given STEP. NDIV is computed and divisions will be centered
00465 //         in full range (same effect as NDIV<=0)                (GSDVS, GSDVT in G3)
00466 //  SX - same as DVS, but from START position.                   (GSDVS2, GSDVT2 in G3)
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 // Create rotation matrix named 'mat<index>'.
00491 //
00492 //  index    rotation matrix number
00493 //  theta1   polar angle for axis X
00494 //  phi1     azimuthal angle for axis X
00495 //  theta2   polar angle for axis Y
00496 //  phi2     azimuthal angle for axis Y
00497 //  theta3   polar angle for axis Z
00498 //  phi3     azimuthal angle for axis Z
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 // Create material with given A, Z and density, having an unique id.
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 // Create mixture OR COMPOUND IMAT as composed by THE BASIC nelem
00519 // materials defined by arrays A,Z and WMAT, having an unique id.
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 // Create mixture OR COMPOUND IMAT as composed by THE BASIC nelem
00534 // materials defined by arrays A,Z and WMAT, having an unique id.
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 // Create tracking medium
00551   //
00552   //  numed      tracking medium number assigned
00553   //  name      tracking medium name
00554   //  nmat      material number
00555   //  isvol     sensitive volume flag
00556   //  ifield    magnetic field
00557   //  fieldm    max. field value (kilogauss)
00558   //  tmaxfd    max. angle due to field (deg/step)
00559   //  stemax    max. step allowed
00560   //  deemax    max. fraction of energy lost in a step
00561   //  epsil     tracking precision (cm)
00562   //  stmin     min. step due to continuous processes (cm)
00563   //
00564   //  ifield = 0 if no magnetic field; ifield = -1 if user decision in guswim;
00565   //  ifield = 1 if tracking performed with g3rkuta; ifield = 2 if tracking
00566   //  performed with g3helix; ifield = 3 if tracking performed with g3helx3.
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 // Create a node called <name_nr> pointing to the volume called <name>
00577 // as daughter of the volume called <mother> (gspos). The relative matrix is
00578 // made of : a translation (x,y,z) and a rotation matrix named <matIROT>.
00579 // In case npar>0, create the volume to be positioned in mother, according
00580 // its actual parameters (gsposp).
00581 //  NAME   Volume name
00582 //  NUMBER Copy number of the volume
00583 //  MOTHER Mother volume name
00584 //  X      X coord. of the volume in mother ref. sys.
00585 //  Y      Y coord. of the volume in mother ref. sys.
00586 //  Z      Z coord. of the volume in mother ref. sys.
00587 //  IROT   Rotation matrix number w.r.t. mother ref. sys.
00588 //  ISONLY ONLY/MANY flag
00589    TGeoVolume *amother= 0;
00590    TGeoVolume *volume = 0;
00591    
00592    // look into special volume list first
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    //---> acting as G3 gspos
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       // look into special volume list first
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    //---> acting as G3 gsposp
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 // Create a node called <name_nr> pointing to the volume called <name>
00716 // as daughter of the volume called <mother> (gspos). The relative matrix is
00717 // made of : a translation (x,y,z) and a rotation matrix named <matIROT>.
00718 // In case npar>0, create the volume to be positioned in mother, according
00719 // its actual parameters (gsposp).
00720 //  NAME   Volume name
00721 //  NUMBER Copy number of the volume
00722 //  MOTHER Mother volume name
00723 //  X      X coord. of the volume in mother ref. sys.
00724 //  Y      Y coord. of the volume in mother ref. sys.
00725 //  Z      Z coord. of the volume in mother ref. sys.
00726 //  IROT   Rotation matrix number w.r.t. mother ref. sys.
00727 //  ISONLY ONLY/MANY flag
00728    TGeoVolume *amother= 0;
00729    TGeoVolume *volume = 0;
00730    
00731    // look into special volume list first
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    //---> acting as G3 gspos
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       // look into special volume list first
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    //---> acting as G3 gsposp
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 // Create a volume in GEANT3 style.
00854 //  NAME   Volume name
00855 //  SHAPE  Volume type
00856 //  NMED   Tracking medium number
00857 //  NPAR   Number of shape parameters
00858 //  UPAR   Vector containing shape parameters
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       //--- create a TGeoVolumeMulti
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    //---> create a normal volume
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 // Create a volume in GEANT3 style.
00938 //  NAME   Volume name
00939 //  SHAPE  Volume type
00940 //  NMED   Tracking medium number
00941 //  NPAR   Number of shape parameters
00942 //  UPAR   Vector containing shape parameters
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       //--- create a TGeoVolumeMulti
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    //---> create a normal volume
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 

Generated on Tue Jul 5 14:12:55 2011 for ROOT_528-00b_version by  doxygen 1.5.1