Belle II Software light-2406-ragdoll
MassVertexFitKFit.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * External Contributor: J. Tanaka *
5 * *
6 * See git log for contributors and copyright holders. *
7 * This file is licensed under LGPL-3.0, see LICENSE.md. *
8 **************************************************************************/
9
10#include <TMatrixFSym.h>
11
12#include <analysis/VertexFitting/KFit/MakeMotherKFit.h>
13#include <analysis/VertexFitting/KFit/MassVertexFitKFit.h>
14#include <analysis/utility/CLHEPToROOT.h>
15#include <framework/gearbox/Const.h>
16
17using namespace std;
18using namespace Belle2;
19using namespace Belle2::analysis;
20using namespace CLHEP;
21
23 m_BeforeVertex(HepPoint3D(0., 0., 0.)),
24 m_AfterVertexError(HepSymMatrix(3, 0))
25{
26 m_FlagFitted = false;
28 m_V_E = HepMatrix(3, 3, 0);
29 m_v = HepMatrix(3, 1, 0);
30 m_v_a = HepMatrix(3, 1, 0);
31 m_InvariantMass = -1.0;
32}
33
34
36
37
41
43}
44
46{
47 m_BeforeVertex = HepPoint3D(v.X(), v.Y(), v.Z());
49 return m_ErrorCode;
50}
51
55
57}
58
59
62 m_IsFixMass.push_back(true);
63
65}
66
67
70 m_IsFixMass.push_back(false);
71
73}
74
75
79}
80
81
85}
86
87
88const HepPoint3D
89MassVertexFitKFit::getVertex(const int flag) const
90{
91 if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
92
93 switch (flag) {
95 return m_BeforeVertex;
96
98 return m_AfterVertex;
99
100 default:
101 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
102 return HepPoint3D();
103 }
104}
105
106
107const HepSymMatrix
109{
110 return m_AfterVertexError;
111}
112
113
114double
116{
117 return m_InvariantMass;
118}
119
120
121double
123{
124 return m_CHIsq;
125}
126
127
128const HepMatrix
130{
131 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
132
133 return m_AfterTrackVertexError[id];
134}
135
136
137double
139{
140 if (!isFitted()) return -1;
141 if (!isTrackIDInRange(id)) return -1;
142
143 if (m_IsFixMass[id]) {
144
145 HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
146 int err_inverse = 0;
147 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
148
149 if (err_inverse) {
150 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
151 return -1;
152 }
153
154 return chisq;
155
156 } else {
157
158 HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
159 int err_inverse = 0;
160 const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
161
162 if (err_inverse) {
163 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
164 return -1;
165 }
166
167 return chisq;
168 }
169}
170
171
172const HepMatrix
173MassVertexFitKFit::getCorrelation(const int id1, const int id2, const int flag) const
174{
175 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
176 if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
177 if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
178
179 switch (flag) {
181 return KFitBase::getCorrelation(id1, id2, flag);
182
184 return makeError3(
185 this->getTrackMomentum(id1),
186 this->getTrackMomentum(id2),
187 m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
188 KFitConst::kNumber7 * (id2 + 1)),
189 m_IsFixMass[id1],
190 m_IsFixMass[id2]);
191
192 default:
193 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
194 return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
195 }
196}
197
198
201 return KFitBase::doFit2();
202}
203
204
208 {
210 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
211 return m_ErrorCode;
212 }
213
214
215 if (m_IsFixMass.size() == 0)
216 {
217 // If no fix_mass flag at all,
218 // all tracks are considered to be fixed at mass.
219 for (int i = 0; i < m_TrackCount; i++) this->fixMass();
220 } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
221 {
223 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
224 return m_ErrorCode;
225 }
226
227
228 int index = 0;
229 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
230 m_property = HepMatrix(m_TrackCount, 3, 0);
231 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
232
233 for (auto& track : m_Tracks)
234 {
235 // momentum x,y,z and position x,y,z
236 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
237 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
238 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
239 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
240 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
241 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
242 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
243 // these error
244 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
245 // charge, mass, a
246 m_property[index][0] = track.getCharge();
247 m_property[index][1] = track.getMass();
248 const double c = Belle2::Const::speedOfLight * 1e-4;
249 m_property[index][2] = -c * m_MagneticField * track.getCharge();
250 index++;
251 }
252
253 // error between track and track
255 {
256 this->prepareCorrelation();
258 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
259 return m_ErrorCode;
260 }
261 }
262
263 // vertex
264 m_v_a[0][0] = m_BeforeVertex.x();
265 m_v_a[1][0] = m_BeforeVertex.y();
266 m_v_a[2][0] = m_BeforeVertex.z();
267
268 // set member matrix
269 m_al_1 = m_al_0;
270
273 m_E = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 3);
274 m_d = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
275 m_V_D = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
276 m_lam = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
277 m_lam0 = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
278 m_V_Dt = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
280
282}
283
284
287 // vertex
288 for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
289
291}
292
293
296 if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
297 {
299 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
300 return m_ErrorCode;
301 }
302
303 int row = 0, col = 0;
304
305 for (auto& hm : m_BeforeCorrelation)
306 {
307 // counter
308 row++;
309 if (row == m_TrackCount) {
310 col++;
311 row = col + 1;
312 }
313
314 int ii = 0, jj = 0;
315 for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
316 for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
317 m_V_al_0[i][j] = hm[ii][jj];
318 jj++;
319 }
320 jj = 0;
321 ii++;
322 }
323 }
324
326}
327
328
331 Hep3Vector h3v;
332 int index = 0;
333 for (auto& pdata : m_Tracks)
334 {
335 // tracks
336 // momentum
337 h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
338 h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
339 h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
340 if (m_IsFixMass[index])
341 pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
342 else
343 pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
344 // position
345 pdata.setPosition(HepPoint3D(
346 m_al_1[index * KFitConst::kNumber7 + 4][0],
347 m_al_1[index * KFitConst::kNumber7 + 5][0],
349 // error of the tracks
350 pdata.setError(this->makeError3(pdata.getMomentum(),
351 m_V_al_1.sub(
352 index * KFitConst::kNumber7 + 1,
353 (index + 1)*KFitConst::kNumber7,
354 index * KFitConst::kNumber7 + 1,
355 (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
357 if (m_ErrorCode != KFitError::kNoError) break;
358 index++;
359 }
360
361 // vertex
362 m_AfterVertex.setX(m_v_a[0][0]);
363 m_AfterVertex.setY(m_v_a[1][0]);
364 m_AfterVertex.setZ(m_v_a[2][0]);
365 // error of the vertex
366 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++)
367 {
368 m_AfterVertexError[i][j] = m_V_E[i][j];
369 }
370 // error between vertex and tracks
371 for (int i = 0; i < m_TrackCount; i++)
372 {
373 HepMatrix hm(3, KFitConst::kNumber7, 0);
374 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
375 hm[j][k] = m_Cov_v_al_1[j][KFitConst::kNumber7 * i + k];
376 }
377 if (m_IsFixMass[i])
378 m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
379 else
380 m_AfterTrackVertexError.push_back(hm);
381 }
382
384}
385
386
389 // Mass Constraint
390 HepMatrix al_1_prime(m_al_1);
391 HepMatrix Sum_al_1(4, 1, 0);
392 std::vector<double> energy(m_TrackCount);
393 double a;
394
395 for (int i = 0; i < m_TrackCount; i++)
396 {
397 a = m_property[i][2];
398 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_v_a[1][0] - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
399 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_v_a[0][0] - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
400 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
401 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
402 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
403 m_property[i][1] * m_property[i][1]);
404 if (m_IsFixMass[i])
405 Sum_al_1[3][0] += energy[i];
406 else
407 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
408 }
409
410 for (int i = 0; i < m_TrackCount; i++)
411 {
412 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
413 }
414
415 m_d[2 * m_TrackCount][0] =
416 + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
417 - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
419
420 double Sum_a = 0., Sum_tmpx = 0., Sum_tmpy = 0.;
421 for (int i = 0; i < m_TrackCount; i++)
422 {
423 if (energy[i] == 0) {
425 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
426 return m_ErrorCode;
427 }
428
429 a = m_property[i][2];
430
431 if (m_IsFixMass[i]) {
432 double invE = 1. / energy[i];
433 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
434 Sum_al_1[0][0]);
435 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
436 Sum_al_1[1][0]);
437 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE -
438 Sum_al_1[2][0]);
439 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 0.;
440 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
441 Sum_al_1[1][0]) * a;
442 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
443 Sum_al_1[0][0]) * a;
444 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
445 Sum_tmpx += al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE * a;
446 Sum_tmpy += al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE * a;
447 } else {
448 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
449 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
450 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
451 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
452 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
453 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
454 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
455 }
456 Sum_a += a;
457 }
458
459 // m_E
460 m_E[2 * m_TrackCount][0] = -2.*Sum_al_1[1][0] * Sum_a + 2.*Sum_al_1[3][0] * Sum_tmpy;
461 m_E[2 * m_TrackCount][1] = 2.*Sum_al_1[0][0] * Sum_a - 2.*Sum_al_1[3][0] * Sum_tmpx;
462 m_E[2 * m_TrackCount][2] = 0.;
463
464 for (int i = 0; i < m_TrackCount; i++)
465 {
466 double S, U;
467 double sininv;
468
469 double px = m_al_1[i * KFitConst::kNumber7 + 0][0];
470 double py = m_al_1[i * KFitConst::kNumber7 + 1][0];
471 double pz = m_al_1[i * KFitConst::kNumber7 + 2][0];
472 double x = m_al_1[i * KFitConst::kNumber7 + 4][0];
473 double y = m_al_1[i * KFitConst::kNumber7 + 5][0];
474 double z = m_al_1[i * KFitConst::kNumber7 + 6][0];
475 a = m_property[i][2];
476
477 double pt = sqrt(px * px + py * py);
478
479 if (pt == 0) {
481 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
482 return m_ErrorCode;
483 }
484
485 double invPt = 1. / pt;
486 double invPt2 = invPt * invPt;
487 double dlx = m_v_a[0][0] - x;
488 double dly = m_v_a[1][0] - y;
489 double dlz = m_v_a[2][0] - z;
490 double a1 = -dlx * py + dly * px;
491 double a2 = dlx * px + dly * py;
492 double r2d2 = dlx * dlx + dly * dly;
493 double Rx = dlx - 2.*px * a2 * invPt2;
494 double Ry = dly - 2.*py * a2 * invPt2;
495
496 if (a != 0.) { // charged
497
498 double B = a * a2 * invPt2;
499 if (fabs(B) > 1.) {
501 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
502 return m_ErrorCode;
503 }
504 // sin^(-1)(B)
505 sininv = asin(B);
506 double tmp0 = 1.0 - B * B;
507 if (tmp0 == 0) {
509 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
510 return m_ErrorCode;
511 }
512 // 1/sqrt(1-B^2)
513 double sqrtag = 1.0 / sqrt(tmp0);
514 S = sqrtag * invPt2;
515 U = dlz - pz * sininv / a;
516
517 } else { // neutral
518
519 sininv = 0.0;
520 S = invPt2;
521 U = dlz - pz * a2 * invPt2;
522
523 }
524
525 // d
526 m_d[i * 2 + 0][0] = a1 - 0.5 * a * r2d2;
527 m_d[i * 2 + 1][0] = U * pt;
528
529 // D
530 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 0] = dly;
531 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 1] = -dlx;
532 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 2] = 0.0;
533 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 4] = py + a * dlx;
534 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 5] = -px + a * dly;
535 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 6] = 0.0;
536 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 0] = -pz * pt * S * Rx + U * px * invPt;
537 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 1] = -pz * pt * S * Ry + U * py * invPt;
538 if (a != 0.)
539 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -sininv * pt / a;
540 else
541 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -a2 * invPt;
542 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 4] = px * pz * pt * S;
543 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 5] = py * pz * pt * S;
544 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 6] = -pt;
545
546 // E
547 m_E[i * 2 + 0][0] = -py - a * dlx;
548 m_E[i * 2 + 0][1] = px - a * dly;
549 m_E[i * 2 + 0][2] = 0.0;
550 m_E[i * 2 + 1][0] = -px * pz * pt * S;
551 m_E[i * 2 + 1][1] = -py * pz * pt * S;
552 m_E[i * 2 + 1][2] = pt;
553 }
554
556}
557
558
561 m_NDF = 2 * m_TrackCount - 3 + 1;
562
564}
565
567{
568 MakeMotherKFit kmm;
570 unsigned n = getTrackCount();
571 for (unsigned i = 0; i < n; ++i) {
573 getTrack(i).getCharge());
575 for (unsigned j = i + 1; j < n; ++j) {
577 }
578 }
579 kmm.setVertex(getVertex());
581 m_ErrorCode = kmm.doMake();
583 return m_ErrorCode;
584 double chi2 = getCHIsq();
585 int ndf = getNDF();
586 double prob = TMath::Prob(chi2, ndf);
587 //
588 bool haschi2 = mother->hasExtraInfo("chiSquared");
589 if (haschi2) {
590 mother->setExtraInfo("chiSquared", chi2);
591 mother->setExtraInfo("ndf", ndf);
592 } else {
593 mother->addExtraInfo("chiSquared", chi2);
594 mother->addExtraInfo("ndf", ndf);
595 }
596
597 mother->updateMomentum(
598 CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
599 CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
600 CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
601 prob);
603 return m_ErrorCode;
604}
DataType Z() const
access variable Z (= .at(2) without boundary check)
Definition: B2Vector3.h:435
DataType X() const
access variable X (= .at(0) without boundary check)
Definition: B2Vector3.h:431
DataType Y() const
access variable Y (= .at(1) without boundary check)
Definition: B2Vector3.h:433
static const double speedOfLight
[cm/ns]
Definition: Const.h:695
Class to store reconstructed particles.
Definition: Particle.h:75
void setExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition: Particle.cc:1317
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
Definition: Particle.cc:1266
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition: Particle.cc:1336
void updateMomentum(const ROOT::Math::PxPyPzEVector &p4, const ROOT::Math::XYZVector &vertex, const TMatrixFSym &errMatrix, double pValue)
Sets Lorentz vector, position, 7x7 error matrix and p-value.
Definition: Particle.h:386
int m_NecessaryTrackCount
Number needed tracks to perform fit.
Definition: KFitBase.h:303
double m_MagneticField
Magnetic field.
Definition: KFitBase.h:311
CLHEP::HepMatrix m_al_1
See J.Tanaka Ph.D (2001) p136 for definition.
Definition: KFitBase.h:259
CLHEP::HepMatrix m_V_Dt
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:289
virtual enum KFitError::ECode setCorrelation(const CLHEP::HepMatrix &c)
Set a correlation matrix.
Definition: KFitBase.cc:70
const CLHEP::HepSymMatrix makeError3(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e, const bool is_fix_mass) const
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition: KFitBase.cc:320
const CLHEP::HepSymMatrix getTrackError(const int id) const
Get an error matrix of the track.
Definition: KFitBase.cc:168
const CLHEP::HepLorentzVector getTrackMomentum(const int id) const
Get a Lorentz vector of the track.
Definition: KFitBase.cc:154
CLHEP::HepMatrix m_lam
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:276
enum KFitError::ECode doFit2(void)
Perform a fit (used in VertexFitKFit::doFit() and MassVertexFitKFit::doFit()).
Definition: KFitBase.cc:578
CLHEP::HepMatrix m_E
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:279
const HepPoint3D getTrackPosition(const int id) const
Get a position of the track.
Definition: KFitBase.cc:161
CLHEP::HepMatrix m_property
Container of charges and masses.
Definition: KFitBase.h:263
enum KFitError::ECode m_ErrorCode
Error code.
Definition: KFitBase.h:243
virtual enum KFitError::ECode setZeroCorrelation(void)
Indicate no correlation between tracks.
Definition: KFitBase.cc:85
CLHEP::HepMatrix m_V_al_1
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:274
virtual int getNDF(void) const
Get an NDF of the fit.
Definition: KFitBase.cc:114
CLHEP::HepMatrix m_d
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:268
CLHEP::HepMatrix m_lam0
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:283
bool isFitted(void) const
Return false if fit is not performed yet or performed fit is failed; otherwise true.
Definition: KFitBase.cc:728
CLHEP::HepMatrix m_D
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:266
CLHEP::HepMatrix m_V_D
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:271
bool isTrackIDInRange(const int id) const
Check if the id is in the range.
Definition: KFitBase.cc:739
CLHEP::HepMatrix m_v_a
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:287
virtual const CLHEP::HepMatrix getCorrelation(const int id1, const int id2, const int flag=KFitConst::kAfterFit) const
Get a correlation matrix between two tracks.
Definition: KFitBase.cc:183
bool m_FlagCorrelation
Flag whether a correlation among tracks exists.
Definition: KFitBase.h:306
CLHEP::HepSymMatrix m_V_al_0
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:255
CLHEP::HepMatrix m_V_E
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:281
CLHEP::HepMatrix m_Cov_v_al_1
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:291
const KFitTrack getTrack(const int id) const
Get a specified track object.
Definition: KFitBase.cc:175
std::vector< CLHEP::HepMatrix > m_BeforeCorrelation
Container of input correlation matrices.
Definition: KFitBase.h:251
bool m_FlagFitted
Flag to indicate if the fit is performed and succeeded.
Definition: KFitBase.h:245
double m_CHIsq
chi-square of the fit.
Definition: KFitBase.h:297
int getTrackCount(void) const
Get the number of added tracks.
Definition: KFitBase.cc:107
int m_NDF
NDF of the fit.
Definition: KFitBase.h:295
std::vector< KFitTrack > m_Tracks
Container of input tracks.
Definition: KFitBase.h:249
CLHEP::HepMatrix m_v
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:285
const CLHEP::HepMatrix makeError4(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e) const
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition: KFitBase.cc:439
int m_TrackCount
Number of tracks.
Definition: KFitBase.h:301
CLHEP::HepMatrix m_al_0
See J.Tanaka Ph.D (2001) p136 for definition.
Definition: KFitBase.h:257
static void displayError(const char *file, const int line, const char *func, const enum ECode code)
Display a description of error and its location.
Definition: KFitError.h:72
ECode
ECode is a error code enumerate.
Definition: KFitError.h:34
@ kCannotGetMatrixInverse
Cannot calculate matrix inverse (bad track property or internal error)
Definition: KFitError.h:58
@ kOutOfRange
Specified track-id out of range.
Definition: KFitError.h:42
@ kDivisionByZero
Division by zero (bad track property or internal error)
Definition: KFitError.h:56
@ kBadTrackSize
Track count too small to perform fit.
Definition: KFitError.h:47
@ kBadCorrelationSize
Wrong correlation matrix size (internal error)
Definition: KFitError.h:51
MakeMotherKFit is a class to build mother particle from kinematically fitted daughters.
enum KFitError::ECode setVertex(const HepPoint3D &v)
Set a vertex position of the mother particle.
enum KFitError::ECode addTrack(const KFitTrack &kp)
Add a track to the make-mother object.
enum KFitError::ECode doMake(void)
Perform a reconstruction of mother particle.
const CLHEP::HepSymMatrix getMotherError(void) const
Get an error matrix of the mother particle.
enum KFitError::ECode setCorrelation(const CLHEP::HepMatrix &e)
Set a correlation matrix.
const HepPoint3D getMotherPosition(void) const
Get a position of the mother particle.
enum KFitError::ECode setVertexError(const CLHEP::HepSymMatrix &e)
Set a vertex error matrix of the mother particle.
enum KFitError::ECode setTrackVertexError(const CLHEP::HepMatrix &e)
Set a vertex error matrix of the child particle in the addTrack'ed order.
const CLHEP::HepLorentzVector getMotherMomentum(void) const
Get a Lorentz vector of the mother particle.
enum KFitError::ECode setMagneticField(const double mf)
Change a magnetic field from the default value KFitConst::kDefaultMagneticField.
enum KFitError::ECode setZeroCorrelation(void) override
Indicate no correlation between tracks.
enum KFitError::ECode prepareInputMatrix(void) override
Build grand matrices for minimum search from input-track properties.
enum KFitError::ECode calculateNDF(void) override
Calculate an NDF of the fit.
enum KFitError::ECode setInitialVertex(const HepPoint3D &v)
Set an initial vertex point for the mass-vertex constraint fit.
double getCHIsq(void) const override
Get a chi-square of the fit.
std::vector< int > m_IsFixMass
Array of flags whether the track property is fixed at the mass.
enum KFitError::ECode updateMother(Particle *mother)
Update mother particle.
const CLHEP::HepSymMatrix getVertexError(void) const
Get a fitted vertex error matrix.
enum KFitError::ECode unfixMass(void)
Tell the object to unfix the last added track property at the invariant mass.
enum KFitError::ECode prepareInputSubMatrix(void) override
Build sub-matrices for minimum search from input-track properties.
~MassVertexFitKFit(void)
Destruct the object.
enum KFitError::ECode doFit(void)
Perform a mass-vertex-constraint fit.
enum KFitError::ECode setInvariantMass(const double m)
Set an invariant mass for the mass-vertex constraint fit.
enum KFitError::ECode makeCoreMatrix(void) override
Build matrices using the kinematical constraint.
enum KFitError::ECode prepareCorrelation(void) override
Build a grand correlation matrix from input-track properties.
MassVertexFitKFit(void)
Construct an object with no argument.
HepPoint3D m_AfterVertex
Vertex position after the fit.
enum KFitError::ECode setCorrelation(const CLHEP::HepMatrix &m) override
Set a correlation matrix.
std::vector< CLHEP::HepMatrix > m_AfterTrackVertexError
array of vertex error matrices after the fit.
const CLHEP::HepMatrix getCorrelation(const int id1, const int id2, const int flag=KFitConst::kAfterFit) const override
Get a correlation matrix between two tracks.
double getTrackCHIsq(const int id) const override
Get a chi-square of the track.
const HepPoint3D getVertex(const int flag=KFitConst::kAfterFit) const
Get a vertex position.
CLHEP::HepSymMatrix m_AfterVertexError
Vertex error matrix after the fit.
enum KFitError::ECode prepareOutputMatrix(void) override
Build an output error matrix.
const CLHEP::HepMatrix getTrackVertexError(const int id) const
Get a vertex error matrix of the track.
HepPoint3D m_BeforeVertex
Vertex position before the fit.
enum KFitError::ECode fixMass(void)
Tell the object to fix the last added track property at the invariant mass.
double getInvariantMass(void) const
Get an invariant mass.
Abstract base class for different kinds of events.
Definition: ClusterUtils.h:24
STL namespace.
static const int kMaxTrackCount
Maximum track size.
Definition: KFitConst.h:40
static const int kAfterFit
Input parameter to specify after-fit when setting/getting a track attribute.
Definition: KFitConst.h:37
static const int kBeforeFit
Input parameter to specify before-fit when setting/getting a track attribute.
Definition: KFitConst.h:35
static const int kNumber7
Constant 7 to check matrix size (internal use)
Definition: KFitConst.h:32