DLG4::VolumeBuilders
A fluent interface for Geant4 geometry definition.
Loading...
Searching...
No Matches
BoxBuilder.hh
Go to the documentation of this file.
1#pragma once
2
3/*
4 * BoxBuilder.hh
5 *
6 * Created on: Jun 19, 2024
7 * Author: D. S. Leonard
8 *
9 *
10 *
11 */
12
19#include "VolumeBuilder.hh"
21// ReSharper disable once CppUnusedIncludeDirective
22#include <memory>
23
24namespace DLG4::VolumeBuilders {
25 // See other Derived classes, or better yet the Factories "Topic" in the Doxygen html manual,
26 // For Factories for other types of shapes or sources.
27
42 BoxBuilderPtr CreateBoxBuilder(const G4String &name);
43
52 BoxBuilderPtr CreateBoxBuilder(const G4String &name, G4double unit);
53
67 const G4String &name, G4double x_full_size, G4double y_full_size, G4double z_full_size);
68
81 (G4double unit, const G4String &name, G4double x_full_size, G4double y_full_size,
82 G4double z_full_size);
83
97 const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z,
98 G4double z_delta);
99
113 (G4double unit, const G4String &name, G4double x_full_size, G4double y_full_size,
114 G4double edge_z, G4double z_delta);
115
116
132 const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta,
133 G4double edge_z, G4double z_delta);
134
150 const G4String &name, G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta,
151 G4double edge_z, G4double z_delta);
152
167 BoxBuilderPtr CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1, G4double x_edge2,
168 G4double y_edge1,
169 G4double y_edge2, G4double z_edge1, G4double z_edge2);
170
185 BoxBuilderPtr CreateEdgesBoxBuilder(G4double unit, const G4String &name, G4double x_edge1,
186 G4double x_edge2,
187 G4double y_edge1, G4double y_edge2, G4double z_edge1, G4double z_edge2);
188
191}
192
194
204 class BoxBuilder final: public VolumeBuilder<BoxBuilder> {
205 public:
207 friend class VolumeBuilder<BoxBuilder>; // shouldn't be needed, maybe isn't now.
208 template <typename T>
209 friend class i_shared_ptr; // needed in principle, but maybe not for this class.
210
211 // Friend all the factories. Keeping them external is easier for users, but more boilerplate.
212 friend BoxBuilderPtr VB::CreateBoxBuilder(const G4String &name);
213 friend BoxBuilderPtr VB::CreateBoxBuilder(const G4String &name, G4double unit);
214 friend BoxBuilderPtr VB::CreateDeltasBoxBuilder(const G4String &name, G4double edge_x,
215 G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z, G4double z_delta);
216 friend BoxBuilderPtr VB::CreateDeltasBoxBuilder(G4double unit, const G4String &name,
217 G4double edge_x, G4double x_delta, G4double edge_y, G4double y_delta, G4double edge_z,
218 G4double z_delta);
219 friend BoxBuilderPtr VB::CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size,
220 G4double y_full_size, G4double edge_z, G4double z_delta);
221 friend BoxBuilderPtr VB::CreateZDeltaBoxBuilder(G4double unit, const G4String &name,
222 G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta);
223 friend BoxBuilderPtr VB::CreateCenteredBoxBuilder(const G4String &name, G4double x_full_size,
224 G4double y_full_size, G4double z_full_size);
225 friend BoxBuilderPtr VB::CreateCenteredBoxBuilder(G4double unit, const G4String &name,
226 G4double x_full_size, G4double y_full_size, G4double z_full_size);
227 friend BoxBuilderPtr VB::CreateEdgesBoxBuilder(const G4String &name, G4double x_edge1,
228 G4double x_edge2, G4double y_edge1, G4double y_edge2, G4double z_edge1,
229 G4double z_edge2);
230 friend BoxBuilderPtr VB::CreateEdgesBoxBuilder(G4double unit, const G4String &name,
231 G4double x_edge1, G4double x_edge2, G4double y_edge1, G4double y_edge2,
232 G4double z_edge1, G4double z_edge2);
233
234 BoxBuilderPtr SetXSize(G4double x_size);
235 BoxBuilderPtr SetYSize(G4double y_size);
236 BoxBuilderPtr SetZSize(G4double z_size);
237
238 BoxBuilderPtr SetXEdges(G4double x_edge1, G4double x_edge2);
239 BoxBuilderPtr SetYEdges(G4double y_edge1, G4double y_edge2);
240 BoxBuilderPtr SetZEdges(G4double z_edge1, G4double z_edge2);
241
242 BoxBuilderPtr SetXEdgeDelta(G4double x_edge, G4double x_delta);
243 BoxBuilderPtr SetYEdgeDelta(G4double y_edge, G4double y_delta);
244 BoxBuilderPtr SetZEdgeDelta(G4double z_edge, G4double z_delta);
245
246 BoxBuilderPtr SetInternalOffset(G4double x, G4double y, G4double z);
247
248 // BoxBuilder method overloads with a leading `unit` parameter.
249 // These allow for a per-call unit override.
250
251 BoxBuilderPtr SetXSize(G4double unit, G4double x_size);
252 BoxBuilderPtr SetYSize(G4double unit, G4double y_size);
253 BoxBuilderPtr SetZSize(G4double unit, G4double z_size);
254
255 BoxBuilderPtr SetXEdges(G4double unit, G4double x_edge1, G4double x_edge2);
256 BoxBuilderPtr SetYEdges(G4double unit, G4double y_edge1, G4double y_edge2);
257 BoxBuilderPtr SetZEdges(G4double unit, G4double z_edge1, G4double z_edge2);
258
259 BoxBuilderPtr SetXEdgeDelta(G4double unit, G4double x_edge, G4double x_delta);
260 BoxBuilderPtr SetYEdgeDelta(G4double unit, G4double y_edge, G4double y_delta);
261 BoxBuilderPtr SetZEdgeDelta(G4double unit, G4double z_edge, G4double z_delta);
262
263 BoxBuilderPtr SetInternalOffset(G4double unit, G4double x, G4double y, G4double z);
264
265 private:
266 BoxBuilderPtr SetXSizeDimensioned(G4double x_size);
267 BoxBuilderPtr SetYSizeDimensioned(G4double y_size);
268 BoxBuilderPtr SetZSizeDimensioned(G4double z_size);
269 BoxBuilderPtr SetInternalOffsetDimensioned(G4double x, G4double y, G4double z);
270
271 protected:
273 G4VSolid *SolidConstructor(const G4String &name) override;
274
275 private:
276 explicit BoxBuilder(const G4String &name);
277
278 BoxBuilder(const BoxBuilder &other);
279
280 // offset of box from center. This effectively redefines the center of the solid
281 // as far as the builder behavior.
282 G4double z_size_{};
283 G4double x_size_{};
284 G4double y_size_{};
285 G4double unit_{};
286
287
288 BoxBuilder() = default;
289 BoxBuilder(BoxBuilder &&) noexcept = delete;
290
291 // BoxBuilderPtr Clone() const override {
292 // return BoxBuilderPtr(new BoxBuilder(*this));
293 // }
294 };
295}
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)
A polymorphic, type-erased builder referencing any specialized builder.
VolumeBuilder: Common functionality for volume builder classes.
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.
Definition BoxBuilder.cc:57
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)
Create an unconfigured Box Solid, for use with SetXEdges() etc... Uses the global default unit unless...
Definition BoxBuilder.cc:33
BoxBuilderPtr CreateZDeltaBoxBuilder(const G4String &name, G4double x_full_size, G4double y_full_size, G4double edge_z, G4double z_delta)
Create a Box solid.
Definition BoxBuilder.cc:83