Belle II Software  release-08-01-10
EvtKnunu.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <generators/evtgen/EvtGenModelRegister.h>
10 
11 #include "EvtGenBase/EvtPatches.hh"
12 #include <stdlib.h>
13 #include <iostream>
14 #include <string>
15 #include <cmath>
16 #include "EvtGenBase/EvtParticle.hh"
17 #include "EvtGenBase/EvtPDL.hh"
18 #include "EvtGenBase/EvtGenKine.hh"
19 #include "EvtGenBase/EvtDiracSpinor.hh"
20 #include "EvtGenBase/EvtTensor4C.hh"
21 #include "EvtGenBase/EvtReport.hh"
22 #include "EvtGenBase/EvtVector4C.hh"
23 
24 
25 #include "generators/evtgen/models/EvtKnunu.h"
26 
27 using std::endl;
28 
29 namespace Belle2 {
37 
39 
40  std::string EvtKnunu::getName()
41  {
42  return "KNUNU";
43  }
44 
45  EvtDecayBase* EvtKnunu::clone()
46  {
47  return new EvtKnunu;
48  }
49 
50  void EvtKnunu::decay(EvtParticle* p)
51  {
52  static EvtId NUE = EvtPDL::getId("nu_e");
53  static EvtId NUM = EvtPDL::getId("nu_mu");
54  static EvtId NUT = EvtPDL::getId("nu_tau");
55  static EvtId NUEB = EvtPDL::getId("anti-nu_e");
56  static EvtId NUMB = EvtPDL::getId("anti-nu_mu");
57  static EvtId NUTB = EvtPDL::getId("anti-nu_tau");
58 
59  p->initializePhaseSpace(getNDaug(), getDaugs());
60 
61  double m_b = p->mass();
62 
63  EvtParticle* meson, * neutrino1, * neutrino2;
64  meson = p->getDaug(0);
65  neutrino1 = p->getDaug(1);
66  neutrino2 = p->getDaug(2);
67  EvtVector4R momnu1 = neutrino1->getP4();
68  EvtVector4R momnu2 = neutrino2->getP4();
69  EvtVector4R momk = meson->getP4();
70 
71  EvtVector4R q = momnu1 + momnu2;
72  double q2 = q.mass2();
73 
74  EvtVector4R p4b; p4b.set(m_b, 0., 0., 0.); // Do calcs in mother rest frame
75 
76  double m_k = meson->mass();
77  double mkhat = m_k / (m_b);
78  double shat = q2 / (m_b * m_b);
79 
80  EvtVector4R phat = (p4b + momk) / m_b;
81  EvtVector4R qhat = q / m_b;
82 
83  // calculate form factor from [arXiv:1409.4557v2]
84  // see eq 104, eq 105, eq 106, eq 107
85  double alpha0 = 0.432;
86  double alpha1 = -0.664;
87  double alpha2 = -1.2;
88  double mp = m_b + 0.046;
89  double tp = (m_b + m_k) * (m_b + m_k);
90  double tm = (m_b - m_k) * (m_b - m_k);
91  double t0 = tp * (1 - sqrt(1 - tm / tp));
92  double z = (sqrt(tp - q2) - sqrt(tp - t0)) / (sqrt(tp - q2) + sqrt(tp - t0));
93  double fp = (1 / (1 - q2 / (mp * mp))) * (alpha0 + alpha1 * z + alpha2 * z * z + (-alpha1 + 2 * alpha2) * z * z * z / 3);
94  double fm = -fp * (1 - mkhat * mkhat) / shat;
95 
96  // calculate quark decay amplitude from [arXiv:hep-ph/9910221v2]
97  // see eq 3.1, eq 3.2, eq 4.1, eq 4.2, and eq 4.3
98  // but in B->K nu nubar, fT and f0 terms are ignored
99 
100  EvtVector4C T1;
101 
102  EvtComplex aprime;
103  aprime = fp;
104  EvtComplex bprime;
105  bprime = fm;
106 
107  T1 = aprime * phat + bprime * qhat;
108 
109  EvtVector4C l;
110 
111  if (getDaug(1) == NUE || getDaug(1) == NUM || getDaug(1) == NUT) {
112  l = EvtLeptonVACurrent(neutrino1->spParentNeutrino(),
113  neutrino2->spParentNeutrino());
114  }
115  if (getDaug(1) == NUEB || getDaug(1) == NUMB || getDaug(1) == NUTB) {
116  l = EvtLeptonVACurrent(neutrino2->spParentNeutrino(),
117  neutrino1->spParentNeutrino());
118  }
119 
120  vertex(l * T1);
121 
122  }
123 
125  {
126  // check that there are 0 arguments
127  checkNArg(0);
128  checkNDaug(3);
129 
130  //We expect the parent to be a scalar
131  //and the daughters to be K neutrino netrino
132 
133  checkSpinParent(EvtSpinType::SCALAR);
134 
135  checkSpinDaughter(0, EvtSpinType::SCALAR);
136  checkSpinDaughter(1, EvtSpinType::NEUTRINO);
137  checkSpinDaughter(2, EvtSpinType::NEUTRINO);
138  }
139 
141  {
142  // Maximum probability was obtained by 10^6 MC samples. It was 71.177
143  // About 10% higher value is used.
144  setProbMax(80.0);
145  }
146 
148 }
149 
The evtgen model to produce B-> K nu nubar decay sample.
Definition: EvtKnunu.h:26
EvtKnunu()
Constructor.
Definition: EvtKnunu.h:33
void init()
The function for an initialization.
Definition: EvtKnunu.cc:124
virtual ~EvtKnunu()
Destructor.
Definition: EvtKnunu.cc:38
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
EvtDecayBase * clone()
The function which makes a copy of the model.
Definition: EvtKnunu.cc:45
void initProbMax()
The function to sets a maximum probability.
Definition: EvtKnunu.cc:140
std::string getName()
The function which returns the name of the model.
Definition: EvtKnunu.cc:40
void decay(EvtParticle *p)
The function to calculate a quark decay amplitude.
Definition: EvtKnunu.cc:50
B2_EVTGEN_REGISTER_MODEL(EvtB0toKsKK)
register the model in EvtGen
Abstract base class for different kinds of events.