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.
EvtRareLbToLllFF.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/EvtIdSet.hh"
24 #include "EvtGenBase/EvtPDL.hh"
26 
27 //-----------------------------------------------------------------------------
28 // Implementation file for class : EvtRareLbToLllFF
29 //
30 // 2013-11-25 : Thomas Blake
31 //-----------------------------------------------------------------------------
32 
33 //=============================================================================
34 // Standard constructor, initializes variables
35 //=============================================================================
36 
38  a0_( 0 ), a2_( 0 ), a4_( 0 ), al_( 0 ), ap_( 0 )
39 {
40 }
41 
43  const double ap ) :
44  a0_( 0 ), a2_( 0 ), a4_( 0 ), al_( al ), ap_( ap )
45 {
46 }
47 
49  const double a2,
50  const double a4,
51  const double al,
52  const double ap ) :
53  a0_( a0 ), a2_( a2 ), a4_( a4 ), al_( al ), ap_( ap )
54 {
55 }
56 
59  a0_( other.a0_ ),
60  a2_( other.a2_ ),
61  a4_( other.a4_ ),
62  al_( other.al_ ),
63  ap_( other.ap_ )
64 {
65 }
66 
69 {
70  return new EvtRareLbToLllFF::FormFactorDependence( a0_, a2_, a4_, al_, ap_ );
71 }
72 
74 {
75 }
76 
79  F1( other.F1 ),
80  F2( other.F2 ),
81  F3( other.F3 ),
82  F4( other.F4 ),
83  G1( other.G1 ),
84  G2( other.G2 ),
85  G3( other.G3 ),
86  G4( other.G4 ),
87  H1( other.H1 ),
88  H2( other.H2 ),
89  H3( other.H3 ),
90  H4( other.H4 ),
91  H5( other.H5 ),
92  H6( other.H6 )
93 {
94 }
95 
97  const double ap )
98 {
99  al_ = al;
100  ap_ = ap;
101 }
102 
104  const double a2,
105  const double a4,
106  const double al,
107  const double ap )
108 {
109  a0_ = a0;
110  a2_ = a2;
111  a4_ = a4;
112  al_ = al;
113  ap_ = ap;
114 }
115 
117 {
118  // Parameters for Lambda0
119  auto L1115 = std::make_unique<EvtRareLbToLllFF::FormFactorSet>();
120  L1115->F1.param( 1.21, 0.319, -0.0177, 0.387, 0.372 );
121  L1115->F2.param( -0.202, -0.219, 0.0103, 0.387, 0.372 );
122  L1115->F3.param( -0.0615, 0.00102, -0.00139, 0.387, 0.372 );
123  L1115->F4.param( 0.387, 0.372 );
124  L1115->G1.param( 0.927, 0.104, -0.00553, 0.387, 0.372 );
125  L1115->G2.param( -0.236, -0.233, 0.0110, 0.387, 0.372 );
126  L1115->G3.param( 0.0756, 0.0195, -0.00115, 0.387, 0.372 );
127  L1115->G4.param( 0.387, 0.372 );
128  L1115->H1.param( 0.936, 0.0722, -0.00643, 0.387, 0.372 );
129  L1115->H2.param( 0.227, 0.265, -0.0101, 0.387, 0.372 );
130  L1115->H3.param( -0.0757, -0.0195, 0.00116, 0.387, 0.372 );
131  L1115->H4.param( -0.0174, -0.00986, -0.000524, 0.387, 0.372 );
132  L1115->H5.param( 0.387, 0.372 );
133  L1115->H6.param( 0.387, 0.372 );
134 
135  // Parameters for Lambda(Lambda(1520)0)
136  auto L1520 = std::make_unique<EvtRareLbToLllFF::FormFactorSet>();
137  L1520->F1.param( -1.66, -0.295, 0.00924, 0.333, 0.308 );
138  L1520->F2.param( 0.544, 0.194, -0.00420, 0.333, 0.308 );
139  L1520->F3.param( 0.126, 0.00799, -0.000635, 0.333, 0.308 );
140  L1520->F4.param( -0.0330, -0.00977, 0.00211, 0.303, 0.308 );
141  L1520->G1.param( -0.964, -0.100, 0.00264, 0.333, 0.308 );
142  L1520->G2.param( 0.625, 0.219, -0.00508, 0.333, 0.308 );
143  L1520->G3.param( -0.183, -0.0380, 0.00351, 0.333, 0.308 );
144  L1520->G4.param( 0.0530, 0.0161, -0.00221, 0.333, 0.308 );
145  L1520->H1.param( -1.08, -0.0732, 0.00464, 0.333, 0.308 );
146  L1520->H2.param( -0.507, -0.246, 0.00309, 0.333, 0.308 );
147  L1520->H3.param( 0.187, 0.0295, -0.00107, 0.333, 0.308 );
148  L1520->H4.param( 0.0772, 0.0267, -0.00217, 0.333, 0.308 );
149  L1520->H5.param( -0.0517, -0.0173, 0.00259, 0.333, 0.308 );
150  L1520->H6.param( 0.0206, 0.00679, -0.000220, 0.333, 0.308 );
151 
152  FFMap_[EvtPDL::getId( "Lambda0" ).getId()] = L1115.get();
153  FFMap_[EvtPDL::getId( "anti-Lambda0" ).getId()] = L1115.get();
154  FFMap_[EvtPDL::getId( "Lambda(1520)0" ).getId()] = L1520.get();
155  FFMap_[EvtPDL::getId( "anti-Lambda(1520)0" ).getId()] = L1520.get();
156 
157  FF_ = {std::move( L1115 ), std::move( L1520 )};
158 
159  EvtGenReport( EVTGEN_INFO, "EvtGen" )
160  << " EvtRareLbToLll is using form factors from arXiv:1108.6129 "
161  << std::endl;
162 }
163 
164 //=============================================================================
165 
166 double EvtRareLbToLllFF::func( const double p,
168 {
169  static const double mq = 0.2848;
170  static const double mtilde = 1.122;
171 
172  const double asq = 0.5 * ( dep.al_ * dep.al_ + dep.ap_ * dep.ap_ );
173  const double psq = p * p;
174 
175  return ( dep.a0_ + dep.a2_ * psq + dep.a4_ * psq * psq ) *
176  exp( -( 3. * mq * mq * psq ) / ( 2. * mtilde * mtilde * asq ) );
177 }
178 
182 {
183  const double M = lambda->mass();
184  const double MB = parent->mass();
185 
186  const double vdotv = calculateVdotV( parent, lambda );
187  const double p = lambda->getP4().d3mag();
188 
189  FF.F_[0] = func( p, dep.F1 );
190  FF.F_[1] = func( p, dep.F2 );
191  FF.F_[2] = func( p, dep.F3 );
192 
193  FF.G_[0] = func( p, dep.G1 );
194  FF.G_[1] = func( p, dep.G2 );
195  FF.G_[2] = func( p, dep.G3 );
196 
197  const double H1 = func( p, dep.H1 );
198  const double H2 = func( p, dep.H2 );
199  const double H3 = func( p, dep.H3 );
200  const double H4 = func( p, dep.H4 );
201 
202  if ( isNatural( lambda ) ) {
203  FF.FT_[0] = -( MB + M ) * H1 - ( MB - M * vdotv ) * H2 -
204  ( MB * vdotv - M ) * H3;
205  FF.FT_[1] = MB * H1 + ( MB - M ) * H2 + ( MB * vdotv - M ) * H4;
206  FF.FT_[2] = M * H1 + ( MB - M ) * H3 - ( MB - M * vdotv ) * H4;
207 
208  FF.GT_[0] = ( MB - M ) * H1 - M * ( 1. - vdotv ) * H2 -
209  MB * ( 1. - vdotv ) * H3;
210  FF.GT_[1] = MB * H1 - M * H2 - MB * H3;
211  FF.GT_[2] = M * H1 + M * H2 + MB * H3;
212  } else {
213  FF.FT_[0] = ( MB - M ) * H1 - ( MB - M * vdotv ) * H2 -
214  ( MB * vdotv - M ) * H3;
215  FF.FT_[1] = MB * H1 - ( MB + M ) * H2 + ( MB * vdotv - M ) * H4;
216  FF.FT_[2] = M * H1 - ( MB + M ) * H3 - ( MB - M * vdotv ) * H4;
217 
218  FF.GT_[0] = -( MB + M ) * H1 + M * ( 1. + vdotv ) * H2 +
219  MB * ( 1. + vdotv ) * H3;
220  FF.GT_[1] = MB * H1 - M * H2 - MB * H3;
221  FF.GT_[2] = M * H1 - M * H2 - MB * H3;
222  }
223 }
224 
229 {
230  const double M = lambda->mass();
231  const double MB = parent->mass();
232 
233  const double vdotv = calculateVdotV( parent, lambda );
234  const double p = lambda->getP4().d3mag();
235 
236  FF.F_[0] = func( p, FFset.F1 );
237  FF.F_[1] = func( p, FFset.F2 );
238  FF.F_[2] = func( p, FFset.F3 );
239  FF.F_[3] = func( p, FFset.F4 );
240 
241  FF.G_[0] = func( p, FFset.G1 );
242  FF.G_[1] = func( p, FFset.G2 );
243  FF.G_[2] = func( p, FFset.G3 );
244  FF.G_[3] = func( p, FFset.G4 );
245 
246  const double H1 = func( p, FFset.H1 );
247  const double H2 = func( p, FFset.H2 );
248  const double H3 = func( p, FFset.H3 );
249  const double H4 = func( p, FFset.H4 );
250  const double H5 = func( p, FFset.H5 );
251  const double H6 = func( p, FFset.H6 );
252 
253  if ( isNatural( lambda ) ) {
254  FF.FT_[0] = -( MB + M ) * H1 - ( MB - M * vdotv ) * H2 -
255  ( MB * vdotv - M ) * H3 - MB * H5;
256  FF.FT_[1] = MB * H1 + ( MB - M ) * H2 + ( MB * vdotv - M ) * H4 - MB * H6;
257  FF.FT_[2] = M * H1 + ( MB - M ) * H3 - ( MB - M * vdotv ) * H4;
258  FF.FT_[3] = ( MB - M ) * H5 + ( MB - M * vdotv ) * H6;
259 
260  FF.GT_[0] = ( MB - M ) * H1 - M * ( 1. - vdotv ) * H2 -
261  MB * ( 1. - vdotv ) * H3 + MB * H5 + M * H6;
262  FF.GT_[1] = MB * H1 - M * H2 - MB * H3;
263  FF.GT_[2] = M * H1 + M * H2 + MB * H3 - M * H6;
264  FF.GT_[3] = ( MB + M ) * H5 + M * ( 1. + vdotv ) * H6;
265  } else {
266  FF.FT_[0] = ( MB - M ) * H1 - ( MB - M * vdotv ) * H2 -
267  ( MB * vdotv - M ) * H3 - MB * H5;
268  FF.FT_[1] = MB * H1 - ( MB + M ) * H2 + ( MB * vdotv - M ) * H4 - MB * H6;
269  FF.FT_[2] = M * H1 - ( MB + M ) * H3 - ( MB - M * vdotv ) * H4;
270  FF.FT_[3] = -( MB + M ) * H5 + ( MB - M * vdotv ) * H6;
271 
272  FF.GT_[0] = -( MB + M ) * H1 + M * ( 1. + vdotv ) * H2 +
273  MB * ( 1. + vdotv ) * H3 + MB * H5 + M * H6;
274  FF.GT_[1] = MB * H1 - M * H2 - MB * H3;
275  FF.GT_[2] = M * H1 - M * H2 - MB * H3 - M * H6;
276  FF.GT_[3] = -( MB - M ) * H5 - M * ( 1. - vdotv ) * H6;
277  }
278 }
279 
282 {
283  // Find the FF information for this particle, start by setting all to zero
284  FF.areZero();
285 
286  // Are the FF's for the particle known?
287  auto it = FFMap_.find( lambda->getId().getId() );
288 
289  if ( it == FFMap_.end() ) {
290  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
291  << " EvtRareLbToLll does not contain FF for " << lambda->getId()
292  << std::endl;
293  return;
294  }
295 
296  // Split by spin 1/2, spin 3/2
297  const int spin = EvtPDL::getSpinType( lambda->getId() );
298 
299  if ( EvtSpinType::DIRAC == spin ) {
300  DiracFF( parent, lambda, *( it->second ), FF );
301  } else if ( spin == EvtSpinType::RARITASCHWINGER ) {
302  RaritaSchwingerFF( parent, lambda, *( it->second ), FF );
303  } else {
304  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
305  << " EvtRareLbToLll expects DIRAC or RARITASWINGER daughter "
306  << std::endl; // should add a warning here
307  return;
308  }
309 
310  return;
311 }
void DiracFF(EvtParticle *parent, EvtParticle *lambda, EvtRareLbToLllFF::FormFactorSet &FFset, EvtRareLbToLllFF::FormFactors &FF)
EvtRareLbToLllFF::FormFactorDependence F2
EvtRareLbToLllFF::FormFactorDependence G1
std::map< int, EvtRareLbToLllFF::FormFactorSet * > FFMap_
EvtRareLbToLllFF::FormFactorDependence H1
static EvtSpinType::spintype getSpinType(EvtId i)
Definition: EvtPDL.cpp:377
std::array< std::unique_ptr< EvtRareLbToLllFF::FormFactorSet >, 2 > FF_
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
EvtRareLbToLllFF::FormFactorDependence H5
EvtRareLbToLllFF::FormFactorDependence F1
double calculateVdotV(EvtParticle *parent, EvtParticle *lambda) const
EvtRareLbToLllFF::FormFactorDependence G3
EvtRareLbToLllFF::FormFactorDependence H6
const double a2
EvtRareLbToLllFF::FormFactorDependence H2
void param(const double al, const double ap)
void RaritaSchwingerFF(EvtParticle *parent, EvtParticle *lambda, EvtRareLbToLllFF::FormFactorSet &FFset, EvtRareLbToLllFF::FormFactors &FF)
double func(const double p, EvtRareLbToLllFF::FormFactorDependence &dep)
EvtRareLbToLllFF::FormFactorDependence H3
void getFF(EvtParticle *parent, EvtParticle *lambda, EvtRareLbToLllFFBase::FormFactors &FF) override
EvtRareLbToLllFF::FormFactorDependence F3
EvtRareLbToLllFF::FormFactorDependence F4
const double a4
FormFactorDependence * clone() const
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
EvtRareLbToLllFF::FormFactorDependence H4
double lambda(double q, double m1, double m2)
Definition: EvtFlatQ2.cpp:31
double mass() const
int getId() const
Definition: EvtId.hh:42
EvtComplex exp(const EvtComplex &c)
Definition: EvtComplex.hh:240
void init() override
bool isNatural(EvtParticle *lambda)
EvtRareLbToLllFF::FormFactorDependence G4
Index other(Index i, Index j)
Definition: EvtCyclic3.cpp:156
EvtRareLbToLllFF::FormFactorDependence G2