42 cout <<
" !!! L1Algo::KFTrackFitter_simple !!! " << endl;
46 for (
unsigned int itrack = 0; itrack <
vTracks.size(); itrack++) {
50 std::vector<unsigned short int> hits;
53 for (
int i = 0;
i < nHits;
i++) {
61 for (
int iter = 0; iter < 3; iter++) {
95 fvec dzi = 1. / (z1 - z0);
101 T.tx = (x1 - x0) * dzi;
102 T.ty = (y1 - y0) * dzi;
114 T.C30 = T.C31 = T.C32 = 0;
115 T.C40 = T.C41 = T.C42 = T.C43 = 0;
116 T.C22 = T.C33 =
vINF;
131 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
135 for (
int i = nHits - 2;
i >= 0;
i--) {
161 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
189 t.
NDF =
static_cast<int>(T.NDF[0]);
245 T.C30 = T.C31 = T.C32 = 0;
246 T.C40 = T.C41 = T.C42 = T.C43 = 0;
247 T.C22 = T.C33 =
vINF;
262 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
265 for (
int i = 1;
i < nHits;
i++) {
288 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
294 t.
TLast[2] = T.tx[0];
295 t.
TLast[3] = T.ty[0];
296 t.
TLast[4] = T.qp[0];
299 t.
CLast[0] = T.C00[0];
300 t.
CLast[1] = T.C10[0];
301 t.
CLast[2] = T.C11[0];
302 t.
CLast[3] = T.C20[0];
303 t.
CLast[4] = T.C21[0];
304 t.
CLast[5] = T.C22[0];
305 t.
CLast[6] = T.C30[0];
306 t.
CLast[7] = T.C31[0];
307 t.
CLast[8] = T.C32[0];
308 t.
CLast[9] = T.C33[0];
309 t.
CLast[10] = T.C40[0];
310 t.
CLast[11] = T.C41[0];
311 t.
CLast[12] = T.C42[0];
312 t.
CLast[13] = T.C43[0];
313 t.
CLast[14] = T.C44[0];
316 t.
NDF +=
static_cast<int>(T.NDF[0]);
345 fvec x_first, y_first, x_last, y_last;
348 fvec fz0, fz1, fz2, dz, z_start, z_end;
352 for (
int iHit = 0; iHit < nHits; iHit++) {
353 ZSta[iHit] = sta[iHit].
z;
356 unsigned short N_vTracks =
vTracks.size();
358 for (
unsigned short itrack = 0; itrack < N_vTracks; itrack +=
fvecLen) {
359 if (N_vTracks - itrack <
static_cast<unsigned short>(
fvecLen))
360 nTracks_SIMD = N_vTracks - itrack;
362 for (
i = 0;
i < nTracks_SIMD;
i++)
366 for (
i = 0;
i < nHits;
i++) {
371 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
372 int nHitsTrack = t[iVec]->
NHits;
375 for (
i = 0;
i < nHitsTrack;
i++) {
377 const int ista =
vSFlag[hit.
f] / 4;
387 u[ista][iVec] = hp.
U();
388 v[ista][iVec] = hp.
V();
389 du[ista][iVec] = hp.
DU() * hp.
DU();
390 dv[ista][iVec] = hp.
DV() * hp.
DV();
398 x[ista][iVec] = x_temp[iVec];
399 y[ista][iVec] = y_temp[iVec];
402 fB[ista].
x[iVec] = fB_temp.x[iVec];
403 fB[ista].
y[iVec] = fB_temp.y[iVec];
404 fB[ista].
z[iVec] = fB_temp.z[iVec];
406 z_start[iVec] = z[ista][iVec];
407 x_first[iVec] = x[ista][iVec];
408 y_first[iVec] = y[ista][iVec];
409 }
else if (
i == nHitsTrack - 1) {
410 z_end[iVec] = z[ista][iVec];
411 x_last[iVec] = x[ista][iVec];
412 y_last[iVec] = y[ista][iVec];
418 for(
i = nHits - 1;
i >= 0;
i-- ){
423 fscal prevZ = z_end[iVec];
424 fscal cursy = 0., curSy = 0.;
425 for (
i = nHitsTrack - 1;
i >= 0;
i--) {
426 const int ista = iSta[
i];
428 const fscal curZ = z[ista][iVec];
429 fscal dZ = curZ - prevZ;
431 curSy += dZ * cursy + dZ * dZ * By / 2.;
433 Sy[ista][iVec] = curSy;
441 GuessVec(T, x, y, z, Sy, w, nHits, &z_end);
443 for (
int iter = 0; iter < 2; iter++) {
460 fB2.Combine(fB[
i - 2], w[
i - 2]);
461 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
462 for (--
i;
i >= 0;
i--) {
467 fld.Set(fB0, fz0, fB1, fz1, fB2, fz2);
472 fvec w1 = (w[
i] & (initialised));
473 fvec wIn = (
ONE & (initialised));
494 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
495 t[iVec]->
TFirst[0] = T.x[iVec];
496 t[iVec]->
TFirst[1] = T.y[iVec];
497 t[iVec]->
TFirst[2] = T.tx[iVec];
498 t[iVec]->
TFirst[3] = T.ty[iVec];
499 t[iVec]->
TFirst[4] = T.qp[iVec];
500 t[iVec]->
TFirst[5] = T.z[iVec];
502 t[iVec]->
CFirst[0] = T.C00[iVec];
503 t[iVec]->
CFirst[1] = T.C10[iVec];
504 t[iVec]->
CFirst[2] = T.C11[iVec];
505 t[iVec]->
CFirst[3] = T.C20[iVec];
506 t[iVec]->
CFirst[4] = T.C21[iVec];
507 t[iVec]->
CFirst[5] = T.C22[iVec];
508 t[iVec]->
CFirst[6] = T.C30[iVec];
509 t[iVec]->
CFirst[7] = T.C31[iVec];
510 t[iVec]->
CFirst[8] = T.C32[iVec];
511 t[iVec]->
CFirst[9] = T.C33[iVec];
512 t[iVec]->
CFirst[10] = T.C40[iVec];
513 t[iVec]->
CFirst[11] = T.C41[iVec];
514 t[iVec]->
CFirst[12] = T.C42[iVec];
515 t[iVec]->
CFirst[13] = T.C43[iVec];
516 t[iVec]->
CFirst[14] = T.C44[iVec];
518 t[iVec]->
chi2 = T.chi2[iVec];
519 t[iVec]->
NDF = (int)T.NDF[iVec];
538 fB2.Combine(fB[
i + 2], w[
i + 2]);
539 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
541 for (++
i;
i < nHits;
i++) {
546 fld.Set(fB0, fz0, fB1, fz1, fB2, fz2);
550 fvec w1 = (w[
i] & (initialised));
551 fvec wIn = (
ONE & (initialised));
575 if (extrapolateToTheEndOfSTS) {
585 fB2.Combine(fB[
i + 2], w[
i + 2]);
586 fld.Set(fB2, fz2, fB1, fz1, fB0, fz0);
593 fld.Set(fB0, fz0, fB1, fz1, fB2, fz2);
597 fvec wIn = (
ONE & (initialised));
615 const fvec zFinal = 100.f;
618 fvec(zFinal > Tout.
z);
622 for (iVec = 0; iVec < nTracks_SIMD; iVec++) {
623 t[iVec]->
TLast[0] = Tout.
x[iVec];
624 t[iVec]->
TLast[1] = Tout.
y[iVec];
625 t[iVec]->
TLast[2] = Tout.
tx[iVec];
626 t[iVec]->
TLast[3] = Tout.
ty[iVec];
627 t[iVec]->
TLast[4] = Tout.
qp[iVec];
628 t[iVec]->
TLast[5] = Tout.
z[iVec];
640 t[iVec]->
CLast[10] = Tout.
C40[iVec];
641 t[iVec]->
CLast[11] = Tout.
C41[iVec];
642 t[iVec]->
CLast[12] = Tout.
C42[iVec];
643 t[iVec]->
CLast[13] = Tout.
C43[iVec];
644 t[iVec]->
CLast[14] = Tout.
C44[iVec];
647 t[iVec]->
NDF = (int)Tout.
NDF[iVec];
660 fvec A0, A1 =
ZERO, A2 =
ZERO, A3 =
ZERO, A4 =
ZERO, A5 =
ZERO, a0, a1 =
ZERO, a2 =
ZERO, b0, b1 =
ZERO, b2 =
ZERO;
661 fvec z0, x, y, z, S, w, wz, wS;
672 for (
i = 0;
i < NHits;
i++) {
700 fvec det =
rcp(-A2 * A3A3 + A1 * (A3A4 + A3A4 - A1A5) + A0 * (A2A5 - A4A4));
701 fvec Ai0 = (-A4A4 + A2A5);
702 fvec Ai1 = (A3A4 - A1A5);
703 fvec Ai2 = (-A3A3 + A0 * A5);
704 fvec Ai3 = (-A2 * A3 + A1 * A4);
705 fvec Ai4 = (A1 * A3 - A0 * A4);
706 fvec Ai5 = (-A1 * A1 + A0 * A2);
709 t.
x = (Ai0 * a0 + Ai1 * a1 + Ai3 * a2) * det;
710 t.
tx = (Ai1 * a0 + Ai2 * a1 + Ai4 * a2) * det;
712 L = (Ai3 * a0 + Ai4 * a1 + Ai5 * a2) * det *
rcp(txtx1);
715 A2 = A2 + (A4 + A4 + A5 * L1) * L1;
717 det =
rcp(-A1 * A1 + A0 * A2);
719 t.
y = (A2 * b0 - A1 * b1) * det;
720 t.
ty = (-A1 * b0 + A0 * b1) * det;