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.
EvtBtoXsllUtil.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/EvtComplex.hh"
24 #include "EvtGenBase/EvtConst.hh"
25 #include "EvtGenBase/EvtDiLog.hh"
26 #include "EvtGenBase/EvtGenKine.hh"
27 #include "EvtGenBase/EvtPDL.hh"
29 #include "EvtGenBase/EvtPatches.hh"
30 #include "EvtGenBase/EvtRandom.hh"
31 #include "EvtGenBase/EvtReport.hh"
32 
33 #include <stdlib.h>
34 
35 EvtComplex EvtBtoXsllUtil::GetC7Eff0( double sh, bool nnlo )
36 {
37  // This function returns the zeroth-order alpha_s part of C7
38 
39  if ( !nnlo )
40  return -0.313;
41 
42  double A7;
43 
44  // use energy scale of 2.5 GeV as a computational trick (G.Hiller)
45  // at least for shat > 0.25
46  A7 = -0.353 + 0.023;
47 
48  EvtComplex c7eff;
49  if ( sh > 0.25 ) {
50  c7eff = A7;
51  return c7eff;
52  }
53 
54  // change energy scale to 5.0 for full NNLO calculation below shat = 0.25
55  A7 = -0.312 + 0.008;
56  c7eff = A7;
57 
58  return c7eff;
59 }
60 
61 EvtComplex EvtBtoXsllUtil::GetC7Eff1( double sh, double mbeff, bool nnlo )
62 {
63  // This function returns the first-order alpha_s part of C7
64 
65  if ( !nnlo )
66  return 0.0;
67  double logsh;
68  logsh = log( sh );
69 
70  EvtComplex uniti( 0.0, 1.0 );
71 
72  EvtComplex c7eff = 0.0;
73  if ( sh > 0.25 ) {
74  return c7eff;
75  }
76 
77  // change energy scale to 5.0 for full NNLO calculation below shat = 0.25
78  double muscale = 5.0;
79  double alphas = 0.215;
80  //double A7 = -0.312 + 0.008;
81  double A8 = -0.148;
82  //double A9 = 4.174 + (-0.035);
83  //double A10 = -4.592 + 0.379;
84  double C1 = -0.487;
85  double C2 = 1.024;
86  //double T9 = 0.374 + 0.252;
87  //double U9 = 0.033 + 0.015;
88  //double W9 = 0.032 + 0.012;
89  double Lmu = log( muscale / mbeff );
90 
91  EvtComplex F71;
92  EvtComplex f71;
93  EvtComplex k7100( -0.68192, -0.074998 );
94  EvtComplex k7101( 0.0, 0.0 );
95  EvtComplex k7110( -0.23935, -0.12289 );
96  EvtComplex k7111( 0.0027424, 0.019676 );
97  EvtComplex k7120( -0.0018555, -0.175 );
98  EvtComplex k7121( 0.022864, 0.011456 );
99  EvtComplex k7130( 0.28248, -0.12783 );
100  EvtComplex k7131( 0.029027, -0.0082265 );
101  f71 = k7100 + k7101 * logsh + sh * ( k7110 + k7111 * logsh ) +
102  sh * sh * ( k7120 + k7121 * logsh ) +
103  sh * sh * sh * ( k7130 + k7131 * logsh );
104  F71 = ( -208.0 / 243.0 ) * Lmu + f71;
105 
106  EvtComplex F72;
107  EvtComplex f72;
108  EvtComplex k7200( 4.0915, 0.44999 );
109  EvtComplex k7201( 0.0, 0.0 );
110  EvtComplex k7210( 1.4361, 0.73732 );
111  EvtComplex k7211( -0.016454, -0.11806 );
112  EvtComplex k7220( 0.011133, 1.05 );
113  EvtComplex k7221( -0.13718, -0.068733 );
114  EvtComplex k7230( -1.6949, 0.76698 );
115  EvtComplex k7231( -0.17416, 0.049359 );
116  f72 = k7200 + k7201 * logsh + sh * ( k7210 + k7211 * logsh ) +
117  sh * sh * ( k7220 + k7221 * logsh ) +
118  sh * sh * sh * ( k7230 + k7231 * logsh );
119  F72 = ( 416.0 / 81.0 ) * Lmu + f72;
120 
121  EvtComplex F78;
122  F78 = ( -32.0 / 9.0 ) * Lmu + 8.0 * EvtConst::pi * EvtConst::pi / 27.0 +
123  ( -44.0 / 9.0 ) + ( -8.0 * EvtConst::pi / 9.0 ) * uniti +
124  ( 4.0 / 3.0 * EvtConst::pi * EvtConst::pi - 40.0 / 3.0 ) * sh +
125  ( 32.0 * EvtConst::pi * EvtConst::pi / 9.0 - 316.0 / 9.0 ) * sh * sh +
126  ( 200.0 * EvtConst::pi * EvtConst::pi / 27.0 - 658.0 / 9.0 ) * sh *
127  sh * sh +
128  ( -8.0 * logsh / 9.0 ) * ( sh + sh * sh + sh * sh * sh );
129 
130  c7eff = -alphas / ( 4.0 * EvtConst::pi ) * ( C1 * F71 + C2 * F72 + A8 * F78 );
131 
132  return c7eff;
133 }
134 
135 EvtComplex EvtBtoXsllUtil::GetC9Eff0( double sh, double /* mbeff */, bool nnlo,
136  bool btod )
137 {
138  // This function returns the zeroth-order alpha_s part of C9
139 
140  if ( !nnlo )
141  return 4.344;
142  double mch = 0.29;
143 
144  double A9;
145  A9 = 4.287 + ( -0.218 );
146  double C1;
147  C1 = -0.697;
148  double C2;
149  C2 = 1.046;
150  double T9;
151  T9 = 0.114 + 0.280;
152  double U9;
153  U9 = 0.045 + 0.023;
154  double W9;
155  W9 = 0.044 + 0.016;
156 
157  EvtComplex uniti( 0.0, 1.0 );
158 
159  EvtComplex hc;
160  double xarg;
161  xarg = 4.0 * mch / sh;
162 
163  hc = -4.0 / 9.0 * log( mch * mch ) + 8.0 / 27.0 + 4.0 * xarg / 9.0;
164  if ( xarg < 1.0 ) {
165  hc = hc - 2.0 / 9.0 * ( 2.0 + xarg ) * sqrt( fabs( 1.0 - xarg ) ) *
166  ( log( ( sqrt( 1.0 - xarg ) + 1.0 ) /
167  ( sqrt( 1.0 - xarg ) - 1.0 ) ) -
168  uniti * EvtConst::pi );
169  } else {
170  hc = hc - 2.0 / 9.0 * ( 2.0 + xarg ) * sqrt( fabs( 1.0 - xarg ) ) *
171  2.0 * atan( 1.0 / sqrt( xarg - 1.0 ) );
172  }
173 
174  EvtComplex h1;
175  xarg = 4.0 / sh;
176  h1 = 8.0 / 27.0 + 4.0 * xarg / 9.0;
177  if ( xarg < 1.0 ) {
178  h1 = h1 - 2.0 / 9.0 * ( 2.0 + xarg ) * sqrt( fabs( 1.0 - xarg ) ) *
179  ( log( ( sqrt( 1.0 - xarg ) + 1.0 ) /
180  ( sqrt( 1.0 - xarg ) - 1.0 ) ) -
181  uniti * EvtConst::pi );
182  } else {
183  h1 = h1 - 2.0 / 9.0 * ( 2.0 + xarg ) * sqrt( fabs( 1.0 - xarg ) ) *
184  2.0 * atan( 1.0 / sqrt( xarg - 1.0 ) );
185  }
186 
187  EvtComplex h0;
188  h0 = 8.0 / 27.0 - 4.0 * log( 2.0 ) / 9.0 + 4.0 * uniti * EvtConst::pi / 9.0;
189 
190  // X=V_{ud}^* V_ub / V_{td}^* V_tb * (4/3 C_1 +C_2) * (h(\hat m_c^2, hat s)-
191  // h(\hat m_u^2, hat s))
192  EvtComplex Vudstar( 1.0 - 0.2279 * 0.2279 / 2.0, 0.0 );
193  EvtComplex Vub( ( 0.118 + 0.273 ) / 2.0, -1.0 * ( 0.305 + 0.393 ) / 2.0 );
194  EvtComplex Vtdstar( 1.0 - ( 0.118 + 0.273 ) / 2.0, ( 0.305 + 0.393 ) / 2.0 );
195  EvtComplex Vtb( 1.0, 0.0 );
196 
197  EvtComplex Xd;
198  Xd = ( Vudstar * Vub / Vtdstar * Vtb ) * ( 4.0 / 3.0 * C1 + C2 ) *
199  ( hc - h0 );
200 
201  EvtComplex c9eff = 4.344;
202  if ( sh > 0.25 ) {
203  c9eff = A9 + T9 * hc + U9 * h1 + W9 * h0;
204  if ( btod ) {
205  c9eff += Xd;
206  }
207  return c9eff;
208  }
209 
210  // change energy scale to 5.0 for full NNLO calculation below shat = 0.25
211  A9 = 4.174 + ( -0.035 );
212  C1 = -0.487;
213  C2 = 1.024;
214  T9 = 0.374 + 0.252;
215  U9 = 0.033 + 0.015;
216  W9 = 0.032 + 0.012;
217 
218  Xd = ( Vudstar * Vub / Vtdstar * Vtb ) * ( 4.0 / 3.0 * C1 + C2 ) *
219  ( hc - h0 );
220 
221  c9eff = A9 + T9 * hc + U9 * h1 + W9 * h0;
222 
223  if ( btod ) {
224  c9eff += Xd;
225  }
226 
227  return c9eff;
228 }
229 
230 EvtComplex EvtBtoXsllUtil::GetC9Eff1( double sh, double mbeff, bool nnlo,
231  bool /*btod*/ )
232 {
233  // This function returns the first-order alpha_s part of C9
234 
235  if ( !nnlo )
236  return 0.0;
237  double logsh;
238  logsh = log( sh );
239  double mch = 0.29;
240 
241  EvtComplex uniti( 0.0, 1.0 );
242 
243  EvtComplex c9eff = 0.0;
244  if ( sh > 0.25 ) {
245  return c9eff;
246  }
247 
248  // change energy scale to 5.0 for full NNLO calculation below shat = 0.25
249  double muscale = 5.0;
250  double alphas = 0.215;
251  double C1 = -0.487;
252  double C2 = 1.024;
253  double A8 = -0.148;
254  double Lmu = log( muscale / mbeff );
255 
256  EvtComplex F91;
257  EvtComplex f91;
258  EvtComplex k9100( -11.973, 0.16371 );
259  EvtComplex k9101( -0.081271, -0.059691 );
260  EvtComplex k9110( -28.432, -0.25044 );
261  EvtComplex k9111( -0.040243, 0.016442 );
262  EvtComplex k9120( -57.114, -0.86486 );
263  EvtComplex k9121( -0.035191, 0.027909 );
264  EvtComplex k9130( -128.8, -2.5243 );
265  EvtComplex k9131( -0.017587, 0.050639 );
266  f91 = k9100 + k9101 * logsh + sh * ( k9110 + k9111 * logsh ) +
267  sh * sh * ( k9120 + k9121 * logsh ) +
268  sh * sh * sh * ( k9130 + k9131 * logsh );
269  F91 = ( -1424.0 / 729.0 + 16.0 * uniti * EvtConst::pi / 243.0 +
270  64.0 / 27.0 * log( mch ) ) *
271  Lmu -
272  16.0 * Lmu * logsh / 243.0 +
273  ( 16.0 / 1215.0 - 32.0 / 135.0 / mch / mch ) * Lmu * sh +
274  ( 4.0 / 2835.0 - 8.0 / 315.0 / mch / mch / mch / mch ) * Lmu * sh * sh +
275  ( 16.0 / 76545.0 - 32.0 / 8505.0 / mch / mch / mch / mch / mch / mch ) *
276  Lmu * sh * sh * sh -
277  256.0 * Lmu * Lmu / 243.0 + f91;
278 
279  EvtComplex F92;
280  EvtComplex f92;
281  EvtComplex k9200( 6.6338, -0.98225 );
282  EvtComplex k9201( 0.48763, 0.35815 );
283  EvtComplex k9210( 3.3585, 1.5026 );
284  EvtComplex k9211( 0.24146, -0.098649 );
285  EvtComplex k9220( -1.1906, 5.1892 );
286  EvtComplex k9221( 0.21115, -0.16745 );
287  EvtComplex k9230( -17.12, 15.146 );
288  EvtComplex k9231( 0.10552, -0.30383 );
289  f92 = k9200 + k9201 * logsh + sh * ( k9210 + k9211 * logsh ) +
290  sh * sh * ( k9220 + k9221 * logsh ) +
291  sh * sh * sh * ( k9230 + k9231 * logsh );
292  F92 = ( 256.0 / 243.0 - 32.0 * uniti * EvtConst::pi / 81.0 -
293  128.0 / 9.0 * log( mch ) ) *
294  Lmu +
295  32.0 * Lmu * logsh / 81.0 +
296  ( -32.0 / 405.0 + 64.0 / 45.0 / mch / mch ) * Lmu * sh +
297  ( -8.0 / 945.0 + 16.0 / 105.0 / mch / mch / mch / mch ) * Lmu * sh * sh +
298  ( -32.0 / 25515.0 + 64.0 / 2835.0 / mch / mch / mch / mch / mch / mch ) *
299  Lmu * sh * sh * sh +
300  512.0 * Lmu * Lmu / 81.0 + f92;
301 
302  EvtComplex F98;
303  F98 = 104.0 / 9.0 - 32.0 * EvtConst::pi * EvtConst::pi / 27.0 +
304  ( 1184.0 / 27.0 - 40.0 * EvtConst::pi * EvtConst::pi / 9.0 ) * sh +
305  ( 14212.0 / 135.0 - 32.0 * EvtConst::pi * EvtConst::pi / 3.0 ) * sh *
306  sh +
307  ( 193444.0 / 945.0 - 560.0 * EvtConst::pi * EvtConst::pi / 27.0 ) *
308  sh * sh * sh +
309  16.0 * logsh / 9.0 * ( 1.0 + sh + sh * sh + sh * sh * sh );
310 
311  c9eff = -alphas / ( 4.0 * EvtConst::pi ) * ( C1 * F91 + C2 * F92 + A8 * F98 );
312 
313  return c9eff;
314 }
315 
316 EvtComplex EvtBtoXsllUtil::GetC10Eff( double /*sh*/, bool nnlo )
317 {
318  if ( !nnlo )
319  return -4.669;
320  double A10;
321  A10 = -4.592 + 0.379;
322 
323  EvtComplex c10eff;
324  c10eff = A10;
325 
326  return c10eff;
327 }
328 
329 double EvtBtoXsllUtil::dGdsProb( double mb, double ms, double ml, double s )
330 {
331  // Compute the decay probability density function given a value of s
332  // according to Ali-Lunghi-Greub-Hiller's 2002 paper
333  // Note that the form given below is taken from
334  // F.Kruger and L.M.Sehgal, Phys. Lett. B380, 199 (1996)
335  // but the differential rate as a function of dilepton mass
336  // in this latter paper reduces to Eq.(12) in ALGH's 2002 paper
337  // for ml = 0 and ms = 0.
338 
339  bool btod = false;
340  bool nnlo = true;
341 
342  double delta, lambda, prob;
343  double f1, f2, f3, f4;
344  double msh, mlh, sh;
345  double mbeff = 4.8;
346 
347  mlh = ml / mb;
348  msh = ms / mb;
349  // set lepton and strange-quark masses to 0 if need to
350  // be in strict agreement with ALGH 2002 paper
351  // mlh = 0.0; msh = 0.0;
352  // sh = s / (mb*mb);
353  sh = s / ( mbeff * mbeff );
354 
355  // if sh >1.0 code will return a nan. so just skip it
356  if ( sh > 1.0 )
357  return 0.0;
358 
359  EvtComplex c7eff0 = EvtBtoXsllUtil::GetC7Eff0( sh, nnlo );
360  EvtComplex c7eff1 = EvtBtoXsllUtil::GetC7Eff1( sh, mbeff, nnlo );
361  EvtComplex c9eff0 = EvtBtoXsllUtil::GetC9Eff0( sh, mbeff, nnlo, btod );
362  EvtComplex c9eff1 = EvtBtoXsllUtil::GetC9Eff1( sh, mbeff, nnlo, btod );
363  EvtComplex c10eff = EvtBtoXsllUtil::GetC10Eff( sh, nnlo );
364 
365  double alphas = 0.119 /
366  ( 1 + 0.119 * log( pow( 4.8, 2 ) / pow( 91.1867, 2 ) ) *
367  23.0 / 12.0 / EvtConst::pi );
368 
369  double omega7 = -8.0 / 3.0 * log( 4.8 / mb ) -
370  4.0 / 3.0 * EvtDiLog::DiLog( sh ) -
371  2.0 / 9.0 * EvtConst::pi * EvtConst::pi -
372  2.0 / 3.0 * log( sh ) * log( 1.0 - sh ) -
373  log( 1 - sh ) * ( 8.0 + sh ) / ( 2.0 + sh ) / 3.0 -
374  2.0 / 3.0 * sh * ( 2.0 - 2.0 * sh - sh * sh ) * log( sh ) /
375  pow( ( 1.0 - sh ), 2 ) / ( 2.0 + sh ) -
376  ( 16.0 - 11.0 * sh - 17.0 * sh * sh ) / 18.0 /
377  ( 2.0 + sh ) / ( 1.0 - sh );
378  double eta7 = 1.0 + alphas * omega7 / EvtConst::pi;
379 
380  double omega79 = -4.0 / 3.0 * log( 4.8 / mb ) -
381  4.0 / 3.0 * EvtDiLog::DiLog( sh ) -
382  2.0 / 9.0 * EvtConst::pi * EvtConst::pi -
383  2.0 / 3.0 * log( sh ) * log( 1.0 - sh ) -
384  1.0 / 9.0 * ( 2.0 + 7.0 * sh ) * log( 1.0 - sh ) / sh -
385  2.0 / 9.0 * sh * ( 3.0 - 2.0 * sh ) * log( sh ) /
386  pow( ( 1.0 - sh ), 2 ) +
387  1.0 / 18.0 * ( 5.0 - 9.0 * sh ) / ( 1.0 - sh );
388  double eta79 = 1.0 + alphas * omega79 / EvtConst::pi;
389 
390  double omega9 = -2.0 / 9.0 * EvtConst::pi * EvtConst::pi -
391  4.0 / 3.0 * EvtDiLog::DiLog( sh ) -
392  2.0 / 3.0 * log( sh ) * log( 1.0 - sh ) -
393  ( 5.0 + 4.0 * sh ) / ( 3.0 * ( 1.0 + 2.0 * sh ) ) *
394  log( 1.0 - sh ) -
395  2.0 * sh * ( 1.0 + sh ) * ( 1.0 - 2.0 * sh ) /
396  ( 3.0 * pow( 1.0 - sh, 2 ) * ( 1.0 + 2.0 * sh ) ) *
397  log( sh ) +
398  ( 5.0 + 9.0 * sh - 6.0 * sh * sh ) /
399  ( 6.0 * ( 1.0 - sh ) * ( 1.0 + 2.0 * sh ) );
400  double eta9 = 1.0 + alphas * omega9 / EvtConst::pi;
401 
402  EvtComplex c7eff = eta7 * c7eff0 + c7eff1;
403  EvtComplex c9eff = eta9 * c9eff0 + c9eff1;
404  c10eff *= eta9;
405 
406  double c7c7 = abs2( c7eff );
407  double c7c9 = real( ( eta79 * c7eff0 + c7eff1 ) *
408  conj( eta79 * c9eff0 + c9eff1 ) );
409  double c9c9plusc10c10 = abs2( c9eff ) + abs2( c10eff );
410  double c9c9minusc10c10 = abs2( c9eff ) - abs2( c10eff );
411 
412  // Power corrections according to ALGH 2002
413  double lambda_1 = -0.2;
414  double lambda_2 = 0.12;
415  double C1 = -0.487;
416  double C2 = 1.024;
417  double mc = 0.29 * mb;
418 
419  EvtComplex F;
420  double r = s / ( 4.0 * mc * mc );
421  EvtComplex uniti( 0.0, 1.0 );
422  F = 3.0 / ( 2.0 * r );
423  if ( r < 1 ) {
424  F *= 1.0 / sqrt( r * ( 1.0 - r ) ) * atan( sqrt( r / ( 1.0 - r ) ) ) -
425  1.0;
426  } else {
427  F *= 0.5 / sqrt( r * ( r - 1.0 ) ) *
428  ( log( ( 1.0 - sqrt( 1.0 - 1.0 / r ) ) /
429  ( 1.0 + sqrt( 1.0 - 1.0 / r ) ) ) +
430  uniti * EvtConst::pi ) -
431  1.0;
432  }
433 
434  double G1 = 1.0 + lambda_1 / ( 2.0 * mb * mb ) +
435  3.0 * ( 1.0 - 15.0 * sh * sh + 10.0 * sh * sh * sh ) /
436  ( ( 1.0 - sh ) * ( 1.0 - sh ) * ( 1.0 + 2.0 * sh ) ) *
437  lambda_2 / ( 2.0 * mb * mb );
438  double G2 = 1.0 + lambda_1 / ( 2.0 * mb * mb ) -
439  3.0 * ( 6.0 + 3.0 * sh - 5.0 * sh * sh * sh ) /
440  ( ( 1.0 - sh ) * ( 1.0 - sh ) * ( 2.0 + sh ) ) * lambda_2 /
441  ( 2.0 * mb * mb );
442  double G3 = 1.0 + lambda_1 / ( 2.0 * mb * mb ) -
443  ( 5.0 + 6.0 * sh - 7.0 * sh * sh ) /
444  ( ( 1.0 - sh ) * ( 1.0 - sh ) ) * lambda_2 /
445  ( 2.0 * mb * mb );
446  double Gc = -8.0 / 9.0 * ( C2 - C1 / 6.0 ) * lambda_2 / ( mc * mc ) *
447  real( F * ( conj( c9eff ) * ( 2.0 + sh ) +
448  conj( c7eff ) * ( 1.0 + 6.0 * sh - sh * sh ) / sh ) );
449 
450  // end of power corrections section
451  // now back to Kruger & Sehgal expressions
452 
453  double msh2 = msh * msh;
454  lambda = 1.0 + sh * sh + msh2 * msh2 - 2.0 * ( sh + sh * msh2 + msh2 );
455  // negative lambda screw up sqrt below!
456  if ( lambda < 0.0 )
457  return 0.0;
458 
459  f1 = pow( 1.0 - msh2, 2 ) - sh * ( 1.0 + msh2 );
460  f2 = 2.0 * ( 1.0 + msh2 ) * pow( 1.0 - msh2, 2 ) -
461  sh * ( 1.0 + 14.0 * msh2 + pow( msh, 4 ) ) - sh * sh * ( 1.0 + msh2 );
462  f3 = pow( 1.0 - msh2, 2 ) + sh * ( 1.0 + msh2 ) - 2.0 * sh * sh +
463  lambda * 2.0 * mlh * mlh / sh;
464  f4 = 1.0 - sh + msh2;
465 
466  delta = ( 12.0 * c7c9 * f1 * G3 + 4.0 * c7c7 * f2 * G2 / sh ) *
467  ( 1.0 + 2.0 * mlh * mlh / sh ) +
468  c9c9plusc10c10 * f3 * G1 + 6.0 * mlh * mlh * c9c9minusc10c10 * f4 +
469  Gc;
470 
471  // avoid negative probs
472  if ( delta < 0.0 )
473  delta = 0.;
474  // negative when sh < 4*mlh*mlh
475  // s < 4*ml*ml
477  prob = sqrt( lambda * ( 1.0 - 4.0 * ml * ml / s ) ) * delta;
478 
479  // if ( !(prob>=0.0) && !(prob<=0.0) ) {
480  //nan
481  // std::cout << lambda << " " << mlh << " " << sh << " " << delta << " " << mb << " " << mbeff << std::endl;
482  // std::cout << 4.0*mlh*mlh/sh << " " << 4.0*ml*ml/s << " " << s-4.0*ml*ml << " " << ml << std::endl;
483  // std::cout << sh << " " << sh*sh << " " << msh2*msh2 << " " << msh << std::endl;
484  //std::cout << ( 12.0*c7c9*f1*G3 + 4.0*c7c7*f2*G2/sh ) * (1.0 + 2.0*mlh*mlh/sh)
485  // <<" " << c9c9plusc10c10*f3*G1
486  // << " "<< 6.0*mlh*mlh*c9c9minusc10c10*f4
487  // << " "<< Gc << std::endl;
488  //std::cout << C2 << " " << C1 << " "<< lambda_2 << " " << mc << " " << real(F*(conj(c9eff)*(2.0+sh)+conj(c7eff)*(1.0 + 6.0*sh - sh*sh)/sh)) << " " << sh << " " << r << std::endl;
489  //std::cout << c9eff << " " << eta9 << " " <<c9eff0 << " " << c9eff1 << " " << alphas << " " << omega9 << " " << sh << std::endl;
490 
491  //}
492  // else{
493  // if ( sh > 1.0) std::cout << "not a nan \n";
494  // }
495  return prob;
496 }
497 
498 double EvtBtoXsllUtil::dGdsdupProb( double mb, double ms, double ml, double s,
499  double u )
500 {
501  // Compute the decay probability density function given a value of s and u
502  // according to Ali-Hiller-Handoko-Morozumi's 1997 paper
503  // see Appendix E
504 
505  bool btod = false;
506  bool nnlo = true;
507 
508  double prob;
509  double f1sp, f2sp, f3sp;
510  double mbeff = 4.8;
511 
512  // double sh = s / (mb*mb);
513  double sh = s / ( mbeff * mbeff );
514 
515  // if sh >1.0 code will return a nan. so just skip it
516  if ( sh > 1.0 )
517  return 0.0;
518 
519  EvtComplex c7eff0 = EvtBtoXsllUtil::GetC7Eff0( sh, nnlo );
520  EvtComplex c7eff1 = EvtBtoXsllUtil::GetC7Eff1( sh, mbeff, nnlo );
521  EvtComplex c9eff0 = EvtBtoXsllUtil::GetC9Eff0( sh, mbeff, nnlo, btod );
522  EvtComplex c9eff1 = EvtBtoXsllUtil::GetC9Eff1( sh, mbeff, nnlo, btod );
523  EvtComplex c10eff = EvtBtoXsllUtil::GetC10Eff( sh, nnlo );
524 
525  double alphas = 0.119 /
526  ( 1 + 0.119 * log( pow( 4.8, 2 ) / pow( 91.1867, 2 ) ) *
527  23.0 / 12.0 / EvtConst::pi );
528 
529  double omega7 = -8.0 / 3.0 * log( 4.8 / mb ) -
530  4.0 / 3.0 * EvtDiLog::DiLog( sh ) -
531  2.0 / 9.0 * EvtConst::pi * EvtConst::pi -
532  2.0 / 3.0 * log( sh ) * log( 1.0 - sh ) -
533  log( 1 - sh ) * ( 8.0 + sh ) / ( 2.0 + sh ) / 3.0 -
534  2.0 / 3.0 * sh * ( 2.0 - 2.0 * sh - sh * sh ) * log( sh ) /
535  pow( ( 1.0 - sh ), 2 ) / ( 2.0 + sh ) -
536  ( 16.0 - 11.0 * sh - 17.0 * sh * sh ) / 18.0 /
537  ( 2.0 + sh ) / ( 1.0 - sh );
538  double eta7 = 1.0 + alphas * omega7 / EvtConst::pi;
539 
540  double omega79 = -4.0 / 3.0 * log( 4.8 / mb ) -
541  4.0 / 3.0 * EvtDiLog::DiLog( sh ) -
542  2.0 / 9.0 * EvtConst::pi * EvtConst::pi -
543  2.0 / 3.0 * log( sh ) * log( 1.0 - sh ) -
544  1.0 / 9.0 * ( 2.0 + 7.0 * sh ) * log( 1.0 - sh ) / sh -
545  2.0 / 9.0 * sh * ( 3.0 - 2.0 * sh ) * log( sh ) /
546  pow( ( 1.0 - sh ), 2 ) +
547  1.0 / 18.0 * ( 5.0 - 9.0 * sh ) / ( 1.0 - sh );
548  double eta79 = 1.0 + alphas * omega79 / EvtConst::pi;
549 
550  double omega9 = -2.0 / 9.0 * EvtConst::pi * EvtConst::pi -
551  4.0 / 3.0 * EvtDiLog::DiLog( sh ) -
552  2.0 / 3.0 * log( sh ) * log( 1.0 - sh ) -
553  ( 5.0 + 4.0 * sh ) / ( 3.0 * ( 1.0 + 2.0 * sh ) ) *
554  log( 1.0 - sh ) -
555  2.0 * sh * ( 1.0 + sh ) * ( 1.0 - 2.0 * sh ) /
556  ( 3.0 * pow( 1.0 - sh, 2 ) * ( 1.0 + 2.0 * sh ) ) *
557  log( sh ) +
558  ( 5.0 + 9.0 * sh - 6.0 * sh * sh ) /
559  ( 6.0 * ( 1.0 - sh ) * ( 1.0 + 2.0 * sh ) );
560  double eta9 = 1.0 + alphas * omega9 / EvtConst::pi;
561 
562  EvtComplex c7eff = eta7 * c7eff0 + c7eff1;
563  EvtComplex c9eff = eta9 * c9eff0 + c9eff1;
564  c10eff *= eta9;
565 
566  double c7c7 = abs2( c7eff );
567  double c7c9 = real( ( eta79 * c7eff0 + c7eff1 ) *
568  conj( eta79 * c9eff0 + c9eff1 ) );
569  double c7c10 = real( ( eta79 * c7eff0 + c7eff1 ) * conj( eta9 * c10eff ) );
570  double c9c10 = real( ( eta9 * c9eff0 + c9eff1 ) * conj( eta9 * c10eff ) );
571  double c9c9plusc10c10 = abs2( c9eff ) + abs2( c10eff );
572 
573  f1sp = ( pow( mb * mb - ms * ms, 2 ) - s * s ) * c9c9plusc10c10 +
574  4.0 *
575  ( pow( mb, 4 ) - ms * ms * mb * mb -
576  pow( ms, 4 ) * ( 1.0 - ms * ms / ( mb * mb ) ) -
577  8.0 * s * ms * ms - s * s * ( 1.0 + ms * ms / ( mb * mb ) ) ) *
578  mb * mb * c7c7 /
579  s
580  // kludged mass term
581  * ( 1.0 + 2.0 * ml * ml / s ) -
582  8.0 * ( s * ( mb * mb + ms * ms ) - pow( mb * mb - ms * ms, 2 ) ) *
583  c7c9
584  // kludged mass term
585  * ( 1.0 + 2.0 * ml * ml / s );
586 
587  f2sp = 4.0 * s * c9c10 + 8.0 * ( mb * mb + ms * ms ) * c7c10;
588  f3sp = -( c9c9plusc10c10 ) + 4.0 * ( 1.0 + pow( ms / mb, 4 ) ) * mb * mb *
589  c7c7 /
590  s
591  // kludged mass term
592  * ( 1.0 + 2.0 * ml * ml / s );
593 
594  prob = ( f1sp + f2sp * u + f3sp * u * u ) / pow( mb, 3 );
595  if ( prob < 0.0 )
596  prob = 0.;
597 
598  return prob;
599 }
600 
601 double EvtBtoXsllUtil::FermiMomentum( double pf )
602 {
603  // Pick a value for the b-quark Fermi motion momentum
604  // according to Ali's Gaussian model
605 
606  double pb, pbmax, xbox, ybox;
607  pb = 0.0;
608  pbmax = 5.0 * pf;
609 
610  while ( pb == 0.0 ) {
611  xbox = EvtRandom::Flat( pbmax );
612  ybox = EvtRandom::Flat();
613  if ( ybox < FermiMomentumProb( xbox, pf ) ) {
614  pb = xbox;
615  }
616  }
617 
618  return pb;
619 }
620 
621 double EvtBtoXsllUtil::FermiMomentumProb( double pb, double pf )
622 {
623  // Compute probability according to Ali's Gaussian model
624  // the function chosen has a convenient maximum value of 1 for pb = pf
625 
626  double prsq = ( pb * pb ) / ( pf * pf );
627  double prob = prsq * exp( 1.0 - prsq );
628 
629  return prob;
630 }
double dGdsdupProb(double mb, double ms, double ml, double s, double u)
EvtComplex GetC9Eff1(double sh, double mb, bool nnlo=true, bool btod=false)
double dGdsProb(double mb, double ms, double ml, double s)
Evt3Rank3C conj(const Evt3Rank3C &t2)
Definition: Evt3Rank3C.cpp:172
double FermiMomentum(double pf)
EvtComplex GetC9Eff0(double sh, double mb, bool nnlo=true, bool btod=false)
EvtComplex GetC10Eff(double sh, bool nnlo=true)
double abs2(const EvtComplex &c)
Definition: EvtComplex.hh:209
static const double pi
Definition: EvtConst.hh:26
EvtComplex GetC7Eff0(double sh, bool nnlo=true)
static double Flat()
Definition: EvtRandom.cpp:72
double FermiMomentumProb(double pb, double pf)
double lambda(double q, double m1, double m2)
Definition: EvtFlatQ2.cpp:31
EvtComplex exp(const EvtComplex &c)
Definition: EvtComplex.hh:240
double DiLog(double x)
Definition: EvtDiLog.cpp:31
double real(const EvtComplex &c)
Definition: EvtComplex.hh:230
EvtComplex GetC7Eff1(double sh, double mb, bool nnlo=true)