Belle II Software development
BgoCreator.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/bgo/geometry/BgoCreator.h>
10#include <beast/bgo/simulation/SensitiveDetector.h>
11
12#include <geometry/CreatorFactory.h>
13#include <framework/gearbox/GearDir.h>
14#include <framework/logging/Logger.h>
15
16#include <G4LogicalVolume.hh>
17#include <G4PVPlacement.hh>
18
19//Shapes
20#include <G4Trap.hh>
21#include <G4UserLimits.hh>
22#include "G4NistManager.hh"
23
24using namespace std;
25
26namespace Belle2 {
33 namespace bgo {
34
35 // Register the creator
38
39 BgoCreator::BgoCreator(): m_sensitive(0)
40 {
41 //m_sensitive = new SensitiveDetector();
42 }
43
45 {
46 if (m_sensitive) delete m_sensitive;
47 }
48
49 void BgoCreator::create(const GearDir& content, G4LogicalVolume& topVolume, geometry::GeometryTypes /* type */)
50 {
51
53
54 // **Materials from the NIST database**
55 G4NistManager* man = G4NistManager::Instance();
56
57 G4bool isotopes = false;
58
59 G4Element* O = man->FindOrBuildElement("O", isotopes);
60 G4Element* Bi = man->FindOrBuildElement("Bi", isotopes);
61 G4Element* Ge = man->FindOrBuildElement("Ge", isotopes);
62
63 G4Material* BGO_BGO = new G4Material("BGO_BGO",//name
64 7.13 * CLHEP::g / CLHEP::cm3, //density
65 3);//number of elements
66 BGO_BGO->AddElement(O, 12);
67 BGO_BGO->AddElement(Bi, 4);
68 BGO_BGO->AddElement(Ge, 3);
69
70 //lets get the stepsize parameter with a default value of 5 µm
71 double stepSize = content.getLength("stepSize", 5 * CLHEP::um);
72
73 //no get the array. Notice that the default framework unit is cm, so the
74 //values will be automatically converted
75 vector<double> bar = content.getArray("bar");
76 B2INFO("Contents of bar: ");
77 for (double value : bar) {
78 B2INFO("value: " << value);
79 }
80 int detID = 0;
81 //Lets loop over all the Active nodes
82 for (const GearDir& activeParams : content.getNodes("Active")) {
83
84 //create bgo volume
85 G4Trap* s_BGO = new G4Trap("s_BGO",
86 activeParams.getLength("cDz") / 2.*CLHEP::cm,
87 activeParams.getLength("cDtheta"),
88 activeParams.getLength("cDphi"),
89 activeParams.getLength("cDy1") / 2.*CLHEP::cm,
90 activeParams.getLength("cDx2") / 2.*CLHEP::cm,
91 activeParams.getLength("cDx1") / 2.*CLHEP::cm, 0,
92 activeParams.getLength("cDy2") / 2.*CLHEP::cm,
93 activeParams.getLength("cDx4") / 2.*CLHEP::cm,
94 activeParams.getLength("cDx3") / 2.*CLHEP::cm, 0);
95
96 //G4LogicalVolume* l_BGO = new G4LogicalVolume(s_BGO, geometry::Materials::get("BGO"), "l_BGO", 0, m_sensitive);
97 G4LogicalVolume* l_BGO = new G4LogicalVolume(s_BGO, BGO_BGO, "l_BGO", 0, m_sensitive);
98
99 //cout << "BGO volume " << s_BGO->GetCubicVolume() / CLHEP::cm / CLHEP::cm / CLHEP::cm
100 //<< " density " << geometry::Materials::get("BGO")->GetDensity() / CLHEP::g * CLHEP::cm * CLHEP::cm * CLHEP::cm << endl;
101
102 //Lets limit the Geant4 stepsize inside the volume
103 l_BGO->SetUserLimits(new G4UserLimits(stepSize));
104
105 //position bgo volume
106 /*
107 G4Transform3D theta_init = G4RotateX3D(- activeParams.getLength("cDtheta"));
108 G4Transform3D phi_init = G4RotateZ3D(activeParams.getLength("k_phi_init"));
109 G4Transform3D tilt_z = G4RotateY3D(activeParams.getLength("k_z_TILTED"));
110 G4Transform3D tilt_phi = G4RotateZ3D(activeParams.getLength("k_phi_TILTED"));
111 G4Transform3D position = G4Translate3D(activeParams.getLength("k_zC") * tan(activeParams.getLength("k_z_TILTED")) * CLHEP::cm, 0,
112 activeParams.getLength("k_zC") * CLHEP::cm);
113 G4Transform3D pos_phi = G4RotateZ3D(activeParams.getLength("k_phiC"));
114 G4Transform3D Tr = pos_phi * position * tilt_phi * tilt_z * phi_init * theta_init;
115 //cout << "rotation " << Tr.getRotation() << " translation " << Tr.getTranslation() << endl;
116 */
117 double px = activeParams.getDouble("px");
118 double py = activeParams.getDouble("py");
119 double pz = activeParams.getDouble("pz");
120 double angle = activeParams.getDouble("angle");
121 double rx = activeParams.getDouble("rx");
122 double ry = activeParams.getDouble("ry");
123 double rz = activeParams.getDouble("rz");
124
125 G4RotationMatrix* pRot = new G4RotationMatrix();
126 pRot->rotate(-angle, G4ThreeVector(rx, ry, rz));
127 //G4Transform3D transform = G4Translate3D(px, py, pz) * G4Rotate3D(-angle, G4ThreeVector(rx, ry, rz));
128 new G4PVPlacement(pRot, G4ThreeVector(px, py, pz), l_BGO, "p_BGO", &topVolume, false, detID);
129 //new G4PVPlacement(transform, l_BGO, "p_BGO", &topVolume, false, detID);
130 B2INFO("BGO-" << detID << " placed at: (" << px << "," << py << "," << pz << ")" << " mm ");
131 //B2INFO("BGO-" << detID << " placed at: " << transform.getTranslation() << " mm ");
132 B2INFO(" rotation of " << -angle << " degree a long (" << rx << "," << ry << "," << rz << ") axis");
133 detID++;
134 }
135 }
136 } // bgo namespace
138} // Belle2 namespace
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
BgoCreator()
Constructor.
Definition: BgoCreator.cc:39
virtual ~BgoCreator()
Destructor.
Definition: BgoCreator.cc:44
virtual void create(const GearDir &content, G4LogicalVolume &topVolume, geometry::GeometryTypes type)
Creation of the detector geometry from Gearbox (XML).
Definition: BgoCreator.cc:49
SensitiveDetector * m_sensitive
SensitiveDetector BGO.
Definition: BgoCreator.h:46
Sensitive Detector implementation of the BGO detector.
geometry::CreatorFactory< BgoCreator > BgoFactory("BGOCreator")
Creator creates the BGO 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.