45 LOG(fatal) <<
"VertexFitter: KfSetup is not set!";
48 if (
tracks.size() != linearizations.size()) {
49 LOG(fatal) <<
"VertexFitter: number of tracks and number of linearizations do not match!";
52 for (
unsigned int itr = 0; itr <
tracks.size(); ++itr) {
53 const auto trk =
tracks[itr];
54 const auto lin = linearizations[itr];
56 LOG(fatal) <<
"VertexFitter: null track or linearization pointer!";
58 if (!(fabs(trk->GetZ() - lin->GetZ()) < 1.e-10)) {
59 LOG(fatal) <<
"VertexFitter: track and linearization z positions do not match!";
63 std::vector<char> usedTracks(
tracks.size(), 0);
65 const auto& target =
fKfSetup->GetTarget();
85 const auto& C0 = vtx0.CovMatrix();
90 std::fill(usedTracks.begin(), usedTracks.end(), 0);
93 vtx.
SetZ(target.GetZ());
94 C(
Tag22) = target.GetDz() * target.GetDz() / 3.5 / 3.5;
108 for (
unsigned int itr = 0; itr <
tracks.size(); ++itr) {
116 const auto& tr = trackFitter.
Tr();
121 std::array<T, 6> m{tr.X(), tr.Y(), tr.Tx(), tr.Ty(), tr.Qp(), tr.Time()};
122 const auto& V = tr.GetCovMatrix();
126 double zeta[2] = {r0[0] - m[0], r0[1] - m[1]};
127 double S[3] = {(C0(
Tag11) + V[2]), -(C0(
Tag10) + V[1]), (C0(
Tag00) + V[0])};
128 double s = S[2] * S[0] - S[1] * S[1];
129 double chi2 = zeta[0] * zeta[0] * S[0] + 2 * zeta[0] * zeta[1] * S[1] + zeta[1] * zeta[1] * S[2];
139 std::array<T, 6> ml{lin.x, lin.y, lin.tx, lin.ty, lin.qp, lin.time};
140 double zeta[2] = {r0[0] - ml[0], r0[1] - ml[1]};
142 double s = V[0] * V[2] - V[1] * V[1];
144 LOG(warning) <<
"VertexFitter: track covariance matrix is singular, skipping track!";
147 a = m[2] + ((V[3] * V[2] - V[4] * V[1]) * zeta[0] + (-V[3] * V[1] + V[4] * V[0]) * zeta[1]) / s;
148 b = m[3] + ((V[6] * V[2] - V[7] * V[1]) * zeta[0] + (-V[6] * V[1] + V[7] * V[0]) * zeta[1]) / s;
165 double zeta[2] = {m[0] + a * (r[2] - r0[2]) - r[0],
166 m[1] + b * (r[2] - r0[2]) - r[1]};
176 double HCHt[3] = {CHt[0][0] - a * CHt[2][0],
177 CHt[1][0] - b * CHt[2][0], CHt[1][1] - b * CHt[2][1]};
181 double S[3] = {V[0] + HCHt[0],
182 V[1] + HCHt[1], V[2] + HCHt[2]};
186 double det = S[0] * S[2] - S[1] * S[1];
188 LOG(warn) <<
"VertexFitter: S matrix is singular, skipping track!";
189 LOG(warn) <<
" S00=" << S[0] <<
" S11=" << S[2] <<
" S01=" << S[1];
190 LOG(warn) <<
" V00=" << V[0] <<
" V11=" << V[2] <<
" V01=" << V[1];
191 LOG(warn) <<
" a = " << a <<
" b=" << b;
206 vtx.
ChiSq() += zeta[0] * zeta[0] * S[0] + 2 * zeta[0] * zeta[1] * S[1] + zeta[1] * zeta[1] * S[2];
214 for (
int i = 0; i < 3; ++i) {
215 K[i][0] = CHt[i][0] * S[0] + CHt[i][1] * S[1];
216 K[i][1] = CHt[i][0] * S[1] + CHt[i][1] * S[2];
221 for (
int i = 0; i < 3; ++i) {
222 r[i] += K[i][0] * zeta[0] + K[i][1] * zeta[1];
227 C(
Tag00) -= K[0][0] * CHt[0][0] + K[0][1] * CHt[0][1];
229 C(
Tag10) -= K[1][0] * CHt[0][0] + K[1][1] * CHt[0][1];
230 C(
Tag11) -= K[1][0] * CHt[1][0] + K[1][1] * CHt[1][1];
232 C(
Tag20) -= K[2][0] * CHt[0][0] + K[2][1] * CHt[0][1];
233 C(
Tag21) -= K[2][0] * CHt[1][0] + K[2][1] * CHt[1][1];
234 C(
Tag22) -= K[2][0] * CHt[2][0] + K[2][1] * CHt[2][1];
238 double dt = m[5] - vtx.
Time();
239 double s = V[15] +
C(
Tag33);
244 vtx.
Time() += Kt * dt;
253 LOG(warn) <<
"VertexFitter: only " << vtx.
GetNofTracks() <<
" tracks contributed to the vertex in the "
254 << iteration <<
" iteration, vertex fit failed.";
260 return std::make_tuple(vtx, usedTracks);
std::tuple< VertexD, std::vector< char > > FitVertex(const std::vector< const TrackParam< T > * > &tracks, const std::vector< const TrackParam< T > * > &linearizations, const VertexD &vtxGuess) const
Fit vertex from the given tracks.