12 #define SSTR( x ) dynamic_cast< std::ostringstream & >(( std::ostringstream() << std::dec << x ) ).str()
15 #include <analysis/modules/ParticleKinematicFitter/ParticleKinematicFitterModule.h>
16 #include <analysis/OrcaKinFit/BaseFitObject.h>
17 #include <analysis/OrcaKinFit/OPALFitterGSL.h>
18 #include <analysis/OrcaKinFit/JetFitObject.h>
19 #include <analysis/OrcaKinFit/NewtonFitterGSL.h>
20 #include <analysis/OrcaKinFit/NewFitterGSL.h>
21 #include <analysis/OrcaKinFit/PxPyPzMFitObject.h>
23 #include <mdst/dataobjects/ECLCluster.h>
26 #include <framework/logging/Logger.h>
29 #include <analysis/dataobjects/Particle.h>
30 #include <analysis/dataobjects/ParticleList.h>
33 #include <analysis/utility/PCmsLabTransform.h>
34 #include <analysis/utility/ParticleCopy.h>
36 using namespace CLHEP;
44 namespace OrcaKinFit {
61 setDescription(
"Kinematic fitter for modular analysis");
62 setPropertyFlags(c_ParallelProcessingCertified);
65 addParam(
"listName", m_listName,
"Name of particle list.",
string(
""));
66 addParam(
"kinematicFitter", m_kinematicFitter,
"Available: OrcaKinFit.",
string(
"OrcaKinFit"));
67 addParam(
"orcaFitterEngine", m_orcaFitterEngine,
"OrcaKinFit engine: NewFitterGSL, NewtonFitterGSL, OPALFitterGSL.",
68 string(
"OPALFitterGSL"));
69 addParam(
"orcaTracer", m_orcaTracer,
"OrcaKinFit tracer: None, Text.",
string(
"None"));
70 addParam(
"orcaConstraint", m_orcaConstraint,
"OrcaKinFit constraint: HardBeam, RecoilMass.",
string(
"HardBeam"));
71 addParam(
"debugFitter", m_debugFitter,
"Switch on/off internal debugging output if available.",
false);
72 addParam(
"debugFitterLevel", m_debugFitterLevel,
"Internal debugging output level if available.", 10);
73 addParam(
"addUnmeasuredPhoton", m_addUnmeasuredPhoton,
"Add one unmeasured photon (-3C).",
false);
74 addParam(
"add3CPhoton", m_add3CPhoton,
"Add one photon with unmeasured energy (-1C).",
false);
75 addParam(
"decayString", m_decayString,
"Specifies which daughter particles are included in the kinematic fit.",
string(
""));
76 addParam(
"updateMother", m_updateMother,
"Update the mother kinematics.",
true);
77 addParam(
"updateDaughters", m_updateDaughters,
"Update the daughter kinematics.",
false);
78 addParam(
"recoilMass", m_recoilMass,
"Recoil mass in GeV. RecoilMass constraint only.", 0.0);
79 addParam(
"invMass", m_invMass,
"Invariant mass in GeV. Mass constraint only.", 0.0);
84 void ParticleKinematicFitterModule::initialize()
86 m_eventextrainfo.registerInDataStore();
88 if (m_decayString !=
"") {
89 m_decaydescriptor.init(m_decayString);
90 B2INFO(
"ParticleKinematicFitter: Using specified decay string: " << m_decayString);
95 void ParticleKinematicFitterModule::beginRun()
97 B2INFO(
"ParticleKinematicFitterModule::beginRun");
100 void ParticleKinematicFitterModule::endRun()
102 B2INFO(
"ParticleKinematicFitterModule::endRun");
105 void ParticleKinematicFitterModule::terminate()
107 B2INFO(
"ParticleKinematicFitterModule::terminate");
111 void ParticleKinematicFitterModule::event()
113 B2DEBUG(17,
"ParticleKinematicFitterModule::event");
117 B2ERROR(
"ParticleList " << m_listName <<
" not found");
121 unsigned int n = plist->getListSize();
123 for (
unsigned i = 0; i < n; i++) {
124 Particle* particle = plist->getParticle(i);
126 if (m_updateDaughters ==
true) {
127 if (m_decayString.empty()) ParticleCopy::copyDaughters(particle);
128 else B2ERROR(
"Daughters update works only when all daughters are selected. Daughters will not be updated");
131 bool ok = doKinematicFit(particle);
133 if (!ok) particle->setPValue(-1.);
139 bool ParticleKinematicFitterModule::doKinematicFit(
Particle* mother)
142 B2DEBUG(17,
"ParticleKinematicFitterModule::doKinematicFit");
147 if (m_kinematicFitter ==
"OrcaKinFit") {
150 if (m_decayString !=
"") {
151 B2FATAL(
"ParticleKinematicFitterModule: OrcaKinFit does not support yet selection of daughters via decay string!") ;
155 if (!(m_orcaFitterEngine ==
"OPALFitterGSL" or
156 m_orcaFitterEngine ==
"NewtonFitterGSL" or
157 m_orcaFitterEngine ==
"NewFitterGSL")) {
158 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
162 if (!(m_orcaConstraint ==
"HardBeam" or
163 m_orcaConstraint ==
"RecoilMass" or
164 m_orcaConstraint ==
"Mass")) {
165 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
169 ok = doOrcaKinFitFit(mother);
174 B2FATAL(
"ParticleKinematicFitter: " << m_kinematicFitter <<
" is an invalid kinematic fitter!");
177 if (!ok)
return false;
184 bool ParticleKinematicFitterModule::doOrcaKinFitFit(
Particle* mother)
186 if (mother->getNDaughters() <= 1) {
187 B2WARNING(
"ParticleKinematicFitterModule: Cannot fit with " << mother->getNDaughters() <<
" daughters.");
192 std::vector<Particle*> particleChildren;
193 bool validChildren = fillFitParticles(mother, particleChildren);
195 if (!validChildren) {
196 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
205 if (m_debugFitter) debugfitter = m_debugFitterLevel;
208 if (m_orcaFitterEngine ==
"OPALFitterGSL") {
210 }
else if (m_orcaFitterEngine ==
"NewtonFitterGSL") {
213 }
else if (m_orcaFitterEngine ==
"NewFitterGSL") {
215 (
dynamic_cast<NewFitterGSL*
>(pfitter))->setDebug(debugfitter);
217 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
221 if (!pfitter)
return false;
231 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
232 addParticleToOrcaKinFit(fitter, particleChildren[iChild], iChild);
236 if (m_addUnmeasuredPhoton) addUnmeasuredGammaToOrcaKinFit(fitter);
239 addConstraintsToFitter(fitter);
242 addTracerToFitter(fitter);
245 storeOrcaKinFitParticles(
"Measured", fitter, particleChildren, mother);
247 double prob = fitter.fit();
248 double chi2 = fitter.getChi2();
249 int niter = fitter.getIterations();
250 int ndof = fitter.getDoF();
251 int errorcode = fitter.getError();
254 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
255 B2DEBUG(17,
"ParticleKinematicFitterModule: Fit result of OrcaKinFit using " << m_orcaFitterEngine);
256 B2DEBUG(17,
"ParticleKinematicFitterModule: prob " << prob);
257 B2DEBUG(17,
"ParticleKinematicFitterModule: chi2 " << chi2);
258 B2DEBUG(17,
"ParticleKinematicFitterModule: iterations " << niter);
259 B2DEBUG(17,
"ParticleKinematicFitterModule: ndf " << ndof);
260 B2DEBUG(17,
"ParticleKinematicFitterModule: errorcode " << errorcode);
261 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
264 if (m_updateMother) updateOrcaKinFitMother(fitter, particleChildren, mother);
267 if (m_updateDaughters) updateOrcaKinFitDaughters(fitter, mother);
270 storeOrcaKinFitParticles(
"Fitted", fitter, particleChildren, mother);
273 mother->addExtraInfo(
"OrcaKinFitProb", prob);
274 mother->addExtraInfo(
"OrcaKinFitChi2", chi2);
275 mother->addExtraInfo(
"OrcaKinFitErrorCode", errorcode);
278 if (m_addUnmeasuredPhoton) {
279 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
280 for (
auto fo : *fitObjectContainer) {
281 const std::string name = fo->getName();
282 if (name ==
"unmeasured") {
284 TLorentzVector tlv = getTLorentzVector(fitobject);
285 mother->addExtraInfo(
"OrcaKinFitUnmeasuredTheta", tlv.Theta());
286 mother->addExtraInfo(
"OrcaKinFitUnmeasuredPhi", tlv.Phi());
287 mother->addExtraInfo(
"OrcaKinFitUnmeasuredE", tlv.E());
291 mother->addExtraInfo(
"OrcaKinFitUnmeasuredErrorTheta", getFitObjectError(fitobject, 1));
292 mother->addExtraInfo(
"OrcaKinFitUnmeasuredErrorPhi", getFitObjectError(fitobject, 2));
293 mother->addExtraInfo(
"OrcaKinFitUnmeasuredErrorE", getFitObjectError(fitobject, 0));
304 bool ParticleKinematicFitterModule::fillFitParticles(
Particle* mother, std::vector<Particle*>& particleChildren)
306 for (
unsigned ichild = 0; ichild < mother->getNDaughters(); ichild++) {
307 auto* child =
const_cast<Particle*
>(mother->getDaughter(ichild));
309 if (child->getNDaughters() > 0) {
310 bool err = fillFitParticles(child, particleChildren);
312 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
315 }
else if (child->getPValue() > 0) {
316 particleChildren.push_back(child);
318 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
319 child->getEnergy() <<
" GeV");
326 bool ParticleKinematicFitterModule::AddFour(
Particle* mother)
328 TMatrixFSym MomentumVertexErrorMatrix(7);
329 for (
unsigned ichild = 0; ichild < mother->getNDaughters(); ichild++) {
330 auto* child =
const_cast<Particle*
>(mother->getDaughter(ichild));
332 if (child->getPValue() > 0) {
333 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
334 }
else if (child->getNDaughters() > 0) {
336 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
338 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
339 child->getEnergy() <<
" GeV");
343 mother->setMomentumVertexErrorMatrix(MomentumVertexErrorMatrix);
348 void ParticleKinematicFitterModule::addParticleToOrcaKinFit(
BaseFitter& fitter,
Particle* particle,
const int index)
350 B2DEBUG(17,
"ParticleKinematicFitterModule: adding a particle to the fitter!");
352 if (m_add3CPhoton && index == 0) {
353 if (particle -> getPDGCode() != 22) {
354 B2ERROR(
"In 3C Kinematic fit, the first daughter should be the Unmeasured Photon!");
357 double startingE = particle -> getECLCluster() -> getEnergy(particle -> getECLClusterEHypothesisBit());
358 double startingPhi = particle -> getECLCluster() -> getPhi();
359 double startingTheta = particle -> getECLCluster() -> getTheta();
361 double startingeE = particle->getECLCluster() -> getUncertaintyEnergy();
362 double startingePhi = particle->getECLCluster() -> getUncertaintyPhi();
363 double startingeTheta = particle->getECLCluster() -> getUncertaintyTheta();
365 B2DEBUG(17, startingPhi <<
" " << startingTheta <<
" " << startingePhi <<
" " << startingeTheta);
368 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, startingeE, startingeTheta, startingePhi, 0.);
369 pfitobject->setParam(0, startingE,
false,
false);
370 pfitobject->setParam(1, startingTheta,
true,
false);
371 pfitobject->setParam(2, startingPhi,
true,
false);
373 std::string fitObjectName =
"unmeasured";
374 pfitobject->setName(fitObjectName.c_str());
378 addFitObjectToConstraints(fitobject);
381 fitter.addFitObject(fitobject);
385 CLHEP::HepLorentzVector clheplorentzvector = getCLHEPLorentzVector(particle);
388 CLHEP::HepSymMatrix clhepmomentumerrormatrix = getCLHEPMomentumErrorMatrix(particle);
392 pfitobject =
new PxPyPzMFitObject(clheplorentzvector, clhepmomentumerrormatrix);
393 std::string fitObjectName =
"particle_" + SSTR(index);
394 pfitobject->setName(fitObjectName.c_str());
398 addFitObjectToConstraints(fitobject);
401 fitter.addFitObject(fitobject);
409 CLHEP::HepSymMatrix ParticleKinematicFitterModule::getCLHEPMomentumErrorMatrix(
Particle* particle)
411 CLHEP::HepSymMatrix covMatrix(4);
412 TMatrixFSym errMatrix = particle->getMomentumErrorMatrix();
414 for (
int i = 0; i < 4; i++) {
415 for (
int j = 0; j < 4; j++) {
416 covMatrix[i][j] = errMatrix[i][j];
424 CLHEP::HepSymMatrix ParticleKinematicFitterModule::getCLHEPMomentumVertexErrorMatrix(
Particle* particle)
426 CLHEP::HepSymMatrix covMatrix(7);
427 TMatrixFSym errMatrix = particle->getMomentumVertexErrorMatrix();
429 for (
int i = 0; i < 7; i++) {
430 for (
int j = 0; j < 7; j++) {
431 covMatrix[i][j] = errMatrix[i][j];
439 CLHEP::HepLorentzVector ParticleKinematicFitterModule::getCLHEPLorentzVector(
Particle* particle)
441 CLHEP::HepLorentzVector mom(particle->getPx(), particle->getPy(), particle->getPz(), particle->getEnergy());
448 TLorentzVector mom(fitobject->
getPx(), fitobject->
getPy(), fitobject->
getPz(), fitobject->
getE());
454 TMatrixFSym ParticleKinematicFitterModule::getTMatrixFSymMomentumErrorMatrix()
456 TMatrixFSym errMatrix(4);
458 for (
int i = 0; i < 4; i++) {
459 for (
int j = i; j < 4; j++) {
460 errMatrix[i][j] = 0.0;
468 TMatrixFSym ParticleKinematicFitterModule::getTMatrixFSymMomentumVertexErrorMatrix()
470 TMatrixFSym errMatrix(7);
472 for (
int i = 0; i < 7; i++) {
473 for (
int j = i; j < 7; j++) {
474 errMatrix[i][j] = 0.0;
481 TLorentzVector ParticleKinematicFitterModule::getTLorentzVectorConstraints()
484 if (m_orcaConstraint ==
"HardBeam") {
485 TLorentzVector constraints4vector(m_hardConstraintPx.getValue(),
486 m_hardConstraintPy.getValue(),
487 m_hardConstraintPz.getValue(),
488 m_hardConstraintE.getValue());
489 return constraints4vector;
491 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
495 return TLorentzVector(0., 0., 0., 0.);
499 void ParticleKinematicFitterModule::setConstraints()
502 if (m_orcaConstraint ==
"HardBeam") {
511 m_hardConstraintPx.resetFOList();
512 m_hardConstraintPy.resetFOList();
513 m_hardConstraintPz.resetFOList();
514 m_hardConstraintE.resetFOList();
516 m_hardConstraintPx.setName(
"Sum(p_x) [hard]");
517 m_hardConstraintPy.setName(
"Sum(p_y) [hard]");
518 m_hardConstraintPz.setName(
"Sum(p_z) [hard]");
519 m_hardConstraintE.setName(
"Sum(E) [hard]");
521 }
else if (m_orcaConstraint ==
"RecoilMass") {
525 m_hardConstraintRecoilMass =
RecoilMassConstraint(m_recoilMass, boost.Px(), boost.Py(), boost.Pz(), boost.E());
527 m_hardConstraintRecoilMass.resetFOList();
528 m_hardConstraintRecoilMass.setName(
"Recoil Mass [hard]");
530 }
else if (m_orcaConstraint ==
"Mass") {
533 m_hardConstraintMass.resetFOList();
534 m_hardConstraintMass.setName(
"Mass [hard]");
536 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
541 void ParticleKinematicFitterModule::resetFitter(
BaseFitter& fitter)
543 B2DEBUG(17,
"ParticleKinematicFitterModule: Resetting the fitter");
551 if (m_orcaConstraint ==
"HardBeam") {
552 m_hardConstraintPx.addToFOList(fitobject);
553 m_hardConstraintPy.addToFOList(fitobject);
554 m_hardConstraintPz.addToFOList(fitobject);
555 m_hardConstraintE.addToFOList(fitobject);
556 }
else if (m_orcaConstraint ==
"RecoilMass") {
557 m_hardConstraintRecoilMass.addToFOList(fitobject);
558 }
else if (m_orcaConstraint ==
"Mass") {
559 m_hardConstraintMass.addToFOList(fitobject);
561 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
567 void ParticleKinematicFitterModule::addConstraintsToFitter(
BaseFitter& fitter)
569 if (m_orcaConstraint ==
"HardBeam") {
570 fitter.addConstraint(m_hardConstraintPx);
571 fitter.addConstraint(m_hardConstraintPy);
572 fitter.addConstraint(m_hardConstraintPz);
573 fitter.addConstraint(m_hardConstraintE);
574 }
else if (m_orcaConstraint ==
"RecoilMass") {
575 fitter.addConstraint(m_hardConstraintRecoilMass);
576 }
else if (m_orcaConstraint ==
"Mass") {
577 fitter.addConstraint(m_hardConstraintMass);
581 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
586 void ParticleKinematicFitterModule::addTracerToFitter(
BaseFitter& fitter)
588 if (m_orcaTracer ==
"Text") {
590 fitter.setTracer(m_textTracer);
591 }
else if (m_orcaTracer !=
"None") {
592 B2FATAL(
"ParticleKinematicFitterModule: " << m_orcaTracer <<
" is an invalid OrcaKinFit tracer!");
596 void ParticleKinematicFitterModule::addUnmeasuredGammaToOrcaKinFit(
BaseFitter& fitter)
599 TLorentzVector tlv = getTLorentzVectorConstraints();
600 double startingE = tlv.E();
601 double startingPhi = tlv.Phi();
602 double startingTheta = tlv.Theta();
606 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, 0.0, 0.0, 0.0, 0.);
607 pfitobject->setParam(0, startingE,
false,
false);
608 pfitobject->setParam(1, startingTheta,
false,
false);
609 pfitobject->setParam(2, startingPhi,
false,
false);
611 std::string fitObjectName =
"unmeasured";
612 pfitobject->setName(fitObjectName.c_str());
616 addFitObjectToConstraints(fitobject);
619 fitter.addFitObject(fitobject);
626 std::vector <Belle2::Particle*> bDau = mother->getDaughters();
627 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
629 const unsigned nd = bDau.size();
631 std::vector<std::vector<unsigned>> pars;
632 std::vector<Particle*> allparticles;
633 for (
unsigned ichild = 0; ichild < nd; ichild++) {
634 const Particle* daughter = mother->getDaughter(ichild);
635 std::vector<unsigned> pard;
636 if (daughter->getNDaughters() > 0) {
637 updateMapOfTrackAndDaughter(l, pars, pard, allparticles, daughter);
638 pars.push_back(pard);
639 allparticles.push_back(bDau[ichild]);
642 pars.push_back(pard);
643 allparticles.push_back(bDau[ichild]);
648 if (l == fitObjectContainer->size() - m_addUnmeasuredPhoton) {
650 if (fitter.getError() == 0) {
651 for (
unsigned iDaug = 0; iDaug < allparticles.size(); iDaug++) {
653 TMatrixFSym errMatrixU(7);
654 if (pars[iDaug].size() > 0) {
655 for (
unsigned int iChild : pars[iDaug]) {
656 BaseFitObject* fo = fitObjectContainer->at(iChild);
658 TLorentzVector tlv_sub = getTLorentzVector(fitobject);
659 TMatrixFSym errMatrixU_sub = getCovMat7(fitobject);
661 errMatrixU = errMatrixU + errMatrixU_sub;
664 B2FATAL(
"ParticleKinematicFitterModule: no fitObject could be used to update the daughter!");
666 TVector3 pos = allparticles[iDaug]->getVertex();
667 TMatrixFSym errMatrix = allparticles[iDaug]->getMomentumVertexErrorMatrix();
668 TMatrixFSym errMatrixMom = allparticles[iDaug]->getMomentumErrorMatrix();
669 TMatrixFSym errMatrixVer = allparticles[iDaug]->getVertexErrorMatrix();
671 for (
int i = 0; i < 3; i++) {
672 for (
int j = i; j < 3; j++) {
673 errMatrixU[i + 4][j + 4] = errMatrixVer[i][j];
677 allparticles[iDaug]->set4Vector(tlv);
678 allparticles[iDaug]->setVertex(pos);
679 allparticles[iDaug]->setMomentumVertexErrorMatrix(errMatrixU);
685 B2ERROR(
"updateOrcaKinFitDaughters: Cannot update daughters, mismatch between number of daughters and number of fitobjects!");
691 void ParticleKinematicFitterModule::updateMapOfTrackAndDaughter(
unsigned& l, std::vector<std::vector<unsigned>>& pars,
692 std::vector<unsigned>& parm, std::vector<Particle*>& allparticles,
const Particle* daughter)
694 std::vector <Belle2::Particle*> dDau = daughter->getDaughters();
695 for (
unsigned ichild = 0; ichild < daughter->getNDaughters(); ichild++) {
696 const Particle* child = daughter->getDaughter(ichild);
697 std::vector<unsigned> pard;
698 if (child->getNDaughters() > 0) {
699 updateMapOfTrackAndDaughter(l, pars, pard, allparticles, child);
700 parm.insert(parm.end(), pard.begin(), pard.end());
701 pars.push_back(pard);
702 allparticles.push_back(dDau[ichild]);
706 pars.push_back(pard);
707 allparticles.push_back(dDau[ichild]);
714 void ParticleKinematicFitterModule::updateOrcaKinFitMother(
BaseFitter& fitter, std::vector<Particle*>& particleChildren,
718 TVector3 pos = mother->getVertex();
719 TMatrixFSym errMatrix = mother->getMomentumVertexErrorMatrix();
720 float pvalue = mother->getPValue();
723 TLorentzVector momnew(0., 0., 0., 0.);
725 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
726 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
727 BaseFitObject* fo = fitObjectContainer->at(iChild);
729 TLorentzVector tlv = getTLorentzVector(fitobject);
736 mother->updateMomentum(momnew, pos, errMatrix, pvalue);
740 bool ParticleKinematicFitterModule::storeOrcaKinFitParticles(
const std::string& prefix,
BaseFitter& fitter,
741 std::vector<Particle*>& particleChildren,
Particle* mother)
743 bool updated =
false;
744 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
746 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
747 BaseFitObject* fo = fitObjectContainer->at(iChild);
749 TLorentzVector tlv = getTLorentzVector(fitobject);
752 std::string extraVariableParticlePx =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Px";
753 std::string extraVariableParticlePy =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Py";
754 std::string extraVariableParticlePz =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Pz";
755 std::string extraVariableParticleE =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_E";
756 std::string extraVariableParticlePxErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PxErr";
757 std::string extraVariableParticlePyErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PyErr";
758 std::string extraVariableParticlePzErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PzErr";
759 std::string extraVariableParticleEErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_EErr";
761 mother->addExtraInfo(extraVariableParticlePx, tlv.Px());
762 mother->addExtraInfo(extraVariableParticlePy, tlv.Py());
763 mother->addExtraInfo(extraVariableParticlePz, tlv.Pz());
764 mother->addExtraInfo(extraVariableParticleE, tlv.E());
765 mother->addExtraInfo(extraVariableParticlePxErr, getFitObjectError(fitobject, 0));
766 mother->addExtraInfo(extraVariableParticlePyErr, getFitObjectError(fitobject, 1));
767 mother->addExtraInfo(extraVariableParticlePzErr, getFitObjectError(fitobject, 2));
768 mother->addExtraInfo(extraVariableParticleEErr, -1.0);
775 float ParticleKinematicFitterModule::getFitObjectError(
ParticleFitObject* fitobject,
int ilocal)
779 if (pxpypzmfitobject) {
780 return fitobject->getError(ilocal);
782 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
792 if (pxpypzmfitobject) {
794 TMatrixFSym errMatrix(3);
797 for (
int i = 0; i < 3; i++) {
798 for (
int j = 0; j < 3; j++) {
799 errMatrix[i][j] = pxpypzmfitobject->getCov(i, j);
805 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
813 TMatrixFSym fitCovMatrix(3);
815 if (strcmp(fitobject->getParamName(0),
"E") == 0) {
817 auto* jetfitObject =
static_cast<JetFitObject*
>(fitobject);
820 fitCovMatrix = getFitObjectCovMat(fitobject);
821 TLorentzVector tlv = getTLorentzVector(fitobject);
823 const double energy = tlv.E();
824 const double theta = tlv.Theta();
825 const double phi = tlv.Phi();
827 const double st = sin(theta);
828 const double ct = cos(theta);
829 const double sp = sin(phi);
830 const double cp = cos(phi);
835 A(0, 1) = energy * cp * ct ;
836 A(0, 2) = -energy * sp * st ;
838 A(1, 1) = energy * sp * ct ;
839 A(1, 2) = energy * cp * st ;
841 A(2, 1) = -energy * st ;
847 TMatrixFSym D = fitCovMatrix.Similarity(A);
851 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
856 if (pxpypzmfitobject) {
858 fitCovMatrix = getFitObjectCovMat(fitobject);
861 TLorentzVector tlv = getTLorentzVector(fitobject);
873 A[3][0] = tlv.Px() / tlv.E();
874 A[3][1] = tlv.Py() / tlv.E();
875 A[3][2] = tlv.Pz() / tlv.E();
878 TMatrixFSym D = fitCovMatrix.Similarity(A);
882 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");