9#include <beast/he3tube/geometry/He3tubeCreator.h>
10#include <beast/he3tube/simulation/SensitiveDetector.h>
12#include <geometry/Materials.h>
13#include <geometry/CreatorFactory.h>
14#include <framework/gearbox/GearDir.h>
15#include <framework/logging/Logger.h>
17#include <boost/format.hpp>
18#include <boost/foreach.hpp>
19#include <boost/algorithm/string.hpp>
21#include <G4LogicalVolume.hh>
22#include <G4PVPlacement.hh>
25#include <G4UserLimits.hh>
29#include <G4VisAttributes.hh>
65 G4double abundance, density;
68 G4Isotope* iHe3 =
new G4Isotope(
"iHe3", z = 2, n = 3, a = 3.0160293 * CLHEP::g / CLHEP::mole);
69 G4Element* eHe3 =
new G4Element(
"eHe3", symbol =
"eHe3", ncomponents = 1);
70 eHe3->AddIsotope(iHe3, abundance = 100.);
71 G4Material* gHe3 =
new G4Material(
"gHe3", density = 0.00066 * CLHEP::g / CLHEP::cm3, ncomponents = 1);
72 gHe3->AddElement(eHe3, 1);
75 double stepSize = content.getLength(
"stepSize", 5 * CLHEP::um);
81 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
84 G4double startAngle = 0.*CLHEP::deg;
85 G4double spanningAngle = 360.*CLHEP::deg;
86 G4Tubs* s_He3TUBE =
new G4Tubs(
"s_He3TUBE",
87 activeParams.
getLength(
"tube_innerRadius")*CLHEP::cm,
88 activeParams.
getLength(
"tube_outerRadius")*CLHEP::cm,
89 activeParams.
getLength(
"tube_hz")*CLHEP::cm,
90 startAngle, spanningAngle);
92 string matTube = activeParams.
getString(
"MaterialTube");
95 G4VisAttributes* l_He3TubeVisAtt =
new G4VisAttributes(G4Colour(0, 1.0, 1.0, 1.0));
96 l_He3TUBE->SetVisAttributes(l_He3TubeVisAtt);
99 G4ThreeVector He3TUBEpos = G4ThreeVector(
100 activeParams.
getLength(
"x_he3tube") * CLHEP::cm,
101 activeParams.
getLength(
"y_he3tube") * CLHEP::cm,
102 activeParams.
getLength(
"z_he3tube") * CLHEP::cm
105 G4RotationMatrix* rot_he3tube =
new G4RotationMatrix();
106 rot_he3tube->rotateX(activeParams.
getAngle(
"AngleX"));
107 rot_he3tube->rotateY(activeParams.
getAngle(
"AngleY"));
108 rot_he3tube->rotateZ(activeParams.
getAngle(
"AngleZ"));
112 new G4PVPlacement(rot_he3tube, He3TUBEpos, l_He3TUBE,
"p_He3TUBE", &topVolume,
false, 1);
114 B2INFO(
"HE3-tube-" << detID <<
" placed at: " << He3TUBEpos <<
" mm");
117 G4double EndcapinnerRadius = 0.;
118 G4Tubs* s_He3endcap =
new G4Tubs(
"s_He3endcap",
120 activeParams.
getLength(
"tube_outerRadius")*CLHEP::cm,
121 activeParams.
getLength(
"endcap_hz")*CLHEP::cm,
122 startAngle, spanningAngle);
126 l_He3endcap->SetVisAttributes(l_He3TubeVisAtt);
129 G4ThreeVector He3endcapposTop = G4ThreeVector(
130 activeParams.
getLength(
"x_he3tube") * CLHEP::cm,
131 activeParams.
getLength(
"y_he3tube") * CLHEP::cm,
132 activeParams.
getLength(
"z_he3tube") * CLHEP::cm + activeParams.
getLength(
"tube_hz") * CLHEP::cm +
133 activeParams.
getLength(
"endcap_hz") * CLHEP::cm
136 G4ThreeVector He3endcapposBot = G4ThreeVector(
137 activeParams.
getLength(
"x_he3tube") * CLHEP::cm,
138 activeParams.
getLength(
"y_he3tube") * CLHEP::cm,
139 activeParams.
getLength(
"z_he3tube") * CLHEP::cm - activeParams.
getLength(
"tube_hz") * CLHEP::cm -
140 activeParams.
getLength(
"endcap_hz") * CLHEP::cm
143 new G4PVPlacement(rot_he3tube, He3endcapposTop, l_He3endcap,
"p_He3endcapTop", &topVolume,
false, 1);
144 new G4PVPlacement(rot_he3tube, He3endcapposBot, l_He3endcap,
"p_He3endcapBot", &topVolume,
false, 1);
147 G4double GasinnerRadius = 0.;
148 G4Tubs* s_iHe3Gas =
new G4Tubs(
"s_iHe3Gas",
150 activeParams.
getLength(
"tube_innerRadius")*CLHEP::cm,
151 activeParams.
getLength(
"tube_hz")*CLHEP::cm,
152 startAngle, spanningAngle);
155 G4LogicalVolume* l_iHe3Gas =
new G4LogicalVolume(s_iHe3Gas, gHe3,
"l_iHe3Gas");
156 l_iHe3Gas->SetVisAttributes(l_He3TubeVisAtt);
158 new G4PVPlacement(rot_he3tube, He3TUBEpos, l_iHe3Gas,
"p_iHe3Gas", &topVolume,
false, 1);
161 G4Tubs* s_He3Gas =
new G4Tubs(
"s_He3Gas",
163 activeParams.
getLength(
"gas_outerRadius")*CLHEP::cm,
164 activeParams.
getLength(
"gas_hz")*CLHEP::cm,
165 startAngle, spanningAngle);
167 G4LogicalVolume* l_He3Gas =
new G4LogicalVolume(s_He3Gas, gHe3,
"l_He3Gas", 0,
m_sensitive);
168 l_He3Gas->SetVisAttributes(l_He3TubeVisAtt);
170 l_He3Gas->SetUserLimits(
new G4UserLimits(stepSize));
172 new G4PVPlacement(0, G4ThreeVector(0, 0, activeParams.
getLength(
"SV_offset_inZ")*CLHEP::cm), l_He3Gas,
"p_He3Gas", l_iHe3Gas,
false,
174 B2INFO(
"HE3-tube-Sensitive-Volume-" << detID <<
" placed at: (" << He3TUBEpos.getX() <<
"," << He3TUBEpos.getY() <<
"," <<
175 He3TUBEpos.getZ() + activeParams.
getLength(
"SV_offset_inZ")*CLHEP::cm <<
") mm");
GearDir is the basic class used for accessing the parameter store.
virtual std::string getString(const std::string &path="") const noexcept(false) override
Get the parameter path as a string.
double getAngle(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard angle unit.
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
static G4Material * get(const std::string &name)
Find given material.
virtual ~He3tubeCreator()
Destructor.
He3tubeCreator()
Constructor.
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 indiciating 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.
Very simple class to provide an easy way to register creators with the CreatorManager.