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
EvtSemiLeptonicVectorAmp.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"
33using std::endl;
34
36 EvtSemiLeptonicFF* FormFactors )
37{
38 static const EvtId EM = EvtPDL::getId( "e-" );
39 static const EvtId MUM = EvtPDL::getId( "mu-" );
40 static const EvtId TAUM = EvtPDL::getId( "tau-" );
41 static const EvtId EP = EvtPDL::getId( "e+" );
42 static const EvtId MUP = EvtPDL::getId( "mu+" );
43 static const EvtId TAUP = EvtPDL::getId( "tau+" );
44
45 static const EvtId D0 = EvtPDL::getId( "D0" );
46 static const EvtId D0B = EvtPDL::getId( "anti-D0" );
47 static const EvtId DP = EvtPDL::getId( "D+" );
48 static const EvtId DM = EvtPDL::getId( "D-" );
49 static const EvtId DSM = EvtPDL::getId( "D_s-" );
50 static const EvtId DSP = EvtPDL::getId( "D_s+" );
51
52 //Add the lepton and neutrino 4 momenta to find q2
53
54 EvtVector4R q = parent->getDaug( 1 )->getP4() + parent->getDaug( 2 )->getP4();
55 double q2 = ( q.mass2() );
56
57 double a1f, a2f, vf, a0f, a3f;
58 double m_meson = parent->getDaug( 0 )->mass();
59
60 FormFactors->getvectorff( parent->getId(), parent->getDaug( 0 )->getId(),
61 q2, m_meson, &a1f, &a2f, &vf, &a0f );
62
63 double costhl_flag = 1.0;
64
65 if ( parent->getId() == D0 || parent->getId() == D0B ||
66 parent->getId() == DP || parent->getId() == DM ) {
67 costhl_flag = -1.0;
68 }
69 if ( parent->getId() == DSP || parent->getId() == DSM ) {
70 costhl_flag = -1.0;
71 }
72 vf = vf * costhl_flag;
73
74 EvtVector4R p4b;
75 p4b.set( parent->mass(), 0.0, 0.0, 0.0 );
76
77 EvtVector4R p4meson = parent->getDaug( 0 )->getP4();
78
79 EvtVector4C l1, l2;
80
81 EvtId l_num = parent->getDaug( 1 )->getId();
82 double m_b = parent->mass();
83
84 a3f = ( ( m_b + m_meson ) / ( 2.0 * m_meson ) ) * a1f -
85 ( ( m_b - m_meson ) / ( 2.0 * m_meson ) ) * a2f;
86
87 EvtTensor4C tds;
88 if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
89 tds = a1f * ( m_b + m_meson ) * EvtTensor4C::g();
90 tds.addDirProd( ( -a2f / ( m_b + m_meson ) ) * p4b, p4b + p4meson );
91 tds += EvtComplex( 0.0, vf / ( m_b + m_meson ) ) *
92 dual( EvtGenFunctions::directProd( p4meson + p4b, p4b - p4meson ) );
93 tds.addDirProd( ( a0f - a3f ) * 2.0 * ( m_meson / q2 ) * p4b,
94 p4b - p4meson );
95
96 l1 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 0 ),
97 parent->getDaug( 2 )->spParentNeutrino() );
98 l2 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 1 ),
99 parent->getDaug( 2 )->spParentNeutrino() );
100 } else {
101 if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
102 tds = a1f * ( m_b + m_meson ) * EvtTensor4C::g();
103 tds.addDirProd( ( -a2f / ( m_b + m_meson ) ) * p4b, p4b + p4meson );
104 tds -= EvtComplex( 0.0, vf / ( m_b + m_meson ) ) *
105 dual( EvtGenFunctions::directProd( p4meson + p4b,
106 p4b - p4meson ) );
107 tds.addDirProd( ( a0f - a3f ) * 2.0 * ( m_meson / q2 ) * p4b,
108 p4b - p4meson );
109
110 l1 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
111 parent->getDaug( 1 )->spParent( 0 ) );
112 l2 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
113 parent->getDaug( 1 )->spParent( 1 ) );
114 } else {
115 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
116 << "Wrong lepton number" << endl;
117 }
118 }
119
120 EvtVector4C et0 = tds.cont1( parent->getDaug( 0 )->epsParent( 0 ).conj() );
121 EvtVector4C et1 = tds.cont1( parent->getDaug( 0 )->epsParent( 1 ).conj() );
122 EvtVector4C et2 = tds.cont1( parent->getDaug( 0 )->epsParent( 2 ).conj() );
123
124 amp.vertex( 0, 0, l1.cont( et0 ) );
125 amp.vertex( 0, 1, l2.cont( et0 ) );
126
127 amp.vertex( 1, 0, l1.cont( et1 ) );
128 amp.vertex( 1, 1, l2.cont( et1 ) );
129
130 amp.vertex( 2, 0, l1.cont( et2 ) );
131 amp.vertex( 2, 1, l2.cont( et2 ) );
132
133 return;
134}
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
virtual EvtVector4C epsParent(int i) const
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 getvectorff(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 cont1(const EvtVector4C &v4) const
static const EvtTensor4C & g()
EvtTensor4C & addDirProd(const EvtVector4R &p1, const EvtVector4R &p2)
EvtVector4C conj() const
EvtComplex cont(const EvtVector4C &v4) const
double mass2() const
void set(int i, double d)
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)