9#include <vxd/geometry/GeoHeavyMetalShieldCreator.h>
11#include <geometry/Materials.h>
12#include <geometry/CreatorFactory.h>
13#include <geometry/utilities.h>
14#include <framework/gearbox/GearDir.h>
15#include <framework/gearbox/Unit.h>
16#include <framework/logging/Logger.h>
19#include <boost/format.hpp>
20#include <boost/algorithm/string.hpp>
21#include <boost/math/special_functions/sign.hpp>
23#include <G4LogicalVolume.hh>
24#include <G4PVPlacement.hh>
25#include <G4AssemblyVolume.hh>
30#include <G4Polycone.hh>
31#include <G4SubtractionSolid.hh>
42 using namespace geometry;
54 for (
const GearDir& shield : param.getNodes(
"Shield")) {
56 shield.getString(
"@name"),
57 shield.getString(
"Material",
"Air"),
58 shield.getAngle(
"minPhi", 0),
59 shield.getAngle(
"maxPhi", 2 * M_PI),
60 (shield.getNodes(
"Cutout").size() > 0),
62 shield.getLength(
"Cutout/width1", 0.),
63 shield.getLength(
"Cutout/width2", 0.),
64 shield.getLength(
"Cutout/height", 0.),
65 shield.getLength(
"Cutout/depth", 0.)
68 for (
const GearDir& plane : shield.getNodes(
"Plane")) {
70 plane.getLength(
"posZ"),
71 plane.getLength(
"innerRadius"),
72 plane.getLength(
"outerRadius")
74 shieldPar.
getPlanes().push_back(planePar);
77 heavyMetalShieldGeometryPar.
getShields().push_back(shieldPar);
79 return heavyMetalShieldGeometryPar;
89 string name = shield.getName();
90 double minZ(0), maxZ(0);
93 double minPhi = shield.getMinPhi();
94 double dPhi = shield.getMaxPhi() - minPhi;
95 int nPlanes = shield.getPlanes().size();
97 B2ERROR(
"Polycone needs at least two planes");
100 std::vector<double> z(nPlanes, 0);
101 std::vector<double> rMin(nPlanes, 0);
102 std::vector<double> rMax(nPlanes, 0);
104 minZ = numeric_limits<double>::infinity();
105 maxZ = -numeric_limits<double>::infinity();
109 z[index] = plane.getPosZ() /
Unit::mm;
110 minZ = min(minZ, z[index]);
111 maxZ = max(maxZ, z[index]);
112 rMin[index] = plane.getInnerRadius() /
Unit::mm;
113 rMax[index] = plane.getOuterRadius() /
Unit::mm;
117 G4VSolid* geoShield =
new G4Polycone(name +
" IR Shield", minPhi, dPhi, nPlanes, z.data(), rMin.data(), rMax.data());
120 if (shield.getDoCutOut()) {
122 double sizeX1 = shield.getCutOutWidth1() /
Unit::mm / 2.;
123 double sizeX2 = shield.getCutOutWidth2() /
Unit::mm / 2.;
124 double sizeY = shield.getCutOutHeight() /
Unit::mm / 2.;
125 double depth2 = shield.getCutOutDepth() /
Unit::mm / 2.;
126 double sizeZ = (maxZ - minZ) / 2.;
127 double sign = math::sign<double>(minZ);
128 double minAbsZ = min(fabs(minZ), fabs(maxZ));
130 G4ThreeVector origin1(0, 0, sign * (minAbsZ + sizeZ));
131 G4ThreeVector origin2(0, 0, sign * (minAbsZ + depth2));
134 G4Trd* box1 =
new G4Trd(
"Cutout1", sizeX1, sizeX2, sizeY, sizeY, sizeZ);
135 G4Box* box2 =
new G4Box(
"Cutout2", 100 /
Unit::mm, sizeY, depth2);
137 geoShield =
new G4SubtractionSolid(name +
" IR Shield", geoShield, box1, G4Translate3D(origin1));
138 geoShield =
new G4SubtractionSolid(name +
" IR Shield", geoShield, box2, G4Translate3D(origin2));
141 string materialName = shield.getMaterial();
143 if (!material) B2FATAL(
"Material '" << materialName <<
"', required by " << name <<
" IR Shield could not be found");
145 G4LogicalVolume* volume =
new G4LogicalVolume(geoShield, material, name +
" IR Shield");
148 new G4PVPlacement(0, G4ThreeVector(0, 0, 0), volume, name +
" IR Shield", &topVolume,
false, 0);
GearDir is the basic class used for accessing the parameter store.
static const double mm
[millimeters]
The Class for VXD PolyCone, possibly with coutouts.
std::vector< VXDPolyConePlanePar > & getPlanes(void)
Get planes.
The Class for VXD Polycone Plane.
static G4Material * get(const std::string &name)
Find given material.
CreatorFactory< GeoHeavyMetalShieldCreator > GeoHeavyMetalShieldFactory("HeavyMetalShieldCreator")
Register the creator.
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.
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.