12 #include <structure/geometry/GeoSTRCreator.h>
13 #include "structure/dbobjects/STRGeometryPar.h"
15 #include <geometry/Materials.h>
16 #include <geometry/CreatorFactory.h>
17 #include <geometry/utilities.h>
19 #include <framework/logging/Logger.h>
22 #include <boost/format.hpp>
26 #include <G4NistManager.hh>
27 #include <G4LogicalVolume.hh>
28 #include <G4PVPlacement.hh>
29 #include <G4Polycone.hh>
30 #include <G4VisAttributes.hh>
41 using namespace geometry;
48 geometry::CreatorFactory<GeoSTRCreator>
GeoSTRFactory(
"STRCreator");
52 GeoSTRCreator::GeoSTRCreator()
58 GeoSTRCreator::~GeoSTRCreator()
71 for (
int iShield = 0; iShield < parameters.NECLSHIELDS; iShield++) {
74 if (iShield == parameters.FWD_ECLSHIELD) {
76 }
else if (iShield == parameters.BWD_ECLSHIELD) {
79 B2FATAL(
"Only 2 ECL shields should be defined. Can't retrieve info for shield #" << iShield);
82 int nLayers = parameters.getNLayers(iShield);
84 for (
int iLayer = 0; iLayer < nLayers; iLayer++) {
85 G4Material* LayerMat = Materials::get(parameters.getLayerMaterial(iShield, iLayer));
86 int nPlanes = parameters.getLayerNPlanes(iShield, iLayer);
89 string shapeName = (boost::format(
"%1%Layer_%2%") % side % (iLayer + 1)).str();
90 string logiVolName = (boost::format(
"logi%1%Layer_%2%") % side % (iLayer + 1)).str();
91 string physVolName = (boost::format(
"phys%1%Layer_%2%") % side % (iLayer + 1)).str();
93 G4Polycone* LayerShape =
new G4Polycone(shapeName.c_str(), 0, 2 * M_PI, nPlanes,
94 parameters.getLayerPlaneZ(iShield, iLayer),
95 parameters.getLayerPlaneInnerRadius(iShield, iLayer),
96 parameters.getLayerPlaneOuterRadius(iShield, iLayer));
99 G4LogicalVolume* logiShieldLayer =
new G4LogicalVolume(LayerShape, LayerMat, logiVolName, 0, 0, 0);
102 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logiShieldLayer, physVolName, &topVolume,
false, 0);
104 B2DEBUG(1,
"Mass of " << side <<
" layer " << iLayer
105 <<
" = " << logiShieldLayer->GetMass() / CLHEP::kg <<
".kg.");
107 _mass += (logiShieldLayer->GetMass() / CLHEP::kg);
110 B2DEBUG(1,
"Total mass of side " << side <<
" = " << _mass <<
" kg");
114 for (
int iPole = 0; iPole < parameters.NPOLEPIECES; iPole++) {
117 if (iPole == parameters.FWD_POLEPIECE) {
119 }
else if (iPole == parameters.BWD_POLEPIECE) {
122 B2FATAL(
"Only 2 pole pieces should be defined. Can't retrieve info for pole #" << iPole);
126 G4Material* PoleMat = Materials::get(parameters.getPoleMaterial(iPole));
127 int nPlanes = parameters.getPoleNPlanes(iPole);
130 string shapeName = (boost::format(
"%1%") % side).str();
131 string logiVolName = (boost::format(
"logi%1%") % side).str();
132 string physVolName = (boost::format(
"phys%1%") % side).str();
134 G4Polycone* PoleShape =
new G4Polycone(shapeName.c_str(), 0, 2 * M_PI, nPlanes,
135 parameters.getPolePlaneZ(iPole),
136 parameters.getPolePlaneInnerRadius(iPole),
137 parameters.getPolePlaneOuterRadius(iPole));
140 G4LogicalVolume* logiPole =
new G4LogicalVolume(PoleShape, PoleMat, logiVolName, 0, 0, 0);
143 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), logiPole, physVolName, &topVolume,
false, 0);
145 B2DEBUG(1,
"Total mass of " << side <<
" = " << logiPole->GetMass() / CLHEP::kg <<
" kg");
156 readShield(param, strGeometryPar,
"FWD_Shield");
157 readShield(param, strGeometryPar,
"BWD_Shield");
158 readPole(param, strGeometryPar,
"PolePieceL");
159 readPole(param, strGeometryPar,
"PolePieceR");
162 return strGeometryPar;
168 std::size_t foundF = side.find(
"PolePieceR");
169 std::size_t foundB = side.find(
"PolePieceL");
172 if (foundF != std::string::npos) { iPole = parameters.FWD_POLEPIECE; }
173 else if (foundB != std::string::npos) { iPole = parameters.BWD_POLEPIECE; }
174 else { B2FATAL(
"No data for the Pole Piece requested " << side <<
"(not found)");}
178 std::string polePath = (boost::format(
"/%1%/") % side).str();
182 poleContent.
append(polePath);
185 parameters.setPoleMaterial(iPole, poleContent.
getString(
"Material",
"Air"));
188 const std::vector<GearDir> planes = poleContent.
getNodes(
"Plane");
189 parameters.setPoleNPlanes(iPole, planes.size());
190 B2DEBUG(1,
"Number of planes on side " << side <<
" : " << planes.size());
192 for (
unsigned int iPlane = 0; iPlane < planes.size(); iPlane++) {
193 parameters.setPolePlaneZ(iPole, iPlane, planes.at(iPlane).getLength(
"posZ") / Unit::mm);
194 parameters.setPolePlaneInnerRadius(iPole, iPlane, planes.at(iPlane).getLength(
"innerRadius") / Unit::mm);
195 parameters.setPolePlaneOuterRadius(iPole, iPlane, planes.at(iPlane).getLength(
"outerRadius") / Unit::mm);
204 std::size_t foundF = side.find(
"FWD_Shield");
205 std::size_t foundB = side.find(
"BWD_Shield");
208 if (foundF != std::string::npos) { iShield = parameters.FWD_ECLSHIELD; }
209 else if (foundB != std::string::npos) { iShield = parameters.BWD_ECLSHIELD; }
210 else { B2FATAL(
"No data for the ECL shield called " << side <<
"(not found)");}
213 std::string gearPath = (boost::format(
"%1%/Layers/Layer") % side).str();
216 int nLayers = content.getNumberNodes(gearPath);
217 parameters.setNLayers(iShield, nLayers);
220 for (
int iLayer = 0 ; iLayer < nLayers ; ++iLayer) {
222 std::string layerPath = (boost::format(
"/%1%[%2%]/") % gearPath % (iLayer + 1)).str();
226 layerContent.
append(layerPath);
229 parameters.setLayerMaterial(iShield, iLayer, layerContent.
getString(
"Material",
"Air"));
232 const std::vector<GearDir> planes = layerContent.
getNodes(
"Plane");
233 parameters.setLayerNPlanes(iShield, iLayer, planes.size());
234 B2DEBUG(1,
"Number of planes on side " << side <<
" layer " << iLayer
235 <<
" : " << planes.size());
237 for (
unsigned int iPlane = 0; iPlane < planes.size(); iPlane++) {
238 parameters.setLayerPlaneZ(iShield, iLayer, iPlane, planes.at(iPlane).getLength(
"posZ") / Unit::mm);
239 parameters.setLayerPlaneInnerRadius(iShield, iLayer, iPlane, planes.at(iPlane).getLength(
"innerRadius") / Unit::mm);
240 parameters.setLayerPlaneOuterRadius(iShield, iLayer, iPlane, planes.at(iPlane).getLength(
"outerRadius") / Unit::mm);