Belle II Software  light-2403-persian
MassPointingVertexFitKFit.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <analysis/VertexFitting/KFit/MakeMotherKFit.h>
10 #include <analysis/VertexFitting/KFit/MassPointingVertexFitKFit.h>
11 #include <analysis/utility/CLHEPToROOT.h>
12 #include <framework/gearbox/Const.h>
13 
14 #include <TMath.h>
15 
16 using namespace std;
17 using namespace Belle2;
18 using namespace Belle2::analysis;
19 using namespace CLHEP;
20 
21 MassPointingVertexFitKFit::MassPointingVertexFitKFit():
22  m_BeforeVertex(HepPoint3D(0., 0., 0.)),
23  m_AfterVertexError(HepSymMatrix(3, 0)),
24  m_ProductionVertex(HepPoint3D(0., 0., 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 
45 
48  m_InvariantMass = m;
49 
51 }
52 
53 
57 
59 }
60 
61 
64  m_IsFixMass.push_back(true);
65 
67 }
68 
69 
72  m_IsFixMass.push_back(false);
73 
75 }
76 
77 
80  return KFitBase::setCorrelation(m);
81 }
82 
83 
87 }
88 
89 
90 const HepPoint3D
92 {
93  if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
94 
95  switch (flag) {
97  return m_BeforeVertex;
98 
100  return m_AfterVertex;
101 
102  default:
103  KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
104  return HepPoint3D();
105  }
106 }
107 
108 
109 const HepSymMatrix
111 {
112  return m_AfterVertexError;
113 }
114 
115 
116 double
118 {
119  return m_InvariantMass;
120 }
121 
122 
123 double
125 {
126  return m_CHIsq;
127 }
128 
129 
130 const HepMatrix
132 {
133  if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
134 
135  return m_AfterTrackVertexError[id];
136 }
137 
138 
139 double
141 {
142  if (!isFitted()) return -1;
143  if (!isTrackIDInRange(id)) return -1;
144 
145  if (m_IsFixMass[id]) {
146 
147  HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
148  int err_inverse = 0;
149  const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
150 
151  if (err_inverse) {
152  KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
153  return -1;
154  }
155 
156  return chisq;
157 
158  } else {
159 
160  HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
161  int err_inverse = 0;
162  const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
163 
164  if (err_inverse) {
165  KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
166  return -1;
167  }
168 
169  return chisq;
170  }
171 }
172 
173 
174 const HepMatrix
175 MassPointingVertexFitKFit::getCorrelation(const int id1, const int id2, const int flag) const
176 {
177  if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
178  if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
179  if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
180 
181  switch (flag) {
183  return KFitBase::getCorrelation(id1, id2, flag);
184 
186  return makeError3(
187  this->getTrackMomentum(id1),
188  this->getTrackMomentum(id2),
189  m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
190  KFitConst::kNumber7 * (id2 + 1)),
191  m_IsFixMass[id1],
192  m_IsFixMass[id2]);
193 
194  default:
195  KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
196  return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
197  }
198 }
199 
200 
201 enum KFitError::ECode
203  return KFitBase::doFit2();
204 }
205 
206 
207 enum KFitError::ECode
210  {
212  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
213  return m_ErrorCode;
214  }
215 
216 
217  if (m_IsFixMass.size() == 0)
218  {
219  // If no fix_mass flag at all,
220  // all tracks are considered to be fixed at mass.
221  for (int i = 0; i < m_TrackCount; i++) this->fixMass();
222  } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
223  {
225  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
226  return m_ErrorCode;
227  }
228 
229 
230  int index = 0;
231  m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
232  m_property = HepMatrix(m_TrackCount, 3, 0);
233  m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
234 
235  for (auto& track : m_Tracks)
236  {
237  // momentum x,y,z,E and position x,y,z
238  m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
239  m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
240  m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
241  m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
242  m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
243  m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
244  m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
245  // these error
246  m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
247  // charge, mass, a
248  m_property[index][0] = track.getCharge();
249  m_property[index][1] = track.getMass();
250  const double c = Belle2::Const::speedOfLight * 1e-4;
251  m_property[index][2] = -c * m_MagneticField * track.getCharge();
252  index++;
253  }
254 
255  // error between track and track
256  if (m_FlagCorrelation)
257  {
258  this->prepareCorrelation();
260  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
261  return m_ErrorCode;
262  }
263  }
264 
265  // vertex
266  m_v_a[0][0] = m_BeforeVertex.x();
267  m_v_a[1][0] = m_BeforeVertex.y();
268  m_v_a[2][0] = m_BeforeVertex.z();
269 
270  // set member matrix
271  m_al_1 = m_al_0;
272 
274  m_D = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, KFitConst::kNumber7 * m_TrackCount);
275  m_E = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 3);
276  m_d = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
277  m_V_D = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, m_TrackCount * 2 + 3);
278  m_lam = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
279  m_lam0 = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
280  m_V_Dt = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, m_TrackCount * 2 + 3);
282 
284 }
285 
286 
287 enum KFitError::ECode
289  // vertex
290  for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
291 
293 }
294 
295 
296 enum KFitError::ECode
298  if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
299  {
301  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
302  return m_ErrorCode;
303  }
304 
305  int row = 0, col = 0;
306 
307  for (auto& hm : m_BeforeCorrelation)
308  {
309  // counter
310  row++;
311  if (row == m_TrackCount) {
312  col++;
313  row = col + 1;
314  }
315 
316  int ii = 0, jj = 0;
317  for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
318  for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
319  m_V_al_0[i][j] = hm[ii][jj];
320  jj++;
321  }
322  jj = 0;
323  ii++;
324  }
325  }
326 
328 }
329 
330 
331 enum KFitError::ECode
333  Hep3Vector h3v;
334  int index = 0;
335  for (auto& pdata : m_Tracks)
336  {
337  // tracks
338  // momentum
339  h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
340  h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
341  h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
342  if (m_IsFixMass[index])
343  pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
344  else
345  pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
346  // position
347  pdata.setPosition(HepPoint3D(
348  m_al_1[index * KFitConst::kNumber7 + 4][0],
349  m_al_1[index * KFitConst::kNumber7 + 5][0],
351  // error of the tracks
352  pdata.setError(this->makeError3(pdata.getMomentum(),
353  m_V_al_1.sub(
354  index * KFitConst::kNumber7 + 1,
355  (index + 1)*KFitConst::kNumber7,
356  index * KFitConst::kNumber7 + 1,
357  (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
359  if (m_ErrorCode != KFitError::kNoError) break;
360  index++;
361  }
362 
363  // vertex
364  m_AfterVertex.setX(m_v_a[0][0]);
365  m_AfterVertex.setY(m_v_a[1][0]);
366  m_AfterVertex.setZ(m_v_a[2][0]);
367  // error of the vertex
368  for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++)
369  {
370  m_AfterVertexError[i][j] = m_V_E[i][j];
371  }
372  // error between vertex and tracks
373  for (int i = 0; i < m_TrackCount; i++)
374  {
375  HepMatrix hm(3, KFitConst::kNumber7, 0);
376  for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
377  hm[j][k] = m_Cov_v_al_1[j][KFitConst::kNumber7 * i + k];
378  }
379  if (m_IsFixMass[i])
380  m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
381  else
382  m_AfterTrackVertexError.push_back(hm);
383  }
384 
386 }
387 
388 
389 enum KFitError::ECode
391  // Mass Constraint
392  HepMatrix al_1_prime(m_al_1);
393  HepMatrix Sum_al_1(4, 1, 0);
394  std::vector<double> energy(m_TrackCount);
395  double a;
396 
397  for (int i = 0; i < m_TrackCount; i++)
398  {
399  a = m_property[i][2];
400  al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_v_a[1][0] - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
401  al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_v_a[0][0] - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
402  energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
403  al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
404  al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
405  m_property[i][1] * m_property[i][1]);
406  if (m_IsFixMass[i])
407  Sum_al_1[3][0] += energy[i];
408  else
409  Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
410  }
411 
412  for (int i = 0; i < m_TrackCount; i++)
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  double vtx = sqrt((m_v_a[0][0] - m_ProductionVertex.x()) * (m_v_a[0][0] - m_ProductionVertex.x())
418  + (m_v_a[1][0] - m_ProductionVertex.y()) * (m_v_a[1][0] - m_ProductionVertex.y())
419  + (m_v_a[2][0] - m_ProductionVertex.z()) * (m_v_a[2][0] - m_ProductionVertex.z()));
420  double vtxpt2 = (m_ProductionVertex.x() - m_v_a[0][0]) * (m_ProductionVertex.x() - m_v_a[0][0]) + (m_ProductionVertex.y() - m_v_a[1][0]) * (m_ProductionVertex.y() - m_v_a[1][0]);
421  double mom = sqrt(Sum_al_1[0][0] * Sum_al_1[0][0] + Sum_al_1[1][0] * Sum_al_1[1][0] + Sum_al_1[2][0] * Sum_al_1[2][0]);
422  double Pt2 = Sum_al_1[0][0] * Sum_al_1[0][0] + Sum_al_1[1][0] * Sum_al_1[1][0];
423 
424  m_d[2 * m_TrackCount][0] =
425  + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
426  - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
428 
429  double phiPointingConstraint = atan2(m_v_a[1][0] - m_ProductionVertex.y(), m_v_a[0][0] - m_ProductionVertex.x()) - atan2(Sum_al_1[1][0], Sum_al_1[0][0]);
430  phiPointingConstraint = std::fmod(phiPointingConstraint + TMath::Pi(), TMath::TwoPi());
431  if (phiPointingConstraint < 0) phiPointingConstraint += TMath::TwoPi();
432  phiPointingConstraint -= TMath::Pi();
433 
434  m_d[2 * m_TrackCount + 1][0] = phiPointingConstraint;
435  m_d[2 * m_TrackCount + 2][0] = acos((m_v_a[2][0] - m_ProductionVertex.z()) / vtx) - acos(Sum_al_1[2][0] / mom);
436 
437  double Sum_a = 0., Sum_tmpx = 0., Sum_tmpy = 0.;
438  for (int i = 0; i < m_TrackCount; i++)
439  {
440  if (energy[i] == 0) {
442  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
443  return m_ErrorCode;
444  }
445 
446  a = m_property[i][2];
447 
448  if (m_IsFixMass[i]) {
449  double invE = 1. / energy[i];
450  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
451  Sum_al_1[0][0]);
452  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
453  Sum_al_1[1][0]);
454  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE -
455  Sum_al_1[2][0]);
456  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 0.;
457  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
458  Sum_al_1[1][0]) * a;
459  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
460  Sum_al_1[0][0]) * a;
461  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
462  Sum_tmpx += al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE * a;
463  Sum_tmpy += al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE * a;
464  } else {
465  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
466  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
467  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
468  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
469  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
470  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
471  m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
472  }
473  m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 0] = Sum_al_1[1][0] / Pt2;
474  m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 1] = - Sum_al_1[0][0] / Pt2;
475  m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 2] = 0.;
476  m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 3] = 0.;
477  m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 4] = a * Sum_al_1[0][0] / Pt2;
478  m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 5] = a * Sum_al_1[1][0] / Pt2;
479  m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 6] = 0.;
480  m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 0] = - Sum_al_1[0][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
481  m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 1] = - Sum_al_1[1][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
482  m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 2] = sqrt(Pt2) / (mom * mom);
483  m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 3] = 0.;
484  m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 4] = a * Sum_al_1[1][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
485  m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 5] = - a * Sum_al_1[0][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
486  m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 6] = 0.;
487  Sum_a += a;
488  }
489 
490  // m_E
491  m_E[2 * m_TrackCount][0] = -2.*Sum_al_1[1][0] * Sum_a + 2.*Sum_al_1[3][0] * Sum_tmpy;
492  m_E[2 * m_TrackCount][1] = 2.*Sum_al_1[0][0] * Sum_a - 2.*Sum_al_1[3][0] * Sum_tmpx;
493  m_E[2 * m_TrackCount][2] = 0.;
494  m_E[2 * m_TrackCount + 1][0] = (m_ProductionVertex.y() - m_v_a[1][0]) / vtxpt2 - Sum_a * Sum_al_1[0][0] / Pt2;
495  m_E[2 * m_TrackCount + 1][1] = (m_v_a[0][0] - m_ProductionVertex.x()) / vtxpt2 - Sum_a * Sum_al_1[1][0] / Pt2;
496  m_E[2 * m_TrackCount + 1][2] = 0.;
497  m_E[2 * m_TrackCount + 2][0] = (m_v_a[0][0] - m_ProductionVertex.x()) * (m_v_a[2][0] - m_ProductionVertex.z()) / (vtx* vtx * sqrt(vtxpt2)) - Sum_a * Sum_al_1[1][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
498  m_E[2 * m_TrackCount + 2][1] = (m_v_a[1][0] - m_ProductionVertex.y()) * (m_v_a[2][0] - m_ProductionVertex.z()) / (vtx* vtx * sqrt(vtxpt2)) + Sum_a * Sum_al_1[0][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
499  m_E[2 * m_TrackCount + 2][2] = - sqrt(vtxpt2) / (vtx * vtx);
500 
501  for (int i = 0; i < m_TrackCount; i++)
502  {
503  double S, U;
504  double sininv;
505 
506  double px = m_al_1[i * KFitConst::kNumber7 + 0][0];
507  double py = m_al_1[i * KFitConst::kNumber7 + 1][0];
508  double pz = m_al_1[i * KFitConst::kNumber7 + 2][0];
509  double x = m_al_1[i * KFitConst::kNumber7 + 4][0];
510  double y = m_al_1[i * KFitConst::kNumber7 + 5][0];
511  double z = m_al_1[i * KFitConst::kNumber7 + 6][0];
512  a = m_property[i][2];
513 
514  double pt = sqrt(px * px + py * py);
515 
516  if (pt == 0) {
518  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
519  return m_ErrorCode;
520  }
521 
522  double invPt = 1. / pt;
523  double invPt2 = invPt * invPt;
524  double dlx = m_v_a[0][0] - x;
525  double dly = m_v_a[1][0] - y;
526  double dlz = m_v_a[2][0] - z;
527  double a1 = -dlx * py + dly * px;
528  double a2 = dlx * px + dly * py;
529  double r2d2 = dlx * dlx + dly * dly;
530  double Rx = dlx - 2.*px * a2 * invPt2;
531  double Ry = dly - 2.*py * a2 * invPt2;
532 
533  if (a != 0.) { // charged
534 
535  double B = a * a2 * invPt2;
536  if (fabs(B) > 1.) {
538  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
539  return m_ErrorCode;
540  }
541  // sin^(-1)(B)
542  sininv = asin(B);
543  double tmp0 = 1.0 - B * B;
544  if (tmp0 == 0) {
546  KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
547  return m_ErrorCode;
548  }
549  // 1/sqrt(1-B^2)
550  double sqrtag = 1.0 / sqrt(tmp0);
551  S = sqrtag * invPt2;
552  U = dlz - pz * sininv / a;
553 
554  } else { // neutral
555 
556  sininv = 0.0;
557  S = invPt2;
558  U = dlz - pz * a2 * invPt2;
559 
560  }
561 
562  // d
563  m_d[i * 2 + 0][0] = a1 - 0.5 * a * r2d2;
564  m_d[i * 2 + 1][0] = U * pt;
565 
566  // D
567  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 0] = dly;
568  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 1] = -dlx;
569  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 2] = 0.0;
570  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 4] = py + a * dlx;
571  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 5] = -px + a * dly;
572  m_D[i * 2 + 0][i * KFitConst::kNumber7 + 6] = 0.0;
573  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 0] = -pz * pt * S * Rx + U * px * invPt;
574  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 1] = -pz * pt * S * Ry + U * py * invPt;
575  if (a != 0.)
576  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -sininv * pt / a;
577  else
578  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -a2 * invPt;
579  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 4] = px * pz * pt * S;
580  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 5] = py * pz * pt * S;
581  m_D[i * 2 + 1][i * KFitConst::kNumber7 + 6] = -pt;
582 
583  // E
584  m_E[i * 2 + 0][0] = -py - a * dlx;
585  m_E[i * 2 + 0][1] = px - a * dly;
586  m_E[i * 2 + 0][2] = 0.0;
587  m_E[i * 2 + 1][0] = -px * pz * pt * S;
588  m_E[i * 2 + 1][1] = -py * pz * pt * S;
589  m_E[i * 2 + 1][2] = pt;
590  }
591 
593 }
594 
595 
596 enum KFitError::ECode
598  m_NDF = 2 * m_TrackCount - 3 + 3;
599 
601 }
602 
604 {
605  MakeMotherKFit kmm;
607  unsigned n = getTrackCount();
608  for (unsigned i = 0; i < n; ++i) {
610  getTrack(i).getCharge());
612  for (unsigned j = i + 1; j < n; ++j) {
613  kmm.setCorrelation(getCorrelation(i, j));
614  }
615  }
616  kmm.setVertex(getVertex());
618  m_ErrorCode = kmm.doMake();
620  B2DEBUG(2, "Error in doMake");
621  return m_ErrorCode;
622  }
623  double chi2 = getCHIsq();
624  int ndf = getNDF();
625  double prob = TMath::Prob(chi2, ndf);
626  mother->addExtraInfo("ndf", ndf);
627  mother->addExtraInfo("chiSquared", chi2);
628  mother->updateMomentum(
629  CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
630  CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
631  CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
632  prob);
634  return m_ErrorCode;
635 }
static const double speedOfLight
[cm/ns]
Definition: Const.h:686
Class to store reconstructed particles.
Definition: Particle.h:75
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-pointing 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.
~MassPointingVertexFitKFit(void)
Destruct the object.
HepPoint3D m_ProductionVertex
Production vertex position.
enum KFitError::ECode doFit(void)
Perform a mass-vertex-pointing constraint fit.
enum KFitError::ECode setInvariantMass(const double m)
Set an invariant mass for the mass-vertex-pointing 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.
enum KFitError::ECode setProductionVertex(const HepPoint3D &v)
Set the production vertex of the particle.
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