9 #include <beast/ph1bpipe/geometry/Ph1bpipeCreator.h>
10 #include <beast/ph1bpipe/simulation/SensitiveDetector.h>
12 #include <geometry/Materials.h>
13 #include <geometry/CreatorFactory.h>
14 #include <framework/gearbox/GearDir.h>
17 #include <boost/format.hpp>
18 #include <boost/foreach.hpp>
19 #include <boost/algorithm/string.hpp>
21 #include <G4LogicalVolume.hh>
22 #include <G4PVPlacement.hh>
23 #include <G4VisAttributes.hh>
27 #include <G4EllipticalTube.hh>
28 #include "G4UnionSolid.hh"
29 #include "G4SubtractionSolid.hh"
30 #include "G4IntersectionSolid.hh"
31 #include <G4UserLimits.hh>
36 using namespace boost;
51 Ph1bpipeCreator::Ph1bpipeCreator(): m_sensitive(0)
56 Ph1bpipeCreator::~Ph1bpipeCreator()
58 if (m_sensitive)
delete m_sensitive;
67 double pillar_height = 61.9 * CLHEP::cm / 2.;
68 double pillar_length = 3. * CLHEP::cm;
69 double pillar_width = pillar_length;
70 G4VSolid* s_bppillar =
new G4Box(
"s_bppillar", pillar_length, pillar_height, pillar_width);
72 G4VisAttributes* white =
new G4VisAttributes(G4Colour(1, 1, 1));
73 white->SetForceAuxEdgeVisible(
true);
74 l_bppillar->SetVisAttributes(white);
75 double y_offset = -76. * CLHEP::cm + pillar_height;
76 G4ThreeVector Pillarpos = G4ThreeVector(0, y_offset, -154.0 * CLHEP::cm);
77 new G4PVPlacement(0, Pillarpos, l_bppillar,
"p_bppilar1", &topVolume,
false, 1);
78 Pillarpos = G4ThreeVector(0, y_offset, 154.0 * CLHEP::cm);
79 new G4PVPlacement(0, Pillarpos, l_bppillar,
"p_bppilar2", &topVolume,
false, 1);
80 Pillarpos = G4ThreeVector(11.4175236299 * CLHEP::cm, y_offset, -227.758203051 * CLHEP::cm);
81 new G4PVPlacement(0, Pillarpos, l_bppillar,
"p_bppilar3", &topVolume,
false, 1);
82 Pillarpos = G4ThreeVector(-10.4976636985 * CLHEP::cm, y_offset, 227.758203051 * CLHEP::cm);
83 new G4PVPlacement(0, Pillarpos, l_bppillar,
"p_bppilar4", &topVolume,
false, 1);
84 Pillarpos = G4ThreeVector(-8.71250756316 * CLHEP::cm, y_offset, -209.819190072 * CLHEP::cm);
85 new G4PVPlacement(0, Pillarpos, l_bppillar,
"p_bppilar5", &topVolume,
false, 1);
86 Pillarpos = G4ThreeVector(8.71248973173 * CLHEP::cm, y_offset, 209.819190072 * CLHEP::cm);
87 new G4PVPlacement(0, Pillarpos, l_bppillar,
"p_bppilar6", &topVolume,
false, 1);
90 double x_reih = 2. * CLHEP::cm / 2.;
91 double y_reih = 2.3 * CLHEP::cm / 2.;
92 double z_reih = 48. * CLHEP::cm / 2.;
93 G4VSolid* s_reih =
new G4Box(
"s_reih", x_reih, y_reih, z_reih);
95 l_reih->SetVisAttributes(white);
96 G4ThreeVector Reihpos = G4ThreeVector(72.8780869619 * CLHEP::mm, 0, 1.35841468498 * CLHEP::mm);
97 new G4PVPlacement(0, Reihpos, l_reih,
"p_Reih1", &topVolume,
false, 1);
98 Reihpos = G4ThreeVector(-72.8780869619 * CLHEP::mm, 0, 1.35841468498 * CLHEP::mm);
99 new G4PVPlacement(0, Reihpos, l_reih,
"p_Reih2", &topVolume,
false, 1);
101 double x_reiv = 2. * CLHEP::cm / 2.;
102 double y_reiv = 5.2 * CLHEP::cm / 2.;
103 double z_reiv = 140. * CLHEP::cm / 2.;
104 G4VSolid* s_reiv =
new G4Box(
"s_reiv", x_reiv, y_reiv, z_reiv);
106 l_reiv->SetVisAttributes(white);
108 G4ThreeVector Reivpos = G4ThreeVector(0, -83.0 * CLHEP::mm, 0);
109 new G4PVPlacement(0, Reivpos, l_reiv,
"p_Reiv1", &topVolume,
false, 1);
111 Reivpos = G4ThreeVector(0, 83.0 * CLHEP::mm, 0);
112 new G4PVPlacement(0, Reivpos, l_reiv,
"p_Reiv2", &topVolume,
false, 1);
123 double stepSize = content.getLength(
"stepSize", 5 * CLHEP::um);
131 double SafetyLength = 0.1 * CLHEP ::cm;
133 double xpipe_hz1 = content.getLength(
"xpipe_hz1") * CLHEP::cm;
134 double pipe_hz = content.getLength(
"pipe_hz") * CLHEP::cm;
135 double pipe_outerRadius_x = content.getLength(
"pipe_outerRadius_x") * CLHEP::cm;
136 double pipe_outerRadius_y = content.getLength(
"pipe_outerRadius_y") * CLHEP::cm;
137 double pipe_innerRadius_x = content.getLength(
"pipe_innerRadius_x") * CLHEP::cm;
138 double pipe_innerRadius_y = content.getLength(
"pipe_innerRadius_y") * CLHEP::cm;
139 double xpipe_innerRadius = content.getLength(
"xpipe_innerRadius") * CLHEP::cm;
140 double xpipe_outerRadius = content.getLength(
"xpipe_outerRadius") * CLHEP::cm;
141 double pipe_innerRadiusTiN_x = content.getLength(
"pipe_innerRadiusTiN_x") * CLHEP::cm;
142 double pipe_innerRadiusTiN_y = content.getLength(
"pipe_innerRadiusTiN_y") * CLHEP::cm;
143 double xpipe_innerRadiusTiN = content.getLength(
"xpipe_innerRadiusTiN") * CLHEP::cm;
144 double endcap_hz = content.getLength(
"endcap_hz") * CLHEP::cm;
145 double endcap_outerRadius = content.getLength(
"endcap_outerRadius") * CLHEP::cm;
146 double xpipePOS_hz = content.getLength(
"xpipePOS_hz") * CLHEP::cm;
147 double xpipeMIN_hz = content.getLength(
"xpipeMIN_hz") * CLHEP::cm;
150 double startAngle = 0.*CLHEP::deg;
151 double spanningAngle = 360.*CLHEP::deg;
152 double A1 = 0.0415 * CLHEP::rad;
154 double OBtemp =
sqrt(pow(xpipe_hz1, 2) + pow(xpipe_innerRadius / 2., 2));
156 double BCtemp = OBtemp * sin(A1);
158 double ABtemp =
sqrt(pow(pipe_hz, 2) + pow(OBtemp, 2) - 2 * pipe_hz * OBtemp * cos(A1));
160 double A2 = asin(BCtemp / ABtemp) * CLHEP::rad;
162 double xpipe_hz = ABtemp - 2 * endcap_hz / cos(A2);
164 double xcont2 = BCtemp + xpipe_outerRadius;
165 double xcont1 = xpipe_outerRadius + 2 * endcap_hz *
tan(A2);
166 double xcont3 = xcont2 + xpipePOS_hz * sin(A1);
167 double xcont4 = xcont3 - 2 * xpipe_outerRadius;
168 double xcont5 = xcont2 - 2 * xpipe_outerRadius;
169 double xcont3M = xcont2 + xpipeMIN_hz * sin(A1);
170 double xcont4M = xcont3M - 2 * xpipe_outerRadius;
174 double dxtr = 0.5 * (ABtemp + 2 * endcap_hz / cos(A2)) * sin(2 * A2);
175 double dztr = (ABtemp + 2 * endcap_hz / cos(A2)) * sin(A2) * sin(A2);
178 string matPipe = content.getString(
"MaterialPipe");
179 string matTiN = content.getString(
"MaterialTiN");
180 string vacPipe = content.getString(
"MatVacuum");
181 G4double tubinR = 0.0 * CLHEP::cm;
183 G4VSolid* s_PH1BPIPE =
new G4EllipticalTube(
"s_PH1BPIPE",
187 G4LogicalVolume* l_PH1BPIPE =
new G4LogicalVolume(s_PH1BPIPE,
geometry::Materials::get(matPipe),
"l_PH1BPIPE", 0, 0);
189 l_PH1BPIPE->SetUserLimits(
new G4UserLimits(stepSize));
191 G4ThreeVector PH1BPIPEpos = G4ThreeVector(
192 content.getLength(
"x_ph1bpipe") * CLHEP::cm,
193 content.getLength(
"y_ph1bpipe") * CLHEP::cm,
194 content.getLength(
"z_ph1bpipe") * CLHEP::cm
196 new G4PVPlacement(0, PH1BPIPEpos, l_PH1BPIPE,
"p_PH1BPIPE", &topVolume,
false, 0);
198 G4VSolid* s_PH1BPIPETiN =
new G4EllipticalTube(
"s_PH1BPIPETiN",
202 G4LogicalVolume* l_PH1BPIPETiN =
new G4LogicalVolume(s_PH1BPIPETiN,
geometry::Materials::get(matTiN),
"l_PH1BPIPETiN", 0, 0);
203 new G4PVPlacement(0, PH1BPIPEpos, l_PH1BPIPETiN,
"p_PH1BPIPETiN", l_PH1BPIPE,
false, 0);
205 G4VSolid* s_PH1BPIPEV =
new G4EllipticalTube(
"s_PH1BPIPEV",
206 pipe_innerRadiusTiN_x,
207 pipe_innerRadiusTiN_y,
209 G4VSolid* s_PH1BPIPEVac =
new G4IntersectionSolid(
"s_PH1BPIPEVac", s_PH1BPIPE, s_PH1BPIPEV);
210 G4LogicalVolume* l_PH1BPIPEVac =
new G4LogicalVolume(s_PH1BPIPEVac,
geometry::Materials::get(vacPipe),
"l_PH1BPIPEVac", 0, 0);
212 new G4PVPlacement(0, PH1BPIPEpos, l_PH1BPIPEVac,
"p_PH1BPIPEVac", l_PH1BPIPETiN,
false, 0);
215 G4VSolid* s_PH1BPIPEendcap =
new G4Tubs(
"s_PH1BPIPEendcap", 0.,
218 startAngle, spanningAngle);
220 "l_PH1BPIPEendcapTop", 0, 0);
222 "l_PH1BPIPEendcapBot", 0, 0);
224 G4ThreeVector PH1BPIPEendcapposTop = G4ThreeVector(
225 content.getLength(
"x_ph1bpipe") * CLHEP::cm,
226 content.getLength(
"y_ph1bpipe") * CLHEP::cm,
227 content.getLength(
"z_ph1bpipe") * CLHEP::cm + pipe_hz + endcap_hz
230 G4ThreeVector PH1BPIPEendcapposBot = G4ThreeVector(
231 content.getLength(
"x_ph1bpipe") * CLHEP::cm,
232 content.getLength(
"y_ph1bpipe") * CLHEP::cm,
233 content.getLength(
"z_ph1bpipe") * CLHEP::cm - pipe_hz - endcap_hz
235 new G4PVPlacement(0, PH1BPIPEendcapposTop, l_PH1BPIPEendcapTop,
"p_PH1BPIPEendcapTop", &topVolume,
false, 0);
236 new G4PVPlacement(0, PH1BPIPEendcapposBot, l_PH1BPIPEendcapBot,
"p_PH1BPIPEendcapBot", &topVolume,
false, 0);
238 G4VSolid* s_PH1BPIPEendcapTiN =
new G4EllipticalTube(
"s_PH1BPIPEendcapTiN",
242 G4LogicalVolume* l_PH1BPIPEendcapTiNTop =
new G4LogicalVolume(s_PH1BPIPEendcapTiN,
geometry::Materials::get(matTiN),
243 "l_PH1BPIPEendcapTiNTop", 0, 0);
244 G4LogicalVolume* l_PH1BPIPEendcapTiNBot =
new G4LogicalVolume(s_PH1BPIPEendcapTiN,
geometry::Materials::get(matTiN),
245 "l_PH1BPIPEendcapTiNBot", 0, 0);
246 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_PH1BPIPEendcapTiNTop,
"p_PH1BPIPEendcapTiNTop", l_PH1BPIPEendcapTop,
false, 0);
247 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_PH1BPIPEendcapTiNBot,
"p_PH1BPIPEendcapTiNBot", l_PH1BPIPEendcapBot,
false, 0);
249 G4VSolid* s_PH1BPIPEendcapV =
new G4EllipticalTube(
"s_PH1BPIPEendcapV",
250 pipe_innerRadiusTiN_x,
251 pipe_innerRadiusTiN_y,
253 G4VSolid* s_PH1BPIPEendcapVac =
new G4IntersectionSolid(
"s_PH1BPIPEendcapVac", s_PH1BPIPEendcap, s_PH1BPIPEendcapV);
255 "l_PH1BPIPEendcapVac", 0, 0);
257 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_PH1BPIPEendcapVac,
"p_PH1BPIPEendcapVacTop", l_PH1BPIPEendcapTiNTop,
false, 0);
258 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_PH1BPIPEendcapVac,
"p_PH1BPIPEendcapVacBot", l_PH1BPIPEendcapTiNBot,
false, 0);
262 G4VSolid* AluCont_f =
new G4Trd(
"AluCont_f", xcont1, xcont2, xcont1, xcont1, xpipe_hz / 2.0 * cos(A2));
263 G4LogicalVolume* logi_AluCont_f =
new G4LogicalVolume(AluCont_f,
geometry::Materials::get(matPipe),
"logi_AluCont_f", 0, 0);
264 new G4PVPlacement(0, G4ThreeVector(0, 0, pipe_hz + endcap_hz * 2.0 + 0.5 * xpipe_hz * cos(A2)),
265 logi_AluCont_f,
"phys_AluCont_f", &topVolume,
false, 0);
270 G4VSolid* s_Xshapef_11 =
new G4Tubs(
"s_Xshapef_11",
274 startAngle, spanningAngle);
275 G4VSolid* s_Xshapef_12 =
new G4Tubs(
"s_Xshapef_12",
277 xpipe_innerRadius * 2.0,
279 startAngle, spanningAngle);
280 G4VSolid* s_Xshapef_21 =
new G4Tubs(
"s_Xshapef_21",
282 xpipe_innerRadiusTiN,
284 startAngle, spanningAngle);
285 G4VSolid* s_Xshapef_22 =
new G4Tubs(
"s_Xshapef_22",
287 xpipe_innerRadiusTiN * 2.0,
289 startAngle, spanningAngle);
292 G4VSolid* s_XshapefTiN_11 =
new G4Tubs(
"s_XshapefTiN_11",
296 startAngle, spanningAngle);
297 G4VSolid* s_XshapefTiN_12 =
new G4Tubs(
"s_XshapefTiN_12",
299 xpipe_innerRadius * 2.0,
301 startAngle, spanningAngle);
302 G4VSolid* s_XshapefTiN_21 =
new G4Tubs(
"s_XshapefTiN_21",
306 startAngle, spanningAngle);
307 G4VSolid* s_XshapefTiN_22 =
new G4Tubs(
"s_XshapefTiN_22",
309 xpipe_innerRadius * 2.0,
311 startAngle, spanningAngle);
313 G4Transform3D transform_sXshapef_12 = G4Translate3D(0., 0., 0.);
314 transform_sXshapef_12 = transform_sXshapef_12 * G4RotateY3D(-A2);
315 G4IntersectionSolid* Xshapef1 =
new G4IntersectionSolid(
"Xshapef1", s_Xshapef_11, s_Xshapef_12, transform_sXshapef_12);
317 G4Transform3D transform_sXshapef_22 = G4Translate3D(0., 0., 0.);
318 transform_sXshapef_22 = transform_sXshapef_22 * G4RotateY3D(A2);
319 G4IntersectionSolid* Xshapef2 =
new G4IntersectionSolid(
"Xshapef2", s_Xshapef_21, s_Xshapef_22, transform_sXshapef_22);
321 G4Transform3D transform_sXshapefTiN_12 = G4Translate3D(0., 0., 0.);
322 transform_sXshapefTiN_12 = transform_sXshapefTiN_12 * G4RotateY3D(-A2);
323 G4IntersectionSolid* XshapefTiN1 =
new G4IntersectionSolid(
"XshapefTiN1", s_XshapefTiN_11, s_XshapefTiN_12,
324 transform_sXshapefTiN_12);
326 G4Transform3D transform_sXshapefTiN_22 = G4Translate3D(0., 0., 0.);
327 transform_sXshapefTiN_22 = transform_sXshapefTiN_22 * G4RotateY3D(A2);
328 G4IntersectionSolid* XshapefTiN2 =
new G4IntersectionSolid(
"XshapefTiN2", s_XshapefTiN_21, s_XshapefTiN_22,
329 transform_sXshapefTiN_22);
332 G4Transform3D transform_XshapefTiN1 = G4Translate3D(dxtr, 0., -dztr);
333 transform_XshapefTiN1 = transform_XshapefTiN1 * G4RotateY3D(2.*A2);
334 G4UnionSolid* XshapeTiNForwx =
new G4UnionSolid(
"XshapeTiNForwx", XshapefTiN2, XshapefTiN1, transform_XshapefTiN1);
336 G4RotationMatrix* yRot =
new G4RotationMatrix;
338 G4ThreeVector transform_XshapeTiNForwx(-dxtr / 2., 0., 0.);
339 G4IntersectionSolid* XshapeTiNForw =
new G4IntersectionSolid(
"XshapeTiNForw", AluCont_f, XshapeTiNForwx, yRot,
340 transform_XshapeTiNForwx);
341 G4LogicalVolume* l_XshapeTiNForw =
new G4LogicalVolume(XshapeTiNForw,
geometry::Materials::get(matTiN),
"l_XshapeTiNForw", 0, 0);
342 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_XshapeTiNForw,
"p_XshapeTiNForw", logi_AluCont_f,
false, 0);
345 G4Transform3D transform_Xshapef1 = G4Translate3D(dxtr, 0., -dztr);
346 transform_Xshapef1 = transform_Xshapef1 * G4RotateY3D(2.*A2);
347 G4UnionSolid* XshapeForwx =
new G4UnionSolid(
"XshapeForwx", Xshapef2, Xshapef1, transform_Xshapef1);
349 G4Transform3D transform_XshapeForwx = G4Translate3D(-dxtr / 2., 0., 0.);
350 transform_XshapeForwx = transform_XshapeForwx * G4RotateY3D(-A2);
351 G4IntersectionSolid* XshapeForw =
new G4IntersectionSolid(
"XshapeForw", AluCont_f, XshapeForwx, transform_XshapeForwx);
352 G4LogicalVolume* l_XshapeForw =
new G4LogicalVolume(XshapeForw,
geometry::Materials::get(vacPipe),
"l_XshapeForw", 0, 0);
354 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_XshapeForw,
"p_XshapeForw", l_XshapeTiNForw,
false, 0);
358 G4VSolid* AluCont_fpO =
new G4Trd(
"AluCont_fpO", xcont2, xcont3, xcont1, xcont1, xpipePOS_hz / 2.0 * cos(A1));
359 G4VSolid* AluCont_fps =
new G4Trd(
"AluCont_fps", xcont5, xcont4, xcont1, xcont1, xpipePOS_hz / 2.0 * cos(A1));
360 G4Transform3D transform_AluCont_fps = G4Translate3D(0., 0., 0.);
361 G4SubtractionSolid* AluCont_fp =
new G4SubtractionSolid(
"AluCont_fp", AluCont_fpO, AluCont_fps, transform_AluCont_fps);
362 G4LogicalVolume* logi_AluCont_fp =
new G4LogicalVolume(AluCont_fp,
geometry::Materials::get(matPipe),
"logi_AluCont_fp", 0, 0);
363 new G4PVPlacement(0, G4ThreeVector(0, 0, pipe_hz + endcap_hz * 2.0 + xpipe_hz * cos(A2) + xpipePOS_hz / 2.0 * cos(A1)),
364 logi_AluCont_fp,
"phys_AluCont_fp", &topVolume,
false, 0);
367 G4VSolid* s_XshapefPOS_11 =
new G4Tubs(
"s_XshapefPOS11",
371 startAngle, spanningAngle);
372 G4VSolid* s_XshapefPOS_12 =
new G4Tubs(
"s_XshapefPOS12",
374 xpipe_innerRadius * 2,
375 xpipePOS_hz / 2. - 0.7568202457 * SafetyLength,
376 startAngle, spanningAngle);
377 G4Transform3D transform_sXshapefPOS_12 = G4Translate3D(0., 0., 0.);
378 transform_sXshapefPOS_12 = transform_sXshapefPOS_12 * G4RotateY3D(-A1);
379 G4IntersectionSolid* XshapefPOS1 =
new G4IntersectionSolid(
"XshapefPOS1", s_XshapefPOS_11, s_XshapefPOS_12,
380 transform_sXshapefPOS_12);
382 G4LogicalVolume* l_XshapefPOS1 =
new G4LogicalVolume(XshapefPOS1,
geometry::Materials::get(vacPipe),
"l_XshapefPOS1", 0, 0);
384 G4RotationMatrix* yRotP =
new G4RotationMatrix;
386 new G4PVPlacement(yRotP, G4ThreeVector(2 * endcap_hz *
tan(A2) + xpipe_hz * sin(A2) + xpipePOS_hz / 2.*sin(A1), 0., 0.),
387 l_XshapefPOS1,
"p_XshapefPOS1", logi_AluCont_fp,
false, 0);
390 G4VSolid* s_XshapefPOS_21 =
new G4Tubs(
"s_XshapefPOS21",
394 startAngle, spanningAngle);
395 G4VSolid* s_XshapefPOS_22 =
new G4Tubs(
"s_XshapefPOS22",
397 xpipe_innerRadius * 2,
398 xpipePOS_hz / 2. - 0.7568202457 * SafetyLength,
399 startAngle, spanningAngle);
400 G4Transform3D transform_sXshapefPOS_22 = G4Translate3D(0., 0., 0.);
401 transform_sXshapefPOS_22 = transform_sXshapefPOS_22 * G4RotateY3D(A1);
402 G4IntersectionSolid* XshapefPOS2 =
new G4IntersectionSolid(
"XshapefPOS2", s_XshapefPOS_21, s_XshapefPOS_22,
403 transform_sXshapefPOS_22);
405 G4LogicalVolume* l_XshapefPOS2 =
new G4LogicalVolume(XshapefPOS2,
geometry::Materials::get(matTiN),
"l_XshapefPOS2", 0, 0);
406 G4RotationMatrix* yRotM =
new G4RotationMatrix;
408 new G4PVPlacement(yRotM, G4ThreeVector(-(2 * endcap_hz *
tan(A2) + xpipe_hz * sin(A2) + xpipePOS_hz / 2.*sin(A1)), 0., 0.),
409 l_XshapefPOS2,
"p_XshapefPOS2", logi_AluCont_fp,
false, 0);
411 G4VSolid* s_XshapefPOS_31 =
new G4Tubs(
"s_XshapefPOS31",
413 xpipe_innerRadiusTiN,
415 startAngle, spanningAngle);
416 G4VSolid* s_XshapefPOS_32 =
new G4Tubs(
"s_XshapefPOS32",
418 xpipe_innerRadiusTiN * 2,
419 xpipePOS_hz / 2. - 0.7568202457 * SafetyLength,
420 startAngle, spanningAngle);
421 G4Transform3D transform_sXshapefPOS_32 = G4Translate3D(0., 0., 0.);
422 transform_sXshapefPOS_32 = transform_sXshapefPOS_32 * G4RotateY3D(A1);
423 G4IntersectionSolid* XshapefPOS3 =
new G4IntersectionSolid(
"XshapefPOS3", s_XshapefPOS_31, s_XshapefPOS_32,
424 transform_sXshapefPOS_32);
426 G4LogicalVolume* l_XshapefPOS3 =
new G4LogicalVolume(XshapefPOS3,
geometry::Materials::get(vacPipe),
"l_XshapefPOS3", 0, 0);
428 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_XshapefPOS3,
"p_XshapefPOS3", l_XshapefPOS2,
false, 0);
432 G4VSolid* AluCont_b =
new G4Trd(
"AluCont_b", xcont2, xcont1, xcont1, xcont1, xpipe_hz / 2.0 * cos(A2));
433 G4LogicalVolume* logi_AluCont_b =
new G4LogicalVolume(AluCont_b,
geometry::Materials::get(matPipe),
"logi_AluCont_b", 0, 0);
434 new G4PVPlacement(0, G4ThreeVector(0, 0, -pipe_hz - endcap_hz * 2.0 - xpipe_hz * cos(A2) / 2.), logi_AluCont_b,
"phys_AluCont_b",
435 &topVolume,
false, 1);
440 G4VSolid* s_Xshapeb_11 =
new G4Tubs(
"s_Xshapeb_11",
442 xpipe_innerRadiusTiN,
444 startAngle, spanningAngle);
445 G4VSolid* s_Xshapeb_12 =
new G4Tubs(
"s_Xshapeb_12",
447 xpipe_innerRadiusTiN * 2.0,
449 startAngle, spanningAngle);
450 G4VSolid* s_Xshapeb_21 =
new G4Tubs(
"s_Xshapeb_21",
454 startAngle, spanningAngle);
455 G4VSolid* s_Xshapeb_22 =
new G4Tubs(
"s_Xshapeb_22",
457 xpipe_innerRadius * 2.0,
459 startAngle, spanningAngle);
461 G4VSolid* s_XshapebTiN_11 =
new G4Tubs(
"s_XshapebTiN_11",
465 startAngle, spanningAngle);
466 G4VSolid* s_XshapebTiN_12 =
new G4Tubs(
"s_XshapebTiN_12",
468 xpipe_innerRadius * 2.0,
470 startAngle, spanningAngle);
471 G4VSolid* s_XshapebTiN_21 =
new G4Tubs(
"s_XshapebTiN_21",
475 startAngle, spanningAngle);
476 G4VSolid* s_XshapebTiN_22 =
new G4Tubs(
"s_XshapebTiN_22",
478 xpipe_innerRadius * 2.0,
480 startAngle, spanningAngle);
482 G4Transform3D transform_sXshapeb_12 = G4Translate3D(0., 0., 0.);
483 transform_sXshapeb_12 = transform_sXshapeb_12 * G4RotateY3D(A2);
484 G4IntersectionSolid* Xshapeb1 =
new G4IntersectionSolid(
"Xshapeb1", s_Xshapeb_11, s_Xshapeb_12, transform_sXshapeb_12);
486 G4Transform3D transform_sXshapeb_22 = G4Translate3D(0., 0., 0.);
487 transform_sXshapeb_22 = transform_sXshapeb_22 * G4RotateY3D(-A2);
488 G4IntersectionSolid* Xshapeb2 =
new G4IntersectionSolid(
"Xshapeb2", s_Xshapeb_21, s_Xshapeb_22, transform_sXshapeb_22);
490 G4Transform3D transform_sXshapebTiN_12 = G4Translate3D(0., 0., 0.);
491 transform_sXshapebTiN_12 = transform_sXshapebTiN_12 * G4RotateY3D(A2);
492 G4IntersectionSolid* XshapebTiN1 =
new G4IntersectionSolid(
"XshapebTiN1", s_XshapebTiN_11, s_XshapebTiN_12,
493 transform_sXshapebTiN_12);
495 G4Transform3D transform_sXshapebTiN_22 = G4Translate3D(0., 0., 0.);
496 transform_sXshapebTiN_22 = transform_sXshapebTiN_22 * G4RotateY3D(-A2);
497 G4IntersectionSolid* XshapebTiN2 =
new G4IntersectionSolid(
"XshapebTiN2", s_XshapebTiN_21, s_XshapebTiN_22,
498 transform_sXshapebTiN_22);
501 G4Transform3D transform_XshapebTiN1 = G4Translate3D(dxtr, 0., dztr);
503 transform_XshapebTiN1 = transform_XshapebTiN1 * G4RotateY3D(-2.*A2);
504 G4UnionSolid* XshapeTiNBackwx =
new G4UnionSolid(
"XshapeTiNBackwx", XshapebTiN2, XshapebTiN1, transform_XshapebTiN1);
506 G4Transform3D transform_XshapeTiNBackwx = G4Translate3D(-dxtr / 2., 0., 0.);
507 transform_XshapeTiNBackwx = transform_XshapeTiNBackwx * G4RotateY3D(A2);
508 G4IntersectionSolid* XshapeTiNBackw =
new G4IntersectionSolid(
"XshapeTiNBackw", AluCont_b, XshapeTiNBackwx,
509 transform_XshapeTiNBackwx);
510 G4LogicalVolume* l_XshapeTiNBackw =
new G4LogicalVolume(XshapeTiNBackw,
geometry::Materials::get(matTiN),
"l_XshapeTiNBackw", 0,
512 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_XshapeTiNBackw,
"p_XshapeTiNBackw", logi_AluCont_b,
false, 0);
515 G4Transform3D transform_Xshapeb1 = G4Translate3D(dxtr, 0., dztr);
516 transform_Xshapeb1 = transform_Xshapeb1 * G4RotateY3D(-2.*A2);
517 G4UnionSolid* XshapeBackwx =
new G4UnionSolid(
"XshapebBackwx", Xshapeb2, Xshapeb1, transform_Xshapeb1);
518 G4Transform3D transform_XshapeBackwx = G4Translate3D(-dxtr / 2., 0., 0.);
519 transform_XshapeBackwx = transform_XshapeBackwx * G4RotateY3D(A2);
520 G4IntersectionSolid* XshapeBackw =
new G4IntersectionSolid(
"XshapeBackw", AluCont_b, XshapeBackwx, transform_XshapeBackwx);
521 G4LogicalVolume* l_XshapeBackw =
new G4LogicalVolume(XshapeBackw,
geometry::Materials::get(vacPipe),
"l_XshapeBackw", 0, 0);
524 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_XshapeBackw,
"p_XshapeBackw", l_XshapeTiNBackw,
false, 0);
528 G4VSolid* AluCont_bpO =
new G4Trd(
"AluCont_bpO", xcont3M, xcont2, xcont1, xcont1, xpipeMIN_hz / 2.0 * cos(A1));
529 G4VSolid* AluCont_bps =
new G4Trd(
"AluCont_bps", xcont4M, xcont5, xcont1, xcont1, xpipeMIN_hz / 2.0 * cos(A1));
530 G4Transform3D transform_AluCont_bps = G4Translate3D(0., 0., 0.);
531 G4SubtractionSolid* AluCont_bp =
new G4SubtractionSolid(
"AluCont_bp", AluCont_bpO, AluCont_bps, transform_AluCont_bps);
532 G4LogicalVolume* logi_AluCont_bp =
new G4LogicalVolume(AluCont_bp,
geometry::Materials::get(matPipe),
"logi_AluCont_bp", 0, 0);
533 new G4PVPlacement(0, G4ThreeVector(0, 0, -(pipe_hz + endcap_hz * 2.0 + xpipe_hz * cos(A2) + xpipeMIN_hz / 2.0 * cos(A1))),
534 logi_AluCont_bp,
"phys_AluCont_bp", &topVolume,
false, 0);
537 G4VSolid* s_XshapebMIN_11 =
new G4Tubs(
"s_XshapebMIN11",
541 startAngle, spanningAngle);
542 G4VSolid* s_XshapebMIN_12 =
new G4Tubs(
"s_XshapebMIN12",
544 xpipe_innerRadius * 2,
545 xpipeMIN_hz / 2. - 0.525641366 * SafetyLength,
546 startAngle, spanningAngle);
547 G4Transform3D transform_sXshapebMIN_12 = G4Translate3D(0., 0., 0.);
548 transform_sXshapebMIN_12 = transform_sXshapebMIN_12 * G4RotateY3D(-A1);
549 G4IntersectionSolid* XshapebMIN1 =
new G4IntersectionSolid(
"XshapebMIN1", s_XshapebMIN_11, s_XshapebMIN_12,
550 transform_sXshapebMIN_12);
552 G4LogicalVolume* l_XshapebMIN1 =
new G4LogicalVolume(XshapebMIN1,
geometry::Materials::get(vacPipe),
"l_XshapebMIN1", 0, 0);
554 new G4PVPlacement(yRotP, G4ThreeVector(-(2 * endcap_hz *
tan(A2) + xpipe_hz * sin(A2) + xpipeMIN_hz / 2.*sin(A1)), 0., 0.),
555 l_XshapebMIN1,
"p_XshapebMIN1", logi_AluCont_bp,
false, 0);
558 G4VSolid* s_XshapebMIN_21 =
new G4Tubs(
"s_XshapebMIN21",
562 startAngle, spanningAngle);
563 G4VSolid* s_XshapebMIN_22 =
new G4Tubs(
"s_XshapebMIN22",
565 xpipe_innerRadius * 2,
566 xpipeMIN_hz / 2. - 0.525641366 * SafetyLength,
567 startAngle, spanningAngle);
568 G4Transform3D transform_sXshapebMIN_22 = G4Translate3D(0., 0., 0.);
569 transform_sXshapebMIN_22 = transform_sXshapebMIN_22 * G4RotateY3D(A1);
570 G4IntersectionSolid* XshapebMIN2 =
new G4IntersectionSolid(
"XshapebMIN2", s_XshapebMIN_21, s_XshapebMIN_22,
571 transform_sXshapebMIN_22);
573 G4LogicalVolume* l_XshapebMIN2 =
new G4LogicalVolume(XshapebMIN2,
geometry::Materials::get(matTiN),
"l_XshapebMIN2", 0, 0);
574 new G4PVPlacement(yRotM, G4ThreeVector(2 * endcap_hz *
tan(A2) + xpipe_hz * sin(A2) + xpipeMIN_hz / 2.*sin(A1), 0., 0.),
575 l_XshapebMIN2,
"p_XshapebMIN2", logi_AluCont_bp,
false, 0);
577 G4VSolid* s_XshapebMIN_31 =
new G4Tubs(
"s_XshapebMIN31",
579 xpipe_innerRadiusTiN,
581 startAngle, spanningAngle);
582 G4VSolid* s_XshapebMIN_32 =
new G4Tubs(
"s_XshapebMIN32",
584 xpipe_innerRadiusTiN * 2,
585 xpipeMIN_hz / 2. - 0.525641366 * SafetyLength,
586 startAngle, spanningAngle);
587 G4Transform3D transform_sXshapebMIN_32 = G4Translate3D(0., 0., 0.);
588 transform_sXshapebMIN_32 = transform_sXshapebMIN_32 * G4RotateY3D(A1);
589 G4IntersectionSolid* XshapebMIN3 =
new G4IntersectionSolid(
"XshapebMIN3", s_XshapebMIN_31, s_XshapebMIN_32,
590 transform_sXshapebMIN_32);
592 G4LogicalVolume* l_XshapebMIN3 =
new G4LogicalVolume(XshapebMIN3,
geometry::Materials::get(vacPipe),
"l_XshapebMIN3", 0, 0);
594 new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), l_XshapebMIN3,
"p_XshapebMIN3", l_XshapebMIN2,
false, 0);
GearDir is the basic class used for accessing the parameter store.
static G4Material * get(const std::string &name)
Find given material.
Sensitive Detector implementation of the PH1BPIPE detector.
double sqrt(double a)
sqrt for double
double tan(double a)
tan for double
GeometryTypes
Flag indiciating the type of geometry to be used.
geometry::CreatorFactory< Ph1bpipeCreator > Ph1bpipeFactory("PH1BPIPECreator")
Creator creates the phase 1 beam pipe for |s| < 4 m geometry.
Abstract base class for different kinds of events.
Very simple class to provide an easy way to register creators with the CreatorManager.