12#include <analysis/dataobjects/Particle.h>
13#include <mdst/dataobjects/KLMCluster.h>
14#include <mdst/dataobjects/ECLCluster.h>
15#include <analysis/ClusterUtility/ClusterUtils.h>
18#include <Math/Vector4D.h>
42 ROOT::Math::PxPyPzEVector& KMomentum,
43 const std::vector<Particle*> daughters,
49 ROOT::Math::PxPyPzEVector klDaughters;
50 ROOT::Math::PxPyPzEVector pDaughters;
52 for (
auto daughter : daughters) {
55 B2FATAL(
"More than one K_L is detected! This tool accepts only one K_L in the final state.");
59 klDaughters = klm_cluster->getMomentum();
66 B2ERROR(
"K_L candidate must have related KLM or ECL cluster!");
71 pDaughters += daughter->get4Vector();
74 m_j = daughter->getPDGMass();
75 idx = daughter->getArrayIndex() + idx * 100;
80 B2FATAL(
"This tool is meant to reconstruct decays with a K_L0 in the final state. There is no K_L0 in this decay!");
83 if (daughters.size() == 3) {
89 const double s_p = (klDaughters.Vect().Unit()).Dot(pDaughters.Vect());
90 const double m_sum = (m_b * m_b) - (m_j * m_j) - m_k2;
92 const double s_p2 = s_p * s_p;
93 const double m_sum2 = m_sum * m_sum;
94 const double s_pm = s_p * m_sum;
95 const double e_j2 = pDaughters.E() * pDaughters.E();
97 const double k_mag1 = (s_pm + std::sqrt(s_p2 * m_sum2 - 4 * (e_j2 - s_p2) * (e_j2 * m_k2 - m_sum2 / 4))) / (2 *
99 const double k_mag2 = (s_pm - std::sqrt(s_p2 * m_sum2 - 4 * (e_j2 - s_p2) * (e_j2 * m_k2 - m_sum2 / 4))) / (2 *
103 ROOT::Math::PxPyPzEVector missDaughters;
106 missDaughters = k_mag1 * klDaughters / klDaughters.P();
108 missDaughters = k_mag2 * klDaughters / klDaughters.P();
110 missDaughters.SetE(std::sqrt(m_k2 + missDaughters.P2()));
112 if (isnan(missDaughters.P()))
115 ROOT::Math::PxPyPzEVector mom = pDaughters + missDaughters;
116 mom.SetE(std::sqrt(m_b * m_b + mom.P2()));
120 KMomentum = missDaughters;
Class to provide momentum-related information from ECLClusters.
const ROOT::Math::PxPyPzEVector Get4MomentumFromCluster(const ECLCluster *cluster, ECLCluster::EHypothesisBit hypo)
Returns four momentum vector.
int getPDGCode() const
PDG code.
double getMass() const
Particle mass.
static const ParticleType Klong
K^0_L particle.
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
Abstract base class for different kinds of events.
Utility class to calculate the Klong kinematics.
static bool calculateBtoKlongX(ROOT::Math::PxPyPzEVector &BMomentum, ROOT::Math::PxPyPzEVector &KMomentum, const std::vector< Particle * > daughters, const double m_b, int &idx)
Calculate kinematics of two body B decays containing a K_L0.