13#include <G4Polycone.hh>
14#include <G4Polyhedra.hh>
39 object->SetDefaultUnit(unit);
45 const G4double edge_x,
46 const G4double x_delta,
47 const G4double edge_y,
const G4double y_delta,
const G4double edge_z,
48 const G4double z_delta) {
50 object->SetXEdgeDelta(unit, edge_x, x_delta)
51 ->SetYEdgeDelta(unit, edge_y, y_delta)
52 ->SetZEdgeDelta(unit, edge_z, z_delta);
57 const G4double x_delta,
58 const G4double edge_y,
59 const G4double y_delta,
const G4double edge_z,
const G4double z_delta) {
61 object->SetXEdgeDelta(edge_x, x_delta)
62 ->SetYEdgeDelta(edge_y, y_delta)
63 ->SetZEdgeDelta(edge_z, z_delta);
68 const G4double x_full_size,
69 const G4double y_full_size,
70 const G4double edge_z,
const G4double z_delta) {
71 if (x_full_size <= 0 || y_full_size <= 0) {
72 throw std::invalid_argument(
"Error in CreateZDeltaBoxBuilder(): for volume " + name
73 +
": Sizes provided without end offsets must be positive.\n");
76 object->SetXSize(unit, x_full_size)
77 ->SetYSize(unit, y_full_size)
78 ->SetZEdgeDelta(unit, edge_z, z_delta);
83 const G4double y_full_size,
const G4double edge_z,
84 const G4double z_delta) {
85 if (x_full_size <= 0 || y_full_size <= 0) {
86 throw std::invalid_argument(
"Error in CreateZDeltaBoxBuilder(): for volume " + name
87 +
": Sizes provided without end offsets must be positive.\n");
90 object->SetXSize(x_full_size)
91 ->SetYSize(y_full_size)
92 ->SetZEdgeDelta(edge_z, z_delta);
97 const G4double x_full_size,
const G4double y_full_size,
98 const G4double z_full_size) {
99 if (x_full_size <= 0 || y_full_size <= 0 || z_full_size <= 0) {
100 throw std::invalid_argument(
"Error in CreateCenteredBoxBuilder(): for volume " + name
101 +
": Sizes provided must be positive.\n");
104 object->SetXSize(unit, x_full_size)
105 ->SetYSize(unit, y_full_size)
106 ->SetZSize(unit, z_full_size);
111 const G4double y_full_size,
112 const G4double z_full_size) {
113 if (x_full_size <= 0 || y_full_size <= 0 || z_full_size <= 0) {
114 throw std::invalid_argument(
"Error in CreateCenteredBoxBuilder(): for volume " + name
115 +
": Sizes provided must be positive.\n");
118 object->SetXSize(x_full_size)
119 ->SetYSize(y_full_size)
120 ->SetZSize(z_full_size);
125 const G4double x_edge2,
const G4double y_edge1,
126 const G4double y_edge2,
const G4double z_edge1,
const G4double z_edge2) {
128 object->SetXEdges(x_edge1, x_edge2)
129 ->SetYEdges(y_edge1, y_edge2)
130 ->SetZEdges(z_edge1, z_edge2);
135 const G4double x_edge1,
const G4double x_edge2,
136 const G4double y_edge1,
const G4double y_edge2,
const G4double z_edge1,
137 const G4double z_edge2) {
139 object->SetXEdges(unit, x_edge1, x_edge2)
140 ->SetYEdges(unit, y_edge1, y_edge2)
141 ->SetZEdges(unit, z_edge1, z_edge2);
145 BoxBuilderPtr BoxBuilder::SetXSizeDimensioned(
const G4double size) {
150 BoxBuilderPtr BoxBuilder::SetYSizeDimensioned(
const G4double size) {
155 BoxBuilderPtr BoxBuilder::SetZSizeDimensioned(
const G4double size) {
160 BoxBuilderPtr BoxBuilder::SetInternalOffsetDimensioned(
const G4double x,
const G4double y,
162 this->builder_configs_->internal_offset = G4ThreeVector(x, y, z);
163 PropagateTransform();
211 return SetXSizeDimensioned(x_size * unit);
215 return SetYSizeDimensioned(y_size * unit);
219 return SetZSizeDimensioned(z_size * unit);
224 const G4double x_edge2) {
225 G4double size = std::abs(x_edge2 - x_edge1);
226 G4double offset = (x_edge1 + x_edge2) / 2.0;
227 SetXSizeDimensioned(size * unit);
228 return SetInternalOffsetDimensioned(
230 this->builder_configs_->internal_offset.y(),
231 this->builder_configs_->internal_offset.z()
236 const G4double y_edge2) {
237 G4double size = std::abs(y_edge2 - y_edge1);
238 G4double offset = (y_edge1 + y_edge2) / 2.0;
239 SetYSizeDimensioned(size * unit);
240 return SetInternalOffsetDimensioned(
241 this->builder_configs_->internal_offset.x(),
243 this->builder_configs_->internal_offset.z()
248 const G4double z_edge2) {
249 G4double size = std::abs(z_edge2 - z_edge1);
250 G4double offset = (z_edge1 + z_edge2) / 2.0;
251 SetZSizeDimensioned(size * unit);
252 return SetInternalOffsetDimensioned(
253 this->builder_configs_->internal_offset.x(),
254 this->builder_configs_->internal_offset.y(),
261 const G4double x_delta) {
262 G4double size = std::abs(x_delta);
263 G4double offset = x_edge + x_delta / 2.0;
264 SetXSizeDimensioned(size * unit);
265 return SetInternalOffsetDimensioned(
267 this->builder_configs_->internal_offset.y(),
268 this->builder_configs_->internal_offset.z()
273 const G4double y_delta) {
274 G4double size = std::abs(y_delta);
275 G4double offset = y_edge + y_delta / 2.0;
276 SetYSizeDimensioned(size * unit);
277 return SetInternalOffsetDimensioned(
278 this->builder_configs_->internal_offset.x(),
280 this->builder_configs_->internal_offset.z()
285 const G4double z_delta) {
286 G4double size = std::abs(z_delta);
287 G4double offset = z_edge + z_delta / 2.0;
288 SetZSizeDimensioned(size * unit);
289 return SetInternalOffsetDimensioned(
290 this->builder_configs_->internal_offset.x(),
291 this->builder_configs_->internal_offset.y(),
297 const G4double y,
const G4double z) {
298 return SetInternalOffsetDimensioned(x * unit, y * unit, z * unit);
301 BoxBuilder::BoxBuilder(
const G4String &name) {
302 this->builder_configs_->name = name;
307 BoxBuilder::BoxBuilder(
const BoxBuilder &other) : VolumeBuilder<BoxBuilder>(other),
309 x_size_(other.x_size_),
310 y_size_(other.y_size_),
311 z_size_(other.z_size_) {
313 SetName(other.GetBuilderName());
314 builder_configs_->internal_offset = other.builder_configs_->internal_offset;
319 if (this->solid_ptr_.get() !=
nullptr) {
320 std::string error =
"Error in BoxBuilder::SolidConstructor: A solid was already built\n"
321 "You can copy and rename the builder to reset it and build again.";
322 throw std::runtime_error(error);
326 <<
"x_size: " << x_size_ <<
" y_size: " << y_size_ <<
" z_size: " << z_size_ <<
328 G4cout <<
"Internal offset: " << this->builder_configs_->internal_offset << G4endl;
329 return new G4Box(name, x_size_ / 2.0, y_size_ / 2.0, z_size_ / 2.0);
std::shared_ptr< T > shared_from_this()
void set_shared_from_this_enabled(bool enabled)
Builder class for simple Box solids.
BoxBuilderPtr SetXSize(G4double x_size)
G4VSolid * SolidConstructor(const G4String &name) override
The polymorphic Solid constructor.
BoxBuilderPtr SetZSize(G4double z_size)
BoxBuilderPtr SetInternalOffset(G4double x, G4double y, G4double z)
BoxBuilderPtr SetZEdgeDelta(G4double z_edge, G4double z_delta)
BoxBuilderPtr SetXEdgeDelta(G4double x_edge, G4double x_delta)
BoxBuilderPtr SetYEdgeDelta(G4double y_edge, G4double y_delta)
BoxBuilderPtr SetXEdges(G4double x_edge1, G4double x_edge2)
BoxBuilderPtr SetYEdges(G4double y_edge1, G4double y_edge2)
BoxBuilderPtr SetYSize(G4double y_size)
BoxBuilderPtr SetZEdges(G4double z_edge1, G4double z_edge2)
DerivedPtr SetName(const G4String &name)
SetName Sets name used for solid and derived product names.
G4String GetBuilderName() const
A wrapper for std::shared_ptr that allows and facilitates many implicit(i) type conversions.
BoxBuilderPtr CreateCenteredBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double z_full_size)
Create a Box solid.
BoxBuilderPtr CreateDeltasBoxBuilder(const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z, G4double z_delta)
Create a Box solid.
BoxBuilderPtr CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1, G4double x_edge2, G4double y_edge1, G4double y_edge2, G4double z_edge1, G4double z_edge2)
Create a Box solid from edge coordinates.
BoxBuilderPtr CreateBoxBuilder(const G4String &name)
BoxBuilderPtr CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta)
Create a Box solid.
G4double GetEffectiveDefaultUnit() const
Get the builder default unit or global if not set.
SharedPtr< BoxBuilder > BoxBuilderPtr