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>
22#include <TDatabasePDG.h>
25#include <framework/gearbox/Const.h>
26#include <framework/logging/Logger.h>
29#include <analysis/dataobjects/Particle.h>
32#include <analysis/utility/PCmsLabTransform.h>
33#include <analysis/utility/ParticleCopy.h>
34#include <analysis/ClusterUtility/ClusterUtils.h>
41using namespace Belle2::OrcaKinFit;
63 string(
"OPALFitterGSL"));
66 addParam(
"debugFitter",
m_debugFitter,
"Switch on/off internal debugging output if available.",
false);
72 addParam(
"liftPhotonTheta",
m_liftPhotonTheta,
"Lift theta constraint of 3CPhoton. Valid when add3CPhoton is true.",
false);
73 addParam(
"decayString",
m_decayString,
"Specifies which daughter particles are included in the kinematic fit.",
string(
""));
77 addParam(
"invMass",
m_invMass,
"Invariant mass in GeV. Mass constraint only.", 0.0);
78 addParam(
"variablePrefix",
m_prefix,
"Prefix attached to extra info variables.",
string(
""));
80 "DecayString specifying the particles to use only direction information in the fit", std::string(
""));
82 "DecayString specifying the particles where an alternate mass hypothesis is used", std::string(
""));
84 "DecayString specifying the charged particle used to tag whether n or nbar. If tag particle has negative charge, PDG sign of n/nbar is flipped from default given in alternateMassHypos",
87 "integer list of pdg values for particles where different mass hypothesis is used in the fit");
97 B2INFO(
"ParticleKinematicFitter: Using specified decay string: " <<
m_decayString);
107 B2FATAL(
"decayStringForAlternateMassParticles specified but alternateMassHypos not provided.");
109 B2FATAL(
"alternateMassHypos specified but decayStringForAlternateMassParticles not provided.");
121 B2INFO(
"ParticleKinematicFitterModule::terminate");
126 B2DEBUG(17,
"ParticleKinematicFitterModule::event");
128 unsigned int n =
m_plist->getListSize();
130 for (
unsigned i = 0; i < n; i++) {
135 else B2ERROR(
"Daughters update works only when all daughters are selected. Daughters will not be updated");
140 if (!ok) particle->setPValue(-1.);
146 B2DEBUG(17,
"ParticleKinematicFitterModule::doKinematicFit");
155 B2FATAL(
"ParticleKinematicFitterModule: OrcaKinFit does not support yet selection of daughters via decay string!") ;
162 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
169 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
175 B2FATAL(
"ParticleKinematicFitter: " <<
m_kinematicFitter <<
" is an invalid kinematic fitter!");
178 if (!ok)
return false;
187 B2WARNING(
"ParticleKinematicFitterModule: Cannot fit with " << mother->
getNDaughters() <<
" daughters.");
192 std::vector<int> directionOnlyParticlesIdentifiers;
195 for (
unsigned int i = 0; i < selparticles.size(); i++) {
196 directionOnlyParticlesIdentifiers.push_back(selparticles[i]->getMdstSource());
201 std::vector<int> alternateMassHypoIdentifiers;
204 for (
unsigned int i = 0; i < selparticles.size(); i++) {
205 alternateMassHypoIdentifiers.push_back(selparticles[i]->getMdstSource());
208 B2FATAL(
"alternateMassHypoIdentifiers size must match listAlternateMassHypo");
215 bool flipNeutronPDGsign = 0;
218 if (selparticles.size() != 1) {
219 B2FATAL(
"Select only one particle to tag neutron vs. antineutron");
221 if (selparticles[0]->getCharge() < 0) flipNeutronPDGsign = 1;
226 std::vector<Particle*> particleChildren;
229 if (!validChildren) {
230 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
249 (
dynamic_cast<NewFitterGSL*
>(pfitter))->setDebug(debugfitter);
251 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaFitterEngine <<
" is an invalid OrcaKinFit fitter engine!");
255 if (!pfitter)
return false;
266 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
268 bool useDirectionOnly =
false;
269 if (directionOnlyParticlesIdentifiers.size() > 0) {
270 if (std::find(directionOnlyParticlesIdentifiers.begin(), directionOnlyParticlesIdentifiers.end(),
271 particleChildren[iChild]->getMdstSource()) != directionOnlyParticlesIdentifiers.end()) useDirectionOnly =
true;
275 if (alternateMassHypoIdentifiers.size() > 0) {
276 for (
unsigned int i = 0; i < alternateMassHypoIdentifiers.size(); i++) {
277 if (alternateMassHypoIdentifiers[i] == particleChildren[iChild]->getMdstSource()) {
284 if (useDirectionOnly ==
false)
285 B2WARNING(
"Neutron mass hypothesis assigned to fit particle but directionOnly flag not specified for same particle. Setting candidate to useDirectionOnly.");
286 useDirectionOnly =
true;
287 if (flipNeutronPDGsign) massHypo = -massHypo;
305 double prob = fitter.fit();
306 double chi2 = fitter.getChi2();
307 int niter = fitter.getIterations();
308 int ndof = fitter.getDoF();
309 int errorcode = fitter.getError();
311 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
312 B2DEBUG(17,
"ParticleKinematicFitterModule: Fit result of OrcaKinFit using " <<
m_orcaFitterEngine);
313 B2DEBUG(17,
"ParticleKinematicFitterModule: prob " << prob);
314 B2DEBUG(17,
"ParticleKinematicFitterModule: chi2 " << chi2);
315 B2DEBUG(17,
"ParticleKinematicFitterModule: iterations " << niter);
316 B2DEBUG(17,
"ParticleKinematicFitterModule: ndf " << ndof);
317 B2DEBUG(17,
"ParticleKinematicFitterModule: errorcode " << errorcode);
318 B2DEBUG(17,
"ParticleKinematicFitterModule: -------------------------------------------");
336 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
337 for (
auto fo : *fitObjectContainer) {
339 const std::string name = fo->getName();
340 if (name.find(
"Unmeasured") != std::string::npos) {
364 for (
unsigned ichild = 0; ichild < mother->
getNDaughters(); ichild++) {
367 if (child->getNDaughters() > 0) {
370 B2WARNING(
"ParticleKinematicFitterModule: Cannot find valid children for the fit.");
373 }
else if (child->getPValue() > 0) {
374 particleChildren.push_back(child);
376 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
377 child->getEnergy() <<
" GeV");
386 TMatrixFSym MomentumVertexErrorMatrix(7);
387 for (
unsigned ichild = 0; ichild < mother->
getNDaughters(); ichild++) {
390 if (child->getPValue() > 0) {
391 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
392 }
else if (child->getNDaughters() > 0) {
394 MomentumVertexErrorMatrix += child->getMomentumVertexErrorMatrix();
396 B2ERROR(
"Daughter with PDG code " << child->getPDGCode() <<
" does not have a valid p-value: p=" << child->getPValue() <<
", E=" <<
397 child->getEnergy() <<
" GeV");
406 bool useOnlyDirection,
int massHypoPDG)
408 B2DEBUG(17,
"ParticleKinematicFitterModule: adding a particle to the fitter!");
411 if (particle -> getPDGCode() !=
Const::photon.getPDGCode()) {
412 B2ERROR(
"In 3C Kinematic fit, the first daughter should be the Unmeasured Photon!");
415 const ECLCluster* cluster = particle->getECLCluster();
416 double startingE = cluster->getEnergy(particle->getECLClusterEHypothesisBit());
417 double startingPhi = cluster->getPhi();
418 double startingTheta = cluster->getTheta();
422 double startingEError =
sqrt(fabs(EPhiThetaCov[0][0]));
423 double startingPhiError =
sqrt(fabs(EPhiThetaCov[1][1]));
424 double startingThetaError =
sqrt(fabs(EPhiThetaCov[2][2]));
426 B2DEBUG(17, startingPhi <<
" " << startingTheta <<
" " << startingPhiError <<
" " << startingThetaError);
430 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, startingEError, startingThetaError, startingPhiError, 0.);
431 pfitobject->
setParam(0, startingE,
false,
false);
433 pfitobject->
setParam(1, startingTheta,
false,
false);
435 pfitobject->
setParam(1, startingTheta,
true,
false);
436 pfitobject->
setParam(2, startingPhi,
true,
false);
438 std::string fitObjectName =
"Unmeasured3C";
439 pfitobject->
setName(fitObjectName.c_str());
446 fitter.addFitObject(fitobject);
448 }
else if (useOnlyDirection || massHypoPDG) {
452 const ECLCluster* cluster = particle->getECLCluster();
454 if (particle->getCharge() != 0 or !cluster) {
455 B2FATAL(
"ParticleKinematicFitterModule: Direction only and alternate mass options only implemented for neutral particles with ECL cluster");
458 double mass = particle->getPDGMass();
459 if (massHypoPDG != 0) {
460 if (TDatabasePDG::Instance()->GetParticle(massHypoPDG) ==
nullptr) {
461 B2FATAL(
"ParticleKinematicFitterModule: " << massHypoPDG <<
" is an unknown PDG code!");
463 mass = TDatabasePDG::Instance()->GetParticle(massHypoPDG)->Mass();
465 double clusterE = cluster->getEnergy(particle->getECLClusterEHypothesisBit());
466 double startingE =
sqrt(clusterE * clusterE + mass * mass);
467 double startingPhi = cluster->getPhi();
468 double startingTheta = cluster->getTheta();
472 double startingEError =
sqrt(fabs(EPhiThetaCov[0][0]));
473 double startingPhiError =
sqrt(fabs(EPhiThetaCov[1][1]));
474 double startingThetaError =
sqrt(fabs(EPhiThetaCov[2][2]));
477 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, startingEError, startingThetaError, startingPhiError, mass);
478 pfitobject->
setParam(0, startingE,
true,
false);
479 if (useOnlyDirection) pfitobject->
setParam(0, startingE,
false,
false);
480 pfitobject->
setParam(1, startingTheta,
true,
false);
481 pfitobject->
setParam(2, startingPhi,
true,
false);
483 std::string fitObjectName =
"particle_" + SSTR(index);
484 pfitobject->
setName(fitObjectName.c_str());
491 fitter.addFitObject(fitobject);
503 pfitobject =
new PxPyPzMFitObject(clheplorentzvector, clhepmomentumerrormatrix);
504 std::string fitObjectName =
"particle_" + SSTR(index);
505 pfitobject->
setName(fitObjectName.c_str());
512 fitter.addFitObject(fitobject);
520 CLHEP::HepSymMatrix covMatrix(4);
521 TMatrixFSym errMatrix = particle->getMomentumErrorMatrix();
523 for (
int i = 0; i < 4; i++) {
524 for (
int j = 0; j < 4; j++) {
525 covMatrix[i][j] = errMatrix[i][j];
534 CLHEP::HepSymMatrix covMatrix(7);
535 TMatrixFSym errMatrix = particle->getMomentumVertexErrorMatrix();
537 for (
int i = 0; i < 7; i++) {
538 for (
int j = 0; j < 7; j++) {
539 covMatrix[i][j] = errMatrix[i][j];
548 CLHEP::HepLorentzVector mom(particle->getPx(), particle->getPy(), particle->getPz(), particle->get4Vector().E());
554 ROOT::Math::PxPyPzEVector mom(fitobject->
getPx(), fitobject->
getPy(), fitobject->
getPz(), fitobject->
getE());
561 TMatrixFSym errMatrix(4);
563 for (
int i = 0; i < 4; i++) {
564 for (
int j = i; j < 4; j++) {
565 errMatrix[i][j] = 0.0;
575 TMatrixFSym errMatrix(7);
577 for (
int i = 0; i < 7; i++) {
578 for (
int j = i; j < 7; j++) {
579 errMatrix[i][j] = 0.0;
593 return constraints4vector;
595 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
599 return ROOT::Math::PxPyPzEVector(0., 0., 0., 0.);
638 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
644 B2DEBUG(17,
"ParticleKinematicFitterModule: Resetting the fitter");
660 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
678 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaConstraint <<
" is an invalid OrcaKinFit constraint!");
688 B2FATAL(
"ParticleKinematicFitterModule: " <<
m_orcaTracer <<
" is an invalid OrcaKinFit tracer!");
694 B2DEBUG(17,
"ParticleKinematicFitterModule::addUnmeasuredGammaToOrcaKinFit: adding an unmeasured photon to the fitter!");
697 double startingE = tlv.E();
698 double startingPhi = tlv.Phi();
699 double startingTheta = tlv.Theta();
700 bool paramFlag =
false;
705 std::string fitObjectName =
"UnmeasuredAlongBeam";
708 startingTheta = 41.5e-3;
712 startingTheta = TMath::Pi() - 41.5e-3;
716 fitObjectName =
"Unmeasured";
720 pfitobject =
new JetFitObject(startingE, startingTheta, startingPhi, 0.0, 0.0, 0.0, 0.);
721 pfitobject->
setParam(0, startingE,
false,
false);
722 pfitobject->
setParam(1, startingTheta, paramFlag, paramFlag);
723 pfitobject->
setParam(2, startingPhi, paramFlag, paramFlag);
725 pfitobject->
setName(fitObjectName.c_str());
732 fitter.addFitObject(fitobject);
737 std::vector <Belle2::Particle*> bDau = mother->
getDaughters();
738 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
740 const unsigned nd = bDau.size();
742 std::vector<std::vector<unsigned>> pars;
743 std::vector<Particle*> allparticles;
744 for (
unsigned ichild = 0; ichild < nd; ichild++) {
746 std::vector<unsigned> pard;
747 if (daughter->getNDaughters() > 0) {
749 pars.push_back(pard);
750 allparticles.push_back(bDau[ichild]);
753 pars.push_back(pard);
754 allparticles.push_back(bDau[ichild]);
761 if (fitter.getError() == 0) {
762 for (
unsigned iDaug = 0; iDaug < allparticles.size(); iDaug++) {
763 ROOT::Math::PxPyPzEVector tlv ;
764 TMatrixFSym errMatrixU(7);
765 if (pars[iDaug].size() > 0) {
766 for (
unsigned int iChild : pars[iDaug]) {
770 TMatrixFSym errMatrixU_sub =
getCovMat7(fitobject);
772 errMatrixU = errMatrixU + errMatrixU_sub;
775 B2FATAL(
"ParticleKinematicFitterModule: no fitObject could be used to update the daughter!");
777 ROOT::Math::XYZVector pos = allparticles[iDaug]->getVertex();
778 TMatrixFSym errMatrix = allparticles[iDaug]->getMomentumVertexErrorMatrix();
779 TMatrixFSym errMatrixMom = allparticles[iDaug]->getMomentumErrorMatrix();
780 TMatrixFSym errMatrixVer = allparticles[iDaug]->getVertexErrorMatrix();
782 for (
int i = 0; i < 3; i++) {
783 for (
int j = i; j < 3; j++) {
784 errMatrixU[i + 4][j + 4] = errMatrixVer[i][j];
788 allparticles[iDaug]->set4Vector(tlv);
789 allparticles[iDaug]->setVertex(pos);
790 allparticles[iDaug]->setMomentumVertexErrorMatrix(errMatrixU);
796 B2ERROR(
"updateOrcaKinFitDaughters: Cannot update daughters, mismatch between number of daughters and number of fitobjects!");
802 std::vector<unsigned>& parm, std::vector<Particle*>& allparticles,
const Particle* daughter)
804 std::vector <Belle2::Particle*> dDau = daughter->getDaughters();
805 for (
unsigned ichild = 0; ichild < daughter->getNDaughters(); ichild++) {
806 const Particle* child = daughter->getDaughter(ichild);
807 std::vector<unsigned> pard;
808 if (child->getNDaughters() > 0) {
810 parm.insert(parm.end(), pard.begin(), pard.end());
811 pars.push_back(pard);
812 allparticles.push_back(dDau[ichild]);
816 pars.push_back(pard);
817 allparticles.push_back(dDau[ichild]);
827 ROOT::Math::XYZVector pos = mother->
getVertex();
832 ROOT::Math::PxPyPzEVector momnew(0., 0., 0., 0.);
834 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
835 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
849 std::vector<Particle*>& particleChildren,
Particle* mother)
851 bool updated =
false;
852 std::vector <BaseFitObject*>* fitObjectContainer = fitter.getFitObjects();
854 for (
unsigned iChild = 0; iChild < particleChildren.size(); iChild++) {
860 std::string extraVariableParticlePx =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_Px";
861 std::string extraVariableParticlePy =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_Py";
862 std::string extraVariableParticlePz =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_Pz";
863 std::string extraVariableParticleE =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_E";
864 std::string extraVariableParticlePxErr =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_PxErr";
865 std::string extraVariableParticlePyErr =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_PyErr";
866 std::string extraVariableParticlePzErr =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_PzErr";
867 std::string extraVariableParticleEErr =
m_prefix +
"OrcaKinFit" + fitSuffix +
"_" + SSTR(iChild) +
"_EErr";
869 mother->
addExtraInfo(extraVariableParticlePx, tlv.Px());
870 mother->
addExtraInfo(extraVariableParticlePy, tlv.Py());
871 mother->
addExtraInfo(extraVariableParticlePz, tlv.Pz());
887 if (pxpypzmfitobject) {
890 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
900 if (pxpypzmfitobject) {
902 TMatrixFSym errMatrix(3);
905 for (
int i = 0; i < 3; i++) {
906 for (
int j = 0; j < 3; j++) {
907 errMatrix[i][j] = pxpypzmfitobject->getCov(i, j);
913 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
919 TMatrixFSym fitCovMatrix(3);
923 auto* jetfitObject =
static_cast<JetFitObject*
>(fitobject);
929 const double energy = tlv.E();
930 const double theta = tlv.Theta();
931 const double phi = tlv.Phi();
933 const double st = sin(theta);
934 const double ct = cos(theta);
935 const double sp = sin(phi);
936 const double cp = cos(phi);
941 A(0, 1) = energy * cp * ct ;
942 A(0, 2) = -energy * sp * st ;
944 A(1, 1) = energy * sp * ct ;
945 A(1, 2) = energy * cp * st ;
947 A(2, 1) = -energy * st ;
953 TMatrixFSym D = fitCovMatrix.Similarity(A);
957 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
962 if (pxpypzmfitobject) {
979 A[3][0] = tlv.Px() / tlv.E();
980 A[3][1] = tlv.Py() / tlv.E();
981 A[3][2] = tlv.Pz() / tlv.E();
984 TMatrixFSym D = fitCovMatrix.Similarity(A);
988 B2FATAL(
"ParticleKinematicFitterModule: not implemented yet");
Class to provide momentum-related information from ECLClusters.
const TMatrixDSym GetCovarianceMatrix3x3FromCluster(const ECLCluster *cluster, int particleHypo=Const::photon.getPDGCode())
Returns 3x3 covariance matrix (E, theta, phi)
static const ParticleType neutron
neutron particle
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.
std::vector< const Particle * > getSelectionParticles(const Particle *particle)
Get a vector of pointers with selected daughters in the decay tree.
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))
std::string m_decayStringForNeutronVsAntiNeutron
n or nbar particle tag selection
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
std::string m_prefix
prefix attached to extrainfo names
virtual void event() override
Event processor.
DecayDescriptor m_decaydescriptorForDirectionOnlyParticles
Decay descriptor of direction only particles selection.
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
void addParticleToOrcaKinFit(BaseFitter &fitter, Particle *particle, const int index, bool useOnlyDirection, int massHypoPDG)
Adds given particle to the OrcaKinFit.
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.
std::string m_decayStringForAlternateMassParticles
alternate mass particles selection
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.
std::vector< int > m_listAlternateMassHypo
index of particles where only direction is used
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.
DecayDescriptor m_decaydescriptorForAlternateMassParticles
Decay descriptor of alternate particles selection.
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
std::string m_decayStringForDirectionOnlyParticles
direction only particles selection
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.
bool storeOrcaKinFitParticles(const std::string &fitSuffix, BaseFitter &fitter, std::vector< Particle * > &particleChildren, Particle *mother)
store fit object information as ExtraInfo
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
DecayDescriptor m_decaydescriptorForNeutronVsAntiNeutron
Decay descriptor of n or nbar particle tag selection.
std::string m_orcaTracer
Tracer (None, Text or ROOT)
StoreObjPtr< ParticleList > m_plist
StoreObjPtr for the particle list.
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 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.