50 ClassImp(TGeoBuilder);
52 TGeoBuilder *TGeoBuilder::fgInstance = NULL;
57 TGeoBuilder::TGeoBuilder()
66 TGeoBuilder::TGeoBuilder(
const TGeoBuilder& other)
67 :TObject(other), fGeometry(nullptr)
69 Error(
"copy constructor",
"copying not allowed for TGeoBuilder");
75 TGeoBuilder::~TGeoBuilder()
83 TGeoBuilder &TGeoBuilder::operator=(
const TGeoBuilder&)
85 Error(
"Assignment",
"assignment not allowed for TGeoBuilder");
92 TGeoBuilder *TGeoBuilder::Instance(TGeoManager *geom)
95 printf(
"ERROR: Cannot create geometry builder with NULL geometry\n");
98 if (!fgInstance) fgInstance =
new TGeoBuilder();
99 fgInstance->SetGeometry(geom);
106 Int_t TGeoBuilder::AddMaterial(TGeoMaterial *material)
108 if (!material)
return -1;
109 TList *materials = fGeometry->GetListOfMaterials();
110 Int_t index = materials->GetSize();
111 material->SetIndex(index);
112 materials->Add(material);
119 Int_t TGeoBuilder::AddTransformation(TGeoMatrix *matrix)
122 if (!matrix)
return -1;
123 TObjArray *matrices = fGeometry->GetListOfMatrices();
124 index = matrices->GetEntriesFast();
125 matrices->AddAtAndExpand(matrix,index);
132 Int_t TGeoBuilder::AddShape(TGeoShape *shape)
135 if (!shape)
return -1;
136 TObjArray *shapes = fGeometry->GetListOfShapes();
137 if (shape->IsRunTimeShape()) shapes = fGeometry->GetListOfGShapes();
138 index = shapes->GetEntriesFast();
139 shapes->AddAtAndExpand(shape,index);
147 void TGeoBuilder::RegisterMatrix(TGeoMatrix *matrix)
149 if (matrix->IsRegistered())
return;
150 TObjArray *matrices = fGeometry->GetListOfMatrices();
151 Int_t nmat = matrices->GetEntriesFast();
152 matrices->AddAtAndExpand(matrix, nmat);
158 TGeoVolume *TGeoBuilder::MakeArb8(
const char *name, TGeoMedium *medium,
159 Double_t dz, Double_t *vertices)
161 TGeoArb8 *arb =
new TGeoArb8(name, dz, vertices);
162 TGeoVolume *vol =
new TGeoVolume(name, arb, medium);
169 TGeoVolume *TGeoBuilder::MakeBox(
const char *name, TGeoMedium *medium,
170 Double_t dx, Double_t dy, Double_t dz)
172 TGeoBBox *box =
new TGeoBBox(name, dx, dy, dz);
174 if (box->IsRunTimeShape()) {
175 vol = fGeometry->MakeVolumeMulti(name, medium);
178 vol =
new TGeoVolume(name, box, medium);
186 TGeoVolume *TGeoBuilder::MakePara(
const char *name, TGeoMedium *medium,
187 Double_t dx, Double_t dy, Double_t dz,
188 Double_t alpha, Double_t theta, Double_t phi)
190 if (TMath::Abs(alpha)<TGeoShape::Tolerance() && TMath::Abs(theta)<TGeoShape::Tolerance()) {
191 Warning(
"MakePara",
"parallelepiped %s having alpha=0, theta=0 -> making box instead", name);
192 return MakeBox(name, medium, dx, dy, dz);
195 para =
new TGeoPara(name, dx, dy, dz, alpha, theta, phi);
197 if (para->IsRunTimeShape()) {
198 vol = fGeometry->MakeVolumeMulti(name, medium);
201 vol =
new TGeoVolume(name, para, medium);
209 TGeoVolume *TGeoBuilder::MakeSphere(
const char *name, TGeoMedium *medium,
210 Double_t rmin, Double_t rmax, Double_t themin, Double_t themax,
211 Double_t phimin, Double_t phimax)
213 TGeoSphere *sph =
new TGeoSphere(name, rmin, rmax, themin, themax, phimin, phimax);
214 TGeoVolume *vol =
new TGeoVolume(name, sph, medium);
221 TGeoVolume *TGeoBuilder::MakeTorus(
const char *name, TGeoMedium *medium, Double_t r,
222 Double_t rmin, Double_t rmax, Double_t phi1, Double_t dphi)
224 TGeoTorus *tor =
new TGeoTorus(name,r,rmin,rmax,phi1,dphi);
225 TGeoVolume *vol =
new TGeoVolume(name, tor, medium);
232 TGeoVolume *TGeoBuilder::MakeTube(
const char *name, TGeoMedium *medium,
233 Double_t rmin, Double_t rmax, Double_t dz)
236 Error(
"MakeTube",
"tube %s, Rmin=%g greater than Rmax=%g", name,rmin,rmax);
238 TGeoTube *tube =
new TGeoTube(name, rmin, rmax, dz);
240 if (tube->IsRunTimeShape()) {
241 vol = fGeometry->MakeVolumeMulti(name, medium);
244 vol =
new TGeoVolume(name, tube, medium);
252 TGeoVolume *TGeoBuilder::MakeTubs(
const char *name, TGeoMedium *medium,
253 Double_t rmin, Double_t rmax, Double_t dz,
254 Double_t phi1, Double_t phi2)
256 TGeoTubeSeg *tubs =
new TGeoTubeSeg(name, rmin, rmax, dz, phi1, phi2);
258 if (tubs->IsRunTimeShape()) {
259 vol = fGeometry->MakeVolumeMulti(name, medium);
262 vol =
new TGeoVolume(name, tubs, medium);
270 TGeoVolume *TGeoBuilder::MakeEltu(
const char *name, TGeoMedium *medium,
271 Double_t a, Double_t b, Double_t dz)
273 TGeoEltu *eltu =
new TGeoEltu(name, a, b, dz);
275 if (eltu->IsRunTimeShape()) {
276 vol = fGeometry->MakeVolumeMulti(name, medium);
279 vol =
new TGeoVolume(name, eltu, medium);
287 TGeoVolume *TGeoBuilder::MakeHype(
const char *name, TGeoMedium *medium,
288 Double_t rin, Double_t stin, Double_t rout, Double_t stout, Double_t dz)
290 TGeoHype * hype =
new TGeoHype(name, rin,stin,rout,stout,dz);
292 if (hype->IsRunTimeShape()) {
293 vol = fGeometry->MakeVolumeMulti(name, medium);
296 vol =
new TGeoVolume(name, hype, medium);
304 TGeoVolume *TGeoBuilder::MakeParaboloid(
const char *name, TGeoMedium *medium,
305 Double_t rlo, Double_t rhi, Double_t dz)
307 TGeoParaboloid *parab =
new TGeoParaboloid(name, rlo, rhi, dz);
309 if (parab->IsRunTimeShape()) {
310 vol = fGeometry->MakeVolumeMulti(name, medium);
311 vol->SetShape(parab);
313 vol =
new TGeoVolume(name, parab, medium);
321 TGeoVolume *TGeoBuilder::MakeCtub(
const char *name, TGeoMedium *medium,
322 Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t phi2,
323 Double_t lx, Double_t ly, Double_t lz, Double_t tx, Double_t ty, Double_t tz)
325 TGeoCtub *ctub =
new TGeoCtub(name, rmin, rmax, dz, phi1, phi2, lx, ly, lz, tx, ty, tz);
326 TGeoVolume *vol =
new TGeoVolume(name, ctub, medium);
333 TGeoVolume *TGeoBuilder::MakeCone(
const char *name, TGeoMedium *medium,
334 Double_t dz, Double_t rmin1, Double_t rmax1,
335 Double_t rmin2, Double_t rmax2)
337 TGeoCone *cone =
new TGeoCone(name, dz, rmin1, rmax1, rmin2, rmax2);
339 if (cone->IsRunTimeShape()) {
340 vol = fGeometry->MakeVolumeMulti(name, medium);
343 vol =
new TGeoVolume(name, cone, medium);
351 TGeoVolume *TGeoBuilder::MakeCons(
const char *name, TGeoMedium *medium,
352 Double_t dz, Double_t rmin1, Double_t rmax1,
353 Double_t rmin2, Double_t rmax2,
354 Double_t phi1, Double_t phi2)
356 TGeoConeSeg *cons =
new TGeoConeSeg(name, dz, rmin1, rmax1, rmin2, rmax2, phi1, phi2);
358 if (cons->IsRunTimeShape()) {
359 vol = fGeometry->MakeVolumeMulti(name, medium);
362 vol =
new TGeoVolume(name, cons, medium);
370 TGeoVolume *TGeoBuilder::MakePcon(
const char *name, TGeoMedium *medium,
371 Double_t phi, Double_t dphi, Int_t nz)
373 TGeoPcon *pcon =
new TGeoPcon(name, phi, dphi, nz);
374 TGeoVolume *vol =
new TGeoVolume(name, pcon, medium);
381 TGeoVolume *TGeoBuilder::MakePgon(
const char *name, TGeoMedium *medium,
382 Double_t phi, Double_t dphi, Int_t nedges, Int_t nz)
384 TGeoPgon *pgon =
new TGeoPgon(name, phi, dphi, nedges, nz);
385 TGeoVolume *vol =
new TGeoVolume(name, pgon, medium);
392 TGeoVolume *TGeoBuilder::MakeTrd1(
const char *name, TGeoMedium *medium,
393 Double_t dx1, Double_t dx2, Double_t dy, Double_t dz)
395 TGeoTrd1 *trd1 =
new TGeoTrd1(name, dx1, dx2, dy, dz);
397 if (trd1->IsRunTimeShape()) {
398 vol = fGeometry->MakeVolumeMulti(name, medium);
401 vol =
new TGeoVolume(name, trd1, medium);
409 TGeoVolume *TGeoBuilder::MakeTrd2(
const char *name, TGeoMedium *medium,
410 Double_t dx1, Double_t dx2, Double_t dy1, Double_t dy2,
413 TGeoTrd2 *trd2 =
new TGeoTrd2(name, dx1, dx2, dy1, dy2, dz);
415 if (trd2->IsRunTimeShape()) {
416 vol = fGeometry->MakeVolumeMulti(name, medium);
419 vol =
new TGeoVolume(name, trd2, medium);
427 TGeoVolume *TGeoBuilder::MakeTrap(
const char *name, TGeoMedium *medium,
428 Double_t dz, Double_t theta, Double_t phi, Double_t h1,
429 Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2,
430 Double_t tl2, Double_t alpha2)
432 TGeoTrap *trap =
new TGeoTrap(name, dz, theta, phi, h1, bl1, tl1, alpha1, h2, bl2,
434 TGeoVolume *vol =
new TGeoVolume(name, trap, medium);
441 TGeoVolume *TGeoBuilder::MakeGtra(
const char *name, TGeoMedium *medium,
442 Double_t dz, Double_t theta, Double_t phi, Double_t twist, Double_t h1,
443 Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2,
444 Double_t tl2, Double_t alpha2)
446 TGeoGtra *gtra =
new TGeoGtra(name, dz, theta, phi, twist, h1, bl1, tl1, alpha1, h2, bl2,
448 TGeoVolume *vol =
new TGeoVolume(name, gtra, medium);
454 TGeoVolume *TGeoBuilder::MakeXtru(
const char *name, TGeoMedium *medium, Int_t nz)
456 TGeoXtru *xtru =
new TGeoXtru(nz);
458 TGeoVolume *vol =
new TGeoVolume(name, xtru, medium);
465 TGeoVolumeAssembly *TGeoBuilder::MakeVolumeAssembly(
const char *name)
467 return (
new TGeoVolumeAssembly(name));
473 TGeoVolumeMulti *TGeoBuilder::MakeVolumeMulti(
const char *name, TGeoMedium *medium)
475 return (
new TGeoVolumeMulti(name, medium));
494 TGeoVolume *TGeoBuilder::Division(
const char *name,
const char *mother, Int_t iaxis,
495 Int_t ndiv, Double_t start, Double_t step, Int_t numed, Option_t *option)
498 TString sname = name;
499 sname = sname.Strip();
500 const char *vname = sname.Data();
501 TString smname = mother;
502 smname = smname.Strip();
503 const char *mname = smname.Data();
505 amother = (TGeoVolume*)fGeometry->GetListOfGVolumes()->FindObject(mname);
506 if (!amother) amother = fGeometry->GetVolume(mname);
507 if (amother)
return amother->Divide(vname,iaxis,ndiv,start,step,numed, option);
509 Error(
"Division",
"VOLUME: \"%s\" not defined",mname);
526 void TGeoBuilder::Matrix(Int_t index, Double_t theta1, Double_t phi1,
527 Double_t theta2, Double_t phi2,
528 Double_t theta3, Double_t phi3)
530 TGeoRotation * rot =
new TGeoRotation(
"",theta1,phi1,theta2,phi2,theta3,phi3);
531 rot->SetUniqueID(index);
532 rot->RegisterYourself();
538 TGeoMaterial *TGeoBuilder::Material(
const char *name, Double_t a, Double_t z, Double_t dens, Int_t uid,Double_t radlen, Double_t intlen)
540 TGeoMaterial *material =
new TGeoMaterial(name,a,z,dens,radlen,intlen);
541 material->SetUniqueID(uid);
549 TGeoMaterial *TGeoBuilder::Mixture(
const char *name, Float_t *a, Float_t *z, Double_t dens,
550 Int_t nelem, Float_t *wmat, Int_t uid)
552 TGeoMixture *mix =
new TGeoMixture(name,nelem,dens);
553 mix->SetUniqueID(uid);
555 for (i=0;i<nelem;i++) {
556 mix->DefineElement(i,a[i],z[i],wmat[i]);
558 return (TGeoMaterial*)mix;
565 TGeoMaterial *TGeoBuilder::Mixture(
const char *name, Double_t *a, Double_t *z, Double_t dens,
566 Int_t nelem, Double_t *wmat, Int_t uid)
568 TGeoMixture *mix =
new TGeoMixture(name,nelem,dens);
569 mix->SetUniqueID(uid);
571 for (i=0;i<nelem;i++) {
572 mix->DefineElement(i,a[i],z[i],wmat[i]);
574 return (TGeoMaterial*)mix;
597 TGeoMedium *TGeoBuilder::Medium(
const char *name, Int_t numed, Int_t nmat, Int_t isvol,
598 Int_t ifield, Double_t fieldm, Double_t tmaxfd,
599 Double_t stemax, Double_t deemax, Double_t epsil,
602 return new TGeoMedium(name,numed,nmat,isvol,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
620 void TGeoBuilder::Node(
const char *name, Int_t nr,
const char *mother,
621 Double_t x, Double_t y, Double_t z, Int_t irot,
622 Bool_t isOnly, Float_t *upar, Int_t npar)
624 TGeoVolume *amother= 0;
625 TGeoVolume *volume = 0;
628 amother = fGeometry->FindVolumeFast(mother,kTRUE);
629 if (!amother) amother = fGeometry->FindVolumeFast(mother);
631 TString mname = mother;
632 mname = mname.Strip();
633 Error(
"Node",
"Mother VOLUME \"%s\" not defined",mname.Data());
639 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);
641 volume = fGeometry->FindVolumeFast(name,kTRUE);
642 if (!volume) volume = fGeometry->FindVolumeFast(name);
644 TString vname = name;
645 vname = vname.Strip();
646 Error(
"Node",
"VOLUME: \"%s\" not defined",vname.Data());
649 if (((TObject*)volume)->TestBit(TGeoVolume::kVolumeMulti) && !volume->GetShape()) {
650 Error(
"Node",
"cannot add multiple-volume object %s as node", volume->GetName());
655 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->FindVolumeFast(name, kTRUE);
657 volume = fGeometry->FindVolumeFast(name);
659 Warning(
"Node",
"volume: %s is defined as single -> ignoring shape parameters", volume->GetName());
660 Node(name,nr,mother,x,y,z,irot,isOnly, upar);
663 TString vname = name;
664 vname = vname.Strip();
665 Error(
"Node",
"VOLUME: \"%s\" not defined ",vname.Data());
668 TGeoMedium *medium = vmulti->GetMedium();
669 TString sh = vmulti->GetTitle();
671 if (sh.Contains(
"box")) {
672 volume = MakeBox(name,medium,upar[0],upar[1],upar[2]);
673 }
else if (sh.Contains(
"trd1")) {
674 volume = MakeTrd1(name,medium,upar[0],upar[1],upar[2],upar[3]);
675 }
else if (sh.Contains(
"trd2")) {
676 volume = MakeTrd2(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
677 }
else if (sh.Contains(
"trap")) {
678 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]);
679 }
else if (sh.Contains(
"gtra")) {
680 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]);
681 }
else if (sh.Contains(
"tube")) {
682 volume = MakeTube(name,medium,upar[0],upar[1],upar[2]);
683 }
else if (sh.Contains(
"tubs")) {
684 volume = MakeTubs(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
685 }
else if (sh.Contains(
"cone")) {
686 volume = MakeCone(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
687 }
else if (sh.Contains(
"cons")) {
688 volume = MakeCons(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
689 }
else if (sh.Contains(
"pgon")) {
690 volume = MakePgon(name,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
691 Int_t nz = (Int_t)upar[3];
693 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
695 }
else if (sh.Contains(
"pcon")) {
696 volume = MakePcon(name,medium,upar[0],upar[1],(Int_t)upar[2]);
697 Int_t nz = (Int_t)upar[2];
699 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
701 }
else if (sh.Contains(
"eltu")) {
702 volume = MakeEltu(name,medium,upar[0],upar[1],upar[2]);
703 }
else if (sh.Contains(
"sphe")) {
704 volume = MakeSphere(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
705 }
else if (sh.Contains(
"ctub")) {
706 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]);
707 }
else if (sh.Contains(
"para")) {
708 volume = MakePara(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
710 Error(
"Node",
"cannot create shape %s",sh.Data());
714 vmulti->AddVolume(volume);
717 TGeoRotation *matrix = 0;
719 TIter next(fGeometry->GetListOfMatrices());
720 while ((mat=(TGeoMatrix*)next())) {
721 if (mat->GetUniqueID()==UInt_t(irot)) {
722 matrix =
dynamic_cast<TGeoRotation*
>(mat);
727 Fatal(
"Node",
"Node %s/%s_%d rotation %i not found",mother, name, nr ,irot);
730 if (isOnly) amother->AddNode(volume,nr,
new TGeoCombiTrans(x,y,z,matrix));
731 else amother->AddNodeOverlap(volume,nr,
new TGeoCombiTrans(x,y,z,matrix));
733 if (TMath::Abs(x)<TGeoShape::Tolerance() &&
734 TMath::Abs(y)<TGeoShape::Tolerance() &&
735 TMath::Abs(z)<TGeoShape::Tolerance()) {
736 if (isOnly) amother->AddNode(volume,nr);
737 else amother->AddNodeOverlap(volume,nr);
739 if (isOnly) amother->AddNode(volume,nr,
new TGeoTranslation(x,y,z));
740 else amother->AddNodeOverlap(volume,nr,
new TGeoTranslation(x,y,z));
760 void TGeoBuilder::Node(
const char *name, Int_t nr,
const char *mother,
761 Double_t x, Double_t y, Double_t z, Int_t irot,
762 Bool_t isOnly, Double_t *upar, Int_t npar)
764 TGeoVolume *amother= 0;
765 TGeoVolume *volume = 0;
768 amother = fGeometry->FindVolumeFast(mother,kTRUE);
769 if (!amother) amother = fGeometry->FindVolumeFast(mother);
771 TString mname = mother;
772 mname = mname.Strip();
773 Error(
"Node",
"Mother VOLUME \"%s\" not defined",mname.Data());
779 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);
781 volume = fGeometry->FindVolumeFast(name,kTRUE);
782 if (!volume) volume = fGeometry->FindVolumeFast(name);
784 TString vname = name;
785 vname = vname.Strip();
786 Error(
"Node",
"VOLUME: \"%s\" not defined",vname.Data());
789 if (((TObject*)volume)->TestBit(TGeoVolume::kVolumeMulti) && !volume->GetShape()) {
790 Error(
"Node",
"cannot add multiple-volume object %s as node", volume->GetName());
795 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->FindVolumeFast(name, kTRUE);
797 volume = fGeometry->FindVolumeFast(name);
799 Warning(
"Node",
"volume: %s is defined as single -> ignoring shape parameters", volume->GetName());
800 Node(name,nr,mother,x,y,z,irot,isOnly, upar);
803 TString vname = name;
804 vname = vname.Strip();
805 Error(
"Node",
"VOLUME: \"%s\" not defined ",vname.Data());
808 TGeoMedium *medium = vmulti->GetMedium();
809 TString sh = vmulti->GetTitle();
811 if (sh.Contains(
"box")) {
812 volume = MakeBox(name,medium,upar[0],upar[1],upar[2]);
813 }
else if (sh.Contains(
"trd1")) {
814 volume = MakeTrd1(name,medium,upar[0],upar[1],upar[2],upar[3]);
815 }
else if (sh.Contains(
"trd2")) {
816 volume = MakeTrd2(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
817 }
else if (sh.Contains(
"trap")) {
818 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]);
819 }
else if (sh.Contains(
"gtra")) {
820 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]);
821 }
else if (sh.Contains(
"tube")) {
822 volume = MakeTube(name,medium,upar[0],upar[1],upar[2]);
823 }
else if (sh.Contains(
"tubs")) {
824 volume = MakeTubs(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
825 }
else if (sh.Contains(
"cone")) {
826 volume = MakeCone(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
827 }
else if (sh.Contains(
"cons")) {
828 volume = MakeCons(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
829 }
else if (sh.Contains(
"pgon")) {
830 volume = MakePgon(name,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
831 Int_t nz = (Int_t)upar[3];
833 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
835 }
else if (sh.Contains(
"pcon")) {
836 volume = MakePcon(name,medium,upar[0],upar[1],(Int_t)upar[2]);
837 Int_t nz = (Int_t)upar[2];
839 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
841 }
else if (sh.Contains(
"eltu")) {
842 volume = MakeEltu(name,medium,upar[0],upar[1],upar[2]);
843 }
else if (sh.Contains(
"sphe")) {
844 volume = MakeSphere(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
845 }
else if (sh.Contains(
"ctub")) {
846 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]);
847 }
else if (sh.Contains(
"para")) {
848 volume = MakePara(name,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
850 Error(
"Node",
"cannot create shape %s",sh.Data());
854 vmulti->AddVolume(volume);
857 TGeoRotation *matrix = 0;
859 TIter next(fGeometry->GetListOfMatrices());
860 while ((mat=(TGeoMatrix*)next())) {
861 if (mat->GetUniqueID()==UInt_t(irot)) {
862 matrix =
dynamic_cast<TGeoRotation*
>(mat);
867 Fatal(
"Node",
"Node %s/%s_%d rotation %i not found",mother, name, nr ,irot);
870 if (isOnly) amother->AddNode(volume,nr,
new TGeoCombiTrans(x,y,z,matrix));
871 else amother->AddNodeOverlap(volume,nr,
new TGeoCombiTrans(x,y,z,matrix));
873 if (TMath::Abs(x)<TGeoShape::Tolerance() &&
874 TMath::Abs(y)<TGeoShape::Tolerance() &&
875 TMath::Abs(z)<TGeoShape::Tolerance()) {
876 if (isOnly) amother->AddNode(volume,nr);
877 else amother->AddNodeOverlap(volume,nr);
879 if (isOnly) amother->AddNode(volume,nr,
new TGeoTranslation(x,y,z));
880 else amother->AddNodeOverlap(volume,nr,
new TGeoTranslation(x,y,z));
893 TGeoVolume *TGeoBuilder::Volume(
const char *name,
const char *shape, Int_t nmed,
894 Float_t *upar, Int_t npar)
897 TGeoVolume *volume = 0;
898 TGeoMedium *medium = fGeometry->GetMedium(nmed);
900 Error(
"Volume",
"cannot create volume: %s, medium: %d is unknown",name,nmed);
904 TString sname = name;
905 sname = sname.Strip();
906 const char *vname = sname.Data();
909 volume = MakeVolumeMulti(vname,medium);
910 volume->SetTitle(shape);
911 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->GetListOfGVolumes()->FindObject(vname);
913 Error(
"Volume",
"volume multi: %s not created",vname);
920 if (sh.Contains(
"box")) {
921 volume = MakeBox(vname,medium,upar[0],upar[1],upar[2]);
922 }
else if (sh.Contains(
"trd1")) {
923 volume = MakeTrd1(vname,medium,upar[0],upar[1],upar[2],upar[3]);
924 }
else if (sh.Contains(
"trd2")) {
925 volume = MakeTrd2(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
926 }
else if (sh.Contains(
"trap")) {
927 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]);
928 }
else if (sh.Contains(
"gtra")) {
929 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]);
930 }
else if (sh.Contains(
"tube")) {
931 volume = MakeTube(vname,medium,upar[0],upar[1],upar[2]);
932 }
else if (sh.Contains(
"tubs")) {
933 volume = MakeTubs(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
934 }
else if (sh.Contains(
"cone")) {
935 volume = MakeCone(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
936 }
else if (sh.Contains(
"cons")) {
937 volume = MakeCons(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
938 }
else if (sh.Contains(
"pgon")) {
939 volume = MakePgon(vname,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
940 Int_t nz = (Int_t)upar[3];
942 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
944 }
else if (sh.Contains(
"pcon")) {
945 volume = MakePcon(vname,medium,upar[0],upar[1],(Int_t)upar[2]);
946 Int_t nz = (Int_t)upar[2];
948 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
950 }
else if (sh.Contains(
"eltu")) {
951 volume = MakeEltu(vname,medium,upar[0],upar[1],upar[2]);
952 }
else if (sh.Contains(
"sphe")) {
953 volume = MakeSphere(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
954 }
else if (sh.Contains(
"ctub")) {
955 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]);
956 }
else if (sh.Contains(
"para")) {
957 volume = MakePara(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
958 }
else if (sh.Contains(
"tor")) {
959 volume = MakeTorus(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
963 Error(
"Volume",
"volume: %s not created",vname);
978 TGeoVolume *TGeoBuilder::Volume(
const char *name,
const char *shape, Int_t nmed,
979 Double_t *upar, Int_t npar)
982 TGeoVolume *volume = 0;
983 TGeoMedium *medium = fGeometry->GetMedium(nmed);
985 Error(
"Volume",
"cannot create volume: %s, medium: %d is unknown",name,nmed);
989 TString sname = name;
990 sname = sname.Strip();
991 const char *vname = sname.Data();
994 volume = MakeVolumeMulti(vname,medium);
995 volume->SetTitle(shape);
996 TGeoVolumeMulti *vmulti = (TGeoVolumeMulti*)fGeometry->GetListOfGVolumes()->FindObject(vname);
998 Error(
"Volume",
"volume multi: %s not created",vname);
1005 if (sh.Contains(
"box")) {
1006 volume = MakeBox(vname,medium,upar[0],upar[1],upar[2]);
1007 }
else if (sh.Contains(
"trd1")) {
1008 volume = MakeTrd1(vname,medium,upar[0],upar[1],upar[2],upar[3]);
1009 }
else if (sh.Contains(
"trd2")) {
1010 volume = MakeTrd2(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
1011 }
else if (sh.Contains(
"trap")) {
1012 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]);
1013 }
else if (sh.Contains(
"gtra")) {
1014 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]);
1015 }
else if (sh.Contains(
"tube")) {
1016 volume = MakeTube(vname,medium,upar[0],upar[1],upar[2]);
1017 }
else if (sh.Contains(
"tubs")) {
1018 volume = MakeTubs(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
1019 }
else if (sh.Contains(
"cone")) {
1020 volume = MakeCone(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
1021 }
else if (sh.Contains(
"cons")) {
1022 volume = MakeCons(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5],upar[6]);
1023 }
else if (sh.Contains(
"pgon")) {
1024 volume = MakePgon(vname,medium,upar[0],upar[1],(Int_t)upar[2],(Int_t)upar[3]);
1025 Int_t nz = (Int_t)upar[3];
1026 for (i=0;i<nz;i++) {
1027 ((TGeoPgon*)volume->GetShape())->DefineSection(i,upar[3*i+4],upar[3*i+5],upar[3*i+6]);
1029 }
else if (sh.Contains(
"pcon")) {
1030 volume = MakePcon(vname,medium,upar[0],upar[1],(Int_t)upar[2]);
1031 Int_t nz = (Int_t)upar[2];
1032 for (i=0;i<nz;i++) {
1033 ((TGeoPcon*)volume->GetShape())->DefineSection(i,upar[3*i+3],upar[3*i+4],upar[3*i+5]);
1035 }
else if (sh.Contains(
"eltu")) {
1036 volume = MakeEltu(vname,medium,upar[0],upar[1],upar[2]);
1037 }
else if (sh.Contains(
"sphe")) {
1038 volume = MakeSphere(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
1039 }
else if (sh.Contains(
"ctub")) {
1040 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]);
1041 }
else if (sh.Contains(
"para")) {
1042 volume = MakePara(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4],upar[5]);
1043 }
else if (sh.Contains(
"tor")) {
1044 volume = MakeTorus(vname,medium,upar[0],upar[1],upar[2],upar[3],upar[4]);
1048 Error(
"Volume",
"volume: %s not created",vname);