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