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