Belle II Software light-2406-ragdoll
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
16using namespace std;
17using namespace Belle2;
18using namespace Belle2::analysis;
19using namespace CLHEP;
20
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
41
43}
44
45
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
81}
82
83
87}
88
89
90const 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
109const HepSymMatrix
111{
112 return m_AfterVertexError;
113}
114
115
116double
118{
119 return m_InvariantMass;
120}
121
122
123double
125{
126 return m_CHIsq;
127}
128
129
130const HepMatrix
132{
133 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
134
135 return m_AfterTrackVertexError[id];
136}
137
138
139double
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
174const HepMatrix
175MassPointingVertexFitKFit::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
203 return KFitBase::doFit2();
204}
205
206
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
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
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
289 // vertex
290 for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
291
293}
294
295
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
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
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
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) {
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:695
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.
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.
Abstract base class for different kinds of events.
Definition: ClusterUtils.h:24
STL namespace.
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