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 HepLorentzVector& p,
const HepPoint3D& x,
const 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()),
64 ROOTToCLHEP::getHepSymMatrix(particle->getMomentumVertexErrorMatrix()),
65 particle->getCharge());
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 HepLorentzVector& p,
const 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 HepLorentzVector& p1,
const HepLorentzVector& p2,
const 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 HepLorentzVector& p,
const 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 HepLorentzVector& p1,
const HepLorentzVector& p2,
const HepMatrix& e,
const bool is_fix_mass1,
362 const bool is_fix_mass2)
const
369 if (is_fix_mass1 && is_fix_mass2) {
370 if (!isNonZeroEnergy(p1))
return HepSymMatrix(KFitConst::kNumber7, 0);
371 if (!isNonZeroEnergy(p2))
return HepSymMatrix(KFitConst::kNumber7, 0);
375 const double invE1 = 1 / p1.t();
376 const double invE2 = 1 / p2.t();
377 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
378 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
379 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
380 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
381 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
382 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
383 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
384 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
385 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
386 hm[3][3] = (p1.x() * p2.x() * hm[0][0] + p1.y() * p2.y() * hm[1][1] + p1.z() * p2.z() * hm[2][2] +
387 p1.x() * p2.y() * hm[0][1] + p2.x() * p1.y() * hm[1][0] +
388 p1.x() * p2.z() * hm[0][2] + p2.x() * p1.z() * hm[2][0] +
389 p1.y() * p2.z() * hm[1][2] + p2.y() * p1.z() * hm[2][1]) * invE1 * invE2;
390 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
391 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
392 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
398 if (is_fix_mass1 && !is_fix_mass2) {
399 if (!isNonZeroEnergy(p1))
return HepSymMatrix(KFitConst::kNumber7, 0);
403 const double invE1 = 1 / p1.t();
404 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
405 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
406 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
407 hm[3][3] = (p1.x() * hm[0][3] + p1.y() * hm[1][3] + p1.z() * hm[2][3]) * invE1;
408 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
409 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
410 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
416 if (!is_fix_mass1 && is_fix_mass2) {
417 if (!isNonZeroEnergy(p2))
return HepSymMatrix(KFitConst::kNumber7, 0);
421 const double invE2 = 1 / p2.t();
422 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
423 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
424 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
425 hm[3][3] = (p2.x() * hm[3][0] + p2.y() * hm[3][1] + p2.z() * hm[3][2]) * invE2;
426 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
427 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
428 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
438 KFitBase::makeError4(
const HepLorentzVector& p,
const HepMatrix& e)
const
444 if (!isNonZeroEnergy(p))
return HepSymMatrix(KFitConst::kNumber7, 0);
448 const double invE = 1 / p.t();
449 hm[0][3] = (p.x() * hm[0][0] + p.y() * hm[0][1] + p.z() * hm[0][2]) * invE;
450 hm[1][3] = (p.x() * hm[1][0] + p.y() * hm[1][1] + p.z() * hm[1][2]) * invE;
451 hm[2][3] = (p.x() * hm[2][0] + p.y() * hm[2][1] + p.z() * hm[2][2]) * invE;
458 KFitBase::prepareCorrelation() {
459 if (m_BeforeCorrelation.size() != (
double)m_TrackCount * ((
double)m_TrackCount - 1)*.5)
461 m_ErrorCode = KFitError::kBadCorrelationSize;
462 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
466 HepMatrix tmp_hm(KFitConst::kNumber6, KFitConst::kNumber6, 0);
467 int row = 0, col = 0;
469 for (
auto& hm : m_BeforeCorrelation)
472 if (row == m_TrackCount) {
478 for (
int i = 0; i < 3; i++)
for (
int j = 0; j < 3; j++) {
479 tmp_hm[i][j] = hm[i][j];
480 tmp_hm[3 + i][3 + j] = hm[4 + i][4 + j];
481 tmp_hm[3 + i][j] = hm[4 + i][j];
482 tmp_hm[i][3 + j] = hm[i][4 + j];
486 for (
int i = KFitConst::kNumber6 * row; i < KFitConst::kNumber6 * (row + 1); i++) {
487 for (
int j = KFitConst::kNumber6 * col; j < KFitConst::kNumber6 * (col + 1); j++) {
488 m_V_al_0[i][j] = tmp_hm[ii][jj];
496 return m_ErrorCode = KFitError::kNoError;
502 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
504 if (m_TrackCount < m_NecessaryTrackCount)
506 m_ErrorCode = KFitError::kBadTrackSize;
507 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
511 if (prepareInputMatrix() != KFitError::kNoError)
return m_ErrorCode;
512 if (calculateNDF() != KFitError::kNoError)
return m_ErrorCode;
516 double tmp_chisq = KFitConst::kInitialCHIsq;
519 HepMatrix tmp_al_1(m_al_1);
520 HepMatrix tmp_V_al_1(m_V_al_1);
523 HepMatrix tmp_al_a(m_al_a);
526 for (
int i = 0; i < KFitConst::kMaxIterationCount; i++)
528 if (makeCoreMatrix() != KFitError::kNoError)
return m_ErrorCode;
530 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
531 if (err_inverse != 0) {
532 m_ErrorCode = KFitError::kCannotGetMatrixInverse;
536 m_lam = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
537 chisq = ((m_lam.T()) * (m_D * (m_al_0 - m_al_1) + m_d))(1, 1);
538 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
539 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_D * m_D * m_V_al_0;
541 if (tmp_chisq <= chisq) {
543 m_ErrorCode = KFitError::kBadInitialCHIsq;
549 m_V_al_1 = tmp_V_al_1;
556 tmp_V_al_1 = m_V_al_1;
557 if (i == KFitConst::kMaxIterationCount - 1) {
559 m_FlagOverIteration =
true;
564 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
566 if (prepareOutputMatrix() != KFitError::kNoError)
return m_ErrorCode;
572 return m_ErrorCode = KFitError::kNoError;
578 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
580 if (m_TrackCount < m_NecessaryTrackCount)
582 m_ErrorCode = KFitError::kBadTrackSize;
583 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
587 if (prepareInputMatrix() != KFitError::kNoError)
return m_ErrorCode;
588 if (calculateNDF() != KFitError::kNoError)
return m_ErrorCode;
592 double tmp2_chisq = KFitConst::kInitialCHIsq;
596 HepMatrix tmp_al_a(m_al_a);
598 HepMatrix tmp_D(m_D), tmp_E(m_E);
599 HepMatrix tmp_V_D(m_V_D), tmp_V_E(m_V_E);
600 HepMatrix tmp_lam0(m_lam0), tmp_v_a(m_v_a);
602 HepMatrix tmp2_D(m_D), tmp2_E(m_E);
603 HepMatrix tmp2_V_D(m_V_D), tmp2_V_E(m_V_E);
604 HepMatrix tmp2_lam0(m_lam0), tmp2_v_a(m_v_a), tmp2_v(m_v_a);
607 for (
int j = 0; j < KFitConst::kMaxIterationCount; j++)
610 double tmp_chisq = KFitConst::kInitialCHIsq;
612 for (
int i = 0; i < KFitConst::kMaxIterationCount; i++) {
614 if (prepareInputSubMatrix() != KFitError::kNoError)
return m_ErrorCode;
615 if (makeCoreMatrix() != KFitError::kNoError)
return m_ErrorCode;
617 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
619 m_ErrorCode = KFitError::kCannotGetMatrixInverse;
623 m_V_E = ((m_E.T()) * m_V_D * m_E).inverse(err_inverse);
625 m_ErrorCode = KFitError::kCannotGetMatrixInverse;
628 m_lam0 = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
629 chisq = ((m_lam0.T()) * (m_D * (m_al_0 - m_al_1) + m_E * (m_v - m_v_a) + m_d))(1, 1);
630 m_v_a = m_v_a - m_V_E * (m_E.T()) * m_lam0;
632 if (tmp_chisq <= chisq) {
634 m_ErrorCode = KFitError::kBadInitialCHIsq;
654 if (i == KFitConst::kMaxIterationCount - 1) {
655 m_FlagOverIteration =
true;
662 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
663 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
679 if (tmp2_chisq <= chisq) {
700 if (j == KFitConst::kMaxIterationCount - 1) {
701 m_FlagOverIteration =
true;
708 if (m_ErrorCode != KFitError::kNoError)
return m_ErrorCode;
710 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
711 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
712 m_V_Dt = m_V_D - m_V_D * m_E * m_V_E * (m_E.T()) * m_V_D;
713 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_Dt * m_D * m_V_al_0;
714 m_Cov_v_al_1 = -m_V_E * (m_E.T()) * m_V_D * m_D * m_V_al_0;
716 if (prepareOutputMatrix() != KFitError::kNoError)
return m_ErrorCode;
722 return m_ErrorCode = KFitError::kNoError;
727 KFitBase::isFitted()
const
729 if (m_FlagFitted)
return true;
731 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kNotFittedYet);
738 KFitBase::isTrackIDInRange(
const int id)
const
740 if (0 <=
id &&
id < m_TrackCount)
return true;
742 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
749 KFitBase::isNonZeroEnergy(
const HepLorentzVector& p)
const
751 if (p.t() != 0)
return true;
753 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kDivisionByZero);
Class to store reconstructed particles.
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.