97 std::lock_guard<std::mutex> guard(
fMutex);
98 std::vector<ThreadData_t *>::iterator i =
fThreadData.begin();
114 std::lock_guard<std::mutex> guard(
fMutex);
117 for (
Int_t tid = 0; tid < nthreads; tid++) {
193 Double_t rmin1, rmax1, rmin2, rmax2, dphi, dz;
197 for (ipl = 0; ipl <
fNz - 1; ipl++) {
198 dz =
fZ[ipl + 1] -
fZ[ipl];
203 rmin2 =
fRmin[ipl + 1];
204 rmax2 =
fRmax[ipl + 1];
205 capacity +=
fNedges * (tphi2 / 3.) * dz *
206 (rmax1 * rmax1 + rmax1 * rmax2 + rmax2 * rmax2 - rmin1 * rmin1 - rmin1 * rmin2 - rmin2 * rmin2);
217 for (
Int_t isec = 0; isec <
fNz - 1; isec++) {
218 if (
fZ[isec] >
fZ[isec + 1]) {
220 Fatal(
"ComputeBBox",
"Wrong section order");
227 Fatal(
"ComputeBBox",
"Shape %s at index %d: Not allowed first two or last two sections at same Z",
GetName(),
280 fOrigin[2] = 0.5 * (zmax + zmin);
283 fDZ = 0.5 * (zmax - zmin);
292 memset(norm, 0, 3 *
sizeof(
Double_t));
314 if (ipl == (
fNz - 1) || ipl < 0) {
319 Int_t iplclose = ipl;
320 if ((
fZ[ipl + 1] - point[2]) < (point[2] -
fZ[ipl]))
335 if (iplclose == 0 || iplclose == (
fNz - 1)) {
355 dz =
fZ[ipl + 1] -
fZ[ipl];
357 rmin2 =
fRmin[ipl + 1];
358 rsum = rmin1 + rmin2;
361 ta = (rmin2 - rmin1) / dz;
363 rpgon = rmin1 + (point[2] -
fZ[ipl]) * ta;
367 norm[2] = -calf * ta;
371 rpgon =
fRmax[ipl] + (point[2] -
fZ[ipl]) * ta;
375 norm[2] = -calf * ta;
377 if (norm[0] * dir[0] + norm[1] * dir[1] + norm[2] * dir[2] < 0) {
390 if (point[2] <
fZ[0])
392 if (point[2] >
fZ[
fNz - 1])
448 if (iact < 3 && safe) {
452 if (iact == 1 && step < *safe)
458 if (ipl ==
fNz - 1) {
471 ((
TGeoPgon *)
this)->CreateThreadData(1);
481 if ((point[0] * dir[1] - point[1] * dir[0]) > 0) {
522 Double_t rproj = point[0] * cphi + point[1] * sphi;
525 if (rproj >
fRmin[ipln] && rproj <
fRmin[ipln + 1])
527 if (rproj <
fRmax[ipln] && rproj >
fRmax[ipln + 1])
531 if (rproj <
fRmin[ipln] && rproj >
fRmin[ipln + 1])
533 if (rproj >
fRmax[ipln] && rproj <
fRmax[ipln + 1])
548 if (
SliceCrossingIn(point, dir, ipl, icrossed, iph, sph, snext, stepmax))
585 Double_t rdotn = point[0] * dir[0] + point[1] * dir[1];
591 sphi[0] =
TMath::Sqrt((point[0] * point[0] + point[1] * point[1]) / (1. - dir[2] * dir[2]));
593 if (sphi[0] > stepmax) {
610 ist = (incsec > 0) ? 0 :
fNedges;
612 ist = (incsec > 0) ? (istart + 1) : istart;
620 phi = phi1 + ist * divphi;
625 sphi[icrossed] = stepmax;
626 iphi[icrossed++] = istart;
628 if (sphi[icrossed - 1] > stepmax) {
629 sphi[icrossed - 1] = stepmax;
633 istart = (incsec > 0) ? 0 : (
fNedges - 1);
637 istart = (
fDphi < 360.) ? (-1) : 0;
644 ist = (incsec > 0) ? 0 :
fNedges;
646 ist = (incsec > 0) ? (istart + 1) : istart;
666 if (iphi[0] < 0 && nphi == 1)
670 if (ipl < 0 || ipl ==
fNz - 1)
684 rmin =
Rpg(point[2], ipl,
kTRUE, apg, bpg);
685 rmax =
Rpg(point[2], ipl,
kFALSE, apg, bpg);
696 for (iphcrt = 0; iphcrt < nphi; iphcrt++) {
697 if (step > stepmax) {
701 if (iphi[iphcrt] < 0) {
706 snextphi = stepphi[iphcrt];
707 phi = phi1 + (iphi[iphcrt] + 0.5) * divphi;
710 rproj =
pt[0] * cosph +
pt[1] * sinph;
712 ndot = dir[0] * cosph + dir[1] * sinph;
714 dist = (ndot > 0) ? ((rmax - rproj) / ndot) : ((rmin - rproj) / ndot);
718 if (dist < (snextphi - step)) {
725 for (i = 0; i < 3; i++)
726 pt[i] = point[i] + step * dir[i];
744 if (iphi[0] < 0 && nphi == 1)
748 if (ipl < 0 || ipl ==
fNz - 1)
762 rmin =
Rpg(point[2], ipl,
kTRUE, apg, bpg);
763 rmax =
Rpg(point[2], ipl,
kFALSE, apg, bpg);
774 for (iphcrt = 0; iphcrt < nphi; iphcrt++) {
777 snextphi = stepphi[iphcrt];
778 if (iphi[iphcrt] < 0) {
779 if (iphcrt == nphi - 1)
781 if (snextphi > stepmax)
783 for (i = 0; i < 3; i++)
784 pt[i] = point[i] + snextphi * dir[i];
785 phi = phi1 + (iphi[iphcrt + 1] + 0.5) * divphi;
788 rproj =
pt[0] * cosph +
pt[1] * sinph;
789 if (rproj < rmin || rproj > rmax) {
797 phi = phi1 + (iphi[iphcrt] + 0.5) * divphi;
800 rproj =
pt[0] * cosph +
pt[1] * sinph;
802 ndot = dir[0] * cosph + dir[1] * sinph;
814 for (i = 0; i < 3; i++)
815 pt[i] = point[i] + step * dir[i];
846 Int_t incseg = (dir[2] > 0) ? 1 : -1;
848 Int_t iplstart = ipl;
851 Double_t rpg = 0, rnew = 0, znew = 0;
852 Double_t rpgin = 0, rpgout = 0, apgin = 0, apgout = 0, bpgin = 0, bpgout = 0;
857 Double_t distz = 0, distr = 0, din = 0, dout = 0;
860 for (iphcrt = iphstart; iphcrt < nphi; iphcrt++) {
862 if (step > stepmax) {
866 if (iphi[iphcrt] < 0) {
870 snextphi = stepphi[iphcrt];
871 phi = phi1 + (iphi[iphcrt] + 0.5) * divphi;
876 while (ipl >= 0 && ipl <
fNz - 1) {
879 distz = (
fZ[ipl + ((1 + incseg) >> 1)] -
pt[2]) * invdir;
881 dz =
fZ[ipl + 1] -
fZ[ipl];
883 rnew = apr + bpr *
fZ[ipl];
884 rpg = (rnew -
fRmin[ipl]) * (rnew -
fRmin[ipl + 1]);
887 rpg = (rnew -
fRmax[ipl]) * (rnew -
fRmax[ipl + 1]);
895 znew = (apr - apgin) / db;
896 din = (znew -
pt[2]) * invdir;
901 znew = (apr - apgout) / db;
902 dout = (znew -
pt[2]) * invdir;
908 if (iphcrt == iphstart && ipl == iplstart) {
909 if (rproj < rpgin + 1.E-8) {
910 Double_t ndotd = dir[0] * cosph + dir[1] * sinph + dir[2] * (
fRmin[ipl] -
fRmin[ipl + 1]) / dz;
912 snext = (din < 0) ? step : (step + din);
921 }
else if (rproj > rpgout - 1.E-8) {
922 Double_t ndotd = dir[0] * cosph + dir[1] * sinph + dir[2] * (
fRmax[ipl] -
fRmax[ipl + 1]) / dz;
924 snext = (dout < 0) ? step : (step + dout);
938 if (snextphi < step +
TMath::Min(distz, distr)) {
939 for (i = 0; i < 3; i++)
940 pt[i] = point[i] + snextphi * dir[i];
952 if ((ipl + incseg < 0) || (ipl + incseg >
fNz - 2)) {
976 if (iphi[0] < 0 && nphi == 1)
982 Int_t incseg = (dir[2] > 0) ? 1 : -1;
989 if (ipl ==
fNz - 1) {
996 if ((ipl + incseg) < 0 || (ipl + incseg) >
fNz - 1)
1019 for (iphcrt = 0; iphcrt < nphi; iphcrt++) {
1024 snextphi = stepphi[iphcrt];
1025 if (iphi[iphcrt] < 0) {
1026 if (iphcrt == nphi - 1)
1028 if (snextphi > stepmax)
1030 for (i = 0; i < 3; i++)
1031 pt[i] = point[i] + snextphi * dir[i];
1035 while (
pt[2] >
fZ[ipl + 1]) {
1041 while (
pt[2] <
fZ[ipl]) {
1050 phi = phi1 + (iphi[iphcrt + 1] + 0.5) * divphi;
1054 rproj =
pt[0] * cosph +
pt[1] * sinph;
1055 if (rproj < rpgin || rproj > rpgout) {
1075 if (ipl < 0 || ipl >
fNz - 2)
1077 if (sstart > stepmax)
1082 for (
Int_t i = 0; i < 3; i++)
1083 pt[i] += sstart * dir[i];
1086 Int_t incseg = (dir[2] > 0) ? 1 : -1;
1094 Rproj(
pt[2], point, dir, cphi, sphi, apr, bpr);
1097 Int_t icrtseg = ipl;
1098 Int_t isegstart = ipl;
1099 Int_t iseglast = (incseg > 0) ? (
fNz - 1) : -1;
1100 Double_t din, dout, rdot, rnew, apg, bpg, db, znew;
1102 for (ipl = isegstart; ipl != iseglast; ipl += incseg) {
1103 step = (
fZ[ipl + 1 - ((1 + incseg) >> 1)] -
pt[2]) * invdir;
1105 if (step > stepmax) {
1112 dz =
fZ[ipl + 1] -
fZ[ipl];
1118 rdot = dir[0] * cphi + dir[1] * sphi + dir[2] * (
fRmin[ipl] -
fRmin[ipl + 1]) / dz;
1123 rnew = apr + bpr *
fZ[ipl];
1126 din = (
fZ[ipl] -
pt[2]) * invdir;
1131 znew = (apr - apg) / db;
1132 if (znew >
fZ[ipl] && znew <
fZ[ipl + 1]) {
1133 din = (znew -
pt[2]) * invdir;
1145 rdot = dir[0] * cphi + dir[1] * sphi + dir[2] * (
fRmax[ipl] -
fRmax[ipl + 1]) / dz;
1150 rnew = apr + bpr *
fZ[ipl];
1153 dout = (
fZ[ipl] -
pt[2]) * invdir;
1158 znew = (apr - apg) / db;
1159 if (znew >
fZ[ipl] && znew <
fZ[ipl + 1])
1160 dout = (znew -
pt[2]) * invdir;
1170 if (step > stepmax) {
1174 snext = sstart + step;
1188 if (iact < 3 && safe) {
1192 if (iact == 1 && step < *safe)
1221 if (r2 > (radmax * radmax) ||
pt[2] <
fZ[0] ||
pt[2] >
fZ[
fNz - 1]) {
1226 if (snext > stepmax)
1230 for (i = 0; i < 3; i++)
1231 pt[i] += snext * dir[i];
1249 ipsec =
Int_t(ddp / divphi);
1252 if (rpr >= rmin && rpr <= rmax)
1258 ((
TGeoPgon *)
this)->CreateThreadData(1);
1269 return (snext + snewcross);
1283 if (
fDphi < 360.0) {
1305 if (rproj <
fRmin[ipl] && rproj >
fRmin[ipl + 1] && dir[2] > 0)
1307 if (rproj >
fRmin[ipl] && rproj <
fRmin[ipl + 1] && dir[2] < 0)
1309 if (rproj >
fRmax[ipl] && rproj <
fRmax[ipl + 1] && dir[2] > 0)
1311 if (rproj <
fRmax[ipl] && rproj >
fRmax[ipl + 1] && dir[2] < 0)
1318 if (rproj < rpgout + 1.E-8) {
1321 if (rproj > rpgin - 1.E-8) {
1333 if (safrmin < safz && safrmin < safrmax && safrmin < safphi) {
1335 Double_t ndotd = dir[0] * cphi + dir[1] * sphi + dir[2] * (
fRmin[ipl] -
fRmin[ipl + 1]) * dzinv;
1341 if (!done && safrmax < safz && safrmax < safphi) {
1342 Double_t ndotd = dir[0] * cphi + dir[1] * sphi + dir[2] * (
fRmax[ipl] -
fRmax[ipl + 1]) * dzinv;
1348 if (!done && safz < safphi) {
1353 if (iplc == 0 || iplc ==
fNz - 1) {
1354 if (
pt[2] * dir[2] < 0)
1360 if (rproj <
fRmin[iplc] && rproj >
fRmin[iplc + 1])
1362 if (rproj >
fRmax[iplc] && rproj <
fRmax[iplc + 1])
1365 if (rproj >
fRmin[iplc] && rproj <
fRmin[iplc + 1])
1367 if (rproj <
fRmax[iplc] && rproj >
fRmax[iplc + 1])
1372 if (rproj <
fRmin[iplc - 1] && rproj >
fRmin[iplc])
1374 if (rproj >
fRmax[iplc - 1] && rproj <
fRmax[iplc])
1377 if (rproj >
fRmin[iplc - 1] && rproj <
fRmin[iplc])
1379 if (rproj <
fRmax[iplc - 1] && rproj >
fRmax[iplc])
1398 return (snext + sph[0]);
1399 if (iph[0] >= 0 && sph[0] > 1.E-8)
1440 Double_t zmax = start + ndiv * step;
1445 Error(
"Divide",
"makes no sense dividing a pgon on radius");
1449 Error(
"Divide",
"ndiv should divide number of pgon edges");
1457 shape =
new TGeoPgon(-step / 2, step, nedges,
fNz);
1460 for (is = 0; is <
fNz; is++)
1463 for (
id = 0;
id < ndiv;
id++) {
1470 for (ipl = 0; ipl <
fNz - 1; ipl++) {
1471 if (start <
fZ[ipl])
1474 if ((start + ndiv * step) >
fZ[ipl + 1])
1479 zmax =
fZ[isect + 1];
1483 Error(
"Divide",
"cannot divide pcon on Z if divided region is not between 2 consecutive planes");
1486 finder =
new TGeoPatternZ(voldiv, ndiv, start, start + ndiv * step);
1491 for (
id = 0;
id < ndiv;
id++) {
1493 Double_t z2 = start + (
id + 1) * step;
1494 Double_t rmin1 = (
fRmin[isect] * (zmax - z1) -
fRmin[isect + 1] * (zmin - z1)) / (zmax - zmin);
1495 Double_t rmax1 = (
fRmax[isect] * (zmax - z1) -
fRmax[isect + 1] * (zmin - z1)) / (zmax - zmin);
1496 Double_t rmin2 = (
fRmin[isect] * (zmax - z2) -
fRmin[isect + 1] * (zmin - z2)) / (zmax - zmin);
1497 Double_t rmax2 = (
fRmax[isect] * (zmax - z2) -
fRmax[isect + 1] * (zmin - z2)) / (zmax - zmin);
1499 ((
TGeoPgon *)shape)->DefineSection(0, -step / 2, rmin1, rmax1);
1500 ((
TGeoPgon *)shape)->DefineSection(1, step / 2, rmin2, rmax2);
1507 default:
Error(
"Divide",
"Wrong axis type for division");
return nullptr;
1517 param[0] =
fRmin[0];
1518 param[1] =
fRmax[0];
1520 if (
fRmin[i] < param[0])
1521 param[0] =
fRmin[i];
1522 if (
fRmax[i] > param[1])
1523 param[1] =
fRmax[i];
1527 param[0] *= param[0];
1528 param[1] *= param[1];
1535 param[3] = param[2] +
fDphi;
1543 printf(
"*** Shape %s: TGeoPgon ***\n",
GetName());
1544 printf(
" Nedges = %i\n",
fNedges);
1554 Int_t nbPnts, nbSegs, nbPols;
1585 Int_t nbPnts = nz * 2 *
n;
1593 Int_t indx = 0, indx2, k;
1597 for (i = 0; i < nz * 2; i++) {
1599 for (j = 1; j <
n; j++) {
1601 buff.
fSegs[indx++] = indx2 + j - 1;
1602 buff.
fSegs[indx++] = indx2 + j;
1606 buff.
fSegs[indx++] = indx2 + j - 1;
1607 buff.
fSegs[indx++] = indx2;
1612 for (i = 0; i < 2; i++) {
1613 indx2 = i * (nz - 1) * 2 *
n;
1614 for (j = 0; j <
n; j++) {
1616 buff.
fSegs[indx++] = indx2 + j;
1617 buff.
fSegs[indx++] = indx2 +
n + j;
1622 for (i = 0; i < (nz - 1); i++) {
1625 for (j = 0; j <
n; j++) {
1626 buff.
fSegs[indx++] =
c + 2;
1627 buff.
fSegs[indx++] = indx2 + j;
1628 buff.
fSegs[indx++] = indx2 +
n * 2 + j;
1631 indx2 = i *
n * 2 +
n;
1632 for (j = 0; j <
n; j++) {
1633 buff.
fSegs[indx++] =
c + 3;
1634 buff.
fSegs[indx++] = indx2 + j;
1635 buff.
fSegs[indx++] = indx2 +
n * 2 + j;
1642 for (i = 1; i < (nz - 1); i++) {
1643 for (j = 0; j < 2; j++) {
1645 buff.
fSegs[indx++] = 2 * i *
n + j * (
n - 1);
1646 buff.
fSegs[indx++] = (2 * i + 1) *
n + j * (
n - 1);
1651 Int_t m =
n - 1 + (specialCase ? 1 : 0);
1657 for (j = 0; j <
n - 1; j++) {
1658 buff.
fPols[indx++] =
c + 3;
1659 buff.
fPols[indx++] = 4;
1660 buff.
fPols[indx++] = 2 * nz *
m + i *
n + j;
1661 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m +
m + j;
1662 buff.
fPols[indx++] = 2 * nz *
m + i *
n + j + 1;
1663 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m + j;
1666 buff.
fPols[indx++] =
c + 3;
1667 buff.
fPols[indx++] = 4;
1668 buff.
fPols[indx++] = 2 * nz *
m + i *
n + j;
1669 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m +
m + j;
1670 buff.
fPols[indx++] = 2 * nz *
m + i *
n;
1671 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m + j;
1674 for (j = 0; j <
n - 1; j++) {
1675 buff.
fPols[indx++] =
c + 3;
1676 buff.
fPols[indx++] = 4;
1677 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m + j;
1678 buff.
fPols[indx++] = 2 * nz *
m + i *
n + j + 1;
1679 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m +
m + j;
1680 buff.
fPols[indx++] = 2 * nz *
m + i *
n + j;
1683 buff.
fPols[indx++] =
c + 3;
1684 buff.
fPols[indx++] = 4;
1685 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m + j;
1686 buff.
fPols[indx++] = 2 * nz *
m + i *
n;
1687 buff.
fPols[indx++] = i * (nz * 2 - 2) *
m +
m + j;
1688 buff.
fPols[indx++] = 2 * nz *
m + i *
n + j;
1692 for (k = 0; k < (nz - 1); k++) {
1694 for (j = 0; j <
n - 1; j++) {
1695 buff.
fPols[indx++] =
c + i;
1696 buff.
fPols[indx++] = 4;
1697 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n + j + 1;
1698 buff.
fPols[indx++] = (2 * k + i * 1 + 2) *
m + j;
1699 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n + j;
1700 buff.
fPols[indx++] = (2 * k + i * 1) *
m + j;
1703 buff.
fPols[indx++] =
c + i;
1704 buff.
fPols[indx++] = 4;
1705 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n;
1706 buff.
fPols[indx++] = (2 * k + i * 1 + 2) *
m + j;
1707 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n + j;
1708 buff.
fPols[indx++] = (2 * k + i * 1) *
m + j;
1711 for (j = 0; j <
n - 1; j++) {
1712 buff.
fPols[indx++] =
c + i;
1713 buff.
fPols[indx++] = 4;
1714 buff.
fPols[indx++] = (2 * k + i * 1) *
m + j;
1715 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n + j;
1716 buff.
fPols[indx++] = (2 * k + i * 1 + 2) *
m + j;
1717 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n + j + 1;
1720 buff.
fPols[indx++] =
c + i;
1721 buff.
fPols[indx++] = 4;
1722 buff.
fPols[indx++] = (2 * k + i * 1) *
m + j;
1723 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n + j;
1724 buff.
fPols[indx++] = (2 * k + i * 1 + 2) *
m + j;
1725 buff.
fPols[indx++] = nz * 2 *
m + (2 * k + i * 1 + 2) *
n;
1732 indx2 = nz * 2 * (
n - 1);
1733 for (k = 0; k < (nz - 1); k++) {
1734 buff.
fPols[indx++] =
c + 2;
1735 buff.
fPols[indx++] = 4;
1736 buff.
fPols[indx++] = k == 0 ? indx2 : indx2 + 2 * nz *
n + 2 * (k - 1);
1737 buff.
fPols[indx++] = indx2 + 2 * (k + 1) *
n;
1738 buff.
fPols[indx++] = indx2 + 2 * nz *
n + 2 * k;
1739 buff.
fPols[indx++] = indx2 + (2 * k + 3) *
n;
1741 buff.
fPols[indx++] =
c + 2;
1742 buff.
fPols[indx++] = 4;
1743 buff.
fPols[indx++] = k == 0 ? indx2 +
n - 1 : indx2 + 2 * nz *
n + 2 * (k - 1) + 1;
1744 buff.
fPols[indx++] = indx2 + (2 * k + 3) *
n +
n - 1;
1745 buff.
fPols[indx++] = indx2 + 2 * nz *
n + 2 * k + 1;
1746 buff.
fPols[indx++] = indx2 + 2 * (k + 1) *
n +
n - 1;
1748 buff.
fPols[indx - 8] = indx2 +
n;
1749 buff.
fPols[indx - 2] = indx2 + 2 *
n - 1;
1760 const Int_t nbPnts = nz *
n + 2;
1762 if ((nz < 2) || (nbPnts <= 0) || (
n < 2))
1767 Int_t indx = 0, indx1 = 0, indx2 = 0, i, j;
1770 for (i = 0; i < nz; i++) {
1772 for (j = 1; j <
n; j++) {
1774 buff.
fSegs[indx++] = indx2 + j - 1;
1775 buff.
fSegs[indx++] = indx2 + j % (
n - 1);
1781 for (j = 0; j <
n; j++) {
1783 buff.
fSegs[indx++] = indx2 + j % (
n - 1);
1784 buff.
fSegs[indx++] = nbPnts - 2;
1787 indx2 = (nz - 1) *
n;
1789 for (j = 0; j <
n; j++) {
1791 buff.
fSegs[indx++] = indx2 + j % (
n - 1);
1792 buff.
fSegs[indx++] = nbPnts - 1;
1796 for (i = 0; i < (nz - 1); i++) {
1799 for (j = 0; j <
n; j++) {
1801 buff.
fSegs[indx++] = indx2 + j % (
n - 1);
1802 buff.
fSegs[indx++] = indx2 +
n + j % (
n - 1);
1810 indx2 = nz * (
n - 1);
1811 for (j = 0; j <
n - 1; j++) {
1813 buff.
fPols[indx++] = 3;
1814 buff.
fPols[indx++] = indx1 + j;
1815 buff.
fPols[indx++] = indx2 + (j + 1) % (
n - 1);
1816 buff.
fPols[indx++] = indx2 + j;
1820 indx1 = (nz - 1) * (
n - 1);
1821 indx2 = nz * (
n - 1) +
n;
1822 for (j = 0; j <
n - 1; j++) {
1824 buff.
fPols[indx++] = 3;
1825 buff.
fPols[indx++] = indx1 + j;
1826 buff.
fPols[indx++] = indx2 + j;
1827 buff.
fPols[indx++] = indx2 + (j + 1) % (
n - 1);
1831 for (
Int_t k = 0; k < (nz - 1); k++) {
1832 indx1 = k * (
n - 1);
1833 indx2 = nz * (
n - 1) +
n * 2 + k *
n;
1834 for (j = 0; j <
n - 1; j++) {
1836 buff.
fPols[indx++] = 4;
1837 buff.
fPols[indx++] = indx1 + j;
1838 buff.
fPols[indx++] = indx2 + j;
1839 buff.
fPols[indx++] = indx1 + j + (
n - 1);
1840 buff.
fPols[indx++] = indx2 + (j + 1) % (
n - 1);
1855 if (ipl < 0 || ipl >
fNz - 2) {
1856 Fatal(
"Rpg",
"Plane index parameter ipl=%i out of range\n", ipl);
1870 r2 =
fRmin[ipl + 1];
1873 r2 =
fRmax[ipl + 1];
1876 a = (r1 *
fZ[ipl + 1] - r2 *
fZ[ipl]) * dzinv;
1877 b = (r2 - r1) * dzinv;
1894 a = ((point[0] * dir[2] - point[2] * dir[0]) * cphi + (point[1] * dir[2] - point[2] * dir[1]) * sphi) * invdirz;
1895 b = (dir[0] * cphi + dir[1] * sphi) * invdirz;
1909 if (ipl < 0 || ipl >
fNz - 2)
1910 return (safmin + 1.);
1915 Double_t znew = point[2] - 0.5 * (
fZ[ipl] +
fZ[ipl + 1]);
1917 if (-saf[0] > safmin)
1928 r =
TMath::Sqrt(point[0] * point[0] + point[1] * point[1]);
1929 Double_t ro1 = 0.5 * (rmin1 + rmin2);
1930 Double_t tg1 = (rmin2 - rmin1) / dz;
1932 Double_t ro2 = 0.5 * (rmax1 + rmax2);
1933 Double_t tg2 = (rmax2 - rmax1) / dz;
1938 saf[2] = (rout -
r) * cr2;
1939 for (i = 0; i < 3; i++)
1949 if (rmin1 + rmin2 > 1E-10) {
1950 ta = (rmin2 - rmin1) / dz;
1952 rpgon = rmin1 + (point[2] -
fZ[ipl]) * ta;
1953 saf[1] = (
r - rpgon) * calf;
1957 ta = (rmax2 - rmax1) / dz;
1959 rpgon = rmax1 + (point[2] -
fZ[ipl]) * ta;
1960 saf[2] = (rpgon -
r) * calf;
1965 for (i = 0; i < 3; i++)
1983 Int_t ipl, iplane, iphi;
1989 if (ipl == (
fNz - 1))
1993 dz = 0.5 * (
fZ[ipl + 1] -
fZ[ipl]);
1998 if (safmin > 1E10) {
2007 while ((iplane <
fNz - 1) && saftmp < 1E10) {
2009 if (saftmp < safmin)
2016 while ((iplane >= 0) && saftmp < 1E10) {
2018 if (saftmp < safmin)
2028 else if (ipl ==
fNz - 1)
2030 dz = 0.5 * (
fZ[ipl + 1] -
fZ[ipl]);
2035 dz = 0.5 * (
fZ[ipl + 1] -
fZ[ipl]);
2044 while ((iplane <
fNz - 1) && saftmp < 1E10) {
2046 if (saftmp < safmin)
2053 while ((iplane >= 0) && saftmp < 1E10) {
2055 if (saftmp < safmin)
2069 out <<
" // Shape: " <<
GetName() <<
" type: " <<
ClassName() << std::endl;
2070 out <<
" phi1 = " <<
fPhi1 <<
";" << std::endl;
2071 out <<
" dphi = " <<
fDphi <<
";" << std::endl;
2072 out <<
" nedges = " <<
fNedges <<
";" << std::endl;
2073 out <<
" nz = " <<
fNz <<
";" << std::endl;
2074 out <<
" auto " <<
GetPointerName() <<
" = new TGeoPgon(\"" <<
GetName() <<
"\", phi1, dphi, nedges, nz);"
2077 out <<
" z = " <<
fZ[i] <<
";" << std::endl;
2078 out <<
" rmin = " <<
fRmin[i] <<
";" << std::endl;
2079 out <<
" rmax = " <<
fRmax[i] <<
";" << std::endl;
2080 out <<
" " <<
GetPointerName() <<
"->DefineSection(" << i <<
", z, rmin, rmax);" << std::endl;
2095 Error(
"SetDimensions",
"Pgon %s: Number of Z sections must be > 2",
GetName());
2111 DefineSection(i, param[4 + 3 * i], param[5 + 3 * i], param[6 + 3 * i]);
2129 for (i = 0; i <
GetNz(); i++) {
2131 for (j = 0; j <
n; j++) {
2137 for (j = 0; j <
n; j++) {
2172 for (i = 0; i <
fNz; i++) {
2174 for (j = 0; j <
n; j++) {
2180 for (j = 0; j <
n; j++) {
2205 nvert = nsegs = npols = 0;
2216 nsegs = 4 * (nz *
n - 1 + (specialCase ? 1 : 0));
2217 npols = 2 * (nz *
n - 1 + (specialCase ? 1 : 0));
2220 nsegs = nz * (
n - 1) +
n * 2 + (nz - 1) *
n;
2221 npols = 2 * (
n - 1) + (nz - 1) * (
n - 1);
2230 Int_t nvert, nsegs, npols;
2252 Int_t nbPnts, nbSegs, nbPols;
2255 if (buffer.
SetRawSizes(nbPnts, 3 * nbPnts, nbSegs, 3 * nbSegs, nbPols, 6 * nbPols)) {
2282 for (
Int_t i = 0; i < vecsize; i++)
2293 for (
Int_t i = 0; i < vecsize; i++)
2303 for (
Int_t i = 0; i < vecsize; i++)
2313 for (
Int_t i = 0; i < vecsize; i++)
2324 for (
Int_t i = 0; i < vecsize; i++)
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
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.
void FillBuffer3D(TBuffer3D &buffer, Int_t reqSections, Bool_t localFrame) const override
Fills the supplied buffer, with sections in desired frame See TBuffer3D.h for explanation of sections...
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 override
Compute distance from outside point to surface of the box.
TGeoVolumeMulti * MakeVolumeMulti(const char *name, TGeoMedium *medium)
Make a TGeoVolumeMulti handling a list of volumes.
TObjArray * GetListOfShapes() const
static Int_t ThreadId()
Translates the current thread id to an ordinal number.
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.
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.
void InspectShape() const override
print shape parameters
Bool_t HasInsideSurface() const
Returns true when pgon has internal surface It will be only disabled when all Rmin values are 0.
Polygons are defined in the same way as polycones, the difference being just that the segments betwee...
void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const override
Compute safe distance from each of the points in the input array.
TBuffer3D * MakeBuffer3D() const override
Creates a TBuffer3D describing this shape.
void SetPoints(Double_t *points) const override
create polygone mesh points
Bool_t Contains(const Double_t *point) const override
test if point is inside this shape check total z range
Bool_t SliceCrossingInZ(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Performs ray propagation between Z segments.
~TGeoPgon() override
destructor
Bool_t SliceCrossing(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Check boundary crossing inside phi slices.
void CreateThreadData(Int_t nthreads) override
Create thread data for n threads max.
void Sizeof3D() const override
fill size of this 3-D object
Int_t GetNmeshVertices() const override
Return number of vertices of the mesh representation.
void GetBoundingCylinder(Double_t *param) const override
Fill vector param[4] with the bounding cylinder parameters.
void DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
Bool_t SliceCrossingZ(const Double_t *point, const Double_t *dir, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Performs ray propagation between Z segments.
void InspectShape() const override
Inspect the PGON parameters.
void LocatePhi(const Double_t *point, Int_t &ipsec) const
Locates index IPSEC of the phi sector containing POINT.
std::mutex fMutex
Size for the navigation data array.
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) override
Compute normal to closest surface from POINT.
TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step) override
Divide this polygone shape belonging to volume "voldiv" into ndiv volumes called divname,...
std::vector< ThreadData_t * > fThreadData
void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const override
Returns numbers of vertices, segments and polygons composing the shape mesh.
ThreadData_t & GetThreadData() const
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a primitive as a C++ statement(s) on output stream "out".
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
computes the closest distance from given point to this shape, according to option.
void ClearThreadData() const override
Double_t SafetyToSegment(const Double_t *point, Int_t ipl, Int_t iphi, Bool_t in, Double_t safphi, Double_t safmin=TGeoShape::Big()) const
Compute safety from POINT to segment between planes ipl, ipl+1 within safmin.
Double_t Capacity() const override
Computes capacity of the shape in [length^3].
Double_t Rpg(Double_t z, Int_t ipl, Bool_t inner, Double_t &a, Double_t &b) const
Computes projected pgon radius (inner or outer) corresponding to a given Z value.
void SetDimensions(Double_t *param) override
Set PGON dimensions starting from an array.
void SetSegsAndPolsNoInside(TBuffer3D &buff) const
Fill TBuffer3D structure for segments and polygons, when no inner surface exists.
Bool_t SliceCrossingIn(const Double_t *point, const Double_t *dir, Int_t ipl, Int_t nphi, Int_t *iphi, Double_t *sphi, Double_t &snext, Double_t stepmax) const
Check boundary crossing inside phi slices.
void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const override
Check the inside status for each of the points in the array.
void DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const override
Fills a static 3D buffer and returns a reference.
Int_t fThreadSize
Navigation data per thread.
void ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize) override
Compute the normal for an array o points so that norm.dot.dir is positive Input: Arrays of point coor...
void ComputeBBox() override
compute bounding box for a polygone Check if the sections are in increasing Z order
Double_t Rproj(Double_t z, const Double_t *point, const Double_t *dir, Double_t cphi, Double_t sphi, Double_t &a, Double_t &b) const
Computes projected distance at a given Z for a given ray inside a given sector and fills coefficients...
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 override
compute distance from inside point to surface of the polygone first find out in which Z section the p...
Bool_t IsCrossingSlice(const Double_t *point, const Double_t *dir, Int_t iphi, Double_t sstart, Int_t &ipl, Double_t &snext, Double_t stepmax) const
Check crossing of a given pgon slice, from a starting point inside the slice.
Int_t GetPhiCrossList(const Double_t *point, const Double_t *dir, Int_t istart, Double_t *sphi, Int_t *iphi, Double_t stepmax=TGeoShape::Big()) const
Mutex for thread data.
void SetSegsAndPols(TBuffer3D &buff) const override
Fill TBuffer3D structure for segments and polygons.
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 override
Compute distance from outside point to surface of the polygone.
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
compute closest distance from point px,py to each corner
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.
static void NormalPhi(const Double_t *point, const Double_t *dir, Double_t *norm, Double_t c1, Double_t s1, Double_t c2, Double_t s2)
Static method to compute normal to phi planes.
static Bool_t IsCrossingSemiplane(const Double_t *point, const Double_t *dir, Double_t cphi, Double_t sphi, Double_t &snext, Double_t &rxy)
Compute distance from POINT to semiplane defined by PHI angle along DIR.
const char * GetName() const override
Get the shape name.
static Double_t Tolerance()
static Bool_t IsCloseToPhi(Double_t epsil, const Double_t *point, Double_t c1, Double_t s1, Double_t c2, Double_t s2)
True if point is closer than epsil to one of the phi planes defined by c1,s1 or c2,...
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...
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.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
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.
Double_t Tan(Double_t)
Returns the tangent 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.
Double_t * fDblBuffer
[fNedges+4] temporary int buffer array
ThreadData_t()
[fNedges+4] temporary double buffer array
~ThreadData_t()
Destructor.