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

          Line data    Source code
       1             : //-----------------------------------------------------------------------
       2             : // File and Version Information:
       3             : //
       4             : // Copyright Information: See EvtGen/COPYRIGHT
       5             : //
       6             : //
       7             : // Description:
       8             : //    3                                         2                2
       9             : //   d Gamma                 /   _      _ _2  mb           _2  mb
      10             : //  ---------- = 12 Gamma   | (1+x-z)(z-x-p ) -- W  + (1-z+p ) -- W 
      11             : //         _ 2           0  \                  2  1             2  2
      12             : //  dx dz dp                                   2
      13             : //                                _   _  _2  mb                 2   \. 
      14             : //                             + [x(z-x)-p ] -- (W + 2mb W  + mb W ) |
      15             : //                                            4   3       4       5 /
      16             : //
      17             : //   with 
      18             : //        2 E           2
      19             : //           l    _2   p        2 v.p    _
      20             : //   x = ------ , p = --- , z = ------ , x = 1-x
      21             : //         mb           2         mb
      22             : //                    mb 
      23             : //
      24             : //   the triple differential decay rate according to
      25             : //   hep-ph/9905351 v2
      26             : //   
      27             : // Environment:
      28             : //      Software developed for the BaBar Detector at the SLAC B-Factory.
      29             : //
      30             : // Author List:
      31             : //      Sven Menke
      32             : //
      33             : //-----------------------------------------------------------------------
      34             : //-----------------------
      35             : // This Class's Header --
      36             : //-----------------------
      37             : #include "EvtGenBase/EvtPatches.hh"
      38             : #include "EvtGenBase/EvtConst.hh"
      39             : #include "EvtGenModels/EvtVubdGamma.hh"
      40             : #include "EvtGenBase/EvtDiLog.hh"
      41             : 
      42             : //---------------
      43             : // C Headers --
      44             : //---------------
      45             : #include <math.h>
      46             : 
      47             : //----------------
      48             : // Constructors --
      49             : //----------------
      50             : 
      51             : EvtVubdGamma::EvtVubdGamma(const double &alphas)
      52           0 : {
      53           0 :   _alphas = alphas;
      54             : 
      55             :   // the range for the delta distribution in p2 is from _epsilon1 to 
      56             :   // _epsilon2. It was checked with the single differential formulae
      57             :   // in the paper that these values are small enough to imitate p2 = 0
      58             :   // for the regular terms.
      59             :   // The ()* distributions, however need further treatment. In order to
      60             :   // generate the correct spectrum in z a threshold need to be computed 
      61             :   // from the desired value of the coupling alphas. The idea is that 
      62             :   // for z=1 p2=0 is not allowed and therefore the part of dGamma proportional
      63             :   // to delta(p2) should go to 0 for z->1.
      64             :   // Using equation (3.1) and (3.2) it is possible to find the correct value
      65             :   // for log(_epsilon3) from this requirement.
      66             : 
      67           0 :   _epsilon1 = 1e-10;
      68           0 :   _epsilon2 = 1e-5;
      69           0 :   if ( alphas > 0 ) {
      70           0 :     double lne3 = 9./16.-2*EvtConst::pi*EvtConst::pi/3.+6*EvtConst::pi/4/alphas;    if ( lne3 > 0 ) 
      71           0 :       lne3 = -7./4. - sqrt(lne3);
      72             :     else
      73             :       lne3 = -7./4.;
      74           0 :     _epsilon3 = exp(lne3);
      75           0 :   }
      76             :   else
      77           0 :     _epsilon3 = 1;
      78           0 : }
      79             : 
      80             : //--------------
      81             : // Destructor --
      82             : //--------------
      83             : 
      84             : EvtVubdGamma::~EvtVubdGamma( )
      85           0 : {
      86           0 : }
      87             : 
      88             : //-----------
      89             : // Methods --
      90             : //-----------
      91             : 
      92             : double EvtVubdGamma::getdGdxdzdp(const double &x, const double &z, const double &p2)
      93             : {
      94             :   // check phase space
      95             :   
      96           0 :   double xb = (1-x);
      97             : 
      98           0 :   if ( x < 0 || x > 1 || z < xb || z > (1+xb) ) 
      99           0 :     return 0;
     100             :   
     101           0 :   double p2min = (0>z-1.?0:z-1.);
     102           0 :   double p2max = (1.-x)*(z-1.+x);
     103             : 
     104           0 :   if (p2 < p2min || p2 > p2max) 
     105           0 :     return 0;
     106             : 
     107             :   //  // check the phase space
     108             :   //  return 1.;
     109             : 
     110             :   double dG;
     111             : 
     112           0 :   if ( p2 >_epsilon1 && p2< _epsilon2) {
     113             :     
     114           0 :     double W1      = getW1delta(x,z);
     115           0 :     double W4plus5 = getW4plus5delta(x,z);
     116             :     
     117           0 :     dG = 12. * delta(p2,p2min,p2max) * ((1.+xb-z) * (z-xb) * W1
     118           0 :                                         + xb*(z-xb) * (W4plus5));
     119           0 :   }
     120             :   else {
     121             : 
     122           0 :     double W1 = getW1nodelta(x,z,p2);
     123           0 :     double W2 = getW2nodelta(x,z,p2);
     124           0 :     double W3 = getW3nodelta(x,z,p2);
     125           0 :     double W4 = getW4nodelta(x,z,p2);
     126           0 :     double W5 = getW5nodelta(x,z,p2);
     127             : 
     128           0 :     dG = 12. * ((1.+xb-z) * (z-xb-p2) * W1 
     129           0 :                 + (1.-z+p2) * W2
     130           0 :                 + (xb*(z-xb)-p2) * (W3+W4+W5));
     131             :   }
     132             :   return dG;
     133           0 : }
     134             : 
     135             : double EvtVubdGamma::delta(const double &x, const double &xmin, const double &xmax)
     136             : {
     137           0 :   if ( xmin > 0 || xmax < 0 ) return 0.;
     138           0 :   if ( _epsilon1 < x && x < _epsilon2 ) return 1./(_epsilon2-_epsilon1); 
     139           0 :   return 0.0; 
     140           0 : }
     141             : 
     142             : double EvtVubdGamma::getW1delta(const double &, const double &z)
     143             : {
     144           0 :   double mz = 1.-z;
     145             : 
     146             :   double lz;
     147           0 :   if (z == 1) lz = -1.;
     148           0 :   else        lz = log(z)/(1.-z);
     149             :   
     150             :   // ddilog_(&z) is actually the dilog of (1-z) in maple,
     151             :   // also in Neuberts paper the limit dilog(1) = pi^2/6 is used 
     152             :   // this corresponds to maple's dilog(0), so
     153             :   // I take ddilog_(&mz) where mz=1-z in order to satisfy Neubert's definition
     154             :   // and to compare with Maple the argument in maple should be (1-mz) ...
     155             : 
     156           0 :   double dl = 4.*EvtDiLog::DiLog(mz) + 4.*pow(EvtConst::pi,2)/3.;
     157             : 
     158           0 :   double w = -(8.*pow(log(z),2) - 10.*log(z) + 2.*lz + dl + 5.)
     159           0 :     + (8.*log(z)-7.)*log(_epsilon3) - 2.*pow(log(_epsilon3),2); 
     160             : 
     161           0 :   return (1. + w*_alphas/3./EvtConst::pi);
     162             : }
     163             : 
     164             : double EvtVubdGamma::getW1nodelta(const double &, const double &z, const double &p2)
     165             : {
     166             : 
     167           0 :   double z2 = z*z;
     168           0 :   double t2 = 1.-4.*p2/z2;
     169           0 :   double t = sqrt(t2);
     170             :   
     171             :   double w = 0;
     172           0 :   if ( p2 > _epsilon2 ) 
     173           0 :     w += 4./p2*(log((1.+t)/(1.-t))/t + log(p2/z2))  
     174           0 :       + 1. - (8.-z)*(2.-z)/z2/t2 
     175           0 :       + ((2.-z)/2./z+(8.-z)*(2.-z)/2./z2/t2)*log((1.+t)/(1.-t))/t;
     176           0 :   if ( p2 > _epsilon3 )
     177           0 :     w += (8.*log(z)-7.)/p2 - 4.*log(p2)/p2;
     178             :  
     179           0 :   return w*_alphas/3./EvtConst::pi;
     180             : }
     181             : 
     182             : double EvtVubdGamma::getW2nodelta(const double &, const double &z, const double &p2)
     183             : {
     184             : 
     185           0 :   double z2 = z*z;
     186           0 :   double t2 = 1.-4.*p2/z2;
     187           0 :   double t = sqrt(t2);
     188           0 :   double w11 = (32.-8.*z+z2)/4./z/t2;
     189             : 
     190             :   double w = 0;
     191           0 :   if ( p2 > _epsilon2 ) 
     192           0 :     w -=  (z*t2/8. + (4.-z)/4. + w11/2.)*log((1.+t)/(1.-t))/t;
     193           0 :   if ( p2 > _epsilon2 ) 
     194           0 :     w += (8.-z)/4. + w11;
     195             :  
     196           0 :   return (w*_alphas/3./EvtConst::pi);
     197             : }
     198             : 
     199             : double EvtVubdGamma::getW3nodelta(const double &, const double &z, const double &p2)
     200             : {
     201           0 :   double z2 = z*z;
     202           0 :   double t2 = 1.-4.*p2/z2;
     203           0 :   double t4 = t2*t2;
     204           0 :   double t = sqrt(t2);
     205             : 
     206             :   double w = 0;
     207             : 
     208           0 :   if ( p2 > _epsilon2 ) 
     209           0 :     w += (z*t2/16. + 5.*(4.-z)/16. - (64.+56.*z-7.*z2)/16./z/t2 
     210           0 :           + 3.*(12.-z)/16./t4) * log((1.+t)/(1.-t))/t;
     211           0 :   if ( p2 > _epsilon2 ) 
     212           0 :     w += -(8.-3.*z)/8. + (32.+22.*z-3.*z2)/4./z/t2 - 3.*(12.-z)/8./t4;
     213             :  
     214           0 :   return (w*_alphas/3./EvtConst::pi);
     215             : }
     216             : 
     217             : double EvtVubdGamma::getW4nodelta(const double &, const double &z, const double &p2)
     218             : {
     219           0 :   double z2 = z*z;
     220           0 :   double t2 = 1.-4.*p2/z2;
     221           0 :   double t4 = t2*t2;
     222           0 :   double t = sqrt(t2);
     223             : 
     224             :   double w = 0;
     225             : 
     226           0 :   if ( p2 > _epsilon2 ) 
     227           0 :     w -= ((8.-3.*z)/4./z - (22.-3.*z)/2./z/t2 + 3.*(12.-z)/4./z/t4) 
     228           0 :       * log((1.+t)/(1.-t))/t;
     229           0 :   if ( p2 > _epsilon2 ) 
     230           0 :     w += -1. - (32.-5.*z)/2./z/t2 + 3.*(12.-z)/2./z/t4 ;
     231             :  
     232           0 :   return w*_alphas/3./EvtConst::pi;
     233             : }
     234             : 
     235             : double EvtVubdGamma::getW4plus5delta(const double &, const double &z)
     236             : {
     237             : 
     238             :   double w = 0;
     239             : 
     240           0 :   if ( z == 1 )
     241           0 :     w = -2;
     242             :   else
     243           0 :     w = 2.*log(z)/(1.-z);
     244             : 
     245           0 :   return (w*_alphas/3./EvtConst::pi);
     246             : }
     247             : 
     248             : double EvtVubdGamma::getW5nodelta(const double &, const double &z, const double &p2)
     249             : {
     250           0 :   double z2 = z*z;
     251           0 :   double t2 = 1.-4.*p2/z2;
     252           0 :   double t4 = t2*t2;
     253           0 :   double t = sqrt(t2);
     254             : 
     255             :   double w = 0;
     256           0 :   if ( p2 > _epsilon2 )
     257           0 :     w += (1./4./z - (2.-z)/2./z2/t2 + 3.*(12.-z)/4./z2/t4) 
     258           0 :       * log((1.+t)/(1.-t))/t;
     259           0 :   if ( p2 > _epsilon2 )
     260           0 :     w += -(8.+z)/2./z2/t2 - 3.*(12.-z)/2./z2/t4;
     261             : 
     262           0 :   return (w*_alphas/3./EvtConst::pi);
     263             : 
     264             : }
     265             : 
     266             : 
     267             : 

Generated by: LCOV version 1.11