148    for (
Int_t i=0; i<8; i++) {
   152    SetShapeBit(kGeoArb8);
   166       for (
Int_t i=0; i<8; i++) {
   167          fXY[i][0] = vertices[2*i];
   168          fXY[i][1] = vertices[2*i+1];
   173       for (
Int_t i=0; i<8; i++) {
   191       for (
Int_t i=0; i<8; i++) {
   192          fXY[i][0] = vertices[2*i];
   193          fXY[i][1] = vertices[2*i+1];
   198       for (
Int_t i=0; i<8; i++) {
   213    for(
Int_t i=0; i<8; i++) {
   228       for(
Int_t i=0; i<8; i++) {
   251    for (i=0; i<4; i++) {
   253       capacity += 0.25*
fDz*((
fXY[i][0]+
fXY[i+4][0])*(
fXY[j][1]+
fXY[j+4][1]) -
   255                     (1./3)*((
fXY[i+4][0]-
fXY[i][0])*(
fXY[j+4][1]-
fXY[j][1]) -
   267    xmin = xmax = 
fXY[0][0];
   268    ymin = ymax = 
fXY[0][1];
   270    for (
Int_t i=1; i<8; i++) {
   271       if (xmin>
fXY[i][0]) xmin=
fXY[i][0];
   272       if (xmax<
fXY[i][0]) xmax=
fXY[i][0];
   273       if (ymin>
fXY[i][1]) ymin=
fXY[i][1];
   274       if (ymax<
fXY[i][1]) ymax=
fXY[i][1];
   298    for (i=0; i<4; i++) {
   299       dx1 = 
fXY[(i+1)%4][0]-
fXY[i][0];
   300       dy1 = 
fXY[(i+1)%4][1]-
fXY[i][1];
   306       dx2 = 
fXY[4+(i+1)%4][0]-
fXY[4+i][0];
   307       dy2 = 
fXY[4+(i+1)%4][1]-
fXY[4+i][1];
   313       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());
   385    if (iseg<0 || iseg>3) 
return 0.;
   400    Double_t lsq, ssq, dx, dy, dpx, dpy, u;
   403    for (i1=0; i1<4; i1++) {
   410       p1[1] = vert[2*i1+1];
   412       p2[1] = vert[2*i2+1];
   415       dpx = point[0] - p1[0];
   416       dpy = point[1] - p1[1];
   420          ssq = dpx*dpx + dpy*dpy;
   429       u = (dpx*dx + dpy*dy)/lsq;
   433          dpx = point[0]-p2[0];
   434          dpy = point[1]-p2[1];
   446       ssq = dpx*dpx + dpy*dpy;
   470       norm[2] = (dir[2]>0)?1:(-1);
   478    if (frac<0) frac = 0.;
   479    Int_t jseg = (iseg+1)%4;
   491    x1 += frac*(
fXY[jseg+4][0]-
x1);
   492    y1 += frac*(
fXY[jseg+4][1]-y1);
   501    norm[0] = ay*bz-az*by;
   502    norm[1] = az*bx-ax*bz;
   503    norm[2] = ax*by-ay*bx;
   504    fn = 
TMath::Sqrt(norm[0]*norm[0]+norm[1]*norm[1]+norm[2]*norm[2]);
   516    if (dir[0]>-2. && dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2] < 0) {
   536    for (i=0; i<4; i++) {
   537       poly[2*i]   = 
fXY[i+4][0]+cf*(
fXY[i][0]-
fXY[i+4][0]);
   538       poly[2*i+1] = 
fXY[i+4][1]+cf*(
fXY[i][1]-
fXY[i+4][1]);
   581    Double_t a=(dtx*dir[1]-dty*dir[0]+(tx1*ty2-tx2*ty1)*dir[2])*dir[2];
   583    Double_t b=dxs*dir[1]-dys*dir[0]+(dtx*point[1]-dty*point[0]+ty2*xs1-ty1*xs2
   584               +tx1*ys2-tx2*ys1)*dir[2];
   585    Double_t c=dxs*point[1]-dys*point[0]+xs1*ys2-xs2*ys1;
   593          memcpy(dirp,dir,3*
sizeof(
Double_t));
   596          ((
TGeoArb8*)
this)->ComputeNormal(point,dirp,norm);
   597          ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
   601             zi = (point[0]-xs1)*(point[0]-xs2)+(point[1]-ys1)*(point[1]-ys2);
   614          memcpy(dirp,dir,3*
sizeof(
Double_t));
   617          ((
TGeoArb8*)
this)->ComputeNormal(point,dirp,norm);
   618          ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
   625          zi=point[2]+s*dir[2];
   629             xp=point[0]+s*dir[0];
   632             yp=point[1]+s*dir[1];
   633             zi = (xp-
x1)*(xp-x2)+(yp-y1)*(yp-y2);
   640          memcpy(dirp,dir,3*
sizeof(
Double_t));
   643          ((
TGeoArb8*)
this)->ComputeNormal(point,dirp,norm);
   644          ndotd = dir[0]*norm[0]+dir[1]*norm[1]+dir[2]*norm[2];
   653       zi=point[2]+s*dir[2];
   657          xp=point[0]+s*dir[0];
   660          yp=point[1]+s*dir[1];
   661          zi = (xp-
x1)*(xp-x2)+(yp-y1)*(yp-y2);
   679       if (point[2]*dir[2]<0) {
   681          snext = 
TMath::Max((pt[2]-point[2])/dir[2],0.);
   682          for (
Int_t j=0; j<2; j++) pt[j]=point[j]+snext*dir[j];
   689    for (
Int_t i=0; i<4; i++) {
   691       if (dist<snext) snext = 
dist;
   707       distz=(-
fDz-point[2])/dir[2];
   710       if (dir[2]>0) distz=(
fDz-point[2])/dir[2];
   713    for (i=0; i<4; i++) {
   715       if (dist<distl) distl = 
dist;
   718       pt[0] = point[0]+distz*dir[0];
   719       pt[1] = point[1]+distz*dir[1];
   723    if (dist<0 || dist>1.E10) 
return 0.;
   735       distmin=(-
fDz-point[2])/dir[2];
   737       if (dir[2]>0) distmin =(
fDz-point[2])/dir[2];
   744    for (
Int_t ipl=0;ipl<4;ipl++) {
   768       Double_t a=(dtx*dir[1]-dty*dir[0]+(tx1*ty2-tx2*ty1)*dir[2])*dir[2];
   769       Double_t b=dxs*dir[1]-dys*dir[0]+(dtx*point[1]-dty*point[0]+ty2*xs1-ty1*xs2
   770               +tx1*ys2-tx2*ys1)*dir[2];
   771       Double_t c=dxs*point[1]-dys*point[0]+xs1*ys2-xs2*ys1;
   776          if (s>eps && s < distmin) {
   789                lateral_cross = 
kTRUE;
   794             if (s>eps && s < distmin) {
   796                lateral_cross = 
kTRUE;
   802    if (!lateral_cross) {
   806       pt[0] = point[0]+distmin*dir[0];
   807       pt[1] = point[1]+distmin*dir[1];
   812       for (
Int_t j=0; j<4; j++) {
   813          poly[2*j]   = 
fXY[j+i][0];
   814          poly[2*j+1] = 
fXY[j+i][1];
   828    Error(
"Divide", 
"Division of an arbitrary trapezoid not implemented");
   859    for (i=0; i<8; i++) {
   876       Error(
"GetFittingBox", 
"cannot handle parametrized rotated volumes");
   883       Error(
"GetFittingBox", 
"wrong matrix - parametrized box is outside this");
   888    dd[0] = parambox->
GetDX();
   889    dd[1] = parambox->
GetDY();
   890    dd[2] = parambox->
GetDZ();
   895          Error(
"GetFittingBox", 
"wrong matrix");
   899    if (dd[0]>=0 && dd[1]>=0) {
   911    for (
Int_t iaxis=0; iaxis<2; iaxis++) {
   912       if (dd[iaxis]>=0) 
continue;
   914       for (
Int_t ivert=0; ivert<4; ivert++) {
   934    for (i=0; i<3; i++) {
   935       v1[i] = p2[i] - p1[i];
   936       v2[i] = p3[i] - p1[i];
   938    norm[0] = v1[1]*v2[2]-v1[2]*v2[1];
   939    cross += norm[0]*norm[0];
   940    norm[1] = v1[2]*v2[0]-v1[0]*v2[2];
   941    cross += norm[1]*norm[1];
   942    norm[2] = v1[0]*v2[1]-v1[1]*v2[0];
   943    cross += norm[2]*norm[2];
   946    for (i=0; i<3; i++) norm[i] *= cross;
  1018    for (i=0; i<4; i++) {
  1024       cross = (x-
x1)*(y2-y1)-(y-y1)*(x2-x1);
  1025       if (cross<0) 
return kFALSE;
  1035    printf(
"*** Shape %s: TGeoArb8 ***\n", 
GetName());
  1036    if (
IsTwisted()) printf(
"  = TWISTED\n");
  1037    for (
Int_t ip=0; ip<8; ip++) {
  1038       printf(
"    point #%i : x=%11.5f y=%11.5f z=%11.5f\n",
  1039              ip, 
fXY[ip][0], 
fXY[ip][1], 
fDz*((ip<4)?-1:1));
  1041    printf(
" Bounding box:\n");
  1051    if (!in) safz = -safz;
  1054    Double_t lsq, ssq, dx, dy, dpx, dpy, u;
  1066       for (iseg=0; iseg<4; iseg++) {
  1069          p2 = &vert[2*((iseg+1)%4)];
  1072          dpx = point[0] - p1[0];
  1073          dpy = point[1] - p1[1];
  1075          lsq = dx*dx + dy*dy;
  1076          u = (dpx*dx + dpy*dy)/lsq;
  1078             dpx = point[0]-p2[0];
  1079             dpy = point[1]-p2[1];
  1086          ssq = dpx*dpx + dpy*dpy;
  1093       if (umin<0) umin = 0.;
  1095          isegmin = (isegmin+1)%4;
  1099       Int_t i2 = (isegmin+1)%4;
  1101       Double_t dx2 = fXY[i2+4][0]-fXY[i1+4][0];
  1102       Double_t dy1 = fXY[i2][1]-fXY[i1][1];
  1103       Double_t dy2 = fXY[i2+4][1]-fXY[i1+4][1];
  1104       dx = dx1 + umin*(dx2-dx1);
  1105       dy = dy1 + umin*(dy2-dy1);
  1115    for (iseg=0; iseg<4; iseg++) saf[iseg+1] = 
SafetyToFace(point,iseg,in);
  1118    if (safe<0) 
return 0.;
  1129    Int_t ipln = (iseg+1)%4;
  1131    vertices[0] = 
fXY[iseg][0];
  1132    vertices[1] = 
fXY[iseg][1];
  1135    vertices[3] = 
fXY[ipln][0];
  1136    vertices[4] = 
fXY[ipln][1];
  1139    vertices[6] = 
fXY[ipln+4][0];
  1140    vertices[7] = 
fXY[ipln+4][1];
  1143    vertices[9] = 
fXY[iseg+4][0];
  1144    vertices[10] = 
fXY[iseg+4][1];
  1157    safe = (point[0]-p1[0])*norm[0]+(point[1]-p1[1])*norm[1]+(point[2]-p1[2])*norm[2];
  1158    if (in) 
return (-safe);
  1168    out << 
"   // Shape: " << 
GetName() << 
" type: " << 
ClassName() << std::endl;
  1169    out << 
"   dz       = " << 
fDz << 
";" << std::endl;
  1170    out << 
"   vert[0]  = " << 
fXY[0][0] << 
";" << std::endl;
  1171    out << 
"   vert[1]  = " << 
fXY[0][1] << 
";" << std::endl;
  1172    out << 
"   vert[2]  = " << 
fXY[1][0] << 
";" << std::endl;
  1173    out << 
"   vert[3]  = " << 
fXY[1][1] << 
";" << std::endl;
  1174    out << 
"   vert[4]  = " << 
fXY[2][0] << 
";" << std::endl;
  1175    out << 
"   vert[5]  = " << 
fXY[2][1] << 
";" << std::endl;
  1176    out << 
"   vert[6]  = " << 
fXY[3][0] << 
";" << std::endl;
  1177    out << 
"   vert[7]  = " << 
fXY[3][1] << 
";" << std::endl;
  1178    out << 
"   vert[8]  = " << 
fXY[4][0] << 
";" << std::endl;
  1179    out << 
"   vert[9]  = " << 
fXY[4][1] << 
";" << std::endl;
  1180    out << 
"   vert[10] = " << 
fXY[5][0] << 
";" << std::endl;
  1181    out << 
"   vert[11] = " << 
fXY[5][1] << 
";" << std::endl;
  1182    out << 
"   vert[12] = " << 
fXY[6][0] << 
";" << std::endl;
  1183    out << 
"   vert[13] = " << 
fXY[6][1] << 
";" << std::endl;
  1184    out << 
"   vert[14] = " << 
fXY[7][0] << 
";" << std::endl;
  1185    out << 
"   vert[15] = " << 
fXY[7][1] << 
";" << std::endl;
  1186    out << 
"   TGeoShape *" << 
GetPointerName() << 
" = new TGeoArb8(\"" << 
GetName() << 
"\", dz,vert);" << std::endl;
  1196    for (
Int_t i=0; i<4; i++) {
  1197       vertices[2*i]   = 
fXY[i+4][0]+cf*(
fXY[i][0]-
fXY[i+4][0]);
  1198       vertices[2*i+1] = 
fXY[i+4][1]+cf*(
fXY[i][1]-
fXY[i+4][1]);
  1212    for (
Int_t i=0; i<8; i++) {
  1213       fXY[i][0] = param[2*i+1];
  1214       fXY[i][1] = param[2*i+2];
  1225    for (
Int_t i=0; i<8; i++) {
  1226       points[3*i] = 
fXY[i][0];
  1227       points[3*i+1] = 
fXY[i][1];
  1228       points[3*i+2] = (i<4)?-
fDz:
fDz;
  1237    for (
Int_t i=0; i<8; i++) {
  1238       points[3*i] = 
fXY[i][0];
  1239       points[3*i+1] = 
fXY[i][1];
  1240       points[3*i+2] = (i<4)?-
fDz:
fDz;
  1249    if (vnum<0 || vnum >7) {
  1250       Error(
"SetVertex", 
"Invalid vertex number");
  1272 void TGeoArb8::Streamer(
TBuffer &R__b)
  1289    for (
Int_t i=0; i<vecsize; i++) inside[i] = 
Contains(&points[3*i]);
  1299    for (
Int_t i=0; i<vecsize; i++) 
ComputeNormal(&points[3*i], &dirs[3*i], &norms[3*i]);
  1307    for (
Int_t i=0; i<vecsize; i++) dists[i] = 
DistFromInside(&points[3*i], &dirs[3*i], 3, step[i]);
  1315    for (
Int_t i=0; i<vecsize; i++) dists[i] = 
DistFromOutside(&points[3*i], &dirs[3*i], 3, step[i]);
  1325    for (
Int_t i=0; i<vecsize; i++) safe[i] = 
Safety(&points[3*i], inside[i]);
  1338    fH1 = fH2 = fBl1 = fBl2 = fTl1 = fTl2 = fAlpha1 = fAlpha2 = 0;
  1376    fXY[0][0] = -dz*tx-h1*ta1-bl1;    
fXY[0][1] = -dz*ty-
h1;
  1377    fXY[1][0] = -dz*tx+h1*ta1-tl1;    
fXY[1][1] = -dz*ty+
h1;
  1378    fXY[2][0] = -dz*tx+h1*ta1+tl1;    
fXY[2][1] = -dz*ty+
h1;
  1379    fXY[3][0] = -dz*tx-h1*ta1+bl1;    
fXY[3][1] = -dz*ty-
h1;
  1380    fXY[4][0] = dz*tx-h2*ta2-bl2;    
fXY[4][1] = dz*ty-h2;
  1381    fXY[5][0] = dz*tx+h2*ta2-tl2;    
fXY[5][1] = dz*ty+h2;
  1382    fXY[6][0] = dz*tx+h2*ta2+tl2;    
fXY[6][1] = dz*ty+h2;
  1383    fXY[7][0] = dz*tx-h2*ta2+bl2;    
fXY[7][1] = dz*ty-h2;
  1385    if ((dz<0) || (h1<0) || (bl1<0) || (tl1<0) ||
  1386        (h2<0) || (bl2<0) || (tl2<0)) {
  1412    for (
Int_t i=0; i<8; i++) {
  1420    fXY[0][0] = -dz*tx-h1*ta1-bl1;    
fXY[0][1] = -dz*ty-
h1;
  1421    fXY[1][0] = -dz*tx+h1*ta1-tl1;    
fXY[1][1] = -dz*ty+
h1;
  1422    fXY[2][0] = -dz*tx+h1*ta1+tl1;    
fXY[2][1] = -dz*ty+
h1;
  1423    fXY[3][0] = -dz*tx-h1*ta1+bl1;    
fXY[3][1] = -dz*ty-
h1;
  1424    fXY[4][0] = dz*tx-h2*ta2-bl2;    
fXY[4][1] = dz*ty-h2;
  1425    fXY[5][0] = dz*tx+h2*ta2-tl2;    
fXY[5][1] = dz*ty+h2;
  1426    fXY[6][0] = dz*tx+h2*ta2+tl2;    
fXY[6][1] = dz*ty+h2;
  1427    fXY[7][0] = dz*tx-h2*ta2+bl2;    
fXY[7][1] = dz*ty-h2;
  1429    if ((dz<0) || (h1<0) || (bl1<0) || (tl1<0) ||
  1430        (h2<0) || (bl2<0) || (tl2<0)) {
  1448    if (iact<3 && safe) {
  1464       distmin=(-
fDz-point[2])/dir[2];
  1466       if (dir[2]>0) distmin =(
fDz-point[2])/dir[2];
  1471    for (
Int_t ipl=0;ipl<4;ipl++) {
  1472       Int_t j = (ipl+1)%4;
  1486       Double_t ddotn = -dir[0]*az*by + dir[1]*az*bx+dir[2]*(ax*by-ay*bx);
  1487       if (ddotn<=0) 
continue; 
  1488       Double_t saf = -(point[0]-xa)*az*by + (point[1]-ya)*az*bx + (point[2]+
fDz)*(ax*by-ay*bx);
  1489       if (saf>=0.0) 
return 0.0;
  1491       if (s<distmin) distmin=s;
  1501    if (iact<3 && safe) {
  1519       snxt = -(
fDz+point[2])/dir[2];
  1520       xnew = point[0] + snxt*dir[0];
  1521       ynew = point[1] + snxt*dir[1];
  1525          pts[j+1] = 
fXY[i][1];
  1531       snxt = (
fDz-point[2])/dir[2];
  1532       xnew = point[0] + snxt*dir[0];
  1533       ynew = point[1] + snxt*dir[1];
  1536          pts[j] = 
fXY[i+4][0];
  1537          pts[j+1] = 
fXY[i+4][1];
  1553    for (i=0; i<4; i++) {
  1568       ddotn = -dir[0]*az*by + dir[1]*az*bx+dir[2]*(ax*by-ay*bx);
  1569       saf = (point[0]-xa)*az*by - (point[1]-ya)*az*bx - (point[2]+
fDz)*(ax*by-ay*bx);
  1576          znew = point[2]+snxt*dir[2];
  1578             xnew = point[0]+snxt*dir[0];
  1579             ynew = point[1]+snxt*dir[1];
  1590                if ((xnew-xs1)*(xs2-xnew)>=0) 
return snxt;
  1592                if ((ynew-ys1)*(ys2-ynew)>=0) 
return snxt;
  1598             if (ddotn>=0) exiting = 
kTRUE;
  1605    if (saf>0 && saf<safmin) exiting = (point[2]*dir[2] > 0)?
kTRUE:
kFALSE;
  1627       Error(
"Divide", 
"cannot divide trapezoids on other axis than Z");
  1641    for (
Int_t idiv=0; idiv<ndiv; idiv++) {
  1642       zmin = start+idiv*step;
  1643       zmax = start+(idiv+1)*step;
  1644       oz = start+idiv*step+step/2;
  1650       for (
Int_t vert1=0; vert1<4; vert1++)
  1651          ((
TGeoArb8*)shape)->SetVertex(vert1, points_lo[2*vert1]-ox, points_lo[2*vert1+1]-oy);
  1652       for (
Int_t vert2=0; vert2<4; vert2++)
  1653          ((
TGeoArb8*)shape)->SetVertex(vert2+4, points_hi[2*vert2]-ox, points_hi[2*vert2+1]-oy);
  1670       Error(
"GetMakeRuntimeShape", 
"invalid mother");
  1674    if (
fDz<0) dz=((TGeoTrap*)mother)->GetDz();
  1677    if (
fH1<0)  h1 = ((TGeoTrap*)mother)->GetH1();
  1680    if (
fH2<0)  h2 = ((TGeoTrap*)mother)->GetH2();
  1683    if (
fBl1<0) bl1 = ((TGeoTrap*)mother)->GetBl1();
  1686    if (
fBl2<0) bl2 = ((TGeoTrap*)mother)->GetBl2();
  1689    if (
fTl1<0) tl1 = ((TGeoTrap*)mother)->GetTl1();
  1692    if (
fTl2<0) tl2 = ((TGeoTrap*)mother)->GetTl2();
  1695    return (
new TGeoTrap(dz, 
fTheta, 
fPhi, h1, bl1, tl1, 
fAlpha1, h2, bl2, tl2, 
fAlpha2));
  1711    for (i=0; i<4; i++) {
  1735       norm[2] = ax*by-ay*bx;
  1736       fn = 
TMath::Sqrt(norm[0]*norm[0]+norm[1]*norm[1]+norm[2]*norm[2]);
  1737       if (fn<1
E-10) 
continue;
  1738       saf[i] = (x0-point[0])*norm[0]+(y0-point[1])*norm[1]+(-
fDz-point[2])*norm[2];
  1742          saf[i] = -saf[i]/fn;   
  1748       for (j=1;j<5;j++) 
if (saf[j] <safe) safe = saf[j];
  1752       for (j=1;j<5;j++) if (saf[j] >safe) safe = saf[j];
  1763    out << 
"   // Shape: " << 
GetName() << 
" type: " << 
ClassName() << std::endl;
  1764    out << 
"   dz     = " << 
fDz << 
";" << std::endl;
  1765    out << 
"   theta  = " << 
fTheta << 
";" << std::endl;
  1766    out << 
"   phi    = " << 
fPhi << 
";" << std::endl;
  1767    out << 
"   h1     = " << 
fH1<< 
";" << std::endl;
  1768    out << 
"   bl1    = " << 
fBl1<< 
";" << std::endl;
  1769    out << 
"   tl1    = " << 
fTl1<< 
";" << std::endl;
  1770    out << 
"   alpha1 = " << 
fAlpha1 << 
";" << std::endl;
  1771    out << 
"   h2     = " << 
fH2 << 
";" << std::endl;
  1772    out << 
"   bl2    = " << 
fBl2<< 
";" << std::endl;
  1773    out << 
"   tl2    = " << 
fTl2<< 
";" << std::endl;
  1774    out << 
"   alpha2 = " << 
fAlpha2 << 
";" << std::endl;
  1775    out << 
"   TGeoShape *" << 
GetPointerName() << 
" = new TGeoTrap(\"" << 
GetName() << 
"\", dz,theta,phi,h1,bl1,tl1,alpha1,h2,bl2,tl2,alpha2);" << std::endl;
  1819    if ((
fDz<0) || (fH1<0) || (fBl1<0) || (fTl1<0) ||
  1820        (fH2<0) || (fBl2<0) || (fTl2<0)) {
  1831    for (
Int_t i=0; i<vecsize; i++) dists[i] = 
DistFromInside(&points[3*i], &dirs[3*i], 3, step[i]);
  1839    for (
Int_t i=0; i<vecsize; i++) dists[i] = 
DistFromOutside(&points[3*i], &dirs[3*i], 3, step[i]);
  1849    for (
Int_t i=0; i<vecsize; i++) safe[i] = 
Safety(&points[3*i], inside[i]);
  1869          :TGeoTrap(dz, theta, phi, h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2)
  1881    for (i=0; i<4; i++) {
  1890    for (i=4; i<8; i++) {
  1897    if ((dz<0) || (h1<0) || (bl1<0) || (tl1<0) ||
  1908          :TGeoTrap(name, dz, theta, phi, h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2)
  1920    for (i=0; i<4; i++) {
  1929    for (i=4; i<8; i++) {
  1936    if ((dz<0) || (h1<0) || (bl1<0) || (tl1<0) ||
  1953    if (iact<3 && safe) {
  1968    if (iact<3 && safe) {
  1986       Error(
"GetMakeRuntimeShape", 
"invalid mother");
  1990    if (
fDz<0) dz=((TGeoTrap*)mother)->GetDz();
  1993       h1 = ((TGeoTrap*)mother)->GetH1();
  1997       h2 = ((TGeoTrap*)mother)->GetH2();
  2001       bl1 = ((TGeoTrap*)mother)->GetBl1();
  2005       bl2 = ((TGeoTrap*)mother)->GetBl2();
  2009       tl1 = ((TGeoTrap*)mother)->GetTl1();
  2013       tl2 = ((TGeoTrap*)mother)->GetTl2();
  2016    return (
new TGeoGtra(dz, 
fTheta, 
fPhi, 
fTwistAngle ,h1, bl1, tl1, 
fAlpha1, h2, bl2, tl2, 
fAlpha2));
  2033    out << 
"   // Shape: " << 
GetName() << 
" type: " << 
ClassName() << std::endl;
  2034    out << 
"   dz     = " << 
fDz << 
";" << std::endl;
  2035    out << 
"   theta  = " << 
fTheta << 
";" << std::endl;
  2036    out << 
"   phi    = " << 
fPhi << 
";" << std::endl;
  2037    out << 
"   twist  = " << 
fTwistAngle << 
";" << std::endl;
  2038    out << 
"   h1     = " << 
fH1<< 
";" << std::endl;
  2039    out << 
"   bl1    = " << 
fBl1<< 
";" << std::endl;
  2040    out << 
"   tl1    = " << 
fTl1<< 
";" << std::endl;
  2041    out << 
"   alpha1 = " << 
fAlpha1 << 
";" << std::endl;
  2042    out << 
"   h2     = " << 
fH2 << 
";" << std::endl;
  2043    out << 
"   bl2    = " << 
fBl2<< 
";" << std::endl;
  2044    out << 
"   tl2    = " << 
fTl2<< 
";" << std::endl;
  2045    out << 
"   alpha2 = " << 
fAlpha2 << 
";" << std::endl;
  2046    out << 
"   TGeoShape *" << 
GetPointerName() << 
" = new TGeoGtra(\"" << 
GetName() << 
"\", dz,theta,phi,twist,h1,bl1,tl1,alpha1,h2,bl2,tl2,alpha2);" << std::endl;
  2079    for (i=0; i<4; i++) {
  2088    for (i=4; i<8; i++) {
  2105    for (
Int_t i=0; i<vecsize; i++) dists[i] = 
DistFromInside(&points[3*i], &dirs[3*i], 3, step[i]);
  2113    for (
Int_t i=0; i<vecsize; i++) dists[i] = 
DistFromOutside(&points[3*i], &dirs[3*i], 3, step[i]);
  2123    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. 
 
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
Computes distance from outside point to surface of the shape. 
 
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. 
 
double dist(Rotation3D const &r1, Rotation3D const &r2)
 
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
 
#define snext(osub1, osub2)
 
Long64_t LocMax(Long64_t n, const T *a)
 
static double p3(double t, double a, double b, double c, double d)
 
virtual ~TGeoGtra()
Destructor. 
 
void SetFinder(TGeoPatternFinder *finder)
 
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. 
 
virtual Double_t GetDX() const
 
void AddNodeOffset(TGeoVolume *vol, Int_t copy_no, Double_t offset=0, Option_t *option="")
Add a division node to the list of nodes. 
 
virtual void GetBoundingCylinder(Double_t *param) const
— Fill vector param[4] with the bounding cylinder parameters. 
 
Gtra is a twisted trapezoid. 
 
virtual Double_t Capacity() const
Computes capacity of the shape in [length^3]. 
 
Geometrical transformation package. 
 
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out". 
 
Bool_t TestBit(UInt_t f) const
 
virtual void SetName(const char *name)
Set the name of the TNamed. 
 
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. 
 
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes. 
 
void SetPlaneVertices(Double_t zpl, Double_t *vertices) const
Computes intersection points between plane at zpl and non-horizontal edges. 
 
virtual Bool_t Contains(const Double_t *point) const
Test if point is inside this shape. 
 
Buffer base class used for serializing objects. 
 
Short_t Min(Short_t a, Short_t b)
 
virtual Double_t GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const
Get shape range on a given axis. 
 
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 trapezoid. 
 
virtual void InspectShape() const
Prints shape parameters. 
 
TObject * At(Int_t idx) const
 
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 InspectShape() const
Prints shape parameters. 
 
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. 
 
static Double_t Tolerance()
 
virtual void Sizeof3D() const
Fill size of this 3-D object. 
 
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out". 
 
Int_t GetNdaughters() const
 
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...
 
Double_t GetTwist(Int_t iseg) const
Get twist for segment I in range [0,3]. 
 
static const double x2[5]
 
virtual const char * ClassName() const
Returns name of class to which the object belongs. 
 
void AddVolume(TGeoVolume *vol)
Add a volume with valid shape to the list of volumes. 
 
static double p2(double t, double a, double b, double c)
 
TGeoMedium * GetMedium() const
 
Double_t fXY[8][2]
[4] tangents of twist angles 
 
virtual void SetVertex(Int_t vnum, Double_t x, Double_t y)
Set values for a given vertex. 
 
TRAP is a general trapezoid, i.e. 
 
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 SetPoints(Double_t *points) const
Creates arb8 mesh points. 
 
virtual void ComputeBBox()
Computes bounding box for an Arb8 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=0) const
Compute distance from inside point to surface of the shape. 
 
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 ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize)
Compute the normal for an array o points so that norm.dot.dir is positive Input: Arrays of point coor...
 
virtual void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
Compute normal to closest surface from POINT. 
 
const char * GetPointerName() const
Provide a pointer name containing uid. 
 
Base finder class for patterns. 
 
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), D(x4,y4) 
 
virtual const char * GetName() const
Get the shape name. 
 
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 Bool_t GetPointsOnFacet(Int_t, Int_t, Double_t *) const
Fills array with n random points located on the surface of indexed facet. 
 
TNamed & operator=(const TNamed &rhs)
TNamed assignment operator. 
 
Base abstract class for all shapes. 
 
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. 
 
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 Sizeof3D() const
 
void ComputeTwist()
Computes tangents of twist angles (angles between projections on XY plane of corresponding -dz +dz ed...
 
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message. 
 
virtual const Double_t * GetOrigin() const
 
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out". 
 
static Bool_t IsSamePoint(const Double_t *p1, const Double_t *p2)
 
static double p1(double t, double a, double b)
 
virtual Double_t GetDY() const
 
void SetDivIndex(Int_t index)
 
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 trapezoid. 
 
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 
 
virtual Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const
Computes the closest distance from given point to this 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 Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
 
Bool_t IsRotation() 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 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...
 
static const double x1[5]
 
R__EXTERN TGeoManager * gGeoManager
 
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 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. 
 
Bool_t TestShapeBit(UInt_t f) const
 
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. 
 
Node containing an offset. 
 
An arbitrary trapezoid with less than 8 vertices standing on. 
 
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. 
 
void SetShapeBit(UInt_t f, Bool_t set)
Equivalent of TObject::SetBit. 
 
virtual ~TGeoArb8()
Destructor. 
 
Double_t DistToPlane(const Double_t *point, const Double_t *dir, Int_t ipl, Bool_t in) const
Computes distance to plane ipl : 
 
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...
 
Short_t Max(Short_t a, Short_t b)
 
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
 
virtual Bool_t Contains(const Double_t *point) const
Test if point is inside this shape. 
 
TGeoArb8 & operator=(const TGeoArb8 &)
assignment operator 
 
Double_t Sqrt(Double_t x)
 
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message. 
 
virtual void SetDimensions(Double_t *param)
Set all arb8 params in one step. 
 
virtual void SetDimensions(Double_t *param)
Set all arb8 params in one step. 
 
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...
 
Long64_t LocMin(Long64_t n, const T *a)
 
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...
 
double norm(double *x, double *p)
 
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 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 inside point to surface of the shape. 
 
virtual void SetDimensions(Double_t *param)
Set all arb8 params in one step. 
 
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 shape. 
 
virtual Double_t GetDZ() const
 
Bool_t IsRunTimeShape() const
 
const char * Data() 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...