15 #include "GaudiKernel/SystemOfUnits.h"
57 std::unique_ptr<Trk::Perigee>
60 for (
int i = 0;
i < 5;
i++) {
61 for (
int j = 0; j < 5; j++) {
76 matrixInversion5x5(
double a[5][5]) {
85 memset(&
b[0][0], 0,
sizeof(
b));
92 for (
i = 0;
i < 5;
i++) {
93 for (j =
i + 1; j < 5; j++)
94 if (std::abs(
a[
i][
i]) < std::abs(
a[j][
i])) {
95 for (
l = 0;
l < 5;
l++) temp[
l] =
a[
i][
l];
96 for (
l = 0;
l < 5;
l++)
a[
i][
l] =
a[j][
l];
97 for (
l = 0;
l < 5;
l++)
a[j][
l] = temp[
l];
98 for (
l = 0;
l < 5;
l++) temp[
l] =
b[
i][
l];
99 for (
l = 0;
l < 5;
l++)
b[
i][
l] =
b[j][
l];
100 for (
l = 0;
l < 5;
l++)
b[j][
l] = temp[
l];
103 for (j = 4; j > -1; j--) {
107 for (j =
i + 1; j < 5; j++) {
109 for (
k = 0;
k < 5;
k++) {
110 a[j][
k] +=
a[
i][
k] * factor;
111 b[j][
k] +=
b[
i][
k] * factor;
115 for (
i = 4;
i > 0;
i--) {
116 for (j =
i - 1; j > -1; j--) {
118 for (
k = 0;
k < 5;
k++) {
119 a[j][
k] +=
a[
i][
k] * factor;
120 b[j][
k] +=
b[
i][
k] * factor;
124 for (
i = 0;
i < 5;
i++)
for (j = 0; j < 5; j++)
a[
i][j] =
b[
i][j];
132 const std::string&
n,
135 , m_idHelper(nullptr) {
137 declareInterface<ITrackFitter>(
this);
151 ATH_CHECK(m_fieldCacheCondObjInputKey.initialize());
155 ATH_MSG_VERBOSE(
"initialize() successful in Trk::DistributedKalmanFilter");
156 return StatusCode::SUCCESS;
163 ATH_MSG_VERBOSE(
" finalize() successful in Trk::DistributedKalmanFilter");
164 return StatusCode::SUCCESS;
170 return(
one->position().mag() <
two->position().mag());
175 std::unique_ptr<Trk::Track>
184 ATH_MSG_ERROR(
"need estimated track parameters near " <<
"origin, reject fit");
189 ATH_MSG_ERROR(
"try to refit track with empty " <<
"vec<RIO_OnTrack>, reject fit");
199 for (;
it != itEnd; ++
it) {
202 <<
"objects! Skipped this MB..");
205 const PrepRawData* prepRD = (testROT) ? (testROT)->prepRawData() :
nullptr;
208 <<
"returns no object, ignore... ");
210 prepRDColl.push_back(prepRD);
221 return fit(ctx, prepRDColl, *minPar, runOutlier, matEffects);
229 const double C = 0.02999975;
230 const int nStepMax = 5;
232 double sint,
cost, sinf, cosf;
233 double gP[3], lP[3], gV[3],
a,
b,
c,
descr, CQ, Ac, Av;
234 double V[3], P[3], D[4], gB[3];
236 double sl,
ds,
path = 0.0;
247 if (pSB !=
nullptr) {
253 gP[0] = -Rk[0] * sinf;
254 gP[1] = Rk[0] * cosf;
259 getMagneticField(gP, gB, fieldCache);
261 c = D[0] * gP[0] + D[1] * gP[1] + D[2] * gP[2] + D[3];
262 b = D[0] * gV[0] + D[1] * gV[1] + D[2] * gV[2];
263 a = 0.5 * CQ * (gB[0] * (D[1] * gV[2] - D[2] * gV[1]) +
264 gB[1] * (D[2] * gV[0] - D[0] * gV[2]) +
265 gB[2] * (D[0] * gV[1] - D[1] * gV[0]));
270 printf(
"D<0 - extrapolation failed\n");
277 c = D[0] * gP[0] + D[1] * gP[1] + D[2] * gP[2] + D[3];
278 b = D[0] * gV[0] + D[1] * gV[1] + D[2] * gV[2];
280 (gB[0] * (D[1] * gV[2] - D[2] * gV[1]) +
281 gB[1] * (D[2] * gV[0] - D[0] * gV[2]) +
282 gB[2] * (D[0] * gV[1] - D[1] * gV[0]));
284 sl = sl * (1 -
a * sl /
b);
290 P[0] = gP[0] + gV[0] *
ds + Ac * (gV[1] * gB[2] - gV[2] * gB[1]);
291 P[1] = gP[1] + gV[1] *
ds + Ac * (gV[2] * gB[0] - gV[0] * gB[2]);
292 P[2] = gP[2] + gV[2] *
ds + Ac * (gV[0] * gB[1] - gV[1] * gB[0]);
293 V[0] = gV[0] + Av * (gV[1] * gB[2] - gV[2] * gB[1]);
294 V[1] = gV[1] + Av * (gV[2] * gB[0] - gV[0] * gB[2]);
295 V[2] = gV[2] + Av * (gV[0] * gB[1] - gV[1] * gB[0]);
296 for (
i = 0;
i < 3;
i++) {
300 getMagneticField(gP, gB, fieldCache);
307 Rf[2] = atan2(V[1], V[0]);
314 std::unique_ptr<Trk::TrkTrackState>
319 const double C = 0.02999975;
320 const double minStep = 30.0;
322 double J[5][5], Rf[5], AG[5][5], Gi[5][5], Gf[5][5], A[5][5];
325 bool samePlane =
false;
327 if (pSB !=
nullptr) {
336 double gP[3], gPi[3], lP[3], gV[3],
a,
b,
c,
s, J0[7][5],
descr, CQ, Ac, Av, Cc;
337 double V[3], P[3], M[3][3], D[4], Jm[7][7],
338 J1[5][7], gB[3], gBi[3], gBf[3], dBds[3], Buf[5][7], DVx, DVy, DVz;
343 double sint,
cost, sinf, cosf;
353 memset(&J0[0][0], 0,
sizeof(J0));
355 if (pSB !=
nullptr) {
369 J0[3][2] = -sinf * sint;
370 J0[3][3] = cosf *
cost;
371 J0[4][2] = cosf * sint;
372 J0[4][3] = sinf *
cost;
384 J0[3][2] = -sinf * sint;
385 J0[3][3] = cosf *
cost;
386 J0[4][2] = cosf * sint;
387 J0[4][3] = sinf *
cost;
392 for (
i = 0;
i < 3;
i++) gPi[
i] = gP[
i];
394 getMagneticField(gP, gB, fieldCache);
396 for (
i = 0;
i < 3;
i++) gBi[
i] = gB[
i];
398 c = D[0] * gP[0] + D[1] * gP[1] + D[2] * gP[2] + D[3];
399 b = D[0] * gV[0] + D[1] * gV[1] + D[2] * gV[2];
400 a = 0.5 * CQ * (gB[0] * (D[1] * gV[2] - D[2] * gV[1]) +
401 gB[1] * (D[2] * gV[0] - D[0] * gV[2]) +
402 gB[2] * (D[0] * gV[1] - D[1] * gV[0]));
411 bool useExpansion =
true;
414 if (fabs(
ratio) > 0.1) useExpansion =
false;
418 sl = sl * (1 -
a * sl /
b);
420 int signb = (
b < 0.0) ? -1 : 1;
421 sl = (-
b + signb * sqrt(
descr)) / (2 *
a);
424 if (fabs(sl) < minStep) nStepMax = 1;
426 nStepMax = (
int) (fabs(sl) / minStep) + 1;
428 if ((nStepMax < 0) || (nStepMax > 1000)) {
433 DVx = gV[1] * gB[2] - gV[2] * gB[1];
434 DVy = gV[2] * gB[0] - gV[0] * gB[2];
435 DVz = gV[0] * gB[1] - gV[1] * gB[0];
437 P[0] = gP[0] + gV[0] * sl + Ac * DVx;
438 P[1] = gP[1] + gV[1] * sl + Ac * DVy;
439 P[2] = gP[2] + gV[2] * sl + Ac * DVz;
440 V[0] = gV[0] + Av * DVx;
441 V[1] = gV[1] + Av * DVy;
442 V[2] = gV[2] + Av * DVz;
444 getMagneticField(P, gB, fieldCache);
446 for (
i = 0;
i < 3;
i++) gBf[
i] = gB[
i];
447 for (
i = 0;
i < 3;
i++) {
448 dBds[
i] = (gBf[
i] - gBi[
i]) / sl;
453 c = D[0] * gP[0] + D[1] * gP[1] + D[2] * gP[2] + D[3];
454 b = D[0] * gV[0] + D[1] * gV[1] + D[2] * gV[2];
455 a = 0.5 * CQ * (gB[0] * (D[1] * gV[2] - D[2] * gV[1]) +
456 gB[1] * (D[2] * gV[0] - D[0] * gV[2]) +
457 gB[2] * (D[0] * gV[1] - D[1] * gV[0]));
460 useExpansion = fabs(
ratio) <= 0.1;
464 sl = sl * (1 -
a * sl /
b);
471 int signb = (
b < 0.0) ? -1 : 1;
472 sl = (-
b + signb * sqrt(
descr)) / (2 *
a);
478 DVx = gV[1] * gB[2] - gV[2] * gB[1];
479 DVy = gV[2] * gB[0] - gV[0] * gB[2];
480 DVz = gV[0] * gB[1] - gV[1] * gB[0];
482 P[0] = gP[0] + gV[0] *
ds + Ac * DVx;
483 P[1] = gP[1] + gV[1] *
ds + Ac * DVy;
484 P[2] = gP[2] + gV[2] *
ds + Ac * DVz;
485 V[0] = gV[0] + Av * DVx;
486 V[1] = gV[1] + Av * DVy;
487 V[2] = gV[2] + Av * DVz;
488 for (
i = 0;
i < 3;
i++) {
492 for (
i = 0;
i < 3;
i++) gB[
i] += dBds[
i] *
ds;
498 Rf[2] = atan2(V[1], V[0]);
500 if (fabs(V[2]) > 1.0) {
512 for (
i = 0;
i < 3;
i++) gP[
i] = gPi[
i];
514 for (
i = 0;
i < 3;
i++) {
515 gB[
i] = 0.5 * (gBi[
i] + gBf[
i]);
518 c = D[0] * gP[0] + D[1] * gP[1] + D[2] * gP[2] + D[3];
519 b = D[0] * gV[0] + D[1] * gV[1] + D[2] * gV[2];
520 a = CQ * (gB[0] * (D[1] * gV[2] - D[2] * gV[1]) +
521 gB[1] * (D[2] * gV[0] - D[0] * gV[2]) +
522 gB[2] * (D[0] * gV[1] - D[1] * gV[0]));
525 useExpansion = fabs(
ratio) <= 0.1;
529 s =
s * (1 -
a *
s /
b);
536 int signb = (
b < 0.0) ? -1 : 1;
537 s = (-
b + signb * sqrt(
descr)) / (2 *
a);
542 Cc = 0.5 *
s *
s * C;
544 DVx = gV[1] * gB[2] - gV[2] * gB[1];
545 DVy = gV[2] * gB[0] - gV[0] * gB[2];
546 DVz = gV[0] * gB[1] - gV[1] * gB[0];
548 P[0] = gP[0] + gV[0] *
s + Ac * DVx;
549 P[1] = gP[1] + gV[1] *
s + Ac * DVy;
550 P[2] = gP[2] + gV[2] *
s + Ac * DVz;
552 V[0] = gV[0] + Av * DVx;
553 V[1] = gV[1] + Av * DVy;
554 V[2] = gV[2] + Av * DVz;
558 memset(&Jm[0][0], 0,
sizeof(Jm));
560 for (
i = 0;
i < 3;
i++)
for (j = 0; j < 3; j++) M[
i][j] = pSE->
getRotMatrix(
i, j);
562 double coeff[3], dadVx, dadVy, dadVz, dadQ, dsdx, dsdy, dsdz, dsdVx, dsdVy, dsdVz, dsdQ;
563 coeff[0] = -
c *
c / (
b *
b *
b);
564 coeff[1] =
c * (1.0 + 3.0 *
c *
a / (
b *
b)) / (
b *
b);
565 coeff[2] = -(1.0 + 2.0 *
c *
a / (
b *
b)) /
b;
567 dadVx = 0.5 * CQ * (-D[1] * gB[2] + D[2] * gB[1]);
568 dadVy = 0.5 * CQ * (D[0] * gB[2] - D[2] * gB[0]);
569 dadVz = 0.5 * CQ * (-D[0] * gB[1] + D[1] * gB[0]);
570 dadQ = 0.5 * C * (D[0] * DVx + D[1] * DVy + D[2] * DVz);
572 dsdx = coeff[2] * D[0];
573 dsdy = coeff[2] * D[1];
574 dsdz = coeff[2] * D[2];
575 dsdVx = coeff[0] * dadVx + coeff[1] * D[0];
576 dsdVy = coeff[0] * dadVy + coeff[1] * D[1];
577 dsdVz = coeff[0] * dadVz + coeff[1] * D[2];
578 dsdQ = coeff[0] * dadQ;
580 Jm[0][0] = 1.0 + V[0] * dsdx;
581 Jm[0][1] = V[0] * dsdy;
582 Jm[0][2] = V[0] * dsdz;
584 Jm[0][3] =
s + V[0] * dsdVx;
585 Jm[0][4] = V[0] * dsdVy + Ac * gB[2];
586 Jm[0][5] = V[0] * dsdVz - Ac * gB[1];
587 Jm[0][6] = V[0] * dsdQ + Cc * DVx;
589 Jm[1][0] = V[1] * dsdx;
590 Jm[1][1] = 1.0 + V[1] * dsdy;
591 Jm[1][2] = V[1] * dsdz;
593 Jm[1][3] = V[1] * dsdVx - Ac * gB[2];
594 Jm[1][4] =
s + V[1] * dsdVy;
595 Jm[1][5] = V[1] * dsdVz + Ac * gB[0];
596 Jm[1][6] = V[1] * dsdQ + Cc * DVy;
598 Jm[2][0] = V[2] * dsdx;
599 Jm[2][1] = V[2] * dsdy;
600 Jm[2][2] = 1.0 + V[2] * dsdz;
601 Jm[2][3] = V[2] * dsdVx + Ac * gB[1];
602 Jm[2][4] = V[2] * dsdVy - Ac * gB[0];
603 Jm[2][5] =
s + V[2] * dsdVz;
604 Jm[2][6] = V[2] * dsdQ + Cc * DVz;
606 Jm[3][0] = dsdx * CQ * DVx;
607 Jm[3][1] = dsdy * CQ * DVx;
608 Jm[3][2] = dsdz * CQ * DVx;
610 Jm[3][3] = 1.0 + dsdVx * CQ * DVx;
611 Jm[3][4] = CQ * (dsdVy * DVx +
s * gB[2]);
612 Jm[3][5] = CQ * (dsdVz * DVx -
s * gB[1]);
614 Jm[3][6] = (CQ * dsdQ + C *
s) * DVx;
616 Jm[4][0] = dsdx * CQ * DVy;
617 Jm[4][1] = dsdy * CQ * DVy;
618 Jm[4][2] = dsdz * CQ * DVy;
620 Jm[4][3] = CQ * (dsdVx * DVy -
s * gB[2]);
621 Jm[4][4] = 1.0 + dsdVy * CQ * DVy;
622 Jm[4][5] = CQ * (dsdVz * DVy +
s * gB[0]);
624 Jm[4][6] = (CQ * dsdQ + C *
s) * DVy;
626 Jm[5][0] = dsdx * CQ * DVz;
627 Jm[5][1] = dsdy * CQ * DVz;
628 Jm[5][2] = dsdz * CQ * DVz;
629 Jm[5][3] = CQ * (dsdVx * DVz +
s * gB[1]);
630 Jm[5][4] = CQ * (dsdVy * DVz -
s * gB[0]);
631 Jm[5][5] = 1.0 + dsdVz * CQ * DVz;
632 Jm[5][6] = (CQ * dsdQ + C *
s) * DVz;
636 memset(&J1[0][0], 0,
sizeof(J1));
644 J1[2][3] = -V[1] / (V[0] * V[0] + V[1] * V[1]);
645 J1[2][4] = V[0] / (V[0] * V[0] + V[1] * V[1]);
646 J1[3][5] = -1.0 / sqrt(1 - V[2] * V[2]);
649 for (
i = 0;
i < 7;
i++) {
650 for (j = 0; j < 2; j++)
651 Buf[j][
i] = J1[j][0] * Jm[0][
i] + J1[j][1] * Jm[1][
i] + J1[j][2] * Jm[2][
i];
652 Buf[2][
i] = J1[2][3] * Jm[3][
i] + J1[2][4] * Jm[4][
i];
653 Buf[3][
i] = J1[3][5] * Jm[5][
i];
654 Buf[4][
i] = Jm[6][
i];
657 if (pSB !=
nullptr) {
658 for (
i = 0;
i < 5;
i++) {
659 J[
i][0] = Buf[
i][0] * J0[0][0] + Buf[
i][1] * J0[1][0] + Buf[
i][2] * J0[2][0];
660 J[
i][1] = Buf[
i][0] * J0[0][1] + Buf[
i][1] * J0[1][1] + Buf[
i][2] * J0[2][1];
661 J[
i][2] = Buf[
i][3] * J0[3][2] + Buf[
i][4] * J0[4][2];
662 J[
i][3] = Buf[
i][3] * J0[3][3] + Buf[
i][4] * J0[4][3] + Buf[
i][5] * J0[5][3];
666 for (
i = 0;
i < 5;
i++) {
667 J[
i][0] = Buf[
i][0] * J0[0][0] + Buf[
i][1] * J0[1][0];
669 J[
i][2] = Buf[
i][0] * J0[0][2] + Buf[
i][1] * J0[1][2] + Buf[
i][3] * J0[3][2] + Buf[
i][4] * J0[4][2];
670 J[
i][3] = Buf[
i][3] * J0[3][3] + Buf[
i][4] * J0[4][3] + Buf[
i][5] * J0[5][3];
680 memset(&J[0][0], 0,
sizeof(J));
681 for (
i = 0;
i < 5;
i++) J[
i][
i] = 1.0;
684 for (
i = 0;
i < 5;
i++)
for (j = 0; j < 5; j++) {
688 for (
i = 0;
i < 5;
i++)
for (j =
i; j < 5; j++) {
690 for (
m = 0;
m < 5;
m++) Gf[
i][j] += AG[
i][
m] * J[j][
m];
694 auto pTE = std::make_unique<Trk::TrkTrackState>(pTS);
696 pTE->setTrackState(Rf);
697 pTE->setTrackCovariance(Gf);
698 pTE->attachToSurface(pSE);
699 pTE->applyMaterialEffects();
701 for (
i = 0;
i < 5;
i++)
for (j = 0; j < 5; j++) {
702 Gi[
i][j] = pTE->getTrackCovariance(
i, j);
705 matrixInversion5x5(Gi);
707 for (
i = 0;
i < 5;
i++)
for (j = 0; j < 5; j++) {
709 for (
m = 0;
m < 5;
m++) A[
i][j] += AG[
m][
i] * Gi[
m][j];
711 pTE->setPreviousState(pTS);
712 pTE->setSmootherGain(A);
724 pvpTrackStates.push_back(std::make_unique<Trk::TrkTrackState>(pInitState));
726 for (std::unique_ptr<TrkBaseNode>&
node : pvpNodes) {
727 pSE =
node->getSurface();
728 std::unique_ptr<Trk::TrkTrackState> pNS =
extrapolate(pTS, pSB, pSE, fieldCache);
732 pvpTrackStates.push_back(std::move(pNS));
744 node->validateMeasurement(state);
745 node->updateTrackState(state);
756 for (std::unique_ptr<TrkTrackState>& state : pvpTrackStates) {
757 state->runSmoother();
762 for (std::unique_ptr<TrkBaseNode>&
node : pvpNodes) {
763 node->updateInternal();
771 for (std::unique_ptr<TrkBaseNode>&
node : pvpNodes) {
772 dchi2 = (
node->getChi2Distance(
node->getTrackState())) /
node->getNdof();
774 if (
node->isValidated()) nOutl++;
775 node->setNodeState(0);
776 }
else node->setNodeState(1);
785 std::unique_ptr<Trk::TrackParameters> pTP {};
786 if (
type == 0)
return pTSS;
794 if (pPS ==
nullptr)
return pTSS;
798 for (
int i = 0;
i < 5;
i++) {
799 for (
int j = 0; j < 5; j++) {
809 }
else if (
type == 3) {
812 if (pLS ==
nullptr)
return pTSS;
815 for (
int i = 0;
i < 5;
i++) {
816 for (
int j = 0; j < 5; j++) {
821 pTP = std::make_unique<Trk::AtaStraightLine>(pTS->
getTrackState(0),
829 if (pTP ==
nullptr)
return nullptr;
831 auto pRIO = std::unique_ptr<Trk::RIO_OnTrack>(m_ROTcreator->correct(*pPRD, *pTP));
832 if (pRIO ==
nullptr) {
841 std::unique_ptr<Trk::Track>
843 const EventContext& ctx,
848 const double outlCut = 12.0;
849 const double rlSili = 0.022;
850 const double rlTrt = 0.005;
854 double Rk[5], C[3],
N[3], M[3][3];
859 Eigen::Vector3d
mx,
my,
mz;
862 bool badTrack =
false;
866 if (prepRDColl.empty()) {
867 ATH_MSG_ERROR(
"try to fit empty vec<PrepRawData>, reject fit");
876 (estimatedParametersNearOrigine.
position(),
877 estimatedParametersNearOrigine.
momentum());
879 if (!is_sorted(inputPRDColl.begin(), inputPRDColl.end(), *compareHits)) std::sort(
880 inputPRDColl.begin(), inputPRDColl.end(), *compareHits);
883 for (
const auto *prdIt : inputPRDColl) {
884 if (!prdIt->detectorElement())
continue;
889 ->surface(prdIt->identify())
896 pP =
dynamic_cast<const Perigee*
>(&estimatedParametersNearOrigine);
898 ATH_MSG_DEBUG(
" fit needs perigee parameters - creating it");
900 m_extrapolator->extrapolateDirectly(ctx,
901 estimatedParametersNearOrigine,
907 pP =
dynamic_cast<const Perigee*
>(pTP);
909 ATH_MSG_ERROR(
"failed to create perigee parameters, reject fit");
913 Rk[0] = pP->parameters()[
Trk::d0];
914 Rk[1] = pP->parameters()[
Trk::z0];
931 "-> Multiple Scattering and Bremm treatments switched on");
932 }
else ATH_MSG_WARNING(
"Material setting " << matEffects <<
"not supported !");
944 for (
const auto *prdIt : inputPRDColl) {
945 if (prdIt->detectorElement() ==
nullptr) {
950 if (m_idHelper->is_indet(
ID) || m_idHelper->is_sct(
ID) ||
951 m_idHelper->is_pixel(
ID) || m_idHelper->is_trt(
ID)) {
952 if (m_idHelper->is_pixel(
ID) || m_idHelper->is_sct(
ID)) {
953 const Trk::Surface& rSurf = prdIt->detectorElement()->surface();
957 C[0] = rSurf.
center().x();
958 C[1] = rSurf.
center().y();
959 C[2] = rSurf.
center().z();
960 mx = rSurf.
transform().rotation().block(0, 0, 3, 1);
961 my = rSurf.
transform().rotation().block(0, 1, 3, 1);
962 mz = rSurf.
transform().rotation().block(0, 2, 3, 1);
963 for (
i = 0;
i < 3;
i++) {
968 pvpSurfaces.push_back(std::make_unique<TrkPlanarSurface>(C,
N, M, rlSili));
969 pS = pvpSurfaces.back().get();
970 if (m_idHelper->is_pixel(
ID)) {
971 pvpNodes.push_back(std::make_unique<TrkPixelNode>(pS, 200.0, prdIt));
973 if (fabs(
N[2]) < 0.1) {
974 pvpNodes.push_back(std::make_unique<TrkClusterNode>(pS, 200.0, prdIt));
976 pvpNodes.push_back(std::make_unique<TrkEndCapClusterNode>(pS, 200.0, prdIt));
981 if (m_idHelper->is_trt(
ID)) {
984 const Trk::Surface& rSurf = prdIt->detectorElement()->surface(
ID);
987 prdIt->detectorElement()->surface().bounds();
989 C[0] = rSurf.
center().x();
990 C[1] = rSurf.
center().y();
991 C[2] = rSurf.
center().z();
992 double cosFs = C[0] / sqrt(C[0] * C[0] + C[1] * C[1]);
993 double sinFs = C[1] / sqrt(C[0] * C[0] + C[1] * C[1]);
996 prdIt->detectorElement()->surface().normal();
998 if (fabs(rNorm.z()) > 0.2)
isBarrel =
false;
1032 len = 0.5 * (ecBounds.
rMax() - ecBounds.
rMin());
1046 pvpSurfaces.push_back(std::make_unique<TrkPlanarSurface>(C,
N, M, rlTrt));
1047 pS = pvpSurfaces.back().get();
1048 pvpNodes.push_back(std::make_unique<TrkTrtNode>(pS, 200.0, -len, len, prdIt));
1053 ATH_MSG_WARNING(
" PrepRawData is neither identified nor supported !");
1057 << pvpNodes.size() <<
"/" << pvpSurfaces.size());
1060 m_fieldCacheCondObjInputKey, ctx
1063 if (!readHandle.isValid()) {
1064 std::stringstream
msg;
1065 msg <<
"Failed to retrieve magmnetic field conditions data "
1066 << m_fieldCacheCondObjInputKey.key() <<
".";
1067 throw std::runtime_error(
msg.str());
1074 fieldCondObj->getInitializedCache(fieldCache);
1083 if (runForwardKalmanFilter(pvpNodes, pvpTrackStates, pInitState, fieldCache)) {
1084 runSmoother(pvpTrackStates);
1089 if ((nOutl * 1.0 /pvpNodes.size()) > 0.3) {
1093 if ((nOutl != 0) && (!badTrack)) {
1094 pvpTrackStates.clear();
1095 runForwardKalmanFilter(pvpNodes, pvpTrackStates, pInitState, fieldCache);
1096 runSmoother(pvpTrackStates);
1101 if ((nAmbHits != 0) && (!badTrack)) {
1102 calculateLRsolution(pvpNodes);
1103 pvpTrackStates.clear();
1104 runForwardKalmanFilter(pvpNodes, pvpTrackStates, pInitState, fieldCache);
1105 runSmoother(pvpTrackStates);
1110 pTS = pvpTrackStates.begin()->get();
1112 createMeasuredPerigee(pTS)
1115 <<
" z0=" << pMP->parameters()[
Trk::z0]
1116 <<
" phi=" << pMP->parameters()[
Trk::phi0]
1117 <<
" theta=" << pMP->parameters()[
Trk::theta]
1123 auto pvTS = std::make_unique<Trk::TrackStates>();
1125 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
1131 pvTS->push_back(pTSOS);
1136 for (std::unique_ptr<TrkBaseNode>&
node : pvpNodes) {
1137 if (
node->isValidated()) {
1139 if (pTSS !=
nullptr) {
1140 pvTS->push_back(pTSS);
1147 auto pFQ = std::make_unique<Trk::FitQuality>(
chi2,
ndof);
1148 ATH_MSG_DEBUG(pvTS->size() <<
" new RIO_OnTrack(s) created");
1150 fittedTrack =
new Track(
info, std::move(pvTS), std::move(pFQ));
1152 fittedTrack =
nullptr;
1156 fittedTrack =
nullptr;
1159 return std::unique_ptr<Trk::Track>(fittedTrack);
1162 std::unique_ptr<Trk::Track>
1164 const EventContext& ctx,
1169 if (inputRotColl.empty()) {
1170 ATH_MSG_ERROR(
"try to fit empty vec<MeasurementBase>, reject fit");
1177 for (;
it != itEnd; ++
it) {
1180 <<
"objects! Skipped this MB..");
1186 <<
"returns no object, ignore... ");
1188 prepRDColl.push_back(prepRD);
1193 prepRDColl, estimatedParametersNearOrigine, runOutlier, matEffects);
1196 std::unique_ptr<Trk::Track>
1198 const EventContext& ctx,
1203 ATH_MSG_VERBOSE(
"--> enter DistributedKalmanFilter::fit(Track,easurementSet,)");
1208 <<
"origin, reject fit");
1214 <<
"vec<RIO_OnTrack>, reject fit");
1225 for (;
it != itEnd; ++
it) {
1228 <<
"objects! Skipped this MB..");
1231 const PrepRawData* prepRD = (testROT) ? (testROT)->prepRawData() :
nullptr;
1234 <<
"returns no object, ignore... ");
1236 prepRDColl.push_back(prepRD);
1245 it = inputRotColl.begin();
1246 itEnd = inputRotColl.end();
1247 for (;
it != itEnd; ++
it) {
1250 <<
"objects! Skipped this MB..");
1256 <<
"returns no object, ignore... ");
1258 prepRDColl.push_back(prepRD);
1262 return fit(ctx, prepRDColl, *minPar, runOutlier, matEffects);
1266 std::unique_ptr<Trk::Track>
1268 const EventContext& ctx,
1274 <<
"(RIO_OnTrackSet,TrackParameters,,)");
1277 if (inputRotColl.empty()) {
1279 <<
"extended vec<RIO_OnTrack>, reject fit");
1288 <<
"this is improvised.");
1291 RIO_OnTrackSet::const_iterator
it = inputRotColl.begin();
1292 RIO_OnTrackSet::const_iterator itEnd = inputRotColl.end();
1294 for (;
it != itEnd; ++
it) {
1295 const PrepRawData* prepRD = ((*it)->prepRawData());
1298 <<
"returns no object, ignore... ");
1300 prepRDColl.push_back(prepRD);
1307 ctx, prepRDColl, estimatedParametersNearOrigine, runOutlier, matEffects);