Belle II Software  light-2403-persian
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 #include <framework/gearbox/Const.h>
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 
39 MassVertexFitKFit::setInitialVertex(const HepPoint3D& v) {
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 = Belle2::Const::speedOfLight * 1e-4;
249  m_property[index][2] = -c * m_MagneticField * track.getCharge();
250  index++;
251  }
252 
253  // error between track and track
254  if (m_FlagCorrelation)
255  {
256  this->prepareCorrelation();
258  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
259  return m_ErrorCode;
260  }
261  }
262 
263  // vertex
264  m_v_a[0][0] = m_BeforeVertex.x();
265  m_v_a[1][0] = m_BeforeVertex.y();
266  m_v_a[2][0] = m_BeforeVertex.z();
267 
268  // set member matrix
269  m_al_1 = m_al_0;
270 
272  m_D = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, KFitConst::kNumber7 * m_TrackCount);
273  m_E = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 3);
274  m_d = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
275  m_V_D = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
276  m_lam = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
277  m_lam0 = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, 1);
278  m_V_Dt = m_V_al_1.sub(1, m_TrackCount * 2 + 1, 1, m_TrackCount * 2 + 1);
280 
282 }
283 
284 
285 enum KFitError::ECode
287  // vertex
288  for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
289 
291 }
292 
293 
294 enum KFitError::ECode
296  if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
297  {
299  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
300  return m_ErrorCode;
301  }
302 
303  int row = 0, col = 0;
304 
305  for (auto& hm : m_BeforeCorrelation)
306  {
307  // counter
308  row++;
309  if (row == m_TrackCount) {
310  col++;
311  row = col + 1;
312  }
313 
314  int ii = 0, jj = 0;
315  for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
316  for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
317  m_V_al_0[i][j] = hm[ii][jj];
318  jj++;
319  }
320  jj = 0;
321  ii++;
322  }
323  }
324 
326 }
327 
328 
329 enum KFitError::ECode
331  Hep3Vector h3v;
332  int index = 0;
333  for (auto& pdata : m_Tracks)
334  {
335  // tracks
336  // momentum
337  h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
338  h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
339  h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
340  if (m_IsFixMass[index])
341  pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
342  else
343  pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
344  // position
345  pdata.setPosition(HepPoint3D(
346  m_al_1[index * KFitConst::kNumber7 + 4][0],
347  m_al_1[index * KFitConst::kNumber7 + 5][0],
349  // error of the tracks
350  pdata.setError(this->makeError3(pdata.getMomentum(),
351  m_V_al_1.sub(
352  index * KFitConst::kNumber7 + 1,
353  (index + 1)*KFitConst::kNumber7,
354  index * KFitConst::kNumber7 + 1,
355  (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
357  if (m_ErrorCode != KFitError::kNoError) break;
358  index++;
359  }
360 
361  // vertex
362  m_AfterVertex.setX(m_v_a[0][0]);
363  m_AfterVertex.setY(m_v_a[1][0]);
364  m_AfterVertex.setZ(m_v_a[2][0]);
365  // error of the vertex
366  for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++)
367  {
368  m_AfterVertexError[i][j] = m_V_E[i][j];
369  }
370  // error between vertex and tracks
371  for (int i = 0; i < m_TrackCount; i++)
372  {
373  HepMatrix hm(3, KFitConst::kNumber7, 0);
374  for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
375  hm[j][k] = m_Cov_v_al_1[j][KFitConst::kNumber7 * i + k];
376  }
377  if (m_IsFixMass[i])
378  m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
379  else
380  m_AfterTrackVertexError.push_back(hm);
381  }
382 
384 }
385 
386 
387 enum KFitError::ECode
389  // Mass Constraint
390  HepMatrix al_1_prime(m_al_1);
391  HepMatrix Sum_al_1(4, 1, 0);
392  std::vector<double> energy(m_TrackCount);
393  double a;
394 
395  for (int i = 0; i < m_TrackCount; i++)
396  {
397  a = m_property[i][2];
398  al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_v_a[1][0] - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
399  al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_v_a[0][0] - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
400  energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
401  al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
402  al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
403  m_property[i][1] * m_property[i][1]);
404  if (m_IsFixMass[i])
405  Sum_al_1[3][0] += energy[i];
406  else
407  Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
408  }
409 
410  for (int i = 0; i < m_TrackCount; i++)
411  {
412  for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
413  }
414 
415  m_d[2 * m_TrackCount][0] =
416  + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
417  - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
419 
420  double Sum_a = 0., Sum_tmpx = 0., Sum_tmpy = 0.;
421  for (int i = 0; i < m_TrackCount; i++)
422  {
423  if (energy[i] == 0) {
425  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
426  return m_ErrorCode;
427  }
428 
429  a = m_property[i][2];
430 
431  if (m_IsFixMass[i]) {
432  double invE = 1. / energy[i];
433  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
434  Sum_al_1[0][0]);
435  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
436  Sum_al_1[1][0]);
437  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE -
438  Sum_al_1[2][0]);
439  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 0.;
440  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
441  Sum_al_1[1][0]) * a;
442  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
443  Sum_al_1[0][0]) * a;
444  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
445  Sum_tmpx += al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE * a;
446  Sum_tmpy += al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE * a;
447  } else {
448  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
449  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
450  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
451  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
452  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
453  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
454  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
455  }
456  Sum_a += a;
457  }
458 
459  // m_E
460  m_E[2 * m_TrackCount][0] = -2.*Sum_al_1[1][0] * Sum_a + 2.*Sum_al_1[3][0] * Sum_tmpy;
461  m_E[2 * m_TrackCount][1] = 2.*Sum_al_1[0][0] * Sum_a - 2.*Sum_al_1[3][0] * Sum_tmpx;
462  m_E[2 * m_TrackCount][2] = 0.;
463 
464  for (int i = 0; i < m_TrackCount; i++)
465  {
466  double S, U;
467  double sininv;
468 
469  double px = m_al_1[i * KFitConst::kNumber7 + 0][0];
470  double py = m_al_1[i * KFitConst::kNumber7 + 1][0];
471  double pz = m_al_1[i * KFitConst::kNumber7 + 2][0];
472  double x = m_al_1[i * KFitConst::kNumber7 + 4][0];
473  double y = m_al_1[i * KFitConst::kNumber7 + 5][0];
474  double z = m_al_1[i * KFitConst::kNumber7 + 6][0];
475  a = m_property[i][2];
476 
477  double pt = sqrt(px * px + py * py);
478 
479  if (pt == 0) {
481  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
482  return m_ErrorCode;
483  }
484 
485  double invPt = 1. / pt;
486  double invPt2 = invPt * invPt;
487  double dlx = m_v_a[0][0] - x;
488  double dly = m_v_a[1][0] - y;
489  double dlz = m_v_a[2][0] - z;
490  double a1 = -dlx * py + dly * px;
491  double a2 = dlx * px + dly * py;
492  double r2d2 = dlx * dlx + dly * dly;
493  double Rx = dlx - 2.*px * a2 * invPt2;
494  double Ry = dly - 2.*py * a2 * invPt2;
495 
496  if (a != 0.) { // charged
497 
498  double B = a * a2 * invPt2;
499  if (fabs(B) > 1.) {
501  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
502  return m_ErrorCode;
503  }
504  // sin^(-1)(B)
505  sininv = asin(B);
506  double tmp0 = 1.0 - B * B;
507  if (tmp0 == 0) {
509  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
510  return m_ErrorCode;
511  }
512  // 1/sqrt(1-B^2)
513  double sqrtag = 1.0 / sqrt(tmp0);
514  S = sqrtag * invPt2;
515  U = dlz - pz * sininv / a;
516 
517  } else { // neutral
518 
519  sininv = 0.0;
520  S = invPt2;
521  U = dlz - pz * a2 * invPt2;
522 
523  }
524 
525  // d
526  m_d[i * 2 + 0][0] = a1 - 0.5 * a * r2d2;
527  m_d[i * 2 + 1][0] = U * pt;
528 
529  // D
530  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 0] = dly;
531  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 1] = -dlx;
532  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 2] = 0.0;
533  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 4] = py + a * dlx;
534  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 5] = -px + a * dly;
535  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 6] = 0.0;
536  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 0] = -pz * pt * S * Rx + U * px * invPt;
537  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 1] = -pz * pt * S * Ry + U * py * invPt;
538  if (a != 0.)
539  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -sininv * pt / a;
540  else
541  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -a2 * invPt;
542  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 4] = px * pz * pt * S;
543  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 5] = py * pz * pt * S;
544  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 6] = -pt;
545 
546  // E
547  m_E[i * 2 + 0][0] = -py - a * dlx;
548  m_E[i * 2 + 0][1] = px - a * dly;
549  m_E[i * 2 + 0][2] = 0.0;
550  m_E[i * 2 + 1][0] = -px * pz * pt * S;
551  m_E[i * 2 + 1][1] = -py * pz * pt * S;
552  m_E[i * 2 + 1][2] = pt;
553  }
554 
556 }
557 
558 
559 enum KFitError::ECode
561  m_NDF = 2 * m_TrackCount - 3 + 1;
562 
564 }
565 
567 {
568  MakeMotherKFit kmm;
570  unsigned n = getTrackCount();
571  for (unsigned i = 0; i < n; ++i) {
573  getTrack(i).getCharge());
575  for (unsigned j = i + 1; j < n; ++j) {
576  kmm.setCorrelation(getCorrelation(i, j));
577  }
578  }
579  kmm.setVertex(getVertex());
581  m_ErrorCode = kmm.doMake();
583  return m_ErrorCode;
584  double chi2 = getCHIsq();
585  int ndf = getNDF();
586  double prob = TMath::Prob(chi2, ndf);
587  //
588  bool haschi2 = mother->hasExtraInfo("chiSquared");
589  if (haschi2) {
590  mother->setExtraInfo("chiSquared", chi2);
591  mother->setExtraInfo("ndf", ndf);
592  } else {
593  mother->addExtraInfo("chiSquared", chi2);
594  mother->addExtraInfo("ndf", ndf);
595  }
596 
597  mother->updateMomentum(
598  CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
599  CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
600  CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
601  prob);
603  return m_ErrorCode;
604 }
DataType Z() const
access variable Z (= .at(2) without boundary check)
Definition: B2Vector3.h:435
DataType X() const
access variable X (= .at(0) without boundary check)
Definition: B2Vector3.h:431
DataType Y() const
access variable Y (= .at(1) without boundary check)
Definition: B2Vector3.h:433
static const double speedOfLight
[cm/ns]
Definition: Const.h:686
Class to store reconstructed particles.
Definition: Particle.h:75
void setExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition: Particle.cc:1317
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
Definition: Particle.cc:1266
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition: Particle.cc:1336
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:386
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.
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.
Definition: ClusterUtils.h:24
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