Belle II Software  release-06-00-14
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 
16 
17 using namespace std;
18 using namespace Belle2;
19 using namespace Belle2::analysis;
20 using namespace CLHEP;
21 
22 MassVertexFitKFit::MassVertexFitKFit():
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 
40  m_BeforeVertex = v;
41 
43 }
44 
46 {
47  m_BeforeVertex = HepPoint3D(v.X(), v.Y(), v.Z());
49  return m_ErrorCode;
50 }
51 
54  m_InvariantMass = m;
55 
57 }
58 
59 
62  m_IsFixMass.push_back(true);
63 
65 }
66 
67 
70  m_IsFixMass.push_back(false);
71 
73 }
74 
75 
77 MassVertexFitKFit::setCorrelation(const HepMatrix& m) {
78  return KFitBase::setCorrelation(m);
79 }
80 
81 
85 }
86 
87 
88 const HepPoint3D
89 MassVertexFitKFit::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 
107 const HepSymMatrix
109 {
110  return m_AfterVertexError;
111 }
112 
113 
114 double
116 {
117  return m_InvariantMass;
118 }
119 
120 
121 double
123 {
124  return m_CHIsq;
125 }
126 
127 
128 const HepMatrix
130 {
131  if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
132 
133  return m_AfterTrackVertexError[id];
134 }
135 
136 
137 double
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 
172 const HepMatrix
173 MassVertexFitKFit::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 
199 enum KFitError::ECode
201  return KFitBase::doFit2();
202 }
203 
204 
205 enum KFitError::ECode
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 = KFitConst::kLightSpeed; // C++ bug?
249  // m_property[index][2] = -KFitConst::kLightSpeed * m_MagneticField * it->getCharge();
250  m_property[index][2] = -c * m_MagneticField * track.getCharge();
251  index++;
252  }
253 
254  // error between track and track
255  if (m_FlagCorrelation)
256  {
257  this->prepareCorrelation();
259  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
260  return m_ErrorCode;
261  }
262  }
263 
264  // vertex
265  m_v_a[0][0] = m_BeforeVertex.x();
266  m_v_a[1][0] = m_BeforeVertex.y();
267  m_v_a[2][0] = m_BeforeVertex.z();
268 
269  // set member matrix
270  m_al_1 = m_al_0;
271 
273  m_D = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, KFitConst::kNumber7 * m_TrackCount);
274  m_E = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 3);
275  m_d = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
276  m_V_D = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
277  m_lam = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
278  m_lam0 = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
279  m_V_Dt = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
281 
283 }
284 
285 
286 enum KFitError::ECode
288  // vertex
289  for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
290 
292 }
293 
294 
295 enum KFitError::ECode
297  if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
298  {
300  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
301  return m_ErrorCode;
302  }
303 
304  int row = 0, col = 0;
305 
306  for (auto& hm : m_BeforeCorrelation)
307  {
308  // counter
309  row++;
310  if (row == m_TrackCount) {
311  col++;
312  row = col + 1;
313  }
314 
315  int ii = 0, jj = 0;
316  for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
317  for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
318  m_V_al_0[i][j] = hm[ii][jj];
319  jj++;
320  }
321  jj = 0;
322  ii++;
323  }
324  }
325 
327 }
328 
329 
330 enum KFitError::ECode
332  Hep3Vector h3v;
333  int index = 0;
334  for (auto& pdata : m_Tracks)
335  {
336  // tracks
337  // momentum
338  h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
339  h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
340  h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
341  if (m_IsFixMass[index])
342  pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
343  else
344  pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
345  // position
346  pdata.setPosition(HepPoint3D(
347  m_al_1[index * KFitConst::kNumber7 + 4][0],
348  m_al_1[index * KFitConst::kNumber7 + 5][0],
350  // error of the tracks
351  pdata.setError(this->makeError3(pdata.getMomentum(),
352  m_V_al_1.sub(
353  index * KFitConst::kNumber7 + 1,
354  (index + 1)*KFitConst::kNumber7,
355  index * KFitConst::kNumber7 + 1,
356  (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
358  if (m_ErrorCode != KFitError::kNoError) break;
359  index++;
360  }
361 
362  // vertex
363  m_AfterVertex.setX(m_v_a[0][0]);
364  m_AfterVertex.setY(m_v_a[1][0]);
365  m_AfterVertex.setZ(m_v_a[2][0]);
366  // error of the vertex
367  for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++)
368  {
369  m_AfterVertexError[i][j] = m_V_E[i][j];
370  }
371  // error between vertex and tracks
372  for (int i = 0; i < m_TrackCount; i++)
373  {
374  HepMatrix hm(3, KFitConst::kNumber7, 0);
375  for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
376  hm[j][k] = m_Cov_v_al_1[j][KFitConst::kNumber7 * i + k];
377  }
378  if (m_IsFixMass[i])
379  m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
380  else
381  m_AfterTrackVertexError.push_back(hm);
382  }
383 
385 }
386 
387 
388 enum KFitError::ECode
390  // Mass Constraint
391  HepMatrix al_1_prime(m_al_1);
392  HepMatrix Sum_al_1(4, 1, 0);
393  double energy[KFitConst::kMaxTrackCount2];
394  double a;
395 
396  for (int i = 0; i < m_TrackCount; i++)
397  {
398  a = m_property[i][2];
399  al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_v_a[1][0] - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
400  al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_v_a[0][0] - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
401  energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
402  al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
403  al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
404  m_property[i][1] * m_property[i][1]);
405  }
406 
407  for (int i = 0; i < m_TrackCount; i++)
408  {
409  if (m_IsFixMass[i])
410  Sum_al_1[3][0] += energy[i];
411  else
412  Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
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 
561 enum KFitError::ECode
563  m_NDF = 2 * m_TrackCount - 3 + 1;
564 
566 }
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) {
578  kmm.setCorrelation(getCorrelation(i, 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::getTLorentzVector(kmm.getMotherMomentum()),
601  CLHEPToROOT::getTVector3(kmm.getMotherPosition()),
602  CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
603  prob);
605  return m_ErrorCode;
606 }
Class to store reconstructed particles.
Definition: Particle.h:74
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 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:577
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
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.
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:727
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:738
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:438
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.
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.
static constexpr double kLightSpeed
Speed of light.
Definition: KFitConst.h:53
static const int kMaxTrackCount
Maximum track size.
Definition: KFitConst.h:39
static const int kMaxTrackCount2
Maximum track size (internal use)
Definition: KFitConst.h:41
static const int kAfterFit
Input parameter to specify after-fit when setting/getting a track attribute.
Definition: KFitConst.h:36
static const int kBeforeFit
Input parameter to specify before-fit when setting/getting a track attribute.
Definition: KFitConst.h:34
static const int kNumber7
Constant 7 to check matrix size (internal use)
Definition: KFitConst.h:31