Celeritas  0.5.0-56+6b053cd
Classes | Public Member Functions | List of all members
celeritas::OrangeTrackView Class Reference

Navigate through an ORANGE geometry on a single thread. More...

#include <OrangeTrackView.hh>

Classes

struct  DetailedInitializer
 Helper struct for initializing from an existing geometry state. More...
 

Public Types

Type aliases
using ParamsRef = NativeCRef< OrangeParamsData >
 
using StateRef = NativeRef< OrangeStateData >
 
using Initializer_t = GeoTrackInitializer
 

Public Member Functions

CELER_FUNCTION OrangeTrackView (ParamsRef const &params, StateRef const &states, TrackSlotId tid)
 Construct from persistent and state data.
 
CELER_FUNCTION OrangeTrackViewoperator= (Initializer_t const &init)
 Construct the state. More...
 
CELER_FUNCTION OrangeTrackViewoperator= (DetailedInitializer const &init)
 Construct the state from a direction and a copy of the parent state.
 
CELER_FUNCTION Real3 const & pos () const
 The current position.
 
CELER_FUNCTION Real3 const & dir () const
 The current direction.
 
CELER_FUNCTION VolumeId volume_id () const
 The current volume ID. More...
 
CELER_FUNCTION VolumeInstanceId volume_instance_id () const
 The current volume instance. More...
 
CELER_FUNCTION LevelId const & level () const
 The current level.
 
CELER_FUNCTION void volume_instance_id (Span< VolumeInstanceId >) const
 Get the volume instance ID at every level. More...
 
CELER_FUNCTION SurfaceId surface_id () const
 The current surface ID.
 
CELER_FUNCTION SurfaceId next_surface_id () const
 After 'find_next_step', the next straight-line surface.
 
CELER_FUNCTION bool is_outside () const
 Whether the track is outside the valid geometry region.
 
CELER_FUNCTION bool is_on_boundary () const
 Whether the track is exactly on a surface.
 
CELER_FORCEINLINE_FUNCTION bool failed () const
 Whether the last operation resulted in an error.
 
CELER_FUNCTION Propagation find_next_step ()
 Find the distance to the next geometric boundary.
 
CELER_FUNCTION Propagation find_next_step (real_type max_step)
 Find a nearby distance to the next geometric boundary up to a distance. More...
 
CELER_FUNCTION real_type find_safety ()
 Find the distance to the nearest boundary in any direction. More...
 
CELER_FUNCTION real_type find_safety (real_type max_step)
 Find the distance to the nearest nearby boundary. More...
 
CELER_FUNCTION void move_to_boundary ()
 Move to the next straight-line boundary but do not change volume.
 
CELER_FUNCTION void move_internal (real_type step)
 Move within the current volume. More...
 
CELER_FUNCTION void move_internal (Real3 const &pos)
 Move within the current volume to a nearby point. More...
 
CELER_FUNCTION void cross_boundary ()
 Cross from one side of the current surface to the other. More...
 
CELER_FUNCTION void set_dir (Real3 const &newdir)
 Change the track's direction. More...
 

Detailed Description

Navigate through an ORANGE geometry on a single thread.

Ordering requirements:

The main point is that find_next_step depends on the current straight-line direction, move_to_boundary and move_internal (with a step length) depends on that distance, and cross_boundary depends on being on the boundary with a knowledge of the post-boundary state.

move_internal with a position should depend on the safety distance but that's not yet implemented.

Member Function Documentation

◆ cross_boundary()

CELER_FUNCTION void celeritas::OrangeTrackView::cross_boundary ( )
inline

Cross from one side of the current surface to the other.

The position must be on the boundary following a move-to-boundary. This should only be called once per boundary crossing.

◆ find_next_step()

CELER_FUNCTION Propagation celeritas::OrangeTrackView::find_next_step ( real_type  max_step)
inline

Find a nearby distance to the next geometric boundary up to a distance.

This may reduce the number of surfaces needed to check, sort, or write to temporary memory, thereby speeding up transport.

◆ find_safety() [1/2]

CELER_FUNCTION real_type celeritas::OrangeTrackView::find_safety ( )
inline

Find the distance to the nearest boundary in any direction.

The safety distance at a given point is the minimum safety distance over all levels, since surface deduplication can potentionally elide bounding surfaces at more deeply embedded levels.

◆ find_safety() [2/2]

CELER_FUNCTION real_type celeritas::OrangeTrackView::find_safety ( real_type  max_step)
inline

Find the distance to the nearest nearby boundary.

Since we currently support only "simple" safety distances, we can't eliminate anything by checking only nearby surfaces.

◆ move_internal() [1/2]

CELER_FUNCTION void celeritas::OrangeTrackView::move_internal ( Real3 const &  pos)
inline

Move within the current volume to a nearby point.

Todo:
Currently it's up to the caller to make sure that the position is "nearby". We should actually test this with an "is inside" call.

◆ move_internal() [2/2]

CELER_FUNCTION void celeritas::OrangeTrackView::move_internal ( real_type  dist)
inline

Move within the current volume.

The straight-line distance must be less than the distance to the boundary.

◆ operator=()

CELER_FUNCTION OrangeTrackView & celeritas::OrangeTrackView::operator= ( Initializer_t const &  init)
inline

Construct the state.

Expensive. This function should only be called to initialize an event from a starting location and direction. Secondaries will initialize their states from a copy of the parent.

◆ set_dir()

CELER_FUNCTION void celeritas::OrangeTrackView::set_dir ( Real3 const &  newdir)
inline

Change the track's direction.

This happens after a scattering event or movement inside a magnetic field. It resets the calculated distance-to-boundary. It is allowed to happen on the boundary, but changing direction so that it goes from pointing outward to inward (or vice versa) will mean that cross_boundary will be a null-op.

TODO: This needs to be updated to handle reflections through levels

◆ volume_id()

CELER_FUNCTION VolumeId celeritas::OrangeTrackView::volume_id ( ) const
inline

The current volume ID.

Note
It is allowable to call this function when "outside", because the outside in ORANGE is just a special volume. Other geometries may not have that behavior.

◆ volume_instance_id() [1/2]

CELER_FUNCTION VolumeInstanceId celeritas::OrangeTrackView::volume_instance_id ( ) const
inline

The current volume instance.

Todo:
not implemented; VolumeId is already halfway between a "reusable volume" and a "volume instance" anyway...

◆ volume_instance_id() [2/2]

CELER_FUNCTION void celeritas::OrangeTrackView::volume_instance_id ( Span< VolumeInstanceId levels) const
inline

Get the volume instance ID at every level.

The input span size must be equal to the value of "level" plus one. The top-most level ("world" or level zero) starts at index zero and moves downward. Note that Geant4 uses the reverse nomenclature.


The documentation for this class was generated from the following file: