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