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");
 
 
  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!");
 
  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) {
 
  454    if (particle->
getCharge() != 0 or !cluster) {
 
  455      B2FATAL(
"ParticleKinematicFitterModule:  Direction only and alternate mass options only implemented for neutral particles with ECL cluster");
 
  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();
 
  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);
 
  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);
 
  537  for (
int i = 0; i < 7; i++) {
 
  538    for (
int j = 0; j < 7; j++) {
 
  539      covMatrix[i][j] = errMatrix[i][j];
 
 
  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;
 
  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.
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...
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.
A kinematic fitter using the Newton-Raphson method to solve the equations.
Description of the fit algorithm and interface:
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 getPx() const
Returns x component of momentum.
const ECLCluster * getECLCluster() const
Returns the pointer to the ECLCluster object that was used to create this Particle (if ParticleType =...
double getPz() const
Returns z component of momentum.
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)
double getPy() const
Returns y component of momentum.
unsigned getNDaughters(void) const
Returns number of daughter particles.
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
double getPDGMass(void) const
Returns uncertainty on the invariant mass (requires valid momentum error matrix)
double getCharge(void) const
Returns particle charge.
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
TMatrixFSym getMomentumErrorMatrix() const
Returns the 4x4 momentum error matrix.
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.
ECLCluster::EHypothesisBit getECLClusterEHypothesisBit() const
Returns the ECLCluster EHypothesisBit for this 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.
void copyDaughters(Particle *mother)
Function copies all (grand-)^n-daughter particles of the argument mother Particle.
Abstract base class for different kinds of events.