9#include <beast/bgo/geometry/BgoCreator.h>
10#include <beast/bgo/simulation/SensitiveDetector.h>
12#include <geometry/CreatorFactory.h>
13#include <framework/gearbox/GearDir.h>
14#include <framework/logging/Logger.h>
16#include <boost/format.hpp>
17#include <boost/foreach.hpp>
18#include <boost/algorithm/string.hpp>
20#include <G4LogicalVolume.hh>
21#include <G4PVPlacement.hh>
25#include <G4UserLimits.hh>
26#include "G4NistManager.hh"
60 G4NistManager* man = G4NistManager::Instance();
62 G4bool isotopes =
false;
64 G4Element* O = man->FindOrBuildElement(
"O", isotopes);
65 G4Element* Bi = man->FindOrBuildElement(
"Bi", isotopes);
66 G4Element* Ge = man->FindOrBuildElement(
"Ge", isotopes);
68 G4Material* BGO_BGO =
new G4Material(
"BGO_BGO",
69 7.13 * CLHEP::g / CLHEP::cm3,
71 BGO_BGO->AddElement(O, 12);
72 BGO_BGO->AddElement(Bi, 4);
73 BGO_BGO->AddElement(Ge, 3);
76 double stepSize = content.getLength(
"stepSize", 5 * CLHEP::um);
80 vector<double> bar = content.getArray(
"bar");
81 B2INFO(
"Contents of bar: ");
82 BOOST_FOREACH(
double value, bar) {
83 B2INFO(
"value: " << value);
87 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
90 G4Trap* s_BGO =
new G4Trap(
"s_BGO",
91 activeParams.
getLength(
"cDz") / 2.*CLHEP::cm,
94 activeParams.
getLength(
"cDy1") / 2.*CLHEP::cm,
95 activeParams.
getLength(
"cDx2") / 2.*CLHEP::cm,
96 activeParams.
getLength(
"cDx1") / 2.*CLHEP::cm, 0,
97 activeParams.
getLength(
"cDy2") / 2.*CLHEP::cm,
98 activeParams.
getLength(
"cDx4") / 2.*CLHEP::cm,
99 activeParams.
getLength(
"cDx3") / 2.*CLHEP::cm, 0);
102 G4LogicalVolume* l_BGO =
new G4LogicalVolume(s_BGO, BGO_BGO,
"l_BGO", 0,
m_sensitive);
108 l_BGO->SetUserLimits(
new G4UserLimits(stepSize));
122 double px = activeParams.
getDouble(
"px");
123 double py = activeParams.
getDouble(
"py");
124 double pz = activeParams.
getDouble(
"pz");
125 double angle = activeParams.
getDouble(
"angle");
126 double rx = activeParams.
getDouble(
"rx");
127 double ry = activeParams.
getDouble(
"ry");
128 double rz = activeParams.
getDouble(
"rz");
130 G4RotationMatrix* pRot =
new G4RotationMatrix();
131 pRot->rotate(-angle, G4ThreeVector(rx, ry, rz));
133 new G4PVPlacement(pRot, G4ThreeVector(px, py, pz), l_BGO,
"p_BGO", &topVolume,
false, detID);
135 B2INFO(
"BGO-" << detID <<
" placed at: (" << px <<
"," << py <<
"," << pz <<
")" <<
" mm ");
137 B2INFO(
" rotation of " << -angle <<
" degree a long (" << rx <<
"," << ry <<
"," << rz <<
") axis");
GearDir is the basic class used for accessing the parameter store.
virtual ~BgoCreator()
Destructor.
virtual void create(const GearDir &content, G4LogicalVolume &topVolume, geometry::GeometryTypes type)
Creation of the detector geometry from Gearbox (XML).
SensitiveDetector * m_sensitive
SensitiveDetector BGO.
Sensitive Detector implementation of the BGO detector.
double getDouble(const std::string &path="") const noexcept(false)
Get the parameter path as a double.
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
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.
Very simple class to provide an easy way to register creators with the CreatorManager.