132 norm[0] = norm[1] = 0.0;
152 Double_t ndotd = norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2];
167 if (aa < 0)
return kFALSE;
168 Double_t rsq = point[0]*point[0]+point[1]*point[1];
179 const Int_t numPoints=
n*(
n+1)+2;
189 Double_t rsq = point[0]*point[0]+point[1]*point[1];
191 Double_t b = 2.*
fA*(point[0]*dir[0]+point[1]*dir[1])-dir[2];
204 if (delta<0)
return dist;
209 dist = 0.5*(
sum+i*sone*delta);
211 if (dist<0)
continue;
216 if (!in) ndotd *= -1;
217 if (ndotd<0)
return dist;
228 if (iact<3 && safe) {
237 dz = -(point[2]+
fDz)/dir[2];
238 }
else if (dir[2]>0) {
239 dz = (
fDz-point[2])/dir[2];
251 if (iact<3 && safe) {
258 if (point[2]<=-
fDz) {
260 snxt = -(
fDz+point[2])/dir[2];
262 xnew = point[0]+snxt*dir[0];
263 ynew = point[1]+snxt*dir[1];
264 if ((xnew*xnew+ynew*ynew) <=
fRlo*
fRlo)
return snxt;
265 }
else if (point[2]>=
fDz) {
267 snxt = (
fDz-point[2])/dir[2];
269 xnew = point[0]+snxt*dir[0];
270 ynew = point[1]+snxt*dir[1];
271 if ((xnew*xnew+ynew*ynew) <=
fRhi*
fRhi)
return snxt;
274 if (snxt > 1E20)
return snxt;
275 znew = point[2]+snxt*dir[2];
286 Error(
"Divide",
"Paraboloid divisions not implemented");
298 param[1] *= param[1];
317 printf(
"*** Shape %s: TGeoParaboloid ***\n",
GetName());
318 printf(
" rlo = %11.5f\n",
fRlo);
319 printf(
" rhi = %11.5f\n",
fRhi);
320 printf(
" dz = %11.5f\n",
fDz);
321 printf(
" Bounding box:\n");
337 nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 2*
n*5 +
n*
n*6);
361 for (j=0; j<
n; j++) {
363 buff.
fSegs[indx++] = 0;
364 buff.
fSegs[indx++] = j+1;
367 for (i=0; i<
n+1; i++) {
369 for (j=0; j<
n; j++) {
371 buff.
fSegs[indx++] =
n*i+1+j;
372 buff.
fSegs[indx++] =
n*i+1+((j+1)%
n);
376 for (j=0; j<
n; j++) {
378 buff.
fSegs[indx++] =
n*i+1+j;
379 buff.
fSegs[indx++] =
n*(i+1)+1+j;
383 for (j=0; j<
n; j++) {
386 buff.
fSegs[indx++] = nn1;
392 for (j=0; j<
n; j++) {
394 buff.
fPols[indx++] = 3;
396 buff.
fPols[indx++] = (j+1)%
n;
397 buff.
fPols[indx++] = j;
400 for (i=0; i<
n; i++) {
402 for (j=0; j<
n; j++) {
404 buff.
fPols[indx++] = 4;
405 buff.
fPols[indx++] = (2*i+1)*
n+j;
406 buff.
fPols[indx++] = 2*(i+1)*
n+j;
407 buff.
fPols[indx++] = (2*i+3)*
n+j;
408 buff.
fPols[indx++] = 2*(i+1)*
n+((j+1)%
n);
412 for (j=0; j<
n; j++) {
414 buff.
fPols[indx++] = 3;
415 buff.
fPols[indx++] = 2*
n*(
n+1)+j;
416 buff.
fPols[indx++] = 2*
n*(
n+1)+((j+1)%
n);
417 buff.
fPols[indx++] = (2*
n+1)*
n+j;
427 if (!in) safz = -safz;
429 Double_t rsq = point[0]*point[0]+point[1]*point[1];
438 if (dr>-1.E-8)
return 0.;
442 if (dr<1.E-8)
return safz;
458 Error(
"SetParaboloidDimensions",
"Dimensions of %s invalid: check (rlo>=0) (rhi>=0) (rlo!=rhi) dz>0",
GetName());
516 for (
Int_t i=0; i<
n+1; i++) {
529 for (
Int_t j=0; j<
n; j++) {
571 out <<
" rlo = " <<
fRlo <<
";" << std::endl;
572 out <<
" rhi = " <<
fRhi <<
";" << std::endl;
573 out <<
" dz = " <<
fDZ <<
";" << std::endl;
574 out <<
" TGeoShape *" <<
GetPointerName() <<
" = new TGeoParaboloid(\"" <<
GetName() <<
"\", rlo,rhi,dz);" << std::endl;
598 for (
Int_t i=0; i<
n+1; i++) {
611 for (
Int_t j=0; j<
n; j++) {
644 if (buffer.
SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 2*
n*5 +
n*
n*6)) {
R__EXTERN TGeoManager * gGeoManager
Generic 3D primitive description class.
Bool_t SectionsValid(UInt_t mask) const
void SetSectionsValid(UInt_t mask)
Bool_t SetRawSizes(UInt_t reqPnts, UInt_t reqPntsCapacity, UInt_t reqSegs, UInt_t reqSegsCapacity, UInt_t reqPols, UInt_t reqPolsCapacity)
Set kRaw tessellation section of buffer with supplied sizes.
virtual void InspectShape() const
Prints shape parameters.
virtual void FillBuffer3D(TBuffer3D &buffer, Int_t reqSections, Bool_t localFrame) const
Fills the supplied buffer, with sections in desired frame See TBuffer3D.h for explanation of sections...
Int_t GetNsegments() const
Get number of segments approximating circles.
Geometrical transformation package.
virtual void DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const
Compute distance from array of input points having directions specified by dirs. Store output in dist...
virtual TGeoShape * GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix *mat) const
in case shape has some negative parameters, these has to be computed in order to fit the mother
virtual Bool_t Contains(const Double_t *point) const
test if point is inside the elliptical tube
Double_t DistToParaboloid(const Double_t *point, const Double_t *dir, Bool_t in) const
Compute distance from a point to the parabola given by: z = a*rsq + b; rsq = x*x+y*y
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Computes the closest distance from given point to this shape.
virtual TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step)
Divide the paraboloid along one axis.
virtual const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
Fills a static 3D buffer and returns a reference.
virtual void GetBoundingCylinder(Double_t *param) const
Fill vector param[4] with the bounding cylinder parameters.
virtual void ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize)
Compute the normal for an array o points so that norm.dot.dir is positive Input: Arrays of point coor...
virtual void SetSegsAndPols(TBuffer3D &buff) const
Fill TBuffer3D structure for segments and polygons.
virtual void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const
Returns numbers of vertices, segments and polygons composing the shape mesh.
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py)
compute closest distance from point px,py to each vertex
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Compute normal to closest surface from POINT.
virtual void SetPoints(Double_t *points) const
Create paraboloid mesh points.
void SetParaboloidDimensions(Double_t rlo, Double_t rhi, Double_t dz)
Set paraboloid dimensions.
virtual Double_t Capacity() const
Computes capacity of the shape in [length^3].
virtual TBuffer3D * MakeBuffer3D() const
Creates a TBuffer3D describing this shape.
virtual Int_t GetNmeshVertices() const
Returns number of vertices on the paraboloid mesh.
virtual void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const
Check the inside status for each of the points in the array.
virtual Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=0) const
compute distance from inside point to surface of the paraboloid
virtual void SetDimensions(Double_t *param)
Set paraboloid dimensions starting from an array.
virtual Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=0) const
compute distance from outside point to surface of the paraboloid and safe distance
virtual void DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const
Compute distance from array of input points having directions specified by dirs. Store output in dist...
virtual void ComputeBBox()
compute bounding box of the tube
virtual void Sizeof3D() const
virtual ~TGeoParaboloid()
destructor
TGeoParaboloid()
Dummy constructor.
virtual void InspectShape() const
print shape parameters
virtual void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const
Compute safe distance from each of the points in the input array.
Base abstract class for all shapes.
Int_t GetBasicColor() const
Get the basic color (0-7).
void TransformPoints(Double_t *points, UInt_t NbPoints) const
Tranform a set of points (LocalToMaster)
void SetShapeBit(UInt_t f, Bool_t set)
Equivalent of TObject::SetBit.
const char * GetPointerName() const
Provide a pointer name containing uid.
Int_t ShapeDistancetoPrimitive(Int_t numpoints, Int_t px, Int_t py) const
Returns distance to shape primitive mesh.
virtual const char * GetName() const
Get the shape name.
static Double_t Tolerance()
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual const char * ClassName() const
Returns name of class to which the object belongs.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Short_t Max(Short_t a, Short_t b)
Double_t ATan2(Double_t y, Double_t x)
constexpr Double_t DegToRad()
Conversion from degree to radian:
Double_t Sqrt(Double_t x)
Short_t Min(Short_t a, Short_t b)
static uint64_t sum(uint64_t i)