169   for (
Int_t i=0; i<8; i++) {
 
  186      for (
Int_t i=0; i<8; i++) {
 
  187         fXY[i][0] = vertices[2*i];
 
  188         fXY[i][1] = vertices[2*i+1];
 
  193      for (
Int_t i=0; i<8; i++) {
 
  210      for (
Int_t i=0; i<8; i++) {
 
  211         fXY[i][0] = vertices[2*i];
 
  212         fXY[i][1] = vertices[2*i+1];
 
  217      for (
Int_t i=0; i<8; i++) {
 
  253   for (i=0; i<4; i++) {
 
  255      capacity += 0.25*
fDz*((
fXY[i][0]+
fXY[i+4][0])*(
fXY[j][1]+
fXY[j+4][1]) -
 
  257                    (1./3)*((
fXY[i+4][0]-
fXY[i][0])*(
fXY[j+4][1]-
fXY[j][1]) -
 
  272   for (
Int_t i=1; i<8; i++) {
 
  300   for (i=0; i<4; i++) {
 
  301      dx1 = 
fXY[(i+1)%4][0]-
fXY[i][0];
 
  302      dy1 = 
fXY[(i+1)%4][1]-
fXY[i][1];
 
  308      dx2 = 
fXY[4+(i+1)%4][0]-
fXY[4+i][0];
 
  309      dy2 = 
fXY[4+(i+1)%4][1]-
fXY[4+i][1];
 
  315      twist[i] = dy1*dx2 - dx1*dy2;
 
  327      for (i=0; i<4; i++) {
 
  328         fXY[i][0] += 1.E-8*
fXY[i+4][0];
 
  329         fXY[i][1] += 1.E-8*
fXY[i+4][1];
 
  333      for (i=0; i<4; i++) {
 
  334         fXY[i+4][0] += 1.E-8*
fXY[i][0];
 
  335         fXY[i+4][1] += 1.E-8*
fXY[i][1];
 
  341   for (i=0; i<4; i++) {
 
  344      sum2 += 
fXY[i+4][0]*
fXY[j+4][1]-
fXY[j+4][0]*
fXY[i+4][1];
 
  347      Fatal(
"ComputeTwist", 
"Shape %s type Arb8: Lower/upper faces defined with opposite clockwise", 
GetName());
 
  351      Error(
"ComputeTwist", 
"Shape %s type Arb8: Vertices must be defined clockwise in XY planes. Re-ordering...", 
GetName());
 
  374      Error(
"ComputeTwist", 
"Shape %s type Arb8: Malformed polygon with crossing opposite segments", 
GetName());
 
  384   return (!
fTwist || iseg<0 || iseg>3) ? 0. : 
fTwist[iseg];
 
  398   Double_t lsq, ssq, dx, dy, dpx, dpy, u;
 
  401   for (i1=0; i1<4; i1++) {
 
  408      p1[1] = vert[2*i1+1];
 
  410      p2[1] = vert[2*i2+1];
 
  413      dpx = point[0] - p1[0];
 
  414      dpy = point[1] - p1[1];
 
  418         ssq = dpx*dpx + dpy*dpy;
 
  427      u = (dpx*dx + dpy*dy)/lsq;
 
  431         dpx = point[0]-p2[0];
 
  432         dpy = point[1]-p2[1];
 
  444      ssq = dpx*dpx + dpy*dpy;
 
  468      norm[2] = (dir[2]>0)?1:(-1);
 
  476   if (frac<0) frac = 0.;
 
  477   Int_t jseg = (iseg+1)%4;
 
  489   x1 += frac*(
fXY[jseg+4][0]-
x1);
 
  490   y1 += frac*(
fXY[jseg+4][1]-
y1);
 
  499   norm[0] = ay*bz-az*by;
 
  500   norm[1] = az*bx-ax*bz;
 
  501   norm[2] = ax*by-ay*bx;
 
  502   fn = 
TMath::Sqrt(norm[0]*norm[0]+norm[1]*norm[1]+norm[2]*norm[2]);
 
  514   if (dir[0]>-2. && dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2] < 0) {
 
  534   for (i=0; i<4; i++) {
 
  535      poly[2*i]   = 
fXY[i+4][0]+cf*(
fXY[i][0]-
fXY[i+4][0]);
 
  536      poly[2*i+1] = 
fXY[i+4][1]+cf*(
fXY[i][1]-
fXY[i+4][1]);
 
  579   Double_t a=(dtx*dir[1]-dty*dir[0]+(tx1*ty2-tx2*ty1)*dir[2])*dir[2];
 
  581   Double_t b=dxs*dir[1]-dys*dir[0]+(dtx*point[1]-dty*point[0]+ty2*xs1-ty1*xs2
 
  582              +tx1*ys2-tx2*ys1)*dir[2];
 
  583   Double_t c=dxs*point[1]-dys*point[0]+xs1*ys2-xs2*ys1;
 
  590         memcpy(dirp,dir,3*
sizeof(
Double_t));
 
  593         ((
TGeoArb8*)
this)->ComputeNormal(point,dirp,norm);
 
  594         ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
 
  598            zi = (point[0]-xs1)*(point[0]-xs2)+(point[1]-ys1)*(point[1]-ys2);
 
  611         memcpy(dirp,dir,3*
sizeof(
Double_t));
 
  614         ((
TGeoArb8*)
this)->ComputeNormal(point,dirp,norm);
 
  615         ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
 
  622         zi=point[2]+s*dir[2];
 
  626            xp=point[0]+s*dir[0];
 
  629            yp=point[1]+s*dir[1];
 
  630            zi = (xp-
x1)*(xp-
x2)+(yp-
y1)*(yp-
y2);
 
  637         memcpy(dirp,dir,3*
sizeof(
Double_t));
 
  640         ((
TGeoArb8*)
this)->ComputeNormal(point,dirp,norm);
 
  641         ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
 
  650      zi=point[2]+s*dir[2];
 
  654         xp=point[0]+s*dir[0];
 
  657         yp=point[1]+s*dir[1];
 
  658         zi = (xp-
x1)*(xp-
x2)+(yp-
y1)*(yp-
y2);
 
  676      if (point[2]*dir[2]<0) {
 
  686   for (
Int_t i=0; i<4; i++) {
 
  704      distz=(-
fDz-point[2])/dir[2];
 
  707      if (dir[2]>0) distz=(
fDz-point[2])/dir[2];
 
  710   for (i=0; i<4; i++) {
 
  712      if (dist<distl) distl = dist;
 
  715      pt[0] = point[0]+distz*dir[0];
 
  716      pt[1] = point[1]+distz*dir[1];
 
  720   if (dist<0 || dist>1.E10) 
return 0.;
 
  732      distmin=(-
fDz-point[2])/dir[2];
 
  734      if (dir[2]>0) distmin =(
fDz-point[2])/dir[2];
 
  741   for (
Int_t ipl=0;ipl<4;ipl++) {
 
  765      Double_t a=(dtx*dir[1]-dty*dir[0]+(tx1*ty2-tx2*ty1)*dir[2])*dir[2];
 
  766      Double_t b=dxs*dir[1]-dys*dir[0]+(dtx*point[1]-dty*point[0]+ty2*xs1-ty1*xs2
 
  767              +tx1*ys2-tx2*ys1)*dir[2];
 
  768      Double_t c=dxs*point[1]-dys*point[0]+xs1*ys2-xs2*ys1;
 
  773         if (s>eps && s < distmin) {
 
  786               lateral_cross = 
kTRUE;
 
  791            if (s>eps && s < distmin) {
 
  793               lateral_cross = 
kTRUE;
 
  799   if (!lateral_cross) {
 
  803      pt[0] = point[0]+distmin*dir[0];
 
  804      pt[1] = point[1]+distmin*dir[1];
 
  809      for (
Int_t j=0; j<4; j++) {
 
  810         poly[2*j]   = 
fXY[j+i][0];
 
  811         poly[2*j+1] = 
fXY[j+i][1];
 
  825   Error(
"Divide", 
"Division of an arbitrary trapezoid not implemented");
 
  856   for (i=0; i<8; i++) {
 
  873      Error(
"GetFittingBox", 
"cannot handle parametrized rotated volumes");
 
  880      Error(
"GetFittingBox", 
"wrong matrix - parametrized box is outside this");
 
  885   dd[0] = parambox->
GetDX();
 
  886   dd[1] = parambox->
GetDY();
 
  887   dd[2] = parambox->
GetDZ();
 
  892         Error(
"GetFittingBox", 
"wrong matrix");
 
  896   if (dd[0]>=0 && dd[1]>=0) {
 
  907   for (
Int_t iaxis=0; iaxis<2; iaxis++) {
 
  908      if (dd[iaxis]>=0) 
continue;
 
  910      for (
Int_t ivert=0; ivert<4; ivert++) {
 
  930   for (i=0; i<3; i++) {
 
  931      v1[i] = p2[i] - p1[i];
 
  932      v2[i] = p3[i] - p1[i];
 
  935   cross += norm[0]*norm[0];
 
  937   cross += norm[1]*norm[1];
 
  939   cross += norm[2]*norm[2];
 
  942   for (i=0; i<3; i++) norm[i] *= cross;
 
 1014   for (i=0; i<4; i++) {
 
 1021      if (cross<0) 
return kFALSE;
 
 1031   printf(
"*** Shape %s: TGeoArb8 ***\n", 
GetName());
 
 1032   if (
IsTwisted()) printf(
"  = TWISTED\n");
 
 1033   for (
Int_t ip=0; ip<8; ip++) {
 
 1034      printf(
"    point #%i : x=%11.5f y=%11.5f z=%11.5f\n",
 
 1035             ip, 
fXY[ip][0], 
fXY[ip][1], 
fDz*((ip<4)?-1:1));
 
 1037   printf(
" Bounding box:\n");
 
 1047   if (!in) safz = -safz;
 
 1050   Double_t lsq, ssq, dx, dy, dpx, dpy, u;
 
 1062      for (iseg=0; iseg<4; iseg++) {
 
 1065         p2 = &vert[2*((iseg+1)%4)];
 
 1068         dpx = point[0] - p1[0];
 
 1069         dpy = point[1] - p1[1];
 
 1071         lsq = dx*dx + dy*dy;
 
 1072         u = (dpx*dx + dpy*dy)/lsq;
 
 1074            dpx = point[0]-p2[0];
 
 1075            dpy = point[1]-p2[1];
 
 1082         ssq = dpx*dpx + dpy*dpy;
 
 1089      if (umin<0) umin = 0.;
 
 1091         isegmin = (isegmin+1)%4;
 
 1095      Int_t i2 = (isegmin+1)%4;
 
 1100      dx = dx1 + umin*(dx2-dx1);
 
 1101      dy = dy1 + umin*(dy2-dy1);
 
 1111   for (iseg=0; iseg<4; iseg++) saf[iseg+1] = 
SafetyToFace(point,iseg,in);
 
 1114   if (safe<0) 
return 0.;
 
 1125   Int_t ipln = (iseg+1)%4;
 
 1127   vertices[0] = 
fXY[iseg][0];
 
 1128   vertices[1] = 
fXY[iseg][1];
 
 1131   vertices[3] = 
fXY[ipln][0];
 
 1132   vertices[4] = 
fXY[ipln][1];
 
 1135   vertices[6] = 
fXY[ipln+4][0];
 
 1136   vertices[7] = 
fXY[ipln+4][1];
 
 1139   vertices[9] = 
fXY[iseg+4][0];
 
 1140   vertices[10] = 
fXY[iseg+4][1];
 
 1153   safe = (point[0]-p1[0])*norm[0]+(point[1]-p1[1])*norm[1]+(point[2]-p1[2])*norm[2];
 
 1154   if (in) 
return (-safe);
 
 1164   out << 
"   // Shape: " << 
GetName() << 
" type: " << 
ClassName() << std::endl;
 
 1165   out << 
"   dz       = " << 
fDz << 
";" << std::endl;
 
 1166   out << 
"   vert[0]  = " << 
fXY[0][0] << 
";" << std::endl;
 
 1167   out << 
"   vert[1]  = " << 
fXY[0][1] << 
";" << std::endl;
 
 1168   out << 
"   vert[2]  = " << 
fXY[1][0] << 
";" << std::endl;
 
 1169   out << 
"   vert[3]  = " << 
fXY[1][1] << 
";" << std::endl;
 
 1170   out << 
"   vert[4]  = " << 
fXY[2][0] << 
";" << std::endl;
 
 1171   out << 
"   vert[5]  = " << 
fXY[2][1] << 
";" << std::endl;
 
 1172   out << 
"   vert[6]  = " << 
fXY[3][0] << 
";" << std::endl;
 
 1173   out << 
"   vert[7]  = " << 
fXY[3][1] << 
";" << std::endl;
 
 1174   out << 
"   vert[8]  = " << 
fXY[4][0] << 
";" << std::endl;
 
 1175   out << 
"   vert[9]  = " << 
fXY[4][1] << 
";" << std::endl;
 
 1176   out << 
"   vert[10] = " << 
fXY[5][0] << 
";" << std::endl;
 
 1177   out << 
"   vert[11] = " << 
fXY[5][1] << 
";" << std::endl;
 
 1178   out << 
"   vert[12] = " << 
fXY[6][0] << 
";" << std::endl;
 
 1179   out << 
"   vert[13] = " << 
fXY[6][1] << 
";" << std::endl;
 
 1180   out << 
"   vert[14] = " << 
fXY[7][0] << 
";" << std::endl;
 
 1181   out << 
"   vert[15] = " << 
fXY[7][1] << 
";" << std::endl;
 
 1182   out << 
"   TGeoShape *" << 
GetPointerName() << 
" = new TGeoArb8(\"" << 
GetName() << 
"\", dz,vert);" << std::endl;
 
 1192   for (
Int_t i=0; i<4; i++) {
 
 1193      vertices[2*i]   = 
fXY[i+4][0]+cf*(
fXY[i][0]-
fXY[i+4][0]);
 
 1194      vertices[2*i+1] = 
fXY[i+4][1]+cf*(
fXY[i][1]-
fXY[i+4][1]);
 
 1208   for (
Int_t i=0; i<8; i++) {
 
 1209      fXY[i][0] = param[2*i+1];
 
 1210      fXY[i][1] = param[2*i+2];
 
 1221   for (
Int_t i=0; i<8; i++) {
 
 1233   for (
Int_t i=0; i<8; i++) {
 
 1245   if (vnum<0 || vnum >7) {
 
 1246      Error(
"SetVertex", 
"Invalid vertex number");
 
 1372   fXY[0][0] = -dz*tx-
h1*ta1-bl1;    
fXY[0][1] = -dz*ty-
h1;
 
 1373   fXY[1][0] = -dz*tx+
h1*ta1-tl1;    
fXY[1][1] = -dz*ty+
h1;
 
 1374   fXY[2][0] = -dz*tx+
h1*ta1+tl1;    
fXY[2][1] = -dz*ty+
h1;
 
 1375   fXY[3][0] = -dz*tx-
h1*ta1+bl1;    
fXY[3][1] = -dz*ty-
h1;
 
 1376   fXY[4][0] = dz*tx-h2*ta2-bl2;    
fXY[4][1] = dz*ty-h2;
 
 1377   fXY[5][0] = dz*tx+h2*ta2-tl2;    
fXY[5][1] = dz*ty+h2;
 
 1378   fXY[6][0] = dz*tx+h2*ta2+tl2;    
fXY[6][1] = dz*ty+h2;
 
 1379   fXY[7][0] = dz*tx-h2*ta2+bl2;    
fXY[7][1] = dz*ty-h2;
 
 1381   if ((dz<0) || (
h1<0) || (bl1<0) || (tl1<0) ||
 
 1382       (h2<0) || (bl2<0) || (tl2<0)) {
 
 1408   for (
Int_t i=0; i<8; i++) {
 
 1416   fXY[0][0] = -dz*tx-
h1*ta1-bl1;    
fXY[0][1] = -dz*ty-
h1;
 
 1417   fXY[1][0] = -dz*tx+
h1*ta1-tl1;    
fXY[1][1] = -dz*ty+
h1;
 
 1418   fXY[2][0] = -dz*tx+
h1*ta1+tl1;    
fXY[2][1] = -dz*ty+
h1;
 
 1419   fXY[3][0] = -dz*tx-
h1*ta1+bl1;    
fXY[3][1] = -dz*ty-
h1;
 
 1420   fXY[4][0] = dz*tx-h2*ta2-bl2;    
fXY[4][1] = dz*ty-h2;
 
 1421   fXY[5][0] = dz*tx+h2*ta2-tl2;    
fXY[5][1] = dz*ty+h2;
 
 1422   fXY[6][0] = dz*tx+h2*ta2+tl2;    
fXY[6][1] = dz*ty+h2;
 
 1423   fXY[7][0] = dz*tx-h2*ta2+bl2;    
fXY[7][1] = dz*ty-h2;
 
 1425   if ((dz<0) || (
h1<0) || (bl1<0) || (tl1<0) ||
 
 1426       (h2<0) || (bl2<0) || (tl2<0)) {
 
 1444   if (iact<3 && safe) {
 
 1460      distmin=(-
fDz-point[2])/dir[2];
 
 1462      if (dir[2]>0) distmin =(
fDz-point[2])/dir[2];
 
 1467   for (
Int_t ipl=0;ipl<4;ipl++) {
 
 1468      Int_t j = (ipl+1)%4;
 
 1482      Double_t ddotn = -dir[0]*az*by + dir[1]*az*bx+dir[2]*(ax*by-ay*bx);
 
 1483      if (ddotn<=0) 
continue; 
 
 1484      Double_t saf = -(point[0]-xa)*az*by + (point[1]-ya)*az*bx + (point[2]+
fDz)*(ax*by-ay*bx);
 
 1485      if (saf>=0.0) 
return 0.0;
 
 1487      if (s<distmin) distmin=s;
 
 1497   if (iact<3 && safe) {
 
 1515      xnew = point[0] + snxt*dir[0];
 
 1516      ynew = point[1] + snxt*dir[1];
 
 1520         pts[j+1] = 
fXY[i][1];
 
 1527      xnew = point[0] + snxt*dir[0];
 
 1528      ynew = point[1] + snxt*dir[1];
 
 1531         pts[j] = 
fXY[i+4][0];
 
 1532         pts[j+1] = 
fXY[i+4][1];
 
 1545   for (i=0; i<4; i++) {
 
 1560      ddotn = -dir[0]*az*by + dir[1]*az*bx+dir[2]*(ax*by-ay*bx);
 
 1561      saf = (point[0]-xa)*az*by - (point[1]-ya)*az*bx - (point[2]+
fDz)*(ax*by-ay*bx);
 
 1568         znew = point[2]+snxt*dir[2];
 
 1570            xnew = point[0]+snxt*dir[0];
 
 1571            ynew = point[1]+snxt*dir[1];
 
 1582               if ((xnew-xs1)*(xs2-xnew)>=0) 
return snxt;
 
 1584               if ((ynew-ys1)*(ys2-ynew)>=0) 
return snxt;
 
 1590            if (ddotn>=0) exiting = 
kTRUE;
 
 1597   if (saf>0 && saf<safmin) exiting = (point[2]*dir[2] > 0)?
kTRUE:
kFALSE;
 
 1619      Error(
"Divide", 
"cannot divide trapezoids on other axis than Z");
 
 1633   for (
Int_t idiv=0; idiv<ndiv; idiv++) {
 
 1634      zmin = start+idiv*step;
 
 1635      zmax = start+(idiv+1)*step;
 
 1636      oz = start+idiv*step+step/2;
 
 1642      for (
Int_t vert1=0; vert1<4; vert1++)
 
 1643         ((
TGeoArb8*)shape)->SetVertex(vert1, points_lo[2*vert1]-ox, points_lo[2*vert1+1]-oy);
 
 1644      for (
Int_t vert2=0; vert2<4; vert2++)
 
 1645         ((
TGeoArb8*)shape)->SetVertex(vert2+4, points_hi[2*vert2]-ox, points_hi[2*vert2+1]-oy);
 
 1662      Error(
"GetMakeRuntimeShape", 
"invalid mother");
 
 1687   return (
new TGeoTrap(dz, 
fTheta, 
fPhi, 
h1, bl1, tl1, 
fAlpha1, h2, bl2, tl2, 
fAlpha2));
 
 1702   for (i=0; i<4; i++) {
 
 1725      norm[2] = ax*by-ay*bx;
 
 1726      fn = 
TMath::Sqrt(norm[0]*norm[0]+norm[1]*norm[1]+norm[2]*norm[2]);
 
 1727      if (fn<1E-10) 
continue;
 
 1728      saf[i] = (x0-point[0])*norm[0]+(y0-point[1])*norm[1]+(-
fDz-point[2])*norm[2];
 
 1732         saf[i] = -saf[i]/fn;   
 
 1757   out << 
"   // Shape: " << 
GetName() << 
" type: " << 
ClassName() << std::endl;
 
 1758   out << 
"   dz     = " << 
fDz << 
";" << std::endl;
 
 1759   out << 
"   theta  = " << 
fTheta << 
";" << std::endl;
 
 1760   out << 
"   phi    = " << 
fPhi << 
";" << std::endl;
 
 1761   out << 
"   h1     = " << 
fH1<< 
";" << std::endl;
 
 1762   out << 
"   bl1    = " << 
fBl1<< 
";" << std::endl;
 
 1763   out << 
"   tl1    = " << 
fTl1<< 
";" << std::endl;
 
 1764   out << 
"   alpha1 = " << 
fAlpha1 << 
";" << std::endl;
 
 1765   out << 
"   h2     = " << 
fH2 << 
";" << std::endl;
 
 1766   out << 
"   bl2    = " << 
fBl2<< 
";" << std::endl;
 
 1767   out << 
"   tl2    = " << 
fTl2<< 
";" << std::endl;
 
 1768   out << 
"   alpha2 = " << 
fAlpha2 << 
";" << std::endl;
 
 1769   out << 
"   TGeoShape *" << 
GetPointerName() << 
" = new TGeoTrap(\"" << 
GetName() << 
"\", dz,theta,phi,h1,bl1,tl1,alpha1,h2,bl2,tl2,alpha2);" << std::endl;
 
 1863         :
TGeoTrap(dz, theta, phi, 
h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2)
 
 1875   for (i=0; i<4; i++) {
 
 1884   for (i=4; i<8; i++) {
 
 1891   if ((dz<0) || (
h1<0) || (bl1<0) || (tl1<0) ||
 
 1902         :
TGeoTrap(
name, dz, theta, phi, 
h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2)
 
 1914   for (i=0; i<4; i++) {
 
 1923   for (i=4; i<8; i++) {
 
 1930   if ((dz<0) || (
h1<0) || (bl1<0) || (tl1<0) ||
 
 1947   if (iact<3 && safe) {
 
 1962   if (iact<3 && safe) {
 
 1980      Error(
"GetMakeRuntimeShape", 
"invalid mother");
 
 1995      bl1 = ((
TGeoTrap*)mother)->GetBl1();
 
 1999      bl2 = ((
TGeoTrap*)mother)->GetBl2();
 
 2003      tl1 = ((
TGeoTrap*)mother)->GetTl1();
 
 2007      tl2 = ((
TGeoTrap*)mother)->GetTl2();
 
 2010   return (
new TGeoGtra(dz, 
fTheta, 
fPhi, 
fTwistAngle ,
h1, bl1, tl1, 
fAlpha1, h2, bl2, tl2, 
fAlpha2));
 
 2027   out << 
"   // Shape: " << 
GetName() << 
" type: " << 
ClassName() << std::endl;
 
 2028   out << 
"   dz     = " << 
fDz << 
";" << std::endl;
 
 2029   out << 
"   theta  = " << 
fTheta << 
";" << std::endl;
 
 2030   out << 
"   phi    = " << 
fPhi << 
";" << std::endl;
 
 2031   out << 
"   twist  = " << 
fTwistAngle << 
";" << std::endl;
 
 2032   out << 
"   h1     = " << 
fH1<< 
";" << std::endl;
 
 2033   out << 
"   bl1    = " << 
fBl1<< 
";" << std::endl;
 
 2034   out << 
"   tl1    = " << 
fTl1<< 
";" << std::endl;
 
 2035   out << 
"   alpha1 = " << 
fAlpha1 << 
";" << std::endl;
 
 2036   out << 
"   h2     = " << 
fH2 << 
";" << std::endl;
 
 2037   out << 
"   bl2    = " << 
fBl2<< 
";" << std::endl;
 
 2038   out << 
"   tl2    = " << 
fTl2<< 
";" << std::endl;
 
 2039   out << 
"   alpha2 = " << 
fAlpha2 << 
";" << std::endl;
 
 2040   out << 
"   TGeoShape *" << 
GetPointerName() << 
" = new TGeoGtra(\"" << 
GetName() << 
"\", dz,theta,phi,twist,h1,bl1,tl1,alpha1,h2,bl2,tl2,alpha2);" << std::endl;
 
 2073   for (i=0; i<4; i++) {
 
 2082   for (i=4; i<8; i++) {
 
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
 
Option_t Option_t TPoint TPoint const char x2
 
Option_t Option_t TPoint TPoint const char x1
 
Option_t Option_t TPoint TPoint const char y2
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
 
Option_t Option_t TPoint TPoint const char y1
 
R__EXTERN TGeoManager * gGeoManager
 
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
 
An arbitrary trapezoid with less than 8 vertices standing on two parallel planes perpendicular to Z a...
 
virtual void SetVertex(Int_t vnum, Double_t x, Double_t y)
Set values for a given vertex.
 
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 shape.
 
virtual Bool_t GetPointsOnFacet(Int_t, Int_t, Double_t *) const
Fills array with n random points located on the surface of indexed facet.
 
virtual TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step)
Divide this shape along one axis.
 
Double_t GetClosestEdge(const Double_t *point, Double_t *vert, Int_t &isegment) const
Get index of the edge of the quadrilater represented by vert closest to point.
 
virtual Double_t GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const
Get shape range on a given axis.
 
Double_t fXY[8][2]
[4] tangents of twist angles
 
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 Streamer(TBuffer &)
Stream an object of class TGeoManager.
 
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Computes the closest distance from given point to this shape.
 
void CopyTwist(Double_t *twist=nullptr)
Copy twist values from source array.
 
virtual ~TGeoArb8()
Destructor.
 
static void GetPlaneNormal(Double_t *p1, Double_t *p2, Double_t *p3, Double_t *norm)
Computes normal to plane defined by P1, P2 and P3.
 
virtual Bool_t Contains(const Double_t *point) const
Test if point is inside this shape.
 
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
 
virtual void SetPoints(Double_t *points) const
Creates arb8 mesh points.
 
void ComputeTwist()
Computes tangents of twist angles (angles between projections on XY plane of corresponding -dz +dz ed...
 
virtual void Sizeof3D() const
Fill size of this 3-D object.
 
Double_t DistToPlane(const Double_t *point, const Double_t *dir, Int_t ipl, Bool_t in) const
Computes distance to plane ipl :
 
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...
 
static Bool_t InsidePolygon(Double_t x, Double_t y, Double_t *pts)
Finds if a point in XY plane is inside the polygon defines by PTS.
 
virtual void ComputeBBox()
Computes bounding box for an Arb8 shape.
 
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 Double_t Capacity() const
Computes capacity of the shape in [length^3].
 
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
Computes distance from outside point to surface of the shape.
 
Double_t SafetyToFace(const Double_t *point, Int_t iseg, Bool_t in) const
Estimate safety to lateral plane defined by segment iseg in range [0,3] Might be negative: plane seen...
 
TGeoArb8()
Default constructor.
 
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Compute normal to closest surface from POINT.
 
virtual void GetBoundingCylinder(Double_t *param) const
Fill vector param[4] with the bounding cylinder parameters.
 
Double_t GetTwist(Int_t iseg) const
Get twist for segment I in range [0,3].
 
static Bool_t IsSamePoint(const Double_t *p1, const Double_t *p2)
 
virtual void SetDimensions(Double_t *param)
Set all arb8 params in one step.
 
void SetPlaneVertices(Double_t zpl, Double_t *vertices) const
Computes intersection points between plane at zpl and non-horizontal edges.
 
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 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 void InspectShape() const
Prints shape parameters.
 
virtual Int_t GetFittingBox(const TGeoBBox *parambox, TGeoMatrix *mat, Double_t &dx, Double_t &dy, Double_t &dz) const
Fills real parameters of a positioned box inside this arb8. Returns 0 if successful.
 
virtual const Double_t * GetOrigin() const
 
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Computes the closest distance from given point to this shape.
 
virtual void InspectShape() const
Prints shape parameters.
 
virtual Double_t GetDX() const
 
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 Double_t GetDZ() const
 
virtual void Sizeof3D() const
 
virtual Double_t GetDY() const
 
virtual Bool_t Contains(const Double_t *point) const
Test if point is inside this shape.
 
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 shape.
 
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 ~TGeoGtra()
Destructor.
 
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 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 inside point to surface of the shape.
 
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Computes the closest distance from given point to this shape.
 
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 SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
 
virtual void SetDimensions(Double_t *param)
Set all arb8 params in one step.
 
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...
 
TGeoVolumeMulti * MakeVolumeMulti(const char *name, TGeoMedium *medium)
Make a TGeoVolumeMulti handling a list of volumes.
 
Geometrical transformation package.
 
Bool_t IsRotation() const
 
virtual void LocalToMaster(const Double_t *local, Double_t *master) const
convert a point by multiplying its column vector (x, y, z, 1) to matrix inverse
 
Node containing an offset.
 
Base finder class for patterns.
 
void SetDivIndex(Int_t index)
 
Base abstract class for all shapes.
 
static Bool_t IsSegCrossing(Double_t x1, Double_t y1, Double_t x2, Double_t y2, Double_t x3, Double_t y3, Double_t x4, Double_t y4)
Check if segments (A,B) and (C,D) are crossing, where: A(x1,y1), B(x2,y2), C(x3,y3),...
 
void SetShapeBit(UInt_t f, Bool_t set)
Equivalent of TObject::SetBit.
 
static Bool_t IsSameWithinTolerance(Double_t a, Double_t b)
Check if two numbers differ with less than a tolerance.
 
Bool_t IsRunTimeShape() const
 
const char * GetPointerName() const
Provide a pointer name containing uid.
 
virtual const char * GetName() const
Get the shape name.
 
static Double_t Tolerance()
 
Bool_t TestShapeBit(UInt_t f) const
 
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 TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step)
Divide this trapezoid shape belonging to volume "voldiv" into ndiv volumes called divname,...
 
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
 
virtual TGeoShape * GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix *mat) const
In case shape has some negative parameters, these have to be computed in order to fit the mother.
 
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 trapezoid.
 
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 SetDimensions(Double_t *param)
Set all arb8 params in one step.
 
virtual ~TGeoTrap()
Destructor.
 
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Computes the closest distance from given point to this shape.
 
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 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 trapezoid.
 
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
 
virtual void SetName(const char *name)
Set the name of the TNamed.
 
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.
 
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.
 
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.
 
Double_t Tan(Double_t)
Returns the tangent of an angle of x radians.
 
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
 
#define snext(osub1, osub2)