Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TGeoPgon.h
Go to the documentation of this file.
1// @(#)root/geom:$Id$
2// Author: Andrei Gheata 31/01/02
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef ROOT_TGeoPgon
13#define ROOT_TGeoPgon
14
15#include "TGeoPcon.h"
16
17#include <algorithm>
18#include <atomic>
19#include <memory>
20#include <mutex>
21#include <vector>
22
23class TGeoPgon : public TGeoPcon {
24 static std::atomic<UInt_t> fgInstanceCount; //! source of monotonic per-object indices
25 UInt_t fIndex{fgInstanceCount++}; //! non-reused index of this shape into the per-thread vector
26 mutable std::atomic<Int_t> fGeneration{0}; //! bumped whenever the per-thread state must be rebuilt
27
28public:
29 struct ThreadData_t {
30 Int_t *fIntBuffer{nullptr}; //![fNedges+4] temporary int buffer array
31 Double_t *fDblBuffer{nullptr}; //![fNedges+4] temporary double buffer array
32 Int_t fInitGen{-1}; //! generation this slot was last initialized for
33 };
34
35 /// Per-thread non-owning cache of scratch buffers indexed by this shape.
36 /// Hot path: a TLS read plus an indexed load; the cold rebuild lives in InitThreadSlot().
37 /// The vector retains its high-water size until the owning thread exits.
39 {
40 thread_local std::vector<ThreadData_t> tdata;
41 if (tdata.size() <= fIndex)
42 tdata.resize(fIndex + 1);
44 if (td.fInitGen != fGeneration.load(std::memory_order_acquire))
46 return td;
47 }
48 /// Release object-owned scratch buffers and invalidate the non-owning TLS slots.
49 /// Navigation using this shape must not be active when this method is called.
50 void ClearThreadData() const override;
51 /// No-op: this shape allocates scratch data lazily for every calling thread.
52 void CreateThreadData(Int_t) override {}
53
54protected:
55 struct OwnedThreadData_t;
56 void InitThreadSlot(ThreadData_t &td) const;
57
58 // data members
59 Int_t fNedges; // number of edges (at least one)
60 mutable std::vector<std::unique_ptr<OwnedThreadData_t>> fOwnedData; ///<! Object-owned per-thread buffers
61 mutable std::mutex fOwnedDataMutex; ///<! Protects cold allocation and cleanup
62
63 // internal utility methods
68 void LocatePhi(const Double_t *point, Int_t &ipsec) const;
70 Double_t Rproj(Double_t z, const Double_t *point, const Double_t *dir, Double_t cphi, Double_t sphi, Double_t &a,
71 Double_t &b) const;
72 Bool_t SliceCrossing(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi,
74 Bool_t SliceCrossingIn(const Double_t *point, const Double_t *dir, Int_t ipl, Int_t nphi, Int_t *iphi,
76 Bool_t SliceCrossingZ(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi,
81
82 TGeoPgon(const TGeoPgon &) = delete;
83 TGeoPgon &operator=(const TGeoPgon &) = delete;
84
85public:
86 // constructors
87 TGeoPgon();
89 TGeoPgon(const char *name, Double_t phi, Double_t dphi, Int_t nedges, Int_t nz);
90 TGeoPgon(Double_t *params);
91 // destructor
92 ~TGeoPgon() override;
93 // methods
94 Double_t Capacity() const override;
95 void ComputeBBox() override;
96 void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) const override;
97 void ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize) override;
98 Bool_t Contains(const Double_t *point) const override;
99 void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const override;
100 Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact = 1, Double_t step = TGeoShape::Big(),
101 Double_t *safe = nullptr) const override;
103 Double_t *step) const override;
104 Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact = 1,
105 Double_t step = TGeoShape::Big(), Double_t *safe = nullptr) const override;
107 Double_t *step) const override;
108 Int_t DistancetoPrimitive(Int_t px, Int_t py) override;
109 TGeoVolume *
110 Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step) override;
111 void GetBoundingCylinder(Double_t *param) const override;
112 const TBuffer3D &GetBuffer3D(Int_t reqSections, Bool_t localFrame) const override;
113 Int_t GetByteCount() const override { return 64 + 12 * fNz; }
114 TGeoShape *GetMakeRuntimeShape(TGeoShape * /*mother*/, TGeoMatrix * /*mat*/) const override { return nullptr; }
115 void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const override;
116 Int_t GetNedges() const { return fNedges; }
117 Int_t GetNmeshVertices() const override;
118 Int_t GetNsegments() const override { return fNedges; }
120 {
122 }
123 void InspectShape() const override;
124 TBuffer3D *MakeBuffer3D() const override;
125 Double_t Safety(const Double_t *point, Bool_t in = kTRUE) const override;
126 void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const override;
128 Double_t safmin = TGeoShape::Big()) const;
129 void SavePrimitive(std::ostream &out, Option_t *option = "") override;
130 void SetDimensions(Double_t *param) override;
132 {
133 if (ne > 2)
134 fNedges = ne;
135 }
136 void SetPoints(Double_t *points) const override;
137 void SetPoints(Float_t *points) const override;
138 void SetSegsAndPols(TBuffer3D &buff) const override;
139 void Sizeof3D() const override;
140
141 ClassDefOverride(TGeoPgon, 1) // polygone class
142};
143
144#endif
#define b(i)
Definition RSha256.hxx:100
#define a(i)
Definition RSha256.hxx:99
bool Bool_t
Boolean (0=false, 1=true) (bool)
Definition RtypesCore.h:78
int Int_t
Signed integer 4 bytes (int)
Definition RtypesCore.h:60
float Float_t
Float 4 bytes (float)
Definition RtypesCore.h:72
double Double_t
Double 8 bytes.
Definition RtypesCore.h:74
constexpr Bool_t kTRUE
Definition RtypesCore.h:108
const char Option_t
Option string (const char)
Definition RtypesCore.h:81
#define ClassDefOverride(name, id)
Definition Rtypes.h:347
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
char name[80]
Definition TGX11.cxx:142
Generic 3D primitive description class.
Definition TBuffer3D.h:18
Bool_t GetPointsOnSegments(Int_t npoints, Double_t *array) const override
Fills array with n random points located on the line segments of the shape mesh.
Definition TGeoBBox.cxx:702
Geometrical transformation package.
Definition TGeoMatrix.h:39
A polycone is represented by a sequence of tubes/cones, glued together at defined Z planes.
Definition TGeoPcon.h:17
Int_t fNz
Definition TGeoPcon.h:20
Polygons are defined in the same way as polycones, the difference being just that the segments betwee...
Definition TGeoPgon.h:23
void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const override
Compute safe distance from each of the points in the input array.
TBuffer3D * MakeBuffer3D() const override
Creates a TBuffer3D describing this shape.
static std::atomic< UInt_t > fgInstanceCount
Definition TGeoPgon.h:69
void SetPoints(Double_t *points) const override
create polygone mesh points
Bool_t Contains(const Double_t *point) const override
test if point is inside this shape check total z range
Definition TGeoPgon.cxx:360
std::mutex fOwnedDataMutex
! Protects cold allocation and cleanup
Definition TGeoPgon.h:61
Bool_t SliceCrossingInZ(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Performs ray propagation between Z segments.
Definition TGeoPgon.cxx:626
std::vector< std::unique_ptr< OwnedThreadData_t > > fOwnedData
! Object-owned per-thread buffers
Definition TGeoPgon.h:60
~TGeoPgon() override
destructor
Definition TGeoPgon.cxx:154
Bool_t SliceCrossing(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Check boundary crossing inside phi slices.
Definition TGeoPgon.cxx:939
void Sizeof3D() const override
fill size of this 3-D object
Int_t GetNmeshVertices() const override
Return number of vertices of the mesh representation.
TGeoPgon & operator=(const TGeoPgon &)=delete
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) const override
Compute normal to closest surface from POINT.
Definition TGeoPgon.cxx:262
void GetBoundingCylinder(Double_t *param) const override
Fill vector param[4] with the bounding cylinder parameters.
void CreateThreadData(Int_t) override
No-op: this shape allocates scratch data lazily for every calling thread.
Definition TGeoPgon.h:52
void DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
Int_t fNedges
Definition TGeoPgon.h:59
Bool_t SliceCrossingZ(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Performs ray propagation between Z segments.
Definition TGeoPgon.cxx:705
void InspectShape() const override
Inspect the PGON parameters.
void LocatePhi(const Double_t *point, Int_t &ipsec) const
Locates index IPSEC of the phi sector containing POINT.
Definition TGeoPgon.cxx:528
TGeoPgon()
dummy ctor
Definition TGeoPgon.cxx:108
Int_t GetNsegments() const override
Returns number of segments on each mesh circle segment.
Definition TGeoPgon.h:118
TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step) override
Divide this polygone shape belonging to volume "voldiv" into ndiv volumes called divname,...
Int_t GetNedges() const
Definition TGeoPgon.h:116
void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const override
Returns numbers of vertices, segments and polygons composing the shape mesh.
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a primitive as a C++ statement(s) on output stream "out".
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
computes the closest distance from given point to this shape, according to option.
UInt_t fIndex
source of monotonic per-object indices
Definition TGeoPgon.h:25
Bool_t GetPointsOnSegments(Int_t npoints, Double_t *array) const override
Fills array with n random points located on the line segments of the shape mesh.
Definition TGeoPgon.h:119
void SetNedges(Int_t ne)
Definition TGeoPgon.h:131
TGeoPgon(const TGeoPgon &)=delete
TGeoShape * GetMakeRuntimeShape(TGeoShape *, TGeoMatrix *) const override
In case shape has some negative parameters, these has to be computed in order to fit the mother.
Definition TGeoPgon.h:114
void ClearThreadData() const override
Release object-owned scratch buffers and invalidate the non-owning TLS slots.
Definition TGeoPgon.cxx:98
Double_t SafetyToSegment(const Double_t *point, Int_t ipl, Int_t iphi, Bool_t in, Double_t safphi, Double_t safmin=TGeoShape::Big()) const
Compute safety from POINT to segment between planes ipl, ipl+1 within safmin.
Double_t Capacity() const override
Computes capacity of the shape in [length^3].
Definition TGeoPgon.cxx:162
Double_t Rpg(Double_t z, Int_t ipl, Bool_t inner, Double_t &a, Double_t &b) const
Computes projected pgon radius (inner or outer) corresponding to a given Z value.
void SetDimensions(Double_t *param) override
Set PGON dimensions starting from an array.
void SetSegsAndPolsNoInside(TBuffer3D &buff) const
Fill TBuffer3D structure for segments and polygons, when no inner surface exists.
Bool_t SliceCrossingIn(const Double_t *point, const Double_t *dir, Int_t ipl, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Check boundary crossing inside phi slices.
Definition TGeoPgon.cxx:795
void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const override
Check the inside status for each of the points in the array.
void DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
Int_t GetByteCount() const override
Definition TGeoPgon.h:113
const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const override
Fills a static 3D buffer and returns a reference.
void InitThreadSlot(ThreadData_t &td) const
(Re)build the per-thread scratch buffers for this shape into the given slot.
Definition TGeoPgon.cxx:82
ThreadData_t & GetThreadData() const
Per-thread non-owning cache of scratch buffers indexed by this shape.
Definition TGeoPgon.h:38
void ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize) override
Compute the normal for an array o points so that norm.dot.dir is positive Input: Arrays of point coor...
void ComputeBBox() override
compute bounding box for a polygone Check if the sections are in increasing Z order
Definition TGeoPgon.cxx:187
Double_t Rproj(Double_t z, const Double_t *point, const Double_t *dir, Double_t cphi, Double_t sphi, Double_t &a, Double_t &b) const
Computes projected distance at a given Z for a given ray inside a given sector and fills coefficients...
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
compute distance from inside point to surface of the polygone first find out in which Z section the p...
Definition TGeoPgon.cxx:418
Bool_t IsCrossingSlice(const Double_t *point, const Double_t *dir, Int_t iphi, Double_t sstart, Int_t &ipl, Double_t &snext, Double_t stepmax) const
Check crossing of a given pgon slice, from a starting point inside the slice.
Int_t GetPhiCrossList(const Double_t *point, const Double_t *dir, Int_t istart, Double_t *sphi, Int_t *iphi, Double_t stepmax=TGeoShape::Big()) const
Returns lists of PGON phi crossings for a ray starting from POINT.
Definition TGeoPgon.cxx:541
void SetSegsAndPols(TBuffer3D &buff) const override
Fill TBuffer3D structure for segments and polygons.
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
Compute distance from outside point to surface of the polygone.
std::atomic< Int_t > fGeneration
non-reused index of this shape into the per-thread vector
Definition TGeoPgon.h:26
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
compute closest distance from point px,py to each corner
Base abstract class for all shapes.
Definition TGeoShape.h:25
static Double_t Big()
Definition TGeoShape.h:95
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
Definition TGeoVolume.h:45
bumped whenever the per-thread state must be rebuilt
Definition TGeoPgon.h:29
Int_t fInitGen
[fNedges+4] temporary double buffer array
Definition TGeoPgon.h:32
Double_t * fDblBuffer
[fNedges+4] temporary int buffer array
Definition TGeoPgon.h:31