Belle II Software development
He3tubeCreator.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/he3tube/geometry/He3tubeCreator.h>
10#include <beast/he3tube/simulation/SensitiveDetector.h>
11
12#include <geometry/Materials.h>
13#include <geometry/CreatorFactory.h>
14#include <framework/gearbox/GearDir.h>
15#include <framework/logging/Logger.h>
16
17#include <G4LogicalVolume.hh>
18#include <G4PVPlacement.hh>
19
20//Shapes
21#include <G4UserLimits.hh>
22#include "G4Tubs.hh"
23
24//Visualization Attributes
25#include <G4VisAttributes.hh>
26
27
28using namespace std;
29
30namespace Belle2 {
37 namespace he3tube {
38
39 // Register the creator
42
44 {
45 //m_sensitive = new SensitiveDetector();
46 }
47
49 {
50 if (m_sensitive) delete m_sensitive;
51 }
52
53 void He3tubeCreator::create(const GearDir& content, G4LogicalVolume& topVolume, geometry::GeometryTypes /* type */)
54 {
55
57
58 G4String symbol;
59 G4double a, z, n;
60 G4double abundance, density;
61 G4int ncomponents;
62
63 G4Isotope* iHe3 = new G4Isotope("iHe3", z = 2, n = 3, a = 3.0160293 * CLHEP::g / CLHEP::mole);
64 G4Element* eHe3 = new G4Element("eHe3", symbol = "eHe3", ncomponents = 1);
65 eHe3->AddIsotope(iHe3, abundance = 100.);
66 G4Material* gHe3 = new G4Material("gHe3", density = 0.00066 * CLHEP::g / CLHEP::cm3, ncomponents = 1);
67 gHe3->AddElement(eHe3, 1);
68
69 //lets get the stepsize parameter with a default value of 5 µm
70 double stepSize = content.getLength("stepSize", 5 * CLHEP::um);
71
72 //no get the array. Notice that the default framework unit is cm, so the
73 //values will be automatically converted
74 int detID = 0;
75 //Lets loop over all the Active nodes
76 for (const GearDir& activeParams : content.getNodes("Active")) {
77
78 //create he3tube
79 G4double startAngle = 0.*CLHEP::deg;
80 G4double spanningAngle = 360.*CLHEP::deg;
81 G4Tubs* s_He3TUBE = new G4Tubs("s_He3TUBE",
82 activeParams.getLength("tube_innerRadius")*CLHEP::cm,
83 activeParams.getLength("tube_outerRadius")*CLHEP::cm,
84 activeParams.getLength("tube_hz")*CLHEP::cm,
85 startAngle, spanningAngle);
86
87 string matTube = activeParams.getString("MaterialTube");
88 G4LogicalVolume* l_He3TUBE = new G4LogicalVolume(s_He3TUBE, geometry::Materials::get(matTube), "l_He3TUBE");
89
90 G4VisAttributes* l_He3TubeVisAtt = new G4VisAttributes(G4Colour(0, 1.0, 1.0, 1.0));
91 l_He3TUBE->SetVisAttributes(l_He3TubeVisAtt);
92
93 //position he3tube volume
94 G4ThreeVector He3TUBEpos = G4ThreeVector(
95 activeParams.getLength("x_he3tube") * CLHEP::cm,
96 activeParams.getLength("y_he3tube") * CLHEP::cm,
97 activeParams.getLength("z_he3tube") * CLHEP::cm
98 );
99
100 G4RotationMatrix* rot_he3tube = new G4RotationMatrix();
101 rot_he3tube->rotateX(activeParams.getAngle("AngleX"));
102 rot_he3tube->rotateY(activeParams.getAngle("AngleY"));
103 rot_he3tube->rotateZ(activeParams.getAngle("AngleZ"));
104
105 //geometry::setColor(*l_HE3TUBE, "#006699");
106
107 new G4PVPlacement(rot_he3tube, He3TUBEpos, l_He3TUBE, "p_He3TUBE", &topVolume, false, 1);
108
109 B2INFO("HE3-tube-" << detID << " placed at: " << He3TUBEpos << " mm");
110
111 //create endcaps
112 G4double EndcapinnerRadius = 0.;
113 G4Tubs* s_He3endcap = new G4Tubs("s_He3endcap",
114 EndcapinnerRadius,
115 activeParams.getLength("tube_outerRadius")*CLHEP::cm,
116 activeParams.getLength("endcap_hz")*CLHEP::cm,
117 startAngle, spanningAngle);
118
119 G4LogicalVolume* l_He3endcap = new G4LogicalVolume(s_He3endcap, geometry::Materials::get(matTube), "l_He3endcap");
120
121 l_He3endcap->SetVisAttributes(l_He3TubeVisAtt);
122
123 //position endcaps
124 G4ThreeVector He3endcapposTop = G4ThreeVector(
125 activeParams.getLength("x_he3tube") * CLHEP::cm,
126 activeParams.getLength("y_he3tube") * CLHEP::cm,
127 activeParams.getLength("z_he3tube") * CLHEP::cm + activeParams.getLength("tube_hz") * CLHEP::cm +
128 activeParams.getLength("endcap_hz") * CLHEP::cm
129 );
130
131 G4ThreeVector He3endcapposBot = G4ThreeVector(
132 activeParams.getLength("x_he3tube") * CLHEP::cm,
133 activeParams.getLength("y_he3tube") * CLHEP::cm,
134 activeParams.getLength("z_he3tube") * CLHEP::cm - activeParams.getLength("tube_hz") * CLHEP::cm -
135 activeParams.getLength("endcap_hz") * CLHEP::cm
136 );
137
138 new G4PVPlacement(rot_he3tube, He3endcapposTop, l_He3endcap, "p_He3endcapTop", &topVolume, false, 1);
139 new G4PVPlacement(rot_he3tube, He3endcapposBot, l_He3endcap, "p_He3endcapBot", &topVolume, false, 1);
140
141 //create he3 inactif gas
142 G4double GasinnerRadius = 0.;
143 G4Tubs* s_iHe3Gas = new G4Tubs("s_iHe3Gas",
144 GasinnerRadius,
145 activeParams.getLength("tube_innerRadius")*CLHEP::cm,
146 activeParams.getLength("tube_hz")*CLHEP::cm,
147 startAngle, spanningAngle);
148
149 //string matGas = activeParams.getString("MaterialGas");
150 G4LogicalVolume* l_iHe3Gas = new G4LogicalVolume(s_iHe3Gas, gHe3, "l_iHe3Gas");
151 l_iHe3Gas->SetVisAttributes(l_He3TubeVisAtt);
152
153 new G4PVPlacement(rot_he3tube, He3TUBEpos, l_iHe3Gas, "p_iHe3Gas", &topVolume, false, 1);
154
155 //create he3 actif gas
156 G4Tubs* s_He3Gas = new G4Tubs("s_He3Gas",
157 GasinnerRadius,
158 activeParams.getLength("gas_outerRadius")*CLHEP::cm,
159 activeParams.getLength("gas_hz")*CLHEP::cm,
160 startAngle, spanningAngle);
161
162 G4LogicalVolume* l_He3Gas = new G4LogicalVolume(s_He3Gas, gHe3, "l_He3Gas", 0, m_sensitive);
163 l_He3Gas->SetVisAttributes(l_He3TubeVisAtt);
164 //Lets limit the Geant4 stepsize inside the volume
165 l_He3Gas->SetUserLimits(new G4UserLimits(stepSize));
166
167 new G4PVPlacement(0, G4ThreeVector(0, 0, activeParams.getLength("SV_offset_inZ")*CLHEP::cm), l_He3Gas, "p_He3Gas", l_iHe3Gas, false,
168 detID);
169 B2INFO("HE3-tube-Sensitive-Volume-" << detID << " placed at: (" << He3TUBEpos.getX() << "," << He3TUBEpos.getY() << "," <<
170 He3TUBEpos.getZ() + activeParams.getLength("SV_offset_inZ")*CLHEP::cm << ") mm");
171 detID++;
172 }
173 }
174 } // he3tube namespace
176} // Belle2 namespace
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
static G4Material * get(const std::string &name)
Find given material.
Definition: Materials.h:63
virtual ~He3tubeCreator()
Destructor.
virtual void create(const GearDir &content, G4LogicalVolume &topVolume, geometry::GeometryTypes type)
Creation of the detector geometry from Gearbox (XML).
SensitiveDetector * m_sensitive
SensitiveDetector He-3 tube.
Sensitive Detector implementation of the HE3TUBE detector.
GeometryTypes
Flag indicating the type of geometry to be used.
geometry::CreatorFactory< He3tubeCreator > He3tubeFactory("HE3TUBECreator")
Creator creates the He-3 tube geometry.
Abstract base class for different kinds of events.
STL namespace.
Very simple class to provide an easy way to register creators with the CreatorManager.