10#include <ecl/geometry/GeoECLCreator.h>
13#include <ecl/geometry/BelleLathe.h>
14#include <ecl/geometry/BelleCrystal.h>
15#include <ecl/geometry/shapes.h>
18#include <geometry/Materials.h>
21#include <G4AssemblyVolume.hh>
23#include <G4LogicalVolume.hh>
24#include <G4Point3D.hh>
25#include <G4PVPlacement.hh>
26#include <G4PVReplica.hh>
27#include <G4ReflectionFactory.hh>
29#include <G4SubtractionSolid.hh>
31#include <G4TwoVector.hh>
32#include <G4UnionSolid.hh>
33#include <G4Vector3D.hh>
34#include <G4VisAttributes.hh>
46 G4LogicalVolume* top = &_top;
49 const double phi0 = 0;
50 const double dphi = sec ? M_PI / 16 : 2 * M_PI;
52 const bool b_inner_support_ring =
true;
53 const bool b_outer_support_ring =
true;
54 const bool b_support_wall =
true;
55 const bool b_ribs =
true;
56 const bool b_septum_wall =
true;
57 const bool b_crystals =
true;
58 const bool b_preamplifier =
true;
59 const bool b_support_leg =
true;
60 const bool b_support_structure_13 =
true;
61 const bool b_support_structure_15 =
true;
62 bool b_connectors =
true;
64 const bool b_cover =
true;
66 b_connectors &= b_support_structure_15;
67 b_boards &= b_support_structure_15;
72 vector<cplacement_t> bp = load_placements(
m_sap, ECLParts::forward);
73 vector<cplacement_t>::iterator fp = find_if(bp.begin(), bp.end(), [](
const cplacement_t& p) {
74 const int ECL_forward_part = 1000;
75 return p.nshape == ECL_forward_part;
78 G4Transform3D gTrans = (fp == bp.end()) ? G4Translate3D(0, 0, 1960) : get_transform(*fp);
83 double milled_thickness = gTrans.dz() - 1960;
84 if (fp != bp.end()) bp.erase(fp);
86 const double th0 = 13.12, th1 = 32.98;
87 const double ZT = 437, ZI = 434, RI = 431, RIp = 532.2, RC = 1200.4, RT = 1415;
88 const double thinnerPart_translation = 1.95;
90 if (b_inner_support_ring) {
92 zr_t vc1[] = {{ZI - 487, 410 - thinnerPart_translation}, {ZT - (RIp - 410 - 20 / cosd(th0)) / tand(th0), 410 - thinnerPart_translation}, {ZT - (RIp - 410 - 20 / cosd(th0)) / tand(th0), 410}, {ZT, RIp - 20 / cosd(th0)}, {ZT, RIp}, {3., RI}, {3., 418 - thinnerPart_translation}, {ZI - 487, 418 - thinnerPart_translation}};
93 std::vector<zr_t> contour1(vc1, vc1 +
sizeof(vc1) /
sizeof(
zr_t));
94 G4VSolid* part1solid =
new BelleLathe(
"fwd_part1solid", phi0, dphi, contour1);
95 G4LogicalVolume* part1logical =
new G4LogicalVolume(part1solid,
Materials::get(
"SUS304"),
"part1logical", 0, 0, 0);
96 part1logical->SetVisAttributes(
att(
"iron"));
97 new G4PVPlacement(gTrans, part1logical,
"ECL_ForwardSupport_part1physical", top,
false, 0, overlap);
100 if (b_support_wall) {
102 double L = (ZT - 107.24 - 3 - 1.6 * cosd(th1 + 90)) / cosd(th1);
103 double R0 = 418, R1 = RC;
104 zr_t vc23[] = {{0, R0}, {3, R0}, {3, R1}, {3 + L * cosd(th1), R1 + L * sind(th1)},
105 {3 + L * cosd(th1) + 1.6 * cosd(th1 + 90), R1 + L * sind(th1) + 1.6 * sind(th1 + 90)}, {3 + 1.6 * cosd(th1 + 90), R1 + 1.6 * sind(th1 + 90)}, {0, R1}
107 std::vector<zr_t> contour23(vc23, vc23 +
sizeof(vc23) /
sizeof(
zr_t));
108 G4VSolid* part23solid =
new BelleLathe(
"fwd_part23solid", phi0, dphi, contour23);
109 G4LogicalVolume* part23logical =
new G4LogicalVolume(part23solid,
Materials::get(
"A5052"),
"part23logical", 0, 0, 0);
110 part23logical->SetVisAttributes(
att(
"alum"));
111 new G4PVPlacement(gTrans, part23logical,
"ECL_ForwardSupport_part23physical", top,
false, 0, overlap);
114 if (b_outer_support_ring) {
115 zr_t vc4[] = {{3 + (RT - 20 - RC) / tand(th1), RT - 20}, {ZT, RT - 20}, {ZT, RT}, {3 + (RT - RC) / tand(th1), RT}};
116 std::vector<zr_t> contour4(vc4, vc4 +
sizeof(vc4) /
sizeof(
zr_t));
117 G4VSolid* part4solid =
new BelleLathe(
"fwd_part4solid", phi0, dphi, contour4);
118 G4LogicalVolume* part4logical =
new G4LogicalVolume(part4solid,
Materials::get(
"SUS304"),
"part4logical", 0, 0, 0);
119 part4logical->SetVisAttributes(
att(
"iron"));
120 new G4PVPlacement(gTrans, part4logical,
"ECL_ForwardSupport_part4physical", top,
false, 0, overlap);
123 zr_t cont_array_in[] = {{3., RI}, {ZT, RIp}, {ZT, RT - 20}, {3 + (RT - 20 - RC) / tand(th1), RT - 20}, {3, RC}};
124 std::vector<zr_t> contour_in(cont_array_in, cont_array_in +
sizeof(cont_array_in) /
sizeof(
zr_t));
125 G4VSolid* innervolume_solid =
new BelleLathe(
"fwd_innervolume_solid", 0, 2 * M_PI, contour_in);
126 G4LogicalVolume* innervolume_logical =
new G4LogicalVolume(innervolume_solid,
Materials::get(
"G4_AIR"),
127 "innervolume_logical", 0, 0, 0);
128 innervolume_logical->SetVisAttributes(
att(
"air"));
131 G4Region* aRegion =
new G4Region(
"ECLForwardEnvelope");
132 innervolume_logical->SetRegion(aRegion);
133 aRegion->AddRootLogicalVolume(innervolume_logical);
135 new G4PVPlacement(gTrans, innervolume_logical,
"ECLForwardPhysical", top,
false, 0, overlap);
137 G4VSolid* innervolumesector_solid =
new BelleLathe(
"fwd_innervolumesector_solid", -M_PI / 8, M_PI / 4, contour_in);
138 G4LogicalVolume* innervolumesector_logical =
new G4LogicalVolume(innervolumesector_solid,
Materials::get(
"G4_AIR"),
139 "innervolumesector_logical", 0, 0, 0);
140 innervolumesector_logical->SetVisAttributes(
att(
"air"));
141 new G4PVReplica(
"ECLForwardSectorPhysical", innervolumesector_logical, innervolume_logical, kPhi, 8, M_PI / 4, 0);
144 double H = 60, W = 20;
145 double X0 = RIp, X1 = RT - 20;
146 G4TwoVector r0o(X1, 0), r1o(X1 *
sqrt(1 - pow(W / X1, 2)), W);
147 double beta = asin(W / X0);
148 G4TwoVector r0i(X0 / cos(beta / 2), 0), r1i(X0 * cos(beta / 2) - tan(beta / 2) * (W - X0 * sin(beta / 2)), W);
149 double dxymzp = (r0o - r0i).x(), dxypzp = (r1o - r1i).x();
150 double theta =
atan(tand(th0) / 2);
151 double dxymzm = dxymzp + tand(th0) * H, dxypzm = dxypzp + tand(th0) * H;
153 G4TwoVector m0 = (r0i + r0o) * 0.5, m1 = (r1i + r1o) * 0.5, dm = m1 - m0;
154 double alpha =
atan(dm.x() / dm.y());
156 G4VSolid* solid6_p1 =
new G4Trap(
"fwd_solid6_p1", H / 2, theta, 0, W / 2, dxymzm / 2, dxypzm / 2, alpha, W / 2, dxymzp / 2,
159 G4LogicalVolume* lsolid6_p1 =
new G4LogicalVolume(solid6_p1,
Materials::get(
"SUS304"),
"lsolid6", 0, 0, 0);
160 lsolid6_p1->SetVisAttributes(
att(
"iron"));
161 G4Transform3D tsolid6_p1(G4Translate3D(X0 * cos(beta / 2) + (dxymzp / 2 + dxypzp / 2) / 2 - tan(theta)*H / 2, W / 2, ZT - H / 2));
162 new G4PVPlacement(G4RotateZ3D(-M_PI / 8)*tsolid6_p1, lsolid6_p1,
"psolid6_p1", innervolumesector_logical,
false, 0, overlap);
163 new G4PVPlacement(G4RotateZ3D(0)*tsolid6_p1, lsolid6_p1,
"psolid6_p2", innervolumesector_logical,
false, 0, overlap);
166 dxymzm = dxymzp + tand(th0) * H, dxypzm = dxypzp + tand(th0) * H;
167 G4VSolid* solid6_p2 =
new G4Trap(
"fwd_solid6_p2", H / 2, theta, 0, W / 2, dxypzm / 2, dxymzm / 2, -alpha, W / 2, dxypzp / 2,
170 G4LogicalVolume* lsolid6_p2 =
new G4LogicalVolume(solid6_p2,
Materials::get(
"SUS304"),
"lsolid6", 0, 0, 0);
171 lsolid6_p2->SetVisAttributes(
att(
"iron"));
172 G4Transform3D tsolid6_p2(G4Translate3D(X0 * cos(beta / 2) + (dxymzp / 2 + dxypzp / 2) / 2 - tan(theta)*H / 2, -W / 2, ZT - H / 2));
173 new G4PVPlacement(G4RotateZ3D(0)*tsolid6_p2, lsolid6_p2,
"psolid6_p3", innervolumesector_logical,
false, 0, overlap);
174 new G4PVPlacement(G4RotateZ3D(M_PI / 8)*tsolid6_p2, lsolid6_p2,
"psolid6_p4", innervolumesector_logical,
false, 0, overlap);
177 G4VSolid* solid7_p8 =
new G4Box(
"fwd_solid7_p8", hpad / 2, (140. - 40) / 2 / 2, 40. / 2);
178 G4LogicalVolume* lsolid7 =
new G4LogicalVolume(solid7_p8,
Materials::get(
"SUS304"),
"lsolid7", 0, 0, 0);
179 lsolid7->SetVisAttributes(
att(
"iron"));
180 double dx =
sqrt(X1 * X1 - 70 * 70) - hpad / 2;
181 G4Transform3D tsolid7_p1(G4Translate3D(dx, -20 - 25, ZT - 40. / 2));
182 new G4PVPlacement(tsolid7_p1, lsolid7,
"psolid7_p1", innervolumesector_logical,
false, 0, overlap);
183 G4Transform3D tsolid7_p2(G4Translate3D(dx, 20 + 25, ZT - 40. / 2));
184 new G4PVPlacement(tsolid7_p2, lsolid7,
"psolid7_p2", innervolumesector_logical,
false, 0, overlap);
186 double L = X1 - (X0 - tand(th0) * 40) - 10;
187 G4VSolid* solid13 =
new G4Box(
"fwd_solid13", L / 2, 5. / 2, 18. / 2);
188 G4LogicalVolume* lsolid13 =
new G4LogicalVolume(solid13,
Materials::get(
"SUS304"),
"lsolid13", 0, 0, 0);
189 lsolid13->SetVisAttributes(
att(
"iron"));
190 G4Transform3D tsolid13(G4TranslateZ3D(ZT - 60 + 18. / 2)*G4TranslateY3D(-5. / 2 - 0.5 / 2)*G4TranslateX3D(X0 - tand(
191 th0) * 40 + L / 2 + 5));
192 new G4PVPlacement(tsolid13, lsolid13,
"psolid13_p1", innervolumesector_logical,
false, 0, overlap);
193 new G4PVPlacement(G4RotateZ3D(M_PI / 8)*tsolid13, lsolid13,
"psolid13_p2", innervolumesector_logical,
false, 0, overlap);
200 Point_t vin[] = {{ZT - zsep, RIp - tand(th0)* zsep}, {ZT - 60, RIp - tand(th0) * 60}, {ZT - 60, RT - 20 - d}, {ZT - zsep, RT - 20 - d}};
201 const int n =
sizeof(vin) /
sizeof(
Point_t);
202 Point_t c = centerofgravity(vin, vin + n);
203 G4ThreeVector contour_swall[n * 2];
204 for (
int i = 0; i < n; i++) contour_swall[i + 0] = G4ThreeVector(vin[i].x - c.x, vin[i].
y - c.y, -0.5 / 2);
205 for (
int i = 0; i < n; i++) contour_swall[i + n] = G4ThreeVector(vin[i].x - c.x, vin[i].
y - c.y, 0.5 / 2);
207 G4VSolid* septumwall_solid =
new BelleCrystal(
"fwd_septumwall_solid", n, contour_swall);
209 G4LogicalVolume* septumwall_logical =
new G4LogicalVolume(septumwall_solid,
Materials::get(
"A5052"),
210 "septumwall_logical", 0, 0, 0);
211 septumwall_logical->SetVisAttributes(
att(
"alum2"));
212 new G4PVPlacement(G4RotateZ3D(-M_PI / 2)*G4RotateY3D(-M_PI / 2)*G4Translate3D(c.x, c.y, 0), septumwall_logical,
213 "septumwall_physical", innervolumesector_logical,
false, 0, overlap);
215 for (
int i = 0; i < n; i++) contour_swall[i + 0] = G4ThreeVector(vin[i].x - c.x, vin[i].
y - c.y, -0.5 / 2 / 2);
216 for (
int i = 0; i < n; i++) contour_swall[i + n] = G4ThreeVector(vin[i].x - c.x, vin[i].
y - c.y, 0.5 / 2 / 2);
218 G4VSolid* septumwall2_solid =
new BelleCrystal(
"fwd_septumwall2_solid", n, contour_swall);
220 G4LogicalVolume* septumwall2_logical =
new G4LogicalVolume(septumwall2_solid,
Materials::get(
"A5052"),
221 "septumwall2_logical", 0, 0, 0);
222 septumwall2_logical->SetVisAttributes(
att(
"alum2"));
223 new G4PVPlacement(G4RotateZ3D(-M_PI / 8)*G4RotateZ3D(-M_PI / 2)*G4RotateY3D(-M_PI / 2)*G4Translate3D(c.x, c.y, 0.5 / 2 / 2),
224 septumwall2_logical,
"septumwall2_physical", innervolumesector_logical,
false, 0, overlap);
225 new G4PVPlacement(G4RotateZ3D(M_PI / 8)*G4RotateZ3D(-M_PI / 2)*G4RotateY3D(-M_PI / 2)*G4Translate3D(c.x, c.y, -0.5 / 2 / 2),
226 septumwall2_logical,
"septumwall2_physical", innervolumesector_logical,
false, 1, overlap);
229 zr_t vcr[] = {{3., RI}, {ZT - zsep, RIp - tand(th0)* zsep}, {ZT - zsep, RT - 20}, {3 + (RT - 20 - RC) / tand(th1), RT - 20}, {3, RC}};
230 std::vector<zr_t> ccr(vcr, vcr +
sizeof(vcr) /
sizeof(
zr_t));
231 G4VSolid* crystalvolume_solid =
new BelleLathe(
"fwd_crystalvolume_solid", 0, M_PI / 8, ccr);
232 G4LogicalVolume* crystalvolume_logical =
new G4LogicalVolume(crystalvolume_solid,
Materials::get(
"G4_AIR"),
233 "crystalvolume_logical", 0, 0, 0);
234 crystalvolume_logical->SetVisAttributes(
att(
"air"));
235 new G4PVPlacement(G4RotateZ3D(-M_PI / 8), crystalvolume_logical,
"ECLForwardCrystalSectorPhysical_0", innervolumesector_logical,
237 new G4PVPlacement(G4RotateZ3D(0), crystalvolume_logical,
"ECLForwardCrystalSectorPhysical_1", innervolumesector_logical,
false, 1,
241 double d = 5, aRC = RC - 30e-6;
242 Point_t vin[] = {{3., RI}, {ZT - zsep, RIp - tand(th0)* zsep}, {ZT - zsep, RT - 20 - d}, {3 + (RT - 20 - d - aRC) / tand(th1), RT - 20 - d}, {3, aRC}};
243 const int n =
sizeof(vin) /
sizeof(
Point_t);
244 Point_t c = centerofgravity(vin, vin + n);
245 G4ThreeVector contour_swall[n * 2];
247 for (
int i = 0; i < n; i++) contour_swall[i + 0] = G4ThreeVector(vin[i].x - c.x, vin[i].
y - c.y, -0.5 / 2 / 2);
248 for (
int i = 0; i < n; i++) contour_swall[i + n] = G4ThreeVector(vin[i].x - c.x, vin[i].
y - c.y, 0.5 / 2 / 2);
250 G4VSolid* septumwall3_solid =
new BelleCrystal(
"fwd_septumwall3_solid", n, contour_swall);
252 G4LogicalVolume* septumwall3_logical =
new G4LogicalVolume(septumwall3_solid,
Materials::get(
"A5052"),
253 "septumwall3_logical", 0, 0, 0);
254 septumwall3_logical->SetVisAttributes(
att(
"alum2"));
255 new G4PVPlacement(G4RotateZ3D(-M_PI / 2)*G4RotateY3D(-M_PI / 2)*G4Translate3D(c.x, c.y, 0.5 / 2 / 2), septumwall3_logical,
256 "septumwall3_physical_0", crystalvolume_logical,
false, 0, overlap);
257 new G4PVPlacement(G4RotateZ3D(M_PI / 8)*G4RotateZ3D(-M_PI / 2)*G4RotateY3D(-M_PI / 2)*G4Translate3D(c.x, c.y, -0.5 / 2 / 2),
258 septumwall3_logical,
"septumwall3_physical_1", crystalvolume_logical,
false, 1, overlap);
263 vector<shape_t*> cryst = load_shapes(
m_sap, ECLParts::forward);
264 vector<G4LogicalVolume*> wrapped_crystals;
265 for (
auto it = cryst.begin(); it != cryst.end(); it++) {
267 wrapped_crystals.push_back(
wrapped_crystal(s,
"forward", 0.20 - 0.02));
270 for (vector<cplacement_t>::const_iterator it = bp.begin(); it != bp.end(); ++it) {
272 auto s = find_if(cryst.begin(), cryst.end(), [&t](
const shape_t* shape) {return shape->nshape == t.nshape;});
273 if (s == cryst.end())
continue;
275 G4Transform3D twc = G4Translate3D(0, 0, 3) * get_transform(t);
276 int indx = it - bp.begin();
277 new G4PVPlacement(twc, wrapped_crystals[s - cryst.begin()], suf(
"ECLForwardWrappedCrystal_Physical", indx), crystalvolume_logical,
278 false, indx, overlap);
286 if (b_preamplifier) {
287 for (vector<cplacement_t>::const_iterator it = bp.begin(); it != bp.end(); ++it) {
288 G4Transform3D twc = G4Translate3D(0, 0, 3) * get_transform(*it);
289 int indx = it - bp.begin();
291 suf(
"phys_forward_preamplifier", indx), crystalvolume_logical,
false, indx, 0);
292 if (overlap)pv->CheckOverlaps(1000);
297 const G4VisAttributes* batt =
att(
"iron");
299 G4VSolid* s1 =
new G4Box(
"fwd_leg_p1", 130. / 2, 170. / 2, (40. - milled_thickness) / 2);
300 G4LogicalVolume* l1 =
new G4LogicalVolume(s1,
Materials::get(
"SUS304"),
"l1", 0, 0, 0);
301 G4Transform3D t1 = G4Translate3D(0, 170. / 2, (40. - milled_thickness) / 2 + milled_thickness);
302 l1->SetVisAttributes(batt);
304 G4VSolid* s2 =
new G4Box(
"fwd_leg_p2", 60. / 2, 130. / 2, 137. / 2);
305 G4LogicalVolume* l2 =
new G4LogicalVolume(s2,
Materials::get(
"SUS304"),
"l2", 0, 0, 0);
306 G4Transform3D t2 = G4Translate3D(0, 130. / 2 + 35, 40. + 137. / 2);
307 l2->SetVisAttributes(batt);
309 Point_t v3[] = {{ -75. / 2, -265. / 2}, {75. / 2 - 30, -265. / 2}, {75. / 2, -265. / 2 + 30}, {75. / 2, 265. / 2}, { -75. / 2, 265. / 2}};
310 const int n3 =
sizeof(v3) /
sizeof(
Point_t);
311 G4ThreeVector c3[n3 * 2];
313 for (
int i = 0; i < n3; i++) c3[i + 0] = G4ThreeVector(v3[i].x, v3[i].y, -140. / 2);
314 for (
int i = 0; i < n3; i++) c3[i + n3] = G4ThreeVector(v3[i].x, v3[i].y, 140. / 2);
317 G4LogicalVolume* l3 =
new G4LogicalVolume(s3,
Materials::get(
"SUS304"),
"l3", 0, 0, 0);
318 G4Transform3D t3 = G4Translate3D(0, 265. / 2 + 35, 40. + 137. + 75. / 2) * G4RotateY3D(-M_PI / 2);
319 l3->SetVisAttributes(batt);
321 G4VSolid* s4 =
new G4Box(
"fwd_leg_p4", 130. / 2, 5. / 2, (5. + milled_thickness) / 2);
322 G4LogicalVolume* l4 =
new G4LogicalVolume(s4,
Materials::get(
"SUS304"),
"l4", 0, 0, 0);
323 G4Transform3D t4 = G4Translate3D(0, 170. - 5. / 2, (milled_thickness - 5.) / 2);
324 l4->SetVisAttributes(batt);
326 G4VSolid* s5 =
new G4Box(
"fwd_leg_p5", 140. / 2, 130. / 2, 80. / 2);
327 G4LogicalVolume* l5 =
new G4LogicalVolume(s5,
Materials::get(
"SUS304"),
"l5", 0, 0, 0);
328 G4Transform3D t5 = G4Translate3D(0, 180. + 130. / 2, 97. + 80. / 2);
329 l5->SetVisAttributes(batt);
331 G4VSolid* s6 =
new G4Box(
"fwd_leg_p6", 140. / 2, 110. / 2, 160. / 2);
332 G4LogicalVolume* l6 =
new G4LogicalVolume(s6,
Materials::get(
"G4_AIR"),
"l6", 0, 0, 0);
333 G4Transform3D t6 = G4Translate3D(0, 310. + 110. / 2, 97. + 160. / 2);
334 l6->SetVisAttributes(
att(
"air"));
336 G4VSolid* s6a =
new G4Box(
"fwd_leg_p6a", 140. / 2, (110. - 45.) / 2, 160. / 2);
337 G4LogicalVolume* l6a =
new G4LogicalVolume(s6a,
Materials::get(
"SUS304"),
"l6a", 0, 0, 0);
338 l6a->SetVisAttributes(batt);
339 new G4PVPlacement(G4TranslateY3D(-45. / 2), l6a,
"l6a_physical", l6,
false, 0, overlap);
341 G4VSolid* s6b =
new G4Box(
"fwd_leg_p6b", 60. / 2, 45. / 2, 160. / 2);
342 G4LogicalVolume* l6b =
new G4LogicalVolume(s6b,
Materials::get(
"SUS304"),
"l6b", 0, 0, 0);
343 l6b->SetVisAttributes(batt);
344 double dy = 110. / 2 - 45 + 45. / 2;
345 new G4PVPlacement(G4TranslateY3D(dy), l6b,
"l6b_physical", l6,
false, 0, overlap);
347 G4VSolid* s6c =
new G4Box(
"fwd_leg_p6c", 40. / 2, 45. / 2, 22.5 / 2);
348 G4LogicalVolume* l6c =
new G4LogicalVolume(s6c,
Materials::get(
"SUS304"),
"l6c", 0, 0, 0);
349 l6c->SetVisAttributes(batt);
350 new G4PVPlacement(G4Translate3D(30 + 20, dy, 20 + 22.5 / 2), l6c,
"l6c_physical", l6,
false, 0, overlap);
351 new G4PVPlacement(G4Translate3D(30 + 20, dy, -20 - 22.5 / 2), l6c,
"l6c_physical", l6,
false, 1, overlap);
352 new G4PVPlacement(G4Translate3D(-30 - 20, dy, 20 + 22.5 / 2), l6c,
"l6c_physical", l6,
false, 2, overlap);
353 new G4PVPlacement(G4Translate3D(-30 - 20, dy, -20 - 22.5 / 2), l6c,
"l6c_physical", l6,
false, 3, overlap);
355 G4AssemblyVolume* support_leg =
new G4AssemblyVolume();
357 support_leg->AddPlacedVolume(l1, t1);
358 support_leg->AddPlacedVolume(l2, t2);
359 support_leg->AddPlacedVolume(l3, t3);
360 support_leg->AddPlacedVolume(l4, t4);
361 support_leg->AddPlacedVolume(l5, t5);
362 support_leg->AddPlacedVolume(l6, t6);
364 for (
int i = 0; i < 8; i++) {
365 G4Transform3D tp = gTrans * G4RotateZ3D(-M_PI / 2 + M_PI / 8 + i * M_PI / 4) *
366 G4Translate3D(0, 1415 - 165 + 420. / 2, ZT + (97. + 160.) / 2) * G4Translate3D(0, -420. / 2, -(97. + 160.) / 2);
367 support_leg->MakeImprint(top, tp, 0, overlap);
388 if (b_support_structure_13) {
391 G4AssemblyVolume* acs =
new G4AssemblyVolume();
393 double Z0 = 434, Ro = 1415 - 20;
407 G4VSolid* solid10_p1 =
new G4Box(
"fwd_solid10_p1", 558. / 2 + 9.5, 20. / 2, 105. / 2);
408 G4VSolid* solid10_p2 =
new G4Box(
"fwd_solid10_p2", 559. / 2 + 9.5, 11. / 2, 71. / 2);
409 G4VSolid* solid10_p3 =
new G4SubtractionSolid(
"fwd_solid10_p3", solid10_p1, solid10_p2, G4Translate3D(0, -11. / 2, 71. / 2 - 17.5));
411 G4LogicalVolume* lsolid10 =
new G4LogicalVolume(solid10_p3,
Materials::get(
"A6063"),
"lsolid10", 0, 0, 0);
412 lsolid10->SetVisAttributes(
att(
"alum"));
413 G4Transform3D tsolid10_p1(G4RotateZ3D(M_PI / 16)*G4Translate3D(954.5 + 2.55 - 1, -30, Z0 - 105. / 2 - 5));
414 acs->AddPlacedVolume(lsolid10, tsolid10_p1);
416 G4Transform3D tsolid10_p2(G4RotateZ3D(-M_PI / 16)*G4Translate3D(954.5 + 2.55 - 1, 30, Z0 - 105. / 2 - 5)*G4RotateZ3D(M_PI));
417 acs->AddPlacedVolume(lsolid10, tsolid10_p2);
420 G4VSolid* solid1_p1 =
new G4Box(
"fwd_solid1_p1", 100. / 2, 30. / 2, 30. / 2);
421 G4VSolid* solid1_p2 =
new G4Box(
"fwd_solid1_p2", 80. / 2, 10. / 2, 31. / 2);
422 G4VSolid* solid1_p3 =
new G4SubtractionSolid(
"fwd_solid1_p3", solid1_p1, solid1_p2, G4Transform3D::Identity);
424 G4LogicalVolume* lsolid1 =
new G4LogicalVolume(solid1_p3,
Materials::get(
"A5052"),
"lsolid1", 0, 0, 0);
425 lsolid1->SetVisAttributes(
att(
"alum"));
427 G4Transform3D tsolid1_p1(G4RotateZ3D(M_PI / 16 * (-1 + 2 / 3.))*G4Translate3D(Ro - 8 - 50 - 3 * 140, 0, Z0 - 95));
428 acs->AddPlacedVolume(lsolid1, tsolid1_p1);
430 G4Transform3D tsolid1_p2(G4RotateZ3D(M_PI / 16 * (1 - 2 / 3.))*G4Translate3D(Ro - 8 - 50 - 3 * 140, 0, Z0 - 95));
431 acs->AddPlacedVolume(lsolid1, tsolid1_p2);
434 G4Transform3D tsolid1_p3(G4RotateZ3D(M_PI / 16 * (-1 + 2 / 3.))*G4Translate3D(Ro - 8 - 50 - 2 * 140, 0, Z0 - 95));
435 acs->AddPlacedVolume(lsolid1, tsolid1_p3);
437 G4Transform3D tsolid1_p4(G4RotateZ3D(M_PI / 16 * (1 - 2 / 3.))*G4Translate3D(Ro - 8 - 50 - 2 * 140, 0, Z0 - 95));
438 acs->AddPlacedVolume(lsolid1, tsolid1_p4);
441 G4Transform3D tsolid1_p5(G4RotateZ3D(M_PI / 16 * (-1 + 2 / 3.))*G4Translate3D(Ro - 8 - 50 - 1 * 140, 0, Z0 - 95));
442 acs->AddPlacedVolume(lsolid1, tsolid1_p5);
444 G4Transform3D tsolid1_p6(G4RotateZ3D(M_PI / 16 * (1 - 2 / 3.))*G4Translate3D(Ro - 8 - 50 - 1 * 140, 0, Z0 - 95));
445 acs->AddPlacedVolume(lsolid1, tsolid1_p6);
448 G4Transform3D tsolid1_p8(G4RotateZ3D(M_PI / 16 * (-1 + 2 / 3.))*G4Translate3D(Ro - 8 - 50, 0, Z0 - 100));
449 acs->AddPlacedVolume(lsolid1, tsolid1_p8);
451 G4Transform3D tsolid1_p9(G4RotateZ3D(M_PI / 16 * (-1 + 2 / 3. + (1 + 1. / 3) / 3))*G4Translate3D(Ro - 8 - 50, 0, Z0 - 100));
452 acs->AddPlacedVolume(lsolid1, tsolid1_p9);
454 G4Transform3D tsolid1_p10(G4RotateZ3D(M_PI / 16 * (-1 + 2 / 3. + 2 * (1 + 1. / 3) / 3))*G4Translate3D(Ro - 8 - 50, 0, Z0 - 100));
455 acs->AddPlacedVolume(lsolid1, tsolid1_p10);
458 G4VSolid* solid1_p11 =
new G4Box(
"fwd_solid1_p1", 100. / 2, 10. / 2, 30. / 2);
459 G4LogicalVolume* lsolid1_p2 =
new G4LogicalVolume(solid1_p11,
Materials::get(
"A5052"),
"lsolid1_p2", 0, 0, 0);
460 lsolid1_p2->SetVisAttributes(
att(
"alum"));
461 G4Transform3D tsolid1_p11(G4RotateZ3D(M_PI / 16 * (-1 + 2 / 3. - 1. / 3))*G4Translate3D(Ro - 8 - 50, 0, Z0 - 100));
462 acs->AddPlacedVolume(lsolid1_p2, tsolid1_p11);
465 G4VSolid* solid1_p12 =
new G4Box(
"fwd_solid1_p1", 86. / 2, 10. / 2, 30. / 2);
466 G4LogicalVolume* lsolid1_p3 =
new G4LogicalVolume(solid1_p12,
Materials::get(
"A5052"),
"lsolid1_p3", 0, 0, 0);
467 lsolid1_p3->SetVisAttributes(
att(
"alum"));
468 double alpha_p12 = M_PI / 16 * (-1 + 1. / 3);
469 G4Transform3D tsolid1_p12(G4Translate3D(532.2 + 43, 0, Z0 - 75));
470 acs->AddPlacedVolume(lsolid1_p3, tsolid1_p12);
472 G4Transform3D tsolid1_p13(G4RotateZ3D(alpha_p12)*G4Translate3D(532.2 + 43, 0, Z0 - 75));
473 acs->AddPlacedVolume(lsolid1_p3, tsolid1_p13);
475 G4Transform3D tsolid1_p14(G4RotateZ3D(-alpha_p12)*G4Translate3D(532.2 + 43, 0, Z0 - 75));
476 acs->AddPlacedVolume(lsolid1_p3, tsolid1_p14);
479 G4VSolid* solid1_p4 =
new G4Box(
"fwd_solid1_p4", 160. / 2, 30. / 2, 30. / 2);
480 G4VSolid* solid1_p5 =
new G4Box(
"fwd_solid1_p5", 140. / 2, 10. / 2, 31. / 2);
481 G4VSolid* solid1_p7 =
new G4SubtractionSolid(
"fwd_solid1_p7", solid1_p4, solid1_p5, G4Transform3D::Identity);
482 G4LogicalVolume* lsolid1_p7 =
new G4LogicalVolume(solid1_p7,
Materials::get(
"A5052"),
"lsolid1_p7", 0, 0, 0);
483 lsolid1_p7->SetVisAttributes(
att(
"alum"));
484 G4Transform3D tsolid1_p7(G4Translate3D(Ro - 8 - 80 - 4 * 140 + 4, 0, Z0 - 95));
485 acs->AddPlacedVolume(lsolid1_p7, tsolid1_p7);
489 auto get_bracket = [&](
double L,
double ang, G4Transform3D & lt) {
491 double dL = (ang > 0) ? 0 : thick * abs(tan(ang));
493 G4VSolid* solid2_p1 =
new G4Box(
"fwd_solid2_p1", (L - 2 * dL) / 2, thick / 2, 30. / 2);
494 G4VSolid* solid2_p2 =
new G4Box(
"fwd_solid2_p2", thick / 2, (15. - dL) / 2, 30. / 2);
495 double dx = thick / 2, y0 = (15. + dL) / 2;
496 G4Transform3D t1(G4Translate3D(L / 2, -dx, 0.)*G4RotateZ3D(-ang)*G4Translate3D(-dx, y0, 0));
497 G4Transform3D t2(G4Translate3D(-L / 2, -dx, 0.)*G4RotateZ3D(ang)*G4Translate3D(dx, y0, 0));
498 G4VSolid* solid2_p3 =
new G4UnionSolid(
"fwd_solid2_p3", solid2_p1, solid2_p2, t1);
499 G4VSolid* solid2_p4 =
new G4UnionSolid(
"fwd_solid2_p4", solid2_p3, solid2_p2, t2);
501 G4Transform3D u((ang > 0) ? G4Transform3D::Identity : G4RotateZ3D(M_PI));
502 lt = u * G4Translate3D(dx, 0, 0) * G4RotateZ3D(-M_PI / 2);
506 double obj2_dz = Z0 - 95;
507 auto place_solid2 = [&](
double dz,
double L,
double ang,
double phi,
double mx,
double dy) {
509 G4LogicalVolume* lsolid2 =
new G4LogicalVolume(get_bracket(L, ang, lt),
Materials::get(
"A5052"),
"lsolid2", 0, 0, 0);
510 lsolid2->SetVisAttributes(
att(
"alum"));
512 G4Transform3D tsolid2_p1(G4RotateZ3D(phi)*G4Translate3D(mx, dy, dz)*lt);
514 acs->AddPlacedVolume(lsolid2, tsolid2_p1);
517 auto place_solid3 = [&](
double L,
double ang,
const G4Transform3D & t) {
519 G4LogicalVolume* lsolid2 =
new G4LogicalVolume(get_bracket(L, ang, lt),
Materials::get(
"A5052"),
"lsolid2", 0, 0, 0);
520 lsolid2->SetVisAttributes(
att(
"alum"));
522 G4Transform3D tsolid2_p1(t * lt);
524 acs->AddPlacedVolume(lsolid2, tsolid2_p1);
528 G4Point3D aa(-50 + 15, 15, 0), bb(-50 + 15, -15, 0);
530 aa = tsolid1_p1 * G4Point3D(-50 + 15, 15, 0);
531 bb = tsolid1_p2 * G4Point3D(-50 + 15, -15, 0);
532 place_solid2(obj2_dz, (aa - bb).mag(), -M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
534 aa = tsolid1_p1 * G4Point3D(50 - 15, 15, 0);
535 bb = tsolid1_p2 * G4Point3D(50 - 15, -15, 0);
536 place_solid2(obj2_dz, (aa - bb).mag(), M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
538 G4Point3D r0(0, 40 / cos(M_PI / 16), 0);
539 G4Vector3D np(sin(M_PI / 16), cos(M_PI / 16), 0), mid;
540 G4RotateZ3D rb(M_PI / 24);
544 phi_uu = (tsolid1_p1 * G4Vector3D(1, 0, 0)).angle(G4Vector3D(cos(M_PI / 16), -sin(M_PI / 16), 0));
545 G4Vector3D n = tsolid1_p1 * G4Vector3D(-sin(phi_uu / 2), -cos(phi_uu / 2), 0);
547 aa = tsolid1_p1 * G4Point3D(-xj, -15, 0);
548 L = -((aa - r0) * np) / (n * np);
549 place_solid3(L, -phi_uu / 2, tsolid1_p1 * G4Translate3D(-xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
550 place_solid3(L, -phi_uu / 2, tsolid1_p2 * G4Translate3D(-xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
551 aa = tsolid1_p1 * G4Point3D(xj, -15, 0);
552 L = -((aa - r0) * np) / (n * np);
553 place_solid3(L, phi_uu / 2, tsolid1_p1 * G4Translate3D(xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
554 place_solid3(L, phi_uu / 2, tsolid1_p2 * G4Translate3D(xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
556 aa = tsolid1_p3 * G4Point3D(-xj, -15, 0);
557 L = -((aa - r0) * np) / (n * np);
558 place_solid3(L, -phi_uu / 2, tsolid1_p3 * G4Translate3D(-xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
559 place_solid3(L, -phi_uu / 2, tsolid1_p4 * G4Translate3D(-xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
560 aa = tsolid1_p3 * G4Point3D(xj, -15, 0);
561 L = -((aa - r0) * np) / (n * np);
562 place_solid3(L, phi_uu / 2, tsolid1_p3 * G4Translate3D(xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
563 place_solid3(L, phi_uu / 2, tsolid1_p4 * G4Translate3D(xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
565 aa = tsolid1_p5 * G4Point3D(-xj, -15, 0);
566 L = -((aa - r0) * np) / (n * np);
567 place_solid3(L, -phi_uu / 2, tsolid1_p5 * G4Translate3D(-xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
568 place_solid3(L, -phi_uu / 2, tsolid1_p6 * G4Translate3D(-xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
569 aa = tsolid1_p5 * G4Point3D(xj, -15, 0);
570 L = -((aa - r0) * np) / (n * np);
571 place_solid3(L, phi_uu / 2, tsolid1_p5 * G4Translate3D(xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
572 place_solid3(L, phi_uu / 2, tsolid1_p6 * G4Translate3D(xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
575 n = tsolid1_p7 * G4Vector3D(-sin(phi_uu / 2), -cos(phi_uu / 2), 0);
577 aa = tsolid1_p7 * G4Point3D(-xj, -15, 0);
578 L = -((aa - r0) * np) / (n * np);
579 place_solid3(L, -phi_uu / 2, tsolid1_p7 * G4Translate3D(-xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
580 place_solid3(L, -phi_uu / 2, tsolid1_p7 * G4Translate3D(-xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
581 aa = tsolid1_p7 * G4Point3D(xj, -15, 0);
582 L = -((aa - r0) * np) / (n * np);
583 place_solid3(L, phi_uu / 2, tsolid1_p7 * G4Translate3D(xj, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
584 place_solid3(L, phi_uu / 2, tsolid1_p7 * G4Translate3D(xj, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
587 aa = tsolid1_p3 * G4Point3D(-50 + 15, 15, 0);
588 bb = tsolid1_p4 * G4Point3D(-50 + 15, -15, 0);
589 place_solid2(obj2_dz, (aa - bb).mag(), -M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
591 aa = tsolid1_p3 * G4Point3D(50 - 15, 15, 0);
592 bb = tsolid1_p4 * G4Point3D(50 - 15, -15, 0);
593 place_solid2(obj2_dz, (aa - bb).mag(), M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
596 aa = tsolid1_p5 * G4Point3D(-50 + 15, 15, 0);
597 bb = tsolid1_p6 * G4Point3D(-50 + 15, -15, 0);
598 place_solid2(obj2_dz, (aa - bb).mag(), -M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
600 aa = tsolid1_p5 * G4Point3D(50 - 15, 15, 0);
601 bb = tsolid1_p6 * G4Point3D(50 - 15, -15, 0);
602 place_solid2(obj2_dz, (aa - bb).mag(), M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
606 aa = tsolid1_p8 * G4Point3D(-50 + 15, 15, 0);
607 bb = tsolid1_p9 * G4Point3D(-50 + 15, -15, 0);
608 place_solid2(obj2_dz, (aa - bb).mag(), -M_PI / 72, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
610 aa = tsolid1_p8 * G4Point3D(50 - 15, 15, 0);
611 bb = tsolid1_p9 * G4Point3D(50 - 15, -15, 0);
612 place_solid2(obj2_dz, (aa - bb).mag(), M_PI / 72, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
614 aa = tsolid1_p9 * G4Point3D(-50 + 15, 15, 0);
615 bb = tsolid1_p10 * G4Point3D(-50 + 15, -15, 0);
616 place_solid2(obj2_dz, (aa - bb).mag(), -M_PI / 72, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
618 aa = tsolid1_p9 * G4Point3D(50 - 15, 15, 0);
619 bb = tsolid1_p10 * G4Point3D(50 - 15, -15, 0);
620 place_solid2(obj2_dz, (aa - bb).mag(), M_PI / 72, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
622 phi_uu = (tsolid1_p8 * G4Vector3D(1, 0, 0)).angle(tsolid1_p11 * G4Vector3D(1, 0, 0));
623 r0 = tsolid1_p11 * G4Point3D(-50 + 15, 5, 0);
624 np = tsolid1_p11 * G4Vector3D(0, 1, 0);
626 n = tsolid1_p8 * G4Vector3D(-sin(phi_uu / 2), -cos(phi_uu / 2), 0);
627 aa = tsolid1_p8 * G4Point3D(-50 + 15, -15, 0);
628 L = -((aa - r0) * np) / (n * np);
629 place_solid3(L, -phi_uu / 2, tsolid1_p8 * G4Translate3D(-50 + 15, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
631 aa = tsolid1_p8 * G4Point3D(50 - 15, -15, 0);
632 L = -((aa - r0) * np) / (n * np);
633 place_solid3(L, phi_uu / 2, tsolid1_p8 * G4Translate3D(50 - 15, -15, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
635 phi_uu = (tsolid1_p11 * G4Vector3D(1, 0, 0)).angle(G4RotateZ3D(-M_PI / 16) * G4Vector3D(1, 0, 0));
636 r0 = G4RotateZ3D(-M_PI / 16) * G4Point3D(0, 40, 0);
637 np = G4RotateZ3D(-M_PI / 16) * G4Vector3D(0, 1, 0);
639 n = tsolid1_p11 * G4Vector3D(-sin(phi_uu / 2), -cos(phi_uu / 2), 0);
640 aa = tsolid1_p11 * G4Point3D(-50 + 15, -5, 0);
641 L = -((aa - r0) * np) / (n * np);
642 place_solid3(L, -phi_uu / 2, tsolid1_p11 * G4Translate3D(-50 + 15, -5, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
644 aa = tsolid1_p11 * G4Point3D(50 - 15, -5, 0);
645 L = -((aa - r0) * np) / (n * np);
646 place_solid3(L, phi_uu / 2, tsolid1_p11 * G4Translate3D(50 - 15, -5, 0)*G4RotateZ3D(-phi_uu / 2)*G4Translate3D(0, -L / 2, 0));
648 G4Transform3D ttt(G4RotateZ3D(M_PI / 16)*G4Translate3D(Ro - 8 - 50, 0, Z0 - 100));
649 phi_uu = (tsolid1_p10 * G4Vector3D(1, 0, 0)).angle(ttt * G4Vector3D(1, 0, 0));
650 r0 = ttt * G4Point3D(0, -40, 0);
651 np = ttt * G4Vector3D(0, 1, 0);
652 n = tsolid1_p10 * G4Vector3D(-sin(phi_uu / 2), cos(phi_uu / 2), 0);
653 aa = tsolid1_p10 * G4Point3D(-50 + 15, 15, 0);
654 L = -((aa - r0) * np) / (n * np);
655 place_solid3(L, -phi_uu / 2, tsolid1_p10 * G4Translate3D(-50 + 15, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
657 aa = tsolid1_p10 * G4Point3D(50 - 15, 15, 0);
658 L = -((aa - r0) * np) / (n * np);
659 place_solid3(L, phi_uu / 2, tsolid1_p10 * G4Translate3D(50 - 15, 15, 0)*G4RotateZ3D(phi_uu / 2)*G4Translate3D(0, L / 2, 0));
662 aa = tsolid1_p12 * G4Point3D(-43 + 15, -5, 0);
663 bb = tsolid1_p13 * G4Point3D(-43 + 15, 5, 0);
664 place_solid2(obj2_dz, (aa - bb).mag(), -M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
666 aa = tsolid1_p12 * G4Point3D(43 - 15, -5, 0);
667 bb = tsolid1_p13 * G4Point3D(43 - 15, 5, 0);
668 place_solid2(obj2_dz, (aa - bb).mag(), M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
670 aa = tsolid1_p12 * G4Point3D(-43 + 15, 5, 0);
671 bb = tsolid1_p14 * G4Point3D(-43 + 15, -5, 0);
672 place_solid2(obj2_dz, (aa - bb).mag(), -M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
674 aa = tsolid1_p12 * G4Point3D(43 - 15, 5, 0);
675 bb = tsolid1_p14 * G4Point3D(43 - 15, -5, 0);
676 place_solid2(obj2_dz, (aa - bb).mag(), M_PI / 48, (aa + bb).phi(), (aa + bb).rho() / 2, 0);
678 G4VSolid* solid11_p1 =
new G4Box(
"fwd_solid11_p1", 80. / 2, 30. / 2, 40. / 2);
679 G4VSolid* solid11_p2 =
new G4Box(
"fwd_solid11_p2", 81. / 2, 30. / 2, 40. / 2);
680 G4VSolid* solid11_p3 =
new G4SubtractionSolid(
"fwd_solid11_p3", solid11_p1, solid11_p2, G4Translate3D(0, -3, 3));
682 G4LogicalVolume* lsolid11 =
new G4LogicalVolume(solid11_p3,
Materials::get(
"SUS304"),
"lsolid11", 0, 0, 0);
683 lsolid11->SetVisAttributes(
att(
"iron"));
684 G4Transform3D tsolid11_p1(G4RotateZ3D(M_PI / 16)*G4Translate3D(580, -35, Z0 - 40));
685 acs->AddPlacedVolume(lsolid11, tsolid11_p1);
687 G4Transform3D tsolid11_p2(G4RotateZ3D(-M_PI / 16)*G4Translate3D(580, 35, Z0 - 40)*G4RotateZ3D(M_PI));
688 acs->AddPlacedVolume(lsolid11, tsolid11_p2);
690 G4VSolid* solid12_p1 =
new G4Box(
"fwd_solid12_p1", 120. / 2, 20. / 2, 115. / 2);
691 G4VSolid* solid12_p2 =
new G4Box(
"fwd_solid12_p2", 121. / 2, 12. / 2, 86. / 2);
692 G4VSolid* solid12_p3 =
new G4SubtractionSolid(
"fwd_solid12_p3", solid12_p1, solid12_p2, G4Translate3D(0, -11. / 2 + 1,
693 86. / 2 - 17.5 - 5));
694 G4LogicalVolume* lsolid12 =
new G4LogicalVolume(solid12_p3,
Materials::get(
"A6063"),
"lsolid12", 0, 0, 0);
695 lsolid12->SetVisAttributes(
att(
"alum"));
697 G4Transform3D tsolid12_p2(G4RotateZ3D(-M_PI / 16)*G4Translate3D(Ro - 8 - 60, 30, Z0 - 115. / 2)*G4RotateZ3D(M_PI));
698 acs->AddPlacedVolume(lsolid12, tsolid12_p2);
700 G4VSolid* solid12r_p1 =
new G4Box(
"fwd_solid12r_p1", 100. / 2, 30. / 2, 75. / 2);
701 G4VSolid* solid12r_p2 =
new G4Box(
"fwd_solid12r_p2", 101. / 2, 21. / 2, 41. / 2);
702 G4VSolid* solid12r_p3 =
new G4SubtractionSolid(
"fwd_solid12r_p3", solid12r_p1, solid12r_p2, G4Translate3D(0, -21. / 2 + 5,
703 -41. / 2 - 75. / 2 + 40));
704 G4LogicalVolume* lsolid12r =
new G4LogicalVolume(solid12r_p3,
Materials::get(
"A6063"),
"lsolid12r", 0, 0, 0);
705 lsolid12r->SetVisAttributes(
att(
"alum"));
706 G4Transform3D tsolid12r_p1(G4RotateZ3D(M_PI / 16)*G4Translate3D(Ro - 8 - 50, -30 - 15, Z0 - 40 - 75. / 2));
707 acs->AddPlacedVolume(lsolid12r, tsolid12r_p1);
709 G4Transform3D tr = G4RotateZ3D(M_PI / 16) * G4ReflectY3D();
710 acs->MakeImprint(innervolumesector_logical, tr, 0, overlap);
711 tr = G4RotateZ3D(-M_PI / 16);
712 acs->MakeImprint(innervolumesector_logical, tr, 1, overlap);
717 if (b_support_structure_15) {
718 G4AssemblyVolume* acs =
new G4AssemblyVolume();
720 double Z0 = 434, Ro = 1415 - 20;
722 G4VSolid* solid1_p1 =
new G4Box(
"fwd_solid1_p1", 10. / 2, 398. / 2, 5. / 2);
723 G4VSolid* solid1_p2 =
new G4Box(
"fwd_solid1_p2", 4. / 2, 398. / 2 - 32, 6. / 2);
724 G4VSolid* solid1_p3 =
new G4SubtractionSolid(
"fwd_solid1_p3", solid1_p1, solid1_p2, G4Transform3D(G4RotationMatrix(),
728 G4LogicalVolume* lsolid1 =
new G4LogicalVolume(solid1_p3,
Materials::get(
"SUS304"),
"lsolid1", 0, 0, 0);
729 lsolid1->SetVisAttributes(
att(
"iron"));
730 G4Transform3D tsolid1_p1(G4Translate3D(1350, -16, Z0 - 40 + 3 + 2.5));
731 acs->AddPlacedVolume(lsolid1, tsolid1_p1);
733 G4VSolid* solid1a_p1 =
new G4Box(
"fwd_solid1a_p1", 10. / 2, 348.5 / 2, 5. / 2);
734 G4VSolid* solid1a_p2 =
new G4Box(
"fwd_solid1a_p2", 4. / 2, 348.5 / 2 - 32, 6. / 2);
735 G4VSolid* solid1a_p3 =
new G4SubtractionSolid(
"fwd_solid1a_p3", solid1a_p1, solid1a_p2, G4Transform3D(G4RotationMatrix(),
736 G4ThreeVector(4, 0, 0)));
738 G4LogicalVolume* lsolid1a =
new G4LogicalVolume(solid1a_p3,
Materials::get(
"SUS304"),
"lsolid1a", 0, 0, 0);
739 lsolid1a->SetVisAttributes(
att(
"iron"));
740 G4Transform3D tsolid1a_p1(G4Translate3D(1250, -16, Z0 - 40 + 3 + 2.5));
741 acs->AddPlacedVolume(lsolid1a, tsolid1a_p1);
743 G4VSolid* solid1b_p1 =
new G4Box(
"fwd_solid1b_p1", 10. / 2, (210 + 210 + 16) / 2, 5. / 2);
744 G4VSolid* solid1b_p2 =
new G4Box(
"fwd_solid1b_p2", 4. / 2, (210 + 210 + 16) / 2 - 16, 6. / 2);
745 G4VSolid* solid1b_p3 =
new G4SubtractionSolid(
"fwd_solid1b_p3", solid1b_p1, solid1b_p2, G4Transform3D(G4RotationMatrix(),
746 G4ThreeVector(4, 0, 0)));
748 G4LogicalVolume* lsolid1b =
new G4LogicalVolume(solid1b_p3,
Materials::get(
"SUS304"),
"lsolid1b", 0, 0, 0);
749 lsolid1b->SetVisAttributes(
att(
"iron"));
750 G4Transform3D t1b(G4Translate3D(1204 - (210 + 210 + 16) / 2 + 16, 0, Z0 - 52 + 8 + 5. / 2));
751 G4Transform3D tsolid1b_p1(t1b * G4TranslateY3D(-10)*G4RotateZ3D(-M_PI / 2));
752 acs->AddPlacedVolume(lsolid1b, tsolid1b_p1);
753 G4Transform3D tsolid1b_p2(t1b * G4TranslateY3D(10)*G4RotateZ3D(M_PI / 2));
754 acs->AddPlacedVolume(lsolid1b, tsolid1b_p2);
755 G4Transform3D tsolid1b_p3(t1b * G4TranslateY3D(-110)*G4RotateZ3D(M_PI / 2));
756 acs->AddPlacedVolume(lsolid1b, tsolid1b_p3);
757 G4Transform3D tsolid1b_p4(t1b * G4TranslateY3D(110)*G4RotateZ3D(-M_PI / 2));
758 acs->AddPlacedVolume(lsolid1b, tsolid1b_p4);
760 G4VSolid* solid2_p1 =
new G4Box(
"fwd_solid2_p1", 20. / 2, 210. / 2, 5. / 2);
761 G4VSolid* solid2_p2 =
new G4Box(
"fwd_solid2_p2", 14. / 2, 210. / 2 - 16, 6. / 2);
762 G4VSolid* solid2_p3 =
new G4SubtractionSolid(
"fwd_solid2_p3", solid2_p1, solid2_p2, G4Transform3D(G4RotationMatrix(),
766 G4LogicalVolume* lsolid2 =
new G4LogicalVolume(solid2_p3,
Materials::get(
"SUS304"),
"lsolid2", 0, 0, 0);
767 lsolid2->SetVisAttributes(
att(
"iron"));
768 G4Transform3D tsolid2_p1(G4Translate3D(1204 - (210 + 210) - 210 / 2 + 16, 58, Z0 - 52 + 8 + 5. / 2)*G4RotateZ3D(-M_PI / 2));
769 acs->AddPlacedVolume(lsolid2, tsolid2_p1);
771 G4Transform3D tsolid2_p2(G4Translate3D(1204 - (210 + 210) - 210 / 2 + 16, -58, Z0 - 52 + 8 + 5. / 2)*G4RotateZ3D(M_PI / 2));
772 acs->AddPlacedVolume(lsolid2, tsolid2_p2);
775 G4VSolid* solid3_p1 =
new G4Box(
"fwd_solid3_p1", 32. / 2, 396. / 2, 8. / 2);
776 G4LogicalVolume* lsolid3 =
new G4LogicalVolume(solid3_p1,
Materials::get(
"SUS304"),
"lsolid3", 0, 0, 0);
777 lsolid3->SetVisAttributes(
att(
"iron"));
778 G4Transform3D tsolid3_p1(G4Translate3D(1204, 0, Z0 - 52 + 8. / 2));
779 acs->AddPlacedVolume(lsolid3, tsolid3_p1);
782 G4VSolid* solid3n_p1 =
new G4Box(
"fwd_solid3n_p1", 32. / 2, 230. / 2, 8. / 2);
783 G4LogicalVolume* lsolid3n =
new G4LogicalVolume(solid3n_p1,
Materials::get(
"SUS304"),
"lsolid3n", 0, 0, 0);
784 lsolid3n->SetVisAttributes(
att(
"iron"));
785 G4Transform3D tsolid3n_p1(G4Translate3D(1204 - 420, 0, Z0 - 52 + 8. / 2));
786 acs->AddPlacedVolume(lsolid3n, tsolid3n_p1);
789 G4VSolid* solid4_p1 =
new G4Box(
"fwd_solid4_p1", 16. / 2, 160. / 2, 8. / 2);
790 G4LogicalVolume* lsolid4 =
new G4LogicalVolume(solid4_p1,
Materials::get(
"SUS304"),
"lsolid4", 0, 0, 0);
791 lsolid4->SetVisAttributes(
att(
"iron"));
792 G4Transform3D tsolid4_p1(G4Translate3D(598, 0, Z0 - 52 + 8. / 2));
793 acs->AddPlacedVolume(lsolid4, tsolid4_p1);
796 G4VSolid* solid5_p1 =
new G4Box(
"fwd_solid5_p1", 650. / 2, 30. / 2, 40. / 2);
797 G4VSolid* solid5_p2 =
new G4Box(
"fwd_solid5_p2", 651. / 2, 30. / 2, 40. / 2);
798 G4VSolid* solid5_p3 =
new G4SubtractionSolid(
"solid5_p3", solid5_p1, solid5_p2, G4Translate3D(0, -3, 3));
800 G4LogicalVolume* lsolid5 =
new G4LogicalVolume(solid5_p3,
Materials::get(
"SUS304"),
"lsolid5", 0, 0, 0);
801 lsolid5->SetVisAttributes(
att(
"iron"));
802 G4Transform3D tsolid5_p1(G4RotateZ3D(M_PI / 16)*G4Translate3D(910, -45, Z0 - 20 - 15));
803 acs->AddPlacedVolume(lsolid5, tsolid5_p1);
805 G4Transform3D tsolid5_p3(G4RotateZ3D(-M_PI / 16)*G4Translate3D(910, 45, Z0 - 20 - 15)*G4RotateZ3D(M_PI));
806 acs->AddPlacedVolume(lsolid5, tsolid5_p3);
809 G4VSolid* solid7_p1 =
new G4Box(
"fwd_solid7_p1", 130. / 2, 30. / 2, 40. / 2);
810 G4VSolid* solid7_p2 =
new G4Box(
"fwd_solid7_p2", 131. / 2, 30. / 2, 40. / 2);
811 G4VSolid* solid7_p3 =
new G4SubtractionSolid(
"fwd_solid7_p3", solid7_p1, solid7_p2, G4Transform3D(G4RotationMatrix(),
814 G4LogicalVolume* lsolid7 =
new G4LogicalVolume(solid7_p3,
Materials::get(
"SUS304"),
"lsolid7", 0, 0, 0);
815 lsolid7->SetVisAttributes(
att(
"iron"));
816 G4Transform3D tsolid7_p1(G4RotateZ3D(-M_PI / 16)*G4Translate3D(Ro - 8 - 65, 54, Z0 - 40. / 2)*G4RotateZ3D(M_PI));
817 acs->AddPlacedVolume(lsolid7, tsolid7_p1);
819 G4Transform3D tsolid7_p2(G4RotateZ3D(M_PI / 16)*G4Translate3D(Ro - 8 - 65 - 8, -85, Z0 - 40. / 2));
820 acs->AddPlacedVolume(lsolid7, tsolid7_p2);
828 G4VSolid* solid8_p1 =
new G4Box(
"fwd_solid8_p1", 120. / 2, 10. / 2, 42. / 2);
829 G4LogicalVolume* lsolid8 =
new G4LogicalVolume(solid8_p1,
Materials::get(
"SUS304"),
"lsolid8", 0, 0, 0);
830 lsolid8->SetVisAttributes(
att(
"iron"));
831 G4Transform3D tsolid8_p1(G4RotateZ3D(-M_PI / 16)*G4Translate3D(Ro - 8 - 60, 34, Z0 - 42. / 2));
832 acs->AddPlacedVolume(lsolid8, tsolid8_p1);
838 G4VSolid* solid9_p1 =
new G4Box(
"fwd_solid9_p1", 26. / 2, 12. / 2, 26. / 2);
839 G4LogicalVolume* lsolid9 =
new G4LogicalVolume(solid9_p1,
Materials::get(
"SUS304"),
"lsolid9", 0, 0, 0);
840 lsolid9->SetVisAttributes(
att(
"iron"));
841 G4Transform3D tsolid9_p1(G4RotateZ3D(-M_PI / 16)*G4Translate3D(Ro - 8 - 120 + 26. / 2 + 17, 20 + 9 + 10 + 9 + 3,
843 acs->AddPlacedVolume(lsolid9, tsolid9_p1);
847 G4VSolid* solid10_p1 =
new G4Box(
"fwd_solid10_p1", 26. / 2, 12. / 2, 42. / 2);
848 G4LogicalVolume* lsolid10 =
new G4LogicalVolume(solid10_p1,
Materials::get(
"SUS304"),
"lsolid10", 0, 0, 0);
849 lsolid10->SetVisAttributes(
att(
"iron"));
851 G4Transform3D tsolid10_p1(G4RotateZ3D(-M_PI / 16)*G4Translate3D(910 + 650. / 2 - 221, 20 + 10 + 6 + 6, Z0 - 52 + 42. / 2));
852 acs->AddPlacedVolume(lsolid10, tsolid10_p1);
856 double t = 2, h20 = 32;
857 G4VSolid* solid_connector =
new G4Box(
"fwd_solid_connector", (110 + 2 * 20) / 2, (250 + 2 * 20) / 2, h20 / 2);
858 G4VSolid* solid_connector2 =
new G4Box(
"fwd_solid_connector2", (20 + t) / 2, (20 + t) / 2, 1.01 * h20 / 2);
859 G4VSolid* solid_connector3 =
new G4Box(
"fwd_solid_connector3", 20 / 2, (250 + 2 * 20 + 2) / 2, h20 / 2);
860 solid_connector =
new G4SubtractionSolid(
"fwd_solid_connector", solid_connector, solid_connector2, G4Translate3D(55 + (20 + t) / 2,
862 solid_connector =
new G4SubtractionSolid(
"fwd_solid_connector", solid_connector, solid_connector3, G4Translate3D(-70, 0, -t - 1));
863 G4LogicalVolume* lsolid_connector =
new G4LogicalVolume(solid_connector,
Materials::get(
"G4_AIR"),
"lsolid_connector", 0,
865 lsolid_connector->SetVisAttributes(
att(
"air"));
866 G4Transform3D tsolid_connector(G4Translate3D(1360 - 60, 0, Z0 - h20 / 2));
867 acs->AddPlacedVolume(lsolid_connector, tsolid_connector);
870 auto lvolume = [&](
int part,
double dx,
double dy,
double dz) {
871 ostringstream ost(
""); ost <<
"solid20_p" << part;
872 G4VSolid* sv =
new G4Box(ost.str().c_str(), dx / 2, dy / 2, dz / 2);
873 ost.str(
""); ost <<
"lsolid20_p" << part;
874 return new G4LogicalVolume(sv,
Materials::get(
"A5052"), ost.str().c_str(), 0, 0, 0);
877 auto place = [&](G4LogicalVolume * lv,
const G4Translate3D & move,
int n) {
878 lv->SetVisAttributes(
att(
"alum"));
879 ostringstream ost(
""); ost <<
"phys_" << lv->GetName();
880 new G4PVPlacement(move, lv, ost.str().c_str(), lsolid_connector,
false, n, overlap);
882 G4LogicalVolume* lv1 = lvolume(1, 20, 250 + 2 * 20, t);
883 place(lv1, G4Translate3D(-55 - 10, 0, h20 / 2 - t / 2), 0);
884 G4LogicalVolume* lv1_2 = lvolume(1, 20, 250 + 20, t);
885 place(lv1_2, G4Translate3D(55 + 10, 10, h20 / 2 - t / 2), 1);
887 G4LogicalVolume* lv2 = lvolume(2, 110., 20., t);
888 place(lv2, G4Translate3D(0, 250 / 2 + 10, h20 / 2 - t / 2), 0);
889 place(lv2, G4Translate3D(0, -250 / 2 - 10, h20 / 2 - t / 2), 1);
891 G4LogicalVolume* lv3 = lvolume(3, 110., t, h20 - t);
892 place(lv3, G4Translate3D(0, 250 / 2 + t / 2, -t / 2), 0);
893 place(lv3, G4Translate3D(0, -250 / 2 - t / 2, -t / 2), 1);
895 G4LogicalVolume* lv4 = lvolume(4, t, 250 + 2 * t, h20 - t);
896 place(lv4, G4Translate3D(55 + t / 2, 0, -t / 2), 0);
897 place(lv4, G4Translate3D(-55 - t / 2, 0, -t / 2), 1);
899 G4LogicalVolume* lv5 = lvolume(5, 7, 250, t);
900 place(lv5, G4Translate3D(55 - 7. / 2, 0, -h20 / 2 + t / 2 + t), 0);
901 place(lv5, G4Translate3D(-55 + 7. / 2, 0, -h20 / 2 + t / 2 + t), 1);
903 G4LogicalVolume* lv6 = lvolume(6, 110 - 14, 7, t);
904 place(lv6, G4Translate3D(0, 250 / 2 - 7. / 2, -h20 / 2 + t / 2 + t), 0);
905 place(lv6, G4Translate3D(0, -250 / 2 + 7. / 2, -h20 / 2 + t / 2 + t), 1);
907 G4LogicalVolume* lv7 = lvolume(7, 110, 250, t);
908 place(lv7, G4Translate3D(0, 0, -h20 / 2 + t / 2), 0);
911 G4VSolid* p8_1 =
new G4Box(
"fwd_solid20_p8_1", 90. / 2, 10. / 2, 30. / 2);
912 G4VSolid* p8_2 =
new G4Box(
"fwd_solid20_p8_2", 88. / 2, 8. / 2, 30. / 2);
913 G4VSolid* sp8 =
new G4SubtractionSolid(
"fwd_solid20_p8", p8_1, p8_2, G4TranslateZ3D(-1));
914 G4LogicalVolume* lv8 =
new G4LogicalVolume(sp8,
Materials::get(
"A5052"),
"lsolid20_p8", 0, 0, 0);
915 lv8->SetVisAttributes(
att(
"alum2"));
916 for (
int i = 0; i < 10; i++) place(lv8, G4Translate3D(0, 25 * (i - 4.5), -h20 / 2 + t + 30 / 2), i);
921 G4VSolid* solid_board =
new G4Box(
"fwd_solid_board", (210) / 2, (110) / 2, hbv / 2);
922 G4LogicalVolume* lsolid_board =
new G4LogicalVolume(solid_board,
Materials::get(
"G4_AIR"),
"lsolid_board", 0, 0, 0);
923 lsolid_board->SetVisAttributes(
att(
"air"));
924 for (
int i = 0; i < 1; i++) {
926 G4Transform3D t0 = G4Translate3D(598 - 8 + 210 / 2, 0, Z0 - 52 + 8 + 5 + hbv / 2);
927 G4Transform3D t1 = t0 * G4Translate3D(210, 110 / 2 + 5, 0);
928 G4Transform3D t2 = t0 * G4Translate3D(210, -110 / 2 + 5, 0);
929 G4Transform3D t3 = t0 * G4Translate3D(2 * 210, 110 / 2 + 5, 0);
930 G4Transform3D t4 = t0 * G4Translate3D(2 * 210, -110 / 2 + 5, 0);
936 acs->AddPlacedVolume(lsolid_board, t0);
937 acs->AddPlacedVolume(lsolid_board, t1);
938 acs->AddPlacedVolume(lsolid_board, t2);
939 acs->AddPlacedVolume(lsolid_board, t3);
940 acs->AddPlacedVolume(lsolid_board, t4);
943 auto lvolumeb = [&](
int part,
double dx,
double dy,
double dz) {
944 ostringstream ost(
""); ost <<
"fwd_sboard_p" << part;
945 G4VSolid* sv =
new G4Box(ost.str().c_str(), dx / 2, dy / 2, dz / 2);
946 ost.str(
""); ost <<
"lboard_p" << part;
947 return new G4LogicalVolume(sv, boxmaterial, ost.str().c_str(), 0, 0, 0);
950 const G4VisAttributes* asolid20 =
att(
"plate");
952 auto placeb = [&](G4LogicalVolume * lv,
const G4Translate3D & move,
int n) {
953 lv->SetVisAttributes(asolid20);
954 ostringstream ost(
""); ost <<
"phys_" << lv->GetName();
955 new G4PVPlacement(move, lv, ost.str().c_str(), lsolid_board,
false, n, overlap);
959 G4LogicalVolume* lb1 = lvolumeb(1, 210, 110, hboard);
960 placeb(lb1, G4Translate3D(0, 0, -hbv / 2 + hboard / 2), 0);
962 double wcon = 20, hcon = 40, hc = hbv - hboard;
963 G4VSolid* sv_connector_bundle =
new G4Box(
"fwd_sv_connector_bundle", 4 * wcon / 2, hcon / 2, hc / 2);
964 G4LogicalVolume* lv_connector_bundle =
new G4LogicalVolume(sv_connector_bundle,
Materials::get(
"G4_AIR"),
965 "lv_connector_bundle", 0, 0, 0);
966 lv_connector_bundle->SetVisAttributes(
att(
"air"));
967 new G4PVPlacement(G4Translate3D(-210 / 2 + 10 + wcon * 2, -110 / 2 + hcon / 2, -hbv / 2 + hboard + hc / 2), lv_connector_bundle,
968 "pv_connector_bundle", lsolid_board,
false, 0, overlap);
969 new G4PVPlacement(G4Translate3D(-210 / 2 + 10 + wcon * 2, 10 + hcon / 2, -hbv / 2 + hboard + hc / 2), lv_connector_bundle,
970 "pv_connector_bundle", lsolid_board,
false, 0, overlap);
971 new G4PVPlacement(G4Translate3D(10 + wcon * 2, -110 / 2 + hcon / 2, -hbv / 2 + hboard + hc / 2), lv_connector_bundle,
972 "pv_connector_bundle", lsolid_board,
false, 0, overlap);
973 new G4PVPlacement(G4Translate3D(10 + wcon * 2, 10 + hcon / 2, -hbv / 2 + hboard + hc / 2), lv_connector_bundle,
974 "pv_connector_bundle", lsolid_board,
false, 0, overlap);
976 G4VSolid* sv_crystal_connector =
new G4Box(
"fwd_sv_crystal_connector", wcon / 2, hcon / 2, hc / 2);
977 G4LogicalVolume* lv_crystal_connector =
new G4LogicalVolume(sv_crystal_connector,
Materials::get(
"G4_AIR"),
978 "lv_crystal_connector", 0, 0, 0);
979 lv_crystal_connector->SetVisAttributes(
att(
"air"));
981 new G4PVPlacement(G4Translate3D(-1.5 * 20, 0, 0), lv_crystal_connector,
"pv_crystal_connector", lv_connector_bundle,
false, 0,
983 new G4PVPlacement(G4Translate3D(-0.5 * 20, 0, 0), lv_crystal_connector,
"pv_crystal_connector", lv_connector_bundle,
false, 1,
985 new G4PVPlacement(G4Translate3D(0.5 * 20, 0, 0), lv_crystal_connector,
"pv_crystal_connector", lv_connector_bundle,
false, 2,
987 new G4PVPlacement(G4Translate3D(1.5 * 20, 0, 0), lv_crystal_connector,
"pv_crystal_connector", lv_connector_bundle,
false, 3,
990 G4VSolid* sv_crystal_connector_p1 =
new G4Box(
"fwd_sv_crystal_connector_p1", 8 / 2, 30 / 2, 20 / 2);
991 G4LogicalVolume* lv_crystal_connector_p1 =
new G4LogicalVolume(sv_crystal_connector_p1,
Materials::get(
"SUS304"),
992 "lv_crystal_connector_p1", 0, 0, 0);
993 lv_crystal_connector_p1->SetVisAttributes(
att(
"connector"));
995 new G4PVPlacement(G4Translate3D(-5, 0, -hc / 2 + 20. / 2), lv_crystal_connector_p1,
"pv_crystal_connector_p1", lv_crystal_connector,
998 G4VSolid* sv_capacitor =
new G4Tubs(
"fwd_sv_capacitor", 0, 5, 5. / 2, 0, 2 * M_PI);
999 G4LogicalVolume* lv_capacitor =
new G4LogicalVolume(sv_capacitor,
Materials::get(
"SUS304"),
"lv_capacitor", 0, 0, 0);
1000 lv_capacitor->SetVisAttributes(
att(
"capacitor"));
1002 new G4PVPlacement(G4Translate3D(5, -15, -hc / 2 + 5. / 2), lv_capacitor,
"pv_capacitor", lv_crystal_connector,
false, 0, overlap);
1003 new G4PVPlacement(G4Translate3D(5, -5, -hc / 2 + 5. / 2), lv_capacitor,
"pv_capacitor", lv_crystal_connector,
false, 1, overlap);
1004 new G4PVPlacement(G4Translate3D(5, 5, -hc / 2 + 5. / 2), lv_capacitor,
"pv_capacitor", lv_crystal_connector,
false, 2, overlap);
1005 new G4PVPlacement(G4Translate3D(5, 15, -hc / 2 + 5. / 2), lv_capacitor,
"pv_capacitor", lv_crystal_connector,
false, 3, overlap);
1007 G4VSolid* sv_board_connector_p1 =
new G4Box(
"fwd_sv_board_connector_p1", 80. / 2, 8. / 2, 20. / 2);
1008 G4LogicalVolume* lv_board_connector_p1 =
new G4LogicalVolume(sv_board_connector_p1,
Materials::get(
"SUS304"),
1009 "lv_board_connector_p1", 0, 0, 0);
1010 lv_board_connector_p1->SetVisAttributes(
att(
"connector"));
1012 new G4PVPlacement(G4Translate3D(-210 / 2 + 10 + 80 / 2, 0, -hbv / 2 + hboard + 20. / 2), lv_board_connector_p1,
1013 "pv_board_connector_p1", lsolid_board,
false, 0, overlap);
1014 new G4PVPlacement(G4Translate3D(210 / 2 - 10 - 80 / 2, 0, -hbv / 2 + hboard + 20. / 2), lv_board_connector_p1,
1015 "pv_board_connector_p1", lsolid_board,
false, 1, overlap);
1018 G4Transform3D tr = G4RotateZ3D(M_PI / 16) * G4ReflectY3D();
1019 acs->MakeImprint(innervolumesector_logical, tr, 0, overlap);
1020 tr = G4RotateZ3D(-M_PI / 16);
1021 acs->MakeImprint(innervolumesector_logical, tr, 1, overlap);
1026 G4VSolid* solid8_p1 =
new G4Tubs(
"fwd_solid8_p1", RI + tand(13.12) * (434 + 1) - 20 / cosd(13.12), 1415, 1. / 2, -M_PI / 16,
1028 G4VSolid* solid8_p2 =
new G4Box(
"fwd_solid8_p2", 130. / 2, 270. / 2, 2. / 2);
1029 G4VSolid* solid8_p3 =
new G4Tubs(
"fwd_solid8_p3", 0, 16, 2, 0, 2 * M_PI);
1030 G4VSolid* solid8_p4 =
new G4Box(
"fwd_solid8_p4", 130. / 2, (75. - 2 * 16.) / 2, 2. / 2);
1031 double width_p5 = 180;
1032 G4VSolid* solid8_p5 =
new G4Box(
"fwd_solid8_p5", width_p5 / 2, 2.5 + 75. / 2, 2. / 2);
1034 double xx0 = 1415 - 47.8715;
1035 G4VSolid* solid8 =
new G4SubtractionSolid(
"fwd_solid8", solid8_p1, solid8_p2, G4TranslateX3D(xx0 - 130. / 2));
1036 double xx1 = xx0 + 1.7;
1037 solid8 =
new G4SubtractionSolid(
"fwd_solid8", solid8, solid8_p3, G4Translate3D(xx1, 159.5, 0));
1038 solid8 =
new G4SubtractionSolid(
"fwd_solid8", solid8, solid8_p3, G4Translate3D(xx1, 202.5, 0));
1039 solid8 =
new G4SubtractionSolid(
"fwd_solid8", solid8, solid8_p4, G4Translate3D(xx1 - 16 + 130. / 2, (202.5 + 159.5) / 2, 0));
1040 solid8 =
new G4SubtractionSolid(
"fwd_solid8", solid8, solid8_p5, G4Translate3D(xx1 + width_p5 / 2, (202.5 + 159.5) / 2, 0));
1041 solid8 =
new G4SubtractionSolid(
"fwd_solid8", solid8, solid8_p5, G4Translate3D(xx1 - 130 + (1230.77 - 1230.88), -177.57,
1042 0)*G4RotateZ3D(-M_PI / 16)*G4Translate3D(width_p5 / 2, -75. / 2, 0));
1049 G4LogicalVolume* lsolid8 =
new G4LogicalVolume(solid8,
Materials::get(
"A5052"),
"lsolid8", 0, 0, 0);
1050 lsolid8->SetVisAttributes(
att(
"alum"));
1051 for (
int i = 0; i < 8; i++) {
1052 G4Transform3D tc = gTrans * G4Translate3D(0, 0, 3 + 434 + 0.5) * G4RotateZ3D(M_PI / 8 + i * M_PI / 4);
1053 new G4PVPlacement(tc * G4RotateZ3D(M_PI / 16), lsolid8, suf(
"ECL_Forward_cover", 0 + 2 * i), top,
false, 0 + 2 * i, overlap);
1054 G4ReflectionFactory::Instance()->Place(tc * G4RotateZ3D(-M_PI / 16)*G4ReflectY3D(), suf(
"ECL_Forward_cover", 0 + 2 * i), lsolid8,
1056 1 + 2 * i, overlap);
a Belle crystal in Geant4
double get_pa_box_height() const
Getter for preamplifier box height (hard-coded to be 2)
const G4VisAttributes * att(const std::string &n) const
Define visual attributes.
const ECLCrystalsShapeAndPosition * m_sap
pointer to a storage with crystal shapes and positions
G4LogicalVolume * get_preamp() const
Get Logical volume of preamplifier.
G4LogicalVolume * wrapped_crystal(const shape_t *s, const std::string &endcap, double wrapthickness)
Wrapped crystal.
void forward(G4LogicalVolume &)
Place elements inside the forward endcap.
static G4Material * get(const std::string &name)
Find given material.
double atan(double a)
atan for double
double sqrt(double a)
sqrt for double
Common code concerning the geometry representation of the detector.
Abstract base class for different kinds of events.
simple struct with z and r coordinates