|
remage
Simulation framework for HPGe-based experiments
|
#include <RMGVertexConfinement.hh>

Public Member Functions | |
| SampleableObject (const SampleableObject &)=default | |
| SampleableObject (G4VPhysicalVolume *physvol, G4RotationMatrix rot, G4ThreeVector trans, G4VSolid *solid, bool is_native_sampleable=false, bool on_surface=false) | |
| SampleableObject constructor. | |
| bool | IsInside (const G4ThreeVector &vertex) const |
| Check if the vertex is inside the solid. | |
| bool | Sample (G4ThreeVector &vertex, size_t max_attempts, bool force_containment_check, size_t &n_trials) const |
| Generate a sample from the solid. | |
| bool | GenerateSurfacePoint (G4ThreeVector &vertex, size_t max_attempts, size_t max_intersections) const |
| Generate a point on the surface of the solid. | |
| std::vector< G4ThreeVector > | GetIntersections (G4ThreeVector start, G4ThreeVector dir) const |
Get the number of intersections between the solid and the line starting at start with direction dir. | |
| void | GetDirection (G4ThreeVector &dir, G4ThreeVector &pos) const |
| Get a position and direction for the generic surface sampling algorithm. | |
| void | ApplyDepthProfile (G4ThreeVector &local_vertex, const G4VSolid *solid) const |
| Displace a surface point inward according to depth_profile. | |
| void | RecalcMass (int z, int n) |
Public Attributes | |
| G4VPhysicalVolume * | physical_volume = nullptr |
| G4VSolid * | sampling_solid = nullptr |
| G4RotationMatrix | rotation |
| G4ThreeVector | translation |
| double | volume = -1 |
| double | mass = -1 |
| double | surface = -1 |
| bool | surface_sample = false |
| bool | native_sample = false |
| size_t | max_num_intersections = 0 |
| DepthProfile | depth_profile = {} |
| Depth profile applied when displacing vertices inward from the surface. | |
An object which we can generate position samples in. Based on either a G4VPhysicalVolume or geometrical volume defined by a G4VSolid . The sampling can be performed either on the surface or in the volume of the solid.
This structure must contain at least a non-null pointer, between the physical_volume and sampling_solid arguments. The idea is that:
| RMGVertexConfinement::SampleableObject::SampleableObject | ( | G4VPhysicalVolume * | physvol, |
| G4RotationMatrix | rot, | ||
| G4ThreeVector | trans, | ||
| G4VSolid * | solid, | ||
| bool | is_native_sampleable = false, | ||
| bool | on_surface = false ) |
SampleableObject constructor.
| physvol | The physical volume. |
| rot | A rotation matrix for the sampling solid. |
| trans | A translation vector for the sampling solid. |
| solid | A solid for geometrical volume sampling or for generating candidate points or rejection sampling. |
| is_native_sampleable | A flag of whether the solid is natively sampeable. |
| on_surface | A flag of whether the solid should be sampled on the surface. |
| void RMGVertexConfinement::SampleableObject::ApplyDepthProfile | ( | G4ThreeVector & | local_vertex, |
| const G4VSolid * | solid ) const |
Displace a surface point inward according to depth_profile.
Samples a depth from depth_profile and moves local_vertex inward along the outward surface normal of solid. The depth is clamped to the distance to the far boundary (G4VSolid::DistanceToOut) so the vertex stays inside the solid. Does nothing when the profile type is DepthProfile::Type::kNone.
| local_vertex | The surface point, in the local frame of solid. Modified in place. |
| solid | The solid whose surface local_vertex lies on. |
|
nodiscard |
Generate a point on the surface of the solid.
This follows the algorithm from https://arxiv.org/abs/0802.2960.
| vertex | The sampled vertex, |
| max_attempts | The maximum number of attempts to find a valid vertex. |
| max_intersections | The maximum number of intersections possible for the solid, can be an overestimate. |
| void RMGVertexConfinement::SampleableObject::GetDirection | ( | G4ThreeVector & | dir, |
| G4ThreeVector & | pos ) const |
Get a position and direction for the generic surface sampling algorithm.
This generates a point on a bounding sphere, then shifts by some impact parameter, following the algorithm from https://arxiv.org/abs/0802.2960. This produces a uniform and isotropic flux inside the bounding sphere.
| dir | The direction vector for the point. |
| pos | The initial position for the point. |
|
nodiscard |
Get the number of intersections between the solid and the line starting at start with direction dir.
This is used in the generic surface sampling algorithm. This function makes use of the methods DistanceToIn(p,v) and DistanceToOut(p,v) of G4VSolid . It continually looks for the distance to the next boundary (along the line) until this becomes zero indicating there are no more intersections.
| start | The starting vector of the line, note this should be outside the solid. |
| dir | The direction vector. |
|
nodiscard |
Check if the vertex is inside the solid.
| vertex | The sampled vertex. |
|
nodiscard |
Generate a sample from the solid.
Depending on if the solid is a basic one either sample natively, or using rejection sampling. Either samples the volume or the surface depending on the surface_sample member.
| vertex | The sampled vertex. |
| max_attempts | The maximum number of candidate vertices for rejection sampling. |
| force_containment_check | Whether to force a check on where the point is inside the solid. |
| n_trials | The total number of trials performed. |
| DepthProfile RMGVertexConfinement::SampleableObject::depth_profile = {} |
Depth profile applied when displacing vertices inward from the surface.
Only used when surface_sample is true. Defaults to no displacement (DepthProfile::Type::kNone).