11 #include <beast/dosi/geometry/DosiCreator.h>
12 #include <beast/dosi/simulation/SensitiveDetector.h>
14 #include <geometry/Materials.h>
15 #include <geometry/CreatorFactory.h>
16 #include <framework/gearbox/GearDir.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>
28 #include <G4UserLimits.hh>
31 #include <G4VisAttributes.hh>
34 using namespace boost;
47 geometry::CreatorFactory<DosiCreator>
DosiFactory(
"DOSICreator");
49 DosiCreator::DosiCreator(): m_sensitive(0)
54 DosiCreator::~DosiCreator()
62 double stepSize = content.getLength(
"stepSize", 5 * CLHEP::um);
64 G4VisAttributes* red =
new G4VisAttributes(G4Colour(1, 0, 0));
65 red->SetForceAuxEdgeVisible(
true);
66 G4VisAttributes* green =
new G4VisAttributes(G4Colour(0, 1, 0));
67 green->SetForceAuxEdgeVisible(
true);
68 G4VisAttributes* gray =
new G4VisAttributes(G4Colour(.5, .5, .5));
69 gray->SetForceAuxEdgeVisible(
true);
70 G4VisAttributes* coppercolor =
new G4VisAttributes(G4Colour(218. / 255., 138. / 255., 103. / 255.));
71 coppercolor->SetForceAuxEdgeVisible(
true);
74 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
75 G4double dx_dosi = activeParams.
getLength(
"dx_dosi") / 2.*CLHEP::cm;
76 G4double dy_dosi = activeParams.
getLength(
"dy_dosi") / 2.*CLHEP::cm;
77 G4double dz_dosi = activeParams.
getLength(
"dz_dosi") / 2.*CLHEP::cm;
78 double thetaZ = activeParams.
getAngle(
"ThetaZ");
79 G4VSolid* s_dosi =
new G4Box(
"s_dosi", dx_dosi, dy_dosi, dz_dosi);
83 l_dosi->SetVisAttributes(green);
85 l_dosi->SetUserLimits(
new G4UserLimits(stepSize));
89 for (
double z : activeParams.
getArray(
"z", {0})) {
95 for (
double r : activeParams.
getArray(
"r", {0})) {
97 r_pos[dim] = r + dz_dosi;
102 G4Transform3D transform;
103 for (
double phi : activeParams.
getArray(
"Phi", {M_PI / 2})) {
105 for (
int i = 0; i < dim; i++) {
106 transform = G4RotateZ3D(phi - M_PI / 2) * G4Translate3D(0, r_pos[i], z_pos[i]) * G4RotateX3D(-M_PI / 2 - thetaZ);
107 new G4PVPlacement(transform, l_dosi, TString::Format(
"p_dosi_%d", detID).Data() , &topVolume,
false, detID);