Belle II Software development
EvtHNLSemiLeptonicVectorAmp.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/models/EvtHNLSemiLeptonicVectorAmp.h"
10
11#include "EvtGenBase/EvtAmp.hh"
12#include "EvtGenBase/EvtDiracSpinor.hh"
13#include "EvtGenBase/EvtGenKine.hh"
14#include "EvtGenBase/EvtId.hh"
15#include "EvtGenBase/EvtPDL.hh"
16#include "EvtGenBase/EvtParticle.hh"
17#include "EvtGenBase/EvtPatches.hh"
18#include "EvtGenBase/EvtReport.hh"
19#include "EvtGenBase/EvtSemiLeptonicFF.hh"
20#include "EvtGenBase/EvtTensor4C.hh"
21#include "EvtGenBase/EvtVector4C.hh"
22
23#include <iostream>
24#include <fstream>
25#include <random>
26#include <vector>
27#include <sstream>
28using std::endl;
29
30void EvtHNLSemiLeptonicVectorAmp::CalcAmp(EvtParticle* parent, EvtAmp& amp,
31 EvtSemiLeptonicFF* FormFactors)
32{
33 static EvtId EM = EvtPDL::getId("e-");
34 static EvtId MUM = EvtPDL::getId("mu-");
35 static EvtId TAUM = EvtPDL::getId("tau-");
36 static EvtId EP = EvtPDL::getId("e+");
37 static EvtId MUP = EvtPDL::getId("mu+");
38 static EvtId TAUP = EvtPDL::getId("tau+");
39
40 static EvtId D0 = EvtPDL::getId("D0");
41 static EvtId D0B = EvtPDL::getId("anti-D0");
42 static EvtId DP = EvtPDL::getId("D+");
43 static EvtId DM = EvtPDL::getId("D-");
44 static EvtId DSM = EvtPDL::getId("D_s-");
45 static EvtId DSP = EvtPDL::getId("D_s+");
46
47 //Add the lepton and neutrino 4 momenta to find q2
48
49 EvtVector4R q = parent->getDaug(1)->getP4() + parent->getDaug(2)->getP4();
50 double q2 = (q.mass2());
51
52 double a1f, a2f, vf, a0f, a3f;
53 double m_meson = parent->getDaug(0)->mass();
54
55 FormFactors->getvectorff(parent->getId(), parent->getDaug(0)->getId(),
56 q2, m_meson, &a1f, &a2f, &vf, &a0f);
57
58 double costhl_flag = 1.0;
59
60 if (parent->getId() == D0 || parent->getId() == D0B ||
61 parent->getId() == DP || parent->getId() == DM) {
62 costhl_flag = -1.0;
63 }
64 if (parent->getId() == DSP || parent->getId() == DSM) {
65 costhl_flag = -1.0;
66 }
67 vf = vf * costhl_flag;
68
69 EvtVector4R p4b;
70 p4b.set(parent->mass(), 0.0, 0.0, 0.0);
71
72 EvtVector4R p4meson = parent->getDaug(0)->getP4();
73
74 EvtVector4C l11, l12, l21, l22;
75
76 EvtId l_num = parent->getDaug(1)->getId();
77 double m_b = parent->mass();
78
79 a3f = ((m_b + m_meson) / (2.0 * m_meson)) * a1f -
80 ((m_b - m_meson) / (2.0 * m_meson)) * a2f;
81
82 EvtTensor4C tds;
83 if (l_num == EM || l_num == MUM || l_num == TAUM) {
84 tds = a1f * (m_b + m_meson) * EvtTensor4C::g();
85 tds.addDirProd((-a2f / (m_b + m_meson)) * p4b, p4b + p4meson);
86 tds += EvtComplex(0.0, vf / (m_b + m_meson)) *
87 dual(EvtGenFunctions::directProd(p4meson + p4b, p4b - p4meson));
88 tds.addDirProd((a0f - a3f) * 2.0 * (m_meson / q2) * p4b,
89 p4b - p4meson);
90
91 l11 = EvtLeptonVACurrent(parent->getDaug(1)->spParent(0),
92 parent->getDaug(2)->spParent(0));
93 l12 = EvtLeptonVACurrent(parent->getDaug(1)->spParent(0),
94 parent->getDaug(2)->spParent(1));
95 l21 = EvtLeptonVACurrent(parent->getDaug(1)->spParent(1),
96 parent->getDaug(2)->spParent(0));
97 l22 = EvtLeptonVACurrent(parent->getDaug(1)->spParent(1),
98 parent->getDaug(2)->spParent(1));
99 } else {
100 if (l_num == EP || l_num == MUP || l_num == TAUP) {
101 tds = a1f * (m_b + m_meson) * EvtTensor4C::g();
102 tds.addDirProd((-a2f / (m_b + m_meson)) * p4b, p4b + p4meson);
103 tds -= EvtComplex(0.0, vf / (m_b + m_meson)) *
104 dual(EvtGenFunctions::directProd(p4meson + p4b,
105 p4b - p4meson));
106 tds.addDirProd((a0f - a3f) * 2.0 * (m_meson / q2) * p4b,
107 p4b - p4meson);
108
109 l11 = EvtLeptonVACurrent(parent->getDaug(2)->spParent(0),
110 parent->getDaug(1)->spParent(0));
111 l12 = EvtLeptonVACurrent(parent->getDaug(2)->spParent(0),
112 parent->getDaug(1)->spParent(1));
113 l21 = EvtLeptonVACurrent(parent->getDaug(2)->spParent(1),
114 parent->getDaug(1)->spParent(0));
115 l22 = EvtLeptonVACurrent(parent->getDaug(2)->spParent(1),
116 parent->getDaug(1)->spParent(1));
117 } else {
118 EvtGenReport(EVTGEN_ERROR, "EvtGen")
119 << "Wrong lepton number" << endl;
120 }
121 }
122
123 EvtVector4C et0 = tds.cont1(parent->getDaug(0)->epsParent(0).conj());
124 EvtVector4C et1 = tds.cont1(parent->getDaug(0)->epsParent(1).conj());
125 EvtVector4C et2 = tds.cont1(parent->getDaug(0)->epsParent(2).conj());
126
127 amp.vertex(0, 0, 0, l11.cont(et0));
128 amp.vertex(0, 0, 1, l12.cont(et0));
129 amp.vertex(0, 1, 0, l21.cont(et0));
130 amp.vertex(0, 1, 1, l22.cont(et0));
131
132 amp.vertex(1, 0, 0, l11.cont(et1));
133 amp.vertex(1, 0, 1, l12.cont(et1));
134 amp.vertex(1, 1, 0, l21.cont(et1));
135 amp.vertex(1, 1, 1, l22.cont(et1));
136
137 amp.vertex(2, 0, 0, l11.cont(et2));
138 amp.vertex(2, 0, 1, l12.cont(et2));
139 amp.vertex(2, 1, 0, l21.cont(et2));
140 amp.vertex(2, 1, 1, l22.cont(et2));
141
142 return;
143}
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtSemiLeptonicFF *FormFactors) override
Daughters are initialized and have been added to the parent.