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
EvtBCVFF.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/EvtId.hh"
24#include "EvtGenBase/EvtPDL.hh"
26
27#include <iostream>
28#include <math.h>
29#include <stdlib.h>
30#include <string>
31
32using namespace std;
33
34EvtBCVFF::EvtBCVFF( int idV, int fit )
35{
36 m_idVector = idV;
37 m_whichfit = fit;
44 return;
45}
46
47void EvtBCVFF::getvectorff( EvtId, EvtId, double t, double, double* a1f,
48 double* a2f, double* vf, double* a0f )
49{
50 double q2 = t;
51
52 if ( m_whichfit == 0 ) {
53 *vf = 0;
54 *a0f = 0;
55 *a1f = 1;
56 *a2f = 0;
57 return;
58 }
59
60 if ( m_idVector == EvtPDL::getId( "J/psi" ).getId() ) { // Bc -> J/psi
61 if ( m_whichfit ==
62 1 ) { // SR form factor set from [Kiselev, hep-ph/0211021]
63 double Mpole2 = 4.5 * 4.5, den = 1. / ( 1. - q2 / Mpole2 );
64 double FV = 0.11 * den, FAp = -0.074 * den, FA0 = 5.9 * den,
65 FAm = 0.12 * den;
66 *vf = ( m_MBc + m_Mpsi ) * FV;
67 *a2f = -( m_MBc + m_Mpsi ) * FAp;
68 *a1f = FA0 / ( m_MBc + m_Mpsi );
69 *a0f = ( q2 * FAm + ( m_MBc + m_Mpsi ) * ( *a1f ) -
70 ( m_MBc - m_Mpsi ) * ( *a2f ) ) /
71 ( 2 * m_Mpsi );
72 return;
73 } else if ( m_whichfit ==
74 2 ) { // form factor set from [Ebert, hep-ph/0306306]
75 *vf = ( 0.49077824756158533 - 0.0012925655191347828 * q2 ) /
76 ( 1 - 0.06292520325875656 * q2 );
77 *a0f = ( 0.4160345034630221 - 0.0024720095310225023 * q2 ) /
78 ( 1 - 0.061603451915567785 * q2 );
79 *a1f = ( 0.4970212860605933 - 0.0067519730024654745 * q2 ) /
80 ( 1 - 0.050487026667172176 * q2 );
81 *a2f = ( 0.7315284919705497 + 0.0014263826220727142 * q2 -
82 0.0006946090066269195 * q2 * q2 ) /
83 ( 1 - 0.04885587273651653 * q2 );
84 return;
85 } else {
86 EvtGenReport( EVTGEN_ERROR, "EvtBCVFF" )
87 << "Must choose 0 (a1f = 1), 1 (Kiselev), or 2 (Ebert).\n";
88 ::abort();
89 }
90 } else if ( m_idVector ==
91 EvtPDL::getId( "psi(2S)" ).getId() ) { // Bc -> psi((2S)
92 if ( m_whichfit == 1 ) {
93 double Mpole2 = 4.5 * 4.5, den = 1. / ( 1. - q2 / Mpole2 );
94 double FV = 0.11 * den * m_kappa / 3.1,
95 FAp = -0.074 * den * m_kappa / 4.9,
96 FA0 = 5.9 * den * m_kappa / 3.5,
97 FAm = 0.12 * den * m_kappa / 2.3;
98 *vf = ( m_MBc + m_Mpsi2S ) * FV;
99 *a2f = -( m_MBc + m_Mpsi2S ) * FAp;
100 *a1f = FA0 / ( m_MBc + m_Mpsi2S );
101 *a0f = ( q2 * FAm + ( m_MBc + m_Mpsi2S ) * ( *a1f ) -
102 ( m_MBc - m_Mpsi2S ) * ( *a2f ) ) /
103 ( 2 * m_Mpsi2S );
104 return;
105 } else if ( m_whichfit == 2 ) {
106 *vf = ( 0.24177223968739653 - 0.053589051007278135 * q2 ) /
107 ( 1 - 0.0977848994260899 * q2 );
108 *a0f = ( 0.23996026570086615 - 0.03530198514007337 * q2 ) /
109 ( 1 - 0.09371162519983989 * q2 );
110 *a1f = ( 0.17418379258849329 - 0.004129699022085851 * q2 * q2 ) /
111 ( 1 + 0.06607665248402918 * q2 );
112 *a2f = ( 0.1352376939112041 - 0.040361722565209444 * q2 +
113 0.003343515369431853 * q2 * q2 ) /
114 ( 1 - 0.1463698128333418 * q2 );
115 return;
116 } else {
117 EvtGenReport( EVTGEN_ERROR, "EvtBCVFF" )
118 << "Must choose 0 (a1f = 1), 1 (Kiselev), or 2 (Ebert).\n";
119 ::abort();
120 }
121 } else if ( m_idVector == EvtPDL::getId( "chi_c1" ).getId() ) { // Bc -> chi_c1
122 if ( m_whichfit == 3 ) { // FF from Wang et al 10.1103/PhysRevD.79.114018
123 double SoverD = ( m_MBc + m_Mchi ) / ( m_MBc - m_Mchi );
124 double DoverS = ( m_MBc - m_Mchi ) / ( m_MBc + m_Mchi );
125 double ratio = q2 / ( m_MBc * m_MBc );
126
127 double vf_0 = SoverD * 0.36;
128 double vf_c1 = 1.98;
129 double vf_c2 = 0.43;
130
131 double a2f_0 = SoverD * 0.15;
132 double a2f_c1 = 1.22;
133 double a2f_c2 = -0.08;
134
135 double a1f_0 = DoverS * 0.85;
136 double a1f_c1 = -0.51;
137 double a1f_c2 = -1.38;
138
139 double a0f_0 = 0.13;
140 double a0f_c1 = 2.99;
141 double a0f_c2 = 0.023;
142
143 *vf = vf_0 * exp( vf_c1 * ratio + vf_c2 * ratio * ratio );
144 *a2f = a2f_0 * exp( a2f_c1 * ratio + a2f_c2 * ratio * ratio );
145 *a1f = a1f_0 * exp( a1f_c1 * ratio + a1f_c2 * ratio * ratio );
146 *a0f = a0f_0 * exp( a0f_c1 * ratio + a0f_c2 * ratio * ratio );
147 return;
148 } else {
149 EvtGenReport( EVTGEN_ERROR, "EvtBCVFF" )
150 << "Must choose 0 (a1f = 1) or 3 (Wang).\n";
151 ::abort();
152 }
153 } else if ( m_idVector == EvtPDL::getId( "D*0" ).getId() ||
154 m_idVector == EvtPDL::getId( "anti-D*0" ).getId() ) {
155 if ( m_whichfit == 1 ) {
156 // SR form factor set from Kiselev, hep-ph/0211021
157 double Mpole2 = 6.2 * 6.2, den = ( 1. - q2 / Mpole2 );
158 if ( fabs( den ) < 1e-10 ) {
159 *vf = 0;
160 *a2f = 0;
161 *a1f = 0;
162 *a0f = 0;
163 } else {
164 double FV = 0.20 / den, FAp = -0.062 / den, FA0 = 3.6,
165 FAm = 0.11 / den;
166 *vf = ( m_MBc + m_MD0 ) * FV;
167 *a2f = -( m_MBc + m_MD0 ) * FAp;
168 *a1f = FA0 / ( m_MBc + m_MD0 );
169 *a0f = ( q2 * FAm + ( m_MBc + m_MD0 ) * ( *a1f ) -
170 ( m_MBc - m_MD0 ) * ( *a2f ) ) /
171 ( 2 * m_MD0 );
172 }
173 return;
174 } else if ( m_whichfit == 2 ) {
175 // form factors from Ebert, hep-ph/0306306
176 double ratio = q2 / m_MBc / m_MBc;
177 double const fV_0 = 0.202, fV_a = 1.38, fV_b = 1.31;
178 double const fA2_0 = 0.22, fA2_a = 2.44, fA2_b = -1.21;
179 double const fA0_0 = 0.144, fA0_a = 1.18, fA0_b = 1.39;
180 double const fA1_0 = 0.174, fA1_a = 1.69, fA1_b = -0.219;
181
182 *vf = fV_0 / ( 1 - fV_a * ratio - fV_b * ratio * ratio );
183 *a2f = fA2_0 / ( 1 - fA2_a * ratio - fA2_b * ratio * ratio );
184 *a0f = fA0_0 / ( 1 - fA0_a * ratio - fA0_b * ratio * ratio );
185 *a1f = fA1_0 / ( 1 - fA1_a * ratio - fA1_b * ratio * ratio );
186 return;
187 } else {
188 EvtGenReport( EVTGEN_ERROR, "BCVFF" )
189 << "FF should be 0 (a1f = 1), 1 (Kiselev 2002) or 2 (Ebert).\n";
190 ::abort();
191 }
192 } else {
193 EvtGenReport( EVTGEN_ERROR, "ECVFF" )
194 << "Only J/psi, psi(2S), chi_c1 and D*0/anti-D*0 implemented.\n";
195 ::abort();
196 }
197}
198
199void EvtBCVFF::getscalarff( EvtId, EvtId, double, double, double*, double* )
200{
201 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
202 << "Not implemented :getscalarff in EvtBCVFF.\n";
203 ::abort();
204}
205
206void EvtBCVFF::gettensorff( EvtId, EvtId, double, double, double*, double*,
207 double*, double* )
208{
209 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
210 << "Not implemented :gettensorff in EvtBCVFF.\n";
211 ::abort();
212}
213
214void EvtBCVFF::getbaryonff( EvtId, EvtId, double, double, double*, double*,
215 double*, double* )
216{
217 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
218 << "Not implemented :getbaryonff in EvtBCVFF.\n";
219 ::abort();
220}
221
222void EvtBCVFF::getdiracff( EvtId, EvtId, double, double, double*, double*,
223 double*, double*, double*, double* )
224{
225 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
226 << "Not implemented :getdiracff in EvtBCVFF.\n";
227 ::abort();
228}
229
230void EvtBCVFF::getraritaff( EvtId, EvtId, double, double, double*, double*,
231 double*, double*, double*, double*, double*, double* )
232{
233 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
234 << "Not implemented :getraritaff in EvtBCVFF.\n";
235 ::abort();
236}
EvtComplex exp(const EvtComplex &c)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_ERROR
Definition EvtReport.hh:49
double m_Mpsi2S
Definition EvtBCVFF.hh:53
void getscalarff(EvtId, EvtId, double, double, double *, double *) override
Definition EvtBCVFF.cpp:199
void getdiracff(EvtId, EvtId, double, double, double *, double *, double *, double *, double *, double *) override
Definition EvtBCVFF.cpp:222
int m_whichfit
Definition EvtBCVFF.hh:52
double m_Mpsi
Definition EvtBCVFF.hh:53
double m_MBc
Definition EvtBCVFF.hh:53
double m_kappa
Definition EvtBCVFF.hh:53
EvtBCVFF(int idV, int fit)
Definition EvtBCVFF.cpp:34
void gettensorff(EvtId, EvtId, double, double, double *, double *, double *, double *) override
Definition EvtBCVFF.cpp:206
void getbaryonff(EvtId, EvtId, double, double, double *, double *, double *, double *) override
Definition EvtBCVFF.cpp:214
void getraritaff(EvtId, EvtId, double, double, double *, double *, double *, double *, double *, double *, double *, double *) override
Definition EvtBCVFF.cpp:230
double m_Mchi
Definition EvtBCVFF.hh:53
void getvectorff(EvtId parent, EvtId daught, double t, double mass, double *a1f, double *a2f, double *vf, double *a0f) override
Definition EvtBCVFF.cpp:47
double m_MD0
Definition EvtBCVFF.hh:53
int m_idVector
Definition EvtBCVFF.hh:52
Definition EvtId.hh:27
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283