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>
32#include <analysis/ClusterUtility/ClusterUtils.h>
39using namespace Belle2::OrcaKinFit;
61 string(
"OPALFitterGSL"));
64 addParam(
"debugFitter",
m_debugFitter,
"Switch on/off internal debugging output if available.",
false);
70 addParam(
"liftPhotonTheta",
m_liftPhotonTheta,
"Lift theta constraint of 3CPhoton. Valid when add3CPhoton is true.",
false);
71 addParam(
"decayString",
m_decayString,
"Specifies which daughter particles are included in the kinematic fit.",
string(
""));
75 addParam(
"invMass",
m_invMass,
"Invariant mass in GeV. Mass constraint only.", 0.0);
85 B2INFO(
"ParticleKinematicFitter: Using specified decay string: " <<
m_decayString);
93 B2INFO(
"ParticleKinematicFitterModule::terminate");
98 B2DEBUG(17,
"ParticleKinematicFitterModule::event");
100 unsigned int n =
m_plist->getListSize();
102 for (
unsigned i = 0; i < n; i++) {
107 else B2ERROR(
"Daughters update works only when all daughters are selected. Daughters will not be updated");
112 if (!ok) particle->setPValue(-1.);
118 B2DEBUG(17,
"ParticleKinematicFitterModule::doKinematicFit");
127 B2FATAL(
"ParticleKinematicFitterModule: OrcaKinFit does not support yet selection of daughters via decay string!") ;
134 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
141 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
147 B2FATAL(
"ParticleKinematicFitter: " <<
m_kinematicFitter <<
" is an invalid kinematic fitter!");
150 if (!ok)
return false;
159 B2WARNING(
"ParticleKinematicFitterModule: Cannot fit with " << mother->
getNDaughters() <<
" daughters.");
164 std::vector<Particle*> particleChildren;
167 if (!validChildren) {
168 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
187 (
dynamic_cast<NewFitterGSL*
>(pfitter))->setDebug(debugfitter);
189 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
193 if (!pfitter)
return false;
203 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
219 double prob = fitter.fit();
220 double chi2 = fitter.getChi2();
221 int niter = fitter.getIterations();
222 int ndof = fitter.getDoF();
223 int errorcode = fitter.getError();
225 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
226 B2DEBUG(17,
"ParticleKinematicFitterModule: Fit result of OrcaKinFit using " <<
m_orcaFitterEngine);
227 B2DEBUG(17,
"ParticleKinematicFitterModule: prob " << prob);
228 B2DEBUG(17,
"ParticleKinematicFitterModule: chi2 " << chi2);
229 B2DEBUG(17,
"ParticleKinematicFitterModule: iterations " << niter);
230 B2DEBUG(17,
"ParticleKinematicFitterModule: ndf " << ndof);
231 B2DEBUG(17,
"ParticleKinematicFitterModule: errorcode " << errorcode);
232 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
250 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
251 for (
auto fo : *fitObjectContainer) {
253 const std::string name = fo->getName();
254 if (name.find(
"Unmeasured") != std::string::npos) {
257 mother->
addExtraInfo(
"OrcaKinFit" + name +
"Theta", tlv.Theta());
258 mother->
addExtraInfo(
"OrcaKinFit" + name +
"Phi", tlv.Phi());
259 mother->
addExtraInfo(
"OrcaKinFit" + name +
"E", tlv.E());
278 for (
unsigned ichild = 0; ichild < mother->
getNDaughters(); ichild++) {
281 if (child->getNDaughters() > 0) {
284 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
287 }
else if (child->getPValue() > 0) {
288 particleChildren.push_back(child);
290 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
291 child->getEnergy() <<
" GeV");
300 TMatrixFSym MomentumVertexErrorMatrix(7);
301 for (
unsigned ichild = 0; ichild < mother->
getNDaughters(); ichild++) {
304 if (child->getPValue() > 0) {
305 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
306 }
else if (child->getNDaughters() > 0) {
308 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
310 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
311 child->getEnergy() <<
" GeV");
321 B2DEBUG(17,
"ParticleKinematicFitterModule: adding a particle to the fitter!");
324 if (particle -> getPDGCode() !=
Const::photon.getPDGCode()) {
325 B2ERROR(
"In 3C Kinematic fit, the first daughter should be the Unmeasured Photon!");
328 const ECLCluster* cluster = particle->getECLCluster();
329 double startingE = cluster->getEnergy(particle->getECLClusterEHypothesisBit());
330 double startingPhi = cluster->getPhi();
331 double startingTheta = cluster->getTheta();
335 double startingeE =
sqrt(fabs(EPhiThetaCov[0][0]));
336 double startingePhi =
sqrt(fabs(EPhiThetaCov[1][1]));
337 double startingeTheta =
sqrt(fabs(EPhiThetaCov[2][2]));
339 B2DEBUG(17, startingPhi <<
" " << startingTheta <<
" " << startingePhi <<
" " << startingeTheta);
343 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, startingeE, startingeTheta, startingePhi, 0.);
344 pfitobject->
setParam(0, startingE,
false,
false);
346 pfitobject->
setParam(1, startingTheta,
false,
false);
348 pfitobject->
setParam(1, startingTheta,
true,
false);
349 pfitobject->
setParam(2, startingPhi,
true,
false);
351 std::string fitObjectName =
"Unmeasured3C";
352 pfitobject->
setName(fitObjectName.c_str());
359 fitter.addFitObject(fitobject);
371 pfitobject =
new PxPyPzMFitObject(clheplorentzvector, clhepmomentumerrormatrix);
372 std::string fitObjectName =
"particle_" + SSTR(index);
373 pfitobject->
setName(fitObjectName.c_str());
380 fitter.addFitObject(fitobject);
388 CLHEP::HepSymMatrix covMatrix(4);
389 TMatrixFSym errMatrix = particle->getMomentumErrorMatrix();
391 for (
int i = 0; i < 4; i++) {
392 for (
int j = 0; j < 4; j++) {
393 covMatrix[i][j] = errMatrix[i][j];
402 CLHEP::HepSymMatrix covMatrix(7);
403 TMatrixFSym errMatrix = particle->getMomentumVertexErrorMatrix();
405 for (
int i = 0; i < 7; i++) {
406 for (
int j = 0; j < 7; j++) {
407 covMatrix[i][j] = errMatrix[i][j];
416 CLHEP::HepLorentzVector mom(particle->getPx(), particle->getPy(), particle->getPz(), particle->get4Vector().E());
422 ROOT::Math::PxPyPzEVector mom(fitobject->
getPx(), fitobject->
getPy(), fitobject->
getPz(), fitobject->
getE());
429 TMatrixFSym errMatrix(4);
431 for (
int i = 0; i < 4; i++) {
432 for (
int j = i; j < 4; j++) {
433 errMatrix[i][j] = 0.0;
443 TMatrixFSym errMatrix(7);
445 for (
int i = 0; i < 7; i++) {
446 for (
int j = i; j < 7; j++) {
447 errMatrix[i][j] = 0.0;
461 return constraints4vector;
463 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
467 return ROOT::Math::PxPyPzEVector(0., 0., 0., 0.);
506 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
512 B2DEBUG(17,
"ParticleKinematicFitterModule: Resetting the fitter");
528 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
546 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
556 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaTracer <<
" is an invalid OrcaKinFit tracer!");
562 B2DEBUG(17,
"ParticleKinematicFitterModule::addUnmeasuredGammaToOrcaKinFit: adding an unmeasured photon to the fitter!");
565 double startingE = tlv.E();
566 double startingPhi = tlv.Phi();
567 double startingTheta = tlv.Theta();
568 bool paramFlag =
false;
573 std::string fitObjectName =
"UnmeasuredAlongBeam";
576 startingTheta = 41.5e-3;
580 startingTheta = TMath::Pi() - 41.5e-3;
584 fitObjectName =
"Unmeasured";
588 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, 0.0, 0.0, 0.0, 0.);
589 pfitobject->
setParam(0, startingE,
false,
false);
590 pfitobject->
setParam(1, startingTheta, paramFlag, paramFlag);
591 pfitobject->
setParam(2, startingPhi, paramFlag, paramFlag);
593 pfitobject->
setName(fitObjectName.c_str());
600 fitter.addFitObject(fitobject);
605 std::vector <Belle2::Particle*> bDau = mother->
getDaughters();
606 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
608 const unsigned nd = bDau.size();
610 std::vector<std::vector<unsigned>> pars;
611 std::vector<Particle*> allparticles;
612 for (
unsigned ichild = 0; ichild < nd; ichild++) {
614 std::vector<unsigned> pard;
615 if (daughter->getNDaughters() > 0) {
617 pars.push_back(pard);
618 allparticles.push_back(bDau[ichild]);
621 pars.push_back(pard);
622 allparticles.push_back(bDau[ichild]);
629 if (fitter.getError() == 0) {
630 for (
unsigned iDaug = 0; iDaug < allparticles.size(); iDaug++) {
631 ROOT::Math::PxPyPzEVector tlv ;
632 TMatrixFSym errMatrixU(7);
633 if (pars[iDaug].size() > 0) {
634 for (
unsigned int iChild : pars[iDaug]) {
638 TMatrixFSym errMatrixU_sub =
getCovMat7(fitobject);
640 errMatrixU = errMatrixU + errMatrixU_sub;
643 B2FATAL(
"ParticleKinematicFitterModule: no fitObject could be used to update the daughter!");
645 ROOT::Math::XYZVector pos = allparticles[iDaug]->getVertex();
646 TMatrixFSym errMatrix = allparticles[iDaug]->getMomentumVertexErrorMatrix();
647 TMatrixFSym errMatrixMom = allparticles[iDaug]->getMomentumErrorMatrix();
648 TMatrixFSym errMatrixVer = allparticles[iDaug]->getVertexErrorMatrix();
650 for (
int i = 0; i < 3; i++) {
651 for (
int j = i; j < 3; j++) {
652 errMatrixU[i + 4][j + 4] = errMatrixVer[i][j];
656 allparticles[iDaug]->set4Vector(tlv);
657 allparticles[iDaug]->setVertex(pos);
658 allparticles[iDaug]->setMomentumVertexErrorMatrix(errMatrixU);
664 B2ERROR(
"updateOrcaKinFitDaughters: Cannot update daughters, mismatch between number of daughters and number of fitobjects!");
670 std::vector<unsigned>& parm, std::vector<Particle*>& allparticles,
const Particle* daughter)
672 std::vector <Belle2::Particle*> dDau = daughter->getDaughters();
673 for (
unsigned ichild = 0; ichild < daughter->getNDaughters(); ichild++) {
674 const Particle* child = daughter->getDaughter(ichild);
675 std::vector<unsigned> pard;
676 if (child->getNDaughters() > 0) {
678 parm.insert(parm.end(), pard.begin(), pard.end());
679 pars.push_back(pard);
680 allparticles.push_back(dDau[ichild]);
684 pars.push_back(pard);
685 allparticles.push_back(dDau[ichild]);
695 ROOT::Math::XYZVector pos = mother->
getVertex();
700 ROOT::Math::PxPyPzEVector momnew(0., 0., 0., 0.);
702 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
703 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
717 std::vector<Particle*>& particleChildren,
Particle* mother)
719 bool updated =
false;
720 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
722 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
728 std::string extraVariableParticlePx =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Px";
729 std::string extraVariableParticlePy =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Py";
730 std::string extraVariableParticlePz =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_Pz";
731 std::string extraVariableParticleE =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_E";
732 std::string extraVariableParticlePxErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PxErr";
733 std::string extraVariableParticlePyErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PyErr";
734 std::string extraVariableParticlePzErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_PzErr";
735 std::string extraVariableParticleEErr =
"OrcaKinFit" + prefix +
"_" + SSTR(iChild) +
"_EErr";
737 mother->
addExtraInfo(extraVariableParticlePx, tlv.Px());
738 mother->
addExtraInfo(extraVariableParticlePy, tlv.Py());
739 mother->
addExtraInfo(extraVariableParticlePz, tlv.Pz());
755 if (pxpypzmfitobject) {
758 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
768 if (pxpypzmfitobject) {
770 TMatrixFSym errMatrix(3);
773 for (
int i = 0; i < 3; i++) {
774 for (
int j = 0; j < 3; j++) {
775 errMatrix[i][j] = pxpypzmfitobject->getCov(i, j);
781 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
787 TMatrixFSym fitCovMatrix(3);
791 auto* jetfitObject =
static_cast<JetFitObject*
>(fitobject);
797 const double energy = tlv.E();
798 const double theta = tlv.Theta();
799 const double phi = tlv.Phi();
801 const double st = sin(theta);
802 const double ct = cos(theta);
803 const double sp = sin(phi);
804 const double cp = cos(phi);
809 A(0, 1) = energy * cp * ct ;
810 A(0, 2) = -energy * sp * st ;
812 A(1, 1) = energy * sp * ct ;
813 A(1, 2) = energy * cp * st ;
815 A(2, 1) = -energy * st ;
821 TMatrixFSym D = fitCovMatrix.Similarity(A);
825 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
830 if (pxpypzmfitobject) {
847 A[3][0] = tlv.Px() / tlv.E();
848 A[3][1] = tlv.Py() / tlv.E();
849 A[3][2] = tlv.Pz() / tlv.E();
852 TMatrixFSym D = fitCovMatrix.Similarity(A);
856 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
Class to provide momentum-related information from ECLClusters.
const TMatrixDSym GetCovarianceMatrix3x3FromCluster(const ECLCluster *cluster)
Returns 3x3 covariance matrix (E, theta, phi)
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.
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.
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
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.
ParticleKinematicFitterModule()
Constructor.
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.
double getPValue() const
Returns chi^2 probability of fit if done or -1.
ROOT::Math::XYZVector getVertex() const
Returns vertex position (POCA for charged, IP for neutral FS particles)
unsigned getNDaughters(void) const
Returns number of daughter particles.
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
void setMomentumVertexErrorMatrix(const TMatrixFSym &errMatrix)
Sets 7x7 error matrix.
void setPValue(double pValue)
Sets chi^2 probability of fit.
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.
TMatrixFSym getMomentumVertexErrorMatrix() const
Returns 7x7 error matrix.
const Particle * getDaughter(unsigned i) const
Returns a pointer to the i-th daughter particle.
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.
double sqrt(double a)
sqrt for double
void copyDaughters(Particle *mother)
Function copies all (grand-)^n-daughter particles of the argument mother Particle.
Abstract base class for different kinds of events.