Belle II Software  release-08-01-10
KlongCalculatorUtils Struct Reference

Utility class to calculate the Klong kinematics. More...

#include <KlongCalculatorUtils.h>

Static Public Member Functions

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. More...
 

Detailed Description

Utility class to calculate the Klong kinematics.

Definition at line 31 of file KlongCalculatorUtils.h.

Member Function Documentation

◆ calculateBtoKlongX()

static bool calculateBtoKlongX ( ROOT::Math::PxPyPzEVector &  BMomentum,
ROOT::Math::PxPyPzEVector &  KMomentum,
const std::vector< Particle * >  daughters,
const double  m_b,
int &  idx 
)
inlinestatic

Calculate kinematics of two body B decays containing a K_L0.

Parameters
BMomentum4-vector of B-meson that will be updated by this function
KMomentum4-vector of Klong that will be updated by this function
daughtersOriginal daughters of the B-meson
m_bPDG-mass of the B-meson
idxArray index of the other daughter. This will be assigned to the extraInfo, permID, of Klong.
Returns
true if the kinematics is physical

Definition at line 41 of file KlongCalculatorUtils.h.

46  {
47 
48  bool k_check = false;
49  ROOT::Math::PxPyPzEVector klDaughters; // 4-vector of K_L
50  ROOT::Math::PxPyPzEVector pDaughters; // 4-vector of other daughters
51  double m_j = 0;
52  for (auto daughter : daughters) {
53  if (daughter->getPDGCode() == Const::Klong.getPDGCode()) {
54  if (k_check)
55  B2FATAL("More than one K_L is detected! This tool accepts only one K_L in the final state.");
56 
57  const Belle2::KLMCluster* klm_cluster = daughter->getKLMCluster();
58  if (klm_cluster)
59  klDaughters = klm_cluster->getMomentum();
60  else {
61  const Belle2::ECLCluster* ecl_cluster = daughter->getECLCluster();
62  if (ecl_cluster) {
63  ClusterUtils clutls;
64  klDaughters = clutls.Get4MomentumFromCluster(ecl_cluster, ECLCluster::EHypothesisBit::c_neutralHadron);
65  } else {
66  B2ERROR("K_L candidate must have related KLM or ECL cluster!");
67  }
68  }
69  k_check = true;
70  } else {
71  pDaughters += daughter->get4Vector();
72 
73  // if there is only two daughter (e.g. K_L J/psi), use the PDG mass of the other daughter.
74  m_j = daughter->getPDGMass();
75  idx = daughter->getArrayIndex() + idx * 100;
76  }
77  }
78 
79  if (!k_check)
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!");
81 
82  // if there are more than two daughters, use the invariant mass of sum of the other daughters.
83  if (daughters.size() == 3) {
84  m_j = pDaughters.M();
85  }
86 
87  const double m_k2 = Const::Klong.getMass() * Const::Klong.getMass();
88 
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;
91 
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();
96 
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 *
98  (e_j2 - s_p2));
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 *
100  (e_j2 - s_p2));
101 
102 
103  ROOT::Math::PxPyPzEVector missDaughters;
104 
105  if (k_mag1 > 0)
106  missDaughters = k_mag1 * klDaughters / klDaughters.P();
107  else
108  missDaughters = k_mag2 * klDaughters / klDaughters.P();
109 
110  missDaughters.SetE(std::sqrt(m_k2 + missDaughters.P2()));
111 
112  if (isnan(missDaughters.P()))
113  return false;
114 
115  ROOT::Math::PxPyPzEVector mom = pDaughters + missDaughters;
116  mom.SetE(std::sqrt(m_b * m_b + mom.P2()));
117  if (isnan(mom.P()))
118  return false;
119 
120  KMomentum = missDaughters;
121  BMomentum = mom;
122 
123  return true;
124  };
int getPDGCode() const
PDG code.
Definition: Const.h:464
double getMass() const
Particle mass.
Definition: UnitConst.cc:356
static const ParticleType Klong
K^0_L particle.
Definition: Const.h:669
ECL cluster data.
Definition: ECLCluster.h:27
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
KLM cluster data.
Definition: KLMCluster.h:28
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28

The documentation for this struct was generated from the following file: