245 if (
fZ) {
delete[]
fZ;
fZ =
nullptr; }
254 Double_t rmin1, rmax1, rmin2, rmax2, phi1, phi2, dz;
258 for (ipl=0; ipl<
fNz-1; ipl++) {
259 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
263 rmin2 =
fRmin[ipl+1];
264 rmax2 =
fRmax[ipl+1];
276 for (
Int_t isec=0; isec<
fNz-1; isec++) {
282 Error(
"ComputeBBox",
"Duplicated section %d/%d for shape %s", isec, isec+1,
GetName());
285 if (
fZ[isec]>
fZ[isec+1]) {
287 Fatal(
"ComputeBBox",
"Wrong section order");
294 Fatal(
"ComputeBBox",
"Shape %s at index %d: Not allowed first two or last two sections at same Z",
321 if (ddp<0) ddp+= 360;
324 if (ddp<0) ddp+= 360;
327 if (ddp<0) ddp+= 360;
330 if (ddp<0) ddp+= 360;
349 Double_t dz, rmin1, rmax1, rmin2, rmax2;
352 if (ipl==(
fNz-1) || ipl<0) {
357 Int_t iplclose = ipl;
358 if ((
fZ[ipl+1]-point[2])<(point[2]-
fZ[ipl])) iplclose++;
361 if (iplclose==0 || iplclose==(
fNz-1)) {
381 memcpy(ptnew, point, 3*
sizeof(
Double_t));
382 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
387 ptnew[2] -= 0.5*(
fZ[ipl]+
fZ[ipl+1]);
390 rmin2 =
fRmin[ipl+1];
391 rmax2 =
fRmax[ipl+1];
395 else TGeoConeSeg::ComputeNormalS(ptnew,dir,norm,dz,rmin1,rmax1,rmin2,rmax2,
fC1,
fS1,
fC2,
fS2);
410 Double_t r2 = point[0]*point[0]+point[1]*point[1];
415 while ((izh-izl)>1) {
416 if (point[2] >
fZ[izt]) izl = izt;
430 rmin = (
fRmin[izl]*(dz-dz1)+
fRmin[izh]*dz1)/dz;
431 rmax = (
fRmax[izl]*(dz-dz1)+
fRmax[izh]*dz1)/dz;
433 if ((r2<rmin*rmin) || (r2>rmax*rmax))
return kFALSE;
436 if (r2<1E-10)
return kTRUE;
438 if (phi < 0) phi+=360.0;
440 if (ddp<0) ddp+=360.;
460 if (iact<3 && safe) {
471 if (ipl==(
fNz-1)) ipl--;
477 special_case =
kTRUE;
480 point_new[0] = point[0]+sstep*dir[0];
481 point_new[1] = point[1]+sstep*dir[1];
482 point_new[2] = point[2]+sstep*dir[2];
483 if (!
Contains(point_new))
return 0.;
492 memcpy(point_new, point, 2*
sizeof(
Double_t));
494 point_new[2] = point[2]-0.5*(
fZ[ipl]+
fZ[ipl+1]);
508 snxt =
TGeoTubeSeg::DistFromInsideS(point_new, dir,
fRmin[ipl],
fRmax[ipl],dz,
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
513 snxt =
TGeoConeSeg::DistFromInsideS(point_new,dir,dz,
fRmin[ipl],
fRmax[ipl],
fRmin[ipl+1],
fRmax[ipl+1],
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
518 for (
Int_t i=0; i<3; i++) point_new[i]=point[i]+(snxt+1E-6)*dir[i];
519 if (!
Contains(&point_new[0]))
return snxt;
534 Int_t istep=(dir[2]>0)?1:-1;
541 memcpy(&local[0], point, 3*
sizeof(
Double_t));
542 local[2]=point[2]-0.5*(zmin+zmax);
551 else snxt=
TGeoTubeSeg::DistFromOutsideS(local,dir,rmin1,rmax1,dz,
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
554 else snxt=
TGeoConeSeg::DistFromOutsideS(local,dir,dz,rmin1,rmax1,rmin2,rmax2,
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
556 if (snxt<1E20)
return snxt;
559 Int_t istep=(dir[2]>0)?1:-1;
570 if ((iact<3) && safe) {
582 Double_t r2 = point[0]*point[0]+point[1]*point[1];
585 if (r2>(radmax*radmax)) {
586 Double_t rpr=-point[0]*dir[0]-point[1]*dir[1];
587 Double_t nxy=dir[0]*dir[0]+dir[1]*dir[1];
596 }
else if (ifirst>=(
fNz-1)) {
617 if ((snum<0) || (snum>=
fNz))
return;
622 Warning(
"DefineSection",
"Shape %s: invalid rmin=%g rmax=%g",
GetName(), rmin, rmax);
625 if (
fZ[0] >
fZ[snum]) {
677 Error(
"Divide",
"Shape %s: cannot divide a pcon on radius",
GetName());
685 for (is=0; is<
fNz; is++)
690 for (
id=0;
id<ndiv;
id++) {
697 for (ipl=0; ipl<
fNz-1; ipl++) {
698 if (start<
fZ[ipl])
continue;
700 if ((start+ndiv*step)>
fZ[ipl+1])
continue;
708 Error(
"Divide",
"Shape %s: cannot divide pcon on Z if divided region is not between 2 planes",
GetName());
711 finder =
new TGeoPatternZ(voldiv, ndiv, start, start+ndiv*step);
716 for (
id=0;
id<ndiv;
id++) {
730 else shape =
new TGeoCone(step/2,rmin1,rmax1,rmin2,rmax2);
739 Error(
"Divide",
"Shape %s: Wrong axis %d for division",
GetName(), iaxis);
796 param[0] *= param[0];
797 param[1] *= param[1];
804 param[3] = param[2]+
fDphi;
812 if (ipl<0 || ipl>(
fNz-1)) {
813 Error(
"GetRmin",
"ipl=%i out of range (0,%i) in shape %s",ipl,
fNz-1,
GetName());
824 if (ipl<0 || ipl>(
fNz-1)) {
825 Error(
"GetRmax",
"ipl=%i out of range (0,%i) in shape %s",ipl,
fNz-1,
GetName());
836 if (ipl<0 || ipl>(
fNz-1)) {
837 Error(
"GetZ",
"ipl=%i out of range (0,%i) in shape %s",ipl,
fNz-1,
GetName());
848 printf(
"*** Shape %s: TGeoPcon ***\n",
GetName());
849 printf(
" Nz = %i\n",
fNz);
850 printf(
" phi1 = %11.5f\n",
fPhi1);
851 printf(
" dphi = %11.5f\n",
fDphi);
853 printf(
" plane %i: z=%11.5f Rmin=%11.5f Rmax=%11.5f\n", ipl,
fZ[ipl],
fRmin[ipl],
fRmax[ipl]);
854 printf(
" Bounding box:\n");
864 Int_t nbPnts, nbSegs, nbPols;
866 if (nbPnts <= 0)
return nullptr;
869 nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols);
894 if (nbPnts <= 0)
return;
900 Int_t indx = 0, indx2, k;
904 for (i = 0; i < nz*2; i++) {
906 for (j = 1; j <
n; j++) {
908 buff.
fSegs[indx++] = indx2+j-1;
909 buff.
fSegs[indx++] = indx2+j;
913 buff.
fSegs[indx++] = indx2+j-1;
914 buff.
fSegs[indx++] = indx2;
919 for (i = 0; i < 2; i++) {
920 indx2 = i*(nz-1)*2*
n;
921 for (j = 0; j <
n; j++) {
923 buff.
fSegs[indx++] = indx2+j;
924 buff.
fSegs[indx++] = indx2+
n+j;
929 for (i = 0; i < (nz-1); i++) {
932 for (j = 0; j <
n; j++) {
934 buff.
fSegs[indx++] = indx2+j;
935 buff.
fSegs[indx++] = indx2+
n*2+j;
939 for (j = 0; j <
n; j++) {
941 buff.
fSegs[indx++] = indx2+j;
942 buff.
fSegs[indx++] = indx2+
n*2+j;
949 for (i = 1; i < (nz-1); i++) {
950 for (j = 0; j < 2; j++) {
952 buff.
fSegs[indx++] = 2*i *
n + j*(
n-1);
953 buff.
fSegs[indx++] = (2*i+1) *
n + j*(
n-1);
958 Int_t m =
n - 1 + (specialCase ? 1 : 0);
963 for (j = 0; j <
n-1; j++) {
965 buff.
fPols[indx++] = 4;
966 buff.
fPols[indx++] = 2*nz*
m+j;
968 buff.
fPols[indx++] = 2*nz*
m+j+1;
969 buff.
fPols[indx++] = j;
971 for (j = 0; j <
n-1; j++) {
973 buff.
fPols[indx++] = 4;
974 buff.
fPols[indx++] = 2*nz*
m+
n+j;
975 buff.
fPols[indx++] = (nz*2-2)*
m+j;
976 buff.
fPols[indx++] = 2*nz*
m+
n+j+1;
977 buff.
fPols[indx++] = (nz*2-2)*
m+
m+j;
981 buff.
fPols[indx++] = 4;
982 buff.
fPols[indx++] = 2*nz*
m+j;
984 buff.
fPols[indx++] = 2*nz*
m;
985 buff.
fPols[indx++] = j;
988 buff.
fPols[indx++] = 4;
989 buff.
fPols[indx++] = 2*nz*
m+
n+j;
990 buff.
fPols[indx++] = (nz*2-2)*
m+
m+j;
992 buff.
fPols[indx++] = (nz*2-2)*
m+j;
996 for (k = 0; k < (nz-1); k++) {
997 for (j = 0; j <
n-1; j++) {
999 buff.
fPols[indx++] = 4;
1000 buff.
fPols[indx++] = 2*k*
m+j;
1001 buff.
fPols[indx++] = nz*2*
m+(2*k+2)*
n+j+1;
1002 buff.
fPols[indx++] = (2*k+2)*
m+j;
1003 buff.
fPols[indx++] = nz*2*
m+(2*k+2)*
n+j;
1005 for (j = 0; j <
n-1; j++) {
1006 buff.
fPols[indx++] =
c+1;
1007 buff.
fPols[indx++] = 4;
1008 buff.
fPols[indx++] = (2*k+1)*
m+j;
1009 buff.
fPols[indx++] = nz*2*
m+(2*k+3)*
n+j;
1010 buff.
fPols[indx++] = (2*k+3)*
m+j;
1011 buff.
fPols[indx++] = nz*2*
m+(2*k+3)*
n+j+1;
1015 buff.
fPols[indx++] = 4;
1016 buff.
fPols[indx++] = 2*k*
m+j;
1017 buff.
fPols[indx++] = nz*2*
m+(2*k+2)*
n;
1018 buff.
fPols[indx++] = (2*k+2)*
m+j;
1019 buff.
fPols[indx++] = nz*2*
m+(2*k+2)*
n+j;
1021 buff.
fPols[indx++] =
c+1;
1022 buff.
fPols[indx++] = 4;
1023 buff.
fPols[indx++] = (2*k+1)*
m+j;
1024 buff.
fPols[indx++] = nz*2*
m+(2*k+3)*
n+j;
1025 buff.
fPols[indx++] = (2*k+3)*
m+j;
1026 buff.
fPols[indx++] = nz*2*
m+(2*k+3)*
n;
1034 for (k = 0; k < (nz-1); k++) {
1035 buff.
fPols[indx++] =
c+2;
1036 buff.
fPols[indx++] = 4;
1037 buff.
fPols[indx++] = k==0 ? indx2 : indx2+2*nz*
n+2*(k-1);
1038 buff.
fPols[indx++] = indx2+2*(k+1)*
n;
1039 buff.
fPols[indx++] = indx2+2*nz*
n+2*k;
1040 buff.
fPols[indx++] = indx2+(2*k+3)*
n;
1042 buff.
fPols[indx++] =
c+2;
1043 buff.
fPols[indx++] = 4;
1044 buff.
fPols[indx++] = k==0 ? indx2+
n-1 : indx2+2*nz*
n+2*(k-1)+1;
1045 buff.
fPols[indx++] = indx2+(2*k+3)*
n+
n-1;
1046 buff.
fPols[indx++] = indx2+2*nz*
n+2*k+1;
1047 buff.
fPols[indx++] = indx2+2*(k+1)*
n+
n-1;
1049 buff.
fPols[indx-8] = indx2+
n;
1050 buff.
fPols[indx-2] = indx2+2*
n-1;
1062 const Int_t nbPnts = nz *
n + 2;
1064 if ((nz < 2) || (nbPnts <= 0) || (
n < 2))
return;
1068 Int_t indx = 0, indx1 = 0, indx2 = 0, i, j;
1071 for (i = 0; i < nz; i++) {
1073 for (j = 1; j <
n; j++) {
1075 buff.
fSegs[indx++] = indx2 + j - 1;
1076 buff.
fSegs[indx++] = indx2 + j % (
n-1);
1082 for (j = 0; j <
n; j++) {
1084 buff.
fSegs[indx++] = indx2 + j % (
n-1);
1085 buff.
fSegs[indx++] = nbPnts - 2;
1090 for (j = 0; j <
n; j++) {
1092 buff.
fSegs[indx++] = indx2 + j % (
n-1);
1093 buff.
fSegs[indx++] = nbPnts - 1;
1097 for (i = 0; i < (nz - 1); i++) {
1100 for (j = 0; j <
n; j++) {
1102 buff.
fSegs[indx++] = indx2 + j % (
n-1);
1103 buff.
fSegs[indx++] = indx2 +
n + j % (
n-1);
1112 for (j = 0; j <
n - 1; j++) {
1114 buff.
fPols[indx++] = 3;
1115 buff.
fPols[indx++] = indx1 + j;
1116 buff.
fPols[indx++] = indx2 + j + 1;
1117 buff.
fPols[indx++] = indx2 + j;
1121 indx1 = (nz-1)*(
n-1);
1122 indx2 = nz*(
n-1) +
n;
1123 for (j = 0; j <
n - 1; j++) {
1125 buff.
fPols[indx++] = 3;
1126 buff.
fPols[indx++] = indx1 + j;
1127 buff.
fPols[indx++] = indx2 + j;
1128 buff.
fPols[indx++] = indx2 + j + 1;
1132 for (
Int_t k = 0; k < (nz - 1); k++) {
1134 indx2 = nz*(
n-1) +
n*2 + k*
n;
1135 for (j = 0; j <
n-1; j++) {
1137 buff.
fPols[indx++] = 4;
1138 buff.
fPols[indx++] = indx1 + j;
1139 buff.
fPols[indx++] = indx2 + j;
1140 buff.
fPols[indx++] = indx1 + j + (
n-1);
1141 buff.
fPols[indx++] = indx2 + j + 1;
1151 if (ipl<0 || ipl>
fNz-2)
return (safmin+1.);
1154 if (dz<1E-9)
return 1E9;
1156 memcpy(ptnew, point, 3*
sizeof(
Double_t));
1157 ptnew[2] -= 0.5*(
fZ[ipl]+
fZ[ipl+1]);
1190 if (ipl==(
fNz-1))
return 0;
1191 if (ipl<0)
return 0;
1193 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
1199 if (saftmp<safmin) safmin = saftmp;
1205 if (safmin<0) safmin = 0;
1238 else if (ipl==
fNz-1) ipl=
fNz-2;
1239 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
1240 if (dz<1E-8 && (ipl+2<
fNz)) {
1242 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
1251 while ((iplane<
fNz-1) && saftmp<1E10) {
1253 if (saftmp<safmin) safmin=saftmp;
1259 while ((iplane>=0) && saftmp<1E10) {
1261 if (saftmp<safmin) safmin=saftmp;
1273 out <<
" // Shape: " <<
GetName() <<
" type: " <<
ClassName() << std::endl;
1274 out <<
" phi1 = " <<
fPhi1 <<
";" << std::endl;
1275 out <<
" dphi = " <<
fDphi <<
";" << std::endl;
1276 out <<
" nz = " <<
fNz <<
";" << std::endl;
1277 out <<
" TGeoPcon *pcon = new TGeoPcon(\"" <<
GetName() <<
"\",phi1,dphi,nz);" << std::endl;
1279 out <<
" z = " <<
fZ[i] <<
";" << std::endl;
1280 out <<
" rmin = " <<
fRmin[i] <<
";" << std::endl;
1281 out <<
" rmax = " <<
fRmax[i] <<
";" << std::endl;
1282 out <<
" pcon->DefineSection(" << i <<
", z,rmin,rmax);" << std::endl;
1284 out <<
" TGeoShape *" <<
GetPointerName() <<
" = pcon;" << std::endl;
1298 Error(
"SetDimensions",
"Pcon %s: Number of Z sections must be > 2",
GetName());
1303 if (
fZ)
delete []
fZ;
1340 for (i = 0; i <
fNz; i++) {
1342 for (j = 0; j <
n; j++) {
1348 for (j = 0; j <
n; j++) {
1381 for (i = 0; i <
fNz; i++) {
1383 for (j = 0; j <
n; j++) {
1389 for (j = 0; j <
n; j++) {
1412 Int_t nvert, nsegs, npols;
1432 if (!specialCase)
return kTRUE;
1447 nvert = nsegs = npols = 0;
1456 nsegs = 4*(nz*
n-1+(specialCase ? 1 : 0));
1457 npols = 2*(nz*
n-1+(specialCase ? 1 : 0));
1460 nsegs = nz * (
n - 1) +
n * 2 + (nz - 1) *
n;
1461 npols = 2 * (
n - 1) + (nz - 1) * (
n - 1);
1475 Int_t nbPnts, nbSegs, nbPols;
1478 if (buffer.
SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
1501void TGeoPcon::Streamer(
TBuffer &R__b)
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.
Buffer base class used for serializing objects.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
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 box.
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...
A cone segment is a cone having a range in phi.
static void ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t c1, Double_t s1, Double_t c2, Double_t s2)
Compute normal to closest surface from POINT.
static Double_t DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi)
compute distance from outside point to surface of arbitrary tube
virtual Double_t Capacity() const
Computes capacity of the shape in [length^3].
static Double_t SafetyS(const Double_t *point, Bool_t in, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2, Int_t skipz=0)
Static method to compute the closest distance from given point to this shape.
static Double_t DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi)
compute distance from inside point to surface of the tube segment
The cones are defined by 5 parameters:
static void ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
Compute normal to closest surface from POINT.
static Double_t DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
Compute distance from inside point to surface of the cone (static) Boundary safe algorithm.
static Double_t DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
Compute distance from outside point to surface of the tube Boundary safe algorithm.
static Double_t SafetyS(const Double_t *point, Bool_t in, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Int_t skipz=0)
computes the closest distance from given point to this shape, according to option.
TGeoVolumeMulti * MakeVolumeMulti(const char *name, TGeoMedium *medium)
Make a TGeoVolumeMulti handling a list of volumes.
TObjArray * GetListOfShapes() const
Int_t GetNsegments() const
Get number of segments approximating circles.
Node containing an offset.
Base finder class for patterns.
void SetDivIndex(Int_t index)
A polycone is represented by a sequence of tubes/cones, glued together at defined Z planes.
Double_t fSm
Cosine of (phi1+phi2)/2.
virtual const char * GetAxisName(Int_t iaxis) const
Returns name of axis IAXIS.
Double_t * GetRmax() const
virtual void SetDimensions(Double_t *param)
Set polycone dimensions starting from an array.
Double_t SafetyToSegment(const Double_t *point, Int_t ipl, Bool_t in=kTRUE, Double_t safmin=TGeoShape::Big()) const
Compute safety from POINT to segment between planes ipl, ipl+1 within safmin.
virtual void Sizeof3D() const
fill size of this 3-D object
virtual void SetPoints(Double_t *points) const
create polycone mesh points
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 void ComputeBBox()
compute bounding box of the pcon Check if the sections are in increasing Z order
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Compute normal to closest surface from POINT.
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py)
compute closest distance from point px,py to each corner
virtual void DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax)
Defines z position of a section plane, rmin and rmax at this z.
Double_t fC1
Full phi range flag.
Double_t fCdphi
Sine of (phi1+phi2)/2.
Double_t fS1
Cosine of phi1.
virtual void InspectShape() const
print shape parameters
virtual TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step)
Divide this polycone shape belonging to volume "voldiv" into ndiv volumes called divname,...
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.
virtual void SetSegsAndPols(TBuffer3D &buff) const
Fill TBuffer3D structure for segments and polygons.
virtual Bool_t Contains(const Double_t *point) const
test if point is inside this shape check total z range
virtual void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const
Returns numbers of vertices, segments and polygons composing the shape mesh.
Double_t DistToSegZ(const Double_t *point, const Double_t *dir, Int_t &iz) const
compute distance to a pcon Z slice. Segment iz must be valid
virtual Double_t Capacity() const
Computes capacity of the shape in [length^3].
Double_t fCm
Sine of phi1+dphi.
virtual const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
Fills a static 3D buffer and returns a reference.
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 TBuffer3D * MakeBuffer3D() const
Creates a TBuffer3D describing this shape.
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 tube
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...
Bool_t HasInsideSurface() const
Returns true when pgon has internal surface It will be only disabled when all Rmin values are 0.
virtual Int_t GetNsegments() const
Returns number of segments on each mesh circle segment.
virtual Double_t GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const
Get range of shape for a given axis.
Double_t fS2
Cosine of phi1+dphi.
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 polycone
virtual ~TGeoPcon()
destructor
void SetSegsAndPolsNoInside(TBuffer3D &buff) const
Fill TBuffer3D structure for segments and polygons, when no inner surface exists.
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...
Double_t fC2
Sine of phi1.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
virtual Int_t GetNmeshVertices() const
Return number of vertices of the mesh representation.
virtual void GetBoundingCylinder(Double_t *param) const
Fill vector param[4] with the bounding cylinder parameters.
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
computes the closest distance from given point to this shape, according to option.
Double_t * GetRmin() const
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.
static Double_t SafetyPhi(const Double_t *point, Bool_t in, Double_t phi1, Double_t phi2)
Static method to compute safety w.r.t a phi corner defined by cosines/sines of the angles phi1,...
static Bool_t IsSameWithinTolerance(Double_t a, Double_t b)
Check if two numbers differ with less than a tolerance.
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()
A tube segment is a tube having a range in phi.
static Double_t DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t rmin, Double_t rmax, Double_t dz, Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi)
Compute distance from inside point to surface of the tube segment (static) Boundary safe algorithm.
static Double_t DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t rmin, Double_t rmax, Double_t dz, Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi)
Static method to compute distance to arbitrary tube segment from outside point Boundary safe algorith...
static Double_t SafetyS(const Double_t *point, Bool_t in, Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t phi2, Int_t skipz=0)
Static method to compute the closest distance from given point to this shape.
static void ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm, Double_t rmin, Double_t rmax, Double_t dz, Double_t c1, Double_t s1, Double_t c2, Double_t s2)
Compute normal to closest surface from POINT.
static Double_t DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t rmin, Double_t rmax, Double_t dz)
Static method to compute distance from outside point to a tube with given parameters Boundary safe al...
static Double_t SafetyS(const Double_t *point, Bool_t in, Double_t rmin, Double_t rmax, Double_t dz, Int_t skipz=0)
computes the closest distance from given point to this shape, according to option.
static void ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm, Double_t rmin, Double_t rmax, Double_t dz)
Compute normal to closest surface from POINT.
static Double_t DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t rmin, Double_t rmax, Double_t dz)
Compute distance from inside point to surface of the tube (static) Boundary safe algorithm.
void AddVolume(TGeoVolume *vol)
Add a volume with valid shape to the list of volumes.
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
void AddNodeOffset(TGeoVolume *vol, Int_t copy_no, Double_t offset=0, Option_t *option="")
Add a division node to the list of nodes.
TGeoMedium * GetMedium() const
void SetFinder(TGeoPatternFinder *finder)
Int_t GetNdaughters() const
Int_t IndexOf(const TObject *obj) const
TObject * At(Int_t idx) const
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
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.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
const char * Data() const
Long64_t LocMin(Long64_t n, const T *a)
Return index of array with the minimum element.
Short_t Max(Short_t a, Short_t b)
Double_t ATan2(Double_t y, Double_t x)
Long64_t LocMax(Long64_t n, const T *a)
Return index of array with the maximum element.
constexpr Double_t DegToRad()
Conversion from degree to radian:
Double_t Sqrt(Double_t x)
Short_t Min(Short_t a, Short_t b)
Long64_t BinarySearch(Long64_t n, const T *array, T value)
constexpr Double_t RadToDeg()
Conversion from radian to degree: