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
EvtbTosllVectorAmp.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"
28#include "EvtGenBase/EvtPDL.hh"
33
36
38 EvtbTosllFF* formFactors )
39{
40 //Add the lepton and neutrino 4 momenta to find q2
41
42 EvtVector4R q = parent->getDaug( 1 )->getP4() + parent->getDaug( 2 )->getP4();
43 double q2 = ( q.mass2() );
44
45 double a1, a2, a0, v, t1, t2, t3;
46 double mesonmass = parent->getDaug( 0 )->mass();
47 double parentmass = parent->mass();
48
49 formFactors->getVectorFF( parent->getId(), parent->getDaug( 0 )->getId(),
50 q2, mesonmass, a1, a2, a0, v, t1, t2, t3 );
51
52 EvtId daught = parent->getDaug( 0 )->getId();
53 EvtId parentId = parent->getId();
54 bool btod = false;
55 bool nnlo = true;
56 if ( ( parentId == EvtPDL::getId( "B0" ) ||
57 parentId == EvtPDL::getId( "anti-B0" ) ||
58 parentId == EvtPDL::getId( "B+" ) ||
59 parentId == EvtPDL::getId( "B-" ) ) &&
60 ( daught == EvtPDL::getId( std::string( "rho+" ) ) ||
61 daught == EvtPDL::getId( std::string( "rho-" ) ) ||
62 daught == EvtPDL::getId( std::string( "rho0" ) ) ||
63 daught == EvtPDL::getId( std::string( "omega" ) ) ) ) {
64 btod = true;
65 }
66 if ( ( parentId == EvtPDL::getId( "B_s0" ) ||
67 parentId == EvtPDL::getId( "anti-B_s0" ) ) &&
68 ( daught == EvtPDL::getId( std::string( "K*0" ) ) ||
69 daught == EvtPDL::getId( std::string( "anti-K*0" ) ) ||
70 daught == EvtPDL::getId( std::string( "K*+" ) ) ||
71 daught == EvtPDL::getId( std::string( "K*-" ) ) ) ) {
72 btod = true;
73 }
74
75 EvtVector4R p4b;
76 p4b.set( parent->mass(), 0.0, 0.0, 0.0 );
77 EvtVector4R p4meson = parent->getDaug( 0 )->getP4();
78
79 EvtVector4C l11, l12;
80 EvtVector4C l21, l22;
81
82 EvtVector4C a11, a12;
83 EvtVector4C a21, a22;
84
85 EvtId parentID = parent->getId();
86
87 //EvtId l_num = parent->getDaug(1)->getId();
88
89 EvtVector4R pbhat = p4b / parentmass;
90 EvtVector4R qhat = q / parentmass;
91 EvtVector4R pkstarhat = p4meson / parentmass;
92 EvtVector4R phat = pbhat + pkstarhat;
93
94 EvtComplex c7eff = EvtbTosllAmp::GetC7Eff( q2, nnlo );
95 EvtComplex c9eff = EvtbTosllAmp::GetC9Eff( q2, nnlo, btod );
96 EvtComplex c10eff = EvtbTosllAmp::GetC10Eff( q2, nnlo );
97 EvtComplex uniti( 0.0, 1.0 );
98
99 double mhatb = 4.4 / ( parentmass );
100 double mhatkstar = mesonmass / ( parentmass );
101 double shat = q2 / ( parentmass * parentmass );
102
103 EvtComplex a;
104 a = c9eff * v * 2 / ( 1 + mhatkstar ) + 4 * mhatb * c7eff * t1 / shat;
105 EvtComplex b;
106 b = ( 1 + mhatkstar ) *
107 ( c9eff * a1 + 2 * mhatb * ( 1 - mhatkstar ) * c7eff * t2 / shat );
108 EvtComplex c;
109 c = ( ( 1 - mhatkstar ) * c9eff * a2 +
110 2 * mhatb * c7eff * ( t3 + ( 1 - mhatkstar * mhatkstar ) * t2 / shat ) ) /
111 ( 1 - mhatkstar * mhatkstar );
112 EvtComplex d;
113 d = ( c9eff * ( ( 1 + mhatkstar ) * a1 - ( 1 - mhatkstar ) * a2 -
114 2 * mhatkstar * a0 ) -
115 2 * mhatb * c7eff * t3 ) /
116 shat;
117 EvtComplex e;
118 e = 2 * c10eff * v / ( 1 + mhatkstar );
119 EvtComplex f;
120 f = ( 1 + mhatkstar ) * c10eff * a1;
121 EvtComplex g;
122 g = c10eff * a2 / ( 1 + mhatkstar );
123 EvtComplex h;
124 h = c10eff *
125 ( ( 1 + mhatkstar ) * a1 - ( 1 - mhatkstar ) * a2 - 2 * mhatkstar * a0 ) /
126 shat;
127
128 EvtTensor4C T1, T2;
129
130 static const EvtIdSet bmesons{ "B-", "anti-B0", "anti-B_s0" };
131 static const EvtIdSet bbarmesons{ "B+", "B0", "B_s0" };
132
133 EvtParticle* lepPlus = nullptr;
134 EvtParticle* lepMinus = nullptr;
135
136 int charge1 = EvtPDL::chg3( parent->getDaug( 1 )->getId() );
137 int charge2 = EvtPDL::chg3( parent->getDaug( 2 )->getId() );
138
139 lepPlus = ( charge1 > charge2 ) ? parent->getDaug( 1 ) : parent->getDaug( 2 );
140 lepMinus = ( charge1 < charge2 ) ? parent->getDaug( 1 )
141 : parent->getDaug( 2 );
142
143 if ( bmesons.contains( parentID ) ) {
144 T1 = a * dual( EvtGenFunctions::directProd( pbhat, pkstarhat ) ) -
145 b * uniti * EvtTensor4C::g() +
146 c * uniti * EvtGenFunctions::directProd( pbhat, phat ) +
147 d * uniti * EvtGenFunctions::directProd( pbhat, qhat );
148
149 T2 = e * dual( EvtGenFunctions::directProd( pbhat, pkstarhat ) ) -
150 f * uniti * EvtTensor4C::g() +
151 g * uniti * EvtGenFunctions::directProd( pbhat, phat ) +
152 h * uniti * EvtGenFunctions::directProd( pbhat, qhat );
153
154 l11 = EvtLeptonVCurrent( lepPlus->spParent( 0 ), lepMinus->spParent( 0 ) );
155 l21 = EvtLeptonVCurrent( lepPlus->spParent( 1 ), lepMinus->spParent( 0 ) );
156 l12 = EvtLeptonVCurrent( lepPlus->spParent( 0 ), lepMinus->spParent( 1 ) );
157 l22 = EvtLeptonVCurrent( lepPlus->spParent( 1 ), lepMinus->spParent( 1 ) );
158
159 a11 = EvtLeptonACurrent( lepPlus->spParent( 0 ), lepMinus->spParent( 0 ) );
160 a21 = EvtLeptonACurrent( lepPlus->spParent( 1 ), lepMinus->spParent( 0 ) );
161 a12 = EvtLeptonACurrent( lepPlus->spParent( 0 ), lepMinus->spParent( 1 ) );
162 a22 = EvtLeptonACurrent( lepPlus->spParent( 1 ), lepMinus->spParent( 1 ) );
163
164 } else {
165 if ( bbarmesons.contains( parentID ) ) {
166 T1 = -a * dual( EvtGenFunctions::directProd( pbhat, pkstarhat ) ) -
167 b * uniti * EvtTensor4C::g() +
168 c * uniti * EvtGenFunctions::directProd( pbhat, phat ) +
169 d * uniti * EvtGenFunctions::directProd( pbhat, qhat );
170
171 T2 = -e * dual( EvtGenFunctions::directProd( pbhat, pkstarhat ) ) -
172 f * uniti * EvtTensor4C::g() +
173 g * uniti * EvtGenFunctions::directProd( pbhat, phat ) +
174 h * uniti * EvtGenFunctions::directProd( pbhat, qhat );
175
176 l11 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
177 lepMinus->spParent( 1 ) );
178 l21 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
179 lepMinus->spParent( 1 ) );
180 l12 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
181 lepMinus->spParent( 0 ) );
182 l22 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
183 lepMinus->spParent( 0 ) );
184
185 a11 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
186 lepMinus->spParent( 1 ) );
187 a21 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
188 lepMinus->spParent( 1 ) );
189 a12 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
190 lepMinus->spParent( 0 ) );
191 a22 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
192 lepMinus->spParent( 0 ) );
193
194 } else {
195 EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Wrong lepton number\n";
196 T1.zero();
197 T2.zero(); // Set all tensor terms to zero.
198 }
199 }
200
201 int i;
202
203 for ( i = 0; i < 3; i++ ) {
204 EvtVector4C eps = parent->getDaug( 0 )->epsParent( i ).conj();
205
206 EvtVector4C E1 = T1.cont1( eps );
207 EvtVector4C E2 = T2.cont1( eps );
208
209 amp.vertex( i, 0, 0, l11 * E1 + a11 * E2 );
210 amp.vertex( i, 0, 1, l12 * E1 + a12 * E2 );
211 amp.vertex( i, 1, 0, l21 * E1 + a21 * E2 );
212 amp.vertex( i, 1, 1, l22 * E1 + a22 * E2 );
213 }
214}
EvtVector4C EvtLeptonACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
const double a2
const double a1
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
bool contains(const EvtId &id) const
Definition EvtIdSet.cpp:46
Definition EvtId.hh:27
static int chg3(EvtId i)
Definition EvtPDL.cpp:366
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
virtual EvtVector4C epsParent(int i) const
EvtId getId() const
virtual EvtDiracSpinor spParent(int) const
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
double mass() const
static const EvtTensor4C & g()
EvtVector4C conj() const
double mass2() const
void set(int i, double d)
EvtComplex GetC7Eff(double q2, bool nnlo=true)
EvtComplex GetC10Eff(double q2, bool nnlo=true)
EvtComplex GetC9Eff(double q2, bool nnlo=true, bool btod=false)
virtual void getVectorFF(EvtId, EvtId, double, double, double &, double &, double &, double &, double &, double &, double &)
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtbTosllFF *formFactors) override
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)