11 #include <ir/geometry/GeoCryostatCreator.h>
12 #include <ir/simulation/SensitiveDetector.h>
14 #include <geometry/Materials.h>
15 #include <geometry/CreatorFactory.h>
16 #include <geometry/utilities.h>
17 #include <framework/gearbox/GearDir.h>
18 #include <framework/gearbox/Unit.h>
21 #include <boost/format.hpp>
22 #include <boost/foreach.hpp>
23 #include <boost/algorithm/string.hpp>
25 #include <G4LogicalVolume.hh>
26 #include <G4PVPlacement.hh>
30 #include <G4Polycone.hh>
31 #include <G4EllipticalTube.hh>
32 #include <G4UnionSolid.hh>
33 #include <G4IntersectionSolid.hh>
34 #include <G4SubtractionSolid.hh>
35 #include <G4UserLimits.hh>
38 using namespace boost;
47 using namespace geometry;
55 geometry::CreatorFactory<GeoCryostatCreator> GeoCryostatFactory(
"CryostatCreator");
61 GeoCryostatCreator::GeoCryostatCreator()
66 GeoCryostatCreator::~GeoCryostatCreator()
71 void GeoCryostatCreator::createGeometry(G4LogicalVolume& topVolume,
GeometryTypes)
150 double stepMax = 5.0 * Unit::mm;
151 int flag_limitStep = int(m_config.getParameter(
"LimitStepLength"));
153 const double unitFactor = Unit::cm / Unit::mm;
155 map<string, CryostatElement> elements;
157 GearDir her(
"/Detector/SuperKEKB/HER/");
158 GearDir ler(
"/Detector/SuperKEKB/LER/");
159 double crossingAngleHER = her.getDouble(
"angle");
160 double crossingAngleLER = ler.getDouble(
"angle");
162 G4Transform3D transform_HER = G4Translate3D(0., 0., 0.);
163 transform_HER = transform_HER * G4RotateY3D(crossingAngleHER);
165 G4Transform3D transform_LER = G4Translate3D(0., 0., 0.);
166 transform_LER = transform_LER * G4RotateY3D(crossingAngleLER);
173 std::string prep =
"TubeR.";
175 const int TubeR_N = int(m_config.getParameter(prep +
"N"));
177 std::vector<double> TubeR_Z(TubeR_N);
178 std::vector<double> TubeR_R(TubeR_N);
179 std::vector<double> TubeR_r(TubeR_N);
181 for (
int i = 0; i < TubeR_N; ++i) {
182 ostringstream ossZID;
185 ostringstream ossRID;
188 ostringstream ossrID;
191 TubeR_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
192 TubeR_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
193 TubeR_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
196 tubeR.
transform = G4Translate3D(0., 0., 0.);
197 tubeR.
geo =
new G4Polycone(
"geo_TubeR_name", 0, 2 * M_PI, TubeR_N, &(TubeR_Z[0]), &(TubeR_r[0]), &(TubeR_R[0]));
199 elements[
"TubeR"] = tubeR;
204 const int TubeR2_N = int(m_config.getParameter(prep +
"N"));
206 std::vector<double> TubeR2_Z(TubeR2_N);
207 std::vector<double> TubeR2_R(TubeR2_N);
208 std::vector<double> TubeR2_r(TubeR2_N);
210 for (
int i = 0; i < TubeR2_N; ++i) {
211 ostringstream ossZID;
214 ostringstream ossRID;
217 ostringstream ossrID;
220 TubeR2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
221 TubeR2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
222 TubeR2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
225 tubeR2.
transform = G4Translate3D(0., 0., 0.);
226 tubeR2.
geo =
new G4Polycone(
"geo_TubeR2_name", 0, 2 * M_PI, TubeR2_N, &(TubeR2_Z[0]), &(TubeR2_r[0]), &(TubeR2_R[0]));
228 elements[
"TubeR2"] = tubeR2;
233 const int TubeL_N = int(m_config.getParameter(prep +
"N"));
235 std::vector<double> TubeL_Z(TubeL_N);
236 std::vector<double> TubeL_R(TubeL_N);
237 std::vector<double> TubeL_r(TubeL_N);
239 for (
int i = 0; i < TubeL_N; ++i) {
240 ostringstream ossZID;
243 ostringstream ossRID;
246 ostringstream ossrID;
249 TubeL_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
250 TubeL_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
251 TubeL_r[i] = m_config.getParameter(prep + ossrID.str()) * unitFactor;
254 tubeL.
transform = G4Translate3D(0., 0., 0.);
255 tubeL.
geo =
new G4Polycone(
"geo_TubeL_name", 0, 2 * M_PI, TubeL_N, &(TubeL_Z[0]), &(TubeL_r[0]), &(TubeL_R[0]));
257 elements[
"TubeL"] = tubeL;
268 const int A1spc1_N = int(m_config.getParameter(prep +
"N"));
270 std::vector<double> A1spc1_Z(A1spc1_N);
271 std::vector<double> A1spc1_r(A1spc1_N);
272 std::vector<double> A1spc1_R(A1spc1_N);
274 for (
int i = 0; i < A1spc1_N; ++i) {
275 ostringstream ossZID;
278 ostringstream ossRID;
281 ostringstream ossrID;
284 A1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
285 A1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
286 A1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
290 G4Polycone* geo_A1spc1xx =
new G4Polycone(
"geo_A1spc1xx_name", 0, 2 * M_PI, A1spc1_N, &(A1spc1_Z[0]), &(A1spc1_r[0]),
296 const int A1spc2_N = int(m_config.getParameter(prep +
"N"));
298 std::vector<double> A1spc2_Z(A1spc2_N);
299 std::vector<double> A1spc2_R(A1spc2_N);
300 std::vector<double> A1spc2_r(A1spc2_N);
302 for (
int i = 0; i < A1spc2_N; ++i) {
303 ostringstream ossZID;
306 ostringstream ossRID;
309 ostringstream ossrID;
312 A1spc2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
313 A1spc2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
314 A1spc2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
318 G4Polycone* geo_A1spc2xx =
new G4Polycone(
"geo_A1spc2xx_name", 0, 2 * M_PI, A1spc2_N, &(A1spc2_Z[0]), &(A1spc2_r[0]),
324 const int B1spc1_N = int(m_config.getParameter(prep +
"N"));
326 std::vector<double> B1spc1_Z(B1spc1_N);
327 std::vector<double> B1spc1_R(B1spc1_N);
328 std::vector<double> B1spc1_r(B1spc1_N);
330 for (
int i = 0; i < B1spc1_N; ++i) {
331 ostringstream ossZID;
334 ostringstream ossRID;
337 ostringstream ossrID;
340 B1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
341 B1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
342 B1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
346 G4Polycone* geo_B1spc1xx =
new G4Polycone(
"geo_B1spc1xx_name", 0, 2 * M_PI, B1spc1_N, &(B1spc1_Z[0]), &(B1spc1_r[0]),
352 const int B1spc2_N = int(m_config.getParameter(prep +
"N"));
354 std::vector<double> B1spc2_Z(B1spc2_N);
355 std::vector<double> B1spc2_R(B1spc2_N);
356 std::vector<double> B1spc2_r(B1spc2_N);
358 for (
int i = 0; i < B1spc2_N; ++i) {
359 ostringstream ossZID;
362 ostringstream ossRID;
365 ostringstream ossrID;
368 B1spc2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
369 B1spc2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
370 B1spc2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
374 G4Polycone* geo_B1spc2xx =
new G4Polycone(
"geo_B1spc2xx_name", 0, 2 * M_PI, B1spc2_N, &(B1spc2_Z[0]), &(B1spc2_r[0]),
378 B1spc2.
geo =
new G4IntersectionSolid(
"geo_B1spc2_name", geo_B1spc2xx, elements[
"TubeR2"].geo, B1spc2.
transform.inverse());
381 G4IntersectionSolid* geo_B1spc1x =
new G4IntersectionSolid(
"geo_B1spc1x_name", geo_B1spc1xx, elements[
"TubeR"].geo,
383 B1spc1.
geo =
new G4UnionSolid(
"geo_B1spc1_name", geo_B1spc1x, B1spc2.
geo);
385 A1spc2.
geo =
new G4IntersectionSolid(
"geo_A1spc2_name", geo_A1spc2xx, elements[
"TubeR2"].geo, A1spc2.
transform.inverse());
388 G4IntersectionSolid* geo_A1spc1xy =
new G4IntersectionSolid(
"geo_A1spc1xy_name", geo_A1spc1xx, elements[
"TubeR"].geo,
390 G4UnionSolid* geo_A1spc1x =
new G4UnionSolid(
"geo_A1spc1x_name", geo_A1spc1xy, A1spc2.
geo);
391 A1spc1.
geo =
new G4SubtractionSolid(
"geo_A1spc1_name", geo_A1spc1x, B1spc1.
geo, A1spc1.
transform.inverse()*B1spc1.
transform);
393 string strMat_A1spc1 = m_config.getParameterStr(
"A1spc1.Material");
394 G4Material* mat_A1spc1 = Materials::get(strMat_A1spc1);
395 A1spc1.
logi =
new G4LogicalVolume(A1spc1.
geo, mat_A1spc1,
"logi_A1spc1_name");
397 A1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
402 new G4PVPlacement(A1spc1.
transform, A1spc1.
logi,
"phys_A1spc1_name", &topVolume,
false, 0);
404 string strMat_B1spc1 = m_config.getParameterStr(
"B1spc1.Material");
405 G4Material* mat_B1spc1 = Materials::get(strMat_B1spc1);
406 B1spc1.
logi =
new G4LogicalVolume(B1spc1.
geo, mat_B1spc1,
"logi_B1spc1_name");
408 B1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
413 new G4PVPlacement(B1spc1.
transform, B1spc1.
logi,
"phys_B1spc1_name", &topVolume,
false, 0);
415 elements[
"A1spc1"] = A1spc1;
416 elements[
"A1spc2"] = A1spc2;
417 elements[
"B1spc1"] = B1spc1;
418 elements[
"B1spc2"] = B1spc2;
426 const int C1wal1_N = m_config.getParameter(prep +
"N");
428 std::vector<double> C1wal1_Z(C1wal1_N);
429 std::vector<double> C1wal1_R(C1wal1_N);
430 std::vector<double> C1wal1_r(C1wal1_N);
432 for (
int i = 0; i < C1wal1_N; ++i) {
433 ostringstream ossZID;
436 ostringstream ossRID;
439 ostringstream ossrID;
442 C1wal1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
443 C1wal1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
444 C1wal1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
447 C1wal1.
transform = G4Translate3D(0., 0., 0.);
450 G4Polycone* geo_C1wal1xxx =
new G4Polycone(
"geo_C1wal1xxx_name", 0, 2 * M_PI, C1wal1_N, &(C1wal1_Z[0]), &(C1wal1_r[0]),
452 G4IntersectionSolid* geo_C1wal1xx =
new G4IntersectionSolid(
"geo_C1wal1xx_name", geo_C1wal1xxx, elements[
"TubeR"].geo,
453 elements[
"TubeR"].transform);
454 G4SubtractionSolid* geo_C1wal1x =
new G4SubtractionSolid(
"geo_C1wal1x_name", geo_C1wal1xx, elements[
"A1spc1"].geo,
455 elements[
"A1spc1"].transform);
456 C1wal1.
geo =
new G4SubtractionSolid(
"geo_C1wal1_name", geo_C1wal1x, elements[
"B1spc1"].geo, elements[
"B1spc1"].transform);
458 string strMat_C1wal1 = m_config.getParameterStr(prep +
"Material");
459 G4Material* mat_C1wal1 = Materials::get(strMat_C1wal1);
460 C1wal1.
logi =
new G4LogicalVolume(C1wal1.
geo, mat_C1wal1,
"logi_C1wal1_name");
465 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), C1wal1.
logi,
"phys_C1wal1_name", &topVolume,
false, 0);
467 elements[
"C1wal1"] = C1wal1;
475 const int D1spc1_N = m_config.getParameter(prep +
"N");
477 std::vector<double> D1spc1_Z(D1spc1_N);
478 std::vector<double> D1spc1_r(D1spc1_N);
479 std::vector<double> D1spc1_R(D1spc1_N);
481 for (
int i = 0; i < D1spc1_N; ++i) {
482 ostringstream ossZID;
485 ostringstream ossRID;
488 ostringstream ossrID;
491 D1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
492 D1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
493 D1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
497 G4Polycone* geo_D1spc1xx =
new G4Polycone(
"geo_D1spc1xx_name", 0, 2 * M_PI, D1spc1_N, &(D1spc1_Z[0]), &(D1spc1_r[0]),
503 const int E1spc1_N = int(m_config.getParameter(prep +
"N"));
505 std::vector<double> E1spc1_Z(E1spc1_N);
506 std::vector<double> E1spc1_R(E1spc1_N);
507 std::vector<double> E1spc1_r(E1spc1_N);
509 for (
int i = 0; i < E1spc1_N; ++i) {
510 ostringstream ossZID;
513 ostringstream ossRID;
516 ostringstream ossrID;
519 E1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
520 E1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
521 E1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
525 G4Polycone* geo_E1spc1xx =
new G4Polycone(
"geo_E1spc1xx_name", 0, 2 * M_PI, E1spc1_N, &(E1spc1_Z[0]), &(E1spc1_r[0]),
529 G4IntersectionSolid* geo_D1spc1x =
new G4IntersectionSolid(
"geo_D1spc1x_name", geo_D1spc1xx, elements[
"TubeL"].geo,
531 E1spc1.
geo =
new G4IntersectionSolid(
"geo_E1spc1_name", geo_E1spc1xx, elements[
"TubeL"].geo, E1spc1.
transform.inverse());
532 D1spc1.
geo =
new G4SubtractionSolid(
"geo_D1spc1_name", geo_D1spc1x, E1spc1.
geo, D1spc1.
transform.inverse()*E1spc1.
transform);
534 string strMat_D1spc1 = m_config.getParameterStr(
"D1spc1.Material");
535 G4Material* mat_D1spc1 = Materials::get(strMat_D1spc1);
536 D1spc1.
logi =
new G4LogicalVolume(D1spc1.
geo, mat_D1spc1,
"logi_D1spc1_name");
538 D1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
543 new G4PVPlacement(D1spc1.
transform, D1spc1.
logi,
"phys_D1spc1_name", &topVolume,
false, 0);
545 string strMat_E1spc1 = m_config.getParameterStr(prep +
"Material");
546 G4Material* mat_E1spc1 = Materials::get(strMat_E1spc1);
547 E1spc1.
logi =
new G4LogicalVolume(E1spc1.
geo, mat_E1spc1,
"logi_E1spc1_name");
549 E1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
554 new G4PVPlacement(E1spc1.
transform, E1spc1.
logi,
"phys_E1spc1_name", &topVolume,
false, 0);
556 elements[
"E1spc1"] = E1spc1;
557 elements[
"D1spc1"] = D1spc1;
566 const int F1wal1_N = int(m_config.getParameter(prep +
"N"));
568 std::vector<double> F1wal1_Z(F1wal1_N);
569 std::vector<double> F1wal1_R(F1wal1_N);
570 std::vector<double> F1wal1_r(F1wal1_N);
572 for (
int i = 0; i < F1wal1_N; ++i) {
573 ostringstream ossZID;
576 ostringstream ossRID;
579 ostringstream ossrID;
582 F1wal1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
583 F1wal1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
584 F1wal1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
587 F1wal1.
transform = G4Translate3D(0., 0., 0.);
590 G4Polycone* geo_F1wal1xxx =
new G4Polycone(
"geo_F1wal1xxx_name", 0, 2 * M_PI, F1wal1_N, &(F1wal1_Z[0]), &(F1wal1_r[0]),
592 G4IntersectionSolid* geo_F1wal1xx =
new G4IntersectionSolid(
"geo_F1wal1xx_name", geo_F1wal1xxx, elements[
"TubeL"].geo,
593 elements[
"TubeL"].transform);
594 G4SubtractionSolid* geo_F1wal1x =
new G4SubtractionSolid(
"geo_F1wal1x_name", geo_F1wal1xx, elements[
"D1spc1"].geo,
595 elements[
"D1spc1"].transform);
596 F1wal1.
geo =
new G4SubtractionSolid(
"geo_F1wal1_name", geo_F1wal1x, elements[
"E1spc1"].geo, elements[
"E1spc1"].transform);
598 string strMat_F1wal1 = m_config.getParameterStr(prep +
"Material");
599 G4Material* mat_F1wal1 = Materials::get(strMat_F1wal1);
600 F1wal1.
logi =
new G4LogicalVolume(F1wal1.
geo, mat_F1wal1,
"logi_F1wal1_name");
605 new G4PVPlacement(F1wal1.
transform, F1wal1.
logi,
"phys_F1wal1_name", &topVolume,
false, 0);
607 elements[
"F1wal1"] = F1wal1;
612 std::vector<std::string> straightSections;
613 boost::split(straightSections, m_config.getParameterStr(
"Straight"), boost::is_any_of(
" "));
614 for (
const auto& name : straightSections) {
619 int N = int(m_config.getParameter(prep +
"N"));
621 std::vector<double> Z(N);
622 std::vector<double> R(N);
623 std::vector<double> r(N);
625 for (
int i = 0; i < N; ++i) {
626 ostringstream ossZID;
629 ostringstream ossRID;
632 ostringstream ossrID;
635 Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
636 R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
637 r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
640 polycone.
transform = G4Translate3D(0.0, 0.0, 0.0);
643 string motherVolume = m_config.getParameterStr(prep +
"MotherVolume");
644 string subtract = m_config.getParameterStr(prep +
"Subtract",
"");
645 string intersect = m_config.getParameterStr(prep +
"Intersect",
"");
647 string geo_polyconexx_name =
"geo_" + name +
"xx_name";
648 string geo_polyconex_name =
"geo_" + name +
"x_name";
649 string geo_polycone_name =
"geo_" + name +
"_name";
651 G4VSolid* geo_polyconexx, *geo_polycone;
654 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
655 G4VSolid* geo_polyconex =
new G4SubtractionSolid(geo_polyconex_name, geo_polyconexx, elements[subtract].geo,
656 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[subtract].transform);
657 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconex, elements[
intersect].geo,
658 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[
intersect].transform);
659 }
else if (subtract !=
"") {
660 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
661 geo_polycone =
new G4SubtractionSolid(geo_polycone_name, geo_polyconexx, elements[subtract].geo,
662 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[subtract].transform);
664 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
665 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconexx, elements[
intersect].geo,
666 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[
intersect].transform);
668 geo_polycone =
new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(R[0]));
670 polycone.
geo = geo_polycone;
673 string strMat_polycone = m_config.getParameterStr(prep +
"Material");
674 G4Material* mat_polycone = Materials::get(strMat_polycone);
675 string logi_polycone_name =
"logi_" + name +
"_name";
676 polycone.
logi =
new G4LogicalVolume(polycone.
geo, mat_polycone, logi_polycone_name);
681 string phys_polycone_name =
"phys_" + name +
"_name";
682 new G4PVPlacement(polycone.
transform, polycone.
logi, phys_polycone_name, elements[motherVolume].logi,
false, 0);
687 elements[name] = polycone;
691 G4Tubs* geo_rvcR =
new G4Tubs(
"geo_rvcR", 60, 60 + 60, (620 - 560) / 2., 0, 2 * M_PI);
692 G4LogicalVolume* logi_rvcR =
new G4LogicalVolume(geo_rvcR, Materials::get(
"SUS316L"),
"logi_rvcR_name");
693 new G4PVPlacement(0, G4ThreeVector(0, 0, (620 + 560) / 2.), logi_rvcR,
"phys_rvcR_name", &topVolume,
false, 0);
695 G4Tubs* geo_rvcL =
new G4Tubs(
"geo_rvcL", 60, 60 + 60, (-560 - (-620)) / 2., 0, 2 * M_PI);
696 G4LogicalVolume* logi_rvcL =
new G4LogicalVolume(geo_rvcL, Materials::get(
"SUS316L"),
"logi_rvcL_name");
697 new G4PVPlacement(0, G4ThreeVector(0, 0, (-620 - 560) / 2.), logi_rvcL,
"phys_rvcL_name", &topVolume,
false, 0);
701 G4EllipticalTube* geo_elp_QC1LEx =
new G4EllipticalTube(
"geo_elp_QC1LEx", 10.5, 13.5, (-675 - (-1225)) / 2.);
702 G4IntersectionSolid* geo_elp_QC1LE =
new G4IntersectionSolid(
"geo_elp_QC1LE", elements[
"D2wal1"].geo, geo_elp_QC1LEx,
703 G4Translate3D(0, 0, (-675 - 1225) / 2.));
704 G4LogicalVolume* logi_elp_QC1LE =
new G4LogicalVolume(geo_elp_QC1LE, Materials::get(
"Vacuum"),
"logi_elp_QC1LE_name");
705 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LE,
"phys_elp_QC1LE_name", elements[
"D2wal1"].logi,
false, 0);
707 G4EllipticalTube* geo_elp_QC1LPx =
new G4EllipticalTube(
"geo_elp_QC1LPx", 10.5, 13.5, (-675 - (-1225)) / 2.);
708 G4IntersectionSolid* geo_elp_QC1LP =
new G4IntersectionSolid(
"geo_elp_QC1LP", elements[
"E2wal1"].geo, geo_elp_QC1LPx,
709 G4Translate3D(0, 0, (-675 - 1225) / 2.));
710 G4LogicalVolume* logi_elp_QC1LP =
new G4LogicalVolume(geo_elp_QC1LP, Materials::get(
"Vacuum"),
"logi_elp_QC1LP_name");
711 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LP,
"phys_elp_QC1LP_name", elements[
"E2wal1"].logi,
false, 0);
713 G4EllipticalTube* geo_elp_QC1REx =
new G4EllipticalTube(
"geo_elp_QC1REx", 10.5, 13.5, (1225 - 675) / 2.);
714 G4IntersectionSolid* geo_elp_QC1RE =
new G4IntersectionSolid(
"geo_elp_QC1RE", elements[
"A2wal1"].geo, geo_elp_QC1REx,
715 G4Translate3D(0, 0, (1225 + 675) / 2.));
716 G4LogicalVolume* logi_elp_QC1RE =
new G4LogicalVolume(geo_elp_QC1RE, Materials::get(
"Vacuum"),
"logi_elp_QC1RE_name");
717 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RE,
"phys_elp_QC1RE_name", elements[
"A2wal1"].logi,
false, 0);
719 G4EllipticalTube* geo_elp_QC1RPx =
new G4EllipticalTube(
"geo_elp_QC1RPx", 10.5, 13.5, (1225 - 675) / 2.);
720 G4IntersectionSolid* geo_elp_QC1RP =
new G4IntersectionSolid(
"geo_elp_QC1RP", elements[
"B2wal1"].geo, geo_elp_QC1RPx,
721 G4Translate3D(0, 0, (1225 + 675) / 2.));
722 G4LogicalVolume* logi_elp_QC1RP =
new G4LogicalVolume(geo_elp_QC1RP, Materials::get(
"Vacuum"),
"logi_elp_QC1RP_name");
723 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RP,
"phys_elp_QC1RP_name", elements[
"B2wal1"].logi,
false, 0);