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++) {
173 SetDimensions(param);
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);
474 Int_t *iph = td.fIntBuffer;
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);
1261 Int_t *iph = td.fIntBuffer;
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)
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++) {
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)
2070 out <<
" phi1 = " <<
fPhi1 <<
";" << std::endl;
2071 out <<
" dphi = " <<
fDphi <<
";" << std::endl;
2072 out <<
" nedges = " <<
fNedges <<
";" << std::endl;
2073 out <<
" nz = " <<
fNz <<
";" << std::endl;
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)) {
2264 if (!buffer.fLocalFrame) {
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.
void FillBuffer3D(TBuffer3D &buffer, Int_t reqSections, Bool_t localFrame) const override
Fill 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
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)
void InspectShape() const override
virtual void DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax)
Bool_t HasInsideSurface() const
void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const override
TBuffer3D * MakeBuffer3D() const override
void SetPoints(Double_t *points) const override
Bool_t Contains(const Double_t *point) const override
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
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
void CreateThreadData(Int_t nthreads) override
void Sizeof3D() const override
Int_t GetNmeshVertices() const override
void GetBoundingCylinder(Double_t *param) const override
void DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
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
void InspectShape() const override
void LocatePhi(const Double_t *point, Int_t &ipsec) const
std::mutex fMutex
Size for the navigation data array.
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) override
TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step) override
std::vector< ThreadData_t * > fThreadData
void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const override
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
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
Double_t Capacity() const override
Double_t Rpg(Double_t z, Int_t ipl, Bool_t inner, Double_t &a, Double_t &b) const
void SetDimensions(Double_t *param) override
void SetSegsAndPolsNoInside(TBuffer3D &buff) const
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
void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const override
void DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const override
Stub implementation to avoid forcing implementation at this stage.
ThreadData_t & GetThreadData() const
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
void ComputeBBox() override
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
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
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
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
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
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Computes distance from point (px,py) to the object.
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)
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
double dist(Rotation3D const &r1, Rotation3D const &r2)
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 E()
Base of natural log: .
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