10 #include <TMatrixFSym.h>
12 #include <analysis/utility/ROOTToCLHEP.h>
13 #include <analysis/VertexFitting/KFit/KFitBase.h>
17 using namespace Belle2::analysis;
18 using namespace CLHEP;
22 m_ErrorCode = KFitError::kNoError;
24 m_FlagCorrelation =
false;
25 m_FlagOverIteration =
false;
26 m_MagneticField = KFitConst::kDefaultMagneticField;
29 m_NecessaryTrackCount = -1;
34 KFitBase::~KFitBase() =
default;
39 m_Tracks.push_back(p);
40 m_TrackCount = m_Tracks.size();
42 return m_ErrorCode = KFitError::kNoError;
47 KFitBase::addTrack(
const CLHEP::HepLorentzVector& p,
const HepPoint3D& x,
const CLHEP::HepSymMatrix& e,
const double q) {
48 if (e.num_row() != KFitConst::kNumber7)
50 m_ErrorCode = KFitError::kBadMatrixSize;
51 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
55 return this->addTrack(
KFitTrack(p, x, e, q));
62 ROOTToCLHEP::getHepLorentzVector(particle->
get4Vector()),
63 ROOTToCLHEP::getPoint3D(particle->
getVertex()),
70 KFitBase::setCorrelation(
const HepMatrix& e) {
71 if (e.num_row() != KFitConst::kNumber7)
73 m_ErrorCode = KFitError::kBadMatrixSize;
74 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
77 m_BeforeCorrelation.push_back(e);
78 m_FlagCorrelation =
true;
80 return m_ErrorCode = KFitError::kNoError;
85 KFitBase::setZeroCorrelation() {
86 HepMatrix zero(KFitConst::kNumber7, KFitConst::kNumber7, 0);
88 return this->setCorrelation(zero);
93 KFitBase::setMagneticField(
const double mf) {
96 return m_ErrorCode = KFitError::kNoError;
101 KFitBase::getErrorCode()
const {
107 KFitBase::getTrackCount()
const
114 KFitBase::getNDF()
const
121 KFitBase::getCHIsq()
const
128 KFitBase::getMagneticField()
const
130 return m_MagneticField;
135 KFitBase::getTrackCHIsq(
const int id)
const
137 if (!isFitted())
return -1.;
138 if (!isTrackIDInRange(
id))
return -1.;
140 HepMatrix da(m_Tracks[
id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[
id].getFitParameter(KFitConst::kAfterFit));
142 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
145 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
153 const HepLorentzVector
154 KFitBase::getTrackMomentum(
const int id)
const
156 if (!isTrackIDInRange(
id))
return HepLorentzVector();
157 return m_Tracks[id].getMomentum();
161 KFitBase::getTrackPosition(
const int id)
const
163 if (!isTrackIDInRange(
id))
return HepPoint3D();
164 return m_Tracks[id].getPosition();
168 KFitBase::getTrackError(
const int id)
const
170 if (!isTrackIDInRange(
id))
return HepSymMatrix(KFitConst::kNumber7, 0);
171 return m_Tracks[id].getError();
175 KFitBase::getTrack(
const int id)
const
177 if (!isTrackIDInRange(
id))
return KFitTrack();
183 KFitBase::getCorrelation(
const int id1,
const int id2,
const int flag)
const
185 if (flag == KFitConst::kAfterFit && !isFitted())
return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
186 if (!isTrackIDInRange(id1))
return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
187 if (!isTrackIDInRange(id2))
return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
190 case KFitConst::kAfterFit:
192 getTrackMomentum(id1),
193 getTrackMomentum(id2),
194 m_V_al_1.sub(KFitConst::kNumber6 * id1 + 1, KFitConst::kNumber6 * (id1 + 1), KFitConst::kNumber6 * id2 + 1,
195 KFitConst::kNumber6 * (id2 + 1))
201 return static_cast<HepMatrix
>(m_Tracks[id1].getError(KFitConst::kBeforeFit));
204 const int idx1 = id1 < id2 ? id1 : id2, idx2 = id1 < id2 ? id2 : id1;
208 for (
int i = 0; i < idx1; i++) index += m_TrackCount - 1 - i;
212 return m_BeforeCorrelation[index + idx2];
214 return m_BeforeCorrelation[index + idx2].T();
221 KFitBase::makeError1(
const CLHEP::HepLorentzVector& p,
const CLHEP::HepMatrix& e)
const
226 if (!isNonZeroEnergy(p))
return HepSymMatrix(KFitConst::kNumber7, 0);
228 HepSymMatrix hsm(KFitConst::kNumber7, 0);
230 for (
int i = 0; i < 3; i++)
for (
int j = i; j < 3; j++) {
232 hsm[4 + i][4 + j] = e[3 + i][3 + j];
234 for (
int i = 0; i < 3; i++)
for (
int j = 0; j < 3; j++) {
235 hsm[i][4 + j] = e[i][3 + j];
238 const double invE = 1 / p.t();
239 hsm[0][3] = (p.x() * hsm[0][0] + p.y() * hsm[0][1] + p.z() * hsm[0][2]) * invE;
240 hsm[1][3] = (p.x() * hsm[0][1] + p.y() * hsm[1][1] + p.z() * hsm[1][2]) * invE;
241 hsm[2][3] = (p.x() * hsm[0][2] + p.y() * hsm[1][2] + p.z() * hsm[2][2]) * invE;
242 hsm[3][3] = (p.x() * p.x() * hsm[0][0] + p.y() * p.y() * hsm[1][1] + p.z() * p.z() * hsm[2][2]
243 + 2.0 * p.x() * p.y() * hsm[0][1]
244 + 2.0 * p.x() * p.z() * hsm[0][2]
245 + 2.0 * p.y() * p.z() * hsm[1][2]) * invE * invE;
246 hsm[3][4] = (p.x() * hsm[0][4] + p.y() * hsm[1][4] + p.z() * hsm[2][4]) * invE;
247 hsm[3][5] = (p.x() * hsm[0][5] + p.y() * hsm[1][5] + p.z() * hsm[2][5]) * invE;
248 hsm[3][6] = (p.x() * hsm[0][6] + p.y() * hsm[1][6] + p.z() * hsm[2][6]) * invE;
255 KFitBase::makeError1(
const CLHEP::HepLorentzVector& p1,
const CLHEP::HepLorentzVector& p2,
const CLHEP::HepMatrix& e)
const
260 if (!isNonZeroEnergy(p1))
return HepSymMatrix(KFitConst::kNumber7, 0);
261 if (!isNonZeroEnergy(p2))
return HepSymMatrix(KFitConst::kNumber7, 0);
263 HepMatrix hm(KFitConst::kNumber7, KFitConst::kNumber7, 0);
265 for (
int i = 0; i < 3; i++)
for (
int j = 0; j < 3; j++) {
267 hm[4 + i][4 + j] = e[3 + i][3 + j];
268 hm[4 + i][j] = e[3 + i][j];
269 hm[i][4 + j] = e[i][3 + j];
272 const double invE1 = 1 / p1.t();
273 const double invE2 = 1 / p2.t();
274 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
275 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
276 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
277 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
278 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
279 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
280 hm[3][3] = (p1.x() * p2.x() * hm[0][0] + p1.y() * p2.y() * hm[1][1] + p1.z() * p2.z() * hm[2][2] +
281 p1.x() * p2.y() * hm[0][1] + p2.x() * p1.y() * hm[1][0] +
282 p1.x() * p2.z() * hm[0][2] + p2.x() * p1.z() * hm[2][0] +
283 p1.y() * p2.z() * hm[1][2] + p2.y() * p1.z() * hm[2][1]) * invE1 * invE2;
284 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
285 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
286 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
287 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
288 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
289 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
296 KFitBase::makeError2(
const HepLorentzVector& p,
const HepMatrix& e)
const
301 if (!isNonZeroEnergy(p))
return HepSymMatrix(KFitConst::kNumber7, 0);
303 HepMatrix hm(3, KFitConst::kNumber7, 0);
305 for (
int i = 0; i < 3; i++)
for (
int j = 0; j < 3; j++) {
307 hm[i][4 + j] = e[i][3 + j];
310 const double invE = 1 / p.t();
311 hm[0][3] = (p.x() * hm[0][0] + p.y() * hm[0][1] + p.z() * hm[0][2]) * invE;
312 hm[1][3] = (p.x() * hm[1][0] + p.y() * hm[1][1] + p.z() * hm[1][2]) * invE;
313 hm[2][3] = (p.x() * hm[2][0] + p.y() * hm[2][1] + p.z() * hm[2][2]) * invE;
320 KFitBase::makeError3(
const CLHEP::HepLorentzVector& p,
const CLHEP::HepMatrix& e,
const bool is_fix_mass)
const
327 if (!isNonZeroEnergy(p))
return HepSymMatrix(KFitConst::kNumber7, 0);
330 HepSymMatrix hsm(KFitConst::kNumber7, 0);
331 for (
int i = 0; i < 7; i++)
for (
int j = i; j < 7; j++) {
337 HepSymMatrix hsm(KFitConst::kNumber7, 0);
339 for (
int i = 0; i < 7; i++) {
341 for (
int j = i; j < 7; j++) hsm[i][j] = e[i][j];
344 double invE = 1 / p.t();
345 hsm[0][3] = (p.x() * hsm[0][0] + p.y() * hsm[0][1] + p.z() * hsm[0][2]) * invE;
346 hsm[1][3] = (p.x() * hsm[0][1] + p.y() * hsm[1][1] + p.z() * hsm[1][2]) * invE;
347 hsm[2][3] = (p.x() * hsm[0][2] + p.y() * hsm[1][2] + p.z() * hsm[2][2]) * invE;
348 hsm[3][3] = (p.x() * p.x() * hsm[0][0] + p.y() * p.y() * hsm[1][1] + p.z() * p.z() * hsm[2][2]
349 + 2.0 * p.x() * p.y() * hsm[0][1]
350 + 2.0 * p.x() * p.z() * hsm[0][2]
351 + 2.0 * p.y() * p.z() * hsm[1][2]) * invE * invE;
352 hsm[3][4] = (p.x() * hsm[0][4] + p.y() * hsm[1][4] + p.z() * hsm[2][4]) * invE;
353 hsm[3][5] = (p.x() * hsm[0][5] + p.y() * hsm[1][5] + p.z() * hsm[2][5]) * invE;
354 hsm[3][6] = (p.x() * hsm[0][6] + p.y() * hsm[1][6] + p.z() * hsm[2][6]) * invE;
361 KFitBase::makeError3(
const CLHEP::HepLorentzVector& p1,
const CLHEP::HepLorentzVector& p2,
const CLHEP::HepMatrix& e,
362 const bool is_fix_mass1,
363 const bool is_fix_mass2)
const
370 if (is_fix_mass1 && is_fix_mass2) {
371 if (!isNonZeroEnergy(p1))
return HepSymMatrix(KFitConst::kNumber7, 0);
372 if (!isNonZeroEnergy(p2))
return HepSymMatrix(KFitConst::kNumber7, 0);
376 const double invE1 = 1 / p1.t();
377 const double invE2 = 1 / p2.t();
378 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
379 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
380 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
381 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
382 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
383 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
384 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
385 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
386 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
387 hm[3][3] = (p1.x() * p2.x() * hm[0][0] + p1.y() * p2.y() * hm[1][1] + p1.z() * p2.z() * hm[2][2] +
388 p1.x() * p2.y() * hm[0][1] + p2.x() * p1.y() * hm[1][0] +
389 p1.x() * p2.z() * hm[0][2] + p2.x() * p1.z() * hm[2][0] +
390 p1.y() * p2.z() * hm[1][2] + p2.y() * p1.z() * hm[2][1]) * invE1 * invE2;
391 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
392 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
393 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
399 if (is_fix_mass1 && !is_fix_mass2) {
400 if (!isNonZeroEnergy(p1))
return HepSymMatrix(KFitConst::kNumber7, 0);
404 const double invE1 = 1 / p1.t();
405 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
406 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
407 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
408 hm[3][3] = (p1.x() * hm[0][3] + p1.y() * hm[1][3] + p1.z() * hm[2][3]) * invE1;
409 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
410 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
411 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
417 if (!is_fix_mass1 && is_fix_mass2) {
418 if (!isNonZeroEnergy(p2))
return HepSymMatrix(KFitConst::kNumber7, 0);
422 const double invE2 = 1 / p2.t();
423 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
424 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
425 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
426 hm[3][3] = (p2.x() * hm[3][0] + p2.y() * hm[3][1] + p2.z() * hm[3][2]) * invE2;
427 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
428 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
429 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
439 KFitBase::makeError4(
const HepLorentzVector& p,
const HepMatrix& e)
const
445 if (!isNonZeroEnergy(p))
return HepSymMatrix(KFitConst::kNumber7, 0);
449 const double invE = 1 / p.t();
450 hm[0][3] = (p.x() * hm[0][0] + p.y() * hm[0][1] + p.z() * hm[0][2]) * invE;
451 hm[1][3] = (p.x() * hm[1][0] + p.y() * hm[1][1] + p.z() * hm[1][2]) * invE;
452 hm[2][3] = (p.x() * hm[2][0] + p.y() * hm[2][1] + p.z() * hm[2][2]) * invE;
459 KFitBase::prepareCorrelation() {
460 if (m_BeforeCorrelation.size() != (
double)m_TrackCount * ((
double)m_TrackCount - 1)*.5)
462 m_ErrorCode = KFitError::kBadCorrelationSize;
463 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
467 HepMatrix tmp_hm(KFitConst::kNumber6, KFitConst::kNumber6, 0);
468 int row = 0, col = 0;
470 for (
auto& hm : m_BeforeCorrelation)
473 if (row == m_TrackCount) {
479 for (
int i = 0; i < 3; i++)
for (
int j = 0; j < 3; j++) {
480 tmp_hm[i][j] = hm[i][j];
481 tmp_hm[3 + i][3 + j] = hm[4 + i][4 + j];
482 tmp_hm[3 + i][j] = hm[4 + i][j];
483 tmp_hm[i][3 + j] = hm[i][4 + j];
487 for (
int i = KFitConst::kNumber6 * row; i < KFitConst::kNumber6 * (row + 1); i++) {
488 for (
int j = KFitConst::kNumber6 * col; j < KFitConst::kNumber6 * (col + 1); j++) {
489 m_V_al_0[i][j] = tmp_hm[ii][jj];
497 return m_ErrorCode = KFitError::kNoError;
503 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
505 if (m_TrackCount < m_NecessaryTrackCount)
507 m_ErrorCode = KFitError::kBadTrackSize;
508 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
512 if (prepareInputMatrix() != KFitError::kNoError)
return m_ErrorCode;
513 if (calculateNDF() != KFitError::kNoError)
return m_ErrorCode;
517 double tmp_chisq = KFitConst::kInitialCHIsq;
520 HepMatrix tmp_al_1(m_al_1);
521 HepMatrix tmp_V_al_1(m_V_al_1);
524 HepMatrix tmp_al_a(m_al_a);
527 for (
int i = 0; i < KFitConst::kMaxIterationCount; i++)
529 if (makeCoreMatrix() != KFitError::kNoError)
return m_ErrorCode;
531 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
532 if (err_inverse != 0) {
533 m_ErrorCode = KFitError::kCannotGetMatrixInverse;
537 m_lam = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
538 chisq = ((m_lam.T()) * (m_D * (m_al_0 - m_al_1) + m_d))(1, 1);
539 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
540 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_D * m_D * m_V_al_0;
542 if (tmp_chisq <= chisq) {
544 m_ErrorCode = KFitError::kBadInitialCHIsq;
550 m_V_al_1 = tmp_V_al_1;
557 tmp_V_al_1 = m_V_al_1;
558 if (i == KFitConst::kMaxIterationCount - 1) {
560 m_FlagOverIteration =
true;
565 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
567 if (prepareOutputMatrix() != KFitError::kNoError)
return m_ErrorCode;
573 return m_ErrorCode = KFitError::kNoError;
579 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
581 if (m_TrackCount < m_NecessaryTrackCount)
583 m_ErrorCode = KFitError::kBadTrackSize;
584 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
588 if (prepareInputMatrix() != KFitError::kNoError)
return m_ErrorCode;
589 if (calculateNDF() != KFitError::kNoError)
return m_ErrorCode;
593 double tmp2_chisq = KFitConst::kInitialCHIsq;
597 HepMatrix tmp_al_a(m_al_a);
599 HepMatrix tmp_D(m_D), tmp_E(m_E);
600 HepMatrix tmp_V_D(m_V_D), tmp_V_E(m_V_E);
601 HepMatrix tmp_lam0(m_lam0), tmp_v_a(m_v_a);
603 HepMatrix tmp2_D(m_D), tmp2_E(m_E);
604 HepMatrix tmp2_V_D(m_V_D), tmp2_V_E(m_V_E);
605 HepMatrix tmp2_lam0(m_lam0), tmp2_v_a(m_v_a), tmp2_v(m_v_a);
608 for (
int j = 0; j < KFitConst::kMaxIterationCount; j++)
611 double tmp_chisq = KFitConst::kInitialCHIsq;
613 for (
int i = 0; i < KFitConst::kMaxIterationCount; i++) {
615 if (prepareInputSubMatrix() != KFitError::kNoError)
return m_ErrorCode;
616 if (makeCoreMatrix() != KFitError::kNoError)
return m_ErrorCode;
618 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
620 m_ErrorCode = KFitError::kCannotGetMatrixInverse;
624 m_V_E = ((m_E.T()) * m_V_D * m_E).inverse(err_inverse);
626 m_ErrorCode = KFitError::kCannotGetMatrixInverse;
629 m_lam0 = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
630 chisq = ((m_lam0.T()) * (m_D * (m_al_0 - m_al_1) + m_E * (m_v - m_v_a) + m_d))(1, 1);
631 m_v_a = m_v_a - m_V_E * (m_E.T()) * m_lam0;
633 if (tmp_chisq <= chisq) {
635 m_ErrorCode = KFitError::kBadInitialCHIsq;
655 if (i == KFitConst::kMaxIterationCount - 1) {
656 m_FlagOverIteration =
true;
663 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
664 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
680 if (tmp2_chisq <= chisq) {
701 if (j == KFitConst::kMaxIterationCount - 1) {
702 m_FlagOverIteration =
true;
709 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
711 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
712 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
713 m_V_Dt = m_V_D - m_V_D * m_E * m_V_E * (m_E.T()) * m_V_D;
714 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_Dt * m_D * m_V_al_0;
715 m_Cov_v_al_1 = -m_V_E * (m_E.T()) * m_V_D * m_D * m_V_al_0;
717 if (prepareOutputMatrix() != KFitError::kNoError)
return m_ErrorCode;
723 return m_ErrorCode = KFitError::kNoError;
728 KFitBase::isFitted()
const
730 if (m_FlagFitted)
return true;
732 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kNotFittedYet);
739 KFitBase::isTrackIDInRange(
const int id)
const
741 if (0 <=
id &&
id < m_TrackCount)
return true;
743 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
750 KFitBase::isNonZeroEnergy(
const HepLorentzVector& p)
const
752 if (p.t() != 0)
return true;
754 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kDivisionByZero);
Class to store reconstructed particles.
ROOT::Math::XYZVector getVertex() const
Returns vertex position (POCA for charged, IP for neutral FS particles)
double getCharge(void) const
Returns particle charge.
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
TMatrixFSym getMomentumVertexErrorMatrix() const
Returns 7x7 error matrix.
ECode
ECode is a error code enumerate.
KFitTrack is a container of the track information (Lorentz vector, position, and error matrix),...
Abstract base class for different kinds of events.