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.
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"
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 
36  EvtSemiLeptonicFF* FormFactors )
37 {
38  static EvtId EM = EvtPDL::getId( "e-" );
39  static EvtId MUM = EvtPDL::getId( "mu-" );
40  static EvtId TAUM = EvtPDL::getId( "tau-" );
41  static EvtId EP = EvtPDL::getId( "e+" );
42  static EvtId MUP = EvtPDL::getId( "mu+" );
43  static EvtId TAUP = EvtPDL::getId( "tau+" );
44 
45  static EvtId D0 = EvtPDL::getId( "D0" );
46  static EvtId D0B = EvtPDL::getId( "anti-D0" );
47  static EvtId DP = EvtPDL::getId( "D+" );
48  static EvtId DM = EvtPDL::getId( "D-" );
49  static EvtId DSM = EvtPDL::getId( "D_s-" );
50  static 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 hf, kf, bpf, bmf;
58 
59  FormFactors->gettensorff( parent->getId(), parent->getDaug( 0 )->getId(),
60  q2, parent->getDaug( 0 )->mass(), &hf, &kf, &bpf,
61  &bmf );
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  hf = hf * 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 
83  EvtVector4C ep_meson_b[5];
84 
85  ep_meson_b[0] =
86  ( ( parent->getDaug( 0 )->epsTensorParent( 0 ) ).cont2( p4b ) ).conj();
87  ep_meson_b[1] =
88  ( ( parent->getDaug( 0 )->epsTensorParent( 1 ) ).cont2( p4b ) ).conj();
89  ep_meson_b[2] =
90  ( ( parent->getDaug( 0 )->epsTensorParent( 2 ) ).cont2( p4b ) ).conj();
91  ep_meson_b[3] =
92  ( ( parent->getDaug( 0 )->epsTensorParent( 3 ) ).cont2( p4b ) ).conj();
93  ep_meson_b[4] =
94  ( ( parent->getDaug( 0 )->epsTensorParent( 4 ) ).cont2( p4b ) ).conj();
95 
96  EvtVector4R pp, pm;
97 
98  pp = p4b + p4meson;
99  pm = p4b - p4meson;
100 
101  //lange - October 31,2002 - try to lessen the mass dependence of probmax
102  double q2max = p4b.mass2() + p4meson.mass2() -
103  2.0 * p4b.mass() * p4meson.mass();
104  double q2maxin = 1.0 / q2max;
105 
106  EvtComplex ep_meson_bb[5];
107 
108  ep_meson_bb[0] = ep_meson_b[0] * ( p4b );
109  ep_meson_bb[1] = ep_meson_b[1] * ( p4b );
110  ep_meson_bb[2] = ep_meson_b[2] * ( p4b );
111  ep_meson_bb[3] = ep_meson_b[3] * ( p4b );
112  ep_meson_bb[4] = ep_meson_b[4] * ( p4b );
113 
114  EvtVector4C tds0, tds1, tds2, tds3, tds4;
115 
116  EvtTensor4C tds;
117  if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
118  EvtTensor4C tdual = EvtComplex( 0.0, hf ) *
119  dual( EvtGenFunctions::directProd( pp, pm ) );
120  tds0 = tdual.cont2( ep_meson_b[0] ) - kf * ep_meson_b[0] -
121  bpf * ep_meson_bb[0] * pp - bmf * ep_meson_bb[0] * pm;
122  tds0 *= q2maxin;
123 
124  tds1 = tdual.cont2( ep_meson_b[1] ) - kf * ep_meson_b[1] -
125  bpf * ep_meson_bb[1] * pp - bmf * ep_meson_bb[1] * pm;
126  tds1 *= q2maxin;
127 
128  tds2 = tdual.cont2( ep_meson_b[2] ) - kf * ep_meson_b[2] -
129  bpf * ep_meson_bb[2] * pp - bmf * ep_meson_bb[2] * pm;
130  tds2 *= q2maxin;
131 
132  tds3 = tdual.cont2( ep_meson_b[3] ) - kf * ep_meson_b[3] -
133  bpf * ep_meson_bb[3] * pp - bmf * ep_meson_bb[3] * pm;
134  tds3 *= q2maxin;
135 
136  tds4 = tdual.cont2( ep_meson_b[4] ) - kf * ep_meson_b[4] -
137  bpf * ep_meson_bb[4] * pp - bmf * ep_meson_bb[4] * pm;
138  tds4 *= q2maxin;
139 
140  l1 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 0 ),
141  parent->getDaug( 2 )->spParentNeutrino() );
142  l2 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 1 ),
143  parent->getDaug( 2 )->spParentNeutrino() );
144  } else {
145  if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
146  EvtTensor4C tdual = EvtComplex( 0.0, -hf ) *
147  dual( EvtGenFunctions::directProd( pp, pm ) );
148  tds0 = tdual.cont2( ep_meson_b[0] ) - kf * ep_meson_b[0] -
149  bpf * ep_meson_bb[0] * pp - bmf * ep_meson_bb[0] * pm;
150  tds0 *= q2maxin;
151 
152  tds1 = tdual.cont2( ep_meson_b[1] ) - kf * ep_meson_b[1] -
153  bpf * ep_meson_bb[1] * pp - bmf * ep_meson_bb[1] * pm;
154  tds1 *= q2maxin;
155 
156  tds2 = tdual.cont2( ep_meson_b[2] ) - kf * ep_meson_b[2] -
157  bpf * ep_meson_bb[2] * pp - bmf * ep_meson_bb[2] * pm;
158  tds2 *= q2maxin;
159 
160  tds3 = tdual.cont2( ep_meson_b[3] ) - kf * ep_meson_b[3] -
161  bpf * ep_meson_bb[3] * pp - bmf * ep_meson_bb[3] * pm;
162  tds3 *= q2maxin;
163 
164  tds4 = tdual.cont2( ep_meson_b[4] ) - kf * ep_meson_b[4] -
165  bpf * ep_meson_bb[4] * pp - bmf * ep_meson_bb[4] * pm;
166  tds4 *= q2maxin;
167 
168  l1 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
169  parent->getDaug( 1 )->spParent( 0 ) );
170  l2 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
171  parent->getDaug( 1 )->spParent( 1 ) );
172  } else {
173  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
174  << "dfnb89agngri wrong lepton number\n";
175  }
176  }
177 
178  amp.vertex( 0, 0, l1 * tds0 );
179  amp.vertex( 0, 1, l2 * tds0 );
180 
181  amp.vertex( 1, 0, l1 * tds1 );
182  amp.vertex( 1, 1, l2 * tds1 );
183 
184  amp.vertex( 2, 0, l1 * tds2 );
185  amp.vertex( 2, 1, l2 * tds2 );
186 
187  amp.vertex( 3, 0, l1 * tds3 );
188  amp.vertex( 3, 1, l2 * tds3 );
189 
190  amp.vertex( 4, 0, l1 * tds4 );
191  amp.vertex( 4, 1, l2 * tds4 );
192 
193  return;
194 }
virtual EvtTensor4C epsTensorParent(int i) const
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtSemiLeptonicFF *FormFactors) override
EvtTensor4C dual(const EvtTensor4C &t2)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
Evt3Rank3C conj(const Evt3Rank3C &t2)
Definition: Evt3Rank3C.cpp:172
double mass() const
Definition: EvtVector4R.cpp:49
EvtVector4C cont2(const EvtVector4C &v4) const
EvtId getId() const
void set(int i, double d)
Definition: EvtVector4R.hh:167
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
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)
virtual void gettensorff(EvtId parent, EvtId daught, double t, double mass, double *a1f, double *a2f, double *vf, double *a0f)=0
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91