72 vec2 Pmult1 = { P[3], P[4] };
73 vec2 Pmult2 = { P[5], P[42] };
74 vec2 Pmult3 = { P[43], P[44] };
77 vload(dXdL0_dYdL0, &P[7]);
79 vload(dZdL0_dAxdL0, &P[9]);
81 vload(dAydL0_dAzdL0, &P[11]);
82 dXdL0_dYdL0 -=
s0 * Pmult1;
83 dZdL0_dAxdL0 -=
s0 * Pmult2;
84 dAydL0_dAzdL0 -=
s0 * Pmult3;
85 vstore(&P[7], dXdL0_dYdL0);
86 vstore(&P[9], dZdL0_dAxdL0);
87 vstore(&P[11], dAydL0_dAzdL0);
90 vload(dXdL1_dYdL1, &P[14]);
92 vload(dZdL1_dAxdL1, &P[16]);
94 vload(dAydL1_dAzdL1, &P[18]);
95 dXdL1_dYdL1 -=
s1 * Pmult1;
96 dZdL1_dAxdL1 -=
s1 * Pmult2;
97 dAydL1_dAzdL1 -=
s1 * Pmult3;
98 vstore(&P[14], dXdL1_dYdL1);
99 vstore(&P[16], dZdL1_dAxdL1);
100 vstore(&P[18], dAydL1_dAzdL1);
103 vload(dXdPhi_dYdPhi, &P[21]);
105 vload(dZdPhi_dAxdPhi, &P[23]);
106 vec2 dAydPhi_dAzdPhi;
107 vload(dAydPhi_dAzdPhi, &P[25]);
108 dXdPhi_dYdPhi -=
s2 * Pmult1;
109 dZdPhi_dAxdPhi -=
s2 * Pmult2;
110 dAydPhi_dAzdPhi -=
s2 * Pmult3;
111 vstore(&P[21], dXdPhi_dYdPhi);
112 vstore(&P[23], dZdPhi_dAxdPhi);
113 vstore(&P[25], dAydPhi_dAzdPhi);
115 vec2 dXdTheta_dYdTheta;
116 vload(dXdTheta_dYdTheta, &P[28]);
117 vec2 dZdTheta_dAxdTheta;
118 vload(dZdTheta_dAxdTheta, &P[30]);
119 vec2 dAydTheta_dAzdTheta;
120 vload(dAydTheta_dAzdTheta, &P[32]);
121 dXdTheta_dYdTheta -=
s3 * Pmult1;
122 dZdTheta_dAxdTheta -=
s3 * Pmult2;
123 dAydTheta_dAzdTheta -=
s3 * Pmult3;
124 vstore(&P[28], dXdTheta_dYdTheta);
125 vstore(&P[30], dZdTheta_dAxdTheta);
126 vstore(&P[32], dAydTheta_dAzdTheta);
129 vload(dXdCM_dYdCM, &P[35]);
131 vload(dZdCM_dAxdCM, &P[37]);
133 vload(AydCM_dAzdCM, &P[39]);
134 dXdCM_dYdCM -=
s4 * Pmult1;
135 dZdCM_dAxdCM -=
s4 * Pmult2;
136 AydCM_dAzdCM -=
s4 * Pmult3;
137 vstore(&P[35], dXdCM_dYdCM);
138 vstore(&P[37], dZdCM_dAxdCM);
139 vstore(&P[39], AydCM_dAzdCM);
187 vec4 P0 = { P[0], P[7], P[14], P[21] };
188 vec4
res = V[0] * P0;
190 vec4 P1 = { P[1], P[8], P[15], P[22] };
193 vec4 P2 = { P[2], P[9], P[16], P[23] };
199 Jac[4] = V[0] * P[28] + V[1] * P[29] + V[2] * P[30];
209 const double* Ax =
T.matrix().col(0).data();
210 const double* Ay =
T.matrix().col(1).data();
212 const double d[3] = { P[0] -
T(0, 3), P[1] -
T(1, 3), P[2] -
T(2, 3) };
214 par[0] =
d[0] * Ax[0] +
d[1] * Ax[1] +
d[2] * Ax[2];
215 par[1] =
d[0] * Ay[0] +
d[1] * Ay[1] +
d[2] * Ay[2];
222 double S[3] = {
T(0, 2),
T(1, 2),
T(2, 2) };
224 double A = P[3] *
S[0] + P[4] *
S[1] + P[5] *
S[2];
232 mult3x5Helper(
s,
S, &P[7]);
233 globalToLocalVecHelper(P,
s[0],
s[1],
s[2],
s[3],
s[4]);
235 mult3x5Helper(&Jac[0], Ax, &P[7]);
236 mult3x5Helper(&Jac[5], Ay, &P[7]);
250 const double* Ax =
T.matrix().col(0).data();
251 const double* Ay =
T.matrix().col(1).data();
253 const double d[3] = { P[0] -
T(0, 3), P[1] -
T(1, 3), P[2] -
T(2, 3) };
255 const double RC =
d[0] * Ax[0] +
d[1] * Ax[1] +
d[2] * Ax[2];
256 const double RS =
d[0] * Ay[0] +
d[1] * Ay[1] +
d[2] * Ay[2];
257 const double R2 = RC * RC + RS * RS;
258 par[0] = std::sqrt(R2);
259 par[1] = atan2(RS, RC);
266 double S[3] = {
T(0, 2),
T(1, 2),
T(2, 2) };
268 double A = P[3] *
S[0] + P[4] *
S[1] + P[5] *
S[2];
276 mult3x5Helper(
s,
S, &P[7]);
277 globalToLocalVecHelper(P,
s[0],
s[1],
s[2],
s[3],
s[4]);
280 double Ri = 1. /
par[0];
282 const double Av[3] = { (RC * Ax[0] + RS * Ay[0]) * Ri,
283 (RC * Ax[1] + RS * Ay[1]) * Ri,
284 (RC * Ax[2] + RS * Ay[2]) * Ri };
285 const double Bv[3] = { (RC * Ay[0] - RS * Ax[0]) * (Ri = 1. / R2),
286 (RC * Ay[1] - RS * Ax[1]) * Ri,
287 (RC * Ay[2] - RS * Ax[2]) * Ri };
289 mult3x5Helper(&Jac[0], Av, &P[7]);
290 mult3x5Helper(&Jac[5], Bv, &P[7]);
304 const double* Ax =
T.matrix().col(0).data();
305 const double* Ay =
T.matrix().col(1).data();
306 const double* Az =
T.matrix().col(2).data();
308 double x = P[0] -
T(0, 3);
309 double y = P[1] -
T(1, 3);
310 double z = P[2] -
T(2, 3);
311 double RC =
x * Ax[0] +
y * Ax[1] +
z * Ax[2];
312 double RS =
x * Ay[0] +
y * Ay[1] +
z * Ay[2];
313 par[0] = atan2(RS, RC) *
R;
314 par[1] =
x * Az[0] +
y * Az[1] +
z * Az[2];
322 double C = P[3] * Az[0] + P[4] * Az[1] + P[5] * Az[2];
323 const double ax = P[3] - Az[0] *
C;
325 const double ay = P[4] - Az[1] *
C;
327 const double az = P[5] - Az[2] *
C;
329 double A = (
ax *
x +
ay *
y + az *
z);
336 const double S[3] = {
x,
y,
z };
338 mult3x5Helper(
s,
S, &P[7]);
339 globalToLocalVecHelper(P,
s[0],
s[1],
s[2],
s[3],
s[4]);
342 const double Av[3] = { (RC * Ay[0] - RS * Ax[0]) * (
R = 1. /
R),
343 (RC * Ay[1] - RS * Ax[1]) *
R,
344 (RC * Ay[2] - RS * Ax[2]) *
R };
346 mult3x5Helper(&Jac[0], Av, &P[7]);
347 mult3x5Helper(&Jac[5], Az, &P[7]);
361 const double* Az =
T.matrix().col(2).data();
362 double Bx = Az[1] * P[5] - Az[2] * P[4];
363 double By = Az[2] * P[3] - Az[0] * P[5];
364 double Bz = Az[0] * P[4] - Az[1] * P[3];
365 const double B2 = Bx * Bx + By * By + Bz * Bz;
366 const double x = P[0] -
T(0, 3);
367 const double y = P[1] -
T(1, 3);
368 const double z = P[2] -
T(2, 3);
370 const double Bn = 1. / std::sqrt(B2);
374 par[0] =
x * Bx +
y * By +
z * Bz;
382 / (Az[0] * Az[0] + Az[1] * Az[1] + Az[2] * Az[2]));
384 par[1] =
x * Az[0] +
y * Az[1] +
z * Az[2];
392 const double d = P[3] * Az[0] + P[4] * Az[1] + P[5] * Az[2];
393 double a = (1. -
d) * (1. +
d);
397 const double X =
d * Az[0] - P[3];
398 const double Y =
d * Az[1] - P[4];
399 const double Z =
d * Az[2] - P[5];
402 mult3x5Helper(D, Az, &P[10]);
404 (((P[7] *
X + P[8] *
Y + P[9] *
Z) +
x * (D[0] * Az[0] - P[10])) +
405 (
y * (D[0] * Az[1] - P[11]) +
z * (D[0] * Az[2] - P[12]))) *
408 (((P[14] *
X + P[15] *
Y + P[16] *
Z) +
x * (D[1] * Az[0] - P[17])) +
409 (
y * (D[1] * Az[1] - P[18]) +
z * (D[1] * Az[2] - P[19]))) *
412 (((P[21] *
X + P[22] *
Y + P[23] *
Z) +
x * (D[2] * Az[0] - P[24])) +
413 (
y * (D[2] * Az[1] - P[25]) +
z * (D[2] * Az[2] - P[26]))) *
416 (((P[28] *
X + P[29] *
Y + P[30] *
Z) +
x * (D[3] * Az[0] - P[31])) +
417 (
y * (D[3] * Az[1] - P[32]) +
z * (D[3] * Az[2] - P[33]))) *
420 (((P[35] *
X + P[36] *
Y + P[37] *
Z) +
x * (D[4] * Az[0] - P[38])) +
421 (
y * (D[4] * Az[1] - P[39]) +
z * (D[4] * Az[2] - P[40]))) *
425 globalToLocalVecHelper(P, -1. * s0, -1. *
s1, -1. *
s2, -1. *
s3, -1. *
s4);
427 const double B[3] = { Bx, By, Bz };
428 mult3x5Helper(&Jac[0],
B, &P[7]);
429 mult3x5Helper(&Jac[5], Az, &P[7]);
444 const double* Ax =
T.matrix().col(0).data();
445 const double* Ay =
T.matrix().col(1).data();
446 const double* Az =
T.matrix().col(2).data();
448 const double x = P[0] -
T(0, 3);
449 const double y = P[1] -
T(1, 3);
450 const double z = P[2] -
T(2, 3);
451 const double RC =
x * Ax[0] +
y * Ax[1] +
z * Ax[2];
452 const double RS =
x * Ay[0] +
y * Ay[1] +
z * Ay[2];
453 par[1] =
x * Az[0] +
y * Az[1] +
z * Az[2];
454 par[0] = atan2(RS, RC) * (
par[1] * tA);
476 transformPlaneToGlobal(
bool useJac,
481 const double* Ax =
T.matrix().col(0).data();
482 const double* Ay =
T.matrix().col(1).data();
484 P[0] =
p[0] * Ax[0] +
p[1] * Ay[0] +
T(0, 3);
485 P[1] =
p[0] * Ax[1] +
p[1] * Ay[1] +
T(1, 3);
486 P[2] =
p[0] * Ax[2] +
p[1] * Ay[2] +
T(2, 3);
511 transformDiscToGlobal(
bool useJac,
516 const double* Ax =
T.matrix().col(0).data();
517 const double* Ay =
T.matrix().col(1).data();
522 const double d0 = Cf * Ax[0] + Sf * Ay[0];
523 const double d1 = Cf * Ax[1] + Sf * Ay[1];
524 const double d2 = Cf * Ax[2] + Sf * Ay[2];
525 P[0] =
p[0] *
d0 +
T(0, 3);
526 P[1] =
p[0] *
d1 +
T(1, 3);
527 P[2] =
p[0] *
d2 +
T(2, 3);
534 P[14] =
p[0] * (Cf * Ay[0] - Sf * Ax[0]);
538 P[15] =
p[0] * (Cf * Ay[1] - Sf * Ax[1]);
542 P[16] =
p[0] * (Cf * Ay[2] - Sf * Ax[2]);
552 transformCylinderToGlobal(
bool useJac,
558 const double* Ax =
T.matrix().col(0).data();
559 const double* Ay =
T.matrix().col(1).data();
560 const double* Az =
T.matrix().col(2).data();
562 const double fr =
p[0] /
R;
566 P[0] =
R * (Cf * Ax[0] + Sf * Ay[0]) +
p[1] * Az[0] +
T(0, 3);
567 P[1] =
R * (Cf * Ax[1] + Sf * Ay[1]) +
p[1] * Az[1] +
T(1, 3);
568 P[2] =
R * (Cf * Ax[2] + Sf * Ay[2]) +
p[1] * Az[2] +
T(2, 3);
574 P[7] = Cf * Ay[0] - Sf * Ax[0];
578 P[8] = Cf * Ay[1] - Sf * Ax[1];
582 P[9] = Cf * Ay[2] - Sf * Ax[2];
593 transformLineToGlobal(
bool useJac,
598 const double* Az =
T.matrix().col(2).data();
600 double Bx = Az[1] * P[5] - Az[2] * P[4];
601 double By = Az[2] * P[3] - Az[0] * P[5];
602 double Bz = Az[0] * P[4] - Az[1] * P[3];
603 const double tmp_B2 = Bx * Bx + By * By + Bz * Bz;
604 constexpr
double epsilon2 = 1
e-14;
608 const double Bn = ( tmp_B2 > epsilon2 ? 1. / std::sqrt(tmp_B2) : 0. );
612 P[0] =
p[1] * Az[0] + Bx *
p[0] +
T(0, 3);
613 P[1] =
p[1] * Az[1] + By *
p[0] +
T(1, 3);
614 P[2] =
p[1] * Az[2] + Bz *
p[0] +
T(2, 3);
619 double Bx2 = -Az[2] * P[25];
620 double Bx3 = Az[1] * P[33] - Az[2] * P[32];
621 double By2 = Az[2] * P[24];
622 double By3 = Az[2] * P[31] - Az[0] * P[33];
623 double Bz2 = Az[0] * P[25] - Az[1] * P[24];
624 double Bz3 = Az[0] * P[32] - Az[1] * P[31];
625 const double B2 = Bx * Bx2 + By * By2 + Bz * Bz2;
626 const double B3 = Bx * Bx3 + By * By3 + Bz * Bz3;
627 Bx2 = (Bx2 - Bx * B2) * Bn;
628 Bx3 = (Bx3 - Bx * B3) * Bn;
629 By2 = (By2 - By * B2) * Bn;
630 By3 = (By3 - By * B3) * Bn;
631 Bz2 = (Bz2 - Bz * B2) * Bn;
632 Bz3 = (Bz3 - Bz * B3) * Bn;
654 jacobianTransformCurvilinearToPlane(
double*
ATH_RESTRICT P,
657 const double* At = &P[4];
660 const double* Ax = &P[13];
661 const double* Ay = &P[16];
664 double A = At[0] *
S[0] + At[1] *
S[1] + At[2] *
S[2];
671 const double s1 = Au[0] *
S[0] + Au[1] *
S[1];
672 const double s2 = Av[0] *
S[0] + Av[1] *
S[1] + Av[2] *
S[2];
674 Au[0] -= (
s1 * At[0]);
675 Au[1] -= (
s1 * At[1]);
676 Au[2] -= (
s1 * At[2]);
677 Av[0] -= (
s2 * At[0]);
678 Av[1] -= (
s2 * At[1]);
679 Av[2] -= (
s2 * At[2]);
681 Jac[0] = Ax[0] * Au[0] + Ax[1] * Au[1] + Ax[2] * Au[2];
682 Jac[1] = Ax[0] * Av[0] + Ax[1] * Av[1] + Ax[2] * Av[2];
685 Jac[5] = Ay[0] * Au[0] + Ay[1] * Au[1] + Ay[2] * Au[2];
686 Jac[6] = Ay[0] * Av[0] + Ay[1] * Av[1] + Ay[2] * Av[2];
696 jacobianTransformCurvilinearToDisc(
double*
ATH_RESTRICT P,
699 const double*
p = &P[0];
700 const double* At = &P[4];
703 const double* Ax = &P[13];
704 const double* Ay = &P[16];
709 double A = At[0] *
S[0] + At[1] *
S[1] + At[2] *
S[2];
716 const double s1 = Au[0] *
S[0] + Au[1] *
S[1];
717 const double s2 = Av[0] *
S[0] + Av[1] *
S[1] + Av[2] *
S[2];
719 Au[0] -= (
s1 * At[0]);
720 Au[1] -= (
s1 * At[1]);
721 Au[2] -= (
s1 * At[2]);
722 Av[0] -= (
s2 * At[0]);
723 Av[1] -= (
s2 * At[1]);
724 Av[2] -= (
s2 * At[2]);
731 const double Ri = 1. /
p[0];
732 const double A0 = (Cf * Ax[0] + Sf * Ay[0]);
733 const double A1 = (Cf * Ax[1] + Sf * Ay[1]);
734 const double A2 = (Cf * Ax[2] + Sf * Ay[2]);
735 const double B0 = (Cf * Ay[0] - Sf * Ax[0]) * Ri;
736 const double B1 = (Cf * Ay[1] - Sf * Ax[1]) * Ri;
737 const double B2 = (Cf * Ay[2] - Sf * Ax[2]) * Ri;
739 Jac[0] = A0 * Au[0] + A1 * Au[1] + A2 * Au[2];
740 Jac[1] = A0 * Av[0] + A1 * Av[1] + A2 * Av[2];
743 Jac[5] = B0 * Au[0] + B1 * Au[1] + B2 * Au[2];
744 Jac[6] = B0 * Av[0] + B1 * Av[1] + B2 * Av[2];
754 jacobianTransformCurvilinearToCylinder(
double*
ATH_RESTRICT P,
757 const double*
p = &P[0];
758 const double* At = &P[4];
761 const double* Ax = &P[13];
762 const double* Ay = &P[16];
763 const double* Az = &P[19];
764 const double R = P[22];
766 const double fr =
p[0] /
R;
770 const double x = Cf * Ax[0] + Sf * Ay[0];
771 const double y = Cf * Ax[1] + Sf * Ay[1];
772 const double z = Cf * Ax[2] + Sf * Ay[2];
776 const double C = At[0] * Az[0] + At[1] * Az[1] + At[2] * Az[2];
777 const double ax = At[0] - Az[0] *
C;
778 const double ay = At[1] - Az[1] *
C;
779 const double az = At[2] - Az[2] *
C;
780 double A = (
ax *
x +
ay *
y + az *
z);
784 const double s1 = (Au[0] *
x + Au[1] *
y) *
A;
785 const double s2 = (Av[0] *
x + Av[1] *
y + Av[2] *
z) *
A;
787 Au[0] -= (
s1 * At[0]);
788 Au[1] -= (
s1 * At[1]);
789 Au[2] -= (
s1 * At[2]);
790 Av[0] -= (
s2 * At[0]);
791 Av[1] -= (
s2 * At[1]);
792 Av[2] -= (
s2 * At[2]);
796 const double A0 = (Cf * Ay[0] - Sf * Ax[0]);
797 const double A1 = (Cf * Ay[1] - Sf * Ax[1]);
798 const double A2 = (Cf * Ay[2] - Sf * Ax[2]);
800 Jac[0] = A0 * Au[0] + A1 * Au[1] + A2 * Au[2];
801 Jac[1] = A0 * Av[0] + A1 * Av[1] + A2 * Av[2];
804 Jac[5] = Az[0] * Au[0] + Az[1] * Au[1] + Az[2] * Au[2];
805 Jac[6] = Az[0] * Av[0] + Az[1] * Av[1] + Az[2] * Av[2];
816 jacobianTransformCurvilinearToStraightLine(
const double*
ATH_RESTRICT P,
819 const double*
p = &P[0];
820 const double* At = &P[4];
821 const double* Au = &P[7];
822 const double* Av = &P[10];
823 const double*
A = &P[19];
825 double Bx =
A[1] * At[2] -
A[2] * At[1];
826 double By =
A[2] * At[0] -
A[0] * At[2];
827 double Bz =
A[0] * At[1] -
A[1] * At[0];
828 const double Bn = 1. / std::sqrt(Bx * Bx + By * By + Bz * Bz);
835 const double d = At[0] *
A[0] + At[1] *
A[1] + At[2] *
A[2];
836 double a = (1. -
d) * (1. +
d);
839 const double X =
d *
A[0] - At[0],
Y =
d *
A[1] - At[1],
Z =
d *
A[2] - At[2];
841 const double s1 = (Au[0] *
X + Au[1] *
Y) *
a;
842 const double s2 = (Av[0] *
X + Av[1] *
Y + Av[2] *
Z) *
a;
843 const double s3 =
p[0] * (Bx * At[1] - By * At[0]) *
a;
844 const double s4 =
p[0] * (Bx * Av[0] + By * Av[1] + Bz * Av[2]) *
a;
848 Jac[0] = Bx * Au[0] + By * Au[1];
849 Jac[1] = Bx * Av[0] + By * Av[1] + Bz * Av[2];
852 Jac[5] =
A[0] * Au[0] +
A[1] * Au[1] +
s1 *
d;
853 Jac[6] = (
A[0] * Av[0] +
A[1] * Av[1] +
A[2] * Av[2]) +
s2 *
d;
866 const double*
r = &P[0];
867 const double*
a = &P[3];
869 const double A =
a[0] *
S[0] +
a[1] *
S[1] +
a[2] *
S[2];
874 const double D = (
S[3] -
r[0] *
S[0]) - (
r[1] *
S[1] +
r[2] *
S[2]);
887 const double*
r = &P[0];
888 const double*
a = &P[3];
890 double dx =
r[0] -
S[0];
891 double dy =
r[1] -
S[1];
892 double dz =
r[2] -
S[2];
893 double B =
dx *
S[3] +
dy *
S[4] + dz *
S[5];
894 double C =
a[0] *
S[3] +
a[1] *
S[4] +
a[2] *
S[5];
895 const double ax =
a[0] -
S[3] *
C;
897 const double ay =
a[1] -
S[4] *
C;
899 const double az =
a[2] -
S[5] *
C;
901 double A = 2. * (
ax *
ax +
ay *
ay + az * az);
907 double g =
dx +
dy + dz;
908 C = (
g -
S[6]) * (
g +
S[6]) - 2. * (
dx * (
dy + dz) +
dy * dz);
909 double Sq =
B *
B - 2. *
A *
C;
911 double Smin = -
B /
A, Smax = Smin;
915 Sq = std::sqrt(Sq) /
A;
924 if (std::fabs(Smax) < .1) {
931 const double inside = Smin * Smax;
974 const double*
r = &P[0];
975 const double*
a = &P[3];
977 double D =
a[0] *
S[3] +
a[1] *
S[4] +
a[2] *
S[5];
978 const double A = (1. - D) * (1. + D);
983 D = (
r[0] -
S[0]) * (D *
S[3] -
a[0]) + (
r[1] -
S[1]) * (D *
S[4] -
a[1]) +
984 (
r[2] -
S[2]) * (D *
S[5] -
a[2]);
997 const double*
r = &P[0];
998 const double*
a = &P[3];
1000 const double dx =
r[0] -
S[0];
1001 const double dy =
r[1] -
S[1];
1002 const double dz =
r[2] -
S[2];
1003 const double A =
dx *
S[3] +
dy *
S[4] + dz *
S[5];
1004 const double B =
a[0] *
S[3] +
a[1] *
S[4] +
a[2] *
S[5];
1005 const double C =
a[0] *
dx +
a[1] *
dy +
a[2] * dz;
1006 const double k =
S[6];
1008 const double KB = 1. -
k *
B *
B;
1009 const double KABC =
k *
A *
B -
C;
1016 double Sq = KABC * KABC + (
k *
A *
A -
dx *
dx -
dy *
dy - dz * dz) * KB;
1018 Sq = std::sqrt(Sq) / KB;
1027 if (
A +
B * Smin < 0.) {
1031 if (
A +
B * Smax < 0.) {
1045 Smin = (
dx *
dx +
dy *
dy + dz * dz -
k *
A *
A) / (2. * KABC);
1047 if (
A +
B * Smin < 0.) {
1054 const double inside = Smin * Smax;
1143 par[2] = atan2(P[4], P[3]);
1144 par[3] = acos(P[5]);
1155 par[2] = atan2(P[4], P[3]);
1156 par[3] = acos(P[5]);
1163 transformGlobalToPlane(
T, useJac, P,
par, Jac);
1169 transformGlobalToLine(
T, useJac, P,
par, Jac);
1173 transformGlobalToCylinder(
1183 transformGlobalToDisc(
T, useJac, P,
par, Jac);
1187 transformGlobalToCone(
1204 double P3, P4,
C = P[3] * P[3] + P[4] * P[4];
1216 Jac[10] = P3 * P[11] - P4 * P[10];
1217 Jac[11] = P3 * P[18] - P4 * P[17];
1218 Jac[12] = P3 * P[25] - P4 * P[24];
1219 Jac[13] = P3 * P[32] - P4 * P[31];
1220 Jac[14] = P3 * P[39] - P4 * P[38];
1221 Jac[15] =
C * P[12];
1222 Jac[16] =
C * P[19];
1223 Jac[17] =
C * P[26];
1224 Jac[18] =
C * P[33];
1225 Jac[19] =
C * P[40];
1241 return stepEstimatorToStraightLine(Su, P, Q);
1244 return stepEstimatorToPlane(Su, P, Q);
1247 return stepEstimatorToCylinder(Su, P, Q);
1250 return stepEstimatorToCone(Su, P, Q);
1266 return stepEstimatorToPlane(Su, P, Q);
1269 return stepEstimatorToCylinder(Su, P, Q);
1274 return stepEstimatorToStraightLine(Su, P, Q);
1278 return stepEstimatorToCone(Su, P, Q);
1281 return stepEstimatorToPlane(Su, P, Q);
1303 std::pair<double, int>
1305 std::vector<std::pair<const Trk::Surface*, Trk::BoundaryCheck>>& SU,
1306 std::multimap<double, int>& DN,
1317 const double D[3] = { Pout[0] - Pinp[0], Pout[1] - Pinp[1], Pout[2] - Pinp[2] };
1318 double Smax = std::sqrt(D[0] * D[0] + D[1] * D[1] + D[2] * D[2]);
1319 double Sign = D[0] * Pinp[3] + D[1] * Pinp[4] + D[2] * Pinp[5];
1322 if (Smax < DBL_EPSILON) {
1324 return std::make_pair(0., -1);
1326 Eigen::Map<const Amg::Vector3D>
pos(&Pinp[0],3,1);
1329 double Smin = 2. * Smax;
1331 std::vector<std::pair<double, int>> LD;
1334 for (;
i !=
ie; ++
i) {
1336 if ((*i).first >
W + Smin)
1339 int j = (*i).second;
1341 SU[j].first->straightLineDistanceEstimate(
pos,
dir, SU[j].
second);
1342 LD.emplace_back(
ds.currentDistance(
false) +
W, j);
1344 const int n =
ds.numberOfSolutions();
1348 for (
int i = 0;
i !=
n; ++
i) {
1350 i == 0 ?
s =
ds.first() :
s =
ds.second();
1351 if (s < 0. || s > Smin || (j == Nv &&
s < So))
1360 DN.erase(DN.begin(),
i);
1361 std::vector<std::pair<double, int>>
::iterator l = LD.begin(), le = LD.end();
1362 for (;
l != le; ++
l)
1368 return std::make_pair(0., -1);
1375 if (Smin < So || (Smax - Smin) > 2. * So)
1376 return std::make_pair(Sm,
N);
1378 Eigen::Map<const Amg::Vector3D> posn(&Pout[0], 3, 1);
1379 Eigen::Map<const Amg::Vector3D> dirn(&Pout[3], 3, 1);
1382 SU[
N].first->straightLineDistanceEstimate(posn, dirn, SU[
N].
second);
1383 const int n =
ds.numberOfSolutions();
1385 return std::make_pair(Sm,
N);
1388 for (
int i = 0;
i !=
n; ++
i) {
1391 i == 0 ?
s =
ds.first() :
s =
ds.second();
1394 if (
s * Sign < 0.) {
1397 return std::make_pair(
s,
N);
1404 return std::make_pair(Sm,
N);
1419 Eigen::Map<
const AmgVector(5)> JacMap0(&J[0], 5, 1);
1421 m(0, 0) = a1.dot(JacMap0);
1423 Eigen::Map<
const AmgVector(5)> JacMap5(&J[5]);
1425 m(1, 0) = a2.dot(JacMap0);
1426 m(1, 1) = a2.dot(JacMap5);
1429 Eigen::Map<
const AmgVector(5)> JacMap10(&J[10], 5, 1);
1431 m(2, 0) = a3.dot(JacMap0);
1432 m(2, 1) = a3.dot(JacMap5);
1433 m(2, 2) = a3.dot(JacMap10);
1437 Eigen::Map<
const AmgVector(5)> JacMap15(&J[15], 5, 1);
1439 m(3, 0) = a4.dot(JacMap0);
1440 m(3, 1) = a4.dot(JacMap5);
1441 m(3, 2) = a4.dot(JacMap10);
1442 m(3, 3) = a4.dot(JacMap15);
1447 const AmgVector(5) a5 = M.row(4) * J[20];
1448 m(4, 0) = a5.dot(JacMap0);
1449 m(4, 1) = a5.dot(JacMap5);
1450 m(4, 2) = a5.dot(JacMap10);
1451 m(4, 3) = a5.dot(JacMap15);
1452 m(4, 4) = a5[4] * J[20];
1474 double Sf, Cf, Ce, Se;
1482 if (std::fabs(P[6]) < .000000000000001) {
1483 P[6] < 0. ? P[6] = -.000000000000001 : P[6] = .000000000000001;
1521 transformPlaneToGlobal(useJac,
T,
p, P);
1526 transformLineToGlobal(useJac,
T,
p, P);
1530 transformCylinderToGlobal(
1539 transformDiscToGlobal(useJac,
T,
p, P);
1564 const double An = std::sqrt(P[3] * P[3] + P[4] * P[4]);
1576 const double Ay[3] = { -Ax[1] * P[5], Ax[0] * P[5], An };
1577 double S[3] = { P[3], P[4], P[5] };
1579 double A = P[3] *
S[0] + P[4] *
S[1] + P[5] *
S[2];
1587 mult3x5Helper(
s,
S, &P[7]);
1588 globalToLocalVecHelper(P,
s[0],
s[1],
s[2],
s[3],
s[4]);
1590 double P3, P4,
C = P[3] * P[3] + P[4] * P[4];
1604 Jac[0] = Ax[0] * P[7] + Ax[1] * P[8];
1605 Jac[1] = Ax[0] * P[14] + Ax[1] * P[15];
1606 Jac[2] = Ax[0] * P[21] + Ax[1] * P[22];
1607 Jac[3] = Ax[0] * P[28] + Ax[1] * P[29];
1608 Jac[4] = Ax[0] * P[35] + Ax[1] * P[36];
1609 Jac[5] = Ay[0] * P[7] + Ay[1] * P[8] + Ay[2] * P[9];
1610 Jac[6] = Ay[0] * P[14] + Ay[1] * P[15] + Ay[2] * P[16];
1611 Jac[7] = Ay[0] * P[21] + Ay[1] * P[22] + Ay[2] * P[23];
1612 Jac[8] = Ay[0] * P[28] + Ay[1] * P[29] + Ay[2] * P[30];
1613 Jac[9] = Ay[0] * P[35] + Ay[1] * P[36] + Ay[2] * P[37];
1614 Jac[10] = P3 * P[11] - P4 * P[10];
1615 Jac[11] = P3 * P[18] - P4 * P[17];
1616 Jac[12] = P3 * P[25] - P4 * P[24];
1617 Jac[13] = P3 * P[32] - P4 * P[31];
1618 Jac[14] = P3 * P[39] - P4 * P[38];
1619 Jac[15] =
C * P[12];
1620 Jac[16] =
C * P[19];
1621 Jac[17] =
C * P[26];
1622 Jac[18] =
C * P[33];
1623 Jac[19] =
C * P[40];
1635 double Sf, Cf, Ce, Se;
1639 const double Ax[3] = { -Sf, Cf, 0. };
1640 const double Ay[3] = { -Cf * Ce, -Sf * Ce, Se };
1694 const AmgVector(5)& Vp = Tp.parameters();
1750 double Sf, Cf, Ce, Se;
1777 jacobianTransformCurvilinearToPlane(P, Jac);
1782 jacobianTransformCurvilinearToStraightLine(P, Jac);
1787 jacobianTransformCurvilinearToCylinder(P, Jac);
1791 jacobianTransformCurvilinearToDisc(P, Jac);
1800 Jac[0] = Jac[3] = 1.;
1801 Jac[1] = Jac[2] = 0.;
1815 std::vector<std::pair<const Trk::Surface*, Trk::BoundaryCheck>>& SU,
1816 std::multimap<double, int>& DN,
1823 DN.erase(DN.begin(), DN.end());
1825 Eigen::Map<const Amg::Vector3D>
pos(&Pinp[0], 3, 1);
1826 Eigen::Map<const Amg::Vector3D>
dir(&Pinp[3], 3, 1);
1835 for (
int i = 0;
i !=
N; ++
i) {
1844 double dist =
ds.currentDistance(
false);
1845 DN.insert(std::make_pair(dist +
W,
i));
1850 int n =
ds.numberOfSolutions();
1853 for (
int i = 0;
i !=
n; ++
i) {
1856 i == 0 ? st =
ds.first() : st =
ds.second();
1858 if (
s == So && std::fabs(st) <= .001)