Belle II Software development
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/MassPointingVertexFitKFit.h>
10
11#include <analysis/VertexFitting/KFit/MakeMotherKFit.h>
12#include <analysis/dataobjects/Particle.h>
13#include <analysis/utility/CLHEPToROOT.h>
14#include <framework/gearbox/Const.h>
15
16#include <TMath.h>
17
18using namespace std;
19using namespace Belle2;
20using namespace Belle2::analysis;
21using namespace CLHEP;
22
24 m_BeforeVertex(HepPoint3D(0., 0., 0.)),
25 m_AfterVertexError(HepSymMatrix(3, 0)),
26 m_ProductionVertex(HepPoint3D(0., 0., 0.))
27{
28 m_FlagFitted = false;
30 m_V_E = HepMatrix(3, 3, 0);
31 m_v = HepMatrix(3, 1, 0);
32 m_v_a = HepMatrix(3, 1, 0);
33 m_InvariantMass = -1.0;
34}
35
36
38
39
46
47
54
55
62
63
70
71
78
79
84
85
90
91
92const HepPoint3D
94{
95 if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
96
97 switch (flag) {
99 return m_BeforeVertex;
100
102 return m_AfterVertex;
103
104 default:
105 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
106 return HepPoint3D();
107 }
108}
109
110
111const HepSymMatrix
116
117
118double
123
124
125double
127{
128 return m_CHIsq;
129}
130
131
132const HepMatrix
134{
135 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
136
137 return m_AfterTrackVertexError[id];
138}
139
140
141double
143{
144 if (!isFitted()) return -1;
145 if (!isTrackIDInRange(id)) return -1;
146
147 if (m_IsFixMass[id]) {
148
149 HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
150 int err_inverse = 0;
151 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
152
153 if (err_inverse) {
154 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
155 return -1;
156 }
157
158 return chisq;
159
160 } else {
161
162 HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
163 int err_inverse = 0;
164 const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
165
166 if (err_inverse) {
167 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
168 return -1;
169 }
170
171 return chisq;
172 }
173}
174
175
176const HepMatrix
177MassPointingVertexFitKFit::getCorrelation(const int id1, const int id2, const int flag) const
178{
179 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
180 if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
181 if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
182
183 switch (flag) {
185 return KFitBase::getCorrelation(id1, id2, flag);
186
188 return makeError3(
189 this->getTrackMomentum(id1),
190 this->getTrackMomentum(id2),
191 m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
192 KFitConst::kNumber7 * (id2 + 1)),
193 m_IsFixMass[id1],
194 m_IsFixMass[id2]);
195
196 default:
197 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
198 return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
199 }
200}
201
202
207
208
212 {
214 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
215 return m_ErrorCode;
216 }
217
218
219 if (m_IsFixMass.size() == 0)
220 {
221 // If no fix_mass flag at all,
222 // all tracks are considered to be fixed at mass.
223 for (int i = 0; i < m_TrackCount; i++) this->fixMass();
224 } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
225 {
227 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
228 return m_ErrorCode;
229 }
230
231
232 int index = 0;
233 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
234 m_property = HepMatrix(m_TrackCount, 3, 0);
235 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
236
237 for (auto& track : m_Tracks)
238 {
239 // momentum x,y,z,E and position x,y,z
240 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
241 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
242 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
243 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
244 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
245 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
246 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
247 // these error
248 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
249 // charge, mass, a
250 m_property[index][0] = track.getCharge();
251 m_property[index][1] = track.getMass();
252 const double c = Const::speedOfLight * 1e-4;
253 m_property[index][2] = -c * m_MagneticField * track.getCharge();
254 index++;
255 }
256
257 // error between track and track
259 {
260 this->prepareCorrelation();
262 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
263 return m_ErrorCode;
264 }
265 }
266
267 // vertex
268 m_v_a[0][0] = m_BeforeVertex.x();
269 m_v_a[1][0] = m_BeforeVertex.y();
270 m_v_a[2][0] = m_BeforeVertex.z();
271
272 // set member matrix
273 m_al_1 = m_al_0;
274
277 m_E = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 3);
278 m_d = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
279 m_V_D = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, m_TrackCount * 2 + 3);
280 m_lam = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
281 m_lam0 = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
282 m_V_Dt = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, m_TrackCount * 2 + 3);
284
286}
287
288
291 // vertex
292 for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
293
295}
296
297
300 if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
301 {
303 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
304 return m_ErrorCode;
305 }
306
307 int row = 0, col = 0;
308
309 for (auto& hm : m_BeforeCorrelation)
310 {
311 // counter
312 row++;
313 if (row == m_TrackCount) {
314 col++;
315 row = col + 1;
316 }
317
318 int ii = 0, jj = 0;
319 for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
320 for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
321 m_V_al_0[i][j] = hm[ii][jj];
322 jj++;
323 }
324 jj = 0;
325 ii++;
326 }
327 }
328
330}
331
332
335 Hep3Vector h3v;
336 int index = 0;
337 for (auto& pdata : m_Tracks)
338 {
339 // tracks
340 // momentum
341 h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
342 h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
343 h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
344 if (m_IsFixMass[index])
345 pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
346 else
347 pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
348 // position
349 pdata.setPosition(HepPoint3D(
350 m_al_1[index * KFitConst::kNumber7 + 4][0],
351 m_al_1[index * KFitConst::kNumber7 + 5][0],
353 // error of the tracks
354 pdata.setError(this->makeError3(pdata.getMomentum(),
355 m_V_al_1.sub(
356 index * KFitConst::kNumber7 + 1,
357 (index + 1)*KFitConst::kNumber7,
358 index * KFitConst::kNumber7 + 1,
359 (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
361 if (m_ErrorCode != KFitError::kNoError) break;
362 index++;
363 }
364
365 // vertex
366 m_AfterVertex.setX(m_v_a[0][0]);
367 m_AfterVertex.setY(m_v_a[1][0]);
368 m_AfterVertex.setZ(m_v_a[2][0]);
369 // error of the vertex
370 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++)
371 {
372 m_AfterVertexError[i][j] = m_V_E[i][j];
373 }
374 // error between vertex and tracks
375 for (int i = 0; i < m_TrackCount; i++)
376 {
377 HepMatrix hm(3, KFitConst::kNumber7, 0);
378 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
379 hm[j][k] = m_Cov_v_al_1[j][KFitConst::kNumber7 * i + k];
380 }
381 if (m_IsFixMass[i])
382 m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
383 else
384 m_AfterTrackVertexError.push_back(hm);
385 }
386
388}
389
390
393 // Mass Constraint
394 HepMatrix al_1_prime(m_al_1);
395 HepMatrix Sum_al_1(4, 1, 0);
396 std::vector<double> energy(m_TrackCount);
397 double a;
398
399 for (int i = 0; i < m_TrackCount; i++)
400 {
401 a = m_property[i][2];
402 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_v_a[1][0] - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
403 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_v_a[0][0] - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
404 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
405 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
406 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
407 m_property[i][1] * m_property[i][1]);
408 if (m_IsFixMass[i])
409 Sum_al_1[3][0] += energy[i];
410 else
411 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
412 }
413
414 for (int i = 0; i < m_TrackCount; i++)
415 {
416 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
417 }
418
419 double vtx = sqrt((m_v_a[0][0] - m_ProductionVertex.x()) * (m_v_a[0][0] - m_ProductionVertex.x())
420 + (m_v_a[1][0] - m_ProductionVertex.y()) * (m_v_a[1][0] - m_ProductionVertex.y())
421 + (m_v_a[2][0] - m_ProductionVertex.z()) * (m_v_a[2][0] - m_ProductionVertex.z()));
422 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]);
423 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]);
424 double Pt2 = Sum_al_1[0][0] * Sum_al_1[0][0] + Sum_al_1[1][0] * Sum_al_1[1][0];
425
426 m_d[2 * m_TrackCount][0] =
427 + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
428 - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
430
431 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]);
432 phiPointingConstraint = std::fmod(phiPointingConstraint + TMath::Pi(), TMath::TwoPi());
433 if (phiPointingConstraint < 0) phiPointingConstraint += TMath::TwoPi();
434 phiPointingConstraint -= TMath::Pi();
435
436 m_d[2 * m_TrackCount + 1][0] = phiPointingConstraint;
437 m_d[2 * m_TrackCount + 2][0] = acos((m_v_a[2][0] - m_ProductionVertex.z()) / vtx) - acos(Sum_al_1[2][0] / mom);
438
439 double Sum_a = 0., Sum_tmpx = 0., Sum_tmpy = 0.;
440 for (int i = 0; i < m_TrackCount; i++)
441 {
442 if (energy[i] == 0) {
444 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
445 return m_ErrorCode;
446 }
447
448 a = m_property[i][2];
449
450 if (m_IsFixMass[i]) {
451 double invE = 1. / energy[i];
452 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
453 Sum_al_1[0][0]);
454 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
455 Sum_al_1[1][0]);
456 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE -
457 Sum_al_1[2][0]);
458 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 0.;
459 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
460 Sum_al_1[1][0]) * a;
461 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
462 Sum_al_1[0][0]) * a;
463 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
464 Sum_tmpx += al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE * a;
465 Sum_tmpy += al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE * a;
466 } else {
467 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
468 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
469 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
470 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
471 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
472 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
473 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
474 }
475 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 0] = Sum_al_1[1][0] / Pt2;
476 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 1] = - Sum_al_1[0][0] / Pt2;
477 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 2] = 0.;
478 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 3] = 0.;
479 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 4] = a * Sum_al_1[0][0] / Pt2;
480 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 5] = a * Sum_al_1[1][0] / Pt2;
481 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 6] = 0.;
482 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 0] = - Sum_al_1[0][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
483 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 1] = - Sum_al_1[1][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
484 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 2] = sqrt(Pt2) / (mom * mom);
485 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 3] = 0.;
486 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);
487 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);
488 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 6] = 0.;
489 Sum_a += a;
490 }
491
492 // m_E
493 m_E[2 * m_TrackCount][0] = -2.*Sum_al_1[1][0] * Sum_a + 2.*Sum_al_1[3][0] * Sum_tmpy;
494 m_E[2 * m_TrackCount][1] = 2.*Sum_al_1[0][0] * Sum_a - 2.*Sum_al_1[3][0] * Sum_tmpx;
495 m_E[2 * m_TrackCount][2] = 0.;
496 m_E[2 * m_TrackCount + 1][0] = (m_ProductionVertex.y() - m_v_a[1][0]) / vtxpt2 - Sum_a * Sum_al_1[0][0] / Pt2;
497 m_E[2 * m_TrackCount + 1][1] = (m_v_a[0][0] - m_ProductionVertex.x()) / vtxpt2 - Sum_a * Sum_al_1[1][0] / Pt2;
498 m_E[2 * m_TrackCount + 1][2] = 0.;
499 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);
500 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);
501 m_E[2 * m_TrackCount + 2][2] = - sqrt(vtxpt2) / (vtx * vtx);
502
503 for (int i = 0; i < m_TrackCount; i++)
504 {
505 double S, U;
506 double sininv;
507
508 double px = m_al_1[i * KFitConst::kNumber7 + 0][0];
509 double py = m_al_1[i * KFitConst::kNumber7 + 1][0];
510 double pz = m_al_1[i * KFitConst::kNumber7 + 2][0];
511 double x = m_al_1[i * KFitConst::kNumber7 + 4][0];
512 double y = m_al_1[i * KFitConst::kNumber7 + 5][0];
513 double z = m_al_1[i * KFitConst::kNumber7 + 6][0];
514 a = m_property[i][2];
515
516 double pt = sqrt(px * px + py * py);
517
518 if (pt == 0) {
520 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
521 return m_ErrorCode;
522 }
523
524 double invPt = 1. / pt;
525 double invPt2 = invPt * invPt;
526 double dlx = m_v_a[0][0] - x;
527 double dly = m_v_a[1][0] - y;
528 double dlz = m_v_a[2][0] - z;
529 double a1 = -dlx * py + dly * px;
530 double a2 = dlx * px + dly * py;
531 double r2d2 = dlx * dlx + dly * dly;
532 double Rx = dlx - 2.*px * a2 * invPt2;
533 double Ry = dly - 2.*py * a2 * invPt2;
534
535 if (a != 0.) { // charged
536
537 double B = a * a2 * invPt2;
538 if (fabs(B) > 1.) {
540 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
541 return m_ErrorCode;
542 }
543 // sin^(-1)(B)
544 sininv = asin(B);
545 double tmp0 = 1.0 - B * B;
546 if (tmp0 == 0) {
548 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
549 return m_ErrorCode;
550 }
551 // 1/sqrt(1-B^2)
552 double sqrtag = 1.0 / sqrt(tmp0);
553 S = sqrtag * invPt2;
554 U = dlz - pz * sininv / a;
555
556 } else { // neutral
557
558 sininv = 0.0;
559 S = invPt2;
560 U = dlz - pz * a2 * invPt2;
561
562 }
563
564 // d
565 m_d[i * 2 + 0][0] = a1 - 0.5 * a * r2d2;
566 m_d[i * 2 + 1][0] = U * pt;
567
568 // D
569 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 0] = dly;
570 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 1] = -dlx;
571 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 2] = 0.0;
572 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 4] = py + a * dlx;
573 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 5] = -px + a * dly;
574 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 6] = 0.0;
575 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 0] = -pz * pt * S * Rx + U * px * invPt;
576 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 1] = -pz * pt * S * Ry + U * py * invPt;
577 if (a != 0.)
578 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -sininv * pt / a;
579 else
580 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -a2 * invPt;
581 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 4] = px * pz * pt * S;
582 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 5] = py * pz * pt * S;
583 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 6] = -pt;
584
585 // E
586 m_E[i * 2 + 0][0] = -py - a * dlx;
587 m_E[i * 2 + 0][1] = px - a * dly;
588 m_E[i * 2 + 0][2] = 0.0;
589 m_E[i * 2 + 1][0] = -px * pz * pt * S;
590 m_E[i * 2 + 1][1] = -py * pz * pt * S;
591 m_E[i * 2 + 1][2] = pt;
592 }
593
595}
596
597
604
606{
607 MakeMotherKFit kmm;
609 unsigned n = getTrackCount();
610 for (unsigned i = 0; i < n; ++i) {
612 getTrack(i).getCharge());
614 for (unsigned j = i + 1; j < n; ++j) {
616 }
617 }
618 kmm.setVertex(getVertex());
620 m_ErrorCode = kmm.doMake();
622 B2DEBUG(2, "Error in doMake");
623 return m_ErrorCode;
624 }
625 double chi2 = getCHIsq();
626 int ndf = getNDF();
627 double prob = TMath::Prob(chi2, ndf);
628 mother->addExtraInfo("ndf", ndf);
629 mother->addExtraInfo("chiSquared", chi2);
630 mother->updateMomentum(
631 CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
632 CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
633 CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
634 prob);
636 return m_ErrorCode;
637}
static const double speedOfLight
[cm/ns]
Definition Const.h:695
Class to store reconstructed particles.
Definition Particle.h:76
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition Particle.cc:1421
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:397
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:71
ECode
ECode is a error code enumerate.
Definition KFitError.h:33
@ kCannotGetMatrixInverse
Cannot calculate matrix inverse (bad track property or internal error)
Definition KFitError.h:57
@ kOutOfRange
Specified track-id out of range.
Definition KFitError.h:41
@ kDivisionByZero
Division by zero (bad track property or internal error)
Definition KFitError.h:55
@ kBadTrackSize
Track count too small to perform fit.
Definition KFitError.h:46
@ kBadCorrelationSize
Wrong correlation matrix size (internal error)
Definition KFitError.h:50
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.
MassPointingVertexFitKFit(void)
Construct an object with no argument.
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.
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28
Abstract base class for different kinds of events.
STL namespace.
static const int kMaxTrackCount
Maximum track size.
Definition KFitConst.h:38
static const int kAfterFit
Input parameter to specify after-fit when setting/getting a track attribute.
Definition KFitConst.h:35
static const int kBeforeFit
Input parameter to specify before-fit when setting/getting a track attribute.
Definition KFitConst.h:33
static const int kNumber7
Constant 7 to check matrix size (internal use)
Definition KFitConst.h:30