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.
EvtbTosllScalarAmp.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"
24 #include "EvtGenBase/EvtConst.hh"
26 #include "EvtGenBase/EvtGenKine.hh"
27 #include "EvtGenBase/EvtId.hh"
28 #include "EvtGenBase/EvtIdSet.hh"
29 #include "EvtGenBase/EvtPDL.hh"
31 #include "EvtGenBase/EvtPatches.hh"
32 #include "EvtGenBase/EvtReport.hh"
35 
38 
40  EvtbTosllFF* formFactors )
41 {
42  //Add the lepton and neutrino 4 momenta to find q2
43 
44  EvtVector4R q = parent->getDaug( 1 )->getP4() + parent->getDaug( 2 )->getP4();
45  double q2 = ( q.mass2() );
46 
47  double fp( 0. ), f0( 0. ), ft( 0. );
48  double mesonmass = parent->getDaug( 0 )->mass();
49  double parentmass = parent->mass();
50 
51  formFactors->getScalarFF( parent->getId(), parent->getDaug( 0 )->getId(),
52  q2, mesonmass, fp, f0, ft );
53 
54  EvtId daught = parent->getDaug( 0 )->getId();
55  bool btod = false;
56  bool nnlo = true;
57  if ( daught == EvtPDL::getId( std::string( "pi+" ) ) ||
58  daught == EvtPDL::getId( std::string( "pi-" ) ) ||
59  daught == EvtPDL::getId( std::string( "pi0" ) ) ||
60  daught == EvtPDL::getId( std::string( "eta" ) ) ||
61  daught == EvtPDL::getId( std::string( "eta'" ) ) )
62  btod = true;
63 
64  EvtVector4R p4b;
65  p4b.set( parent->mass(), 0.0, 0.0, 0.0 );
66 
67  EvtVector4C l11, l12;
68  EvtVector4C l21, l22;
69 
70  EvtVector4C a11, a12;
71  EvtVector4C a21, a22;
72 
73  EvtId l_num = parent->getDaug( 1 )->getId();
74 
75  EvtVector4C T1, T2;
76 
77  EvtVector4R phat = p4b / parentmass;
78  EvtVector4R qhat = q / parentmass;
79 
80  EvtComplex c7eff = EvtbTosllAmp::GetC7Eff( q2, nnlo );
81  EvtComplex c9eff = EvtbTosllAmp::GetC9Eff( q2, nnlo, btod );
82  EvtComplex c10eff = EvtbTosllAmp::GetC10Eff( q2, nnlo );
83 
84  //double mbhat=1;
85  double mbhat = 4.4 / ( parentmass );
86  //double mkhat = 0.15;
87  double mkhat = mesonmass / ( parentmass );
88  double shat = q2 / ( parentmass * parentmass );
89 
90  double fm = ( f0 - fp ) * ( 1 - mkhat * mkhat ) / shat;
91 
92  EvtComplex aprime;
93  aprime = c9eff * fp + 2.0 * mbhat * c7eff * ft / ( 1 + mkhat );
94  EvtComplex bprime;
95  bprime = c9eff * fm - 2 * mbhat * c7eff * ft * ( 1 - mkhat ) / shat;
96 
97  EvtComplex cprime;
98  cprime = c10eff * fp;
99  EvtComplex dprime;
100  dprime = c10eff * fm;
101 
102  static EvtIdSet leptons( "e-", "mu-", "tau-" );
103  static EvtIdSet antileptons( "e+", "mu+", "tau+" );
104 
105  if ( leptons.contains( l_num ) ) {
106  T1 = aprime * phat + bprime * qhat;
107  T2 = cprime * phat + dprime * qhat;
108 
109  l11 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 0 ),
110  parent->getDaug( 2 )->spParent( 0 ) );
111  l21 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 1 ),
112  parent->getDaug( 2 )->spParent( 0 ) );
113  l12 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 0 ),
114  parent->getDaug( 2 )->spParent( 1 ) );
115  l22 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 1 ),
116  parent->getDaug( 2 )->spParent( 1 ) );
117  a11 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 0 ),
118  parent->getDaug( 2 )->spParent( 0 ) );
119  a21 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 1 ),
120  parent->getDaug( 2 )->spParent( 0 ) );
121  a12 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 0 ),
122  parent->getDaug( 2 )->spParent( 1 ) );
123  a22 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 1 ),
124  parent->getDaug( 2 )->spParent( 1 ) );
125  } else {
126  if ( antileptons.contains( l_num ) ) {
127  T1 = aprime * phat + bprime * qhat;
128  T2 = cprime * phat + dprime * qhat;
129 
130  l11 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 1 ),
131  parent->getDaug( 2 )->spParent( 1 ) );
132  l21 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 0 ),
133  parent->getDaug( 2 )->spParent( 1 ) );
134  l12 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 1 ),
135  parent->getDaug( 2 )->spParent( 0 ) );
136  l22 = EvtLeptonVCurrent( parent->getDaug( 1 )->spParent( 0 ),
137  parent->getDaug( 2 )->spParent( 0 ) );
138 
139  a11 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 1 ),
140  parent->getDaug( 2 )->spParent( 1 ) );
141  a21 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 0 ),
142  parent->getDaug( 2 )->spParent( 1 ) );
143  a12 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 1 ),
144  parent->getDaug( 2 )->spParent( 0 ) );
145  a22 = EvtLeptonACurrent( parent->getDaug( 1 )->spParent( 0 ),
146  parent->getDaug( 2 )->spParent( 0 ) );
147 
148  } else {
149  EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Wrong lepton number\n";
150  }
151  }
152 
153  amp.vertex( 0, 0, l11 * T1 + a11 * T2 );
154  amp.vertex( 0, 1, l12 * T1 + a12 * T2 );
155  amp.vertex( 1, 0, l21 * T1 + a21 * T2 );
156  amp.vertex( 1, 1, l22 * T1 + a22 * T2 );
157 }
EvtComplex GetC7Eff(double q2, bool nnlo=true)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
EvtId getId() const
void set(int i, double d)
Definition: EvtVector4R.hh:167
virtual EvtDiracSpinor spParent(int) const
EvtComplex GetC10Eff(double q2, bool nnlo=true)
Definition: EvtId.hh:27
EvtVector4C EvtLeptonACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void vertex(const EvtComplex &amp)
Definition: EvtAmp.cpp:454
double mass2() const
Definition: EvtVector4R.hh:100
Definition: EvtAmp.hh:30
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
double mass() const
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtComplex GetC9Eff(double q2, bool nnlo=true, bool btod=false)
int contains(const EvtId id)
Definition: EvtIdSet.cpp:422
virtual void getScalarFF(EvtId, EvtId, double, double, double &, double &, double &)
Definition: EvtbTosllFF.hh:32
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtbTosllFF *formFactors) override