Belle II Software development
CaveCreator.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <beast/cave/geometry/CaveCreator.h>
10#include <beast/cave/simulation/SensitiveDetector.h>
11
12#include <geometry/CreatorFactory.h>
13#include <framework/gearbox/GearDir.h>
14#include <framework/logging/Logger.h>
15
16#include <boost/format.hpp>
17#include <boost/foreach.hpp>
18#include <boost/algorithm/string.hpp>
19
20#include <G4LogicalVolume.hh>
21#include <G4PVPlacement.hh>
22
23//Shapes
24#include <G4Box.hh>
25#include <G4UserLimits.hh>
26
27using namespace std;
28using namespace boost;
29
30namespace Belle2 {
37 namespace cave {
38
39 // Register the creator
42
43 CaveCreator::CaveCreator(): m_sensitive(0)
44 {
45 //m_sensitive = new SensitiveDetector();
46 }
47
49 {
50 if (m_sensitive) delete m_sensitive;
51 }
52
53 void CaveCreator::create(const GearDir& content, G4LogicalVolume& topVolume, geometry::GeometryTypes /* type */)
54 {
55
57
58 G4double density;
59 G4double A;
60 G4int Z;
61
62 G4String name, symbol;
63
64 A = 1.01 * CLHEP::g / CLHEP::mole;
65 G4Element* elH = new G4Element(name = "Hydrogen", symbol = "H", Z = 1, A);
66
67 A = 12.01 * CLHEP::g / CLHEP::mole;
68 G4Element* elC = new G4Element(name = "Carbon", symbol = "C", Z = 6, A);
69
70 A = 16.00 * CLHEP::g / CLHEP::mole;
71 G4Element* elO = new G4Element(name = "Oxygen", symbol = "O", Z = 8, A);
72
73 A = 22.99 * CLHEP::g / CLHEP::mole;
74 G4Element* elNa = new G4Element(name = "Natrium", symbol = "Na", Z = 11, A);
75
76 A = 200.59 * CLHEP::g / CLHEP::mole;
77 G4Element* elHg = new G4Element(name = "Hg", symbol = "Hg", Z = 80, A);
78
79 A = 26.98 * CLHEP::g / CLHEP::mole;
80 G4Element* elAl = new G4Element(name = "Aluminium", symbol = "Al", Z = 13, A);
81
82 A = 28.09 * CLHEP::g / CLHEP::mole;
83 G4Element* elSi = new G4Element(name = "Silicon", symbol = "Si", Z = 14, A);
84
85 A = 39.1 * CLHEP::g / CLHEP::mole;
86 G4Element* elK = new G4Element(name = "K", symbol = "K", Z = 19, A);
87
88 A = 69.72 * CLHEP::g / CLHEP::mole;
89 G4Element* elCa = new G4Element(name = "Calzium", symbol = "Ca", Z = 31, A);
90
91 A = 55.85 * CLHEP::g / CLHEP::mole;
92 G4Element* elFe = new G4Element(name = "Iron", symbol = "Fe", Z = 26, A);
93
94 density = 2.03 * CLHEP::g / CLHEP::cm3;
95 G4Material* Concrete = new G4Material("Concrete", density, 10);
96 Concrete->AddElementByMassFraction(elH, 0.01);
97 Concrete->AddElementByMassFraction(elO, 0.529);
98 Concrete->AddElementByMassFraction(elNa, 0.016);
99 Concrete->AddElementByMassFraction(elHg, 0.002);
100 Concrete->AddElementByMassFraction(elAl, 0.034);
101 Concrete->AddElementByMassFraction(elSi, 0.337);
102 Concrete->AddElementByMassFraction(elK, 0.013);
103 Concrete->AddElementByMassFraction(elCa, 0.044);
104 Concrete->AddElementByMassFraction(elFe, 0.014);
105 Concrete->AddElementByMassFraction(elC, 0.001);
106
107
108 //lets get the stepsize parameter with a default value of 5 µm
109 double stepSize = content.getLength("stepSize", 5 * CLHEP::um);
110
111 //no get the array. Notice that the default framework unit is cm, so the
112 //values will be automatically converted
113 vector<double> bar = content.getArray("bar");
114 B2INFO("Contents of bar: ");
115 BOOST_FOREACH(double value, bar) {
116 B2INFO("value: " << value);
117 }
118 int detID = 0;
119 //Lets loop over all the Active nodes
120 BOOST_FOREACH(const GearDir & activeParams, content.getNodes("Active")) {
121
122 //create cave volume
123 G4Box* s_CAVE = new G4Box("s_CAVE",
124 activeParams.getLength("px")*CLHEP::cm,
125 activeParams.getLength("py")*CLHEP::cm,
126 activeParams.getLength("pz")*CLHEP::cm);
127
128 //G4LogicalVolume* l_CAVE = new G4LogicalVolume(s_CAVE, geometry::Materials::get("CAVE"), "l_CAVE", 0, m_sensitive);
129 G4LogicalVolume* l_CAVE = new G4LogicalVolume(s_CAVE, Concrete, "l_CAVE", 0, 0);
130
131 //Lets limit the Geant4 stepsize inside the volume
132 l_CAVE->SetUserLimits(new G4UserLimits(stepSize));
133
134 //position cave volume
135 G4ThreeVector CAVEpos = G4ThreeVector(
136 activeParams.getLength("x_cave") * CLHEP::cm,
137 activeParams.getLength("y_cave") * CLHEP::cm,
138 activeParams.getLength("z_cave") * CLHEP::cm
139 );
140
141 G4RotationMatrix* rot_cave = new G4RotationMatrix();
142 rot_cave->rotateX(activeParams.getLength("AngleX"));
143 rot_cave->rotateY(activeParams.getLength("AngleY"));
144 rot_cave->rotateZ(activeParams.getLength("AngleZ"));
145 //geometry::setColor(*l_CAVE, "#006699");
146 //double angle = activeParams.getDouble("angle");
147 //double rx = activeParams.getDouble("rx");
148 //double ry = activeParams.getDouble("ry");
149 //double rz = activeParams.getDouble("rz");
150 //rot_cave->rotate(-angle, G4ThreeVector(rx, ry, rz));
151 new G4PVPlacement(rot_cave, CAVEpos, l_CAVE, "p_CAVE", &topVolume, false, detID);
152
153 detID++;
154 }
155 }
156 } // cave namespace
158} // Belle2 namespace
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
virtual ~CaveCreator()
Destructor.
Definition: CaveCreator.cc:48
virtual void create(const GearDir &content, G4LogicalVolume &topVolume, geometry::GeometryTypes type)
Creation of the detector geometry from Gearbox (XML).
Definition: CaveCreator.cc:53
CaveCreator()
Constructor.
Definition: CaveCreator.cc:43
SensitiveDetector * m_sensitive
SensitiveDetector cave.
Definition: CaveCreator.h:48
Sensitive Detector implementation of the CAVE detector.
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
Definition: Interface.h:259
geometry::CreatorFactory< CaveCreator > CaveFactory("CAVECreator")
Creator creates the cave geometry.
GeometryTypes
Flag indiciating the type of geometry to be used.
Abstract base class for different kinds of events.
STL namespace.
Very simple class to provide an easy way to register creators with the CreatorManager.