Belle II Software  release-08-01-10
DosiCreator.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/dosi/geometry/DosiCreator.h>
10 #include <beast/dosi/simulation/SensitiveDetector.h>
11 
12 #include <geometry/Materials.h>
13 #include <geometry/CreatorFactory.h>
14 #include <framework/gearbox/GearDir.h>
15 
16 #include <cmath>
17 #include <boost/format.hpp>
18 #include <boost/foreach.hpp>
19 #include <boost/algorithm/string.hpp>
20 
21 #include <G4LogicalVolume.hh>
22 #include <G4PVPlacement.hh>
23 
24 //Shapes
25 #include <G4Box.hh>
26 #include <G4UserLimits.hh>
27 
28 //Visualization Attributes
29 #include <G4VisAttributes.hh>
30 
31 using namespace std;
32 using namespace boost;
33 
34 namespace Belle2 {
41  namespace dosi {
42 
43  // Register the creator
46 
47  DosiCreator::DosiCreator(): m_sensitive(0)
48  {
49  //m_sensitive = new SensitiveDetector();
50  }
51 
53  {
54  if (m_sensitive) delete m_sensitive;
55  }
56 
57  void DosiCreator::create(const GearDir& content, G4LogicalVolume& topVolume, geometry::GeometryTypes /* type */)
58  {
59 
61 
62  //lets get the stepsize parameter with a default value of 5 µm
63  double stepSize = content.getLength("stepSize", 5 * CLHEP::um);
64 
65  G4VisAttributes* red = new G4VisAttributes(G4Colour(1, 0, 0));
66  red->SetForceAuxEdgeVisible(true);
67  G4VisAttributes* green = new G4VisAttributes(G4Colour(0, 1, 0));
68  green->SetForceAuxEdgeVisible(true);
69  G4VisAttributes* gray = new G4VisAttributes(G4Colour(.5, .5, .5));
70  gray->SetForceAuxEdgeVisible(true);
71  G4VisAttributes* coppercolor = new G4VisAttributes(G4Colour(218. / 255., 138. / 255., 103. / 255.));
72  coppercolor->SetForceAuxEdgeVisible(true);
73 
74  //Lets loop over all the Active nodes
75  BOOST_FOREACH(const GearDir & activeParams, content.getNodes("Active")) {
76  G4double dx_dosi = activeParams.getLength("dx_dosi") / 2.*CLHEP::cm;
77  G4double dy_dosi = activeParams.getLength("dy_dosi") / 2.*CLHEP::cm;
78  G4double dz_dosi = activeParams.getLength("dz_dosi") / 2.*CLHEP::cm;
79  double thetaZ = activeParams.getAngle("ThetaZ");
80  G4VSolid* s_dosi = new G4Box("s_dosi", dx_dosi, dy_dosi, dz_dosi);
81  //G4LogicalVolume* l_dosi = new G4LogicalVolume(s_dosi, geometry::Materials::get("BGO"), "l_dosi", 0, m_sensitive);
82  G4LogicalVolume* l_dosi = new G4LogicalVolume(s_dosi, geometry::Materials::get("G4_SILICON_DIOXIDE"), "l_dosi", 0, m_sensitive);
83 
84  l_dosi->SetVisAttributes(green);
85  //Lets limit the Geant4 stepsize inside the volume
86  l_dosi->SetUserLimits(new G4UserLimits(stepSize));
87  double z_pos[100];
88  double r_pos[100];
89  int dim = 0;
90  for (double z : activeParams.getArray("z", {0})) {
91  z *= CLHEP::cm;
92  z_pos[dim] = z;
93  dim++;
94  }
95  dim = 0;
96  for (double r : activeParams.getArray("r", {0})) {
97  r *= CLHEP::cm;
98  r_pos[dim] = r + dz_dosi;
99  dim++;
100  }
101 
102  int detID = 0;
103  G4Transform3D transform;
104  for (double phi : activeParams.getArray("Phi", {M_PI / 2})) {
105  //phi *= CLHEP::deg;
106  for (int i = 0; i < dim; i++) {
107  transform = G4RotateZ3D(phi - M_PI / 2) * G4Translate3D(0, r_pos[i], z_pos[i]) * G4RotateX3D(-M_PI / 2 - thetaZ);
108  new G4PVPlacement(transform, l_dosi, TString::Format("p_dosi_%d", detID).Data(), &topVolume, false, detID);
109  detID++;
110  }
111  }
112  }
113  }
114  } // dosi namespace
116 } // Belle2 namespace
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
virtual ~DosiCreator()
Destructor.
Definition: DosiCreator.cc:52
virtual void create(const GearDir &content, G4LogicalVolume &topVolume, geometry::GeometryTypes type)
Creation of the detector geometry from Gearbox (XML).
Definition: DosiCreator.cc:57
SensitiveDetector * m_sensitive
SensitiveDetector DOSI.
Definition: DosiCreator.h:46
Sensitive Detector implementation of the DOSI detector.
double getAngle(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard angle unit.
Definition: Interface.h:299
std::vector< double > getArray(const std::string &path) const noexcept(false)
Get the parameter path as a list of double values converted to the standard unit.
Definition: Interface.cc:123
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
static G4Material * get(const std::string &name)
Find given material.
Definition: Materials.h:63
geometry::CreatorFactory< DosiCreator > DosiFactory("DOSICreator")
Creator creates the DOSI 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.