253 if (
fZ) {
delete[]
fZ;
fZ = 0;}
262 Double_t rmin1, rmax1, rmin2, rmax2, phi1, phi2, dz;
266 for (ipl=0; ipl<
fNz-1; ipl++) {
267 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
271 rmin2 =
fRmin[ipl+1];
272 rmax2 =
fRmax[ipl+1];
284 for (
Int_t isec=0; isec<
fNz-1; isec++) {
290 Error(
"ComputeBBox",
"Duplicated section %d/%d for shape %s", isec, isec+1,
GetName());
293 if (
fZ[isec]>
fZ[isec+1]) {
295 Fatal(
"ComputeBBox",
"Wrong section order");
302 Fatal(
"ComputeBBox",
"Shape %s at index %d: Not allowed first two or last two sections at same Z",
329 if (ddp<0) ddp+= 360;
330 if (ddp<=fDphi) xmax = rmax;
332 if (ddp<0) ddp+= 360;
333 if (ddp<=fDphi) ymax = rmax;
335 if (ddp<0) ddp+= 360;
336 if (ddp<=fDphi) xmin = -rmax;
338 if (ddp<0) ddp+= 360;
339 if (ddp<=fDphi) ymin = -rmax;
357 Double_t dz, rmin1, rmax1, rmin2, rmax2;
360 if (ipl==(
fNz-1) || ipl<0) {
365 Int_t iplclose = ipl;
366 if ((
fZ[ipl+1]-point[2])<(point[2]-
fZ[ipl])) iplclose++;
369 if (iplclose==0 || iplclose==(
fNz-1)) {
374 r =
TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
381 r =
TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
389 memcpy(ptnew, point, 3*
sizeof(
Double_t));
390 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
395 ptnew[2] -= 0.5*(
fZ[ipl]+
fZ[ipl+1]);
398 rmin2 =
fRmin[ipl+1];
399 rmax2 =
fRmax[ipl+1];
403 else TGeoConeSeg::ComputeNormalS(ptnew,dir,norm,dz,rmin1,rmax1,rmin2,rmax2,
fC1,
fS1,
fC2,
fS2);
418 Double_t r2 = point[0]*point[0]+point[1]*point[1];
423 while ((izh-izl)>1) {
424 if (point[2] >
fZ[izt]) izl = izt;
438 rmin = (
fRmin[izl]*(dz-dz1)+
fRmin[izh]*dz1)/dz;
439 rmax = (
fRmax[izl]*(dz-dz1)+
fRmax[izh]*dz1)/dz;
441 if ((r2<rmin*rmin) || (r2>rmax*rmax))
return kFALSE;
444 if (r2<1
E-10)
return kTRUE;
446 if (phi < 0) phi+=360.0;
448 if (ddp<0) ddp+=360.;
449 if (ddp<=fDphi)
return kTRUE;
468 if (iact<3 && safe) {
479 if (ipl==(
fNz-1)) ipl--;
485 special_case =
kTRUE;
488 point_new[0] = point[0]+sstep*dir[0];
489 point_new[1] = point[1]+sstep*dir[1];
490 point_new[2] = point[2]+sstep*dir[2];
491 if (!
Contains(point_new))
return 0.;
500 memcpy(point_new, point, 2*
sizeof(
Double_t));
502 point_new[2] = point[2]-0.5*(
fZ[ipl]+
fZ[ipl+1]);
513 if (!
fFullPhi) snxt=
TGeoTubeSeg::DistFromInsideS(point_new, dir,
fRmin[ipl],
fRmax[ipl],dz,
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
516 if (!
fFullPhi) snxt=
TGeoConeSeg::DistFromInsideS(point_new,dir,dz,
fRmin[ipl],
fRmax[ipl],
fRmin[ipl+1],
fRmax[ipl+1],
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
520 for (
Int_t i=0; i<3; i++) point_new[i]=point[i]+(snxt+1
E-6)*dir[i];
521 if (!
Contains(&point_new[0]))
return snxt;
536 Int_t istep=(dir[2]>0)?1:-1;
543 memcpy(&local[0], point, 3*
sizeof(
Double_t));
544 local[2]=point[2]-0.5*(zmin+zmax);
553 else snxt=
TGeoTubeSeg::DistFromOutsideS(local,dir,rmin1,rmax1,dz,
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
556 else snxt=
TGeoConeSeg::DistFromOutsideS(local,dir,dz,rmin1,rmax1,rmin2,rmax2,
fC1,
fS1,
fC2,
fS2,
fCm,
fSm,
fCdphi);
558 if (snxt<1E20)
return snxt;
561 Int_t istep=(dir[2]>0)?1:-1;
572 if ((iact<3) && safe) {
584 Double_t r2 = point[0]*point[0]+point[1]*point[1];
587 if (r2>(radmax*radmax)) {
588 Double_t rpr=-point[0]*dir[0]-point[1]*dir[1];
589 Double_t nxy=dir[0]*dir[0]+dir[1]*dir[1];
598 }
else if (ifirst>=(
fNz-1)) ifirst=
fNz-2;
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());
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");
866 if (nz < 2)
return 0;
868 if (nbPnts <= 0)
return 0;
874 Int_t nbSegs = 4*(nz*n-1+(specialCase ==
kTRUE));
875 Int_t nbPols = 2*(nz*n-1+(specialCase ==
kTRUE));
877 nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols);
897 if (nbPnts <= 0)
return;
904 Int_t indx, indx2, k;
909 for (i = 0; i < nz*2; i++) {
911 for (j = 1; j <
n; j++) {
913 buff.
fSegs[indx++] = indx2+j-1;
914 buff.
fSegs[indx++] = indx2+j;
918 buff.
fSegs[indx++] = indx2+j-1;
919 buff.
fSegs[indx++] = indx2;
924 for (i = 0; i < 2; i++) {
925 indx2 = i*(nz-1)*2*n;
926 for (j = 0; j <
n; j++) {
928 buff.
fSegs[indx++] = indx2+j;
929 buff.
fSegs[indx++] = indx2+n+j;
934 for (i = 0; i < (nz-1); i++) {
937 for (j = 0; j <
n; j++) {
938 buff.
fSegs[indx++] = c+2;
939 buff.
fSegs[indx++] = indx2+j;
940 buff.
fSegs[indx++] = indx2+n*2+j;
944 for (j = 0; j <
n; j++) {
945 buff.
fSegs[indx++] = c+3;
946 buff.
fSegs[indx++] = indx2+j;
947 buff.
fSegs[indx++] = indx2+n*2+j;
954 for (i = 1; i < (nz-1); i++) {
955 for (j = 0; j < 2; j++) {
957 buff.
fSegs[indx++] = 2*i * n + j*(n-1);
958 buff.
fSegs[indx++] = (2*i+1) * n + j*(n-1);
968 for (j = 0; j < n-1; j++) {
969 buff.
fPols[indx++] = c+3;
970 buff.
fPols[indx++] = 4;
971 buff.
fPols[indx++] = 2*nz*m+j;
972 buff.
fPols[indx++] = m+j;
973 buff.
fPols[indx++] = 2*nz*m+j+1;
974 buff.
fPols[indx++] = j;
976 for (j = 0; j < n-1; j++) {
977 buff.
fPols[indx++] = c+3;
978 buff.
fPols[indx++] = 4;
979 buff.
fPols[indx++] = 2*nz*m+n+j;
980 buff.
fPols[indx++] = (nz*2-2)*m+j;
981 buff.
fPols[indx++] = 2*nz*m+n+j+1;
982 buff.
fPols[indx++] = (nz*2-2)*m+m+j;
985 buff.
fPols[indx++] = c+3;
986 buff.
fPols[indx++] = 4;
987 buff.
fPols[indx++] = 2*nz*m+j;
988 buff.
fPols[indx++] = m+j;
989 buff.
fPols[indx++] = 2*nz*
m;
990 buff.
fPols[indx++] = j;
992 buff.
fPols[indx++] = c+3;
993 buff.
fPols[indx++] = 4;
994 buff.
fPols[indx++] = 2*nz*m+n+j;
995 buff.
fPols[indx++] = (nz*2-2)*m+m+j;
996 buff.
fPols[indx++] = 2*nz*m+
n;
997 buff.
fPols[indx++] = (nz*2-2)*m+j;
1001 for (k = 0; k < (nz-1); k++) {
1002 for (j = 0; j < n-1; j++) {
1004 buff.
fPols[indx++] = 4;
1005 buff.
fPols[indx++] = 2*k*m+j;
1006 buff.
fPols[indx++] = nz*2*m+(2*k+2)*n+j+1;
1007 buff.
fPols[indx++] = (2*k+2)*m+j;
1008 buff.
fPols[indx++] = nz*2*m+(2*k+2)*n+j;
1010 for (j = 0; j < n-1; j++) {
1011 buff.
fPols[indx++] = c+1;
1012 buff.
fPols[indx++] = 4;
1013 buff.
fPols[indx++] = (2*k+1)*m+j;
1014 buff.
fPols[indx++] = nz*2*m+(2*k+3)*n+j;
1015 buff.
fPols[indx++] = (2*k+3)*m+j;
1016 buff.
fPols[indx++] = nz*2*m+(2*k+3)*n+j+1;
1020 buff.
fPols[indx++] = 4;
1021 buff.
fPols[indx++] = 2*k*m+j;
1022 buff.
fPols[indx++] = nz*2*m+(2*k+2)*n;
1023 buff.
fPols[indx++] = (2*k+2)*m+j;
1024 buff.
fPols[indx++] = nz*2*m+(2*k+2)*n+j;
1026 buff.
fPols[indx++] = c+1;
1027 buff.
fPols[indx++] = 4;
1028 buff.
fPols[indx++] = (2*k+1)*m+j;
1029 buff.
fPols[indx++] = nz*2*m+(2*k+3)*n+j;
1030 buff.
fPols[indx++] = (2*k+3)*m+j;
1031 buff.
fPols[indx++] = nz*2*m+(2*k+3)*n;
1039 for (k = 0; k < (nz-1); k++) {
1040 buff.
fPols[indx++] = c+2;
1041 buff.
fPols[indx++] = 4;
1042 buff.
fPols[indx++] = k==0 ? indx2 : indx2+2*nz*n+2*(k-1);
1043 buff.
fPols[indx++] = indx2+2*(k+1)*n;
1044 buff.
fPols[indx++] = indx2+2*nz*n+2*k;
1045 buff.
fPols[indx++] = indx2+(2*k+3)*n;
1047 buff.
fPols[indx++] = c+2;
1048 buff.
fPols[indx++] = 4;
1049 buff.
fPols[indx++] = k==0 ? indx2+n-1 : indx2+2*nz*n+2*(k-1)+1;
1050 buff.
fPols[indx++] = indx2+(2*k+3)*n+n-1;
1051 buff.
fPols[indx++] = indx2+2*nz*n+2*k+1;
1052 buff.
fPols[indx++] = indx2+2*(k+1)*n+n-1;
1054 buff.
fPols[indx-8] = indx2+
n;
1055 buff.
fPols[indx-2] = indx2+2*n-1;
1065 if (ipl<0 || ipl>
fNz-2)
return (safmin+1.);
1068 if (dz<1
E-9)
return 1E9;
1070 memcpy(ptnew, point, 3*
sizeof(
Double_t));
1071 ptnew[2] -= 0.5*(
fZ[ipl]+
fZ[ipl+1]);
1104 if (ipl==(
fNz-1))
return 0;
1105 if (ipl<0)
return 0;
1107 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
1113 if (saftmp<safmin) safmin = saftmp;
1119 if (safmin<0) safmin = 0;
1132 while ((iplane<
fNz-1) && saftmp<1E10) {
1134 if (saftmp<safmin) safmin=saftmp;
1140 while ((iplane>=0) && saftmp<1E10) {
1142 if (saftmp<safmin) safmin=saftmp;
1150 else if (ipl==
fNz-1) ipl=
fNz-2;
1151 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
1152 if (dz<1
E-8 && (ipl+2<
fNz)) {
1154 dz = 0.5*(
fZ[ipl+1]-
fZ[ipl]);
1163 while ((iplane<
fNz-1) && saftmp<1E10) {
1165 if (saftmp<safmin) safmin=saftmp;
1171 while ((iplane>=0) && saftmp<1E10) {
1173 if (saftmp<safmin) safmin=saftmp;
1185 out <<
" // Shape: " <<
GetName() <<
" type: " <<
ClassName() << std::endl;
1186 out <<
" phi1 = " <<
fPhi1 <<
";" << std::endl;
1187 out <<
" dphi = " << fDphi <<
";" << std::endl;
1188 out <<
" nz = " <<
fNz <<
";" << std::endl;
1189 out <<
" TGeoPcon *pcon = new TGeoPcon(\"" <<
GetName() <<
"\",phi1,dphi,nz);" << std::endl;
1191 out <<
" z = " <<
fZ[i] <<
";" << std::endl;
1192 out <<
" rmin = " <<
fRmin[i] <<
";" << std::endl;
1193 out <<
" rmax = " <<
fRmax[i] <<
";" << std::endl;
1194 out <<
" pcon->DefineSection(" << i <<
", z,rmin,rmax);" << std::endl;
1196 out <<
" TGeoShape *" <<
GetPointerName() <<
" = pcon;" << std::endl;
1210 Error(
"SetDimensions",
"Pcon %s: Number of Z sections must be > 2",
GetName());
1215 if (
fZ)
delete []
fZ;
1250 for (i = 0; i <
fNz; i++) {
1251 for (j = 0; j <
n; j++) {
1255 points[indx++] =
fZ[i];
1257 for (j = 0; j <
n; j++) {
1261 points[indx++] =
fZ[i];
1279 for (i = 0; i <
fNz; i++) {
1280 for (j = 0; j <
n; j++) {
1284 points[indx++] =
fZ[i];
1286 for (j = 0; j <
n; j++) {
1290 points[indx++] =
fZ[i];
1331 nsegs = 4*(nz*n-1+(specialCase ==
kTRUE));
1332 npols = 2*(nz*n-1+(specialCase ==
kTRUE));
1348 if (nz >= 2 && nbPnts > 0) {
1350 Int_t nbSegs = 4*(nz*n-1+(specialCase ==
kTRUE));
1351 Int_t nbPols = 2*(nz*n-1+(specialCase ==
kTRUE));
1352 if (buffer.
SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
1375 void TGeoPcon::Streamer(
TBuffer &R__b)
1402 for (
Int_t i=0; i<vecsize; i++) inside[i] =
Contains(&points[3*i]);
1412 for (
Int_t i=0; i<vecsize; i++)
ComputeNormal(&points[3*i], &dirs[3*i], &norms[3*i]);
1420 for (
Int_t i=0; i<vecsize; i++) dists[i] =
DistFromInside(&points[3*i], &dirs[3*i], 3, step[i]);
1428 for (
Int_t i=0; i<vecsize; i++) dists[i] =
DistFromOutside(&points[3*i], &dirs[3*i], 3, step[i]);
1438 for (
Int_t i=0; i<vecsize; i++) safe[i] =
Safety(&points[3*i], inside[i]);
TGeoVolumeMulti * MakeVolumeMulti(const char *name, TGeoMedium *medium)
Make a TGeoVolumeMulti handling a list of volumes.
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.
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
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.
virtual Int_t GetNsegments() const
Returns number of segments on each mesh circle segment.
Double_t fC2
Sine of phi1.
Int_t GetNsegments() const
Get number of segments approximating circles.
virtual Bool_t Contains(const Double_t *point) const
test if point is inside this shape check total z range
Long64_t LocMax(Long64_t n, const T *a)
void SetFinder(TGeoPatternFinder *finder)
virtual void SetDimensions(Double_t *param)
Set polycone dimensions starting from an array.
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
Double_t fC1
Full phi range flag.
virtual void SetPoints(Double_t *points) const
create polycone mesh points
void AddNodeOffset(TGeoVolume *vol, Int_t copy_no, Double_t offset=0, Option_t *option="")
Add a division node to the list of nodes.
Double_t fS2
Cosine of phi1+dphi.
Int_t GetBasicColor() const
Get the basic color (0-7).
virtual ~TGeoPcon()
destructor
Buffer base class used for serializing objects.
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Compute normal to closest surface from POINT.
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.
TObjArray * GetListOfShapes() const
Short_t Min(Short_t a, Short_t b)
Double_t fS1
Cosine of phi1.
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...
TGeoPcon & operator=(const TGeoPcon &)
assignment operator
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.
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 Int_t DistancetoPrimitive(Int_t px, Int_t py)
compute closest distance from point px,py to each corner
Int_t GetNdaughters() const
static Bool_t IsSameWithinTolerance(Double_t a, Double_t b)
Check if two numbers differ with less than a tolerance.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual TBuffer3D * MakeBuffer3D() const
Creates a TBuffer3D describing this shape.
static Double_t Tolerance()
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.
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 specisied by dirs. Store output in dist...
const char * Data() const
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
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.
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.
void AddVolume(TGeoVolume *vol)
Add a volume with valid shape to the list of volumes.
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 InspectShape() const
print shape parameters
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 specisied by dirs. Store output in dist...
Double_t ATan2(Double_t, Double_t)
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
Double_t fCm
Sine of phi1+dphi.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
void SetSectionsValid(UInt_t mask)
void TransformPoints(Double_t *points, UInt_t NbPoints) const
Tranform a set of points (LocalToMaster)
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...
TNamed & operator=(const TNamed &rhs)
TNamed assignment operator.
Int_t IndexOf(const TObject *obj) const
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 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
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.
virtual Double_t GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const
Get range of shape for a given axis.
virtual const char * GetAxisName(Int_t iaxis) const
Returns name of axis IAXIS.
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 const char * ClassName() const
Returns name of class to which the object belongs.
virtual Double_t Capacity() const
Computes capacity of the shape in [length^3].
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
Bool_t TestBit(UInt_t f) const
virtual void ComputeBBox()
compute bounding box of the pcon Check if the sections are in increasing Z order
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.
Generic 3D primitive description class.
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.
virtual const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
Fills a static 3D buffer and returns a reference.
void SetDivIndex(Int_t index)
virtual const char * GetName() const
Get the shape name.
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.
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.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
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.
virtual void GetBoundingCylinder(Double_t *param) const
— Fill vector param[4] with the bounding cylinder parameters.
virtual void InspectShape() const
Prints shape parameters.
Double_t * GetRmin() const
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...
R__EXTERN TGeoManager * gGeoManager
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...
ClassImp(TMCParticle) void TMCParticle printf(": p=(%7.3f,%7.3f,%9.3f) ;", fPx, fPy, fPz)
Int_t ShapeDistancetoPrimitive(Int_t numpoints, Int_t px, Int_t py) const
Returns distance to shape primitive mesh.
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.
const char * GetPointerName() const
Provide a pointer name containing uid.
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 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
void SetShapeBit(UInt_t f, Bool_t set)
Equivalent of TObject::SetBit.
virtual void SetSegsAndPols(TBuffer3D &buff) const
Fill TBuffer3D structure for segments and polygons.
Double_t * GetRmax() const
virtual Int_t GetNmeshVertices() const
Return number of vertices of the mesh representation.
TGeoMedium * GetMedium() const
virtual Double_t Capacity() const
Computes capacity of the shape in [length^3].
Short_t Max(Short_t a, Short_t b)
virtual void Sizeof3D() const
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...
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 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.
ClassImp(TGeoPcon) TGeoPcon
dummy ctor
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...
Double_t Sqrt(Double_t x)
TObject * At(Int_t idx) const
Long64_t LocMin(Long64_t n, const T *a)
double norm(double *x, double *p)
Double_t fSm
Cosine of (phi1+phi2)/2.
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Double_t fCdphi
Sine of (phi1+phi2)/2.
unsigned int r2[N_CITIES]
Bool_t SectionsValid(UInt_t mask) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.