9 #include <ir/geometry/GeoFarBeamLineCreator.h>
11 #include <geometry/Materials.h>
12 #include <geometry/CreatorFactory.h>
13 #include <geometry/utilities.h>
14 #include <framework/gearbox/Unit.h>
15 #include <ir/simulation/SensitiveDetector.h>
16 #include <simulation/background/BkgSensitiveDetector.h>
19 #include <boost/format.hpp>
20 #include <boost/foreach.hpp>
21 #include <boost/algorithm/string.hpp>
23 #include <G4LogicalVolume.hh>
24 #include <G4PVPlacement.hh>
30 #include <G4Polycone.hh>
32 #include <G4IntersectionSolid.hh>
33 #include <G4SubtractionSolid.hh>
34 #include <G4UserLimits.hh>
37 using namespace boost;
46 using namespace geometry;
54 geometry::CreatorFactory<GeoFarBeamLineCreator> GeoFarBeamLineFactory(
"FarBeamLineCreator");
60 GeoFarBeamLineCreator::GeoFarBeamLineCreator()
65 GeoFarBeamLineCreator::~GeoFarBeamLineCreator()
70 void GeoFarBeamLineCreator::createGeometry(G4LogicalVolume& topVolume,
GeometryTypes)
75 double stepMax = 5.0 * Unit::mm;
76 int flag_limitStep = int(m_config.getParameter(
"LimitStepLength"));
80 const double unitFactor = Unit::cm / Unit::mm;
82 map<string, FarBeamLineElement> elements;
94 std::string prep =
"TubeR.";
96 int TubeR_N = int(m_config.getParameter(prep +
"N"));
98 std::vector<double> TubeR_Z(TubeR_N);
99 std::vector<double> TubeR_R(TubeR_N);
100 std::vector<double> TubeR_r(TubeR_N);
102 for (
int i = 0; i < TubeR_N; ++i) {
103 ostringstream ossZID;
106 ostringstream ossRID;
109 ostringstream ossrID;
112 TubeR_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
113 TubeR_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
114 TubeR_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
117 tubeR.
transform = G4Translate3D(0.0, 0.0, 0.0);
120 tubeR.
geo =
new G4Polycone(
"geo_TubeR_name", 0.0, 2 * M_PI, TubeR_N, &(TubeR_Z[0]), &(TubeR_r[0]), &(TubeR_R[0]));
124 elements[
"TubeR"] = tubeR;
134 int TubeL_N = int(m_config.getParameter(prep +
"N"));
136 std::vector<double> TubeL_Z(TubeL_N);
137 std::vector<double> TubeL_R(TubeL_N);
138 std::vector<double> TubeL_r(TubeL_N);
140 for (
int i = 0; i < TubeL_N; ++i) {
141 ostringstream ossZID;
144 ostringstream ossRID;
147 ostringstream ossrID;
150 TubeL_Z[i] = m_config.getParameter(prep + ossZID.str()) * unitFactor;
151 TubeL_R[i] = m_config.getParameter(prep + ossRID.str()) * unitFactor;
152 TubeL_r[i] = m_config.getParameter(prep + ossrID.str(), 0.0) * unitFactor;
155 tubeL.
transform = G4Translate3D(0.0, 0.0, 0.0);
158 tubeL.
geo =
new G4Polycone(
"geo_TubeL_name", 0.0, 2 * M_PI, TubeL_N, &(TubeL_Z[0]), &(TubeL_r[0]), &(TubeL_R[0]));
162 elements[
"TubeL"] = tubeL;
164 std::vector<double> zero_r(N, 0.);
166 std::vector<std::string> straightSections;
167 boost::split(straightSections, m_config.getParameterStr(
"Straight"), boost::is_any_of(
" "));
168 for (
const auto& name : straightSections) {
173 string type = m_config.getParameterStr(prep +
"type");
178 std::vector<double> Polycone_Z(N);
179 std::vector<double> Polycone_R(N);
180 std::vector<double> Polycone_r(N);
182 Polycone_Z[1] = m_config.getParameter(prep +
"L") * unitFactor;
183 Polycone_R[0] = m_config.getParameter(prep +
"R") * unitFactor;
184 Polycone_R[1] = m_config.getParameter(prep +
"R") * unitFactor;
185 Polycone_r[0] = m_config.getParameter(prep +
"r") * unitFactor;
186 Polycone_r[1] = m_config.getParameter(prep +
"r") * unitFactor;
188 double Polycone_X0 = m_config.getParameter(prep +
"X0") * unitFactor;
189 double Polycone_Z0 = m_config.getParameter(prep +
"Z0") * unitFactor;
190 double Polycone_PHI = m_config.getParameter(prep +
"PHI");
192 polycone.
transform = G4Translate3D(Polycone_X0, 0.0, Polycone_Z0);
196 string subtract = m_config.getParameterStr(prep +
"Subtract",
"");
197 string intersect = m_config.getParameterStr(prep +
"Intersect",
"");
199 string geo_polyconexx_name =
"geo_" + name +
"xx_name";
200 string geo_polyconex_name =
"geo_" + name +
"x_name";
201 string geo_polycone_name =
"geo_" + name +
"_name";
203 G4VSolid* geo_polyconexx(NULL), *geo_polycone(NULL);
207 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(zero_r[0]), &(Polycone_R[0]));
209 geo_polyconexx =
new G4Polycone(geo_polyconexx_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(Polycone_r[0]), &(Polycone_R[0]));
210 else if (type ==
"pipe")
211 geo_polycone =
new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(zero_r[0]), &(Polycone_R[0]));
213 geo_polycone =
new G4Polycone(geo_polycone_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(Polycone_r[0]), &(Polycone_R[0]));
217 G4VSolid* geo_polyconex =
new G4SubtractionSolid(geo_polyconex_name, geo_polyconexx, elements[subtract].geo,
218 polycone.
transform.inverse()*elements[subtract].transform);
219 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconex, elements[
intersect].geo,
221 }
else if (subtract !=
"")
222 geo_polycone =
new G4SubtractionSolid(geo_polycone_name, geo_polyconexx, elements[subtract].geo,
223 polycone.
transform.inverse()*elements[subtract].transform);
225 geo_polycone =
new G4IntersectionSolid(geo_polycone_name, geo_polyconexx, elements[
intersect].geo,
228 polycone.
geo = geo_polycone;
231 string strMat_polycone = m_config.getParameterStr(prep +
"Material");
232 G4Material* mat_polycone = Materials::get(strMat_polycone);
233 string logi_polycone_name =
"logi_" + name +
"_name";
234 G4LogicalVolume* logi_polycone =
new G4LogicalVolume(polycone.
geo, mat_polycone, logi_polycone_name);
235 setColor(*logi_polycone,
"#CC0000");
238 polycone.
logi = logi_polycone;
241 string phys_polycone_name =
"phys_" + name +
"_name";
242 new G4PVPlacement(polycone.
transform, logi_polycone, phys_polycone_name, &topVolume,
false, 0);
244 elements[name] = polycone;
247 for (
int i = 0; i < N; ++i)
248 sum += Polycone_r[i];
249 if (type ==
"pipe" && sum != 0) {
253 string nameVac = name +
"Vac";
256 string geo_vacuumxx_name =
"geo_" + nameVac +
"xx_name";
257 string geo_vacuum_name =
"geo_" + nameVac +
"_name";
259 G4VSolid* geo_vacuumxx, *geo_vacuum;
261 geo_vacuumxx =
new G4Polycone(geo_vacuumxx_name, 0.0, 2 * M_PI, N, &(Polycone_Z[0]), &(zero_r[0]), &(Polycone_r[0]));
262 geo_vacuum =
new G4IntersectionSolid(geo_vacuumxx_name, geo_vacuumxx, geo_polycone);
264 vacuum.
geo = geo_vacuum;
268 G4Material* mat_vacuum = Materials::get(
"Vacuum");
269 string logi_vacuum_name =
"logi_" + nameVac +
"_name";
270 G4LogicalVolume* logi_vacuum =
new G4LogicalVolume(vacuum.
geo, mat_vacuum, logi_vacuum_name);
271 if (flag_limitStep) logi_vacuum->SetUserLimits(
new G4UserLimits(stepMax));
275 vacuum.
logi = logi_vacuum;
278 string phys_vacuum_name =
"phys_" + nameVac +
"_name";
280 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_vacuum, phys_vacuum_name, logi_polycone,
false, 0);
282 elements[nameVac] = vacuum;
287 std::vector<std::string> bendingSections;
288 boost::split(bendingSections, m_config.getParameterStr(
"Bending"), boost::is_any_of(
" "));
289 for (
const auto& name : bendingSections) {
294 string type = m_config.getParameterStr(prep +
"type");
298 double torus_r = m_config.getParameter(prep +
"r") * unitFactor;
299 double torus_R = m_config.getParameter(prep +
"R") * unitFactor;
300 double torus_RT = m_config.getParameter(prep +
"RT") * unitFactor;
301 double torus_X0 = m_config.getParameter(prep +
"X0") * unitFactor;
302 double torus_Z0 = m_config.getParameter(prep +
"Z0") * unitFactor;
303 double torus_SPHI = m_config.getParameter(prep +
"SPHI");
304 double torus_DPHI = m_config.getParameter(prep +
"DPHI");
306 torus.
transform = G4Translate3D(torus_X0, 0.0, torus_Z0);
310 string subtract = m_config.getParameterStr(prep +
"Subtract",
"");
311 string intersect = m_config.getParameterStr(prep +
"Intersect",
"");
313 string geo_torusxx_name =
"geo_" + name +
"xx_name";
314 string geo_torusx_name =
"geo_" + name +
"x_name";
315 string geo_torus_name =
"geo_" + name +
"_name";
317 G4VSolid* geo_torusxx(NULL), *geo_torus(NULL);
321 geo_torusxx =
new G4Torus(geo_torusxx_name, 0, torus_R, torus_RT, torus_SPHI, torus_DPHI);
323 geo_torusxx =
new G4Torus(geo_torusxx_name, torus_r, torus_R, torus_RT, torus_SPHI, torus_DPHI);
324 else if (type ==
"pipe")
325 geo_torus =
new G4Torus(geo_torus_name, 0, torus_R, torus_RT, torus_SPHI, torus_DPHI);
327 geo_torus =
new G4Torus(geo_torus_name, torus_r, torus_R, torus_RT, torus_SPHI, torus_DPHI);
330 G4VSolid* geo_torusx =
new G4SubtractionSolid(geo_torusx_name, geo_torusxx, elements[subtract].geo,
331 torus.
transform.inverse()*elements[subtract].transform);
332 geo_torus =
new G4IntersectionSolid(geo_torus_name, geo_torusx, elements[
intersect].geo,
334 }
else if (subtract !=
"")
335 geo_torus =
new G4SubtractionSolid(geo_torus_name, geo_torusxx, elements[subtract].geo,
336 torus.
transform.inverse()*elements[subtract].transform);
338 geo_torus =
new G4IntersectionSolid(geo_torus_name, geo_torusxx, elements[
intersect].geo,
341 torus.
geo = geo_torus;
344 string strMat_torus = m_config.getParameterStr(prep +
"Material");
345 G4Material* mat_torus = Materials::get(strMat_torus);
346 string logi_torus_name =
"logi_" + name +
"_name";
347 G4LogicalVolume* logi_torus =
new G4LogicalVolume(torus.
geo, mat_torus, logi_torus_name);
351 torus.
logi = logi_torus;
354 string phys_torus_name =
"phys_" + name +
"_name";
355 new G4PVPlacement(torus.
transform, logi_torus, phys_torus_name, &topVolume,
false, 0);
357 elements[name] = torus;
359 if (type ==
"pipe" && torus_r != 0) {
363 string nameVac = name +
"Vac";
366 string geo_vacuumxx_name =
"geo_" + nameVac +
"xx_name";
367 string geo_vacuum_name =
"geo_" + nameVac +
"_name";
369 G4VSolid* geo_vacuumxx, *geo_vacuum;
371 geo_vacuumxx =
new G4Torus(geo_vacuumxx_name, 0.0, torus_r, torus_RT, torus_SPHI, torus_DPHI);
372 geo_vacuum =
new G4IntersectionSolid(geo_vacuum_name, geo_vacuumxx, geo_torus);
374 vacuum.
geo = geo_vacuum;
378 G4Material* mat_vacuum = Materials::get(
"Vacuum");
379 string logi_vacuum_name =
"logi_" + nameVac +
"_name";
380 G4LogicalVolume* logi_vacuum =
new G4LogicalVolume(vacuum.
geo, mat_vacuum, logi_vacuum_name);
381 if (flag_limitStep) logi_vacuum->SetUserLimits(
new G4UserLimits(stepMax));
385 vacuum.
logi = logi_vacuum;
388 string phys_vacuum_name =
"phys_" + nameVac +
"_name";
390 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logi_vacuum, phys_vacuum_name, logi_torus,
false, 0);
392 elements[nameVac] = vacuum;
404 prep =
"GateShield.";
406 double GateShield_X = m_config.getParameter(prep +
"X") * unitFactor;
407 double GateShield_Y = m_config.getParameter(prep +
"Y") * unitFactor;
408 double GateShield_Z = m_config.getParameter(prep +
"Z") * unitFactor;
409 double TUN_X = m_config.getParameter(prep +
"TUNX") * unitFactor;
410 double TUN_Y = m_config.getParameter(prep +
"TUNY") * unitFactor;
411 double DET_Z = m_config.getParameter(prep +
"DETZ") * unitFactor;
412 double DET_DZ = m_config.getParameter(prep +
"DETDZ") * unitFactor;
413 double ROT = m_config.getParameter(prep +
"ROT");
415 G4Transform3D transform_DET = G4Translate3D(0.0, 0.0, DET_DZ);
416 G4Transform3D transform_ROT = G4Translate3D(0.0, 0.0, 0.0);
417 transform_ROT = transform_ROT * G4RotateY3D(ROT / Unit::rad);
421 G4Box* geo_GateShieldxx =
new G4Box(
"geo_GateShieldxx_name", GateShield_X, GateShield_Y, GateShield_Z);
422 G4Box* geo_TUN =
new G4Box(
"geo_TUN_name", TUN_X, TUN_Y, GateShield_Z);
423 G4SubtractionSolid* geo_GateShieldx =
new G4SubtractionSolid(
"geo_GateShieldx_name", geo_GateShieldxx, geo_TUN);
424 G4Box* geo_DET =
new G4Box(
"geo_DET_name", GateShield_X, GateShield_Y, DET_Z);
425 G4SubtractionSolid* geo_GateShield =
new G4SubtractionSolid(
"geo_GateShield_name", geo_GateShieldx, geo_DET, transform_DET);
427 string strMat_GateShield = m_config.getParameterStr(prep +
"Material");
428 G4Material* mat_GateShield = Materials::get(strMat_GateShield);
429 G4LogicalVolume* logi_GateShield =
new G4LogicalVolume(geo_GateShield, mat_GateShield,
"logi_GateShield_name");
432 setColor(*logi_GateShield,
"#CC0000");
434 new G4PVPlacement(transform_ROT, logi_GateShield,
"phys_GateShield_name", &topVolume,
false, 0);
442 G4Tubs* geo_Tube =
new G4Tubs(
"geo_Tube_name", 3995 * CLHEP::mm, 4000 * CLHEP::mm, 29 * CLHEP::m, 0. * CLHEP::deg, 360.*CLHEP::deg);
443 G4Material* mat_Tube = Materials::get(
"G4_Si");
444 G4LogicalVolume* logi_Tube =
new G4LogicalVolume(geo_Tube, mat_Tube,
"logi_Tube_name");
449 bool radiation_study =
false;
451 if (radiation_study) {
452 new G4PVPlacement(transform_ROT, logi_Tube,
"phys_Tube_name", &topVolume,
false, 0);
463 prep =
"PolyShieldR.";
465 double PolyShieldR_Xp = m_config.getParameter(prep +
"Xp") * unitFactor;
466 double PolyShieldR_Xm = m_config.getParameter(prep +
"Xm") * unitFactor;
467 double PolyShieldR_Y = m_config.getParameter(prep +
"Y") * unitFactor;
468 double PolyShieldR_Z = m_config.getParameter(prep +
"Z") * unitFactor;
469 double PolyShieldR_DZ = m_config.getParameter(prep +
"DZ") * unitFactor;
470 double PolyShieldR_r = m_config.getParameter(prep +
"r") * unitFactor;
471 double PolyShieldR_dx = m_config.getParameter(prep +
"dx") * unitFactor;
473 double PolyShieldR_X = (PolyShieldR_Xp + PolyShieldR_Xm) / 2;
474 G4Transform3D transform_polyShieldR = G4Translate3D((PolyShieldR_Xp - PolyShieldR_Xm) / 2, 0.0, PolyShieldR_DZ);
475 G4Transform3D transform_polyShieldR_Hole = G4Translate3D(PolyShieldR_dx, 0.0, 0.0);
478 G4Box* geo_polyShieldRx =
new G4Box(
"geo_polyShieldRx_name", PolyShieldR_X, PolyShieldR_Y, PolyShieldR_Z);
479 G4Tubs* geo_polyShieldR_Hole =
new G4Tubs(
"geo_polyShieldRxx_name", 0 * CLHEP::mm, PolyShieldR_r, PolyShieldR_Z, 0. * CLHEP::deg,
481 G4SubtractionSolid* geo_polyShieldR
482 =
new G4SubtractionSolid(
"geo_polyShieldR_name", geo_polyShieldRx, geo_polyShieldR_Hole, transform_polyShieldR_Hole);
484 string strMat_polyShieldR = m_config.getParameterStr(prep +
"Material");
485 G4Material* mat_polyShieldR = Materials::get(strMat_polyShieldR);
486 G4LogicalVolume* logi_polyShieldR =
new G4LogicalVolume(geo_polyShieldR, mat_polyShieldR,
"logi_polyShieldR_name");
489 setColor(*logi_polyShieldR,
"#0000CC");
491 new G4PVPlacement(transform_polyShieldR, logi_polyShieldR,
"phys_polyShieldR_name", &topVolume,
false, 0);
497 prep =
"PolyShieldL.";
499 double PolyShieldL_Xp = m_config.getParameter(prep +
"Xp") * unitFactor;
500 double PolyShieldL_Xm = m_config.getParameter(prep +
"Xm") * unitFactor;
501 double PolyShieldL_Y = m_config.getParameter(prep +
"Y") * unitFactor;
502 double PolyShieldL_Z = m_config.getParameter(prep +
"Z") * unitFactor;
503 double PolyShieldL_DZ = m_config.getParameter(prep +
"DZ") * unitFactor;
504 double PolyShieldL_r = m_config.getParameter(prep +
"r") * unitFactor;
505 double PolyShieldL_dx = m_config.getParameter(prep +
"dx") * unitFactor;
507 double PolyShieldL_X = (PolyShieldL_Xp + PolyShieldL_Xm) / 2;
508 G4Transform3D transform_polyShieldL = G4Translate3D((PolyShieldL_Xp - PolyShieldL_Xm) / 2, 0.0, PolyShieldL_DZ);
509 G4Transform3D transform_polyShieldL_Hole = G4Translate3D(PolyShieldL_dx, 0.0, 0.0);
512 G4Box* geo_polyShieldLxx =
new G4Box(
"geo_polyShieldLxx_name", PolyShieldL_X, PolyShieldL_Y, PolyShieldL_Z);
513 G4Tubs* geo_polyShieldL_Hole =
new G4Tubs(
"geo_polyShieldLxxx_name", 0 * CLHEP::mm, PolyShieldL_r, PolyShieldL_Z, 0. * CLHEP::deg,
515 G4SubtractionSolid* geo_polyShieldLx
516 =
new G4SubtractionSolid(
"geo_polyShieldLx_name", geo_polyShieldLxx, geo_polyShieldL_Hole, transform_polyShieldL_Hole);
517 G4SubtractionSolid* geo_polyShieldL
518 =
new G4SubtractionSolid(
"geo_polyShieldL_name", geo_polyShieldLx, geo_GateShield, transform_polyShieldL.inverse()*transform_ROT);
520 string strMat_polyShieldL = m_config.getParameterStr(prep +
"Material");
521 G4Material* mat_polyShieldL = Materials::get(strMat_polyShieldL);
522 G4LogicalVolume* logi_polyShieldL =
new G4LogicalVolume(geo_polyShieldL, mat_polyShieldL,
"logi_polyShieldL_name");
525 setColor(*logi_polyShieldL,
"#0000CC");
527 new G4PVPlacement(transform_polyShieldL, logi_polyShieldL,
"phys_polyShieldL_name", &topVolume,
false, 0);
536 prep =
"ConcreteShieldR.";
538 double ConcreteShieldR_X = m_config.getParameter(prep +
"X") * unitFactor;
539 double ConcreteShieldR_Y = m_config.getParameter(prep +
"Y") * unitFactor;
540 double ConcreteShieldR_Z = m_config.getParameter(prep +
"Z") * unitFactor;
541 double ConcreteShieldR_DZ = m_config.getParameter(prep +
"DZ") * unitFactor;
542 double ConcreteShieldR_x = m_config.getParameter(prep +
"x") * unitFactor;
543 double ConcreteShieldR_y = m_config.getParameter(prep +
"y") * unitFactor;
544 double ConcreteShieldR_dx = m_config.getParameter(prep +
"dx") * unitFactor;
545 double ConcreteShieldR_dy = m_config.getParameter(prep +
"dy") * unitFactor;
547 G4Transform3D transform_ConcreteShieldR = G4Translate3D(0.0, 0.0, ConcreteShieldR_DZ);
548 transform_ConcreteShieldR = transform_ROT * transform_ConcreteShieldR;
549 G4Transform3D transform_ConcreteShieldR_Hole = G4Translate3D(ConcreteShieldR_dx, ConcreteShieldR_dy, 0.0);
553 G4Box* geo_ConcreteShieldRx =
new G4Box(
"geo_ConcreteShieldRx_name", ConcreteShieldR_X, ConcreteShieldR_Y, ConcreteShieldR_Z);
554 G4Box* geo_ConcreteShieldR_Hole =
new G4Box(
"geo_ConcreteShieldRxx_name", ConcreteShieldR_x, ConcreteShieldR_y, ConcreteShieldR_Z);
555 G4SubtractionSolid* geo_ConcreteShieldR =
new G4SubtractionSolid(
"geo_ConcreteShieldR_name", geo_ConcreteShieldRx,
556 geo_ConcreteShieldR_Hole, transform_ConcreteShieldR_Hole);
558 string strMat_ConcreteShieldR = m_config.getParameterStr(prep +
"Material");
559 G4Material* mat_ConcreteShieldR = Materials::get(strMat_ConcreteShieldR);
560 G4LogicalVolume* logi_ConcreteShieldR =
new G4LogicalVolume(geo_ConcreteShieldR, mat_ConcreteShieldR,
"logi_ConcreteShieldR_name");
563 setColor(*logi_ConcreteShieldR,
"#0000CC");
565 new G4PVPlacement(transform_ConcreteShieldR, logi_ConcreteShieldR,
"phys_ConcreteShieldR_name", &topVolume,
false, 0);
571 prep =
"ConcreteShieldL.";
573 double ConcreteShieldL_X = m_config.getParameter(prep +
"X") * unitFactor;
574 double ConcreteShieldL_Y = m_config.getParameter(prep +
"Y") * unitFactor;
575 double ConcreteShieldL_Z = m_config.getParameter(prep +
"Z") * unitFactor;
576 double ConcreteShieldL_DZ = m_config.getParameter(prep +
"DZ") * unitFactor;
577 double ConcreteShieldL_x = m_config.getParameter(prep +
"x") * unitFactor;
578 double ConcreteShieldL_y = m_config.getParameter(prep +
"y") * unitFactor;
579 double ConcreteShieldL_dx = m_config.getParameter(prep +
"dx") * unitFactor;
580 double ConcreteShieldL_dy = m_config.getParameter(prep +
"dy") * unitFactor;
582 G4Transform3D transform_ConcreteShieldL = G4Translate3D(0.0, 0.0, ConcreteShieldL_DZ);
583 transform_ConcreteShieldL = transform_ROT * transform_ConcreteShieldL;
584 G4Transform3D transform_ConcreteShieldL_Hole = G4Translate3D(ConcreteShieldL_dx, ConcreteShieldL_dy, 0.0);
587 G4Box* geo_ConcreteShieldLx =
new G4Box(
"geo_ConcreteShieldLx_name", ConcreteShieldL_X, ConcreteShieldL_Y, ConcreteShieldL_Z);
588 G4Box* geo_ConcreteShieldL_Hole =
new G4Box(
"geo_ConcreteShieldLxx_name", ConcreteShieldL_x, ConcreteShieldL_y, ConcreteShieldL_Z);
589 G4SubtractionSolid* geo_ConcreteShieldL =
new G4SubtractionSolid(
"geo_ConcreteShieldL_name", geo_ConcreteShieldLx,
590 geo_ConcreteShieldL_Hole, transform_ConcreteShieldL_Hole);
592 string strMat_ConcreteShieldL = m_config.getParameterStr(prep +
"Material");
593 G4Material* mat_ConcreteShieldL = Materials::get(strMat_ConcreteShieldL);
594 G4LogicalVolume* logi_ConcreteShieldL =
new G4LogicalVolume(geo_ConcreteShieldL, mat_ConcreteShieldL,
"logi_ConcreteShieldL_name");
597 setColor(*logi_ConcreteShieldL,
"#0000CC");
599 new G4PVPlacement(transform_ConcreteShieldL, logi_ConcreteShieldL,
"phys_ConcreteShieldL_name", &topVolume,
false, 0);
620 if (radiation_study) {
628 std::vector<std::string> collimators;
629 boost::split(collimators, m_config.getParameterStr(
"Collimator"), boost::is_any_of(
" "));
630 for (
const auto& name : collimators) {
636 string type = m_config.getParameterStr(prep +
"type");
637 string motherVolume = m_config.getParameterStr(prep +
"MotherVolume");
638 string motherVolumeVacuum = motherVolume +
"Vac";
643 G4Translate3D translation;
644 elements[motherVolumeVacuum].transform.getDecomposition(scale, rotation, translation);
645 double zz = rotation.zz();
649 double collimator_d1 = m_config.getParameter(prep +
"d1") * unitFactor;
650 double collimator_d2 = m_config.getParameter(prep +
"d2") * unitFactor;
651 double collimator_fullH = m_config.getParameter(prep +
"fullH") * unitFactor;
652 double collimator_headH = m_config.getParameter(prep +
"headH") * unitFactor;
653 double collimator_minW = m_config.getParameter(prep +
"minW") * unitFactor;
654 double collimator_maxW = m_config.getParameter(prep +
"maxW") * unitFactor;
655 double collimator_th = m_config.getParameter(prep +
"th") * unitFactor;
656 double collimator_Z = m_config.getParameter(prep +
"Z") * unitFactor;
658 B2WARNING(
"Collimator " << name <<
" displacement d1 is set to " << collimator_d1 <<
"mm (must be less than zero)");
659 B2WARNING(
"Collimator " << name <<
" displacement d2 is set to " << collimator_d2 <<
"mm (must be greater than zero)");
669 double head_dz = collimator_headH / 2.0;
670 if (type ==
"vertical") {
671 head_dx1 = collimator_th / 2.0;
672 head_dx2 = collimator_th / 2.0;
673 head_dy1 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
674 head_dy2 = collimator_minW / 2.0;
676 head_dx1 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
677 head_dx2 = collimator_minW / 2.0;
678 head_dy1 = collimator_th / 2.0;
679 head_dy2 = collimator_th / 2.0;
687 G4Transform3D transform_head1 = G4Translate3D(0.0, 0.0, collimator_Z);
688 G4Transform3D transform_head2 = G4Translate3D(0.0, 0.0, collimator_Z);
691 if (type ==
"vertical") {
692 transform_head1 = transform_head1 * G4Translate3D(0.0, -head_dz + collimator_d1, 0.0);
693 transform_head1 = transform_head1 * G4RotateX3D(-M_PI / 2 / Unit::rad);
695 transform_head2 = transform_head2 * G4Translate3D(0.0, head_dz + collimator_d2, 0.0);
696 transform_head2 = transform_head2 * G4RotateX3D(M_PI / 2 / Unit::rad);
699 transform_head1 = transform_head1 * G4Translate3D(-head_dz + collimator_d1, 0.0, 0.0);
700 transform_head1 = transform_head1 * G4RotateY3D(M_PI / 2 / Unit::rad);
702 transform_head2 = transform_head2 * G4Translate3D(head_dz + collimator_d2, 0.0, 0.0);
703 transform_head2 = transform_head2 * G4RotateY3D(-M_PI / 2 / Unit::rad);
705 transform_head1 = transform_head1 * G4Translate3D(head_dz - collimator_d1, 0.0, 0.0);
706 transform_head1 = transform_head1 * G4RotateY3D(-M_PI / 2 / Unit::rad);
708 transform_head2 = transform_head2 * G4Translate3D(-head_dz - collimator_d2, 0.0, 0.0);
709 transform_head2 = transform_head2 * G4RotateY3D(M_PI / 2 / Unit::rad);
713 collimator_head1.
transform = transform_head1;
714 collimator_head2.
transform = transform_head2;
717 string geo_headx_name =
"geo_" + name +
"_headx_name";
719 string geo_head1_name =
"geo_" + name +
"_head1_name";
720 string geo_head2_name =
"geo_" + name +
"_head2_name";
722 G4VSolid* geo_headx =
new G4Trd(geo_headx_name, head_dx1, head_dx2, head_dy1, head_dy2, head_dz);
724 G4VSolid* geo_head1 =
new G4IntersectionSolid(geo_head1_name, geo_headx, elements[motherVolumeVacuum].geo,
726 G4VSolid* geo_head2 =
new G4IntersectionSolid(geo_head2_name, geo_headx, elements[motherVolumeVacuum].geo,
729 collimator_head1.
geo = geo_head1;
730 collimator_head2.
geo = geo_head2;
733 string strMat_head = m_config.getParameterStr(prep +
"HeadMaterial");
734 G4Material* mat_head = Materials::get(strMat_head);
735 string logi_head1_name =
"logi_" + name +
"_head1_name";
736 string logi_head2_name =
"logi_" + name +
"_head2_name";
737 G4LogicalVolume* logi_head1 =
new G4LogicalVolume(geo_head1, mat_head, logi_head1_name);
738 G4LogicalVolume* logi_head2 =
new G4LogicalVolume(geo_head2, mat_head, logi_head2_name);
745 double volume_head1 = logi_head1->GetSolid()->GetCubicVolume();
746 double volume_head2 = logi_head2->GetSolid()->GetCubicVolume();
748 collimator_head1.
logi = logi_head1;
749 collimator_head2.
logi = logi_head2;
752 string phys_head1_name =
"phys_" + name +
"_head1" +
"_name";
753 string phys_head2_name =
"phys_" + name +
"_head2" +
"_name";
754 if (volume_head1 != 0)
755 new G4PVPlacement(collimator_head1.
transform, logi_head1, phys_head1_name, elements[motherVolumeVacuum].logi,
false, 0);
756 if (volume_head2 != 0)
757 new G4PVPlacement(collimator_head2.
transform, logi_head2, phys_head2_name, elements[motherVolumeVacuum].logi,
false, 0);
760 collimator_head1.
transform = collimator_head1.
transform * elements[motherVolumeVacuum].transform;
761 collimator_head2.
transform = collimator_head2.
transform * elements[motherVolumeVacuum].transform;
763 string name_head1 = name +
"_head1";
764 string name_head2 = name +
"_head2";
765 elements[name_head1] = collimator_head1;
766 elements[name_head2] = collimator_head2;
776 double body_dz = (collimator_fullH - collimator_headH) / 2.0;
777 if (type ==
"vertical") {
778 body_dx1 = collimator_th / 2.0;
779 body_dx2 = collimator_th / 2.0;
780 body_dy1 = collimator_maxW / 2.0;
781 body_dy2 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
783 body_dx1 = collimator_maxW / 2.0;
784 body_dx2 = ((collimator_maxW - collimator_minW) * collimator_headH / collimator_fullH + collimator_minW) / 2.0;
785 body_dy1 = collimator_th / 2.0;
786 body_dy2 = collimator_th / 2.0;
794 if (type ==
"vertical") {
795 collimator_body1.
transform = G4Translate3D(0.0, -head_dz - body_dz, 0.0) * transform_head1;
796 collimator_body2.
transform = G4Translate3D(0.0, head_dz + body_dz, 0.0) * transform_head2;
799 collimator_body1.
transform = G4Translate3D(-head_dz - body_dz, 0.0, 0.0) * transform_head1;
800 collimator_body2.
transform = G4Translate3D(head_dz + body_dz, 0.0, 0.0) * transform_head2;
802 collimator_body1.
transform = G4Translate3D(head_dz + body_dz, 0.0, 0.0) * transform_head1;
803 collimator_body2.
transform = G4Translate3D(-head_dz - body_dz, 0.0, 0.0) * transform_head2;
808 string geo_bodyx_name =
"geo_" + name +
"_bodyx_name";
810 string geo_body1_name =
"geo_" + name +
"_body1_name";
811 string geo_body2_name =
"geo_" + name +
"_body2_name";
813 G4VSolid* geo_bodyx =
new G4Trd(geo_bodyx_name, body_dx1, body_dx2, body_dy1, body_dy2, body_dz);
815 G4VSolid* geo_body1 =
new G4IntersectionSolid(geo_body1_name, geo_bodyx, elements[motherVolumeVacuum].geo,
817 G4VSolid* geo_body2 =
new G4IntersectionSolid(geo_body2_name, geo_bodyx, elements[motherVolumeVacuum].geo,
820 collimator_body1.
geo = geo_body1;
821 collimator_body2.
geo = geo_body2;
824 string strMat_body = m_config.getParameterStr(prep +
"Material");
825 G4Material* mat_body = Materials::get(strMat_body);
826 string logi_body1_name =
"logi_" + name +
"_body1_name";
827 string logi_body2_name =
"logi_" + name +
"_body2_name";
828 G4LogicalVolume* logi_body1 =
new G4LogicalVolume(geo_body1, mat_body, logi_body1_name);
829 G4LogicalVolume* logi_body2 =
new G4LogicalVolume(geo_body2, mat_body, logi_body2_name);
836 double volume_body1 = logi_body1->GetSolid()->GetCubicVolume();
837 double volume_body2 = logi_body2->GetSolid()->GetCubicVolume();
839 collimator_body1.
logi = logi_body1;
840 collimator_body2.
logi = logi_body2;
843 string phys_body1_name =
"phys_" + name +
"_body1" +
"_name";
844 string phys_body2_name =
"phys_" + name +
"_body2" +
"_name";
845 if (volume_body1 != 0)
846 new G4PVPlacement(collimator_body1.
transform, logi_body1, phys_body1_name, elements[motherVolumeVacuum].logi,
false, 0);
847 if (volume_body2 != 0)
848 new G4PVPlacement(collimator_body2.
transform, logi_body2, phys_body2_name, elements[motherVolumeVacuum].logi,
false, 0);
851 collimator_body1.
transform = collimator_body1.
transform * elements[motherVolumeVacuum].transform;
852 collimator_body2.
transform = collimator_body2.
transform * elements[motherVolumeVacuum].transform;
854 string name_body1 = name +
"_body1";
855 string name_body2 = name +
"_body2";
856 elements[name_body1] = collimator_body1;
857 elements[name_body2] = collimator_body2;
864 std::vector<std::string> collimatorShields;
865 boost::split(collimatorShields, m_config.getParameterStr(
"CollimatorShield"), boost::is_any_of(
" "));
866 for (
const auto& name : collimatorShields) {
871 double collShield_X0 = m_config.getParameter(prep +
"X0") * unitFactor;
872 double collShield_Z0 = m_config.getParameter(prep +
"Z0") * unitFactor;
873 double collShield_PHI = m_config.getParameter(prep +
"PHI");
874 double collShield_W = m_config.getParameter(prep +
"W") * unitFactor;
875 double collShield_H = m_config.getParameter(prep +
"H") * unitFactor;
876 double collShield_L = m_config.getParameter(prep +
"L") * unitFactor;
877 double collShield_d = m_config.getParameter(prep +
"d") * unitFactor;
883 collShield.
transform = G4Translate3D(collShield_X0, 0.0, collShield_Z0);
884 collShield.
transform = collShield.
transform * G4RotateY3D(collShield_PHI / Unit::rad);
886 G4Transform3D transform_collShieldInner = G4Translate3D(0.0, -collShield_d / 2.0, 0.0);
889 string geo_collShieldx_name =
"geo_" + name +
"x_name";
890 string geo_collShieldInner_name =
"geo_" + name +
"Inner" +
"_name";
891 string geo_collShield_name =
"geo_" + name +
"_name";
893 G4Box* geo_collShieldx =
new G4Box(geo_collShieldx_name, collShield_W / 2.0, collShield_H / 2.0, collShield_L / 2.0);
894 G4Box* geo_collShieldInner =
new G4Box(geo_collShieldInner_name, collShield_W / 2.0 - collShield_d,
895 collShield_H / 2.0 - collShield_d / 2.0, collShield_L / 2.0);
896 G4SubtractionSolid* geo_collShield =
new G4SubtractionSolid(geo_collShield_name, geo_collShieldx, geo_collShieldInner,
897 transform_collShieldInner);
899 collShield.
geo = geo_collShield;
902 string strMat_collShield = m_config.getParameterStr(prep +
"Material");
903 G4Material* mat_collShield = Materials::get(strMat_collShield);
904 string logi_collShield_name =
"logi_" + name +
"_name";
905 G4LogicalVolume* logi_collShield =
new G4LogicalVolume(geo_collShield, mat_collShield, logi_collShield_name);
906 setColor(*logi_collShield,
"#CC0000");
909 collShield.
logi = logi_collShield;
912 string phys_collShield_name =
"phys_" + name +
"_name";
913 new G4PVPlacement(collShield.
transform, logi_collShield, phys_collShield_name, &topVolume,
false, 0);
915 elements[name] = collShield;
The Class for BeamBackground Sensitive Detector.
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 FarBeamLineElement.
G4LogicalVolume * logi
Logical volume.
G4VSolid * geo
Solid volume.
G4Transform3D transform
Transformation.