Belle II Software prerelease-10-00-00a
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 <TMath.h>
11#include <TMatrixFSym.h>
12
13#include <analysis/VertexFitting/KFit/MakeMotherKFit.h>
14#include <analysis/VertexFitting/KFit/MassVertexFitKFit.h>
15#include <analysis/utility/CLHEPToROOT.h>
16#include <analysis/utility/ROOTToCLHEP.h>
17#include <framework/gearbox/Const.h>
18
19using namespace std;
20using namespace Belle2;
21using namespace Belle2::analysis;
22using namespace CLHEP;
23
25 m_BeforeVertex(HepPoint3D(0., 0., 0.)),
26 m_AfterVertexError(HepSymMatrix(3, 0))
27{
28 m_FlagFitted = false;
30 m_V_E = HepMatrix(3, 3, 0);
31 m_v = HepMatrix(3, 1, 0);
32 m_v_a = HepMatrix(3, 1, 0);
33 m_InvariantMass = -1.0;
34}
35
36
38
39
43
45}
46
47enum KFitError::ECode MassVertexFitKFit::setInitialVertex(const ROOT::Math::XYZVector& v)
48{
49 m_BeforeVertex = ROOTToCLHEP::getPoint3D(v);
51 return m_ErrorCode;
52}
53
60
61
64 m_IsFixMass.push_back(true);
65
67}
68
69
72 m_IsFixMass.push_back(false);
73
75}
76
77
81}
82
83
88
89
90const HepPoint3D
91MassVertexFitKFit::getVertex(const int flag) const
92{
93 if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
94
95 switch (flag) {
97 return m_BeforeVertex;
98
100 return m_AfterVertex;
101
102 default:
103 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
104 return HepPoint3D();
105 }
106}
107
108
109const HepSymMatrix
114
115
116double
121
122
123double
125{
126 return m_CHIsq;
127}
128
129
130const HepMatrix
132{
133 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
134
135 return m_AfterTrackVertexError[id];
136}
137
138
139double
141{
142 if (!isFitted()) return -1;
143 if (!isTrackIDInRange(id)) return -1;
144
145 if (m_IsFixMass[id]) {
146
147 HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
148 int err_inverse = 0;
149 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
150
151 if (err_inverse) {
152 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
153 return -1;
154 }
155
156 return chisq;
157
158 } else {
159
160 HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
161 int err_inverse = 0;
162 const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
163
164 if (err_inverse) {
165 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
166 return -1;
167 }
168
169 return chisq;
170 }
171}
172
173
174const HepMatrix
175MassVertexFitKFit::getCorrelation(const int id1, const int id2, const int flag) const
176{
177 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
178 if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
179 if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
180
181 switch (flag) {
183 return KFitBase::getCorrelation(id1, id2, flag);
184
186 return makeError3(
187 this->getTrackMomentum(id1),
188 this->getTrackMomentum(id2),
189 m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
190 KFitConst::kNumber7 * (id2 + 1)),
191 m_IsFixMass[id1],
192 m_IsFixMass[id2]);
193
194 default:
195 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
196 return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
197 }
198}
199
200
205
206
210 {
212 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
213 return m_ErrorCode;
214 }
215
216
217 if (m_IsFixMass.size() == 0)
218 {
219 // If no fix_mass flag at all,
220 // all tracks are considered to be fixed at mass.
221 for (int i = 0; i < m_TrackCount; i++) this->fixMass();
222 } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
223 {
225 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
226 return m_ErrorCode;
227 }
228
229
230 int index = 0;
231 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
232 m_property = HepMatrix(m_TrackCount, 3, 0);
233 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
234
235 for (auto& track : m_Tracks)
236 {
237 // momentum x,y,z and position x,y,z
238 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
239 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
240 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
241 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
242 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
243 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
244 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
245 // these error
246 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
247 // charge, mass, a
248 m_property[index][0] = track.getCharge();
249 m_property[index][1] = track.getMass();
250 const double c = Belle2::Const::speedOfLight * 1e-4;
251 m_property[index][2] = -c * m_MagneticField * track.getCharge();
252 index++;
253 }
254
255 // error between track and track
257 {
258 this->prepareCorrelation();
260 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
261 return m_ErrorCode;
262 }
263 }
264
265 // vertex
266 m_v_a[0][0] = m_BeforeVertex.x();
267 m_v_a[1][0] = m_BeforeVertex.y();
268 m_v_a[2][0] = m_BeforeVertex.z();
269
270 // set member matrix
271 m_al_1 = m_al_0;
272
275 m_E = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 3);
276 m_d = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
277 m_V_D = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
278 m_lam = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
279 m_lam0 = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
280 m_V_Dt = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
282
284}
285
286
289 // vertex
290 for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
291
293}
294
295
298 if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
299 {
301 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
302 return m_ErrorCode;
303 }
304
305 int row = 0, col = 0;
306
307 for (auto& hm : m_BeforeCorrelation)
308 {
309 // counter
310 row++;
311 if (row == m_TrackCount) {
312 col++;
313 row = col + 1;
314 }
315
316 int ii = 0, jj = 0;
317 for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
318 for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
319 m_V_al_0[i][j] = hm[ii][jj];
320 jj++;
321 }
322 jj = 0;
323 ii++;
324 }
325 }
326
328}
329
330
333 Hep3Vector h3v;
334 int index = 0;
335 for (auto& pdata : m_Tracks)
336 {
337 // tracks
338 // momentum
339 h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
340 h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
341 h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
342 if (m_IsFixMass[index])
343 pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
344 else
345 pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
346 // position
347 pdata.setPosition(HepPoint3D(
348 m_al_1[index * KFitConst::kNumber7 + 4][0],
349 m_al_1[index * KFitConst::kNumber7 + 5][0],
351 // error of the tracks
352 pdata.setError(this->makeError3(pdata.getMomentum(),
353 m_V_al_1.sub(
354 index * KFitConst::kNumber7 + 1,
355 (index + 1)*KFitConst::kNumber7,
356 index * KFitConst::kNumber7 + 1,
357 (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
359 if (m_ErrorCode != KFitError::kNoError) break;
360 index++;
361 }
362
363 // vertex
364 m_AfterVertex.setX(m_v_a[0][0]);
365 m_AfterVertex.setY(m_v_a[1][0]);
366 m_AfterVertex.setZ(m_v_a[2][0]);
367 // error of the vertex
368 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++)
369 {
370 m_AfterVertexError[i][j] = m_V_E[i][j];
371 }
372 // error between vertex and tracks
373 for (int i = 0; i < m_TrackCount; i++)
374 {
375 HepMatrix hm(3, KFitConst::kNumber7, 0);
376 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
377 hm[j][k] = m_Cov_v_al_1[j][KFitConst::kNumber7 * i + k];
378 }
379 if (m_IsFixMass[i])
380 m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
381 else
382 m_AfterTrackVertexError.push_back(hm);
383 }
384
386}
387
388
391 // Mass Constraint
392 HepMatrix al_1_prime(m_al_1);
393 HepMatrix Sum_al_1(4, 1, 0);
394 std::vector<double> energy(m_TrackCount);
395 double a;
396
397 for (int i = 0; i < m_TrackCount; i++)
398 {
399 a = m_property[i][2];
400 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_v_a[1][0] - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
401 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_v_a[0][0] - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
402 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
403 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
404 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
405 m_property[i][1] * m_property[i][1]);
406 if (m_IsFixMass[i])
407 Sum_al_1[3][0] += energy[i];
408 else
409 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
410 }
411
412 for (int i = 0; i < m_TrackCount; i++)
413 {
414 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
415 }
416
417 m_d[2 * m_TrackCount][0] =
418 + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
419 - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
421
422 double Sum_a = 0., Sum_tmpx = 0., Sum_tmpy = 0.;
423 for (int i = 0; i < m_TrackCount; i++)
424 {
425 if (energy[i] == 0) {
427 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
428 return m_ErrorCode;
429 }
430
431 a = m_property[i][2];
432
433 if (m_IsFixMass[i]) {
434 double invE = 1. / energy[i];
435 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
436 Sum_al_1[0][0]);
437 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
438 Sum_al_1[1][0]);
439 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE -
440 Sum_al_1[2][0]);
441 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 0.;
442 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
443 Sum_al_1[1][0]) * a;
444 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
445 Sum_al_1[0][0]) * a;
446 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
447 Sum_tmpx += al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE * a;
448 Sum_tmpy += al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE * a;
449 } else {
450 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
451 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
452 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
453 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
454 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
455 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
456 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
457 }
458 Sum_a += a;
459 }
460
461 // m_E
462 m_E[2 * m_TrackCount][0] = -2.*Sum_al_1[1][0] * Sum_a + 2.*Sum_al_1[3][0] * Sum_tmpy;
463 m_E[2 * m_TrackCount][1] = 2.*Sum_al_1[0][0] * Sum_a - 2.*Sum_al_1[3][0] * Sum_tmpx;
464 m_E[2 * m_TrackCount][2] = 0.;
465
466 for (int i = 0; i < m_TrackCount; i++)
467 {
468 double S, U;
469 double sininv;
470
471 double px = m_al_1[i * KFitConst::kNumber7 + 0][0];
472 double py = m_al_1[i * KFitConst::kNumber7 + 1][0];
473 double pz = m_al_1[i * KFitConst::kNumber7 + 2][0];
474 double x = m_al_1[i * KFitConst::kNumber7 + 4][0];
475 double y = m_al_1[i * KFitConst::kNumber7 + 5][0];
476 double z = m_al_1[i * KFitConst::kNumber7 + 6][0];
477 a = m_property[i][2];
478
479 double pt = sqrt(px * px + py * py);
480
481 if (pt == 0) {
483 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
484 return m_ErrorCode;
485 }
486
487 double invPt = 1. / pt;
488 double invPt2 = invPt * invPt;
489 double dlx = m_v_a[0][0] - x;
490 double dly = m_v_a[1][0] - y;
491 double dlz = m_v_a[2][0] - z;
492 double a1 = -dlx * py + dly * px;
493 double a2 = dlx * px + dly * py;
494 double r2d2 = dlx * dlx + dly * dly;
495 double Rx = dlx - 2.*px * a2 * invPt2;
496 double Ry = dly - 2.*py * a2 * invPt2;
497
498 if (a != 0.) { // charged
499
500 double B = a * a2 * invPt2;
501 if (fabs(B) > 1.) {
503 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
504 return m_ErrorCode;
505 }
506 // sin^(-1)(B)
507 sininv = asin(B);
508 double tmp0 = 1.0 - B * B;
509 if (tmp0 == 0) {
511 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
512 return m_ErrorCode;
513 }
514 // 1/sqrt(1-B^2)
515 double sqrtag = 1.0 / sqrt(tmp0);
516 S = sqrtag * invPt2;
517 U = dlz - pz * sininv / a;
518
519 } else { // neutral
520
521 sininv = 0.0;
522 S = invPt2;
523 U = dlz - pz * a2 * invPt2;
524
525 }
526
527 // d
528 m_d[i * 2 + 0][0] = a1 - 0.5 * a * r2d2;
529 m_d[i * 2 + 1][0] = U * pt;
530
531 // D
532 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 0] = dly;
533 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 1] = -dlx;
534 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 2] = 0.0;
535 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 4] = py + a * dlx;
536 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 5] = -px + a * dly;
537 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 6] = 0.0;
538 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 0] = -pz * pt * S * Rx + U * px * invPt;
539 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 1] = -pz * pt * S * Ry + U * py * invPt;
540 if (a != 0.)
541 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -sininv * pt / a;
542 else
543 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -a2 * invPt;
544 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 4] = px * pz * pt * S;
545 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 5] = py * pz * pt * S;
546 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 6] = -pt;
547
548 // E
549 m_E[i * 2 + 0][0] = -py - a * dlx;
550 m_E[i * 2 + 0][1] = px - a * dly;
551 m_E[i * 2 + 0][2] = 0.0;
552 m_E[i * 2 + 1][0] = -px * pz * pt * S;
553 m_E[i * 2 + 1][1] = -py * pz * pt * S;
554 m_E[i * 2 + 1][2] = pt;
555 }
556
558}
559
560
567
569{
570 MakeMotherKFit kmm;
572 unsigned n = getTrackCount();
573 for (unsigned i = 0; i < n; ++i) {
575 getTrack(i).getCharge());
577 for (unsigned j = i + 1; j < n; ++j) {
579 }
580 }
581 kmm.setVertex(getVertex());
583 m_ErrorCode = kmm.doMake();
585 return m_ErrorCode;
586 double chi2 = getCHIsq();
587 int ndf = getNDF();
588 double prob = TMath::Prob(chi2, ndf);
589 //
590 bool haschi2 = mother->hasExtraInfo("chiSquared");
591 if (haschi2) {
592 mother->setExtraInfo("chiSquared", chi2);
593 mother->setExtraInfo("ndf", ndf);
594 } else {
595 mother->addExtraInfo("chiSquared", chi2);
596 mother->addExtraInfo("ndf", ndf);
597 }
598
599 mother->updateMomentum(
600 CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
601 CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
602 CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
603 prob);
605 return m_ErrorCode;
606}
static const double speedOfLight
[cm/ns]
Definition Const.h:695
Class to store reconstructed particles.
Definition Particle.h:76
void setExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition Particle.cc:1402
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
Definition Particle.cc:1351
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition Particle.cc:1421
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:397
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.
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28
Abstract base class for different kinds of events.
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