EvtGen 2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Loading...
Searching...
No Matches
EvtSemiLeptonicTensorAmp.cpp
Go to the documentation of this file.
1
2/***********************************************************************
3* Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4* *
5* This file is part of EvtGen. *
6* *
7* EvtGen is free software: you can redistribute it and/or modify *
8* it under the terms of the GNU General Public License as published by *
9* the Free Software Foundation, either version 3 of the License, or *
10* (at your option) any later version. *
11* *
12* EvtGen is distributed in the hope that it will be useful, *
13* but WITHOUT ANY WARRANTY; without even the implied warranty of *
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15* GNU General Public License for more details. *
16* *
17* You should have received a copy of the GNU General Public License *
18* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19***********************************************************************/
20
22
23#include "EvtGenBase/EvtAmp.hh"
26#include "EvtGenBase/EvtId.hh"
27#include "EvtGenBase/EvtPDL.hh"
33
35 EvtSemiLeptonicFF* FormFactors )
36{
37 static const EvtId EM = EvtPDL::getId( "e-" );
38 static const EvtId MUM = EvtPDL::getId( "mu-" );
39 static const EvtId TAUM = EvtPDL::getId( "tau-" );
40 static const EvtId EP = EvtPDL::getId( "e+" );
41 static const EvtId MUP = EvtPDL::getId( "mu+" );
42 static const EvtId TAUP = EvtPDL::getId( "tau+" );
43
44 static const EvtId D0 = EvtPDL::getId( "D0" );
45 static const EvtId D0B = EvtPDL::getId( "anti-D0" );
46 static const EvtId DP = EvtPDL::getId( "D+" );
47 static const EvtId DM = EvtPDL::getId( "D-" );
48 static const EvtId DSM = EvtPDL::getId( "D_s-" );
49 static const EvtId DSP = EvtPDL::getId( "D_s+" );
50
51 //Add the lepton and neutrino 4 momenta to find q2
52
53 EvtVector4R q = parent->getDaug( 1 )->getP4() + parent->getDaug( 2 )->getP4();
54 double q2 = ( q.mass2() );
55
56 double hf, kf, bpf, bmf;
57
58 FormFactors->gettensorff( parent->getId(), parent->getDaug( 0 )->getId(),
59 q2, parent->getDaug( 0 )->mass(), &hf, &kf, &bpf,
60 &bmf );
61
62 double costhl_flag = 1.0;
63
64 if ( parent->getId() == D0 || parent->getId() == D0B ||
65 parent->getId() == DP || parent->getId() == DM ) {
66 costhl_flag = -1.0;
67 }
68 if ( parent->getId() == DSP || parent->getId() == DSM ) {
69 costhl_flag = -1.0;
70 }
71 hf = hf * costhl_flag;
72
73 EvtVector4R p4b;
74 p4b.set( parent->mass(), 0.0, 0.0, 0.0 );
75
76 EvtVector4R p4meson = parent->getDaug( 0 )->getP4();
77
78 EvtVector4C l1, l2;
79
80 EvtId l_num = parent->getDaug( 1 )->getId();
81
82 EvtVector4C ep_meson_b[5];
83
84 ep_meson_b[0] =
85 ( ( parent->getDaug( 0 )->epsTensorParent( 0 ) ).cont2( p4b ) ).conj();
86 ep_meson_b[1] =
87 ( ( parent->getDaug( 0 )->epsTensorParent( 1 ) ).cont2( p4b ) ).conj();
88 ep_meson_b[2] =
89 ( ( parent->getDaug( 0 )->epsTensorParent( 2 ) ).cont2( p4b ) ).conj();
90 ep_meson_b[3] =
91 ( ( parent->getDaug( 0 )->epsTensorParent( 3 ) ).cont2( p4b ) ).conj();
92 ep_meson_b[4] =
93 ( ( parent->getDaug( 0 )->epsTensorParent( 4 ) ).cont2( p4b ) ).conj();
94
95 EvtVector4R pp, pm;
96
97 pp = p4b + p4meson;
98 pm = p4b - p4meson;
99
100 //lange - October 31,2002 - try to lessen the mass dependence of probmax
101 double q2max = p4b.mass2() + p4meson.mass2() -
102 2.0 * p4b.mass() * p4meson.mass();
103 double q2maxin = 1.0 / q2max;
104
105 EvtComplex ep_meson_bb[5];
106
107 ep_meson_bb[0] = ep_meson_b[0] * ( p4b );
108 ep_meson_bb[1] = ep_meson_b[1] * ( p4b );
109 ep_meson_bb[2] = ep_meson_b[2] * ( p4b );
110 ep_meson_bb[3] = ep_meson_b[3] * ( p4b );
111 ep_meson_bb[4] = ep_meson_b[4] * ( p4b );
112
113 EvtVector4C tds0, tds1, tds2, tds3, tds4;
114
115 EvtTensor4C tds;
116 if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
117 EvtTensor4C tdual = EvtComplex( 0.0, hf ) *
119 tds0 = tdual.cont2( ep_meson_b[0] ) - kf * ep_meson_b[0] -
120 bpf * ep_meson_bb[0] * pp - bmf * ep_meson_bb[0] * pm;
121 tds0 *= q2maxin;
122
123 tds1 = tdual.cont2( ep_meson_b[1] ) - kf * ep_meson_b[1] -
124 bpf * ep_meson_bb[1] * pp - bmf * ep_meson_bb[1] * pm;
125 tds1 *= q2maxin;
126
127 tds2 = tdual.cont2( ep_meson_b[2] ) - kf * ep_meson_b[2] -
128 bpf * ep_meson_bb[2] * pp - bmf * ep_meson_bb[2] * pm;
129 tds2 *= q2maxin;
130
131 tds3 = tdual.cont2( ep_meson_b[3] ) - kf * ep_meson_b[3] -
132 bpf * ep_meson_bb[3] * pp - bmf * ep_meson_bb[3] * pm;
133 tds3 *= q2maxin;
134
135 tds4 = tdual.cont2( ep_meson_b[4] ) - kf * ep_meson_b[4] -
136 bpf * ep_meson_bb[4] * pp - bmf * ep_meson_bb[4] * pm;
137 tds4 *= q2maxin;
138
139 l1 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 0 ),
140 parent->getDaug( 2 )->spParentNeutrino() );
141 l2 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 1 ),
142 parent->getDaug( 2 )->spParentNeutrino() );
143 } else {
144 if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
145 EvtTensor4C tdual = EvtComplex( 0.0, -hf ) *
147 tds0 = tdual.cont2( ep_meson_b[0] ) - kf * ep_meson_b[0] -
148 bpf * ep_meson_bb[0] * pp - bmf * ep_meson_bb[0] * pm;
149 tds0 *= q2maxin;
150
151 tds1 = tdual.cont2( ep_meson_b[1] ) - kf * ep_meson_b[1] -
152 bpf * ep_meson_bb[1] * pp - bmf * ep_meson_bb[1] * pm;
153 tds1 *= q2maxin;
154
155 tds2 = tdual.cont2( ep_meson_b[2] ) - kf * ep_meson_b[2] -
156 bpf * ep_meson_bb[2] * pp - bmf * ep_meson_bb[2] * pm;
157 tds2 *= q2maxin;
158
159 tds3 = tdual.cont2( ep_meson_b[3] ) - kf * ep_meson_b[3] -
160 bpf * ep_meson_bb[3] * pp - bmf * ep_meson_bb[3] * pm;
161 tds3 *= q2maxin;
162
163 tds4 = tdual.cont2( ep_meson_b[4] ) - kf * ep_meson_b[4] -
164 bpf * ep_meson_bb[4] * pp - bmf * ep_meson_bb[4] * pm;
165 tds4 *= q2maxin;
166
167 l1 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
168 parent->getDaug( 1 )->spParent( 0 ) );
169 l2 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
170 parent->getDaug( 1 )->spParent( 1 ) );
171 } else {
172 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
173 << "dfnb89agngri wrong lepton number\n";
174 }
175 }
176
177 amp.vertex( 0, 0, l1 * tds0 );
178 amp.vertex( 0, 1, l2 * tds0 );
179
180 amp.vertex( 1, 0, l1 * tds1 );
181 amp.vertex( 1, 1, l2 * tds1 );
182
183 amp.vertex( 2, 0, l1 * tds2 );
184 amp.vertex( 2, 1, l2 * tds2 );
185
186 amp.vertex( 3, 0, l1 * tds3 );
187 amp.vertex( 3, 1, l2 * tds3 );
188
189 amp.vertex( 4, 0, l1 * tds4 );
190 amp.vertex( 4, 1, l2 * tds4 );
191
192 return;
193}
EvtVector4C EvtLeptonVACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_ERROR
Definition EvtReport.hh:49
EvtTensor4C dual(const EvtTensor4C &t2)
void vertex(const EvtComplex &amp)
Definition EvtAmp.cpp:453
Definition EvtId.hh:27
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
EvtId getId() const
virtual EvtDiracSpinor spParentNeutrino() const
virtual EvtDiracSpinor spParent(int) const
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
double mass() const
virtual void gettensorff(EvtId parent, EvtId daught, double t, double mass, double *a1f, double *a2f, double *vf, double *a0f)=0
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtSemiLeptonicFF *FormFactors) override
EvtVector4C cont2(const EvtVector4C &v4) const
EvtVector4C conj() const
double mass() const
double mass2() const
void set(int i, double d)
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)