9 #define SSTR( x ) dynamic_cast< std::ostringstream && >(( std::ostringstream() << std::dec << x ) ).str()
12 #include <analysis/modules/ParticleKinematicFitter/ParticleKinematicFitterModule.h>
13 #include <analysis/OrcaKinFit/BaseFitObject.h>
14 #include <analysis/OrcaKinFit/OPALFitterGSL.h>
15 #include <analysis/OrcaKinFit/JetFitObject.h>
16 #include <analysis/OrcaKinFit/NewtonFitterGSL.h>
17 #include <analysis/OrcaKinFit/NewFitterGSL.h>
18 #include <analysis/OrcaKinFit/PxPyPzMFitObject.h>
20 #include <mdst/dataobjects/ECLCluster.h>
23 #include <framework/gearbox/Const.h>
24 #include <framework/logging/Logger.h>
27 #include <analysis/dataobjects/Particle.h>
30 #include <analysis/utility/PCmsLabTransform.h>
31 #include <analysis/utility/ParticleCopy.h>
33 using namespace CLHEP;
36 using namespace Belle2::OrcaKinFit;
48 ParticleKinematicFitterModule::ParticleKinematicFitterModule() :
Module(), m_textTracer(nullptr), m_eventextrainfo(
"",
58 string(
"OPALFitterGSL"));
61 addParam(
"debugFitter",
m_debugFitter,
"Switch on/off internal debugging output if available.",
false);
67 addParam(
"liftPhotonTheta",
m_liftPhotonTheta,
"Lift theta constraint of 3CPhoton. Valid when add3CPhoton is true.",
false);
68 addParam(
"decayString",
m_decayString,
"Specifies which daughter particles are included in the kinematic fit.",
string(
""));
72 addParam(
"invMass",
m_invMass,
"Invariant mass in GeV. Mass constraint only.", 0.0);
82 B2INFO(
"ParticleKinematicFitter: Using specified decay string: " <<
m_decayString);
90 B2INFO(
"ParticleKinematicFitterModule::terminate");
95 B2DEBUG(17,
"ParticleKinematicFitterModule::event");
97 unsigned int n =
m_plist->getListSize();
99 for (
unsigned i = 0; i < n; i++) {
104 else B2ERROR(
"Daughters update works only when all daughters are selected. Daughters will not be updated");
109 if (!ok) particle->setPValue(-1.);
115 B2DEBUG(17,
"ParticleKinematicFitterModule::doKinematicFit");
124 B2FATAL(
"ParticleKinematicFitterModule: OrcaKinFit does not support yet selection of daughters via decay string!") ;
131 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
138 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
144 B2FATAL(
"ParticleKinematicFitter: " <<
m_kinematicFitter <<
" is an invalid kinematic fitter!");
147 if (!ok)
return false;
155 if (mother->getNDaughters() <= 1) {
156 B2WARNING(
"ParticleKinematicFitterModule: Cannot fit with " << mother->getNDaughters() <<
" daughters.");
161 std::vector<Particle*> particleChildren;
164 if (!validChildren) {
165 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
184 (
dynamic_cast<NewFitterGSL*
>(pfitter))->setDebug(debugfitter);
186 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
190 if (!pfitter)
return false;
200 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
216 double prob = fitter.fit();
217 double chi2 = fitter.getChi2();
218 int niter = fitter.getIterations();
219 int ndof = fitter.getDoF();
220 int errorcode = fitter.getError();
222 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
223 B2DEBUG(17,
"ParticleKinematicFitterModule: Fit result of OrcaKinFit using " <<
m_orcaFitterEngine);
224 B2DEBUG(17,
"ParticleKinematicFitterModule: prob " << prob);
225 B2DEBUG(17,
"ParticleKinematicFitterModule: chi2 " << chi2);
226 B2DEBUG(17,
"ParticleKinematicFitterModule: iterations " << niter);
227 B2DEBUG(17,
"ParticleKinematicFitterModule: ndf " << ndof);
228 B2DEBUG(17,
"ParticleKinematicFitterModule: errorcode " << errorcode);
229 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
241 mother->addExtraInfo(
"OrcaKinFitProb", prob);
242 mother->setPValue(prob);
243 mother->addExtraInfo(
"OrcaKinFitChi2", chi2);
244 mother->addExtraInfo(
"OrcaKinFitErrorCode", errorcode);
248 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
249 for (
auto fo : *fitObjectContainer) {
250 const std::string name = fo->getName();
251 if (name.find(
"Unmeasured") != std::string::npos) {
254 mother->addExtraInfo(
"OrcaKinFit" + name +
"Theta", tlv.Theta());
255 mother->addExtraInfo(
"OrcaKinFit" + name +
"Phi", tlv.Phi());
256 mother->addExtraInfo(
"OrcaKinFit" + name +
"E", tlv.E());
260 mother->addExtraInfo(
"OrcaKinFit" + name +
"ErrorTheta",
getFitObjectError(fitobject, 1));
261 mother->addExtraInfo(
"OrcaKinFit" + name +
"ErrorPhi",
getFitObjectError(fitobject, 2));
262 mother->addExtraInfo(
"OrcaKinFit" + name +
"ErrorE",
getFitObjectError(fitobject, 0));
275 for (
unsigned ichild = 0; ichild < mother->getNDaughters(); ichild++) {
276 auto* child =
const_cast<Particle*
>(mother->getDaughter(ichild));
278 if (child->getNDaughters() > 0) {
281 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
284 }
else if (child->getPValue() > 0) {
285 particleChildren.push_back(child);
287 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
288 child->getEnergy() <<
" GeV");
297 TMatrixFSym MomentumVertexErrorMatrix(7);
298 for (
unsigned ichild = 0; ichild < mother->getNDaughters(); ichild++) {
299 auto* child =
const_cast<Particle*
>(mother->getDaughter(ichild));
301 if (child->getPValue() > 0) {
302 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
303 }
else if (child->getNDaughters() > 0) {
305 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
307 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
308 child->getEnergy() <<
" GeV");
312 mother->setMomentumVertexErrorMatrix(MomentumVertexErrorMatrix);
318 B2DEBUG(17,
"ParticleKinematicFitterModule: adding a particle to the fitter!");
321 if (particle -> getPDGCode() !=
Const::photon.getPDGCode()) {
322 B2ERROR(
"In 3C Kinematic fit, the first daughter should be the Unmeasured Photon!");
325 double startingE = particle -> getECLCluster() -> getEnergy(particle -> getECLClusterEHypothesisBit());
326 double startingPhi = particle -> getECLCluster() -> getPhi();
327 double startingTheta = particle -> getECLCluster() -> getTheta();
329 double startingeE = particle->getECLCluster() -> getUncertaintyEnergy();
330 double startingePhi = particle->getECLCluster() -> getUncertaintyPhi();
331 double startingeTheta = particle->getECLCluster() -> getUncertaintyTheta();
333 B2DEBUG(17, startingPhi <<
" " << startingTheta <<
" " << startingePhi <<
" " << startingeTheta);
336 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, startingeE, startingeTheta, startingePhi, 0.);
337 pfitobject->
setParam(0, startingE,
false,
false);
339 pfitobject->
setParam(1, startingTheta,
false,
false);
341 pfitobject->
setParam(1, startingTheta,
true,
false);
342 pfitobject->
setParam(2, startingPhi,
true,
false);
344 std::string fitObjectName =
"Unmeasured3C";
345 pfitobject->
setName(fitObjectName.c_str());
352 fitter.addFitObject(fitobject);
363 pfitobject =
new PxPyPzMFitObject(clheplorentzvector, clhepmomentumerrormatrix);
364 std::string fitObjectName =
"particle_" + SSTR(index);
365 pfitobject->
setName(fitObjectName.c_str());
372 fitter.addFitObject(fitobject);
380 CLHEP::HepSymMatrix covMatrix(4);
381 TMatrixFSym errMatrix = particle->getMomentumErrorMatrix();
383 for (
int i = 0; i < 4; i++) {
384 for (
int j = 0; j < 4; j++) {
385 covMatrix[i][j] = errMatrix[i][j];
394 CLHEP::HepSymMatrix covMatrix(7);
395 TMatrixFSym errMatrix = particle->getMomentumVertexErrorMatrix();
397 for (
int i = 0; i < 7; i++) {
398 for (
int j = 0; j < 7; j++) {
399 covMatrix[i][j] = errMatrix[i][j];
408 CLHEP::HepLorentzVector mom(particle->getPx(), particle->getPy(), particle->getPz(), particle->get4Vector().E());
414 ROOT::Math::PxPyPzEVector mom(fitobject->
getPx(), fitobject->
getPy(), fitobject->
getPz(), fitobject->
getE());
421 TMatrixFSym errMatrix(4);
423 for (
int i = 0; i < 4; i++) {
424 for (
int j = i; j < 4; j++) {
425 errMatrix[i][j] = 0.0;
435 TMatrixFSym errMatrix(7);
437 for (
int i = 0; i < 7; i++) {
438 for (
int j = i; j < 7; j++) {
439 errMatrix[i][j] = 0.0;
453 return constraints4vector;
455 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
459 return ROOT::Math::PxPyPzEVector(0., 0., 0., 0.);
498 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
504 B2DEBUG(17,
"ParticleKinematicFitterModule: Resetting the fitter");
520 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
538 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
548 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaTracer <<
" is an invalid OrcaKinFit tracer!");
554 B2DEBUG(17,
"ParticleKinematicFitterModule::addUnmeasuredGammaToOrcaKinFit: adding an unmeasured photon to the fitter!");
557 double startingE = tlv.E();
558 double startingPhi = tlv.Phi();
559 double startingTheta = tlv.Theta();
560 bool paramFlag =
false;
565 std::string fitObjectName =
"UnmeasuredAlongBeam";
568 startingTheta = 41.5e-3;
572 startingTheta = TMath::Pi() - 41.5e-3;
576 fitObjectName =
"Unmeasured";
579 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, 0.0, 0.0, 0.0, 0.);
580 pfitobject->
setParam(0, startingE,
false,
false);
581 pfitobject->
setParam(1, startingTheta, paramFlag, paramFlag);
582 pfitobject->
setParam(2, startingPhi, paramFlag, paramFlag);
584 pfitobject->
setName(fitObjectName.c_str());
591 fitter.addFitObject(fitobject);
596 std::vector <Belle2::Particle*> bDau = mother->getDaughters();
597 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
599 const unsigned nd = bDau.size();
601 std::vector<std::vector<unsigned>> pars;
602 std::vector<Particle*> allparticles;
603 for (
unsigned ichild = 0; ichild < nd; ichild++) {
604 const Particle* daughter = mother->getDaughter(ichild);
605 std::vector<unsigned> pard;
606 if (daughter->getNDaughters() > 0) {
608 pars.push_back(pard);
609 allparticles.push_back(bDau[ichild]);
612 pars.push_back(pard);
613 allparticles.push_back(bDau[ichild]);
620 if (fitter.getError() == 0) {
621 for (
unsigned iDaug = 0; iDaug < allparticles.size(); iDaug++) {
622 ROOT::Math::PxPyPzEVector tlv ;
623 TMatrixFSym errMatrixU(7);
624 if (pars[iDaug].size() > 0) {
625 for (
unsigned int iChild : pars[iDaug]) {
629 TMatrixFSym errMatrixU_sub =
getCovMat7(fitobject);
631 errMatrixU = errMatrixU + errMatrixU_sub;
634 B2FATAL(
"ParticleKinematicFitterModule: no fitObject could be used to update the daughter!");
636 ROOT::Math::XYZVector pos = allparticles[iDaug]->getVertex();
637 TMatrixFSym errMatrix = allparticles[iDaug]->getMomentumVertexErrorMatrix();
638 TMatrixFSym errMatrixMom = allparticles[iDaug]->getMomentumErrorMatrix();
639 TMatrixFSym errMatrixVer = allparticles[iDaug]->getVertexErrorMatrix();
641 for (
int i = 0; i < 3; i++) {
642 for (
int j = i; j < 3; j++) {
643 errMatrixU[i + 4][j + 4] = errMatrixVer[i][j];
647 allparticles[iDaug]->set4Vector(tlv);
648 allparticles[iDaug]->setVertex(pos);
649 allparticles[iDaug]->setMomentumVertexErrorMatrix(errMatrixU);
655 B2ERROR(
"updateOrcaKinFitDaughters: Cannot update daughters, mismatch between number of daughters and number of fitobjects!");
661 std::vector<unsigned>& parm, std::vector<Particle*>& allparticles,
const Particle* daughter)
663 std::vector <Belle2::Particle*> dDau = daughter->getDaughters();
664 for (
unsigned ichild = 0; ichild < daughter->getNDaughters(); ichild++) {
665 const Particle* child = daughter->getDaughter(ichild);
666 std::vector<unsigned> pard;
667 if (child->getNDaughters() > 0) {
669 parm.insert(parm.end(), pard.begin(), pard.end());
670 pars.push_back(pard);
671 allparticles.push_back(dDau[ichild]);
675 pars.push_back(pard);
676 allparticles.push_back(dDau[ichild]);
686 ROOT::Math::XYZVector pos = mother->getVertex();
687 TMatrixFSym errMatrix = mother->getMomentumVertexErrorMatrix();
688 float pvalue = mother->getPValue();
691 ROOT::Math::PxPyPzEVector momnew(0., 0., 0., 0.);
693 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
694 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
704 mother->updateMomentum(momnew, pos, errMatrix, pvalue);
708 std::vector<Particle*>& particleChildren,
Particle* mother)
710 bool updated =
false;
711 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
713 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
719 std::string extraVariableParticlePx =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Px";
720 std::string extraVariableParticlePy =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Py";
721 std::string extraVariableParticlePz =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Pz";
722 std::string extraVariableParticleE =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_E";
723 std::string extraVariableParticlePxErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PxErr";
724 std::string extraVariableParticlePyErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PyErr";
725 std::string extraVariableParticlePzErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PzErr";
726 std::string extraVariableParticleEErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_EErr";
728 mother->addExtraInfo(extraVariableParticlePx, tlv.Px());
729 mother->addExtraInfo(extraVariableParticlePy, tlv.Py());
730 mother->addExtraInfo(extraVariableParticlePz, tlv.Pz());
731 mother->addExtraInfo(extraVariableParticleE, tlv.E());
732 mother->addExtraInfo(extraVariableParticlePxErr,
getFitObjectError(fitobject, 0));
733 mother->addExtraInfo(extraVariableParticlePyErr,
getFitObjectError(fitobject, 1));
734 mother->addExtraInfo(extraVariableParticlePzErr,
getFitObjectError(fitobject, 2));
735 mother->addExtraInfo(extraVariableParticleEErr, -1.0);
746 if (pxpypzmfitobject) {
749 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
759 if (pxpypzmfitobject) {
761 TMatrixFSym errMatrix(3);
764 for (
int i = 0; i < 3; i++) {
765 for (
int j = 0; j < 3; j++) {
766 errMatrix[i][j] = pxpypzmfitobject->getCov(i, j);
772 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
778 TMatrixFSym fitCovMatrix(3);
782 auto* jetfitObject =
static_cast<JetFitObject*
>(fitobject);
788 const double energy = tlv.E();
789 const double theta = tlv.Theta();
790 const double phi = tlv.Phi();
792 const double st = sin(theta);
793 const double ct = cos(theta);
794 const double sp = sin(phi);
795 const double cp = cos(phi);
800 A(0, 1) = energy * cp * ct ;
801 A(0, 2) = -energy * sp * st ;
803 A(1, 1) = energy * sp * ct ;
804 A(1, 2) = energy * cp * st ;
806 A(2, 1) = -energy * st ;
812 TMatrixFSym D = fitCovMatrix.Similarity(A);
816 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
821 if (pxpypzmfitobject) {
838 A[3][0] = tlv.Px() / tlv.E();
839 A[3][1] = tlv.Py() / tlv.E();
840 A[3][2] = tlv.Pz() / tlv.E();
843 TMatrixFSym D = fitCovMatrix.Similarity(A);
847 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
static const ParticleType photon
photon particle
In the store you can park objects that have to be accessed by various modules.
bool init(const std::string &str)
Initialise the DecayDescriptor from given string.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
void setName(const char *name_)
Set object's name.
virtual const char * getParamName(int ilocal) const =0
Get name of parameter ilocal.
virtual double getError(int ilocal) const
Get error of parameter ilocal.
virtual bool setParam(int ilocal, double par_, bool measured_, bool fixed_=false)
Set value and measured flag of parameter i; return: significant change.
void setName(const char *name_)
Set object's name.
Abstract base class for fitting engines of kinematic fits.
Class for jets with (E, eta, phi) in kinematic fits.
Implements constraint 0 = mass1 - mass2 - m.
Implements a constraint of the form efact*sum(E)+pxfact*sum(px)+pyfact*sum(py)+pzfact*sum(pz)=value.
virtual double getValue() const override
Returns the value of the constraint.
A kinematic fitter using the Newton-Raphson method to solve the equations.
Description of the fit algorithm and interface:
virtual void addToFOList(ParticleFitObject &fitobject, int flag=1)
Adds one ParticleFitObject objects to the list.
virtual void resetFOList()
Resests ParticleFitObject list.
virtual double getPx() const
Return px.
virtual double getPz() const
Return pz.
virtual double getPy() const
Return py.
virtual double getE() const
Return E.
MassConstraint m_hardConstraintMass
hard mass constraint
bool fillFitParticles(Particle *mother, std::vector< Particle * > &particleChildren)
Fills valid particle's children (with valid error matrix) in the vector of Particles that will enter ...
void addFitObjectToConstraints(ParticleFitObject &fitobject)
Adds Orca fit object to the constraints.
bool m_liftPhotonTheta
lift theta constraint of the 3CPhoton.
bool AddFour(Particle *mother)
Added four vectors and calculated a covariance matrix for a combined particles.
std::string m_orcaConstraint
Constraint (softBeam, hardBeam (default))
int m_debugFitterLevel
internal debugging level (for New and Newton fitter only)
virtual void initialize() override
Initialize the Module.
CLHEP::HepSymMatrix getCLHEPMomentumVertexErrorMatrix(Particle *particle)
Returns particle's 7x7 momentum-vertex-error matrix as a HepSymMatrix.
MomentumConstraint m_hardConstraintE
hard beam constraint E
virtual void event() override
Event processor.
bool m_debugFitter
activate internal debugging (for New and Newton fitter only)
bool m_updateDaughters
update daughter kinematics
std::string m_decayString
daughter particles selection
std::string m_listName
particle list name
void addUnmeasuredGammaToOrcaKinFit(BaseFitter &fitter)
Adds an unmeasured gamma (E, phi, theta) to the fit (-3C) stored as EventExtraInfo TODO.
virtual void terminate() override
termination.
MomentumConstraint m_hardConstraintPz
hard beam constraint pz
float getFitObjectError(ParticleFitObject *fitobject, int ilocal)
Returns fit object error on the parameter ilocal.
ROOT::Math::PxPyPzEVector getLorentzVectorConstraints()
Get constraints (at whatever stage before/after fitting)
std::string m_orcaFitterEngine
Orca Fitter Engine name.
bool doOrcaKinFitFit(Particle *p)
Kinematic fit using OrcaKinFit.
bool m_add3CPhoton
add one photon with unmeasured energy to the fit (costs 1 constraints)
TMatrixFSym getTMatrixFSymMomentumErrorMatrix()
Returns particle's 7x7 momentum-error matrix as a TMatrixFSym.
void addConstraintsToFitter(BaseFitter &fitter)
Adds Orca fit object to the constraints.
void addTracerToFitter(BaseFitter &fitter)
Adds tracer to the fitter.
RecoilMassConstraint m_hardConstraintRecoilMass
hard recoil mass constraint
void updateMapOfTrackAndDaughter(unsigned &l, std::vector< std::vector< unsigned >> &pars, std::vector< unsigned > &pard, std::vector< Particle * > &allparticles, const Particle *daughter)
update the map of daughter and tracks, find out which tracks belong to each daughter.
TMatrixFSym getTMatrixFSymMomentumVertexErrorMatrix()
Returns particle's 7x7 momentum-vertex-error matrix as a TMatrixFSym.
StoreObjPtr< EventExtraInfo > m_eventextrainfo
StoreObjPtr for the EventExtraInfo in this mode.
MomentumConstraint m_hardConstraintPy
hard beam constraint py
double m_recoilMass
Recoil mass for RecoilMass constraint.
CLHEP::HepLorentzVector getCLHEPLorentzVector(Particle *particle)
Returns particle's 4-momentum as a HepLorentzVector.
TextTracer * m_textTracer
internal text output variable
DecayDescriptor m_decaydescriptor
Decay descriptor of decays to look for.
TMatrixFSym getCovMat7(ParticleFitObject *fitobject)
Returns covariance matrix.
ROOT::Math::PxPyPzEVector getLorentzVector(ParticleFitObject *fitobject)
bool updateOrcaKinFitDaughters(BaseFitter &fitter, Particle *mother)
Update the daughters: momentum is sum of daughters TODO update covariance matrix.
void setConstraints()
Sets constraints, this is not connect to particles or a fitter at this stage.
bool m_addUnmeasuredPhoton
add one unmeasured photon to the fit (costs 3 constraints)
TMatrixFSym getFitObjectCovMat(ParticleFitObject *fitobject)
Returns covariance matrix.
CLHEP::HepSymMatrix getCLHEPMomentumErrorMatrix(Particle *particle)
Returns particle's 4x4 momentum-error matrix as a HepSymMatrix.
double m_invMass
Invariant mass for Mass constraint.
bool m_fixUnmeasuredPhotonToHER
fix the momentum of the unmeasured photon to HER
std::string m_orcaTracer
Tracer (None, Text or ROOT)
StoreObjPtr< ParticleList > m_plist
StoreObjPtr for the particle list.
void addParticleToOrcaKinFit(BaseFitter &fitter, Particle *particle, const int index)
Adds given particle to the OrcaKinFit.
void updateOrcaKinFitMother(BaseFitter &fitter, std::vector< Particle * > &particleChildren, Particle *mother)
Update the mother: momentum is sum of daughters TODO update covariance matrix.
std::string m_kinematicFitter
Kinematic Fitter name.
void resetFitter(BaseFitter &fitter)
Resets all objects associated with the OrcaKinFit fitter.
bool m_fixUnmeasuredPhotonToLER
fix the momentum of the unmeasured photon to LER
bool storeOrcaKinFitParticles(const std::string &prefix, BaseFitter &fitter, std::vector< Particle * > &particleChildren, Particle *mother)
store fit object information as ExtraInfo
bool doKinematicFit(Particle *p)
Main steering routine for any kinematic fitter.
bool m_updateMother
update mother kinematics
MomentumConstraint m_hardConstraintPx
hard beam constraint px
Class to store reconstructed particles.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
void copyDaughters(Particle *mother)
Function copies all (grand-)^n-daughter particles of the argument mother Particle.
Abstract base class for different kinds of events.