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
80const HepPoint3D
82{
83 if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
84
85 switch (flag) {
87 return m_BeforeVertex;
88
90 return m_AfterVertex;
91
92 default:
93 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
94 return HepPoint3D();
95 }
96}
97
98
99const HepSymMatrix
104
105
106double
111
112
113double
115{
116 return m_CHIsq;
117}
118
119
120const HepMatrix
122{
123 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
124
125 return m_AfterTrackVertexError[id];
126}
127
128
129double
131{
132 if (!isFitted()) return -1;
133 if (!isTrackIDInRange(id)) return -1;
134
135 if (m_IsFixMass[id]) {
136
137 HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
138 int err_inverse = 0;
139 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
140
141 if (err_inverse) {
142 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
143 return -1;
144 }
145
146 return chisq;
147
148 } else {
149
150 HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
151 int err_inverse = 0;
152 const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
153
154 if (err_inverse) {
155 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
156 return -1;
157 }
158
159 return chisq;
160 }
161}
162
163
164const HepMatrix
165MassPointingVertexFitKFit::getCorrelation(const int id1, const int id2, const int flag) const
166{
167 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
168 if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
169 if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
170
171 switch (flag) {
173 return KFitBase::getCorrelation(id1, id2, flag);
174
176 return makeError3(
177 this->getTrackMomentum(id1),
178 this->getTrackMomentum(id2),
179 m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
180 KFitConst::kNumber7 * (id2 + 1)),
181 m_IsFixMass[id1],
182 m_IsFixMass[id2]);
183
184 default:
185 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
186 return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
187 }
188}
189
190
195
196
200 {
202 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
203 return m_ErrorCode;
204 }
205
206
207 if (m_IsFixMass.size() == 0)
208 {
209 // If no fix_mass flag at all,
210 // all tracks are considered to be fixed at mass.
211 for (int i = 0; i < m_TrackCount; i++) this->fixMass();
212 } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
213 {
215 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
216 return m_ErrorCode;
217 }
218
219
220 int index = 0;
221 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
222 m_property = HepMatrix(m_TrackCount, 3, 0);
223 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
224
225 for (const auto& track : m_Tracks)
226 {
227 // momentum x,y,z,E and position x,y,z
228 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
229 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
230 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
231 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
232 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
233 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
234 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
235 // these error
236 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
237 // charge, mass, a
238 m_property[index][0] = track.getCharge();
239 m_property[index][1] = track.getMass();
240 const double c = Const::speedOfLight * 1e-4;
241 m_property[index][2] = -c * m_MagneticField * track.getCharge();
242 index++;
243 }
244
245 // error between track and track
247 {
248 this->prepareCorrelation();
250 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
251 return m_ErrorCode;
252 }
253 }
254
255 // vertex
256 m_v_a[0][0] = m_BeforeVertex.x();
257 m_v_a[1][0] = m_BeforeVertex.y();
258 m_v_a[2][0] = m_BeforeVertex.z();
259
260 // set member matrix
261 m_al_1 = m_al_0;
262
265 m_E = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 3);
266 m_d = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
267 m_V_D = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, m_TrackCount * 2 + 3);
268 m_lam = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
269 m_lam0 = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, 1);
270 m_V_Dt = m_V_al_1.sub(1, m_TrackCount * 2 + 3, 1, m_TrackCount * 2 + 3);
272
274}
275
276
279 // vertex
280 for (int i = 0; i < 3; i++) m_v[i][0] = m_v_a[i][0];
281
283}
284
285
288 if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
289 {
291 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
292 return m_ErrorCode;
293 }
294
295 int row = 0, col = 0;
296
297 for (const auto& hm : m_BeforeCorrelation)
298 {
299 // counter
300 row++;
301 if (row == m_TrackCount) {
302 col++;
303 row = col + 1;
304 }
305
306 int ii = 0, jj = 0;
307 for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
308 for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
309 m_V_al_0[i][j] = hm[ii][jj];
310 jj++;
311 }
312 jj = 0;
313 ii++;
314 }
315 }
316
318}
319
320
323 Hep3Vector h3v;
324 int index = 0;
325 for (auto& pdata : m_Tracks)
326 {
327 // tracks
328 // momentum
329 h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
330 h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
331 h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
332 if (m_IsFixMass[index])
333 pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
334 else
335 pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
336 // position
337 pdata.setPosition(HepPoint3D(
338 m_al_1[index * KFitConst::kNumber7 + 4][0],
339 m_al_1[index * KFitConst::kNumber7 + 5][0],
341 // error of the tracks
342 pdata.setError(this->makeError3(pdata.getMomentum(),
343 m_V_al_1.sub(
344 index * KFitConst::kNumber7 + 1,
345 (index + 1)*KFitConst::kNumber7,
346 index * KFitConst::kNumber7 + 1,
347 (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
349 if (m_ErrorCode != KFitError::kNoError) break;
350 index++;
351 }
352
353 // vertex
354 m_AfterVertex.setX(m_v_a[0][0]);
355 m_AfterVertex.setY(m_v_a[1][0]);
356 m_AfterVertex.setZ(m_v_a[2][0]);
357 // error of the vertex
358 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++)
359 {
360 m_AfterVertexError[i][j] = m_V_E[i][j];
361 }
362 // error between vertex and tracks
363 for (int i = 0; i < m_TrackCount; i++)
364 {
365 HepMatrix hm(3, KFitConst::kNumber7, 0);
366 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
367 hm[j][k] = m_Cov_v_al_1[j][KFitConst::kNumber7 * i + k];
368 }
369 if (m_IsFixMass[i])
370 m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
371 else
372 m_AfterTrackVertexError.push_back(hm);
373 }
374
376}
377
378
381 // Mass Constraint
382 HepMatrix al_1_prime(m_al_1);
383 HepMatrix Sum_al_1(4, 1, 0);
384 std::vector<double> energy(m_TrackCount);
385 double a;
386
387 for (int i = 0; i < m_TrackCount; i++)
388 {
389 a = m_property[i][2];
390 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_v_a[1][0] - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
391 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_v_a[0][0] - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
392 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
393 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
394 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
395 m_property[i][1] * m_property[i][1]);
396 if (m_IsFixMass[i])
397 Sum_al_1[3][0] += energy[i];
398 else
399 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
400 }
401
402 for (int i = 0; i < m_TrackCount; i++)
403 {
404 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
405 }
406
407 double vtx = sqrt((m_v_a[0][0] - m_ProductionVertex.x()) * (m_v_a[0][0] - m_ProductionVertex.x())
408 + (m_v_a[1][0] - m_ProductionVertex.y()) * (m_v_a[1][0] - m_ProductionVertex.y())
409 + (m_v_a[2][0] - m_ProductionVertex.z()) * (m_v_a[2][0] - m_ProductionVertex.z()));
410 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]);
411 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]);
412 double Pt2 = Sum_al_1[0][0] * Sum_al_1[0][0] + Sum_al_1[1][0] * Sum_al_1[1][0];
413
414 m_d[2 * m_TrackCount][0] =
415 + Sum_al_1[3][0] * Sum_al_1[3][0] - Sum_al_1[0][0] * Sum_al_1[0][0]
416 - Sum_al_1[1][0] * Sum_al_1[1][0] - Sum_al_1[2][0] * Sum_al_1[2][0]
418
419 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]);
420 phiPointingConstraint = std::fmod(phiPointingConstraint + TMath::Pi(), TMath::TwoPi());
421 if (phiPointingConstraint < 0) phiPointingConstraint += TMath::TwoPi();
422 phiPointingConstraint -= TMath::Pi();
423
424 m_d[2 * m_TrackCount + 1][0] = phiPointingConstraint;
425 m_d[2 * m_TrackCount + 2][0] = acos((m_v_a[2][0] - m_ProductionVertex.z()) / vtx) - acos(Sum_al_1[2][0] / mom);
426
427 double Sum_a = 0., Sum_tmpx = 0., Sum_tmpy = 0.;
428 for (int i = 0; i < m_TrackCount; i++)
429 {
430 if (energy[i] == 0) {
432 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
433 return m_ErrorCode;
434 }
435
436 a = m_property[i][2];
437
438 if (m_IsFixMass[i]) {
439 double invE = 1. / energy[i];
440 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
441 Sum_al_1[0][0]);
442 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
443 Sum_al_1[1][0]);
444 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE -
445 Sum_al_1[2][0]);
446 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 0.;
447 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = -2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
448 Sum_al_1[1][0]) * a;
449 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = 2.*(Sum_al_1[3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
450 Sum_al_1[0][0]) * a;
451 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
452 Sum_tmpx += al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE * a;
453 Sum_tmpy += al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE * a;
454 } else {
455 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 0] = -2.*Sum_al_1[0][0];
456 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 1] = -2.*Sum_al_1[1][0];
457 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 2] = -2.*Sum_al_1[2][0];
458 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 3] = 2.*Sum_al_1[3][0];
459 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 4] = 2.*Sum_al_1[1][0] * a;
460 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 5] = -2.*Sum_al_1[0][0] * a;
461 m_D[2 * m_TrackCount][i * KFitConst::kNumber7 + 6] = 0.;
462 }
463 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 0] = Sum_al_1[1][0] / Pt2;
464 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 1] = - Sum_al_1[0][0] / Pt2;
465 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 2] = 0.;
466 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 3] = 0.;
467 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 4] = a * Sum_al_1[0][0] / Pt2;
468 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 5] = a * Sum_al_1[1][0] / Pt2;
469 m_D[2 * m_TrackCount + 1][i * KFitConst::kNumber7 + 6] = 0.;
470 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 0] = - Sum_al_1[0][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
471 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 1] = - Sum_al_1[1][0] * Sum_al_1[2][0] / (sqrt(Pt2) * mom * mom);
472 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 2] = sqrt(Pt2) / (mom * mom);
473 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 3] = 0.;
474 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);
475 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);
476 m_D[2 * m_TrackCount + 2][i * KFitConst::kNumber7 + 6] = 0.;
477 Sum_a += a;
478 }
479
480 // m_E
481 m_E[2 * m_TrackCount][0] = -2.*Sum_al_1[1][0] * Sum_a + 2.*Sum_al_1[3][0] * Sum_tmpy;
482 m_E[2 * m_TrackCount][1] = 2.*Sum_al_1[0][0] * Sum_a - 2.*Sum_al_1[3][0] * Sum_tmpx;
483 m_E[2 * m_TrackCount][2] = 0.;
484 m_E[2 * m_TrackCount + 1][0] = (m_ProductionVertex.y() - m_v_a[1][0]) / vtxpt2 - Sum_a * Sum_al_1[0][0] / Pt2;
485 m_E[2 * m_TrackCount + 1][1] = (m_v_a[0][0] - m_ProductionVertex.x()) / vtxpt2 - Sum_a * Sum_al_1[1][0] / Pt2;
486 m_E[2 * m_TrackCount + 1][2] = 0.;
487 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);
488 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);
489 m_E[2 * m_TrackCount + 2][2] = - sqrt(vtxpt2) / (vtx * vtx);
490
491 for (int i = 0; i < m_TrackCount; i++)
492 {
493 double S, U;
494 double sininv;
495
496 double px = m_al_1[i * KFitConst::kNumber7 + 0][0];
497 double py = m_al_1[i * KFitConst::kNumber7 + 1][0];
498 double pz = m_al_1[i * KFitConst::kNumber7 + 2][0];
499 double x = m_al_1[i * KFitConst::kNumber7 + 4][0];
500 double y = m_al_1[i * KFitConst::kNumber7 + 5][0];
501 double z = m_al_1[i * KFitConst::kNumber7 + 6][0];
502 a = m_property[i][2];
503
504 double pt = sqrt(px * px + py * py);
505
506 if (pt == 0) {
508 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
509 return m_ErrorCode;
510 }
511
512 double invPt = 1. / pt;
513 double invPt2 = invPt * invPt;
514 double dlx = m_v_a[0][0] - x;
515 double dly = m_v_a[1][0] - y;
516 double dlz = m_v_a[2][0] - z;
517 double a1 = -dlx * py + dly * px;
518 double a2 = dlx * px + dly * py;
519 double r2d2 = dlx * dlx + dly * dly;
520 double Rx = dlx - 2.*px * a2 * invPt2;
521 double Ry = dly - 2.*py * a2 * invPt2;
522
523 if (a != 0.) { // charged
524
525 double B = a * a2 * invPt2;
526 if (fabs(B) > 1.) {
528 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
529 return m_ErrorCode;
530 }
531 // sin^(-1)(B)
532 sininv = asin(B);
533 double tmp0 = 1.0 - B * B;
534 if (tmp0 == 0) {
536 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
537 return m_ErrorCode;
538 }
539 // 1/sqrt(1-B^2)
540 double sqrtag = 1.0 / sqrt(tmp0);
541 S = sqrtag * invPt2;
542 U = dlz - pz * sininv / a;
543
544 } else { // neutral
545
546 sininv = 0.0;
547 S = invPt2;
548 U = dlz - pz * a2 * invPt2;
549
550 }
551
552 // d
553 m_d[i * 2 + 0][0] = a1 - 0.5 * a * r2d2;
554 m_d[i * 2 + 1][0] = U * pt;
555
556 // D
557 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 0] = dly;
558 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 1] = -dlx;
559 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 2] = 0.0;
560 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 4] = py + a * dlx;
561 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 5] = -px + a * dly;
562 m_D[i * 2 + 0][i * KFitConst::kNumber7 + 6] = 0.0;
563 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 0] = -pz * pt * S * Rx + U * px * invPt;
564 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 1] = -pz * pt * S * Ry + U * py * invPt;
565 if (a != 0.)
566 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -sininv * pt / a;
567 else
568 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 2] = -a2 * invPt;
569 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 4] = px * pz * pt * S;
570 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 5] = py * pz * pt * S;
571 m_D[i * 2 + 1][i * KFitConst::kNumber7 + 6] = -pt;
572
573 // E
574 m_E[i * 2 + 0][0] = -py - a * dlx;
575 m_E[i * 2 + 0][1] = px - a * dly;
576 m_E[i * 2 + 0][2] = 0.0;
577 m_E[i * 2 + 1][0] = -px * pz * pt * S;
578 m_E[i * 2 + 1][1] = -py * pz * pt * S;
579 m_E[i * 2 + 1][2] = pt;
580 }
581
583}
584
585
592
594{
595 MakeMotherKFit kmm;
597 unsigned n = getTrackCount();
598 for (unsigned i = 0; i < n; ++i) {
600 getTrack(i).getCharge());
602 for (unsigned j = i + 1; j < n; ++j) {
604 }
605 }
606 kmm.setVertex(getVertex());
608 m_ErrorCode = kmm.doMake();
610 B2DEBUG(2, "Error in doMake");
611 return m_ErrorCode;
612 }
613 double chi2 = getCHIsq();
614 int ndf = getNDF();
615 double prob = TMath::Prob(chi2, ndf);
616 mother->addExtraInfo("ndf", ndf);
617 mother->addExtraInfo("chiSquared", chi2);
618 mother->updateMomentum(
619 CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
620 CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
621 CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
622 prob);
624 return m_ErrorCode;
625}
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
static CLHEP::HepSymMatrix makeError3(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e, const bool is_fix_mass)
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition KFitBase.cc:320
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
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
static CLHEP::HepMatrix makeError4(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e)
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition KFitBase.cc:439
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
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 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.
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.
~MassPointingVertexFitKFit(void) override
Destruct the object.
enum KFitError::ECode prepareCorrelation(void) override
Build a grand correlation matrix from input-track properties.
HepPoint3D m_AfterVertex
Vertex position after the fit.
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