4 #include "G4UnitsTable.hh"
6 #include "G4IntersectionSolid.hh"
7 #include "G4UnionSolid.hh"
9 #include "G4Material.hh"
10 #include "G4MaterialTable.hh"
12 #include "G4Sphere.hh"
13 #include "G4Polyhedra.hh"
14 #include "G4BREPSolidPolyhedra.hh"
15 #include "G4LogicalVolume.hh"
16 #include "G4PVPlacement.hh"
17 #include "G4ThreeVector.hh"
18 #include "G4VisAttributes.hh"
37 using namespace TelescopeSimulatorLX ;
70 G4Exception(
"Error in FDsimG4MirrorSegment constructor: G4Material of MirrorSegment not specified !!!");
77 G4cerr <<
" ================================================================ " << G4endl ;
78 G4cerr <<
" = MirrorSegment parameters " << G4endl ;
79 G4cerr <<
" = " << G4endl ;
80 G4cerr <<
" = Mirror type : " <<
fMirrorType << G4endl;
81 G4cerr <<
" = " << G4endl ;
83 G4cerr <<
" = Thickness : " <<
fThickness/
mm <<
" (mm) " << G4endl ;
84 G4cerr <<
" = " << G4endl ;
85 G4cerr <<
" = Mirror Material : " <<
fMirrorMaterial->GetName() << G4endl ;
86 G4cerr <<
" = " << G4endl ;
87 G4cerr <<
" ================================================================ " << G4endl ;
104 const G4int NTRDMAX = 10 ;
106 G4Trd *trd_solid[NTRDMAX] ;
108 G4double dyTop[NTRDMAX] ;
109 G4double dyBot[NTRDMAX] ;
110 G4double dz[NTRDMAX] ;
114 for (G4int iTrd = 0 ; iTrd <
fNumTrapez ; iTrd++){
116 dyBot[iTrd] = fxCorner[iTrd+1] - fxCorner[
fNumCorners-1-(iTrd+1)] ;
119 G4double dx = dzTrap;
122 new G4Trd(
"Trapezoid",dx/2.0,dx/2.0,dyBot[iTrd]/2.0,dyTop[iTrd]/2.0,dz[iTrd]/2.0) ;
124 trd_solid[iTrd] = trdsolid ;
127 G4UnionSolid * trd_union[10] ;
129 G4int iTrdCenter = fNumTrapez - int(fNumTrapez/2.0) - 1 ;
131 const G4double TOLERANCE = 0.05*
mm;
132 G4ThreeVector translation(0.,0.,0.);
134 G4double zTrans = -(dz[iTrdCenter] + dz[iTrdCenter+1])/2.0 ;
135 translation = translation + G4ThreeVector(0.,0.,zTrans+TOLERANCE) ;
139 new G4UnionSolid(
"Union",trd_solid[iTrdCenter],trd_solid[iTrdCenter+1],0,translation) ;
141 for (G4int iTrd = iTrdCenter + 2 ; iTrd <
fNumTrapez ; iTrd++){
142 G4double zTrans = -(dz[iTrd-1] + dz[iTrd])/2.0 ;
143 translation = translation + G4ThreeVector(0.,0.,zTrans+TOLERANCE) ;
147 new G4UnionSolid(
"Union",trd_union[nUnion-1],trd_solid[iTrd],0,translation) ;
150 translation = G4ThreeVector(0.,0.,0.) ;
151 for (G4int iTrd = iTrdCenter ; iTrd > 0 ; iTrd--) {
152 G4double zTrans = (dz[iTrd-1] + dz[iTrd])/2.0 ;
153 translation = translation + G4ThreeVector(0.,0.,zTrans+TOLERANCE) ;
157 new G4UnionSolid(
"Union",trd_union[nUnion-1],trd_solid[iTrd-1],0,translation) ;
165 new G4Sphere(
"sphere",innerRadius,outerRadius,0.0, 2.0*pi, 0., pi) ;
168 G4IntersectionSolid *mirrorSegment_solid =
169 new G4IntersectionSolid(
"mirrorSegment_tmp",trd_union[nUnion],sphere,0,xTranslation) ;
173 new G4LogicalVolume(mirrorSegment_solid,
fMirrorMaterial,
"MirrorSegment",0,0,0);
175 G4VisAttributes* VisAtt =
new G4VisAttributes(
gray);
176 VisAtt->SetForceWireframe(
false) ;
184 G4double xCty1[] = { 5.9*
mm, 264.6*
mm, 268.80*
mm, 270.45*
mm, 264.6*
mm, 5.9*
mm,
185 -5.9*
mm, -264.6*
mm, -270.45*
mm, -268.80*
mm, -264.6*
mm, -5.9*
mm} ;
186 G4double yCty1[] = { 308.95*
mm, 159.6*
mm, 152.4*
mm, -149.4*
mm, -159.6*
mm, -308.95*
mm,
187 -308.95*
mm, -159.6*
mm, -149.4*
mm, 152.4*
mm, 159.6*
mm, 308.95*
mm} ;
189 G4double xCty2[] = {5.9*
mm, 261.8*
mm, 267.0*
mm, 5.75*
mm,
190 -5.75*
mm, -267.0*
mm, -261.8*
mm, -5.9*
mm} ;
191 G4double yCty2[] = {308.95*
mm, 161.2*
mm, -154.2*
mm, -308.95*
mm,
192 -308.95*
mm, -154.2*
mm, 161.2*
mm, 308.95*
mm} ;
194 G4double xCty3[] = {5.9*
mm, 249.6*
mm, 258.4*
mm, 5.6*
mm,
195 -5.6*
mm, -258.4*
mm, -249.6*
mm, -5.9*
mm} ;
196 G4double yCty3[] = {308.95*
mm, 168.4*
mm, -155.5*
mm, -308.95*
mm,
197 -308.95*
mm, -155.5*
mm, 168.4*
mm, 308.95*
mm} ;
199 G4double xCty4[] = {5.9*
mm, 232.0*
mm, 244.8*
mm, 5.45*
mm,
200 -5.45*
mm, -244.8*
mm, -232.0*
mm, -5.9*
mm} ;
201 G4double yCty4[] = {308.95*
mm, 178.5*
mm, -160.3*
mm, -308.95*
mm,
202 -308.95*
mm, -160.3*
mm, 178.5*
mm, 308.95*
mm} ;
210 G4double xCty11[] = { 303.0*
mm, 308.0*
mm, 313.0*
mm, 308.0*
mm,
211 -308.0*
mm,-313.0*
mm,-308.0*
mm,-303.0*
mm} ;
212 G4double yCty11[] = { 313.0*
mm, 308.0*
mm,-308.0*
mm,-313.0*
mm,
213 -313.0*
mm,-308.0*
mm, 308.0*
mm, 313.0*
mm} ;
215 G4double xCty12[] = { 287.0*
mm, 292.0*
mm, 308.0*
mm, 303.0*
mm,
216 -303.0*
mm,-308.0*
mm,-292.0*
mm,-287.0*
mm} ;
217 G4double yCty12[] = { 313.0*
mm, 308.0*
mm,-308.0*
mm,-313.0*
mm,
218 -313.0*
mm,-308.0*
mm, 308.0*
mm, 313.0*
mm} ;
220 G4double xCty13[] = { 261.0*
mm, 266.0*
mm, 292.0*
mm, 287.0*
mm,
221 -287.0*
mm,-292.0*
mm,-266.0*
mm,-261.0*
mm} ;
222 G4double yCty13[] = { 313.0*
mm, 308.0*
mm,-308.0*
mm,-313.0*
mm,
223 -313.0*
mm,-308.0*
mm, 308.0*
mm, 313.0*
mm} ;
232 for (G4int iCorner = 0 ; iCorner <
fNumCorners ; iCorner++){
233 fxCorner[iCorner] = xCty1[iCorner] ;
234 fyCorner[iCorner] = yCty1[iCorner] ;
243 for (G4int iCorner = 0 ; iCorner <
fNumCorners ; iCorner++){
244 fxCorner[iCorner] = xCty2[iCorner] ;
245 fyCorner[iCorner] = yCty2[iCorner] ;
254 for (G4int iCorner = 0 ; iCorner <
fNumCorners ; iCorner++){
255 fxCorner[iCorner] = xCty3[iCorner] ;
256 fyCorner[iCorner] = yCty3[iCorner] ;
265 for (G4int iCorner = 0 ; iCorner <
fNumCorners ; iCorner++){
266 fxCorner[iCorner] = xCty4[iCorner] ;
267 fyCorner[iCorner] = yCty4[iCorner] ;
277 for (G4int iCorner = 0 ; iCorner <
fNumCorners ; iCorner++){
278 fxCorner[iCorner] = xCty11[iCorner] ;
279 fyCorner[iCorner] = yCty11[iCorner] ;
288 for (G4int iCorner = 0 ; iCorner <
fNumCorners ; iCorner++){
289 fxCorner[iCorner] = xCty12[iCorner] ;
290 fyCorner[iCorner] = yCty12[iCorner] ;
299 for (G4int iCorner = 0 ; iCorner <
fNumCorners ; iCorner++){
300 fxCorner[iCorner] = xCty13[iCorner] ;
301 fyCorner[iCorner] = yCty13[iCorner] ;
305 G4Exception(
"Error in FDsimG4MirrorSegment::SetGeometry : Unknown mirror type" );
G4LogicalVolume * fMirrorSegment_log
static const G4Colour gray(0.5, 0.5, 0.5)
FDsimG4MirrorSegment(G4int type, G4double radiusCurvature, G4String MirrorMat="MirrorPlastic", G4double thick=5.0 *mm)
G4double fRadiusOfCurvature
G4Material * fMirrorMaterial