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>
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
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.