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)
constexpr Double_t DegToRad()
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...