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 << 
"   auto " << 
GetPointerName() << 
" = 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 << 
"   " << 
GetPointerName() << 
"->DefineSection(" << i << 
", z,rmin,rmax);" << std::endl;
 
 1297      Error(
"SetDimensions",
"Pcon %s: Number of Z sections must be > 2", 
GetName());
 
 1302   if (
fZ) 
delete [] 
fZ;
 
 1339      for (i = 0; i < 
fNz; i++) {
 
 1341            for (j = 0; j < 
n; j++) {
 
 1347         for (j = 0; j < 
n; j++) {
 
 1380      for (i = 0; i < 
fNz; i++) {
 
 1382            for (j = 0; j < 
n; j++) {
 
 1388         for (j = 0; j < 
n; j++) {
 
 1411   Int_t nvert, nsegs, npols;
 
 1431   if (!specialCase) 
return kTRUE;
 
 1446   nvert = nsegs = npols = 0;
 
 1455      nsegs = 4*(nz*
n-1+(specialCase ?  1 : 0));
 
 1456      npols = 2*(nz*
n-1+(specialCase ?  1 : 0));
 
 1459      nsegs = nz * (
n - 1) + 
n * 2 + (nz - 1) * 
n;
 
 1460      npols = 2 * (
n - 1) + (nz - 1) * (
n - 1);
 
 1474      Int_t nbPnts, nbSegs, nbPols;
 
 1477         if (buffer.
SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
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=nullptr)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
virtual void InspectShape() const
Prints shape parameters.
virtual 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
Compute distance from outside point to surface of the box.
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.
virtual 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
compute distance from outside point to surface of the tube
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 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
compute distance from inside point to surface of the polycone
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 Streamer(TBuffer &)
Stream an object of class TGeoPcon.
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 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 ~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 override
TObject * At(Int_t idx) const override
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)
Returns index of array with the minimum element.
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
T1 Sign(T1 a, T2 b)
Returns a value with the magnitude of a and the sign of b.
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
Long64_t LocMax(Long64_t n, const T *a)
Returns index of array with the maximum element.
constexpr Double_t DegToRad()
Conversion from degree to radian: .
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Binary search in an array of n values to locate value.
constexpr Double_t RadToDeg()
Conversion from radian to degree: .
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.