Project
Loading...
Searching...
No Matches
o2::cad::xray Namespace Reference

Classes

struct  Beam
 
struct  Crossing
 
struct  ListComparison
 
struct  Raster
 
struct  RayDef
 
struct  Robustness
 
struct  StepConfig
 

Functions

template<typename ContainsFn , typename DistOutFn , typename DistInFn >
std::vector< CrossingstepCrossingsWithKernels (const Point3D &origin, const Point3D &dir, double tMax, const StepConfig &cfg, Robustness &stats, ContainsFn contains, DistOutFn distFromOutside, DistInFn distFromInside)
 
std::vector< CrossingstepWithShapeApi (const TGeoShape *shape, const Point3D &origin, const Point3D &dir, double tMax, const StepConfig &cfg, Robustness &stats)
 Mode (a): the same loop driven by the ordinary TGeoShape virtuals.
 
void auditCrossingList (const std::vector< Crossing > &crossings, const TGeoShape *shape, const Point3D &origin, const Point3D &dir, double tMax, const StepConfig &cfg, Robustness &stats)
 
void compareLists (const std::vector< Crossing > &candidate, const std::vector< Crossing > &reference, const Point3D &origin, const Point3D &dir, double tolerance, ListComparison &out)
 
double dot3 (const Point3D &a, const Point3D &b)
 
Point3D normalize3 (const Point3D &a)
 
Point3D cross3 (const Point3D &a, const Point3D &b)
 
std::vector< BeambuildFanBeams (int count)
 
std::vector< BeambuildBeams (const std::string &axesSpec, double tiltDegrees)
 
Raster buildRaster (const Point3D &bboxMin, const Point3D &bboxMax, int n, const std::vector< Beam > &beams, double transverseMargin)
 
double chordVolume (const Raster &raster, const std::vector< double > &insideLengthPerBeam)
 

Function Documentation

◆ auditCrossingList()

void o2::cad::xray::auditCrossingList ( const std::vector< Crossing > &  crossings,
const TGeoShape *  shape,
const Point3D &  origin,
const Point3D &  dir,
double  tMax,
const StepConfig cfg,
Robustness stats 
)
inline

Book the per-ray consistency properties of one crossing list. Split out because both modes and the oracle's own answer go through it, so a defect in one cannot be excused by a different bookkeeping in another.

Definition at line 201 of file XRayTransport.h.

◆ buildBeams()

std::vector< Beam > o2::cad::xray::buildBeams ( const std::string &  axesSpec,
double  tiltDegrees 
)
inline

Definition at line 449 of file XRayTransport.h.

◆ buildFanBeams()

std::vector< Beam > o2::cad::xray::buildFanBeams ( int  count)
inline

The beams for axesSpec (a subset of x, y, z), each tilted by tiltDegrees.

At tilt 0 the frame is exactly the two remaining coordinate axes, so an axis-aligned box's chord integral stays EXACT (every cell centre is inside its own bounding box; see buildRaster). A non-zero tilt rotates the beam by tilt about one transverse axis and by 0.618 * tilt about the other – an irrational-looking ratio on purpose, so no beam lands on a symmetry plane of a part that was drawn on a coordinate grid. count beams spread over the sphere by the Fibonacci spiral, deterministic and seed-free.

This exists because of a measurement, not for completeness. A parallel-beam raster is DIRECTION-POOR: three axes (or three tilted axes) are three directions, however many rays are fired. The known torus quartic defect fires on a configuration that depends on the ray DIRECTION, so it is invisible to a 3-beam raster of 27648 rays and visible to a fan of many directions. Impact-parameter density and direction density are different resolutions and a benchmark that only has the first will report a clean sheet on a defect it cannot see.

Definition at line 419 of file XRayTransport.h.

◆ buildRaster()

Raster o2::cad::xray::buildRaster ( const Point3D &  bboxMin,
const Point3D &  bboxMax,
int  n,
const std::vector< Beam > &  beams,
double  transverseMargin 
)
inline

The transverse window and the longitudinal start are deliberately DECOUPLED.

Transverse: the window is the bounding box's own extent IN THE BEAM'S FRAME plus transverseMargin, which should be as small as the bounding box's reliability allows, because the window excess is a first-order systematic on the volume.

Longitudinal: the ray must start strictly OUTSIDE the solid, or Contains() at the origin is a coin toss on the face and the whole transport starts in the wrong state. That margin is therefore generous and costs nothing – it is along the ray, not across it.

Definition at line 503 of file XRayTransport.h.

◆ chordVolume()

double o2::cad::xray::chordVolume ( const Raster raster,
const std::vector< double > &  insideLengthPerBeam 
)
inline

Each beam is an independent estimate of the same volume; the reported number is their mean and the per-beam spread is the honest error bar.

Definition at line 558 of file XRayTransport.h.

◆ compareLists()

void o2::cad::xray::compareLists ( const std::vector< Crossing > &  candidate,
const std::vector< Crossing > &  reference,
const Point3D &  origin,
const Point3D &  dir,
double  tolerance,
ListComparison out 
)
inline

Definition at line 289 of file XRayTransport.h.

◆ cross3()

Point3D o2::cad::xray::cross3 ( const Point3D &  a,
const Point3D &  b 
)
inline

Definition at line 399 of file XRayTransport.h.

◆ dot3()

double o2::cad::xray::dot3 ( const Point3D &  a,
const Point3D &  b 
)
inline

Definition at line 388 of file XRayTransport.h.

◆ normalize3()

Point3D o2::cad::xray::normalize3 ( const Point3D &  a)
inline

Definition at line 393 of file XRayTransport.h.

◆ stepCrossingsWithKernels()

template<typename ContainsFn , typename DistOutFn , typename DistInFn >
std::vector< Crossing > o2::cad::xray::stepCrossingsWithKernels ( const Point3D &  origin,
const Point3D &  dir,
double  tMax,
const StepConfig cfg,
Robustness stats,
ContainsFn  contains,
DistOutFn  distFromOutside,
DistInFn  distFromInside 
)

The stepping loop, parameterised on the three kernels it calls.

Templated so the SAME loop can be driven by O2BVHSurfaceSolid's BVH entry points and by its non-BVH _Loop twins. That turns the project's existing single-query "BVH == _Loop" guard into a transport-level one: every query after the first starts from a point the previous query put on a boundary, so a traversal-order difference that is invisible on an isolated query can still send the two down different sequences of states.

Definition at line 129 of file XRayTransport.h.

◆ stepWithShapeApi()

std::vector< Crossing > o2::cad::xray::stepWithShapeApi ( const TGeoShape *  shape,
const Point3D &  origin,
const Point3D &  dir,
double  tMax,
const StepConfig cfg,
Robustness stats 
)
inline

Mode (a): the same loop driven by the ordinary TGeoShape virtuals.

Definition at line 184 of file XRayTransport.h.