12 using namespace mkfit;
20 const T*
a =
A.fArray;
22 const T*
b =
B.fArray;
27 #include "MultHelixPlaneProp.ah" 36 const T*
a =
A.fArray;
38 const T*
b =
B.fArray;
43 #include "MultHelixPlanePropTransp.ah" 56 for (
int n = 0;
n <
NN; ++
n)
66 const T*
a =
A.fArray;
68 const T*
b =
B.fArray;
73 #include "JacErrPropCurv1.ah" 81 const T*
a =
A.fArray;
83 const T*
b =
B.fArray;
88 #include "JacErrPropCurv2.ah" 91 void parsFromPathL_impl(
const MPlexLV& __restrict__ inPar,
93 const MPlexQF& __restrict__ kinv,
98 MPF alpha =
s * mpt::fast_sin(inPar(5, 0)) * inPar(3, 0) * kinv;
107 MPF sin_mom_phi, cos_mom_phi;
110 MPF sin_mom_tht, cos_mom_tht;
113 outPar.aij(0, 0) = inPar(0, 0) + 2.f * sinah * (cos_mom_phi * cosah - sin_mom_phi * sinah) / (inPar(3, 0) * kinv);
114 outPar.aij(1, 0) = inPar(1, 0) + 2.f * sinah * (sin_mom_phi * cosah + cos_mom_phi * sinah) / (inPar(3, 0) * kinv);
115 outPar.aij(2, 0) = inPar(2, 0) +
alpha / kinv * cos_mom_tht / (inPar(3, 0) * sin_mom_tht);
116 outPar.aij(3, 0) = inPar(3, 0);
117 outPar.aij(4, 0) = inPar(4, 0) +
alpha;
118 outPar.aij(5, 0) = inPar(5, 0);
124 void parsAndErrPropFromPathL_impl(
const MPlexLV& __restrict__ inPar,
125 const MPlexQI& __restrict__ inChg,
127 const MPlexQF& __restrict__ kinv,
129 MPlexLL& __restrict__ errorProp,
137 parsFromPathL_impl(inPar, outPar, kinv,
s);
141 MPF sinPout, cosPout;
155 const MPF t11 = cosPin * sinT;
156 const MPF t12 = sinPin * sinT;
157 const MPF t21 = cosPout * sinT;
158 const MPF t22 = sinPout * sinT;
159 const MPF cosl1 = 1.f / sinT;
162 const MPF bF = (
pf.use_param_b_field ?
Const::sol_over_100 * getBFieldFromZXY(inPar(2, 0), inPar(0, 0), inPar(1, 0))
164 const MPF q = -bF * qbp;
168 const MPF dx1 = inPar(0, 0) - outPar(0, 0);
169 const MPF dx2 = inPar(1, 0) - outPar(1, 0);
170 const MPF dx3 = inPar(2, 0) - outPar(2, 0);
171 MPF au = mpt::fast_isqrt(t11 * t11 + t12 * t12);
172 const MPF u11 = -au * t12;
173 const MPF u12 = au * t11;
174 const MPF v11 = -cosT * u12;
175 const MPF v12 = cosT * u11;
176 const MPF v13 = t11 * u12 - t12 * u11;
177 au = mpt::fast_isqrt(t21 * t21 + t22 * t22);
178 const MPF u21 = -au * t22;
179 const MPF u22 = au * t21;
180 const MPF v21 = -cosT * u22;
181 const MPF v22 = cosT * u21;
182 const MPF v23 = t21 * u22 - t22 * u21;
184 const MPF omcost = 1.f - cost;
187 errorPropCurv.aij(0, 0) = 1.f;
188 for (
int i = 1;
i < 5; ++
i)
189 errorPropCurv.aij(0,
i) = 0.f;
191 errorPropCurv.aij(1, 0) = 0.f;
192 errorPropCurv.aij(1, 1) =
193 cost * (v11 * v21 + v12 * v22 + v13 * v23) + sint * (-v12 * v21 + v11 * v22) + omcost * v13 * v23;
194 errorPropCurv.aij(1, 2) = (cost * (u11 * v21 + u12 * v22) + sint * (-u12 * v21 + u11 * v22)) * sinT;
195 errorPropCurv.aij(1, 3) = 0.f;
196 errorPropCurv.aij(1, 4) = 0.f;
198 errorPropCurv.aij(2, 0) = bF * v23 * (t21 * dx1 + t22 * dx2 + cosT * dx3) * cosl1;
199 errorPropCurv.aij(2, 1) = (cost * (v11 * u21 + v12 * u22) + sint * (-v12 * u21 + v11 * u22) +
200 v23 * (-sint * (v11 * t21 + v12 * t22 + v13 * cosT) + omcost * (-v11 * t22 + v12 * t21) -
201 tmsint * cosT * v13)) *
203 errorPropCurv.aij(2, 2) = (cost * (u11 * u21 + u12 * u22) + sint * (-u12 * u21 + u11 * u22) +
204 v23 * (-sint * (u11 * t21 + u12 * t22) + omcost * (-u11 * t22 + u12 * t21))) *
206 errorPropCurv.aij(2, 3) = -
q * v23 * (u11 * t21 + u12 * t22) * cosl1;
207 errorPropCurv.aij(2, 4) = -
q * v23 * (v11 * t21 + v12 * t22 + v13 * cosT) * cosl1;
210 for (
int n = 0;
n < N_proc; ++
n) {
211 float cutCriterion = fabs(
s[
n] * sinT[
n] * inPar(
n, 3, 0));
212 const float limit = 5.f;
213 if (cutCriterion >
limit) {
214 const float pp = 1.f / qbp[
n];
215 errorPropCurv(
n, 3, 0) =
pp * (u21[
n] * dx1[
n] + u22[
n] * dx2[
n]);
216 errorPropCurv(
n, 4, 0) =
pp * (v21[
n] * dx1[
n] + v22[
n] * dx2[
n] + v23[
n] * dx3[
n]);
218 const float temp1 = -t12[
n] * u21[
n] + t11[
n] * u22[
n];
219 const float s2 =
s[
n] *
s[
n];
220 const float secondOrder41 = -0.5f * bF[
n] * temp1 * s2;
221 const float temp2 = -t11[
n] * u21[
n] - t12[
n] * u22[
n];
222 const float s3 = s2 *
s[
n];
223 const float s4 = s3 *
s[
n];
224 const float h2 = bF[
n] * bF[
n];
225 const float h3 = h2 * bF[
n];
226 const float qbp2 = qbp[
n] * qbp[
n];
227 const float thirdOrder41 = 1.f / 3 * h2 * s3 * qbp[
n] * temp2;
228 const float fourthOrder41 = 1.f / 8 * h3 *
s4 * qbp2 * temp1;
229 errorPropCurv(
n, 3, 0) = secondOrder41 + (thirdOrder41 + fourthOrder41);
230 const float temp3 = -t12[
n] * v21[
n] + t11[
n] * v22[
n];
231 const float secondOrder51 = -0.5f * bF[
n] * temp3 * s2;
232 const float temp4 = -t11[
n] * v21[
n] - t12[
n] * v22[
n] - cosT[
n] * v23[
n];
233 const float thirdOrder51 = 1.f / 3 * h2 * s3 * qbp[
n] * temp4;
234 const float fourthOrder51 = 1.f / 8 * h3 *
s4 * qbp2 * temp3;
235 errorPropCurv(
n, 4, 0) = secondOrder51 + (thirdOrder51 + fourthOrder51);
239 errorPropCurv.aij(3, 1) = (sint * (v11 * u21 + v12 * u22) + omcost * (-v12 * u21 + v11 * u22)) /
q;
240 errorPropCurv.aij(3, 2) = (sint * (u11 * u21 + u12 * u22) + omcost * (-u12 * u21 + u11 * u22)) * sinT /
q;
241 errorPropCurv.aij(3, 3) = (u11 * u21 + u12 * u22);
242 errorPropCurv.aij(3, 4) = (v11 * u21 + v12 * u22);
244 errorPropCurv.aij(4, 1) =
245 (sint * (v11 * v21 + v12 * v22 + v13 * v23) + omcost * (-v12 * v21 + v11 * v22) + tmsint * v23 * v13) /
q;
246 errorPropCurv.aij(4, 2) = (sint * (u11 * v21 + u12 * v22) + omcost * (-u12 * v21 + u11 * v22)) * sinT /
q;
247 errorPropCurv.aij(4, 3) = (u11 * v21 + u12 * v22);
248 errorPropCurv.aij(4, 4) = (v11 * v21 + v12 * v22 + v13 * v23);
252 for (
int n = 0;
n <
NN; ++
n) {
255 std::cout <<
n <<
": errorPropCurv" << std::endl;
256 printf(
"%5f %5f %5f %5f %5f\n",
257 errorPropCurv(
n, 0, 0),
258 errorPropCurv(
n, 0, 1),
259 errorPropCurv(
n, 0, 2),
260 errorPropCurv(
n, 0, 3),
261 errorPropCurv(
n, 0, 4));
262 printf(
"%5f %5f %5f %5f %5f\n",
263 errorPropCurv(
n, 1, 0),
264 errorPropCurv(
n, 1, 1),
265 errorPropCurv(
n, 1, 2),
266 errorPropCurv(
n, 1, 3),
267 errorPropCurv(
n, 1, 4));
268 printf(
"%5f %5f %5f %5f %5f\n",
269 errorPropCurv(
n, 2, 0),
270 errorPropCurv(
n, 2, 1),
271 errorPropCurv(
n, 2, 2),
272 errorPropCurv(
n, 2, 3),
273 errorPropCurv(
n, 2, 4));
274 printf(
"%5f %5f %5f %5f %5f\n",
275 errorPropCurv(
n, 3, 0),
276 errorPropCurv(
n, 3, 1),
277 errorPropCurv(
n, 3, 2),
278 errorPropCurv(
n, 3, 3),
279 errorPropCurv(
n, 3, 4));
280 printf(
"%5f %5f %5f %5f %5f\n",
281 errorPropCurv(
n, 4, 0),
282 errorPropCurv(
n, 4, 1),
283 errorPropCurv(
n, 4, 2),
284 errorPropCurv(
n, 4, 3),
285 errorPropCurv(
n, 4, 4));
296 jacCCS2Curv.aij(1, 5) = -1.f;
297 jacCCS2Curv.aij(2, 4) = 1.f;
298 jacCCS2Curv.aij(3, 0) = -sinPin;
299 jacCCS2Curv.aij(3, 1) = cosPin;
300 jacCCS2Curv.aij(4, 0) = -cosPin * cosT;
301 jacCCS2Curv.aij(4, 1) = -sinPin * cosT;
302 jacCCS2Curv.aij(4, 2) = sinT;
306 jacCurv2CCS.aij(0, 3) = -sinPout;
307 jacCurv2CCS.aij(0, 4) = -cosT * cosPout;
308 jacCurv2CCS.aij(1, 3) = cosPout;
309 jacCurv2CCS.aij(1, 4) = -cosT * sinPout;
310 jacCurv2CCS.aij(2, 4) = sinT;
312 jacCurv2CCS.aij(3, 1) = outPar(3, 0) * cosT / sinT;
313 jacCurv2CCS.aij(4, 2) = 1.f;
314 jacCurv2CCS.aij(5, 1) = -1.f;
318 JacErrPropCurv1(jacCurv2CCS, errorPropCurv,
tmp);
319 JacErrPropCurv2(
tmp, jacCCS2Curv, errorProp);
356 float getS(
float delta0,
369 float A = delta0 * eta0 + delta1 *
eta1 + delta2 *
eta2;
370 float ip = sinT /
pt;
371 float p0[3] = {
pt * cosP,
pt * sinP, cosT / ip};
372 float B = (p0[0] * eta0 + p0[1] *
eta1 + p0[2] *
eta2) * ip;
373 float rho = kinv * ip;
374 float C = (eta0 * p0[1] -
eta1 * p0[0]) *
rho * 0.5
f * ip;
376 float s1 = (-
B + sqb2m4ac) * 0.5
f /
C;
377 float s2 = (-
B - sqb2m4ac) * 0.5
f /
C;
380 std::cout <<
"A=" <<
A <<
" B=" <<
B <<
" C=" <<
C <<
" s1=" << s1 <<
" s2=" << s2 << std::endl;
386 void helixAtPlane_impl(
const MPlexLV& __restrict__ inPar,
387 const MPlexQI& __restrict__ inChg,
388 const MPlexHV& __restrict__ plPnt,
389 const MPlexHV& __restrict__ plNrm,
392 MPlexLL& __restrict__ errorProp,
393 MPlexQI& __restrict__ outFailFlag,
400 for (
int n = 0;
n < N_proc; ++
n) {
403 <<
" inPar(n, 0, 0)=" << std::setprecision(9) << inPar(
n, 0, 0) <<
" inPar(n, 1, 0)=" 404 << std::setprecision(9) << inPar(
n, 1, 0) <<
" inPar(n, 2, 0)=" << std::setprecision(9)
405 << inPar(
n, 2, 0) <<
" inPar(n, 3, 0)=" << std::setprecision(9) << inPar(
n, 3, 0)
406 <<
" inPar(n, 4, 0)=" << std::setprecision(9) << inPar(
n, 4, 0)
407 <<
" inPar(n, 5, 0)=" << std::setprecision(9) << inPar(
n, 5, 0));
412 if (
pf.use_param_b_field) {
413 kinv *= getBFieldFromZXY(inPar(2, 0), inPar(0, 0), inPar(1, 0));
418 MPF delta0 = inPar(0, 0) - plPnt(0, 0);
419 MPF delta1 = inPar(1, 0) - plPnt(1, 0);
420 MPF delta2 = inPar(2, 0) - plPnt(2, 0);
428 MPF sl = -(plNrm(0, 0) * delta0 + plNrm(1, 0) * delta1 + plNrm(2, 0) * delta2) /
429 (plNrm(0, 0) * cosP * sinT + plNrm(1, 0) * sinP * sinT + plNrm(2, 0) * cosT);
434 for (
int n = 0;
n <
NN; ++
n) {
435 s[
n] = (
std::abs(plNrm(
n, 2, 0)) < 1.f ? getS(delta0[
n],
448 : (plPnt.constAt(
n, 2, 0) - inPar.constAt(
n, 2, 0)) / cosT[
n]);
455 parsFromPathL_impl(inPar, outParTmp, kinv,
s);
457 delta0 = outParTmp(0, 0) - plPnt(0, 0);
458 delta1 = outParTmp(1, 0) - plPnt(1, 0);
459 delta2 = outParTmp(2, 0) - plPnt(2, 0);
465 for (
int n = 0;
n <
NN; ++
n) {
480 : (plPnt.constAt(
n, 2, 0) - outParTmp.constAt(
n, 2, 0)) /
std::
cos(outParTmp.constAt(
n, 5, 0)));
485 for (
int n = 0;
n <
NN; ++
n) {
489 <<
" std::isfinite(s[n])=" << std::isfinite(
s[
n]) <<
" std::isnormal(s[n])=" << std::isnormal(
s[
n])
500 parsAndErrPropFromPathL_impl(inPar, inChg, outPar, kinv,
s, errorProp, N_proc,
pf);
519 errorProp.setVal(0.
f);
520 outFailFlag.setVal(0.
f);
522 helixAtPlane_impl(inPar, inChg, plPnt, plNrm, pathL, outPar, errorProp, outFailFlag, N_proc, pflags);
544 helixAtPlane(inPar, inChg, plPnt, plNrm, pathL, outPar, errorProp, outFailFlag, N_proc, pflags);
547 for (
int n = 0;
n < N_proc; ++
n) {
550 "propagation to plane end, dump parameters\n" 552 <<
" pos = " << outPar(
n, 0, 0) <<
" " << outPar(
n, 1, 0) <<
" " << outPar(
n, 2, 0) <<
"\t\t r=" 553 <<
std::sqrt(outPar(
n, 0, 0) * outPar(
n, 0, 0) + outPar(
n, 1, 0) * outPar(
n, 1, 0)) << std::endl
554 <<
" mom = " << outPar(
n, 3, 0) <<
" " << outPar(
n, 4, 0) <<
" " << outPar(
n, 5, 0) << std::endl
555 <<
" charge = " << inChg(
n, 0, 0) << std::endl
556 <<
" cart= " <<
std::cos(outPar(
n, 4, 0)) / outPar(
n, 3, 0) <<
" " 557 <<
std::sin(outPar(
n, 4, 0)) / outPar(
n, 3, 0) <<
" " << 1. / (outPar(
n, 3, 0) *
tan(outPar(
n, 5, 0)))
558 <<
"\t\tpT=" << 1. /
std::abs(outPar(
n, 3, 0)) << std::endl);
562 for (
int kk = 0;
kk < N_proc; ++
kk) {
564 for (
int i = 0;
i < 6; ++
i) {
569 for (
int i = 0;
i < 6; ++
i) {
570 for (
int j = 0;
j < 6; ++
j)
576 for (
int kk = 0;
kk < N_proc; ++
kk) {
578 for (
int j = 0;
j < 3; ++
j)
583 for (
int kk = 0;
kk < N_proc; ++
kk) {
585 for (
int j = 0;
j < 1; ++
j)
591 for (
int i = 0;
i < 6; ++
i) {
592 for (
int j = 0;
j < 6; ++
j)
604 MultHelixPlaneProp(errorProp, outErr,
temp);
605 MultHelixPlanePropTransp(errorProp,
temp, outErr);
634 for (
int kk = 0;
kk < N_proc; ++
kk) {
636 for (
int i = 0;
i < 6; ++
i) {
637 for (
int j = 0;
j < 6; ++
j)
654 for (
int n = 0;
n <
NN; ++
n) {
655 if (
n >= N_proc || (noMatEffPtr && noMatEffPtr->constAt(
n, 0, 0))) {
656 hitsRl(
n, 0, 0) = 0.f;
657 hitsXi(
n, 0, 0) = 0.f;
659 const float hypo =
std::hypot(outPar(
n, 0, 0), outPar(
n, 1, 0));
661 hitsRl(
n, 0, 0) = mat.
radl;
662 hitsXi(
n, 0, 0) = mat.bbxi;
664 propSign(
n, 0, 0) = (pathL(
n, 0, 0) > 0.f ? 1.f : -1.f);
669 for (
int kk = 0;
kk < N_proc; ++
kk) {
671 for (
int i = 0;
i < 1; ++
i) {
676 for (
int i = 0;
i < 3; ++
i) {
680 dprintf(
"outErr(after material) %d\n",
kk);
681 for (
int i = 0;
i < 6; ++
i) {
682 for (
int j = 0;
j < 6; ++
j)
697 for (
int i = 0;
i < N_proc; ++
i) {
698 if (outFailFlag(
i, 0, 0)) {
699 outPar.copySlot(
i, inPar);
700 outErr.copySlot(
i, inErr);
void sincos4(const MPlex< T, D1, D2, N > &a, MPlex< T, D1, D2, N > &s, MPlex< T, D1, D2, N > &c)
Matriplex::Matriplex< float, LL, LL, NN > MPlexLL
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
constexpr float sol_over_100
for(int i=first, nt=offsets[nh];i< nt;i+=gridDim.x *blockDim.x)
Matriplex::Matriplex< float, HH, 1, NN > MPlexHV
Sin< T >::type sin(const T &t)
#define CMS_UNROLL_LOOP_COUNT(N)
const TrackerInfo * tracker_info
void applyMaterialEffects(const MPlexQF &hitsRl, const MPlexQF &hitsXi, const MPlexQF &propSign, const MPlexHV &plNrm, MPlexLS &outErr, MPlexLV &outPar, const int N_proc)
Matriplex::Matriplex< float, LL, 1, NN > MPlexLV
Matriplex::Matriplex< float, 5, 5, NN > MPlex55
void squashPhiMPlex(MPlexLV &par, const int N_proc)
void propagateHelixToPlaneMPlex(const MPlexLS &inErr, const MPlexLV &inPar, const MPlexQI &inChg, const MPlexHV &plPnt, const MPlexHV &plNrm, MPlexLS &outErr, MPlexLV &outPar, MPlexQI &outFailFlag, const int N_proc, const PropagationFlags &pflags, const MPlexQI *noMatEffPtr=nullptr)
constexpr Matriplex::idx_t NN
Cos< T >::type cos(const T &t)
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
MPlex< T, D1, D2, N > negate_if_ltz(const MPlex< T, D1, D2, N > &a, const MPlex< TT, D1, D2, N > &sign)
constexpr bool useTrigApprox
Matriplex::Matriplex< int, 1, 1, NN > MPlexQI
Matriplex::Matriplex< float, 5, 6, NN > MPlex56
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
float hipo(float x, float y)
float bFieldFromZR(const float z, const float r)
void helixAtPlane(const MPlexLV &inPar, const MPlexQI &inChg, const MPlexHV &plPnt, const MPlexHV &plNrm, MPlexQF &pathL, MPlexLV &outPar, MPlexLL &errorProp, MPlexQI &outFailFlag, const int N_proc, const PropagationFlags &pflags)
Matriplex::MatriplexSym< float, LL, NN > MPlexLS
Material material_checked(float z, float r) const
void fast_sincos(const MPF &a, MPF &s, MPF &c)
#define ASSUME_ALIGNED(a, b)
Matriplex::Matriplex< float, 6, 5, NN > MPlex65