evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
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"
25 #include "EvtGenBase/EvtGenKine.hh"
26 #include "EvtGenBase/EvtId.hh"
27 #include "EvtGenBase/EvtPDL.hh"
29 #include "EvtGenBase/EvtPatches.hh"
30 #include "EvtGenBase/EvtReport.hh"
34 using std::endl;
35 
37  EvtSemiLeptonicFF* FormFactors )
38 {
39  static EvtId EM = EvtPDL::getId( "e-" );
40  static EvtId MUM = EvtPDL::getId( "mu-" );
41  static EvtId TAUM = EvtPDL::getId( "tau-" );
42  static EvtId EP = EvtPDL::getId( "e+" );
43  static EvtId MUP = EvtPDL::getId( "mu+" );
44  static EvtId TAUP = EvtPDL::getId( "tau+" );
45 
46  static EvtId D0 = EvtPDL::getId( "D0" );
47  static EvtId D0B = EvtPDL::getId( "anti-D0" );
48  static EvtId DP = EvtPDL::getId( "D+" );
49  static EvtId DM = EvtPDL::getId( "D-" );
50  static EvtId DSM = EvtPDL::getId( "D_s-" );
51  static EvtId DSP = EvtPDL::getId( "D_s+" );
52 
53  //Add the lepton and neutrino 4 momenta to find q2
54 
55  EvtVector4R q = parent->getDaug( 1 )->getP4() + parent->getDaug( 2 )->getP4();
56  double q2 = ( q.mass2() );
57 
58  double a1f, a2f, vf, a0f, a3f;
59  double m_meson = parent->getDaug( 0 )->mass();
60 
61  FormFactors->getvectorff( parent->getId(), parent->getDaug( 0 )->getId(),
62  q2, m_meson, &a1f, &a2f, &vf, &a0f );
63 
64  double costhl_flag = 1.0;
65 
66  if ( parent->getId() == D0 || parent->getId() == D0B ||
67  parent->getId() == DP || parent->getId() == DM ) {
68  costhl_flag = -1.0;
69  }
70  if ( parent->getId() == DSP || parent->getId() == DSM ) {
71  costhl_flag = -1.0;
72  }
73  vf = vf * costhl_flag;
74 
75  EvtVector4R p4b;
76  p4b.set( parent->mass(), 0.0, 0.0, 0.0 );
77 
78  EvtVector4R p4meson = parent->getDaug( 0 )->getP4();
79 
80  EvtVector4C l1, l2;
81 
82  EvtId l_num = parent->getDaug( 1 )->getId();
83  double m_b = parent->mass();
84 
85  a3f = ( ( m_b + m_meson ) / ( 2.0 * m_meson ) ) * a1f -
86  ( ( m_b - m_meson ) / ( 2.0 * m_meson ) ) * a2f;
87 
88  EvtTensor4C tds;
89  if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
90  tds = a1f * ( m_b + m_meson ) * EvtTensor4C::g();
91  tds.addDirProd( ( -a2f / ( m_b + m_meson ) ) * p4b, p4b + p4meson );
92  tds += EvtComplex( 0.0, vf / ( m_b + m_meson ) ) *
93  dual( EvtGenFunctions::directProd( p4meson + p4b, p4b - p4meson ) );
94  tds.addDirProd( ( a0f - a3f ) * 2.0 * ( m_meson / q2 ) * p4b,
95  p4b - p4meson );
96 
97  l1 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 0 ),
98  parent->getDaug( 2 )->spParentNeutrino() );
99  l2 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 1 ),
100  parent->getDaug( 2 )->spParentNeutrino() );
101  } else {
102  if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
103  tds = a1f * ( m_b + m_meson ) * EvtTensor4C::g();
104  tds.addDirProd( ( -a2f / ( m_b + m_meson ) ) * p4b, p4b + p4meson );
105  tds -= EvtComplex( 0.0, vf / ( m_b + m_meson ) ) *
106  dual( EvtGenFunctions::directProd( p4meson + p4b,
107  p4b - p4meson ) );
108  tds.addDirProd( ( a0f - a3f ) * 2.0 * ( m_meson / q2 ) * p4b,
109  p4b - p4meson );
110 
111  l1 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
112  parent->getDaug( 1 )->spParent( 0 ) );
113  l2 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
114  parent->getDaug( 1 )->spParent( 1 ) );
115  } else {
116  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
117  << "Wrong lepton number" << endl;
118  }
119  }
120 
121  EvtVector4C et0 = tds.cont1( parent->getDaug( 0 )->epsParent( 0 ).conj() );
122  EvtVector4C et1 = tds.cont1( parent->getDaug( 0 )->epsParent( 1 ).conj() );
123  EvtVector4C et2 = tds.cont1( parent->getDaug( 0 )->epsParent( 2 ).conj() );
124 
125  amp.vertex( 0, 0, l1.cont( et0 ) );
126  amp.vertex( 0, 1, l2.cont( et0 ) );
127 
128  amp.vertex( 1, 0, l1.cont( et1 ) );
129  amp.vertex( 1, 1, l2.cont( et1 ) );
130 
131  amp.vertex( 2, 0, l1.cont( et2 ) );
132  amp.vertex( 2, 1, l2.cont( et2 ) );
133 
134  return;
135 }
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)
static const EvtTensor4C & g()
Definition: EvtTensor4C.cpp:44
EvtTensor4C dual(const EvtTensor4C &t2)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtSemiLeptonicFF *FormFactors) override
EvtVector4C cont1(const EvtVector4C &v4) const
EvtId getId() const
void set(int i, double d)
Definition: EvtVector4R.hh:167
virtual void getvectorff(EvtId parent, EvtId daught, double t, double mass, double *a1f, double *a2f, double *vf, double *a0f)=0
virtual EvtDiracSpinor spParent(int) const
Definition: EvtId.hh:27
void vertex(const EvtComplex &amp)
Definition: EvtAmp.cpp:454
double mass2() const
Definition: EvtVector4R.hh:100
virtual EvtVector4C epsParent(int i) const
Definition: EvtAmp.hh:30
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
double mass() const
virtual EvtDiracSpinor spParentNeutrino() const
EvtVector4C EvtLeptonVACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtVector4C conj() const
Definition: EvtVector4C.hh:202
EvtComplex cont(const EvtVector4C &v4) const
Definition: EvtVector4C.hh:140
EvtTensor4C & addDirProd(const EvtVector4R &p1, const EvtVector4R &p2)