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
EvtRareLbToLllFF.cpp
Go to the documentation of this file.
1
2/***********************************************************************
3* Copyright 1998-2022 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
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
41
43 const double ap ) :
44 m_a0( 0 ), m_a2( 0 ), m_a4( 0 ), m_al( al ), m_ap( ap )
45{
46}
47
49 const double a2,
50 const double a4,
51 const double al,
52 const double ap ) :
53 m_a0( a0 ), m_a2( a2 ), m_a4( a4 ), m_al( al ), m_ap( ap )
54{
55}
56
59 m_a0( other.m_a0 ),
60 m_a2( other.m_a2 ),
61 m_a4( other.m_a4 ),
62 m_al( other.m_al ),
63 m_ap( other.m_ap )
64{
65}
66
73
77
79 const EvtRareLbToLllFF::FormFactorSet& other ) :
80 m_F1( other.m_F1 ),
81 m_F2( other.m_F2 ),
82 m_F3( other.m_F3 ),
83 m_F4( other.m_F4 ),
84 m_G1( other.m_G1 ),
85 m_G2( other.m_G2 ),
86 m_G3( other.m_G3 ),
87 m_G4( other.m_G4 ),
88 m_H1( other.m_H1 ),
89 m_H2( other.m_H2 ),
90 m_H3( other.m_H3 ),
91 m_H4( other.m_H4 ),
92 m_H5( other.m_H5 ),
93 m_H6( other.m_H6 )
94{
95}
96
98 const double ap )
99{
100 m_al = al;
101 m_ap = ap;
102}
103
105 const double a2,
106 const double a4,
107 const double al,
108 const double ap )
109{
110 m_a0 = a0;
111 m_a2 = a2;
112 m_a4 = a4;
113 m_al = al;
114 m_ap = ap;
115}
116
118{
119 // Parameters for Lambda0
120 auto L1115 = std::make_unique<EvtRareLbToLllFF::FormFactorSet>();
121 L1115->m_F1.param( 1.21, 0.319, -0.0177, 0.387, 0.372 );
122 L1115->m_F2.param( -0.202, -0.219, 0.0103, 0.387, 0.372 );
123 L1115->m_F3.param( -0.0615, 0.00102, -0.00139, 0.387, 0.372 );
124 L1115->m_F4.param( 0.387, 0.372 );
125 L1115->m_G1.param( 0.927, 0.104, -0.00553, 0.387, 0.372 );
126 L1115->m_G2.param( -0.236, -0.233, 0.0110, 0.387, 0.372 );
127 L1115->m_G3.param( 0.0756, 0.0195, -0.00115, 0.387, 0.372 );
128 L1115->m_G4.param( 0.387, 0.372 );
129 L1115->m_H1.param( 0.936, 0.0722, -0.00643, 0.387, 0.372 );
130 L1115->m_H2.param( 0.227, 0.265, -0.0101, 0.387, 0.372 );
131 L1115->m_H3.param( -0.0757, -0.0195, 0.00116, 0.387, 0.372 );
132 L1115->m_H4.param( -0.0174, -0.00986, -0.000524, 0.387, 0.372 );
133 L1115->m_H5.param( 0.387, 0.372 );
134 L1115->m_H6.param( 0.387, 0.372 );
135
136 // Parameters for Lambda(Lambda(1520)0)
137 auto L1520 = std::make_unique<EvtRareLbToLllFF::FormFactorSet>();
138 L1520->m_F1.param( -1.66, -0.295, 0.00924, 0.333, 0.308 );
139 L1520->m_F2.param( 0.544, 0.194, -0.00420, 0.333, 0.308 );
140 L1520->m_F3.param( 0.126, 0.00799, -0.000635, 0.333, 0.308 );
141 L1520->m_F4.param( -0.0330, -0.00977, 0.00211, 0.303, 0.308 );
142 L1520->m_G1.param( -0.964, -0.100, 0.00264, 0.333, 0.308 );
143 L1520->m_G2.param( 0.625, 0.219, -0.00508, 0.333, 0.308 );
144 L1520->m_G3.param( -0.183, -0.0380, 0.00351, 0.333, 0.308 );
145 L1520->m_G4.param( 0.0530, 0.0161, -0.00221, 0.333, 0.308 );
146 L1520->m_H1.param( -1.08, -0.0732, 0.00464, 0.333, 0.308 );
147 L1520->m_H2.param( -0.507, -0.246, 0.00309, 0.333, 0.308 );
148 L1520->m_H3.param( 0.187, 0.0295, -0.00107, 0.333, 0.308 );
149 L1520->m_H4.param( 0.0772, 0.0267, -0.00217, 0.333, 0.308 );
150 L1520->m_H5.param( -0.0517, -0.0173, 0.00259, 0.333, 0.308 );
151 L1520->m_H6.param( 0.0206, 0.00679, -0.000220, 0.333, 0.308 );
152
153 m_FFMap[EvtPDL::getId( "Lambda0" ).getId()] = L1115.get();
154 m_FFMap[EvtPDL::getId( "anti-Lambda0" ).getId()] = L1115.get();
155 m_FFMap[EvtPDL::getId( "Lambda(1520)0" ).getId()] = L1520.get();
156 m_FFMap[EvtPDL::getId( "anti-Lambda(1520)0" ).getId()] = L1520.get();
157
158 m_FF = { std::move( L1115 ), std::move( L1520 ) };
159
160 EvtGenReport( EVTGEN_INFO, "EvtGen" )
161 << " EvtRareLbToLll is using form factors from arXiv:1108.6129 "
162 << std::endl;
163}
164
165//=============================================================================
166
168 const double p, const EvtRareLbToLllFF::FormFactorDependence& dep ) const
169{
170 static const double mq = 0.2848;
171 static const double mtilde = 1.122;
172
173 const double asq = 0.5 * ( dep.m_al * dep.m_al + dep.m_ap * dep.m_ap );
174 const double psq = p * p;
175
176 return ( dep.m_a0 + dep.m_a2 * psq + dep.m_a4 * psq * psq ) *
177 exp( -( 3. * mq * mq * psq ) / ( 2. * mtilde * mtilde * asq ) );
178}
179
181 const EvtParticle& lambda,
184{
185 const double M = lambda.mass();
186 const double MB = parent.mass();
187
188 const double vdotv = calculateVdotV( parent, lambda );
189 const double p = lambda.getP4().d3mag();
190
191 FF.m_F[0] = func( p, dep.m_F1 );
192 FF.m_F[1] = func( p, dep.m_F2 );
193 FF.m_F[2] = func( p, dep.m_F3 );
194
195 FF.m_G[0] = func( p, dep.m_G1 );
196 FF.m_G[1] = func( p, dep.m_G2 );
197 FF.m_G[2] = func( p, dep.m_G3 );
198
199 const double H1 = func( p, dep.m_H1 );
200 const double H2 = func( p, dep.m_H2 );
201 const double H3 = func( p, dep.m_H3 );
202 const double H4 = func( p, dep.m_H4 );
203
204 if ( isNatural( lambda ) ) {
205 FF.m_FT[0] = -( MB + M ) * H1 - ( MB - M * vdotv ) * H2 -
206 ( MB * vdotv - M ) * H3;
207 FF.m_FT[1] = MB * H1 + ( MB - M ) * H2 + ( MB * vdotv - M ) * H4;
208 FF.m_FT[2] = M * H1 + ( MB - M ) * H3 - ( MB - M * vdotv ) * H4;
209
210 FF.m_GT[0] = ( MB - M ) * H1 - M * ( 1. - vdotv ) * H2 -
211 MB * ( 1. - vdotv ) * H3;
212 FF.m_GT[1] = MB * H1 - M * H2 - MB * H3;
213 FF.m_GT[2] = M * H1 + M * H2 + MB * H3;
214 } else {
215 FF.m_FT[0] = ( MB - M ) * H1 - ( MB - M * vdotv ) * H2 -
216 ( MB * vdotv - M ) * H3;
217 FF.m_FT[1] = MB * H1 - ( MB + M ) * H2 + ( MB * vdotv - M ) * H4;
218 FF.m_FT[2] = M * H1 - ( MB + M ) * H3 - ( MB - M * vdotv ) * H4;
219
220 FF.m_GT[0] = -( MB + M ) * H1 + M * ( 1. + vdotv ) * H2 +
221 MB * ( 1. + vdotv ) * H3;
222 FF.m_GT[1] = MB * H1 - M * H2 - MB * H3;
223 FF.m_GT[2] = M * H1 - M * H2 - MB * H3;
224 }
225}
226
228 const EvtParticle& parent, const EvtParticle& lambda,
231{
232 const double M = lambda.mass();
233 const double MB = parent.mass();
234
235 const double vdotv = calculateVdotV( parent, lambda );
236 const double p = lambda.getP4().d3mag();
237
238 FF.m_F[0] = func( p, FFset.m_F1 );
239 FF.m_F[1] = func( p, FFset.m_F2 );
240 FF.m_F[2] = func( p, FFset.m_F3 );
241 FF.m_F[3] = func( p, FFset.m_F4 );
242
243 FF.m_G[0] = func( p, FFset.m_G1 );
244 FF.m_G[1] = func( p, FFset.m_G2 );
245 FF.m_G[2] = func( p, FFset.m_G3 );
246 FF.m_G[3] = func( p, FFset.m_G4 );
247
248 const double H1 = func( p, FFset.m_H1 );
249 const double H2 = func( p, FFset.m_H2 );
250 const double H3 = func( p, FFset.m_H3 );
251 const double H4 = func( p, FFset.m_H4 );
252 const double H5 = func( p, FFset.m_H5 );
253 const double H6 = func( p, FFset.m_H6 );
254
255 if ( isNatural( lambda ) ) {
256 FF.m_FT[0] = -( MB + M ) * H1 - ( MB - M * vdotv ) * H2 -
257 ( MB * vdotv - M ) * H3 - MB * H5;
258 FF.m_FT[1] = MB * H1 + ( MB - M ) * H2 + ( MB * vdotv - M ) * H4 -
259 MB * H6;
260 FF.m_FT[2] = M * H1 + ( MB - M ) * H3 - ( MB - M * vdotv ) * H4;
261 FF.m_FT[3] = ( MB - M ) * H5 + ( MB - M * vdotv ) * H6;
262
263 FF.m_GT[0] = ( MB - M ) * H1 - M * ( 1. - vdotv ) * H2 -
264 MB * ( 1. - vdotv ) * H3 + MB * H5 + M * H6;
265 FF.m_GT[1] = MB * H1 - M * H2 - MB * H3;
266 FF.m_GT[2] = M * H1 + M * H2 + MB * H3 - M * H6;
267 FF.m_GT[3] = ( MB + M ) * H5 + M * ( 1. + vdotv ) * H6;
268 } else {
269 FF.m_FT[0] = ( MB - M ) * H1 - ( MB - M * vdotv ) * H2 -
270 ( MB * vdotv - M ) * H3 - MB * H5;
271 FF.m_FT[1] = MB * H1 - ( MB + M ) * H2 + ( MB * vdotv - M ) * H4 -
272 MB * H6;
273 FF.m_FT[2] = M * H1 - ( MB + M ) * H3 - ( MB - M * vdotv ) * H4;
274 FF.m_FT[3] = -( MB + M ) * H5 + ( MB - M * vdotv ) * H6;
275
276 FF.m_GT[0] = -( MB + M ) * H1 + M * ( 1. + vdotv ) * H2 +
277 MB * ( 1. + vdotv ) * H3 + MB * H5 + M * H6;
278 FF.m_GT[1] = MB * H1 - M * H2 - MB * H3;
279 FF.m_GT[2] = M * H1 - M * H2 - MB * H3 - M * H6;
280 FF.m_GT[3] = -( MB - M ) * H5 - M * ( 1. - vdotv ) * H6;
281 }
282}
283
285 const EvtParticle& lambda,
287{
288 // Find the FF information for this particle, start by setting all to zero
289 FF.areZero();
290
291 // Are the FF's for the particle known?
292 auto it = m_FFMap.find( lambda.getId().getId() );
293
294 if ( it == m_FFMap.end() ) {
295 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
296 << " EvtRareLbToLll does not contain FF for " << lambda.getId()
297 << std::endl;
298 return;
299 }
300
301 // Split by spin 1/2, spin 3/2
302 const int spin = EvtPDL::getSpinType( lambda.getId() );
303
304 if ( EvtSpinType::DIRAC == spin ) {
305 DiracFF( parent, lambda, *( it->second ), FF );
306 } else if ( spin == EvtSpinType::RARITASCHWINGER ) {
307 RaritaSchwingerFF( parent, lambda, *( it->second ), FF );
308 } else {
309 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
310 << " EvtRareLbToLll expects DIRAC or RARITASWINGER daughter "
311 << std::endl; // should add a warning here
312 return;
313 }
314
315 return;
316}
EvtComplex exp(const EvtComplex &c)
double lambda(double q, double m1, double m2)
Definition EvtFlatQ2.cpp:30
const double a4
const double a2
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
int getId() const
Definition EvtId.hh:41
static EvtSpinType::spintype getSpinType(EvtId i)
Definition EvtPDL.cpp:371
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
double mass() const
double calculateVdotV(const EvtParticle &parent, const EvtParticle &lambda) const
bool isNatural(const EvtParticle &lambda) const
void param(const double al, const double ap)
FormFactorDependence * clone() const
EvtRareLbToLllFF::FormFactorDependence m_H3
EvtRareLbToLllFF::FormFactorDependence m_F2
EvtRareLbToLllFF::FormFactorDependence m_H6
EvtRareLbToLllFF::FormFactorDependence m_G2
EvtRareLbToLllFF::FormFactorDependence m_G3
EvtRareLbToLllFF::FormFactorDependence m_H5
EvtRareLbToLllFF::FormFactorDependence m_G1
EvtRareLbToLllFF::FormFactorDependence m_H2
EvtRareLbToLllFF::FormFactorDependence m_G4
EvtRareLbToLllFF::FormFactorDependence m_F1
EvtRareLbToLllFF::FormFactorDependence m_H1
EvtRareLbToLllFF::FormFactorDependence m_F3
EvtRareLbToLllFF::FormFactorDependence m_H4
EvtRareLbToLllFF::FormFactorDependence m_F4
void init() override
void getFF(const EvtParticle &parent, const EvtParticle &lambda, EvtRareLbToLllFFBase::FormFactors &FF) const override
std::map< int, EvtRareLbToLllFF::FormFactorSet * > m_FFMap
void RaritaSchwingerFF(const EvtParticle &parent, const EvtParticle &lambda, const EvtRareLbToLllFF::FormFactorSet &FFset, EvtRareLbToLllFF::FormFactors &FF) const
void DiracFF(const EvtParticle &parent, const EvtParticle &lambda, const EvtRareLbToLllFF::FormFactorSet &FFset, EvtRareLbToLllFF::FormFactors &FF) const
double func(const double p, const EvtRareLbToLllFF::FormFactorDependence &dep) const
std::array< std::unique_ptr< EvtRareLbToLllFF::FormFactorSet >, 2 > m_FF