LCOV - code coverage report
Current view: top level - TEvtGen/EvtGen/EvtGenModels - EvtBtoXsllUtil.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 298 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 9 0.0 %

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

Generated by: LCOV version 1.11