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
EvtBLLNuLAmp.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
26#include "EvtGenBase/EvtPDL.hh"
29
30#include <cmath>
31
33 m_qSqMin( 0.0 ),
34 m_kSqMin( 0.0 ),
35 m_symmetry( false ),
36 m_BpId( EvtPDL::getId( "B+" ) ),
37 m_BnId( EvtPDL::getId( "B-" ) ),
38 m_coupling( 0.0 ),
39 m_sqrt2( sqrt( 2.0 ) ),
40 m_fBu( 0.191 ), // leptonic constant (GeV)
41 m_Bstar( EvtBLLNuLAmp::ResPole( 5.32, 0.00658, 0.183 / 3.0 ) ),
42 m_Upsilon( EvtBLLNuLAmp::ResPole( 9.64, 0.0, 0.0 ) ),
43 m_resPoles(),
44 m_nPoles( 0 ),
45 m_zero( EvtComplex( 0.0, 0.0 ) ),
46 m_unitI( EvtComplex( 0.0, 1.0 ) )
47{
48 double GF = 1.166371e-5; // GeV^{-2}
49 double alphaEM = 1.0 / 137.0;
50
51 // Normalisation constant, multiplied by 1e4 to increase probability scale
52 m_coupling = 400.0 * GF * EvtConst::pi * alphaEM * Vub * 1e4 / m_sqrt2;
53
54 // Define VMD resonance poles using PDG 2016 values with constants from
55 // D.Melikhov, N.Nikitin and K.Toms, Phys. Atom. Nucl. 68, 1842 (2005)
56
57 // Rho and omega resonances
58 EvtBLLNuLAmp::ResPole rho = EvtBLLNuLAmp::ResPole( 0.77526, 0.1491,
59 1.0 / 5.04 );
60 m_resPoles.push_back( rho );
61
62 EvtBLLNuLAmp::ResPole omega = EvtBLLNuLAmp::ResPole( 0.78265, 0.00849,
63 1.0 / 17.1 );
64 m_resPoles.push_back( omega );
65
66 m_nPoles = m_resPoles.size();
67}
68
69EvtBLLNuLAmp::EvtBLLNuLAmp( double qSqMin, double kSqMin, bool symmetry,
70 double Vub ) :
71 m_qSqMin( qSqMin ),
72 m_kSqMin( kSqMin ),
73 m_symmetry( symmetry ),
74 m_BpId( EvtPDL::getId( "B+" ) ),
75 m_BnId( EvtPDL::getId( "B-" ) ),
76 m_coupling( 0.0 ),
77 m_sqrt2( sqrt( 2.0 ) ),
78 m_fBu( 0.191 ), // leptonic constant (GeV)
79 m_Bstar( EvtBLLNuLAmp::ResPole( 5.32, 0.00658, 0.183 / 3.0 ) ),
80 m_Upsilon( EvtBLLNuLAmp::ResPole( 9.64, 0.0, 0.0 ) ),
81 m_resPoles(),
82 m_nPoles( 0 ),
83 m_zero( EvtComplex( 0.0, 0.0 ) ),
84 m_unitI( EvtComplex( 0.0, 1.0 ) )
85{
86 double GF = 1.166371e-5; // GeV^{-2}
87 double alphaEM = 1.0 / 137.0;
88
89 // Normalisation constant, multiplied by 1e4 to increase probability scale
90 m_coupling = 400.0 * GF * EvtConst::pi * alphaEM * Vub * 1e4 / m_sqrt2;
91
92 // Define VMD resonance poles using PDG 2016 values with constants from
93 // D.Melikhov, N.Nikitin and K.Toms, Phys. Atom. Nucl. 68, 1842 (2005)
94
95 // Rho and omega resonances
96 EvtBLLNuLAmp::ResPole rho = EvtBLLNuLAmp::ResPole( 0.77526, 0.1491,
97 1.0 / 5.04 );
98 m_resPoles.push_back( rho );
99
100 EvtBLLNuLAmp::ResPole omega = EvtBLLNuLAmp::ResPole( 0.78265, 0.00849,
101 1.0 / 17.1 );
102 m_resPoles.push_back( omega );
103
104 m_nPoles = m_resPoles.size();
105}
106
107// Storing resonance pole information
108EvtBLLNuLAmp::ResPole::ResPole( double mass, double width, double coupling ) :
109 m_m0( mass ),
110 m_m0Sq( mass * mass ),
111 m_w0( width ),
112 m_c( coupling ),
113 m_I( EvtComplex( 0.0, 1.0 ) ),
114 m_Imw( m_I * mass * width )
115{
116}
117
118EvtComplex EvtBLLNuLAmp::ResPole::propagator( double qSq, int numForm ) const
119{
120 // Numerator term: mass-squared (default) or mass
121 double num( m_m0Sq );
122 if ( numForm == 1 ) {
123 num = m_m0;
124 }
125
126 EvtComplex result = num * m_c / ( ( qSq - m_m0Sq ) + m_Imw );
127 return result;
128}
129
130// Amplitude calculation
131void EvtBLLNuLAmp::CalcAmp( EvtParticle* parent, EvtAmp& amp ) const
132{
133 // Check for 4 daughters and an existing parent
134 if ( !parent || parent->getNDaug() != 4 ) {
135 return;
136 }
137
138 // The first two charged leptons. The 2nd one will have
139 // the same charge as the 3rd charged lepton
140 EvtParticle* lepA = parent->getDaug( 0 );
141 EvtParticle* lepB = parent->getDaug( 1 );
142 // The neutrino
143 EvtParticle* neu = parent->getDaug( 2 );
144 // The third charged lepton
145 EvtParticle* lepC = parent->getDaug( 3 );
146
147 // Kinematics
148 double MB = parent->mass(); // B-meson mass, GeV
149
150 // 4-momenta of the leptons in the B rest frame. The daughters will already
151 // be in the correct order since this check is done in EvtBLLNuL::init()
152 // when initialising the model using the decay file
153 EvtVector4R p1 = lepA->getP4();
154 EvtVector4R p2 = lepB->getP4();
155 EvtVector4R p3 = neu->getP4();
156 EvtVector4R p4 = lepC->getP4();
157
158 // 4-momenta sums
159 EvtVector4R q12 = p1 + p2;
160 EvtVector4R k34 = p3 + p4;
161
162 // Mandelstam variables: q^2 and k^2
163 double q12Sq = q12.mass2();
164 double k34Sq = k34.mass2();
165
166 // Check if we are above mass thresholds
167 bool threshold( true );
168 if ( q12Sq < m_qSqMin || k34Sq < m_kSqMin ) {
169 threshold = false;
170 }
171
172 // For the symmetric terms when we exchange the
173 // 2nd and 3rd charged leptons: p2 <-> p4
174 EvtVector4R q14, k23;
175 double q14Sq( 0.0 ), k23Sq( 0.0 );
176 if ( m_symmetry ) {
177 q14 = p1 + p4;
178 k23 = p2 + p3;
179 q14Sq = q14.mass2();
180 k23Sq = k23.mass2();
181
182 if ( q14Sq < m_qSqMin || k23Sq < m_kSqMin ) {
183 threshold = false;
184 }
185 }
186
187 // B meson id
188 EvtId parId = parent->getId();
189 // B+ or B- decays
190 int sign( 1 );
191 if ( parId == m_BnId ) {
192 sign = -1;
193 }
194
195 // Hadronic tensors
196 EvtTensor4C THadronA = getHadronTensor( q12, k34, q12Sq, k34Sq, MB, sign );
197
198 // When we need to include the symmetric terms
199 EvtTensor4C THadronB;
200 if ( m_symmetry ) {
201 THadronB = getHadronTensor( q14, k23, q14Sq, k23Sq, MB, sign );
202 }
203
204 // Leptonic currents: A for normal terms, B for symmetric terms
205 EvtVector4C L1A, L2A, L1B, L2B;
206
207 int leptonSpins[4]; // array for saving the leptonic spin configuration
208
209 // Loop over lepton spin states
210 for ( int i2 = 0; i2 < 2; i2++ ) {
211 leptonSpins[0] = i2;
212
213 for ( int i1 = 0; i1 < 2; i1++ ) {
214 leptonSpins[1] = i1;
215
216 if ( sign == -1 ) {
217 // B- currents
218 // L2^{\nu} = \bar mu(k_2) \gamma^{\nu} mu(- k_1)
219 L2A = EvtLeptonVCurrent( lepB->spParent( i2 ),
220 lepA->spParent( i1 ) );
221
222 if ( m_symmetry ) {
223 // Swapping the 2nd and 3rd charged leptons
224 L1B = EvtLeptonVACurrent( lepB->spParent( i2 ),
225 neu->spParentNeutrino() );
226 }
227
228 } else {
229 // B+ currents
230 // L2^{\nu} = \bar mu(k_1) \gamma^{\nu} mu(- k_2)
231 L2A = EvtLeptonVCurrent( lepA->spParent( i1 ),
232 lepB->spParent( i2 ) );
233
234 if ( m_symmetry ) {
235 // Swapping the 2nd and 3rd charged leptons
237 lepB->spParent( i2 ) );
238 }
239 }
240
241 // Production: Tfi^{\mu} = THadron^{\mu \nu} L_{2 \nu}
242 EvtVector4C THL2A = THadronA.cont2( L2A );
243
244 for ( int i4 = 0; i4 < 2; i4++ ) {
245 leptonSpins[2] = i4;
246 leptonSpins[3] = 0; // neutrino handedness
247
248 if ( sign == -1 ) {
249 // B- currents
250 // L1^{\mu} = \bar e(k_4) \gamma^{\mu} (1 - \gamma^5) nu_e(- k_3)
251 L1A = EvtLeptonVACurrent( lepC->spParent( i4 ),
252 neu->spParentNeutrino() );
253
254 if ( m_symmetry ) {
255 // Swapping the 2nd and 3rd charged leptons
256 L2B = EvtLeptonVCurrent( lepC->spParent( i4 ),
257 lepA->spParent( i1 ) );
258 }
259
260 } else {
261 // B+ currents
262 // L1^{\mu} = \bar nu_e(k_3) \gamma^{\mu} (1 - \gamma^5) e(- k_4)
264 lepC->spParent( i4 ) );
265
266 if ( m_symmetry ) {
267 // Swapping the 2nd and 3rd charged leptons
268 L2B = EvtLeptonVCurrent( lepA->spParent( i1 ),
269 lepC->spParent( i4 ) );
270 }
271 }
272
273 if ( threshold == false ) {
274 // Below kinematic thresholds
275 amp.vertex( leptonSpins, m_zero );
276
277 } else {
278 // Decay amplitude calculation: L_1^{\mu} Tfi_{\mu}
279 EvtComplex decAmp = L1A * THL2A;
280
281 // If we also need to swap the 2nd and 3rd charged leptons
282 if ( m_symmetry ) {
283 // Hadronic current production term. L2B depends on i4 so we need
284 // it here instead of inside the i2 loop as was the case for THL2A
285 EvtVector4C THL2B = THadronB.cont2( L2B );
286
287 // The symmetric amplitude
288 EvtComplex ampB = L1B * THL2B;
289
290 // Subtract this from the total amplitude
291 decAmp -= ampB;
292 }
293
294 amp.vertex( leptonSpins, decAmp );
295 }
296
297 } // i4 loop
298
299 } // i1 loop
300
301 } // i2 loop
302}
303
305 const EvtVector4R& k,
306 const double qSq, const double kSq,
307 const double MB, const int sign ) const
308{
309 // Hadronic tensor calculation
310
313
314 EvtComplex BstarAmp = getBStarTerm( qSq, kSq, MB );
315 std::vector<EvtComplex> VMDAmps = getVMDTerms( qSq, kSq, MB );
316
317 EvtComplex FF_ekq = BstarAmp + VMDAmps[0];
318 EvtComplex FF_g = VMDAmps[1] - m_fBu;
319 EvtComplex FF_qk = VMDAmps[2];
320
321 // Full hadronic tensor
322 EvtTensor4C THadron = sign * 2.0 * FF_ekq * epskq +
323 m_unitI *
324 ( 2.0 * FF_qk * qk - FF_g * EvtTensor4C::g() );
325
326 // Kinematic cuts
327 double coeffcut( 0.0 );
328 if ( qSq > m_qSqMin && kSq > m_kSqMin ) {
329 coeffcut = 1.0 / qSq;
330 }
331
332 // Normalisation constant
333 THadron *= coeffcut * m_coupling;
334
335 return THadron;
336}
337
338std::vector<EvtComplex> EvtBLLNuLAmp::getVMDTerms( double qSq, double kSq,
339 double MB ) const
340{
341 // Find the 3 VMD form factors: epsilon*k*q, g(uv) and q*k terms
342 EvtComplex VMD1( 0.0, 0.0 ), VMD2( 0.0, 0.0 ), VMD3( 0.0, 0.0 );
343
344 // Loop over the VMD poles
345 for ( int iPole = 0; iPole < m_nPoles; iPole++ ) {
346 auto pole = m_resPoles[iPole];
347
348 // Propagator term, common for all factors
349 EvtComplex prop = pole.propagator( qSq );
350
351 double mSum = MB + pole.getMass();
352
353 VMD1 += prop / mSum;
354 VMD2 += mSum * prop;
355 }
356
357 // Third pole summation term is the same as the first one
358 VMD3 = VMD1;
359
360 // Multiply by couplings for the given kSq
361 VMD1 *= FF_V( kSq );
362 VMD2 *= FF_A1( kSq );
363 VMD3 *= FF_A2( kSq );
364
365 // Return the factors as a vector
366 std::vector<EvtComplex> factors;
367 factors.push_back( VMD1 );
368 factors.push_back( VMD2 );
369 factors.push_back( VMD3 );
370
371 return factors;
372}
373
374EvtComplex EvtBLLNuLAmp::getBStarTerm( double qSq, double kSq, double MB ) const
375{
376 EvtComplex amplitude = m_Bstar.propagator( kSq, 1 ) * FF_B2Bstar( qSq ) /
377 ( MB + m_Bstar.getMass() );
378 return amplitude;
379}
380
381double EvtBLLNuLAmp::FF_B2Bstar( double qSq ) const
382{
383 // Electromagnetic FF for B -> B* transition, when gamma is emitted from the b quark
384 // D.Melikhov, private communication
385 double y = qSq / m_Upsilon.getMassSq();
386 double denom = ( 1.0 - y ) * ( 1.0 - 0.81 * y );
387
388 double V( 0.0 );
389 if ( fabs( denom ) > 1e-10 ) {
390 V = 1.044 / denom;
391 }
392
393 return V;
394}
395
396double EvtBLLNuLAmp::FF_V( double kSq ) const
397{
398 // D. Melikhov and B. Stech, PRD 62, 014006 (2000) Table XV
399 double y = kSq / m_Bstar.getMassSq();
400 double denom = m_sqrt2 * ( 1.0 - y ) * ( 1.0 - 0.59 * y );
401
402 double V( 0.0 );
403 if ( fabs( denom ) > 1e-10 ) {
404 V = 0.31 / denom;
405 }
406
407 return V;
408}
409
410double EvtBLLNuLAmp::FF_A1( double kSq ) const
411{
412 // D. Melikhov and B. Stech, PRD 62, 014006 (2000) Table XV
413 double y = kSq / m_Bstar.getMassSq();
414 double denom = ( ( 0.1 * y - 0.73 ) * y + 1.0 ) * m_sqrt2;
415
416 double A1( 0.0 );
417 if ( fabs( denom ) > 1e-10 ) {
418 A1 = 0.26 / denom;
419 }
420
421 return A1;
422}
423
424double EvtBLLNuLAmp::FF_A2( double kSq ) const
425{
426 // D. Melikhov and B. Stech, PRD 62, 014006 (2000) Table XV
427 double y = kSq / m_Bstar.getMassSq();
428 double denom = ( ( 0.5 * y - 1.4 ) * y + 1.0 ) * m_sqrt2;
429
430 double A2( 0.0 );
431 if ( fabs( denom ) > 1e-10 ) {
432 A2 = 0.24 / denom;
433 }
434
435 return A2;
436}
EvtVector4C EvtLeptonVACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtTensor4C dual(const EvtTensor4C &t2)
void vertex(const EvtComplex &amp)
Definition EvtAmp.cpp:453
ResPole(double mass, double width, double coupling)
EvtComplex propagator(double qSq, int numForm=0) const
double FF_V(double kSq) const
std::vector< EvtComplex > getVMDTerms(double qSq, double kSq, double MB) const
EvtBLLNuLAmp::ResPole m_Bstar
EvtComplex m_zero
double m_coupling
EvtBLLNuLAmp::ResPole m_Upsilon
EvtTensor4C getHadronTensor(const EvtVector4R &q, const EvtVector4R &k, const double qSq, const double kSq, const double MB, const int sign) const
double FF_A1(double kSq) const
double FF_A2(double kSq) const
std::vector< EvtBLLNuLAmp::ResPole > m_resPoles
void CalcAmp(EvtParticle *parent, EvtAmp &amp) const
EvtBLLNuLAmp(double Vub=4.09e-3)
double FF_B2Bstar(double qSq) const
EvtComplex m_unitI
EvtComplex getBStarTerm(double qSq, double kSq, double MB) const
static const double pi
Definition EvtConst.hh:26
Definition EvtId.hh:27
EvtId getId() const
virtual EvtDiracSpinor spParentNeutrino() const
virtual EvtDiracSpinor spParent(int) const
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
double mass() const
size_t getNDaug() const
static const EvtTensor4C & g()
EvtVector4C cont2(const EvtVector4C &v4) const
double mass2() const
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)