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