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.
EvtRareLbToLll.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/EvtComplex.hh"
26 #include "EvtGenBase/EvtPDL.hh"
32 
36 
37 #include <stdlib.h>
38 
39 // The module name specification
41 {
42  return "RareLbToLll";
43 }
44 
45 // The implementation of the clone() method
47 {
48  return new EvtRareLbToLll;
49 }
50 
52 {
53  checkNArg( 1 );
54 
55  // check that there are 3 daughters
56  checkNDaug( 3 );
57 
58  // Parent should be spin 1/2 Lambda_b0
60 
61  if ( !( spin == EvtSpinType::DIRAC || spin == EvtSpinType::RARITASCHWINGER ) ) {
62  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
63  << " EvtRareLbToLll expects DIRAC or RARITASWINGER daughter "
64  << std::endl;
65  }
66 
67  // We expect that the second and third daughters
68  // are the ell+ and ell-
71 
72  std::string model = getArgStr( 0 );
73  if ( model == "Gutsche" ) {
74  ffmodel_ = std::make_unique<EvtRareLbToLllFFGutsche>();
75  } else if ( model == "LQCD" ) {
76  ffmodel_ = std::make_unique<EvtRareLbToLllFFlQCD>();
77  } else if ( model == "MR" ) {
78  ffmodel_ = std::make_unique<EvtRareLbToLllFF>();
79  } else {
80  EvtGenReport( EVTGEN_INFO, "EvtGen" )
81  << " Unknown form-factor model, valid options are MR, LQCD, Gutsche."
82  << std::endl;
83  ::abort();
84  }
85  wcmodel_ = std::make_unique<EvtRareLbToLllWC>();
86 
87  ffmodel_->init();
88 
89  return;
90 }
91 
93 {
94  EvtGenReport( EVTGEN_INFO, "EvtGen" )
95  << " EvtRareLbToLll is finding maximum probability ... " << std::endl;
96 
97  m_maxProbability = 0;
98 
99  if ( m_maxProbability == 0 ) {
100  EvtDiracParticle parent{};
101  parent.noLifeTime();
102  parent.init( getParentId(),
103  EvtVector4R( EvtPDL::getMass( getParentId() ), 0, 0, 0 ) );
104  parent.setDiagonalSpinDensity();
105 
106  EvtAmp amp;
107  EvtId daughters[3] = {getDaug( 0 ), getDaug( 1 ), getDaug( 2 )};
108  amp.init( getParentId(), 3, daughters );
109  parent.makeDaughters( 3, daughters );
110  EvtParticle* lambda = parent.getDaug( 0 );
111  EvtParticle* lep1 = parent.getDaug( 1 );
112  EvtParticle* lep2 = parent.getDaug( 2 );
113  lambda->noLifeTime();
114  lep1->noLifeTime();
115  lep2->noLifeTime();
116 
117  EvtSpinDensity rho;
118  rho.setDiag( parent.getSpinStates() );
119 
120  double M0 = EvtPDL::getMass( getParentId() );
121  double mL = EvtPDL::getMass( getDaug( 0 ) );
122  double m1 = EvtPDL::getMass( getDaug( 1 ) );
123  double m2 = EvtPDL::getMass( getDaug( 2 ) );
124 
125  double q2, pstar, elambda, theta;
126  double q2min = ( m1 + m2 ) * ( m1 + m2 );
127  double q2max = ( M0 - mL ) * ( M0 - mL );
128 
129  EvtVector4R p4lambda, p4lep1, p4lep2, boost;
130 
131  EvtGenReport( EVTGEN_INFO, "EvtGen" )
132  << " EvtRareLbToLll is probing whole phase space ..." << std::endl;
133 
134  int i, j;
135  double prob = 0;
136  for ( i = 0; i <= 100; i++ ) {
137  q2 = q2min + i * ( q2max - q2min ) / 100.;
138  elambda = ( M0 * M0 + mL * mL - q2 ) / 2 / M0;
139  if ( i == 0 )
140  pstar = 0;
141  else
142  pstar = sqrt( q2 - ( m1 + m2 ) * ( m1 + m2 ) ) *
143  sqrt( q2 - ( m1 - m2 ) * ( m1 - m2 ) ) / 2 / sqrt( q2 );
144  boost.set( M0 - elambda, 0, 0, +sqrt( elambda * elambda - mL * mL ) );
145  if ( i != 100 ) {
146  p4lambda.set( elambda, 0, 0,
147  -sqrt( elambda * elambda - mL * mL ) );
148  } else {
149  p4lambda.set( mL, 0, 0, 0 );
150  }
151  for ( j = 0; j <= 45; j++ ) {
152  theta = j * EvtConst::pi / 45;
153  p4lep1.set( sqrt( pstar * pstar + m1 * m1 ), 0,
154  +pstar * sin( theta ), +pstar * cos( theta ) );
155  p4lep2.set( sqrt( pstar * pstar + m2 * m2 ), 0,
156  -pstar * sin( theta ), -pstar * cos( theta ) );
157  //std::cout << "p1: " << p4lep1 << " p2: " << p4lep2 << " pstar: " << pstar << std::endl;
158  if ( i != 100 ) // At maximal q2 we are already in correct frame as Lambda and W/Zvirtual are at rest
159  {
160  p4lep1 = boostTo( p4lep1, boost );
161  p4lep2 = boostTo( p4lep2, boost );
162  }
163  lambda->init( getDaug( 0 ), p4lambda );
164  lep1->init( getDaug( 1 ), p4lep1 );
165  lep2->init( getDaug( 2 ), p4lep2 );
166  calcAmp( amp, &parent );
167  prob = rho.normalizedProb( amp.getSpinDensity() );
168  //std::cout << "q2: " << q2 << " \t theta: " << theta << " \t prob: " << prob << std::endl;
169  //std::cout << "p1: " << p4lep1 << " p2: " << p4lep2 << " q2-q2min: " << q2-(m1+m2)*(m1+m2) << std::endl;
170  if ( prob > m_maxProbability ) {
171  EvtGenReport( EVTGEN_INFO, "EvtGen" )
172  << " - probability " << prob << " found at q2 = " << q2
173  << " (" << 100 * ( q2 - q2min ) / ( q2max - q2min )
174  << " %) and theta = " << theta * 180 / EvtConst::pi
175  << std::endl;
176  m_maxProbability = prob;
177  }
178  }
179  //::abort();
180  }
181 
182  //m_poleSize = 0.04*q2min;
183  m_maxProbability *= 1.2;
184  }
185 
187  EvtGenReport( EVTGEN_INFO, "EvtGen" )
188  << " EvtRareLbToLll set up maximum probability to " << m_maxProbability
189  << std::endl;
190 }
191 
193 {
194  parent->initializePhaseSpace( getNDaug(), getDaugs() );
195 
196  calcAmp( _amp2, parent );
197 }
198 
200 {
201  static EvtIdSet partlist( "Lambda_b0" );
202 
203  return partlist.contains( parent->getId() );
204 }
205 
207 {
208  //parent->setDiagonalSpinDensity();
209 
210  EvtParticle* lambda = parent->getDaug( 0 );
211 
212  static EvtIdSet leptons( "e-", "mu-", "tau-" );
213 
214  const bool isparticle = isParticle( parent );
215 
216  EvtParticle* lp = 0;
217  EvtParticle* lm = 0;
218 
219  if ( leptons.contains( parent->getDaug( 1 )->getId() ) ) {
220  lp = parent->getDaug( 1 );
221  lm = parent->getDaug( 2 );
222  } else {
223  lp = parent->getDaug( 2 );
224  lm = parent->getDaug( 1 );
225  }
226 
227  EvtVector4R P;
228  P.set( parent->mass(), 0.0, 0.0, 0.0 );
229 
230  EvtVector4R q = lp->getP4() + lm->getP4();
231  double qsq = q.mass2();
232 
233  // Leptonic currents
234  EvtVector4C LV[2][2]; // \bar{\ell} \gamma^{\mu} \ell
235  EvtVector4C LA[2][2]; // \bar{\ell} \gamma^{\mu} \gamma^{5} \ell
236 
237  for ( int i = 0; i < 2; ++i ) {
238  for ( int j = 0; j < 2; ++j ) {
239  if ( isparticle ) {
240  LV[i][j] = EvtLeptonVCurrent( lp->spParent( i ),
241  lm->spParent( j ) );
242  LA[i][j] = EvtLeptonACurrent( lp->spParent( i ),
243  lm->spParent( j ) );
244  } else {
245  LV[i][j] = EvtLeptonVCurrent( lp->spParent( 1 - i ),
246  lm->spParent( 1 - j ) );
247  LA[i][j] = EvtLeptonACurrent( lp->spParent( 1 - i ),
248  lm->spParent( 1 - j ) );
249  }
250  }
251  }
252 
254  //F, G, FT and GT
255  ffmodel_->getFF( parent, lambda, FF );
256 
257  EvtComplex C7eff = wcmodel_->GetC7Eff( qsq );
258  EvtComplex C9eff = wcmodel_->GetC9Eff( qsq );
259  EvtComplex C10eff = wcmodel_->GetC10Eff( qsq );
260 
261  EvtComplex AC[4];
262  EvtComplex BC[4];
263  EvtComplex DC[4];
264  EvtComplex EC[4];
265 
266  // check to see if particle is same or opposite parity to Lb
267  const int parity = ffmodel_->isNatural( lambda ) ? 1 : -1;
268 
269  // Lambda spin type
270  const EvtSpinType::spintype spin = EvtPDL::getSpinType( lambda->getId() );
271 
272  static const double mb = 5.209;
273 
274  // Eq. 48 + 49
275  for ( unsigned int i = 0; i < 4; ++i ) {
276  if ( parity > 0 ) {
277  AC[i] = -2. * mb * C7eff * FF.FT_[i] / qsq + C9eff * FF.F_[i];
278  BC[i] = -2. * mb * C7eff * FF.GT_[i] / qsq - C9eff * FF.G_[i];
279  DC[i] = C10eff * FF.F_[i];
280  EC[i] = -C10eff * FF.G_[i];
281  } else {
282  AC[i] = -2. * mb * C7eff * FF.GT_[i] / qsq - C9eff * FF.G_[i];
283  BC[i] = -2. * mb * C7eff * FF.FT_[i] / qsq + C9eff * FF.F_[i];
284  DC[i] = -C10eff * FF.G_[i];
285  EC[i] = C10eff * FF.F_[i];
286  }
287  }
288 
289  // handle particle -> antiparticle in Hadronic currents
290  const double cv = ( isparticle > 0 ) ? 1.0 : -1.0 * parity;
291  const double ca = ( isparticle > 0 ) ? 1.0 : +1.0 * parity;
292  const double cs = ( isparticle > 0 ) ? 1.0 : +1.0 * parity;
293  const double cp = ( isparticle > 0 ) ? 1.0 : -1.0 * parity;
294 
295  if ( EvtSpinType::DIRAC == spin ) {
296  EvtVector4C H1[2][2]; // vector current
297  EvtVector4C H2[2][2]; // axial-vector
298 
299  EvtVector4C T[6];
300  // Hadronic currents
301  for ( int i = 0; i < 2; ++i ) {
302  for ( int j = 0; j < 2; ++j ) {
303  HadronicAmp( parent, lambda, T, i, j );
304 
305  H1[i][j] = ( cv * AC[0] * T[0] + ca * BC[0] * T[1] +
306  cs * AC[1] * T[2] + cp * BC[1] * T[3] +
307  cs * AC[2] * T[4] + cp * BC[2] * T[5] );
308 
309  H2[i][j] = ( cv * DC[0] * T[0] + ca * EC[0] * T[1] +
310  cs * DC[1] * T[2] + cp * EC[1] * T[3] +
311  cs * DC[2] * T[4] + cp * EC[2] * T[5] );
312  }
313  }
314 
315  // Spin sums
316  int spins[4];
317 
318  for ( int i = 0; i < 2; ++i ) {
319  for ( int ip = 0; ip < 2; ++ip ) {
320  for ( int j = 0; j < 2; ++j ) {
321  for ( int jp = 0; jp < 2; ++jp ) {
322  spins[0] = i;
323  spins[1] = ip;
324  spins[2] = j;
325  spins[3] = jp;
326 
327  EvtComplex M = H1[i][ip] * LV[j][jp] +
328  H2[i][ip] * LA[j][jp];
329 
330  amp.vertex( spins, M );
331  }
332  }
333  }
334  }
335  } else if ( EvtSpinType::RARITASCHWINGER == spin ) {
336  EvtVector4C T[8];
337 
338  EvtVector4C H1[2][4]; // vector current // swaped
339  EvtVector4C H2[2][4]; // axial-vector
340 
341  // Build hadronic amplitude
342  for ( int i = 0; i < 2; ++i ) {
343  for ( int j = 0; j < 4; ++j ) {
344  H1[i][j] = ( cv * AC[0] * T[0] + ca * BC[0] * T[1] +
345  cs * AC[1] * T[2] + cp * BC[1] * T[3] +
346  cs * AC[2] * T[4] + cp * BC[2] * T[5] +
347  cs * AC[3] * T[6] + cp * BC[3] * T[7] );
348  H2[i][j] = ( cv * DC[0] * T[0] + ca * EC[0] * T[1] +
349  cs * DC[1] * T[2] + cp * EC[1] * T[3] +
350  cs * DC[2] * T[4] + cp * EC[2] * T[5] +
351  cs * DC[3] * T[6] + cp * EC[3] * T[7] );
352  }
353  }
354 
355  // Spin sums
356  int spins[4];
357 
358  for ( int i = 0; i < 2; ++i ) {
359  for ( int ip = 0; ip < 4; ++ip ) {
360  for ( int j = 0; j < 2; ++j ) {
361  for ( int jp = 0; jp < 2; ++jp ) {
362  spins[0] = i;
363  spins[1] = ip;
364  spins[2] = j;
365  spins[3] = jp;
366 
367  EvtComplex M = H1[i][ip] * LV[j][jp] +
368  H2[i][ip] * LA[j][jp];
369 
370  amp.vertex( spins, M );
371  }
372  }
373  }
374  }
375  } else {
376  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
377  << " EvtRareLbToLll expects DIRAC or RARITASWINGER daughter "
378  << std::endl;
379  }
380 
381  return;
382 }
383 
384 // spin 1/2 daughters
385 
387  EvtVector4C* T, const int i, const int j )
388 {
389  const EvtDiracSpinor Sfinal = lambda->spParent( j );
390  const EvtDiracSpinor Sinit = parent->sp( i );
391 
392  const EvtVector4R L = lambda->getP4();
393 
394  EvtVector4R P;
395  P.set( parent->mass(), 0.0, 0.0, 0.0 );
396 
397  const double Pm = parent->mass();
398  const double Lm = lambda->mass();
399 
400  // \bar{u} \gamma^{\mu} u
401  T[0] = EvtLeptonVCurrent( Sfinal, Sinit );
402 
403  // \bar{u} \gamma^{\mu}\gamma^{5} u
404  T[1] = EvtLeptonACurrent( Sfinal, Sinit );
405 
406  // \bar{u} v^{\mu} u
407  T[2] = EvtLeptonSCurrent( Sfinal, Sinit ) * ( P / Pm );
408 
409  // \bar{u} v^{\mu} \gamma^{5} u
410  T[3] = EvtLeptonPCurrent( Sfinal, Sinit ) * ( P / Pm );
411 
412  // \bar{u} v^{\prime\mu} u
413  T[4] = EvtLeptonSCurrent( Sfinal, Sinit ) * ( L / Lm );
414 
415  // \bar{u} v^{\prime\mu} \gamma^{5}
416  T[5] = EvtLeptonPCurrent( Sfinal, Sinit ) * ( L / Lm );
417 
418  // Where:
419  // v = p_{\Lambda_b}/m_{\Lambda_b}
420  // v^{\prime} = p_{\Lambda}/m_{\Lambda}
421 
422  return;
423 }
424 
425 // spin 3/2 daughters
426 
428  EvtVector4C* T, const int i, const int j )
429 {
430  const EvtRaritaSchwinger Sfinal = lambda->spRSParent( j );
431  const EvtDiracSpinor Sinit = parent->sp( i );
432 
433  EvtVector4R P;
434  P.set( parent->mass(), 0.0, 0.0, 0.0 );
435 
436  const EvtVector4R L = lambda->getP4();
437 
438  EvtTensor4C ID;
439  ID.setdiag( 1.0, 1.0, 1.0, 1.0 );
440 
441  EvtDiracSpinor Sprime;
442 
443  for ( int i = 0; i < 4; i++ ) {
444  Sprime.set_spinor( i, Sfinal.getVector( i ) * P );
445  }
446 
447  const double Pmsq = P.mass2();
448  const double Pm = parent->mass();
449  const double PmLm = Pm * lambda->mass();
450 
451  EvtVector4C V1, V2;
452 
453  for ( int i = 0; i < 4; i++ ) {
454  V1.set( i, EvtLeptonSCurrent( Sfinal.getSpinor( i ), Sinit ) );
455  V2.set( i, EvtLeptonPCurrent( Sfinal.getSpinor( i ), Sinit ) );
456  }
457 
458  // \bar{u}_{alpha} v^{\alpha} \gamma^{\mu} u
459  T[0] = EvtLeptonVCurrent( Sprime, Sinit ) * ( 1 / Pm );
460 
461  // \bar{u}_{alpha} v^{\alpha} \gamma^{\mu} \gamma^{5} u
462  T[1] = EvtLeptonACurrent( Sprime, Sinit ) * ( 1 / Pm );
463 
464  // \bar{u}_{\alpha} v^{\alpha} v^{\mu} u
465  T[2] = EvtLeptonSCurrent( Sprime, Sinit ) * ( P / Pmsq );
466 
467  // \bar{u}_{\alpha} v^{\alpha} v^{\mu} \gamma^{5} u
468  T[3] = EvtLeptonPCurrent( Sprime, Sinit ) * ( P / Pmsq );
469 
470  // \bar{u}_{\alpha} v^{\alpha} v^{\prime \mu} u
471  T[4] = EvtLeptonSCurrent( Sprime, Sinit ) * ( L / PmLm );
472 
473  // \bar{u}_{\alpha} v^{\alpha} v^{\prime \mu} \gamma^{5} u
474  T[5] = EvtLeptonPCurrent( Sprime, Sinit ) * ( L / PmLm );
475 
476  // \bar{u}_{\alpha} g^{\alpha\mu} u
477  T[6] = ID.cont2( V1 );
478 
479  // \bar{u}_{\alpha} g^{\alpha\mu} \gamma^{5} u
480  T[7] = ID.cont2( V2 );
481 
482  // Where:
483  // v = p_{\Lambda_b}/m_{\Lambda_b}
484  // v^{\prime} = p_{\Lambda}/m_{\Lambda}
485 
486  return;
487 }
void decay(EvtParticle *parent) override
void setdiag(double t00, double t11, double t22, double t33)
void setDiag(int n)
virtual EvtDiracSpinor sp(int) const
void HadronicAmp(EvtParticle *parent, EvtParticle *lambda, EvtVector4C *T, const int i, const int j)
std::unique_ptr< EvtRareLbToLllWC > wcmodel_
static EvtSpinType::spintype getSpinType(EvtId i)
Definition: EvtPDL.cpp:377
std::string getArgStr(int j) const
Definition: EvtDecayBase.hh:78
void set(int, const EvtComplex &)
Definition: EvtVector4C.hh:98
void HadronicAmpRS(EvtParticle *parent, EvtParticle *lambda, EvtVector4C *T, const int i, const int j)
bool isParticle(EvtParticle *parent) const
EvtComplex EvtLeptonPCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
void calcAmp(EvtAmp &amp, EvtParticle *parent)
std::unique_ptr< EvtRareLbToLllFFBase > ffmodel_
double m_maxProbability
EvtVector4C cont2(const EvtVector4C &v4) const
std::string getName() override
void set_spinor(int i, const EvtComplex &sp)
EvtId getId() const
void set(int i, double d)
Definition: EvtVector4R.hh:167
EvtRaritaSchwinger boostTo(const EvtRaritaSchwinger &rs, const EvtVector4R p4)
EvtSpinDensity getSpinDensity()
Definition: EvtAmp.cpp:142
void init() override
virtual EvtDiracSpinor spParent(int) const
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
void setProbMax(double prbmx)
Definition: EvtId.hh:27
EvtVector4C EvtLeptonACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void vertex(const EvtComplex &amp)
Definition: EvtAmp.cpp:454
static const double pi
Definition: EvtConst.hh:26
EvtId getParentId() const
Definition: EvtDecayBase.hh:61
void initProbMax() override
double mass2() const
Definition: EvtVector4R.hh:100
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
EvtDecayBase * clone() override
Definition: EvtAmp.hh:30
void checkNDaug(int d1, int d2=-1)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtVector4R & getP4() const
double lambda(double q, double m1, double m2)
Definition: EvtFlatQ2.cpp:31
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
double mass() const
int getNDaug() const
Definition: EvtDecayBase.hh:65
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtVector4C getVector(int i) const
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void noLifeTime()
Definition: EvtParticle.hh:382
EvtAmp _amp2
Definition: EvtDecayAmp.hh:73
EvtDiracSpinor getSpinor(int i) const
int contains(const EvtId id)
Definition: EvtIdSet.cpp:422
static double getMass(EvtId i)
Definition: EvtPDL.cpp:319
EvtComplex EvtLeptonSCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void init(EvtId p, int ndaug, EvtId *daug)
Definition: EvtAmp.cpp:68
double normalizedProb(const EvtSpinDensity &d)
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67