Belle II Software development
MassFitKFit.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 <analysis/VertexFitting/KFit/MassFitKFit.h>
11
12#include <analysis/dataobjects/Particle.h>
13#include <analysis/VertexFitting/KFit/MakeMotherKFit.h>
14#include <analysis/utility/CLHEPToROOT.h>
15#include <framework/gearbox/Const.h>
16
17#include <cstdio>
18
19#include <TMath.h>
20
21using namespace std;
22using namespace Belle2;
23using namespace Belle2::analysis;
24using namespace CLHEP;
25
27{
28 m_FlagFitted = false;
31 m_FlagAtDecayPoint = true;
33 m_d = HepMatrix(1, 1, 0);
34 m_V_D = HepMatrix(1, 1, 0);
35 m_lam = HepMatrix(1, 1, 0);
36 m_AfterVertexError = HepSymMatrix(3, 0);
37 m_InvariantMass = -1.0;
38}
39
40
42
43
45MassFitKFit::setVertex(const HepPoint3D& v) {
47
49}
50
51
53MassFitKFit::setVertexError(const HepSymMatrix& e) {
54 if (e.num_row() != 3)
55 {
57 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
58 return m_ErrorCode;
59 }
60
63
65}
66
67
74
75
82
83
86 m_IsFixMass.push_back(true);
87
89}
90
91
94 m_IsFixMass.push_back(false);
95
97}
98
99
102 if (e.num_row() != 3 || e.num_col() != KFitConst::kNumber7)
103 {
105 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
106 return m_ErrorCode;
107 }
108
109 m_BeforeTrackVertexError.push_back(e);
112
114}
115
116
119 HepMatrix zero(3, KFitConst::kNumber7, 0);
120
121 return this->setTrackVertexError(zero);
122}
123
124
125const HepPoint3D
126MassFitKFit::getVertex(const int flag) const
127{
128 if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
129
130 switch (flag) {
132 return m_BeforeVertex;
133
135 return m_AfterVertex;
136
137 default:
138 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
139 return HepPoint3D();
140 }
141}
142
143
144const HepSymMatrix
145MassFitKFit::getVertexError(const int flag) const
146{
147 if (flag == KFitConst::kAfterFit && !isFitted()) return HepSymMatrix(3, 0);
148
149 if (flag == KFitConst::kBeforeFit)
150 return m_BeforeVertexError;
152 return m_AfterVertexError;
153 else {
154 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
155 return HepSymMatrix(3, 0);
156 }
157}
158
159
160double
162{
163 return m_InvariantMass;
164}
165
166
167bool
172
173
174bool
179
180
181double
183{
184 return m_CHIsq;
185}
186
187
188const HepMatrix
189MassFitKFit::getTrackVertexError(const int id, const int flag) const
190{
191 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(3, KFitConst::kNumber7, 0);
192 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
193
194 if (flag == KFitConst::kBeforeFit)
195 return m_BeforeTrackVertexError[id];
197 return m_AfterTrackVertexError[id];
198 else {
199 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
200 return HepMatrix(3, KFitConst::kNumber7, 0);
201 }
202}
203
204
205double
206MassFitKFit::getTrackCHIsq(const int id) const
207{
208 if (!isFitted()) return -1;
209 if (!isTrackIDInRange(id)) return -1;
210
211 if (m_IsFixMass[id]) {
212
213 HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
214 int err_inverse = 0;
215 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
216
217 if (err_inverse) {
218 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
219 return -1;
220 }
221
222 return chisq;
223
224 } else {
225
226 HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
227 int err_inverse = 0;
228 const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
229
230 if (err_inverse) {
231 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
232 return -1;
233 }
234
235 return chisq;
236
237 }
238}
239
240
241const HepMatrix
242MassFitKFit::getCorrelation(const int id1, const int id2, const int flag) const
243{
244 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
245 if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
246 if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
247
248 switch (flag) {
250 return KFitBase::getCorrelation(id1, id2, flag);
251
253 return makeError3(
254 this->getTrackMomentum(id1),
255 this->getTrackMomentum(id2),
256 m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
257 KFitConst::kNumber7 * (id2 + 1)),
258 m_IsFixMass[id1],
259 m_IsFixMass[id2]);
260
261 default:
262 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
263 return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
264 }
265}
266
267
272
273
277 {
279 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
280 return m_ErrorCode;
281 }
282
283
284 if (m_IsFixMass.size() == 0)
285 {
286 // If no fix_mass flag at all,
287 // all tracks are considered to be fixed at mass.
288 for (int i = 0; i < m_TrackCount; i++) this->fixMass();
289 } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
290 {
292 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
293 return m_ErrorCode;
294 }
295
296
298 {
299 int index = 0;
300 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
301 m_property = HepMatrix(m_TrackCount, 3, 0);
302 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
303
304 for (const auto& track : m_Tracks) {
305 // momentum x,y,z and position x,y,z
306 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
307 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
308 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
309 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
310 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
311 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
312 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
313 // these error
314 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
315 // charge, mass, a
316 m_property[index][0] = track.getCharge();
317 m_property[index][1] = track.getMass();
318 const double c = Const::speedOfLight * 1e-4;
319 m_property[index][2] = -c * m_MagneticField * track.getCharge();
320 index++;
321 }
322
323 // error between track and track
324 if (m_FlagCorrelation) {
325 this->prepareCorrelation();
327 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
328 return m_ErrorCode;
329 }
330 }
331
332 // set member matrix
333 m_al_1 = m_al_0;
334
335 // define size of matrix
338
339 } else
340 {
341 // m_FlagFitIncludingVertex == true
342 int index = 0;
343 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount + 3, 1, 0);
344 m_property = HepMatrix(m_TrackCount, 3, 0);
345 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount + 3, 0);
346
347 for (const auto& track : m_Tracks) {
348 // momentum x,y,z and position x,y,z
349 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
350 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
351 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
352 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
353 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
354 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
355 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
356 // these error
357 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
358 // charge, mass, a
359 m_property[index][0] = track.getCharge();
360 m_property[index][1] = track.getMass();
361 const double c = Const::speedOfLight * 1e-4;
362 m_property[index][2] = -c * m_MagneticField * track.getCharge();
363 index++;
364 }
365
366 // vertex
371
372 // error between track and track
373 if (m_FlagCorrelation) {
374 this->prepareCorrelation();
376 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
377 return m_ErrorCode;
378 }
379 }
380
381 // set member matrix
382 m_al_1 = m_al_0;
383
384 // define size of matrix
386 m_D = m_V_al_1.sub(1, 1, 1, KFitConst::kNumber7 * m_TrackCount + 3);
387 }
388
390}
391
392
395 char buf[1024];
396 sprintf(buf, "%s:%s(): internal error; this function should never be called", __FILE__, __func__);
397 B2FATAL(buf);
398
399 /* NEVER REACHEd HERE */
401}
402
403
406 if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
407 {
409 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
410 return m_ErrorCode;
411 }
412
413 int row = 0, col = 0;
414
415 for (const auto& hm : m_BeforeCorrelation)
416 {
417 // counter
418 row++;
419 if (row == m_TrackCount) {
420 col++;
421 row = col + 1;
422 }
423
424 int ii = 0, jj = 0;
425 for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
426 for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
427 m_V_al_0[i][j] = hm[ii][jj];
428 jj++;
429 }
430 jj = 0;
431 ii++;
432 }
433 }
434
436 {
437 // ...error of vertex
439
440 // ...error matrix between vertex and tracks
442 if (m_BeforeTrackVertexError.size() != (unsigned int)m_TrackCount) {
444 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
445 return m_ErrorCode;
446 }
447
448 int i = 0;
449 for (const auto& hm : m_BeforeTrackVertexError) {
450 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
452 }
453 i++;
454 }
455 }
456 }
457
459}
460
461
464 Hep3Vector h3v;
465 int index = 0;
466 for (auto& pdata : m_Tracks)
467 {
468 // tracks
469 // momentum
470 h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
471 h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
472 h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
473 if (m_IsFixMass[index])
474 pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
475 else
476 pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
477 // position
478 pdata.setPosition(HepPoint3D(
479 m_al_1[index * KFitConst::kNumber7 + 4][0],
480 m_al_1[index * KFitConst::kNumber7 + 5][0],
482 // error of the tracks
483 pdata.setError(this->makeError3(pdata.getMomentum(),
484 m_V_al_1.sub(
485 index * KFitConst::kNumber7 + 1,
486 (index + 1)*KFitConst::kNumber7,
487 index * KFitConst::kNumber7 + 1,
488 (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
490 if (m_ErrorCode != KFitError::kNoError) break;
491 index++;
492 }
493
495 {
496 // vertex
500 // error of the vertex
501 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++) {
503 }
504 // error between vertex and tracks
505 for (int i = 0; i < m_TrackCount; i++) {
506 HepMatrix hm(3, KFitConst::kNumber7, 0);
507 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
509 }
510 if (m_IsFixMass[i])
511 m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
512 else
513 m_AfterTrackVertexError.push_back(hm);
514 }
515 } else
516 {
517 // not fit
519 }
520
522}
523
524
528 {
529
530 HepMatrix al_1_prime(m_al_1);
531 HepMatrix Sum_al_1(4, 1, 0);
532 std::vector<double> energy(m_TrackCount);
533 double a;
534
535 for (int i = 0; i < m_TrackCount; i++) {
536 a = m_property[i][2];
537 if (!m_FlagAtDecayPoint) a = 0.;
538 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_BeforeVertex.y() - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
539 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_BeforeVertex.x() - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
540 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
541 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
542 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
543 m_property[i][1] * m_property[i][1]);
544 if (m_IsFixMass[i])
545 Sum_al_1[3][0] += energy[i];
546 else
547 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
548 }
549
550 for (int i = 0; i < m_TrackCount; i++) {
551 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
552 }
553
554 m_d[0][0] =
555 + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
556 - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
558
559 for (int i = 0; i < m_TrackCount; i++) {
560 if (energy[i] == 0) {
562 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
563 break;
564 }
565
566 a = m_property[i][2];
567 if (!m_FlagAtDecayPoint) a = 0.;
568
569 if (m_IsFixMass[i]) {
570 double invE = 1. / energy[i];
571 m_D[0][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE - Sum_al_1[0][0]);
572 m_D[0][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE - Sum_al_1[1][0]);
573 m_D[0][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE - Sum_al_1[2][0]);
574 m_D[0][i * KFitConst::kNumber7 + 3] = 0.;
575 m_D[0][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE - Sum_al_1[1][0]) * a;
576 m_D[0][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE - Sum_al_1[0][0]) * a;
577 m_D[0][i * KFitConst::kNumber7 + 6] = 0.;
578 } else {
579 m_D[0][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
580 m_D[0][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
581 m_D[0][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
582 m_D[0][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
583 m_D[0][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
584 m_D[0][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
585 m_D[0][i * KFitConst::kNumber7 + 6] = 0.;
586 }
587 }
588
589 } else
590 {
591
592 // m_FlagFitIncludingVertex == true
593 HepMatrix al_1_prime(m_al_1);
594 HepMatrix Sum_al_1(7, 1, 0);
595 std::vector<double> energy(m_TrackCount);
596 double a;
597
598 for (int i = 0; i < m_TrackCount; i++) {
599 a = m_property[i][2];
600 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (al_1_prime[KFitConst::kNumber7 * m_TrackCount + 1][0] - al_1_prime[i *
601 KFitConst::kNumber7 + 5][0]);
602 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (al_1_prime[KFitConst::kNumber7 * m_TrackCount + 0][0] - al_1_prime[i *
603 KFitConst::kNumber7 + 4][0]);
604 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
605 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
606 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
607 m_property[i][1] * m_property[i][1]);
608 Sum_al_1[6][0] = + a;
609 }
610
611 for (int i = 0; i < m_TrackCount; i++) {
612 if (energy[i] == 0) {
614 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
615 break;
616 }
617
618 if (m_IsFixMass[i]) {
619 double invE = 1. / energy[i];
620 Sum_al_1[3][0] += energy[i];
621 Sum_al_1[4][0] += al_1_prime[i * KFitConst::kNumber7 + 1][0] * m_property[i][2] * invE;
622 Sum_al_1[5][0] += al_1_prime[i * KFitConst::kNumber7 + 0][0] * m_property[i][2] * invE;
623 } else {
624 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
625 }
626
627 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
628 }
629
630 m_d[0][0] =
631 + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
632 - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
634
635 for (int i = 0; i < m_TrackCount; i++) {
636 if (energy[i] == 0) {
638 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
639 break;
640 }
641
642 a = m_property[i][2];
643
644 if (m_IsFixMass[i]) {
645 double invE = 1. / energy[i];
646 m_D[0][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE - Sum_al_1[0][0]);
647 m_D[0][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE - Sum_al_1[1][0]);
648 m_D[0][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE - Sum_al_1[2][0]);
649 m_D[0][i * KFitConst::kNumber7 + 3] = 0.;
650 m_D[0][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE - Sum_al_1[1][0]) * a;
651 m_D[0][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE - Sum_al_1[0][0]) * a;
652 m_D[0][i * KFitConst::kNumber7 + 6] = 0.;
653 } else {
654 m_D[0][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
655 m_D[0][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
656 m_D[0][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
657 m_D[0][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
658 m_D[0][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
659 m_D[0][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
660 m_D[0][i * KFitConst::kNumber7 + 6] = 0.;
661 }
662 }
663
664 m_D[0][KFitConst::kNumber7 * m_TrackCount + 0] = 2.*(Sum_al_1[3][0] * Sum_al_1[4][0] - Sum_al_1[1][0] * Sum_al_1[6][0]);
665 m_D[0][KFitConst::kNumber7 * m_TrackCount + 1] = -2.*(Sum_al_1[3][0] * Sum_al_1[5][0] - Sum_al_1[0][0] * Sum_al_1[6][0]);
666 m_D[0][KFitConst::kNumber7 * m_TrackCount + 2] = 0.;
667 }
668
670}
671
672
679
681{
682 MakeMotherKFit kmm;
684 unsigned n = getTrackCount();
685 for (unsigned i = 0; i < n; ++i) {
687 getTrack(i).getCharge());
690 for (unsigned j = i + 1; j < n; ++j) {
692 }
693 }
694 kmm.setVertex(getVertex());
697 m_ErrorCode = kmm.doMake();
699 return m_ErrorCode;
700 double chi2 = getCHIsq();
701 int ndf = getNDF();
702 double prob = TMath::Prob(chi2, ndf);
703 //
704 bool haschi2 = mother->hasExtraInfo("chiSquared");
705 if (haschi2) {
706 mother->setExtraInfo("chiSquared", chi2);
707 mother->setExtraInfo("ndf", ndf);
708 } else {
709 mother->addExtraInfo("chiSquared", chi2);
710 mother->addExtraInfo("ndf", ndf);
711 }
712
713 mother->updateMomentum(
714 CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
715 CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
716 CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
717 prob);
719 return m_ErrorCode;
720}
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
static CLHEP::HepSymMatrix makeError3(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e, const bool is_fix_mass)
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition KFitBase.cc:320
CLHEP::HepMatrix m_al_1
See J.Tanaka Ph.D (2001) p136 for definition.
Definition KFitBase.h:259
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
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
static CLHEP::HepMatrix makeError4(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e)
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition KFitBase.cc:439
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
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
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
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
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
enum KFitError::ECode doFit1(void)
Perform a fit (used in MassFitKFit::doFit()).
Definition KFitBase.cc:502
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:71
ECode
ECode is a error code enumerate.
Definition KFitError.h:33
@ kCannotGetMatrixInverse
Cannot calculate matrix inverse (bad track property or internal error)
Definition KFitError.h:57
@ kOutOfRange
Specified track-id out of range.
Definition KFitError.h:41
@ kDivisionByZero
Division by zero (bad track property or internal error)
Definition KFitError.h:55
@ kBadTrackSize
Track count too small to perform fit.
Definition KFitError.h:46
@ kBadMatrixSize
Wrong correlation matrix size.
Definition KFitError.h:48
@ kBadCorrelationSize
Wrong correlation matrix size (internal error)
Definition KFitError.h:50
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 setVertex(const HepPoint3D &v)
Set an initial vertex position for the mass-constraint fit.
bool m_FlagTrackVertexError
Flag to indicate if the vertex error matrix of the child particle is preset.
bool m_FlagAtDecayPoint
Flag controlled by setFlagAtDecayPoint().
bool getFlagAtDecayPoint(void) const
Get a flag if to constraint at the decay point in the mass-constraint fit.
enum KFitError::ECode prepareInputMatrix(void) override
Build grand matrices for minimum search from input-track properties.
bool getFlagFitWithVertex(void) const
Get a flag if the fit is allowed with moving the vertex position.
enum KFitError::ECode calculateNDF(void) override
Calculate an NDF of the fit.
double getCHIsq(void) const override
Get a chi-square of the fit.
enum KFitError::ECode setFlagAtDecayPoint(const bool flag)
Set a flag if to constraint at the decay point in the mass-constraint fit.
~MassFitKFit(void) override
Destruct the object.
enum KFitError::ECode setTrackZeroVertexError(void)
Indicate no vertex uncertainty in the child particle in the addTrack'ed order.
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.
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.
bool m_FlagFitIncludingVertex
Flag to indicate if the fit is allowed with moving the vertex position.
enum KFitError::ECode doFit(void)
Perform a mass-constraint fit.
double m_InvariantMass
Invariant mass.
enum KFitError::ECode setInvariantMass(const double m)
Set an invariant mass for the mass-constraint fit.
std::vector< CLHEP::HepMatrix > m_BeforeTrackVertexError
array of vertex error matrices before the fit.
enum KFitError::ECode makeCoreMatrix(void) override
Build matrices using the kinematical constraint.
enum KFitError::ECode setVertexError(const CLHEP::HepSymMatrix &e)
Set an initial vertex error matrix for the mass-constraint fit.
enum KFitError::ECode setTrackVertexError(const CLHEP::HepMatrix &e)
Set a vertex error matrix of the child particle in the addTrack'ed order.
enum KFitError::ECode prepareCorrelation(void) override
Build a grand correlation matrix from input-track properties.
HepPoint3D m_AfterVertex
Vertex position after the fit.
MassFitKFit(void)
Construct an object with no argument.
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 CLHEP::HepSymMatrix getVertexError(const int flag=KFitConst::kAfterFit) const
Get a vertex error matrix.
const HepPoint3D getVertex(const int flag=KFitConst::kAfterFit) const
Get a vertex position.
const CLHEP::HepMatrix getTrackVertexError(const int id, const int flag=KFitConst::kAfterFit) const
Get a vertex error matrix of the track.
CLHEP::HepSymMatrix m_AfterVertexError
Vertex error matrix after the fit.
enum KFitError::ECode prepareOutputMatrix(void) override
Build an output error matrix.
CLHEP::HepSymMatrix m_BeforeVertexError
Vertex error matrix before the fit.
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:38
static const int kAfterFit
Input parameter to specify after-fit when setting/getting a track attribute.
Definition KFitConst.h:35
static const int kBeforeFit
Input parameter to specify before-fit when setting/getting a track attribute.
Definition KFitConst.h:33
static const int kNumber7
Constant 7 to check matrix size (internal use)
Definition KFitConst.h:30