9 #include <ir/geometry/GeoCryostatCreator.h>
10 #include <ir/simulation/SensitiveDetector.h>
12 #include <geometry/Materials.h>
13 #include <geometry/CreatorFactory.h>
14 #include <geometry/utilities.h>
15 #include <framework/gearbox/Unit.h>
18 #include <boost/format.hpp>
19 #include <boost/foreach.hpp>
20 #include <boost/algorithm/string.hpp>
22 #include <G4LogicalVolume.hh>
23 #include <G4PVPlacement.hh>
29 #include <G4Polycone.hh>
30 #include <G4EllipticalTube.hh>
31 #include <G4UnionSolid.hh>
32 #include <G4IntersectionSolid.hh>
33 #include <G4SubtractionSolid.hh>
34 #include <G4UserLimits.hh>
37 using namespace boost;
46 using namespace geometry;
54 geometry::CreatorFactory<GeoCryostatCreator> GeoCryostatFactory(
"CryostatCreator");
60 GeoCryostatCreator::GeoCryostatCreator()
65 GeoCryostatCreator::~GeoCryostatCreator()
70 void GeoCryostatCreator::createGeometry(G4LogicalVolume& topVolume,
GeometryTypes)
149 double stepMax = 5.0 * Unit::mm;
150 int flag_limitStep = int(m_config.getParameter(
"LimitStepLength"));
152 const double unitFactor = Unit::cm / Unit::mm;
154 double crossingAngleHER = m_config.getParameter(
"CrossingAngle.HER", 0.0415);
155 double crossingAngleLER = m_config.getParameter(
"CrossingAngle.LER", -0.0415);
157 G4Transform3D transform_HER = G4Translate3D(0., 0., 0.);
158 transform_HER = transform_HER * G4RotateY3D(crossingAngleHER);
160 G4Transform3D transform_LER = G4Translate3D(0., 0., 0.);
161 transform_LER = transform_LER * G4RotateY3D(crossingAngleLER);
163 map<string, CryostatElement> elements;
170 std::string prep =
"TubeR.";
172 const int TubeR_N = int(m_config.getParameter(prep +
"N"));
174 std::vector<double> TubeR_Z(TubeR_N);
175 std::vector<double> TubeR_R(TubeR_N);
176 std::vector<double> TubeR_r(TubeR_N);
178 for (
int i = 0; i < TubeR_N; ++i) {
179 ostringstream ossZID;
182 ostringstream ossRID;
185 ostringstream ossrID;
188 TubeR_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
189 TubeR_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
190 TubeR_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
193 tubeR.
transform = G4Translate3D(0., 0., 0.);
194 tubeR.
geo =
new G4Polycone(
"geo_TubeR_name", 0, 2 * M_PI, TubeR_N, &(TubeR_Z[0]), &(TubeR_r[0]), &(TubeR_R[0]));
196 elements[
"TubeR"] = tubeR;
201 const int TubeR2_N = int(m_config.getParameter(prep +
"N"));
203 std::vector<double> TubeR2_Z(TubeR2_N);
204 std::vector<double> TubeR2_R(TubeR2_N);
205 std::vector<double> TubeR2_r(TubeR2_N);
207 for (
int i = 0; i < TubeR2_N; ++i) {
208 ostringstream ossZID;
211 ostringstream ossRID;
214 ostringstream ossrID;
217 TubeR2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
218 TubeR2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
219 TubeR2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
222 tubeR2.
transform = G4Translate3D(0., 0., 0.);
223 tubeR2.
geo =
new G4Polycone(
"geo_TubeR2_name", 0, 2 * M_PI, TubeR2_N, &(TubeR2_Z[0]), &(TubeR2_r[0]), &(TubeR2_R[0]));
225 elements[
"TubeR2"] = tubeR2;
230 const int TubeL_N = int(m_config.getParameter(prep +
"N"));
232 std::vector<double> TubeL_Z(TubeL_N);
233 std::vector<double> TubeL_R(TubeL_N);
234 std::vector<double> TubeL_r(TubeL_N);
236 for (
int i = 0; i < TubeL_N; ++i) {
237 ostringstream ossZID;
240 ostringstream ossRID;
243 ostringstream ossrID;
246 TubeL_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
247 TubeL_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
248 TubeL_r[i] = m_config.getParameter(prep + ossrID.str()) * unitFactor;
251 tubeL.
transform = G4Translate3D(0., 0., 0.);
252 tubeL.
geo =
new G4Polycone(
"geo_TubeL_name", 0, 2 * M_PI, TubeL_N, &(TubeL_Z[0]), &(TubeL_r[0]), &(TubeL_R[0]));
254 elements[
"TubeL"] = tubeL;
265 const int A1spc1_N = int(m_config.getParameter(prep +
"N"));
267 std::vector<double> A1spc1_Z(A1spc1_N);
268 std::vector<double> A1spc1_r(A1spc1_N);
269 std::vector<double> A1spc1_R(A1spc1_N);
271 for (
int i = 0; i < A1spc1_N; ++i) {
272 ostringstream ossZID;
275 ostringstream ossRID;
278 ostringstream ossrID;
281 A1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
282 A1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
283 A1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
287 G4Polycone* geo_A1spc1xx =
new G4Polycone(
"geo_A1spc1xx_name", 0, 2 * M_PI, A1spc1_N, &(A1spc1_Z[0]), &(A1spc1_r[0]),
293 const int A1spc2_N = int(m_config.getParameter(prep +
"N"));
295 std::vector<double> A1spc2_Z(A1spc2_N);
296 std::vector<double> A1spc2_R(A1spc2_N);
297 std::vector<double> A1spc2_r(A1spc2_N);
299 for (
int i = 0; i < A1spc2_N; ++i) {
300 ostringstream ossZID;
303 ostringstream ossRID;
306 ostringstream ossrID;
309 A1spc2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
310 A1spc2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
311 A1spc2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
315 G4Polycone* geo_A1spc2xx =
new G4Polycone(
"geo_A1spc2xx_name", 0, 2 * M_PI, A1spc2_N, &(A1spc2_Z[0]), &(A1spc2_r[0]),
321 const int B1spc1_N = int(m_config.getParameter(prep +
"N"));
323 std::vector<double> B1spc1_Z(B1spc1_N);
324 std::vector<double> B1spc1_R(B1spc1_N);
325 std::vector<double> B1spc1_r(B1spc1_N);
327 for (
int i = 0; i < B1spc1_N; ++i) {
328 ostringstream ossZID;
331 ostringstream ossRID;
334 ostringstream ossrID;
337 B1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
338 B1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
339 B1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
343 G4Polycone* geo_B1spc1xx =
new G4Polycone(
"geo_B1spc1xx_name", 0, 2 * M_PI, B1spc1_N, &(B1spc1_Z[0]), &(B1spc1_r[0]),
349 const int B1spc2_N = int(m_config.getParameter(prep +
"N"));
351 std::vector<double> B1spc2_Z(B1spc2_N);
352 std::vector<double> B1spc2_R(B1spc2_N);
353 std::vector<double> B1spc2_r(B1spc2_N);
355 for (
int i = 0; i < B1spc2_N; ++i) {
356 ostringstream ossZID;
359 ostringstream ossRID;
362 ostringstream ossrID;
365 B1spc2_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
366 B1spc2_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
367 B1spc2_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
371 G4Polycone* geo_B1spc2xx =
new G4Polycone(
"geo_B1spc2xx_name", 0, 2 * M_PI, B1spc2_N, &(B1spc2_Z[0]), &(B1spc2_r[0]),
375 B1spc2.
geo =
new G4IntersectionSolid(
"geo_B1spc2_name", geo_B1spc2xx, elements[
"TubeR2"].geo, B1spc2.
transform.inverse());
378 G4IntersectionSolid* geo_B1spc1x =
new G4IntersectionSolid(
"geo_B1spc1x_name", geo_B1spc1xx, elements[
"TubeR"].geo,
380 B1spc1.
geo =
new G4UnionSolid(
"geo_B1spc1_name", geo_B1spc1x, B1spc2.
geo);
382 A1spc2.
geo =
new G4IntersectionSolid(
"geo_A1spc2_name", geo_A1spc2xx, elements[
"TubeR2"].geo, A1spc2.
transform.inverse());
385 G4IntersectionSolid* geo_A1spc1xy =
new G4IntersectionSolid(
"geo_A1spc1xy_name", geo_A1spc1xx, elements[
"TubeR"].geo,
387 G4UnionSolid* geo_A1spc1x =
new G4UnionSolid(
"geo_A1spc1x_name", geo_A1spc1xy, A1spc2.
geo);
388 A1spc1.
geo =
new G4SubtractionSolid(
"geo_A1spc1_name", geo_A1spc1x, B1spc1.
geo, A1spc1.
transform.inverse()*B1spc1.
transform);
390 string strMat_A1spc1 = m_config.getParameterStr(
"A1spc1.Material");
391 G4Material* mat_A1spc1 = Materials::get(strMat_A1spc1);
392 A1spc1.
logi =
new G4LogicalVolume(A1spc1.
geo, mat_A1spc1,
"logi_A1spc1_name");
394 A1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
399 new G4PVPlacement(A1spc1.
transform, A1spc1.
logi,
"phys_A1spc1_name", &topVolume,
false, 0);
401 string strMat_B1spc1 = m_config.getParameterStr(
"B1spc1.Material");
402 G4Material* mat_B1spc1 = Materials::get(strMat_B1spc1);
403 B1spc1.
logi =
new G4LogicalVolume(B1spc1.
geo, mat_B1spc1,
"logi_B1spc1_name");
405 B1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
410 new G4PVPlacement(B1spc1.
transform, B1spc1.
logi,
"phys_B1spc1_name", &topVolume,
false, 0);
412 elements[
"A1spc1"] = A1spc1;
413 elements[
"A1spc2"] = A1spc2;
414 elements[
"B1spc1"] = B1spc1;
415 elements[
"B1spc2"] = B1spc2;
423 const int C1wal1_N = m_config.getParameter(prep +
"N");
425 std::vector<double> C1wal1_Z(C1wal1_N);
426 std::vector<double> C1wal1_R(C1wal1_N);
427 std::vector<double> C1wal1_r(C1wal1_N);
429 for (
int i = 0; i < C1wal1_N; ++i) {
430 ostringstream ossZID;
433 ostringstream ossRID;
436 ostringstream ossrID;
439 C1wal1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
440 C1wal1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
441 C1wal1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
444 C1wal1.
transform = G4Translate3D(0., 0., 0.);
447 G4Polycone* geo_C1wal1xxx =
new G4Polycone(
"geo_C1wal1xxx_name", 0, 2 * M_PI, C1wal1_N, &(C1wal1_Z[0]), &(C1wal1_r[0]),
449 G4IntersectionSolid* geo_C1wal1xx =
new G4IntersectionSolid(
"geo_C1wal1xx_name", geo_C1wal1xxx, elements[
"TubeR"].geo,
450 elements[
"TubeR"].transform);
451 G4SubtractionSolid* geo_C1wal1x =
new G4SubtractionSolid(
"geo_C1wal1x_name", geo_C1wal1xx, elements[
"A1spc1"].geo,
452 elements[
"A1spc1"].transform);
453 C1wal1.
geo =
new G4SubtractionSolid(
"geo_C1wal1_name", geo_C1wal1x, elements[
"B1spc1"].geo, elements[
"B1spc1"].transform);
455 string strMat_C1wal1 = m_config.getParameterStr(prep +
"Material");
456 G4Material* mat_C1wal1 = Materials::get(strMat_C1wal1);
457 C1wal1.
logi =
new G4LogicalVolume(C1wal1.
geo, mat_C1wal1,
"logi_C1wal1_name");
462 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), C1wal1.
logi,
"phys_C1wal1_name", &topVolume,
false, 0);
464 elements[
"C1wal1"] = C1wal1;
472 const int D1spc1_N = m_config.getParameter(prep +
"N");
474 std::vector<double> D1spc1_Z(D1spc1_N);
475 std::vector<double> D1spc1_r(D1spc1_N);
476 std::vector<double> D1spc1_R(D1spc1_N);
478 for (
int i = 0; i < D1spc1_N; ++i) {
479 ostringstream ossZID;
482 ostringstream ossRID;
485 ostringstream ossrID;
488 D1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
489 D1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
490 D1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
494 G4Polycone* geo_D1spc1xx =
new G4Polycone(
"geo_D1spc1xx_name", 0, 2 * M_PI, D1spc1_N, &(D1spc1_Z[0]), &(D1spc1_r[0]),
500 const int E1spc1_N = int(m_config.getParameter(prep +
"N"));
502 std::vector<double> E1spc1_Z(E1spc1_N);
503 std::vector<double> E1spc1_R(E1spc1_N);
504 std::vector<double> E1spc1_r(E1spc1_N);
506 for (
int i = 0; i < E1spc1_N; ++i) {
507 ostringstream ossZID;
510 ostringstream ossRID;
513 ostringstream ossrID;
516 E1spc1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
517 E1spc1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
518 E1spc1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
522 G4Polycone* geo_E1spc1xx =
new G4Polycone(
"geo_E1spc1xx_name", 0, 2 * M_PI, E1spc1_N, &(E1spc1_Z[0]), &(E1spc1_r[0]),
526 G4IntersectionSolid* geo_D1spc1x =
new G4IntersectionSolid(
"geo_D1spc1x_name", geo_D1spc1xx, elements[
"TubeL"].geo,
528 E1spc1.
geo =
new G4IntersectionSolid(
"geo_E1spc1_name", geo_E1spc1xx, elements[
"TubeL"].geo, E1spc1.
transform.inverse());
529 D1spc1.
geo =
new G4SubtractionSolid(
"geo_D1spc1_name", geo_D1spc1x, E1spc1.
geo, D1spc1.
transform.inverse()*E1spc1.
transform);
531 string strMat_D1spc1 = m_config.getParameterStr(
"D1spc1.Material");
532 G4Material* mat_D1spc1 = Materials::get(strMat_D1spc1);
533 D1spc1.
logi =
new G4LogicalVolume(D1spc1.
geo, mat_D1spc1,
"logi_D1spc1_name");
535 D1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
540 new G4PVPlacement(D1spc1.
transform, D1spc1.
logi,
"phys_D1spc1_name", &topVolume,
false, 0);
542 string strMat_E1spc1 = m_config.getParameterStr(prep +
"Material");
543 G4Material* mat_E1spc1 = Materials::get(strMat_E1spc1);
544 E1spc1.
logi =
new G4LogicalVolume(E1spc1.
geo, mat_E1spc1,
"logi_E1spc1_name");
546 E1spc1.
logi->SetUserLimits(
new G4UserLimits(stepMax));
551 new G4PVPlacement(E1spc1.
transform, E1spc1.
logi,
"phys_E1spc1_name", &topVolume,
false, 0);
553 elements[
"E1spc1"] = E1spc1;
554 elements[
"D1spc1"] = D1spc1;
563 const int F1wal1_N = int(m_config.getParameter(prep +
"N"));
565 std::vector<double> F1wal1_Z(F1wal1_N);
566 std::vector<double> F1wal1_R(F1wal1_N);
567 std::vector<double> F1wal1_r(F1wal1_N);
569 for (
int i = 0; i < F1wal1_N; ++i) {
570 ostringstream ossZID;
573 ostringstream ossRID;
576 ostringstream ossrID;
579 F1wal1_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
580 F1wal1_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
581 F1wal1_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
584 F1wal1.
transform = G4Translate3D(0., 0., 0.);
587 G4Polycone* geo_F1wal1xxx =
new G4Polycone(
"geo_F1wal1xxx_name", 0, 2 * M_PI, F1wal1_N, &(F1wal1_Z[0]), &(F1wal1_r[0]),
589 G4IntersectionSolid* geo_F1wal1xx =
new G4IntersectionSolid(
"geo_F1wal1xx_name", geo_F1wal1xxx, elements[
"TubeL"].geo,
590 elements[
"TubeL"].transform);
591 G4SubtractionSolid* geo_F1wal1x =
new G4SubtractionSolid(
"geo_F1wal1x_name", geo_F1wal1xx, elements[
"D1spc1"].geo,
592 elements[
"D1spc1"].transform);
593 F1wal1.
geo =
new G4SubtractionSolid(
"geo_F1wal1_name", geo_F1wal1x, elements[
"E1spc1"].geo, elements[
"E1spc1"].transform);
595 string strMat_F1wal1 = m_config.getParameterStr(prep +
"Material");
596 G4Material* mat_F1wal1 = Materials::get(strMat_F1wal1);
597 F1wal1.
logi =
new G4LogicalVolume(F1wal1.
geo, mat_F1wal1,
"logi_F1wal1_name");
602 new G4PVPlacement(F1wal1.
transform, F1wal1.
logi,
"phys_F1wal1_name", &topVolume,
false, 0);
604 elements[
"F1wal1"] = F1wal1;
610 std::vector<std::string> supports;
611 boost::split(supports, m_config.getParameterStr(
"Support"), boost::is_any_of(
" "));
612 for (
const auto& name : supports) {
617 double box_W = m_config.getParameter(prep +
"W") * unitFactor;
618 double box_H = m_config.getParameter(prep +
"H") * unitFactor;
619 double box_L = m_config.getParameter(prep +
"L") * unitFactor;
620 double box_X0 = m_config.getParameter(prep +
"X0") * unitFactor;
621 double box_Y0 = m_config.getParameter(prep +
"Y0") * unitFactor;
622 double box_Z0 = m_config.getParameter(prep +
"Z0") * unitFactor;
624 double trd_W1 = m_config.getParameter(prep +
"trdW1") * unitFactor;
625 double trd_W2 = m_config.getParameter(prep +
"trdW2") * unitFactor;
626 double trd_L = m_config.getParameter(prep +
"trdL") * unitFactor;
627 double trd_H = m_config.getParameter(prep +
"trdH") * unitFactor;
628 double trd_X0 = m_config.getParameter(prep +
"trdX0") * unitFactor;
629 double trd_Y0 = m_config.getParameter(prep +
"trdY0") * unitFactor;
630 double trd_Z0 = m_config.getParameter(prep +
"trdZ0") * unitFactor;
632 double hole_W = m_config.getParameter(prep +
"holeW") * unitFactor;
633 double hole_H = m_config.getParameter(prep +
"holeH") * unitFactor;
634 double hole_L = m_config.getParameter(prep +
"holeL") * unitFactor;
635 double hole_dX = m_config.getParameter(prep +
"holeDX") * unitFactor;
636 double hole_dY = m_config.getParameter(prep +
"holeDY") * unitFactor;
637 double hole_dZ = m_config.getParameter(prep +
"holeDZ") * unitFactor;
639 double trd_hole_W = m_config.getParameter(prep +
"trdHoleW") * unitFactor;
640 double trd_hole_H = m_config.getParameter(prep +
"trdHoleH") * unitFactor;
641 double trd_hole_L = m_config.getParameter(prep +
"trdHoleL") * unitFactor;
642 double trd_hole_dX = m_config.getParameter(prep +
"trdHoleDX") * unitFactor;
643 double trd_hole_dY = m_config.getParameter(prep +
"trdHoleDY") * unitFactor;
644 double trd_hole_dZ = m_config.getParameter(prep +
"trdHoleDZ") * unitFactor;
646 double disk_r = m_config.getParameter(prep +
"r") * unitFactor;
647 double disk_t = m_config.getParameter(prep +
"t") * unitFactor;
648 double disk_dX = m_config.getParameter(prep +
"diskDX") * unitFactor;
649 double disk_dY = m_config.getParameter(prep +
"diskDY") * unitFactor;
650 double disk_dZ = m_config.getParameter(prep +
"diskDZ") * unitFactor;
652 double cut_W = m_config.getParameter(prep +
"cutW") * unitFactor;
653 double cut_H = m_config.getParameter(prep +
"cutH") * unitFactor;
654 double cut_L = m_config.getParameter(prep +
"cutL") * unitFactor;
655 double cut_dX = m_config.getParameter(prep +
"cutDX") * unitFactor;
656 double cut_dY = m_config.getParameter(prep +
"cutDY") * unitFactor;
657 double cut_dZ = m_config.getParameter(prep +
"cutDZ") * unitFactor;
658 double cut_PHI = m_config.getParameter(prep +
"cutPHI");
660 double sup_PHI = m_config.getParameter(prep +
"PHI");
663 G4Transform3D transform_box = G4Translate3D(box_X0, box_Y0, box_Z0);
664 transform_box = transform_box * G4RotateY3D(sup_PHI / Unit::rad);
666 G4Transform3D transform_trd = G4Translate3D(trd_X0, trd_Y0, trd_Z0);
667 transform_trd = transform_trd * G4RotateY3D(sup_PHI / Unit::rad) * G4RotateX3D(M_PI / 2.0 / Unit::rad);
669 G4Transform3D transform_box_hole = G4Translate3D(hole_dX, hole_dY, hole_dZ);
671 G4Transform3D transform_trd_hole = G4Translate3D(trd_hole_dX, trd_hole_dY, trd_hole_dZ);
673 G4Transform3D transform_disk_hole = G4Translate3D(disk_dX, disk_dY, disk_dZ);
675 G4Transform3D transform_cut = G4Translate3D(cut_dX, cut_dY, cut_dZ);
676 transform_cut = transform_cut * G4RotateX3D(cut_PHI / Unit::rad);
679 string geo_box_name =
"geo_" + name +
"_box_name";
680 string geo_trd_name =
"geo_" + name +
"_trd_name";
682 string geo_box_hole_name =
"geo_" + name +
"_box_hole_name";
683 string geo_trd_hole_name =
"geo_" + name +
"_trd_hole_name";
684 string geo_disk_hole_name =
"geo_" + name +
"_disk_hole_name";
685 string geo_cut_name =
"geo_" + name +
"_cut_name";
687 string geo_sup4x_name =
"geo_" + name +
"xxxx_name";
688 string geo_supxxx_name =
"geo_" + name +
"xxx_name";
689 string geo_supxx_name =
"geo_" + name +
"xx_name";
690 string geo_supx_name =
"geo_" + name +
"x_name";
691 string geo_sup_name =
"geo_" + name +
"_name";
693 G4Box* geo_box =
new G4Box(geo_box_name, box_W / 2.0, box_H / 2.0, box_L / 2.0);
694 G4Trd* geo_trd =
new G4Trd(geo_trd_name, trd_W1 / 2.0, trd_W2 / 2.0, trd_L / 2.0, trd_L / 2.0, trd_H / 2.0);
696 G4Box* geo_box_hole =
new G4Box(geo_box_hole_name, hole_W / 2.0, hole_H / 2.0, hole_L / 2.0);
697 G4Box* geo_trd_hole =
new G4Box(geo_trd_hole_name, trd_hole_W / 2.0, trd_hole_H / 2.0, trd_hole_L / 2.0);
698 G4Tubs* geo_disk_hole =
new G4Tubs(geo_disk_hole_name, 0.0, disk_r, disk_t, 0.0, 2.0 * M_PI);
699 G4Box* geo_cut =
new G4Box(geo_cut_name, cut_W / 2.0, cut_H / 2.0, cut_L / 2.0);
701 G4UnionSolid* geo_sup4x =
new G4UnionSolid(geo_sup4x_name, geo_box, geo_trd, transform_box.inverse() * transform_trd);
703 G4SubtractionSolid* geo_supxxx =
new G4SubtractionSolid(geo_supxxx_name, geo_sup4x, geo_box_hole, transform_box_hole);
704 G4SubtractionSolid* geo_supxx =
new G4SubtractionSolid(geo_supxx_name, geo_supxxx, geo_trd_hole, transform_trd_hole);
705 G4SubtractionSolid* geo_supx =
new G4SubtractionSolid(geo_supx_name, geo_supxx, geo_disk_hole, transform_disk_hole);
706 G4SubtractionSolid* geo_sup =
new G4SubtractionSolid(geo_sup_name, geo_supx, geo_cut, transform_cut);
711 string strMat_sup = m_config.getParameterStr(prep +
"Material");
712 G4Material* mat_sup = Materials::get(strMat_sup);
714 string logi_sup_name =
"logi_" + name +
"_name";
715 G4LogicalVolume* logi_sup =
new G4LogicalVolume(sup.
geo, mat_sup, logi_sup_name);
722 string phys_sup_name =
"phys_" + name +
"_name";
723 new G4PVPlacement(sup.
transform, sup.
logi, phys_sup_name, &topVolume,
false, 0);
725 elements[name] = sup;
732 std::vector<std::string> straightSections;
733 boost::split(straightSections, m_config.getParameterStr(
"Straight"), boost::is_any_of(
" "));
734 for (
const auto& name : straightSections) {
739 int N = int(m_config.getParameter(prep +
"N"));
741 std::vector<double> Z(N);
742 std::vector<double>
R(N);
743 std::vector<double> r(N);
745 for (
int i = 0; i < N; ++i) {
746 ostringstream ossZID;
749 ostringstream ossRID;
752 ostringstream ossrID;
755 Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
756 R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
757 r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
760 polycone.
transform = G4Translate3D(0.0, 0.0, 0.0);
763 string motherVolume = m_config.getParameterStr(prep +
"MotherVolume");
764 string subtract = m_config.getParameterStr(prep +
"Subtract",
"");
765 string intersect = m_config.getParameterStr(prep +
"Intersect",
"");
767 string geo_polyconexx_name =
"geo_" + name +
"xx_name";
768 string geo_polyconex_name =
"geo_" + name +
"x_name";
769 string geo_polycone_name =
"geo_" + name +
"_name";
771 G4VSolid* geo_polyconexx, *geo_polycone;
774 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
775 G4VSolid* geo_polyconex =
new G4SubtractionSolid(geo_polyconex_name, geo_polyconexx, elements[subtract].geo,
776 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[subtract].transform);
777 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconex, elements[
intersect].geo,
778 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[
intersect].transform);
779 }
else if (subtract !=
"") {
780 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
781 geo_polycone =
new G4SubtractionSolid(geo_polycone_name, geo_polyconexx, elements[subtract].geo,
782 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[subtract].transform);
784 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
785 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconexx, elements[
intersect].geo,
786 elements[motherVolume].transform.inverse()*polycone.
transform.inverse()*elements[
intersect].transform);
788 geo_polycone =
new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Z[0]), &(r[0]), &(
R[0]));
790 polycone.
geo = geo_polycone;
793 string strMat_polycone = m_config.getParameterStr(prep +
"Material");
794 G4Material* mat_polycone = Materials::get(strMat_polycone);
795 string logi_polycone_name =
"logi_" + name +
"_name";
796 polycone.
logi =
new G4LogicalVolume(polycone.
geo, mat_polycone, logi_polycone_name);
801 string phys_polycone_name =
"phys_" + name +
"_name";
802 new G4PVPlacement(polycone.
transform, polycone.
logi, phys_polycone_name, elements[motherVolume].logi,
false, 0);
807 elements[name] = polycone;
814 std::vector<std::string> shields;
815 boost::split(shields, m_config.getParameterStr(
"Shield"), boost::is_any_of(
" "));
816 for (
const auto& name : shields) {
821 double shield_W = m_config.getParameter(prep +
"W") * unitFactor;
822 double shield_H = m_config.getParameter(prep +
"H") * unitFactor;
823 double shield_L = m_config.getParameter(prep +
"L") * unitFactor;
824 double shield_X0 = m_config.getParameter(prep +
"X0") * unitFactor;
825 double shield_Y0 = m_config.getParameter(prep +
"Y0") * unitFactor;
826 double shield_Z0 = m_config.getParameter(prep +
"Z0") * unitFactor;
828 double shield_hole_W = m_config.getParameter(prep +
"holeW", 0) * unitFactor;
829 double shield_hole_H = m_config.getParameter(prep +
"holeH", 0) * unitFactor;
830 double shield_hole_L = m_config.getParameter(prep +
"holeL", 0) * unitFactor;
831 double shield_hole_dX = m_config.getParameter(prep +
"holeDX", 0) * unitFactor;
832 double shield_hole_dY = m_config.getParameter(prep +
"holeDY", 0) * unitFactor;
833 double shield_hole_dZ = m_config.getParameter(prep +
"holeDZ", 0) * unitFactor;
835 double shield_PHI = m_config.getParameter(prep +
"PHI");
840 shield.
transform = G4Translate3D(shield_X0, shield_Y0, shield_Z0);
843 G4Transform3D transform_shield_hole = G4Translate3D(shield_hole_dX, shield_hole_dY, shield_hole_dZ);
846 string geo_shieldx_name =
"geo_" + name +
"x_name";
847 string geo_shield_hole_name =
"geo_" + name +
"_hole_name";
848 string geo_shield_name =
"geo_" + name +
"_name";
850 if (shield_hole_W == 0 || shield_hole_H == 0 || shield_hole_L == 0) {
851 G4Box* geo_shield =
new G4Box(geo_shield_name, shield_W / 2.0, shield_H / 2.0, shield_L / 2.0);
853 shield.
geo = geo_shield;
855 G4Box* geo_shieldx =
new G4Box(geo_shieldx_name, shield_W / 2.0, shield_H / 2.0, shield_L / 2.0);
856 G4Box* geo_shield_hole =
new G4Box(geo_shield_hole_name, shield_hole_W / 2.0, shield_hole_H / 2.0, shield_hole_L / 2.0);
857 G4SubtractionSolid* geo_shield =
new G4SubtractionSolid(geo_shield_name, geo_shieldx, geo_shield_hole,
858 transform_shield_hole);
860 shield.
geo = geo_shield;
863 string strMat_shield = m_config.getParameterStr(prep +
"Material");
864 G4Material* mat_shield = Materials::get(strMat_shield);
866 string logi_shield_name =
"logi_" + name +
"_name";
867 G4LogicalVolume* logi_shield =
new G4LogicalVolume(shield.
geo, mat_shield, logi_shield_name);
869 shield.
logi = logi_shield;
874 string phys_shield_name =
"phys_" + name +
"_name";
875 new G4PVPlacement(shield.
transform, shield.
logi, phys_shield_name, &topVolume,
false, 0);
877 elements[name] = shield;
882 G4Tubs* geo_rvcR =
new G4Tubs(
"geo_rvcR", 60, 60 + 60, (620 - 560) / 2., 0, 2 * M_PI);
883 G4LogicalVolume* logi_rvcR =
new G4LogicalVolume(geo_rvcR, Materials::get(
"SUS316L"),
"logi_rvcR_name");
884 new G4PVPlacement(0, G4ThreeVector(0, 0, (620 + 560) / 2.), logi_rvcR,
"phys_rvcR_name", &topVolume,
false, 0);
886 G4Tubs* geo_rvcL =
new G4Tubs(
"geo_rvcL", 60, 60 + 60, (-560 - (-620)) / 2., 0, 2 * M_PI);
887 G4LogicalVolume* logi_rvcL =
new G4LogicalVolume(geo_rvcL, Materials::get(
"SUS316L"),
"logi_rvcL_name");
888 new G4PVPlacement(0, G4ThreeVector(0, 0, (-620 - 560) / 2.), logi_rvcL,
"phys_rvcL_name", &topVolume,
false, 0);
892 G4EllipticalTube* geo_elp_QC1LEx =
new G4EllipticalTube(
"geo_elp_QC1LEx", 10.5, 13.5, (-675 - (-1225)) / 2.);
893 G4IntersectionSolid* geo_elp_QC1LE =
new G4IntersectionSolid(
"geo_elp_QC1LE", elements[
"D2wal1"].geo, geo_elp_QC1LEx,
894 G4Translate3D(0, 0, (-675 - 1225) / 2.));
895 G4LogicalVolume* logi_elp_QC1LE =
new G4LogicalVolume(geo_elp_QC1LE, Materials::get(
"Vacuum"),
"logi_elp_QC1LE_name");
896 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LE,
"phys_elp_QC1LE_name", elements[
"D2wal1"].logi,
false, 0);
898 G4EllipticalTube* geo_elp_QC1LPx =
new G4EllipticalTube(
"geo_elp_QC1LPx", 10.5, 13.5, (-675 - (-1225)) / 2.);
899 G4IntersectionSolid* geo_elp_QC1LP =
new G4IntersectionSolid(
"geo_elp_QC1LP", elements[
"E2wal1"].geo, geo_elp_QC1LPx,
900 G4Translate3D(0, 0, (-675 - 1225) / 2.));
901 G4LogicalVolume* logi_elp_QC1LP =
new G4LogicalVolume(geo_elp_QC1LP, Materials::get(
"Vacuum"),
"logi_elp_QC1LP_name");
902 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1LP,
"phys_elp_QC1LP_name", elements[
"E2wal1"].logi,
false, 0);
904 G4EllipticalTube* geo_elp_QC1REx =
new G4EllipticalTube(
"geo_elp_QC1REx", 10.5, 13.5, (1225 - 675) / 2.);
905 G4IntersectionSolid* geo_elp_QC1RE =
new G4IntersectionSolid(
"geo_elp_QC1RE", elements[
"A2wal1"].geo, geo_elp_QC1REx,
906 G4Translate3D(0, 0, (1225 + 675) / 2.));
907 G4LogicalVolume* logi_elp_QC1RE =
new G4LogicalVolume(geo_elp_QC1RE, Materials::get(
"Vacuum"),
"logi_elp_QC1RE_name");
908 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RE,
"phys_elp_QC1RE_name", elements[
"A2wal1"].logi,
false, 0);
910 G4EllipticalTube* geo_elp_QC1RPx =
new G4EllipticalTube(
"geo_elp_QC1RPx", 10.5, 13.5, (1225 - 675) / 2.);
911 G4IntersectionSolid* geo_elp_QC1RP =
new G4IntersectionSolid(
"geo_elp_QC1RP", elements[
"B2wal1"].geo, geo_elp_QC1RPx,
912 G4Translate3D(0, 0, (1225 + 675) / 2.));
913 G4LogicalVolume* logi_elp_QC1RP =
new G4LogicalVolume(geo_elp_QC1RP, Materials::get(
"Vacuum"),
"logi_elp_QC1RP_name");
914 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_elp_QC1RP,
"phys_elp_QC1RP_name", elements[
"B2wal1"].logi,
false, 0);
The IR Sensitive Detector class.
int intersect(const TRGCDCLpar &lp1, const TRGCDCLpar &lp2, CLHEP::HepVector &v1, CLHEP::HepVector &v2)
intersection
void setVisibility(G4LogicalVolume &volume, bool visible)
Helper function to quickly set the visibility of a given volume.
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.
GeometryTypes
Flag indiciating the type of geometry to be used.
Abstract base class for different kinds of events.
The struct for CryostatElement.
G4LogicalVolume * logi
Logical volume.
G4VSolid * geo
Solid volume.
G4Transform3D transform
Transformation.