Belle II Software  release-06-01-15
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 
27 using namespace std;
28 using namespace boost;
29 
30 namespace 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  G4double fractionmass;
64 
65  A = 1.01 * CLHEP::g / CLHEP::mole;
66  G4Element* elH = new G4Element(name = "Hydrogen", symbol = "H" , Z = 1, A);
67 
68  A = 12.01 * CLHEP::g / CLHEP::mole;
69  G4Element* elC = new G4Element(name = "Carbon" , symbol = "C" , Z = 6, A);
70 
71  A = 16.00 * CLHEP::g / CLHEP::mole;
72  G4Element* elO = new G4Element(name = "Oxygen" , symbol = "O" , Z = 8, A);
73 
74  A = 22.99 * CLHEP::g / CLHEP::mole;
75  G4Element* elNa = new G4Element(name = "Natrium" , symbol = "Na" , Z = 11 , A);
76 
77  A = 200.59 * CLHEP::g / CLHEP::mole;
78  G4Element* elHg = new G4Element(name = "Hg" , symbol = "Hg" , Z = 80, A);
79 
80  A = 26.98 * CLHEP::g / CLHEP::mole;
81  G4Element* elAl = new G4Element(name = "Aluminium" , symbol = "Al" , Z = 13, A);
82 
83  A = 28.09 * CLHEP::g / CLHEP::mole;
84  G4Element* elSi = new G4Element(name = "Silicon", symbol = "Si", Z = 14, A);
85 
86  A = 39.1 * CLHEP::g / CLHEP::mole;
87  G4Element* elK = new G4Element(name = "K" , symbol = "K" , Z = 19 , A);
88 
89  A = 69.72 * CLHEP::g / CLHEP::mole;
90  G4Element* elCa = new G4Element(name = "Calzium" , symbol = "Ca" , Z = 31 , A);
91 
92  A = 55.85 * CLHEP::g / CLHEP::mole;
93  G4Element* elFe = new G4Element(name = "Iron" , symbol = "Fe", Z = 26, A);
94 
95  density = 2.03 * CLHEP::g / CLHEP::cm3;
96  G4Material* Concrete = new G4Material("Concrete", density, 10);
97  Concrete->AddElement(elH , fractionmass = 0.01);
98  Concrete->AddElement(elO , fractionmass = 0.529);
99  Concrete->AddElement(elNa , fractionmass = 0.016);
100  Concrete->AddElement(elHg , fractionmass = 0.002);
101  Concrete->AddElement(elAl , fractionmass = 0.034);
102  Concrete->AddElement(elSi , fractionmass = 0.337);
103  Concrete->AddElement(elK , fractionmass = 0.013);
104  Concrete->AddElement(elCa , fractionmass = 0.044);
105  Concrete->AddElement(elFe , fractionmass = 0.014);
106  Concrete->AddElement(elC , fractionmass = 0.001);
107 
108 
109  //lets get the stepsize parameter with a default value of 5 µm
110  double stepSize = content.getLength("stepSize", 5 * CLHEP::um);
111 
112  //no get the array. Notice that the default framework unit is cm, so the
113  //values will be automatically converted
114  vector<double> bar = content.getArray("bar");
115  B2INFO("Contents of bar: ");
116  BOOST_FOREACH(double value, bar) {
117  B2INFO("value: " << value);
118  }
119  int detID = 0;
120  //Lets loop over all the Active nodes
121  BOOST_FOREACH(const GearDir & activeParams, content.getNodes("Active")) {
122 
123  //create cave volume
124  G4Box* s_CAVE = new G4Box("s_CAVE",
125  activeParams.getLength("px")*CLHEP::cm ,
126  activeParams.getLength("py")*CLHEP::cm ,
127  activeParams.getLength("pz")*CLHEP::cm);
128 
129  //G4LogicalVolume* l_CAVE = new G4LogicalVolume(s_CAVE, geometry::Materials::get("CAVE"), "l_CAVE", 0, m_sensitive);
130  G4LogicalVolume* l_CAVE = new G4LogicalVolume(s_CAVE, Concrete, "l_CAVE", 0, 0);
131 
132  //Lets limit the Geant4 stepsize inside the volume
133  l_CAVE->SetUserLimits(new G4UserLimits(stepSize));
134 
135  //position cave volume
136  G4ThreeVector CAVEpos = G4ThreeVector(
137  activeParams.getLength("x_cave") * CLHEP::cm,
138  activeParams.getLength("y_cave") * CLHEP::cm,
139  activeParams.getLength("z_cave") * CLHEP::cm
140  );
141 
142  G4RotationMatrix* rot_cave = new G4RotationMatrix();
143  rot_cave->rotateX(activeParams.getLength("AngleX"));
144  rot_cave->rotateY(activeParams.getLength("AngleY"));
145  rot_cave->rotateZ(activeParams.getLength("AngleZ"));
146  //geometry::setColor(*l_CAVE, "#006699");
147  //double angle = activeParams.getDouble("angle");
148  //double rx = activeParams.getDouble("rx");
149  //double ry = activeParams.getDouble("ry");
150  //double rz = activeParams.getDouble("rz");
151  //rot_cave->rotate(-angle, G4ThreeVector(rx, ry, rz));
152  new G4PVPlacement(rot_cave, CAVEpos, l_CAVE, "p_CAVE", &topVolume, false, detID);
153 
154  detID++;
155  }
156  }
157  } // cave namespace
159 } // 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
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.
Very simple class to provide an easy way to register creators with the CreatorManager.