Geant4-11
Public Member Functions | Private Member Functions | Private Attributes
G3Division Class Reference

#include <G3Division.hh>

Public Member Functions

void CreatePVReplica ()
 
 G3Division (G3DivType type, G3VolTableEntry *vte, G3VolTableEntry *mvte, G4int nofDivision, G4int iaxis, G4int nmed, G4double c0, G4double step)
 
 G3Division (G3VolTableEntry *vte, G3VolTableEntry *mvte, const G3Division &division)
 
void UpdateVTE ()
 
virtual ~G3Division ()
 

Private Member Functions

G3VolTableEntryCreateEnvelope (G4String shape, G4double hi, G4double lo, G4double par[], G4int npar)
 
void CreateSolid (G4String shape, G4double par[], G4int npar)
 
G3VolTableEntryDvn ()
 
G3VolTableEntryDvn2 ()
 
G3VolTableEntryDvt ()
 
G3VolTableEntryDvt2 ()
 
void Exception (G4String where, G4String what)
 
void SetRangeAndAxis ()
 

Private Attributes

EAxis fAxis
 
G4double fC0
 
G4double fHighRange
 
G4int fIAxis
 
G4double fLowRange
 
G3VolTableEntryfMVTE
 
G4int fNmed
 
G4int fNofDivisions
 
G4double fOffset
 
G4double fStep
 
G3DivType fType
 
G3VolTableEntryfVTE
 
G4double fWidth
 

Detailed Description

Definition at line 54 of file G3Division.hh.

Constructor & Destructor Documentation

◆ G3Division() [1/2]

G3Division::G3Division ( G3DivType  type,
G3VolTableEntry vte,
G3VolTableEntry mvte,
G4int  nofDivision,
G4int  iaxis,
G4int  nmed,
G4double  c0,
G4double  step 
)

Definition at line 49 of file G3Division.cc.

52 : fType(type),
53 fVTE(vte),
54 fMVTE(mvte),
55 fNofDivisions(nofDivisions),
56 fIAxis(iaxis),
57 fNmed(nmed),
58 fC0(c0),
59 fStep(step),
60 fLowRange(0.),
61 fHighRange(0.),
62 fWidth(0.),
63 fOffset(0.),
65{
66 fVTE->SetHasNegPars(true);
67}
G4int fIAxis
Definition: G3Division.hh:87
G4double fWidth
Definition: G3Division.hh:93
G3VolTableEntry * fMVTE
Definition: G3Division.hh:85
G4double fC0
Definition: G3Division.hh:89
G4double fHighRange
Definition: G3Division.hh:92
G4double fStep
Definition: G3Division.hh:90
G4int fNofDivisions
Definition: G3Division.hh:86
G4double fOffset
Definition: G3Division.hh:94
G3DivType fType
Definition: G3Division.hh:83
EAxis fAxis
Definition: G3Division.hh:95
G4double fLowRange
Definition: G3Division.hh:91
G3VolTableEntry * fVTE
Definition: G3Division.hh:84
G4int fNmed
Definition: G3Division.hh:88
void SetHasNegPars(G4bool hasNegPars)
@ kXAxis
Definition: geomdefs.hh:55

References fVTE, and G3VolTableEntry::SetHasNegPars().

◆ G3Division() [2/2]

G3Division::G3Division ( G3VolTableEntry vte,
G3VolTableEntry mvte,
const G3Division division 
)

Definition at line 69 of file G3Division.cc.

71 : fVTE(vte),
72 fMVTE(mvte)
73{
74 // only "input" parameters are copied from division
75 fType = division.fType;
77 fIAxis = division.fIAxis;
78 fNmed = division.fNmed;
79 fC0 = division.fC0;
80 fStep = division.fStep;
81
82 // other parameters are set as in standard constructor
83 fLowRange = 0.;
84 fHighRange = 0.;
85 fWidth = 0.;
86 fOffset = 0.;
87 fAxis = kXAxis;
88 fVTE->SetHasNegPars(true);
89}

References fAxis, fC0, fHighRange, fIAxis, fLowRange, fNmed, fNofDivisions, fOffset, fStep, fType, fVTE, fWidth, kXAxis, and G3VolTableEntry::SetHasNegPars().

◆ ~G3Division()

G3Division::~G3Division ( )
virtual

Definition at line 91 of file G3Division.cc.

92{}

Member Function Documentation

◆ CreateEnvelope()

G3VolTableEntry * G3Division::CreateEnvelope ( G4String  shape,
G4double  hi,
G4double  lo,
G4double  par[],
G4int  npar 
)
private

Definition at line 437 of file G3Division.cc.

441{
442 // verbose
443 // G4cout << " G3Division::CreateEnvelope " << "fIAaxis= " << fIAxis
444 // << " hi= " << hi
445 // << " lo= " << lo
446 // << G4endl;
447
448 G4double *Rpar = new G4double[npar+2];
449 for (G4int i=0; i<npar; ++i){ Rpar[i] = par[i];}
450 G4double pos[3] = {0.,0.,0.};
451
452 if ( shape == "BOX" ) {
453 Rpar[fIAxis-1] = (hi - lo)/2./cm;
454 pos [fIAxis-1] = (hi + lo)/2.;
455 }
456 else if ( shape == "TRD1" ) {
457 if ( fIAxis == 1 || fIAxis == 2 ) {
458 Exception("CreateEnvelope","TRD1-x,y");
459 }
460 else if ( fIAxis == 3 ) {
461 // x = x1 + (c-z1)(x2 -x1)/(z2-z1)
462 G4double tn, x1, z1;
463 tn = (Rpar[1] - Rpar[0])/(2.* Rpar[3]);
464 x1 = Rpar[0]; z1 = -Rpar[3];
465 Rpar[0] = x1 + tn * (lo/cm - z1);
466 Rpar[1] = x1 + tn * (hi/cm - z1);
467 Rpar[3] = (hi - lo)/2./cm;
468 pos[2] = (hi + lo)/2.;
469 }
470 }
471 else if ( shape == "TRD2" ) {
472 if ( fIAxis == 1 || fIAxis == 2) {
473 Exception("CreateEnvelope","TRD2-x,y");
474 }
475 else if ( fIAxis == 3 ) {
476 // x = x1 + (c-z1)(x2 -x1)/(z2-z1)
477 // y = y1 + (c-z1)(y2 -y1)/(z2-z1)
478 G4double tn1, tn2, x1, y1, z1;
479 tn1 = (Rpar[1] - Rpar[0])/(2.* Rpar[4]);
480 tn2 = (Rpar[3] - Rpar[2])/(2.* Rpar[4]);
481 x1 = Rpar[0]; y1 = Rpar[2]; z1 = -Rpar[3];
482 Rpar[0] = x1 + tn1 * (lo/cm - z1);
483 Rpar[1] = x1 + tn1 * (hi/cm - z1);
484 Rpar[2] = y1 + tn2 * (lo/cm - z1);
485 Rpar[3] = y1 + tn2 * (hi/cm - z1);
486 Rpar[4] = (hi - lo)/2./cm;
487 pos[2] = (hi + lo)/2.;
488 }
489 }
490 else if ( shape == "TRAP" ) {
491 Exception("CreateEnvelope","TRAP-x,y,z");
492 }
493 else if ( shape == "TUBE" ) {
494 if ( fIAxis == 1 ) {
495 Rpar[0] = lo/cm;
496 Rpar[1] = hi/cm;
497 }
498 else if ( fIAxis == 2 ) {
499 Rpar[3] = lo/deg;
500 Rpar[4] = hi/deg;
501 npar = npar + 2;
502 shape = "TUBS";
503 }
504 else if ( fIAxis == 3 ) {
505 Rpar[2] = (hi - lo)/2./cm;
506 pos [2] = (hi + lo)/2.;
507 }
508 }
509 else if ( shape == "TUBS" ) {
510 if ( fIAxis == 1 ) {
511 Rpar[0] = lo/cm;
512 Rpar[1] = hi/cm;
513 }
514 else if ( fIAxis == 2 ) {
515 Rpar[3] = lo/deg;
516 Rpar[4] = hi/deg;
517 }
518 else if ( fIAxis == 3 ) {
519 Rpar[2] = (hi - lo)/2./cm;
520 pos [2] = (hi + lo)/2.;
521 }
522 }
523 else if ( shape == "CONE" ) {
524 if ( fIAxis == 1) {
525 Exception("CreateEnvelope","CONE-x,z");
526 }
527 else if ( fIAxis == 2 ) {
528 Rpar[5] = lo/deg;
529 Rpar[6] = hi/deg;
530 npar = npar + 2;
531 shape = "CONS";
532 }
533 else if ( fIAxis == 3 ) {
534 G4double tn1, tn2, rmin, rmax, z1;
535 tn1 = (Rpar[3] - Rpar[1])/(2.* Rpar[0]);
536 tn2 = (Rpar[4] - Rpar[2])/(2.* Rpar[0]);
537 rmin = Rpar[1]; rmax = Rpar[2]; z1 = -Rpar[0];
538 Rpar[1] = rmin + tn1 * (lo/cm - z1);
539 Rpar[3] = rmin + tn1 * (hi/cm - z1);
540 Rpar[2] = rmax + tn2 * (lo/cm - z1);
541 Rpar[4] = rmax + tn2 * (hi/cm - z1);
542 Rpar[0] = (hi - lo)/2./cm;
543 pos[2] = (hi + lo)/2.;
544 }
545 }
546 else if ( shape == "CONS" ) {
547 if ( fIAxis == 1 ) {
548 Exception("CreateEnvelope","CONS-x");
549 }
550 else if ( fIAxis == 2 ) {
551 Rpar[5] = lo/deg;
552 Rpar[6] = hi/deg;
553 }
554 else if ( fIAxis == 3 ) {
555 G4double tn1, tn2, rmin, rmax, z1;
556 tn1 = (Rpar[3] - Rpar[1])/(2.* Rpar[0]);
557 tn2 = (Rpar[4] - Rpar[2])/(2.* Rpar[0]);
558 rmin = Rpar[1]; rmax = Rpar[2]; z1 = -Rpar[0];
559 Rpar[1] = rmin + tn1 * (lo/cm - z1);
560 Rpar[3] = rmin + tn1 * (hi/cm - z1);
561 Rpar[2] = rmax + tn2 * (lo/cm - z1);
562 Rpar[4] = rmax + tn2 * (hi/cm - z1);
563 Rpar[0] = (hi - lo)/2./cm;
564 pos[2] = (hi + lo)/2.;
565 }
566 }
567 else if ( shape == "SPHE" ) {
568 Exception("CreateEnvelope","SPHE-x,y,z");
569 }
570 else if ( shape == "PARA" ) {
571 Exception("CreateEnvelope","PARA-x,y,z");
572 }
573 else if ( shape == "PGON" ) {
574 if ( fIAxis == 2) {
575 Rpar[0] = lo/deg;
576 Rpar[1] = hi/deg;
577 // rotm = ???
578 }
579 else {
580 Exception("CreateEnvelope","PGON-x,z");
581 }
582 }
583 else if ( shape == "PCON" ) {
584 if ( fIAxis == 2) {
585 Rpar[0] = lo/deg;
586 Rpar[1] = hi/deg;
587 // rotm = ???
588 }
589 else {
590 Exception("CreateEnvelope","PCON-x,z");
591 }
592 }
593 else {
594 Exception("CreateEnvelope", "Unknown shape" + shape);
595 }
596
597 // create new VTE corresponding to envelope
598 G4String envName = fVTE->GetName() + "_ENV";
599 G3VolTableEntry* envVTE
600 = G4CreateVTE(envName, shape, fNmed, Rpar, npar);
601
602 // create a G3Pos object and add it to envVTE
603 G4String motherName = fMVTE->GetMasterClone()->GetName();
604 G4ThreeVector* offset = new G4ThreeVector(pos[0],pos[1],pos[2]);
605 G4String only = "ONLY";
606 G3Pos* aG3Pos = new G3Pos(motherName, 1, offset, 0, only);
607 envVTE->AddG3Pos(aG3Pos);
608
609 delete [] Rpar;
610
611 return envVTE;
612}
G3VolTableEntry * G4CreateVTE(G4String vname, G4String shape, G4int nmed, G4double Rpar[], G4int npar)
Definition: G4gsvolu.cc:50
G3G4DLL_API G4double Rpar[1000]
Definition: clparse.cc:66
static const G4double pos
static constexpr double cm
Definition: G4SIunits.hh:99
static constexpr double deg
Definition: G4SIunits.hh:132
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
void Exception(G4String where, G4String what)
Definition: G3Division.cc:180
Definition: G3Pos.hh:43
G3VolTableEntry * GetMasterClone()
void AddG3Pos(G3Pos *aG3Pos)

References G3VolTableEntry::AddG3Pos(), cm, deg, Exception(), fIAxis, fMVTE, fNmed, fVTE, G4CreateVTE(), G3VolTableEntry::GetMasterClone(), G3VolTableEntry::GetName(), pos, and Rpar.

Referenced by Dvn2(), Dvt(), and Dvt2().

◆ CreatePVReplica()

void G3Division::CreatePVReplica ( )

Definition at line 127 of file G3Division.cc.

128{
130 G4LogicalVolume* lv = fVTE->GetLV();
131 G4LogicalVolume* mlv = fMVTE->GetLV();
132
133 G4String shape = fMVTE->GetShape();
134 if (shape == "PARA") {
135 // The para volume cannot be replicated using G4PVReplica.
136 // (Replicating a volume along a cartesian axis means "slicing" it
137 // with slices -perpendicular- to that axis.)
138
139 // position the replicated elements
140 for (G4int i=0; i<fNofDivisions; i++) {
142 position[fIAxis-1] = fLowRange + fWidth/2. + i*fWidth;
143 if (position.y()!=0.)
144 position.setX(position.y()*((G4Para*)lv->GetSolid())->GetTanAlpha());
145
146 #ifndef G3G4_NO_REFLECTION
148 ->Place(G4Translate3D(position), name, lv, mlv, 0, i);
149
150 #else
151 new G4PVPlacement(0, position, lv, name, mlv, 0, i);
152
153 #endif
154 }
155
156 // G4PVReplica cannot be created
157 return;
158 }
159
160 #ifdef G3G4DEBUG
161 G4cout << "Create G4PVReplica name " << name << " logical volume name "
162 << lv->GetName() << " mother logical volme name "
163 << mlv->GetName() << " axis " << fAxis << " ndivisions "
164 << fNofDivisions << " width " << fWidth << " Offset "
165 << fOffset << G4endl;
166 #endif
167
168 #ifndef G3G4_NO_REFLECTION
171
172 #else
174
175 #endif
176}
HepGeom::Translate3D G4Translate3D
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4LogicalVolume * GetLV()
G4VSolid * GetSolid() const
const G4String & GetName() const
Definition: G4Para.hh:79
static G4ReflectionFactory * Instance()
G4PhysicalVolumesPair Place(const G4Transform3D &transform3D, const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, G4bool isMany, G4int copyNo, G4bool surfCheck=false)
G4PhysicalVolumesPair Replicate(const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, EAxis axis, G4int nofReplicas, G4double width, G4double offset=0.)
const char * name(G4int ptype)

References fAxis, fIAxis, fLowRange, fMVTE, fNofDivisions, fOffset, fVTE, fWidth, G4cout, G4endl, G3VolTableEntry::GetLV(), G3VolTableEntry::GetName(), G4LogicalVolume::GetName(), G3VolTableEntry::GetShape(), G4LogicalVolume::GetSolid(), G4ReflectionFactory::Instance(), G4InuclParticleNames::name(), G4ReflectionFactory::Place(), and G4ReflectionFactory::Replicate().

Referenced by G3toG4BuildPVTree().

◆ CreateSolid()

void G3Division::CreateSolid ( G4String  shape,
G4double  par[],
G4int  npar 
)
private

Definition at line 614 of file G3Division.cc.

617{
618 G4double *Rpar = new G4double[npar+2];
619 for (G4int i=0; i<npar; ++i){ Rpar[i] = par[i];}
620
621 // verbose
622 // G4cout << "G3Division::CreateSolid volume before: "
623 // << fVTE->GetName() << " " << shape << G4endl;
624 // G4cout << " npar,Rpar: " << npar;
625 // for (G4int ii = 0; ii < npar; ++ii) G4cout << " " << Rpar[ii];
626 // G4cout << G4endl;
627
628 if ( shape == "BOX" ) {
629 if ( fIAxis == 1 ) Rpar[0] = fWidth/2./cm;
630 else if ( fIAxis == 2 ) Rpar[1] = fWidth/2./cm;
631 else if ( fIAxis == 3 ) Rpar[2] = fWidth/2./cm;
632 }
633 else if ( shape == "TRD1" ) {
634 if ( fIAxis == 1 || fIAxis == 2 ) {
635 Exception("CreateSolid", "TRD1-x,y");
636 }
637 else if ( fIAxis == 3 ) {
638 Rpar[3] = fWidth/2./cm;
639 }
640 }
641 else if ( shape == "TRD2" ) {
642 if ( fIAxis == 1 || fIAxis == 2 ) {
643 Exception("CreateSolid", "TRD2-x,y");
644 }
645 else if ( fIAxis == 3 ) {
646 Rpar[4] = fWidth/2./cm;
647 }
648 }
649 else if ( shape == "TRAP" ) {
650 if ( fIAxis == 1 || fIAxis == 2) {
651 Exception("CreateSolid", "TRAP-x,y");
652 }
653 else if ( fIAxis == 3 ) {
654 Rpar[0] = fWidth/2./cm;
655 }
656 }
657 else if ( shape == "TUBE" ) {
658 if ( fIAxis == 1 ) {
659 Rpar[1] = Rpar[0] + fWidth/cm;
660 fOffset = Rpar[0]*cm;
661 }
662 else if ( fIAxis == 2 ) {
663 Rpar[3] = 0.;
664 Rpar[4] = fWidth/deg;
665 shape = "TUBS";
666 npar = npar + 2;
667 }
668 else if ( fIAxis == 3 ) {
669 Rpar[2] = fWidth/2./cm;
670 }
671 }
672 else if ( shape == "TUBS" ) {
673 if ( fIAxis == 1 ) {
674 Rpar[1] = Rpar[0] + fWidth/cm;
675 fOffset = Rpar[0]*cm;
676 }
677 else if ( fIAxis == 2 ) {
678 fOffset = Rpar[3]*deg;
679 Rpar[3] = 0.;
680 Rpar[4] = fWidth/deg;
681 }
682 else if ( fIAxis == 3 ) {
683 Rpar[2] = fWidth/2./cm;
684 }
685 }
686 else if ( shape == "CONE" ) {
687 if ( fIAxis == 1 ) {
688 Exception("CreateSolid", "CONE-x");
689 }
690 else if ( fIAxis == 2 ) {
691 Rpar[5] = 0.;
692 Rpar[6] = fWidth/deg;
693 shape = "CONS";
694 npar = npar + 2;
695 }
696 else if ( fIAxis == 3 ) {
697 Rpar[0] = fWidth/2./cm;
698 }
699 }
700 else if ( shape == "CONS" ) {
701 if ( fIAxis == 1 ) {
702 Exception("CreateSolid", "CONS-x");
703 }
704 else if ( fIAxis == 2 ) {
705 fOffset = Rpar[5]*deg;
706 Rpar[5] = 0.;
707 Rpar[6] = fWidth/deg;
708 }
709 else if ( fIAxis == 3 ) {
710 Rpar[0] = fWidth/2./cm;
711 }
712 }
713 else if (shape == "PARA") {
714 if ( fIAxis == 1 ) {
715 Rpar[0] = fWidth/2./cm;
716 }
717 else if ( Rpar[4] == 0. && Rpar[5] == 0. ) {
718 // only special case for axis 2,3 is supported
719 if ( fIAxis == 2 ) {
720 Rpar[1] = fWidth/2./cm;
721 }
722 else if ( fIAxis == 3) {
723 Rpar[2] = fWidth/2./cm;
724 }
725 }
726 else
727 Exception("CreateSolid", shape);
728 }
729 else if (shape == "SPHE") {
730 Exception("CreateSolid", shape);
731 }
732 else if ( shape == "PGON" ) {
733 if ( fIAxis == 2 ) {
734 fOffset = Rpar[0]*deg;
735 Rpar[0] = 0.;
736 Rpar[1] = fWidth/deg;
737 Rpar[2] = 1.;
738 }
739 else
740 Exception("CreateSolid", shape);
741 }
742 else if ( shape == "PCON" ) {
743 if ( fIAxis == 2 ) {
744 fOffset = Rpar[0]*deg;
745 Rpar[0] = 0.;
746 Rpar[1] = fWidth/deg;
747 }
748 else {
749 Exception("CreateSolid", shape);
750 }
751 }
752 else {
753 Exception("CreateSolid", "Unknown shape" + shape);
754 }
755
756 // create solid and set it to fVTE
757 G4bool hasNegPars;
758 G4bool deferred;
759 G4bool okAxis[3];
760 G4VSolid* solid
761 = G3toG4MakeSolid(fVTE->GetName(), shape, Rpar, npar, hasNegPars, deferred, okAxis);
762
763 if (hasNegPars) {
764 G4String err_message = "CreateSolid VTE " + fVTE->GetName()
765 + " has negative parameters.";
766 G4Exception("G3Division::CreateSolid()", "G3toG40006",
767 FatalException, err_message);
768 return;
769 }
770
771 // update vte
772 fVTE->SetSolid(solid);
773 fVTE->SetNRpar(npar, Rpar);
774 fVTE->SetHasNegPars(hasNegPars);
775
776 // verbose
777 // G4cout << "G3Division::CreateSolid volume after: "
778 // << fVTE->GetName() << " " << shape << G4endl;
779 // G4cout << " npar,Rpar: " << npar;
780 // for (G4int iii = 0; iii < npar; ++iii) G4cout << " " << Rpar[iii];
781 // G4cout << G4endl;
782 delete [] Rpar;
783}
G4VSolid * G3toG4MakeSolid(const G4String &vname, const G4String &shape, const G4double *Rpar, const G4int npar, G4bool &NegVolPars, G4bool &Deferred, G4bool *OKAxis)
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
bool G4bool
Definition: G4Types.hh:86
void SetNRpar(G4int npar, G4double *Rpar)
void SetSolid(G4VSolid *solid)

References cm, deg, Exception(), FatalException, fIAxis, fOffset, fVTE, fWidth, G3toG4MakeSolid(), G4Exception(), G3VolTableEntry::GetName(), Rpar, G3VolTableEntry::SetHasNegPars(), G3VolTableEntry::SetNRpar(), and G3VolTableEntry::SetSolid().

Referenced by Dvn(), Dvn2(), Dvt(), and Dvt2().

◆ Dvn()

G3VolTableEntry * G3Division::Dvn ( )
private

Definition at line 786 of file G3Division.cc.

787{
788 // no envelope need to be created
789
790 // get parameters from mother
791 G4String shape = fMVTE->GetShape();
793 G4int npar = fMVTE->GetNpar();
794
795 // set width for replica and create solid
797 CreateSolid(shape, Rpar, npar);
798
799 return 0;
800}
void CreateSolid(G4String shape, G4double par[], G4int npar)
Definition: G3Division.cc:614
G4double * GetRpar()

References CreateSolid(), fHighRange, fLowRange, fMVTE, fNofDivisions, fWidth, G3VolTableEntry::GetNpar(), G3VolTableEntry::GetRpar(), G3VolTableEntry::GetShape(), and Rpar.

Referenced by UpdateVTE().

◆ Dvn2()

G3VolTableEntry * G3Division::Dvn2 ( )
private

Definition at line 802 of file G3Division.cc.

803{
804 // to be defined as const of this class
805 G4double Rmin = 0.0001*cm;
806
807 G4String shape = fMVTE->GetShape();
809 G4int npar = fMVTE->GetNpar();
810
811 G4double c0 = fC0;
812 if (fAxis == kPhi) c0 = c0*deg;
813 else c0 = c0*cm;
814
815 // create envelope (if needed)
816 G3VolTableEntry* envVTE = 0;
817 if( std::abs(c0 - fLowRange) > Rmin) {
818 envVTE = CreateEnvelope(shape, fHighRange, c0, Rpar, npar);
819 Rpar = envVTE->GetRpar();
820 npar = envVTE->GetNpar();
821 }
822
823 // set width for replica and create solid
825 CreateSolid(shape, Rpar, npar);
826
827 return envVTE;
828}
G3VolTableEntry * CreateEnvelope(G4String shape, G4double hi, G4double lo, G4double par[], G4int npar)
Definition: G3Division.cc:437
@ kPhi
Definition: geomdefs.hh:60

References cm, CreateEnvelope(), CreateSolid(), deg, fAxis, fC0, fHighRange, fLowRange, fMVTE, fNofDivisions, fWidth, G3VolTableEntry::GetNpar(), G3VolTableEntry::GetRpar(), G3VolTableEntry::GetShape(), kPhi, and Rpar.

Referenced by UpdateVTE().

◆ Dvt()

G3VolTableEntry * G3Division::Dvt ( )
private

Definition at line 830 of file G3Division.cc.

831{
832 // to be defined as const of this class
833 G4double Rmin = 0.0001*cm;
834
835 // get parameters from mother
836 G4String shape = fMVTE->GetShape();
838 G4int npar = fMVTE->GetNpar();
839
840 // calculate the number of divisions
841 G4int ndvmx = fNofDivisions;
842 G4double step = fStep;
843
844 if (fAxis == kPhi) step = step*deg;
845 else step = step*cm;
846
847 G4int ndiv = G4int((fHighRange - fLowRange + Rmin)/step);
848 // to be added warning
849 if (ndvmx > 255) ndvmx = 255;
850 if (ndiv > ndvmx && ndvmx > 0 ) ndiv = ndvmx;
851
852 // create envVTE (if needed)
853 G3VolTableEntry* envVTE = 0;
854 G4double delta = std::abs((fHighRange - fLowRange) - ndiv*step);
855 if (delta > Rmin) {
856 envVTE
857 = CreateEnvelope(shape, fHighRange-delta/2., fLowRange+delta/2.,
858 Rpar, npar);
859 Rpar = envVTE->GetRpar();
860 npar = envVTE->GetNpar();
861 }
862
863 // set width for replica and create solid
864 fWidth = step;
865 fNofDivisions = ndiv;
866 CreateSolid(shape, Rpar, npar);
867
868 return envVTE;
869}

References cm, CreateEnvelope(), CreateSolid(), deg, fAxis, fHighRange, fLowRange, fMVTE, fNofDivisions, fStep, fWidth, G3VolTableEntry::GetNpar(), G3VolTableEntry::GetRpar(), G3VolTableEntry::GetShape(), kPhi, and Rpar.

Referenced by UpdateVTE().

◆ Dvt2()

G3VolTableEntry * G3Division::Dvt2 ( )
private

Definition at line 871 of file G3Division.cc.

872{
873 // to be defined as const of this class
874 G4double Rmin = 0.0001*cm;
875
876 // get parameters from mother
877 G4String shape = fMVTE->GetShape();
879 G4int npar = fMVTE->GetNpar();
880
881 // calculate the number of divisions
882 G4int ndvmx = fNofDivisions;
883 G4double step = fStep;
884 G4double c0 = fC0;
885
886 if(fAxis == kPhi){
887 step = step*deg;
888 c0 = c0*deg;
889 }
890 else {
891 step = step*cm;
892 c0 = c0*cm;
893 }
894
895 G4int ndiv = G4int((fHighRange - c0 + Rmin)/step);
896 // to be added warning
897 if (ndvmx > 255) ndvmx = 255;
898 if (ndiv > ndvmx && ndvmx > 0 ) ndiv = ndvmx;
899
900 // create envelope (if needed)
901 G3VolTableEntry* envVTE = 0;
902 G4double delta = std::abs((fHighRange - c0) - ndiv*step);
903 if (std::abs(c0 - fLowRange) > Rmin) {
904 envVTE
905 = CreateEnvelope(shape, fHighRange-delta/2., c0+delta/2., Rpar, npar);
906 Rpar = envVTE->GetRpar();
907 npar = envVTE->GetNpar();
908 }
909
910 // set with for replica and create solid
911 fWidth = step;
912 fNofDivisions = ndiv;
913 CreateSolid(shape, Rpar, npar);
914
915 return envVTE;
916}

References cm, CreateEnvelope(), CreateSolid(), deg, fAxis, fC0, fHighRange, fLowRange, fMVTE, fNofDivisions, fStep, fWidth, G3VolTableEntry::GetNpar(), G3VolTableEntry::GetRpar(), G3VolTableEntry::GetShape(), kPhi, and Rpar.

Referenced by UpdateVTE().

◆ Exception()

void G3Division::Exception ( G4String  where,
G4String  what 
)
private

Definition at line 180 of file G3Division.cc.

181{
182 G4String err_message = "G3Division::" + where + " for "
183 + what + " is not implemented";
184 G4Exception("G3Division::Exception()", "G3toG40004",
185 FatalException, err_message);
186 return;
187}

References FatalException, and G4Exception().

Referenced by CreateEnvelope(), CreateSolid(), and SetRangeAndAxis().

◆ SetRangeAndAxis()

void G3Division::SetRangeAndAxis ( )
private

Definition at line 189 of file G3Division.cc.

191{
192 G4String shape = fMVTE->GetShape();
194
195 switch (fIAxis) {
196 case 1: fAxis = kXAxis;
197 break;
198 case 2: fAxis = kYAxis;
199 break;
200 case 3: fAxis = kZAxis;
201 break;
202 default: G4Exception("G3Division::SetRangeAndAxis()", "G3toG40005",
203 FatalException, "Wrong axis index definition!");
204 }
205
206 if ( shape == "BOX" ) {
209 }
210 else if ( shape == "TRD1" ) {
211 if (fIAxis == 1){
212 fHighRange = std::max(Rpar[0]*cm, Rpar[1]*cm);
213 }
214 else if( fIAxis == 2) {
215 fHighRange = Rpar[2]*cm;
216 }
217 else if( fIAxis == 3) {
218 fHighRange = Rpar[3]*cm;
219 }
221 }
222 else if ( shape == "TRD2" ) {
223 if (fIAxis == 1){
224 fHighRange = std::max(Rpar[0]*cm, Rpar[1]*cm);
225 }
226 else if( fIAxis == 2) {
227 fHighRange = std::max(Rpar[2]*cm, Rpar[3]*cm);
228 }
229 else if( fIAxis == 3) {
230 fHighRange = Rpar[4]*cm;
231 }
232 }
233 else if ( shape == "TRAP" ) {
234 if ( fIAxis == 3 ) fHighRange = Rpar[0]*cm;
235 else fHighRange = 0.;
237 }
238 else if ( shape == "TUBE" ) {
239 if (fIAxis == 1){
240 fHighRange = Rpar[1]*cm;
241 fLowRange = Rpar[0]*cm;
242 fAxis = kRho;
243 }
244 else if( fIAxis == 2) {
245 fHighRange = 360.*deg;
246 fLowRange = 0.;
247 fAxis = kPhi;
248 }
249 else if( fIAxis == 3) {
250 fHighRange = Rpar[2]*cm;
252 }
253 }
254 else if ( shape == "TUBS" ) {
255 if (fIAxis == 1){
256 fHighRange = Rpar[1]*cm;
257 fLowRange = Rpar[0]*cm;
258 fAxis = kRho;
259 }
260 else if( fIAxis == 2) {
261
262 fLowRange = Rpar[3]*deg;
264 if ( Rpar[4]*deg <= fLowRange )fHighRange = fHighRange + 360.*deg;
266 fAxis = kPhi;
267 }
268 else if( fIAxis == 3) {
269 fHighRange = Rpar[2]*cm;
271 }
272 }
273 else if ( shape == "CONE" ) {
274 if (fIAxis == 1){
275 fHighRange = std::max(Rpar[2]*cm,Rpar[4]*cm);
276 fLowRange = std::max(Rpar[1]*cm,Rpar[3]*cm);
277 fAxis = kRho;
278 }
279 else if( fIAxis == 2) {
280
281 fLowRange = 0.;
282 fHighRange = 360.*deg;
283 fAxis = kPhi;
284 }
285 else if( fIAxis == 3) {
286 fHighRange = Rpar[0]*cm;
288 }
289 }
290 else if ( shape == "CONS" ) {
291 if (fIAxis == 1){
292 fHighRange = std::max(Rpar[2]*cm,Rpar[4]*cm);
293 fLowRange = std::max(Rpar[1]*cm,Rpar[3]*cm);
294 fAxis = kRho;
295 }
296 else if( fIAxis == 2) {
297
298 fLowRange = Rpar[5]*deg;
300 if ( Rpar[6]*deg <= fLowRange )fHighRange = fHighRange + 360.*deg;
302 fAxis = kPhi;
303 }
304 else if( fIAxis == 3) {
305 fHighRange = Rpar[2]*cm;
307 }
308 }
309 else if ( shape == "SPHE" ) {
310 if (fIAxis == 1){
311 fHighRange = Rpar[1]*cm;
312 fLowRange = Rpar[0]*cm;
313 fAxis = kRho;
314 }
315 else if( fIAxis == 2) {
318 fAxis = kPhi;
319 }
320 else if( fIAxis == 3) {
323 fAxis = kPhi; // ??????
324 }
325 }
326 else if ( shape == "PARA" ) {
329 }
330 else if ( shape == "PGON" ) {
331 G4int i;
332 G4int nz = G4int(Rpar[3]);
333
334 G4double pPhi1 = Rpar[0]*deg;
335 G4double dPhi = Rpar[1]*deg;
336
337 G4double *DzArray = new G4double[nz];
338 G4double *Rmax = new G4double[nz];
339 G4double *Rmin = new G4double[nz];
340 G4double rangehi[3], rangelo[3];
341 rangehi[0] = -kInfinity ;
342 rangelo[0] = kInfinity ;
343 rangehi[2] = -kInfinity ;
344 rangelo[2] = kInfinity ;
345
346 for(i=0; i<nz; i++)
347 {
348 G4int i4=3*i+4;
349 G4int i5=i4+1;
350 G4int i6=i4+2;
351
352 DzArray[i] = Rpar[i4]*cm;
353 Rmin[i] = Rpar[i5]*cm;
354 Rmax[i] = Rpar[i6]*cm;
355 rangelo[0] = std::min(rangelo[0], Rmin[i]);
356 rangehi[0] = std::max(rangehi[0], Rmax[i]);
357 rangelo[2] = std::min(rangelo[2], DzArray[i]);
358 rangehi[2] = std::max(rangehi[2], DzArray[i]);
359 }
360 for (i=0;i<nz;i++){
361 assert(Rmin[i]>=0 && Rmax[i]>=Rmin[i]);
362 }
363 rangehi[1] = pPhi1 + dPhi;
364 rangelo[1] = pPhi1;
365 fHighRange = rangehi[fIAxis-1];
366 fLowRange = rangelo[fIAxis-1];
367 if (fIAxis == 1)fAxis = kRho;
368 else if (fIAxis == 2)fAxis = kPhi;
369 else if (fIAxis == 3)fAxis = kZAxis;
370
371 delete [] DzArray;
372 delete [] Rmin;
373 delete [] Rmax;
374
375 }
376 else if ( shape == "PCON" ) {
377
378 G4int i;
379 G4double pPhi1 = Rpar[0]*deg;
380 G4double dPhi = Rpar[1]*deg;
381 G4int nz = G4int(Rpar[2]);
382
383 G4double *DzArray = new G4double[nz];
384 G4double *Rmax = new G4double[nz];
385 G4double *Rmin = new G4double[nz];
386 G4double rangehi[3],rangelo[3];
387
388 rangehi[0] = -kInfinity ;
389 rangelo[0] = kInfinity ;
390 rangehi[2] = -kInfinity ;
391 rangelo[2] = kInfinity ;
392
393 for(i=0; i<nz; i++){
394 G4int i4=3*i+3;
395 G4int i5=i4+1;
396 G4int i6=i4+2;
397
398 DzArray[i] = Rpar[i4]*cm;
399 Rmin[i] = Rpar[i5]*cm;
400 Rmax[i] = Rpar[i6]*cm;
401 rangelo[0] = std::min(rangelo[0], Rmin[i]);
402 rangehi[0] = std::max(rangehi[0], Rmax[i]);
403 rangelo[2] = std::min(rangelo[2], DzArray[i]);
404 rangehi[2] = std::max(rangehi[2], DzArray[i]);
405 }
406 for (i=0;i<nz;i++){
407 assert(Rmin[i]>=0 && Rmax[i]>=Rmin[i]);
408 }
409 rangehi[1] = pPhi1 + dPhi;
410 rangelo[1] = pPhi1;
411 fHighRange = rangehi[fIAxis-1];
412 fLowRange = rangelo[fIAxis-1];
413 if (fIAxis == 1)fAxis = kRho;
414 else if (fIAxis == 2)fAxis = kPhi;
415 else if (fIAxis == 3)fAxis = kZAxis;
416
417
418 delete [] DzArray;
419 delete [] Rmin;
420 delete [] Rmax;
421 }
422 else if ( shape == "ELTU" || shape == "HYPE" || shape == "GTRA" ||
423 shape == "CTUB") {
424 Exception("SetRangeAndAxis", shape);
425 }
426 else {
427 Exception("SetRangeAndAxis", "Unknown shape" + shape);
428 }
429
430 // verbose
431 #ifdef G3G4DEBUG
432 G4cout << "Shape " << shape << " SetRangeAndAxis: "
433 << fLowRange << " " << fHighRange << " " << fAxis << G4endl;
434 #endif
435}
@ kYAxis
Definition: geomdefs.hh:56
@ kZAxis
Definition: geomdefs.hh:57
@ kRho
Definition: geomdefs.hh:58
static const G4double kInfinity
Definition: geomdefs.hh:41
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments

References cm, deg, Exception(), FatalException, fAxis, fHighRange, fIAxis, fLowRange, fMVTE, G4cout, G4endl, G4Exception(), G3VolTableEntry::GetRpar(), G3VolTableEntry::GetShape(), kInfinity, kPhi, kRho, kXAxis, kYAxis, kZAxis, G4INCL::Math::max(), G4INCL::Math::min(), and Rpar.

Referenced by UpdateVTE().

◆ UpdateVTE()

void G3Division::UpdateVTE ( )

Definition at line 96 of file G3Division.cc.

97{
98 if (fVTE->HasNegPars() && !(fMVTE->HasNegPars())) {
99
100 // set nmed from mother
101 if (fNmed == 0) fNmed = fMVTE->GetNmed();
103
105
106 // create envelope (if necessary)
107 // and solid
108 G3VolTableEntry* envVTE = 0;
109 if (fType == kDvn) envVTE = Dvn();
110 else if (fType == kDvn2) envVTE = Dvn2();
111 else if (fType == kDvt) envVTE = Dvt();
112 else if (fType == kDvt2) envVTE = Dvt2();
113
114 if (envVTE) {
115 // reset mother <-> daughter
116 fMVTE->ReplaceDaughter(fVTE, envVTE);
117 fVTE->ReplaceMother(fMVTE, envVTE);
118 envVTE->AddDaughter(fVTE);
119 envVTE->AddMother(fMVTE);
120
121 // replace mother with envelope
122 fMVTE = envVTE;
123 }
124 }
125}
@ kDvt
Definition: G3Division.hh:52
@ kDvt2
Definition: G3Division.hh:52
@ kDvn2
Definition: G3Division.hh:52
@ kDvn
Definition: G3Division.hh:52
G3VolTableEntry * Dvt()
Definition: G3Division.cc:830
G3VolTableEntry * Dvn2()
Definition: G3Division.cc:802
G3VolTableEntry * Dvt2()
Definition: G3Division.cc:871
void SetRangeAndAxis()
Definition: G3Division.cc:189
G3VolTableEntry * Dvn()
Definition: G3Division.cc:786
void AddMother(G3VolTableEntry *aDaughter)
void SetNmed(G4int nmed)
void ReplaceDaughter(G3VolTableEntry *vteOld, G3VolTableEntry *vteNew)
void ReplaceMother(G3VolTableEntry *vteOld, G3VolTableEntry *vteNew)
void AddDaughter(G3VolTableEntry *aDaughter)

References G3VolTableEntry::AddDaughter(), G3VolTableEntry::AddMother(), Dvn(), Dvn2(), Dvt(), Dvt2(), fMVTE, fNmed, fType, fVTE, G3VolTableEntry::GetNmed(), G3VolTableEntry::HasNegPars(), kDvn, kDvn2, kDvt, kDvt2, G3VolTableEntry::ReplaceDaughter(), G3VolTableEntry::ReplaceMother(), G3VolTableEntry::SetNmed(), and SetRangeAndAxis().

Referenced by G4CloneDaughters(), G4CreateCloneVTEWithDivision(), and G4ProcessDaughters().

Field Documentation

◆ fAxis

EAxis G3Division::fAxis
private

Definition at line 95 of file G3Division.hh.

Referenced by CreatePVReplica(), Dvn2(), Dvt(), Dvt2(), G3Division(), and SetRangeAndAxis().

◆ fC0

G4double G3Division::fC0
private

Definition at line 89 of file G3Division.hh.

Referenced by Dvn2(), Dvt2(), and G3Division().

◆ fHighRange

G4double G3Division::fHighRange
private

Definition at line 92 of file G3Division.hh.

Referenced by Dvn(), Dvn2(), Dvt(), Dvt2(), G3Division(), and SetRangeAndAxis().

◆ fIAxis

G4int G3Division::fIAxis
private

◆ fLowRange

G4double G3Division::fLowRange
private

Definition at line 91 of file G3Division.hh.

Referenced by CreatePVReplica(), Dvn(), Dvn2(), Dvt(), Dvt2(), G3Division(), and SetRangeAndAxis().

◆ fMVTE

G3VolTableEntry* G3Division::fMVTE
private

◆ fNmed

G4int G3Division::fNmed
private

Definition at line 88 of file G3Division.hh.

Referenced by CreateEnvelope(), G3Division(), and UpdateVTE().

◆ fNofDivisions

G4int G3Division::fNofDivisions
private

Definition at line 86 of file G3Division.hh.

Referenced by CreatePVReplica(), Dvn(), Dvn2(), Dvt(), Dvt2(), and G3Division().

◆ fOffset

G4double G3Division::fOffset
private

Definition at line 94 of file G3Division.hh.

Referenced by CreatePVReplica(), CreateSolid(), and G3Division().

◆ fStep

G4double G3Division::fStep
private

Definition at line 90 of file G3Division.hh.

Referenced by Dvt(), Dvt2(), and G3Division().

◆ fType

G3DivType G3Division::fType
private

Definition at line 83 of file G3Division.hh.

Referenced by G3Division(), and UpdateVTE().

◆ fVTE

G3VolTableEntry* G3Division::fVTE
private

Definition at line 84 of file G3Division.hh.

Referenced by CreateEnvelope(), CreatePVReplica(), CreateSolid(), G3Division(), and UpdateVTE().

◆ fWidth

G4double G3Division::fWidth
private

Definition at line 93 of file G3Division.hh.

Referenced by CreatePVReplica(), CreateSolid(), Dvn(), Dvn2(), Dvt(), Dvt2(), and G3Division().


The documentation for this class was generated from the following files: