11 #include <analysis/VertexFitting/RaveInterface/RaveKinematicVertexFitter.h>
12 #include <analysis/VertexFitting/RaveInterface/RaveSetup.h>
15 #include <Math/ProbFunc.h>
17 #include <rave/TransientTrackKinematicParticle.h>
18 #include <rave/impl/RaveBase/Converters/interface/RaveStreamers.h>
20 #include <rave/KinematicTreeFactory.h>
21 #include <rave/KinematicConstraint.h>
22 #include <rave/KinematicConstraintBuilder.h>
23 #include <rave/VertexFactory.h>
35 using namespace analysis;
40 m_massConstFit(false), m_vertFit(true)
43 B2FATAL(
"RaveSetup::initialize was not called. It has to be called before RaveSetup or RaveKinematicVertexFitter are used");
72 rave::Vector7D raveState(aParticlePtr->
getX(), aParticlePtr->
getY(), aParticlePtr->
getZ(), aParticlePtr->
getPx(),
77 for (
int i = 0; i < 7; i++) {
78 for (
int j = 0; j < 7; j++) {
79 if (i < 3 && j < 3) covE(i, j) = covP(i + 4, j + 4);
80 if (i > 2 && j > 2) covE(i, j) = covP(i - 3, j - 3);
81 if (i < 3 && j > 2) covE(i, j) = covP(i + 4, j - 3);
82 if (i > 2 && j < 3) covE(i, j) = covP(i - 3, j + 4);
88 rave::Covariance7D raveCov(cov(0, 0), cov(0, 1), cov(0, 2),
89 cov(1, 1), cov(1, 2), cov(2, 2),
90 cov(0, 3), cov(0, 4), cov(0, 5),
91 cov(1, 3), cov(1, 4), cov(1, 5),
92 cov(2, 3), cov(2, 4), cov(2, 5),
93 cov(3, 3), cov(3, 4), cov(3, 5),
94 cov(4, 4), cov(4, 5), cov(5, 5),
95 cov(0, 6), cov(1, 6), cov(2, 6),
96 cov(3, 6), cov(4, 6), cov(5, 6),
99 rave::TransientTrackKinematicParticle aRaveParticle(raveState, raveCov, rave::Charge(aParticlePtr->
getCharge()), 1, 1);
109 vector<Particle*> daughters = aMotherParticlePtr->
getDaughters();
111 int nDaughters = daughters.size();
112 for (
int i = 0; i not_eq nDaughters; ++i) {
117 auto* tmp =
const_cast<Particle*
>(aMotherParticlePtr);
125 auto* tmp =
const_cast<Particle*
>(aMotherParticlePtr);
139 int nOfVertices = -100;
143 const rave::Covariance3D bsCovRave(bsCov(0, 0), bsCov(0, 1), bsCov(0, 2), bsCov(1, 1), bsCov(1, 2), bsCov(2, 2));
150 rave::KinematicConstraint cs2 = rave::KinematicConstraintBuilder().createMultiTrackMassKinematicConstraint(
178 rave::Vector7D raveState(aParticlePtr->
getX(), aParticlePtr->
getY(), aParticlePtr->
getZ(), aParticlePtr->
getPx(),
186 for (
int i = 0; i < 7; i++) {
187 for (
int j = 0; j < 7; j++) {
188 if (i < 3 && j < 3) covE(i, j) = covP(i + 4, j + 4);
189 if (i > 2 && j > 2) covE(i, j) = covP(i - 3, j - 3);
190 if (i < 3 && j > 2) covE(i, j) = covP(i + 4, j - 3);
191 if (i > 2 && j < 3) covE(i, j) = covP(i - 3, j + 4);
197 rave::Covariance7D raveCov(cov(0, 0), cov(0, 1), cov(0, 2),
198 cov(1, 1), cov(1, 2), cov(2, 2),
199 cov(0, 3), cov(0, 4), cov(0, 5),
200 cov(1, 3), cov(1, 4), cov(1, 5),
201 cov(2, 3), cov(2, 4), cov(2, 5),
202 cov(3, 3), cov(3, 4), cov(3, 5),
203 cov(4, 4), cov(4, 5), cov(5, 5),
204 cov(0, 6), cov(1, 6), cov(2, 6),
205 cov(3, 6), cov(4, 6), cov(5, 6),
208 rave::TransientTrackKinematicParticle aRaveParticle(raveState, raveCov, rave::Charge(aParticlePtr->
getCharge()), chi2, ndf);
210 std::vector< rave::KinematicParticle > parts; parts.push_back(aRaveParticle);
212 rave::KinematicConstraint constraint = rave::KinematicConstraintBuilder().createMassKinematicConstraint(
218 constraint,
"ppf:lppf");
223 B2ERROR(
"[RaveKinematicVertexFitter]: VertexException saying ParentParticleFitter::error inverting covariance matrix occured");
236 rave::Vector7D fittedState;
237 rave::Covariance7D fittedCov;
251 if (nOfVertices == 0) {
256 rave::KinematicVertex fittedVertex =
m_fittedResult.currentDecayVertex();
261 m_fittedPos.SetXYZ(fittedVertex.position().x(), fittedVertex.position().y(), fittedVertex.position().z());
271 m_fitted4Vector.SetXYZT(fittedState.p4().p3().x(), fittedState.p4().p3().y(), fittedState.p4().p3().z(), fittedState.p4().energy());
275 TMatrixDSym fitted7CovM(7);
277 fitted7CovM(3, 6) = fittedCov.dpxm(); fitted7CovM(6, 3) = fitted7CovM(3, 6);
278 fitted7CovM(4, 6) = fittedCov.dpym(); fitted7CovM(6, 4) = fitted7CovM(4, 6);
279 fitted7CovM(5, 6) = fittedCov.dpzm(); fitted7CovM(6, 5) = fitted7CovM(5, 6);
280 fitted7CovM(6, 6) = fittedCov.dmm(); fitted7CovM(6, 6) = fitted7CovM(6, 6);
281 fitted7CovM(0, 6) = fittedCov.dxm(); fitted7CovM(6, 0) = fitted7CovM(0, 6);
282 fitted7CovM(1, 6) = fittedCov.dym(); fitted7CovM(6, 1) = fitted7CovM(1, 6);
283 fitted7CovM(2, 6) = fittedCov.dzm(); fitted7CovM(6, 2) = fitted7CovM(2, 6);
285 fitted7CovM(3, 3) = fittedCov.dpxpx(); fitted7CovM(3, 3) = fitted7CovM(3, 3);
286 fitted7CovM(3, 4) = fittedCov.dpxpy(); fitted7CovM(4, 3) = fitted7CovM(3, 4);
287 fitted7CovM(3, 5) = fittedCov.dpxpz(); fitted7CovM(5, 3) = fitted7CovM(3, 5);
288 fitted7CovM(3, 0) = fittedCov.dxpx(); fitted7CovM(0, 3) = fitted7CovM(3, 0);
289 fitted7CovM(3, 1) = fittedCov.dypx(); fitted7CovM(1, 3) = fitted7CovM(3, 1);
290 fitted7CovM(3, 2) = fittedCov.dzpx(); fitted7CovM(2, 3) = fitted7CovM(3, 2);
292 fitted7CovM(4, 4) = fittedCov.dpypy(); fitted7CovM(4, 4) = fitted7CovM(4, 4);
293 fitted7CovM(4, 5) = fittedCov.dpypz(); fitted7CovM(5, 4) = fitted7CovM(4, 5);
294 fitted7CovM(4, 0) = fittedCov.dxpy(); fitted7CovM(0, 4) = fitted7CovM(4, 0);
295 fitted7CovM(4, 1) = fittedCov.dypy(); fitted7CovM(1, 4) = fitted7CovM(4, 1);
296 fitted7CovM(4, 2) = fittedCov.dzpy(); fitted7CovM(2, 4) = fitted7CovM(4, 2);
298 fitted7CovM(5, 5) = fittedCov.dpzpz(); fitted7CovM(5, 5) = fitted7CovM(5, 5);
299 fitted7CovM(5, 0) = fittedCov.dxpz(); fitted7CovM(0, 5) = fitted7CovM(5, 0);
300 fitted7CovM(5, 1) = fittedCov.dypz(); fitted7CovM(1, 5) = fitted7CovM(5, 1);
301 fitted7CovM(5, 2) = fittedCov.dzpz(); fitted7CovM(2, 5) = fitted7CovM(5, 2);
303 fitted7CovM(0, 0) = fittedCov.dxx(); fitted7CovM(0, 0) = fitted7CovM(0, 0);
304 fitted7CovM(0, 1) = fittedCov.dxy(); fitted7CovM(1, 0) = fitted7CovM(0, 1);
305 fitted7CovM(0, 2) = fittedCov.dxz(); fitted7CovM(2, 0) = fitted7CovM(0, 2);
307 fitted7CovM(1, 1) = fittedCov.dyy(); fitted7CovM(1, 1) = fitted7CovM(1, 1);
308 fitted7CovM(1, 2) = fittedCov.dyz(); fitted7CovM(2, 1) = fitted7CovM(1, 2);
310 fitted7CovM(2, 2) = fittedCov.dzz(); fitted7CovM(2, 2) = fitted7CovM(2, 2);
314 for (
int i = 0; i < 7; i++) {
315 for (
int j = 0; j < 7; j++) {
316 if (i < 4 && j < 4)
m_fitted7Cov(i, j) = fitted7CovE(i + 3, j + 3);
317 if (i > 3 && j > 3)
m_fitted7Cov(i, j) = fitted7CovE(i - 4, j - 4);
318 if (i < 4 && j > 3)
m_fitted7Cov(i, j) = fitted7CovE(i + 3, j - 4);
319 if (i > 3 && j < 4)
m_fitted7Cov(i, j) = fitted7CovE(i - 4, j + 3);
335 std::vector< rave::KinematicParticle > rDau =
m_fittedResult.daughterParticles();
337 if (rDau.size() == bDau.size()) {
338 for (
unsigned ii = 0; ii < bDau.size(); ii++) {
339 rave::Vector7D fittedState;
340 rave::Covariance7D fittedCov;
341 fittedState = rDau[ii].fullstate();
342 fittedCov = rDau[ii].fullerror();
345 p4.SetXYZT(fittedState.p4().p3().x(), fittedState.p4().p3().y(), fittedState.p4().p3().z(), fittedState.p4().energy());
347 TVector3 x3(fittedState.x(), fittedState.y(), fittedState.z());
350 TMatrixDSym fitted7CovM(7);
351 fitted7CovM(3, 6) = fittedCov.dpxm(); fitted7CovM(6, 3) = fitted7CovM(3, 6);
352 fitted7CovM(4, 6) = fittedCov.dpym(); fitted7CovM(6, 4) = fitted7CovM(4, 6);
353 fitted7CovM(5, 6) = fittedCov.dpzm(); fitted7CovM(6, 5) = fitted7CovM(5, 6);
354 fitted7CovM(6, 6) = fittedCov.dmm(); fitted7CovM(6, 6) = fitted7CovM(6, 6);
355 fitted7CovM(0, 6) = fittedCov.dxm(); fitted7CovM(6, 0) = fitted7CovM(0, 6);
356 fitted7CovM(1, 6) = fittedCov.dym(); fitted7CovM(6, 1) = fitted7CovM(1, 6);
357 fitted7CovM(2, 6) = fittedCov.dzm(); fitted7CovM(6, 2) = fitted7CovM(2, 6);
359 fitted7CovM(3, 3) = fittedCov.dpxpx(); fitted7CovM(3, 3) = fitted7CovM(3, 3);
360 fitted7CovM(3, 4) = fittedCov.dpxpy(); fitted7CovM(4, 3) = fitted7CovM(3, 4);
361 fitted7CovM(3, 5) = fittedCov.dpxpz(); fitted7CovM(5, 3) = fitted7CovM(3, 5);
362 fitted7CovM(3, 0) = fittedCov.dxpx(); fitted7CovM(0, 3) = fitted7CovM(3, 0);
363 fitted7CovM(3, 1) = fittedCov.dypx(); fitted7CovM(1, 3) = fitted7CovM(3, 1);
364 fitted7CovM(3, 2) = fittedCov.dzpx(); fitted7CovM(2, 3) = fitted7CovM(3, 2);
366 fitted7CovM(4, 4) = fittedCov.dpypy(); fitted7CovM(4, 4) = fitted7CovM(4, 4);
367 fitted7CovM(4, 5) = fittedCov.dpypz(); fitted7CovM(5, 4) = fitted7CovM(4, 5);
368 fitted7CovM(4, 0) = fittedCov.dxpy(); fitted7CovM(0, 4) = fitted7CovM(4, 0);
369 fitted7CovM(4, 1) = fittedCov.dypy(); fitted7CovM(1, 4) = fitted7CovM(4, 1);
370 fitted7CovM(4, 2) = fittedCov.dzpy(); fitted7CovM(2, 4) = fitted7CovM(4, 2);
372 fitted7CovM(5, 5) = fittedCov.dpzpz(); fitted7CovM(5, 5) = fitted7CovM(5, 5);
373 fitted7CovM(5, 0) = fittedCov.dxpz(); fitted7CovM(0, 5) = fitted7CovM(5, 0);
374 fitted7CovM(5, 1) = fittedCov.dypz(); fitted7CovM(1, 5) = fitted7CovM(5, 1);
375 fitted7CovM(5, 2) = fittedCov.dzpz(); fitted7CovM(2, 5) = fitted7CovM(5, 2);
377 fitted7CovM(0, 0) = fittedCov.dxx(); fitted7CovM(0, 0) = fitted7CovM(0, 0);
378 fitted7CovM(0, 1) = fittedCov.dxy(); fitted7CovM(1, 0) = fitted7CovM(0, 1);
379 fitted7CovM(0, 2) = fittedCov.dxz(); fitted7CovM(2, 0) = fitted7CovM(0, 2);
381 fitted7CovM(1, 1) = fittedCov.dyy(); fitted7CovM(1, 1) = fitted7CovM(1, 1);
382 fitted7CovM(1, 2) = fittedCov.dyz(); fitted7CovM(2, 1) = fitted7CovM(1, 2);
384 fitted7CovM(2, 2) = fittedCov.dzz(); fitted7CovM(2, 2) = fitted7CovM(2, 2);
388 TMatrixDSym fitted7CovDauM(7);
389 for (
int i = 0; i < 7; i++) {
390 for (
int j = 0; j < 7; j++) {
391 if (i < 4 && j < 4) fitted7CovDauM(i, j) = fitted7CovE(i + 3, j + 3);
392 if (i > 3 && j > 3) fitted7CovDauM(i, j) = fitted7CovE(i - 4, j - 4);
393 if (i < 4 && j > 3) fitted7CovDauM(i, j) = fitted7CovE(i + 3, j - 4);
394 if (i > 3 && j < 4) fitted7CovDauM(i, j) = fitted7CovE(i - 4, j + 3);
398 float pValDau = rDau[ii].chi2();
400 bDau[ii]->updateMomentum(p4, x3, fitted7CovDauM, pValDau);
404 }
else B2ERROR(
"Error in Daughters update");
440 TMatrixDSym posErr(3);
459 for (
int i = 0; i < 7; i++) {
460 for (
int j = 0; j < 7; j++) {
461 if (i == j) jac(i, j) = 1;
465 jac(6, 3) = p4.Px() / p4.E();
466 jac(6, 4) = p4.Py() / p4.E();
467 jac(6, 5) = p4.Pz() / p4.E();
468 jac(6, 6) = p4.M() / p4.E();
471 TMatrix jact(7, 7); jact.Transpose(jac);
472 TMatrix EnergyErrPart(7, 7); EnergyErrPart.Mult(jac, MassErr);
473 TMatrix EnergyErrTemp(7, 7); EnergyErrTemp.Mult(EnergyErrPart, jact);
475 TMatrixDSym EnergyErr(7);
476 for (
int i = 0; i < 7; i++) {
477 for (
int j = 0; j < 7; j++) {
478 EnergyErr(i, j) = EnergyErrTemp(i, j);
489 for (
int i = 0; i < 7; i++) {
490 for (
int j = 0; j < 7; j++) {
491 if (i == j) jac(i, j) = 1;
495 jac(6, 3) = -1 * p4.Px() / p4.M();
496 jac(6, 4) = -1 * p4.Py() / p4.M();
497 jac(6, 5) = -1 * p4.Pz() / p4.M();
498 jac(6, 6) = p4.E() / p4.M();
500 TMatrix jact(7, 7); jact.Transpose(jac);
501 TMatrix MassErrPart(7, 7); MassErrPart.Mult(jac, EnergyErr);
502 TMatrix MassErrTemp(7, 7); MassErrTemp.Mult(MassErrPart, jact);
504 TMatrixDSym MassErr(7);
505 for (
int i = 0; i < 7; i++) {
506 for (
int j = 0; j < 7; j++) {
507 MassErr(i, j) = MassErrTemp(i, j);