00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #include "TMath.h"
00021 #include "TError.h"
00022 #include <math.h>
00023 #include <string.h>
00024 #include <algorithm>
00025 #include "Riostream.h"
00026 #include "TString.h"
00027 
00028 #include <Math/SpecFuncMathCore.h>
00029 #include <Math/PdfFuncMathCore.h>
00030 #include <Math/ProbFuncMathCore.h>
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 #if !defined(R__ALPHA) && !defined(R__SOLARIS) && !defined(R__ACC) && !defined(R__FBSD)
00039 NamespaceImp(TMath)
00040 #endif
00041 
00042 namespace TMath {
00043 
00044    Double_t GamCf(Double_t a,Double_t x);
00045    Double_t GamSer(Double_t a,Double_t x);
00046    Double_t VavilovDenEval(Double_t rlam, Double_t *AC, Double_t *HC, Int_t itype);
00047    void VavilovSet(Double_t rkappa, Double_t beta2, Bool_t mode, Double_t *WCM, Double_t *AC, Double_t *HC, Int_t &itype, Int_t &npt);
00048 
00049 }
00050 
00051 
00052 Long_t TMath::Hypot(Long_t x, Long_t y)
00053 {
00054    return (Long_t) (hypot((Double_t)x, (Double_t)y) + 0.5);
00055 }
00056 
00057 
00058 Double_t TMath::Hypot(Double_t x, Double_t y)
00059 {
00060    return hypot(x, y);
00061 }
00062 
00063 
00064 Double_t TMath::ASinH(Double_t x)
00065 {
00066 #if defined(WIN32)
00067    if(x==0.0) return 0.0;
00068    Double_t ax = Abs(x);
00069    return log(x+ax*sqrt(1.+1./(ax*ax)));
00070 #else
00071    return asinh(x);
00072 #endif
00073 }
00074 
00075 
00076 Double_t TMath::ACosH(Double_t x)
00077 {
00078 #if defined(WIN32)
00079    if(x==0.0) return 0.0;
00080    Double_t ax = Abs(x);
00081    return log(x+ax*sqrt(1.-1./(ax*ax)));
00082 #else
00083    return acosh(x);
00084 #endif
00085 }
00086 
00087 
00088 Double_t TMath::ATanH(Double_t x)
00089 {
00090 #if defined(WIN32)
00091    return log((1+x)/(1-x))/2;
00092 #else
00093    return atanh(x);
00094 #endif
00095 }
00096 
00097 
00098 Double_t TMath::Log2(Double_t x)
00099 {
00100    return log(x)/log(2.0);
00101 }
00102 
00103 
00104 Int_t TMath::Nint(Float_t x)
00105 {
00106    
00107    
00108 
00109    int i;
00110    if (x >= 0) {
00111       i = int(x + 0.5);
00112       if (x + 0.5 == Float_t(i) && i & 1) i--;
00113    } else {
00114       i = int(x - 0.5);
00115       if (x - 0.5 == Float_t(i) && i & 1) i++;
00116 
00117    }
00118    return i;
00119 }
00120 
00121 
00122 Int_t TMath::Nint(Double_t x)
00123 {
00124    
00125    
00126 
00127    int i;
00128    if (x >= 0) {
00129       i = int(x + 0.5);
00130       if (x + 0.5 == Double_t(i) && i & 1) i--;
00131    } else {
00132       i = int(x - 0.5);
00133       if (x - 0.5 == Double_t(i) && i & 1) i++;
00134 
00135    }
00136    return i;
00137 }
00138 
00139 
00140 Double_t TMath::DiLog(Double_t x)
00141 {
00142    
00143    
00144 
00145    const Double_t hf  = 0.5;
00146    const Double_t pi  = TMath::Pi();
00147    const Double_t pi2 = pi*pi;
00148    const Double_t pi3 = pi2/3;
00149    const Double_t pi6 = pi2/6;
00150    const Double_t pi12 = pi2/12;
00151    const Double_t c[20] = {0.42996693560813697, 0.40975987533077105,
00152      -0.01858843665014592, 0.00145751084062268,-0.00014304184442340,
00153       0.00001588415541880,-0.00000190784959387, 0.00000024195180854,
00154      -0.00000003193341274, 0.00000000434545063,-0.00000000060578480,
00155       0.00000000008612098,-0.00000000001244332, 0.00000000000182256,
00156      -0.00000000000027007, 0.00000000000004042,-0.00000000000000610,
00157       0.00000000000000093,-0.00000000000000014, 0.00000000000000002};
00158 
00159    Double_t t,h,y,s,a,alfa,b1,b2,b0;
00160 
00161    if (x == 1) {
00162       h = pi6;
00163    } else if (x == -1) {
00164       h = -pi12;
00165    } else {
00166       t = -x;
00167       if (t <= -2) {
00168          y = -1/(1+t);
00169          s = 1;
00170          b1= TMath::Log(-t);
00171          b2= TMath::Log(1+1/t);
00172          a = -pi3+hf*(b1*b1-b2*b2);
00173       } else if (t < -1) {
00174          y = -1-t;
00175          s = -1;
00176          a = TMath::Log(-t);
00177          a = -pi6+a*(a+TMath::Log(1+1/t));
00178       } else if (t <= -0.5) {
00179          y = -(1+t)/t;
00180          s = 1;
00181          a = TMath::Log(-t);
00182          a = -pi6+a*(-hf*a+TMath::Log(1+t));
00183       } else if (t < 0) {
00184          y = -t/(1+t);
00185          s = -1;
00186          b1= TMath::Log(1+t);
00187          a = hf*b1*b1;
00188       } else if (t <= 1) {
00189          y = t;
00190          s = 1;
00191          a = 0;
00192       } else {
00193          y = 1/t;
00194          s = -1;
00195          b1= TMath::Log(t);
00196          a = pi6+hf*b1*b1;
00197       }
00198       h    = y+y-1;
00199       alfa = h+h;
00200       b1   = 0;
00201       b2   = 0;
00202       for (Int_t i=19;i>=0;i--){
00203          b0 = c[i] + alfa*b1-b2;
00204          b2 = b1;
00205          b1 = b0;
00206       }
00207       h = -(s*(b0-h*b2)+a);
00208    }
00209    return h;
00210 }
00211 
00212 
00213 Double_t TMath::Erf(Double_t x)
00214 {
00215    
00216    
00217 
00218    return ::ROOT::Math::erf(x);
00219 }
00220 
00221 
00222 Double_t TMath::Erfc(Double_t x)
00223 {
00224    
00225    
00226    
00227 
00228    return ::ROOT::Math::erfc(x);
00229 }
00230 
00231 
00232 Double_t TMath::ErfInverse(Double_t x)
00233 {
00234    
00235    
00236 
00237    Int_t kMaxit    = 50;
00238    Double_t kEps   = 1e-14;
00239    Double_t kConst = 0.8862269254527579;     
00240 
00241    if(TMath::Abs(x) <= kEps) return kConst*x;
00242 
00243    
00244    Double_t erfi, derfi, y0,y1,dy0,dy1;
00245    if(TMath::Abs(x) < 1.0) {
00246       erfi  = kConst*TMath::Abs(x);
00247       y0    = TMath::Erf(0.9*erfi);
00248       derfi = 0.1*erfi;
00249       for (Int_t iter=0; iter<kMaxit; iter++) {
00250          y1  = 1. - TMath::Erfc(erfi);
00251          dy1 = TMath::Abs(x) - y1;
00252          if (TMath::Abs(dy1) < kEps)  {if (x < 0) return -erfi; else return erfi;}
00253          dy0    = y1 - y0;
00254          derfi *= dy1/dy0;
00255          y0     = y1;
00256          erfi  += derfi;
00257          if(TMath::Abs(derfi/erfi) < kEps) {if (x < 0) return -erfi; else return erfi;}
00258       }
00259    }
00260    return 0; 
00261 }
00262 Double_t TMath::ErfcInverse(Double_t x)
00263 {
00264    
00265    
00266    
00267    
00268    
00269    
00270    return - 0.70710678118654752440 * TMath::NormQuantile( 0.5 * x); 
00271 }
00272    
00273 
00274 
00275 
00276 
00277 Double_t TMath::Factorial(Int_t n)
00278 {
00279    
00280 
00281    if (n <= 0) return 1.;
00282    Double_t x = 1;
00283    Int_t b = 0;
00284    do {
00285       b++;
00286       x *= b;
00287    } while (b != n);
00288    return x;
00289 }
00290 
00291 
00292 Double_t TMath::Freq(Double_t x)
00293 {
00294    
00295    
00296    
00297    
00298 
00299    const Double_t c1 = 0.56418958354775629;
00300    const Double_t w2 = 1.41421356237309505;
00301 
00302    const Double_t p10 = 2.4266795523053175e+2,  q10 = 2.1505887586986120e+2,
00303                   p11 = 2.1979261618294152e+1,  q11 = 9.1164905404514901e+1,
00304                   p12 = 6.9963834886191355e+0,  q12 = 1.5082797630407787e+1,
00305                   p13 =-3.5609843701815385e-2,  q13 = 1;
00306 
00307    const Double_t p20 = 3.00459261020161601e+2, q20 = 3.00459260956983293e+2,
00308                   p21 = 4.51918953711872942e+2, q21 = 7.90950925327898027e+2,
00309                   p22 = 3.39320816734343687e+2, q22 = 9.31354094850609621e+2,
00310                   p23 = 1.52989285046940404e+2, q23 = 6.38980264465631167e+2,
00311                   p24 = 4.31622272220567353e+1, q24 = 2.77585444743987643e+2,
00312                   p25 = 7.21175825088309366e+0, q25 = 7.70001529352294730e+1,
00313                   p26 = 5.64195517478973971e-1, q26 = 1.27827273196294235e+1,
00314                   p27 =-1.36864857382716707e-7, q27 = 1;
00315 
00316    const Double_t p30 =-2.99610707703542174e-3, q30 = 1.06209230528467918e-2,
00317                   p31 =-4.94730910623250734e-2, q31 = 1.91308926107829841e-1,
00318                   p32 =-2.26956593539686930e-1, q32 = 1.05167510706793207e+0,
00319                   p33 =-2.78661308609647788e-1, q33 = 1.98733201817135256e+0,
00320                   p34 =-2.23192459734184686e-2, q34 = 1;
00321 
00322    Double_t v  = TMath::Abs(x)/w2;
00323    Double_t vv = v*v;
00324    Double_t ap, aq, h, hc, y;
00325    if (v < 0.5) {
00326       y=vv;
00327       ap=p13;
00328       aq=q13;
00329       ap = p12 +y*ap;
00330       ap = p11 +y*ap;
00331       ap = p10 +y*ap;
00332       aq = q12 +y*aq;
00333       aq = q11 +y*aq;
00334       aq = q10 +y*aq;
00335       h  = v*ap/aq;
00336       hc = 1-h;
00337    } else if (v < 4) {
00338       ap = p27;
00339       aq = q27;
00340       ap = p26 +v*ap;
00341       ap = p25 +v*ap;
00342       ap = p24 +v*ap;
00343       ap = p23 +v*ap;
00344       ap = p22 +v*ap;
00345       ap = p21 +v*ap;
00346       ap = p20 +v*ap;
00347       aq = q26 +v*aq;
00348       aq = q25 +v*aq;
00349       aq = q24 +v*aq;
00350       aq = q23 +v*aq;
00351       aq = q22 +v*aq;
00352       aq = q21 +v*aq;
00353       aq = q20 +v*aq;
00354       hc = TMath::Exp(-vv)*ap/aq;
00355       h  = 1-hc;
00356    } else {
00357       y  = 1/vv;
00358       ap = p34;
00359       aq = q34;
00360       ap = p33 +y*ap;
00361       ap = p32 +y*ap;
00362       ap = p31 +y*ap;
00363       ap = p30 +y*ap;
00364       aq = q33 +y*aq;
00365       aq = q32 +y*aq;
00366       aq = q31 +y*aq;
00367       aq = q30 +y*aq;
00368       hc = TMath::Exp(-vv)*(c1+y*ap/aq)/v;
00369       h  = 1-hc;
00370    }
00371    if (x > 0) return 0.5 +0.5*h;
00372    else return 0.5*hc;
00373 }
00374 
00375 
00376 Double_t TMath::Gamma(Double_t z)
00377 {
00378    
00379    
00380    
00381    
00382 
00383    return ::ROOT::Math::tgamma(z);
00384 }
00385 
00386 
00387 Double_t TMath::Gamma(Double_t a,Double_t x)
00388 {
00389    
00390    
00391    
00392    
00393    
00394    
00395    
00396    
00397    
00398    
00399 
00400    return ::ROOT::Math::inc_gamma(a, x);
00401 }
00402 
00403 
00404 Double_t TMath::GamCf(Double_t a,Double_t x)
00405 {
00406    
00407    
00408    
00409    
00410 
00411    Int_t itmax    = 100;      
00412    Double_t eps   = 3.e-14;   
00413    Double_t fpmin = 1.e-30;   
00414 
00415    if (a <= 0 || x <= 0) return 0;
00416 
00417    Double_t gln = LnGamma(a);
00418    Double_t b   = x+1-a;
00419    Double_t c   = 1/fpmin;
00420    Double_t d   = 1/b;
00421    Double_t h   = d;
00422    Double_t an,del;
00423    for (Int_t i=1; i<=itmax; i++) {
00424       an = Double_t(-i)*(Double_t(i)-a);
00425       b += 2;
00426       d  = an*d+b;
00427       if (Abs(d) < fpmin) d = fpmin;
00428       c = b+an/c;
00429       if (Abs(c) < fpmin) c = fpmin;
00430       d   = 1/d;
00431       del = d*c;
00432       h   = h*del;
00433       if (Abs(del-1) < eps) break;
00434       
00435    }
00436    Double_t v = Exp(-x+a*Log(x)-gln)*h;
00437    return (1-v);
00438 }
00439 
00440 
00441 Double_t TMath::GamSer(Double_t a,Double_t x)
00442 {
00443    
00444    
00445    
00446    
00447 
00448    Int_t itmax  = 100;    
00449    Double_t eps = 3.e-14; 
00450 
00451    if (a <= 0 || x <= 0) return 0;
00452 
00453    Double_t gln = LnGamma(a);
00454    Double_t ap  = a;
00455    Double_t sum = 1/a;
00456    Double_t del = sum;
00457    for (Int_t n=1; n<=itmax; n++) {
00458       ap  += 1;
00459       del  = del*x/ap;
00460       sum += del;
00461       if (TMath::Abs(del) < Abs(sum*eps)) break;
00462       
00463    }
00464    Double_t v = sum*Exp(-x+a*Log(x)-gln);
00465    return v;
00466 }
00467 
00468 
00469 Double_t TMath::BreitWigner(Double_t x, Double_t mean, Double_t gamma)
00470 {
00471    
00472 
00473    Double_t bw = gamma/((x-mean)*(x-mean) + gamma*gamma/4);
00474    return bw/(2*Pi());
00475 }
00476 
00477 
00478 Double_t TMath::Gaus(Double_t x, Double_t mean, Double_t sigma, Bool_t norm)
00479 {
00480    
00481    
00482    
00483 
00484    if (sigma == 0) return 1.e30;
00485    Double_t arg = (x-mean)/sigma;
00486    Double_t res = TMath::Exp(-0.5*arg*arg);
00487    if (!norm) return res;
00488    return res/(2.50662827463100024*sigma); 
00489 }
00490 
00491 
00492 Double_t TMath::Landau(Double_t x, Double_t mpv, Double_t sigma, Bool_t norm)
00493 {
00494    
00495    
00496    
00497    
00498    
00499    
00500    
00501 
00502    if (sigma <= 0) return 0; 
00503    Double_t den = ::ROOT::Math::landau_pdf( (x-mpv)/sigma ); 
00504    if (!norm) return den;
00505    return den/sigma;
00506 }
00507 
00508 
00509 Double_t TMath::LnGamma(Double_t z)
00510 {
00511    
00512    
00513    
00514    
00515    
00516    
00517    
00518 
00519    return ::ROOT::Math::lgamma(z);
00520 }
00521 
00522 
00523 Float_t TMath::Normalize(Float_t v[3])
00524 {
00525    
00526    
00527 
00528    Float_t d = Sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
00529    if (d != 0) {
00530       v[0] /= d;
00531       v[1] /= d;
00532       v[2] /= d;
00533    }
00534    return d;
00535 }
00536 
00537 
00538 Double_t TMath::Normalize(Double_t v[3])
00539 {
00540    
00541    
00542    
00543    
00544 
00545    
00546 
00547    Double_t av0 = Abs(v[0]), av1 = Abs(v[1]), av2 = Abs(v[2]);
00548 
00549    Double_t amax, foo, bar;
00550    
00551    if( av0 >= av1 && av0 >= av2 ) {
00552       amax = av0;
00553       foo = av1;
00554       bar = av2;
00555    }
00556    
00557    else if (av1 >= av0 && av1 >= av2) {
00558       amax = av1;
00559       foo = av0;
00560       bar = av2;
00561    }
00562    
00563    else {
00564       amax = av2;
00565       foo = av0;
00566       bar = av1;
00567    }
00568 
00569    if (amax == 0.0)
00570       return 0.;
00571 
00572    Double_t foofrac = foo/amax, barfrac = bar/amax;
00573    Double_t d = amax * Sqrt(1.+foofrac*foofrac+barfrac*barfrac);
00574 
00575    v[0] /= d;
00576    v[1] /= d;
00577    v[2] /= d;
00578    return d;
00579 }
00580 
00581 
00582 Double_t TMath::Poisson(Double_t x, Double_t par)
00583 {
00584   
00585   
00586   
00587   
00588   
00589   
00590   
00591 
00592 
00593 
00594 
00595 
00596 
00597    if (x<0)
00598       return 0;
00599    else if (x == 0.0)
00600       return 1./Exp(par);
00601    else {
00602       Double_t lnpoisson = x*log(par)-par-LnGamma(x+1.);
00603       return Exp(lnpoisson);
00604    }
00605    
00606    
00607    
00608    
00609    
00610 }
00611 
00612 
00613 Double_t TMath::PoissonI(Double_t x, Double_t par)
00614 {
00615   
00616   
00617   
00618 
00619 
00620 
00621 
00622 
00623 
00624    Int_t ix = Int_t(x);
00625    return Poisson(ix,par); 
00626 }
00627 
00628 
00629 Double_t TMath::Prob(Double_t chi2,Int_t ndf)
00630 {
00631    
00632    
00633    
00634    
00635    
00636    
00637    
00638    
00639    
00640    
00641    
00642    
00643    
00644    
00645 
00646    if (ndf <= 0) return 0; 
00647 
00648    if (chi2 <= 0) {
00649       if (chi2 < 0) return 0;
00650       else          return 1;
00651    }
00652 
00653    return ::ROOT::Math::chisquared_cdf_c(chi2,ndf); 
00654 }
00655 
00656 
00657 Double_t TMath::KolmogorovProb(Double_t z)
00658 {
00659    
00660    
00661    
00662 
00663 
00664    
00665    
00666    
00667    
00668    
00669    
00670    
00671    
00672    
00673    
00674    
00675    
00676    
00677    
00678    
00679    
00680    
00681    
00682    
00683    
00684    
00685    
00686 
00687    Double_t fj[4] = {-2,-8,-18,-32}, r[4];
00688    const Double_t w = 2.50662827;
00689    
00690    const Double_t c1 = -1.2337005501361697;
00691    const Double_t c2 = -11.103304951225528;
00692    const Double_t c3 = -30.842513753404244;
00693 
00694    Double_t u = TMath::Abs(z);
00695    Double_t p;
00696    if (u < 0.2) {
00697       p = 1;
00698    } else if (u < 0.755) {
00699       Double_t v = 1./(u*u);
00700       p = 1 - w*(TMath::Exp(c1*v) + TMath::Exp(c2*v) + TMath::Exp(c3*v))/u;
00701    } else if (u < 6.8116) {
00702       r[1] = 0;
00703       r[2] = 0;
00704       r[3] = 0;
00705       Double_t v = u*u;
00706       Int_t maxj = TMath::Max(1,TMath::Nint(3./u));
00707       for (Int_t j=0; j<maxj;j++) {
00708          r[j] = TMath::Exp(fj[j]*v);
00709       }
00710       p = 2*(r[0] - r[1] +r[2] - r[3]);
00711    } else {
00712       p = 0;
00713    }
00714    return p;
00715    }
00716 
00717 
00718 Double_t TMath::KolmogorovTest(Int_t na, const Double_t *a, Int_t nb, const Double_t *b, Option_t *option)
00719 {
00720 
00721 
00722 
00723 
00724 
00725 
00726 
00727 
00728 
00729 
00730 
00731 
00732 
00733 
00734 
00735 
00736 
00737 
00738 
00739 
00740 
00741 
00742 
00743 
00744 
00745 
00746 
00747 
00748 
00749 
00750 
00751 
00752 
00753 
00754 
00755 
00756 
00757 
00758 
00759 
00760 
00761 
00762 
00763 
00764 
00765 
00766 
00767 
00768 
00769 
00770 
00771 
00772 
00773 
00774 
00775 
00776 
00777 
00778 
00779 
00780 
00781 
00782 
00783 
00784 
00785 
00786 
00787 
00788 
00789 
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
00801 
00802 
00803 
00804 
00805 
00806 
00807 
00808 
00809 
00810 
00811 
00812    TString opt = option;
00813    opt.ToUpper();
00814 
00815    Double_t prob = -1;
00816 
00817    if (!a || !b || na <= 2 || nb <= 2) {
00818       Error("KolmogorovTest","Sets must have more than 2 points");
00819       return prob;
00820    }
00821 
00822    Double_t rna = na;
00823    Double_t rnb = nb;
00824    Double_t sa  = 1./rna;
00825    Double_t sb  = 1./rnb;
00826    Double_t rdiff = 0;
00827    Double_t rdmax = 0;
00828    Int_t ia = 0;
00829    Int_t ib = 0;
00830 
00831 
00832 
00833    Bool_t ok = kFALSE;
00834    for (Int_t i=0;i<na+nb;i++) {
00835       if (a[ia] < b[ib]) {
00836          rdiff -= sa;
00837          ia++;
00838          if (ia >= na) {ok = kTRUE; break;}
00839       } else if (a[ia] > b[ib]) {
00840          rdiff += sb;
00841          ib++;
00842          if (ib >= nb) {ok = kTRUE; break;}
00843       } else {
00844          
00845          double x = a[ia];
00846          while(a[ia] == x && ia < na) {
00847             rdiff -= sa;
00848             ia++;
00849          }
00850          while(b[ib] == x && ib < nb) {
00851             rdiff += sb;
00852             ib++;
00853          }
00854          if (ia >= na) {ok = kTRUE; break;}
00855          if (ib >= nb) {ok = kTRUE; break;}
00856       }
00857       rdmax = TMath::Max(rdmax,TMath::Abs(rdiff));
00858    }
00859    
00860    R__ASSERT(ok);
00861 
00862    if (ok) {
00863       rdmax = TMath::Max(rdmax,TMath::Abs(rdiff));
00864       Double_t z = rdmax * TMath::Sqrt(rna*rnb/(rna+rnb));
00865       prob = TMath::KolmogorovProb(z);
00866    }
00867       
00868    if (opt.Contains("D")) {
00869       printf(" Kolmogorov Probability = %g, Max Dist = %g\n",prob,rdmax);
00870    }
00871    if(opt.Contains("M")) return rdmax;
00872    else                  return prob;
00873 }
00874 
00875 
00876 
00877 Double_t TMath::Voigt(Double_t xx, Double_t sigma, Double_t lg, Int_t r)
00878 {
00879    
00880    
00881    
00882    
00883    
00884    
00885    
00886    
00887    
00888    
00889    
00890    
00891    
00892    
00893    
00894    
00895    
00896    
00897    
00898    
00899    
00900 
00901    if ((sigma < 0 || lg < 0) || (sigma==0 && lg==0)) {
00902       return 0;  
00903    }
00904 
00905    if (sigma == 0) {
00906       return lg * 0.159154943  / (xx*xx + lg*lg /4); 
00907    }
00908 
00909    if (lg == 0) {   
00910       return 0.39894228 / sigma * TMath::Exp(-xx*xx / (2*sigma*sigma));
00911    }
00912 
00913    Double_t x, y, k;
00914    x = xx / sigma / 1.41421356;
00915    y = lg / 2 / sigma / 1.41421356;
00916 
00917    Double_t r0, r1;
00918 
00919    if (r < 2) r = 2;
00920    if (r > 5) r = 5;
00921 
00922    r0=1.51 * exp(1.144 * (Double_t)r);
00923    r1=1.60 * exp(0.554 * (Double_t)r);
00924 
00925    
00926 
00927    const Double_t rrtpi = 0.56418958;  
00928 
00929    Double_t y0, y0py0, y0q;                      
00930    y0 = 1.5;
00931    y0py0 = y0 + y0;
00932    y0q = y0 * y0;
00933 
00934    Double_t c[6] = { 1.0117281, -0.75197147, 0.012557727, 0.010022008, -0.00024206814, 0.00000050084806};
00935    Double_t s[6] = { 1.393237, 0.23115241, -0.15535147, 0.0062183662, 0.000091908299, -0.00000062752596};
00936    Double_t t[6] = { 0.31424038, 0.94778839, 1.5976826, 2.2795071, 3.0206370, 3.8897249};
00937 
00938    
00939 
00940    int j;                                        
00941    int rg1, rg2, rg3;                            
00942    Double_t abx, xq, yq, yrrtpi;                 
00943    Double_t xlim0, xlim1, xlim2, xlim3, xlim4;   
00944    Double_t a0=0, d0=0, d2=0, e0=0, e2=0, e4=0, h0=0, h2=0, h4=0, h6=0;
00945    Double_t p0=0, p2=0, p4=0, p6=0, p8=0, z0=0, z2=0, z4=0, z6=0, z8=0;
00946    Double_t xp[6], xm[6], yp[6], ym[6];          
00947    Double_t mq[6], pq[6], mf[6], pf[6];
00948    Double_t d, yf, ypy0, ypy0q;
00949 
00950    
00951 
00952    rg1 = 1;  
00953    rg2 = 1;
00954    rg3 = 1;
00955    yq = y * y;  
00956    yrrtpi = y * rrtpi;  
00957 
00958    
00959 
00960    xlim0 = r0 - y;
00961    xlim1 = r1 - y;
00962    xlim3 = 3.097 * y - 0.45;
00963    xlim2 = 6.8 - y;
00964    xlim4 = 18.1 * y + 1.65;
00965    if ( y <= 1e-6 ) {                      
00966       xlim1 = xlim0;
00967       xlim2 = xlim0;
00968    }
00969 
00970    abx = fabs(x);                                
00971    xq = abx * abx;                               
00972    if ( abx > xlim0 ) {                          
00973       k = yrrtpi / (xq + yq);
00974    } else if ( abx > xlim1 ) {                   
00975       if ( rg1 != 0 ) {                          
00976          rg1 = 0;
00977          a0 = yq + 0.5;                          
00978          d0 = a0*a0;
00979          d2 = yq + yq - 1.0;
00980       }
00981       d = rrtpi / (d0 + xq*(d2 + xq));
00982       k = d * y * (a0 + xq);
00983    } else if ( abx > xlim2 ) {                   
00984       if ( rg2 != 0 ) {                          
00985          rg2 = 0;
00986          h0 = 0.5625 + yq * (4.5 + yq * (10.5 + yq * (6.0 + yq)));
00987                                                  
00988          h2 = -4.5 + yq * (9.0 + yq * ( 6.0 + yq * 4.0));
00989          h4 = 10.5 - yq * (6.0 - yq * 6.0);
00990          h6 = -6.0 + yq * 4.0;
00991          e0 = 1.875 + yq * (8.25 + yq * (5.5 + yq));
00992          e2 = 5.25 + yq * (1.0 + yq * 3.0);
00993          e4 = 0.75 * h6;
00994       }
00995       d = rrtpi / (h0 + xq * (h2 + xq * (h4 + xq * (h6 + xq))));
00996       k = d * y * (e0 + xq * (e2 + xq * (e4 + xq)));
00997    } else if ( abx < xlim3 ) {                   
00998       if ( rg3 != 0 ) {                          
00999          rg3 = 0;
01000          z0 = 272.1014 + y * (1280.829 + y *
01001                               (2802.870 + y *
01002                                (3764.966 + y *
01003                                 (3447.629 + y *
01004                                  (2256.981 + y *
01005                                   (1074.409 + y *
01006                                    (369.1989  + y *
01007                                     (88.26741 + y *
01008                                      (13.39880 + y)
01009                                      ))))))));   
01010          z2 = 211.678 + y * (902.3066 + y *
01011                              (1758.336 + y *
01012                               (2037.310 + y *
01013                                (1549.675 + y *
01014                                 (793.4273 + y *
01015                                  (266.2987 + y *
01016                                   (53.59518 + y * 5.0)
01017                                   ))))));
01018          z4 = 78.86585 + y * (308.1852 + y *
01019                               (497.3014 + y *
01020                                (479.2576 + y *
01021                                 (269.2916 + y *
01022                                  (80.39278 + y * 10.0)
01023                                  ))));
01024          z6 = 22.03523 + y * (55.02933 + y *
01025                               (92.75679 + y *
01026                                (53.59518 + y * 10.0)
01027                                ));
01028          z8 = 1.496460 + y * (13.39880 + y * 5.0);
01029          p0 = 153.5168 + y * (549.3954 + y *
01030                               (919.4955 + y *
01031                                (946.8970 + y *
01032                                 (662.8097 + y *
01033                                  (328.2151 + y *
01034                                   (115.3772 + y *
01035                                    (27.93941 + y *
01036                                     (4.264678 + y * 0.3183291)
01037                                     )))))));
01038          p2 = -34.16955 + y * (-1.322256+ y *
01039                                (124.5975 + y *
01040                                 (189.7730 + y *
01041                                  (139.4665 + y *
01042                                   (56.81652 + y *
01043                                    (12.79458 + y * 1.2733163)
01044                                    )))));
01045          p4 = 2.584042 + y * (10.46332 + y *
01046                               (24.01655 + y *
01047                                (29.81482 + y *
01048                                 (12.79568 + y * 1.9099744)
01049                                 )));
01050          p6 = -0.07272979 + y * (0.9377051 + y *
01051                                  (4.266322 + y * 1.273316));
01052          p8 = 0.0005480304 + y * 0.3183291;
01053       }
01054       d = 1.7724538 / (z0 + xq * (z2 + xq * (z4 + xq * (z6 + xq * (z8 + xq)))));
01055       k = d * (p0 + xq * (p2 + xq * (p4 + xq * (p6 + xq * p8))));
01056    } else {                             
01057       ypy0 = y + y0;
01058       ypy0q = ypy0 * ypy0;
01059       k = 0.0;
01060       for (j = 0; j <= 5; j++) {
01061          d = x - t[j];
01062          mq[j] = d * d;
01063          mf[j] = 1.0 / (mq[j] + ypy0q);
01064          xm[j] = mf[j] * d;
01065          ym[j] = mf[j] * ypy0;
01066          d = x + t[j];
01067          pq[j] = d * d;
01068          pf[j] = 1.0 / (pq[j] + ypy0q);
01069          xp[j] = pf[j] * d;
01070          yp[j] = pf[j] * ypy0;
01071       }
01072       if ( abx <= xlim4 ) {                      
01073          for (j = 0; j <= 5; j++) {
01074             k = k + c[j]*(ym[j]+yp[j]) - s[j]*(xm[j]-xp[j]) ;
01075          }
01076       } else {                                   
01077          yf = y + y0py0;
01078          for ( j = 0; j <= 5; j++) {
01079             k = k + (c[j] *
01080                  (mq[j] * mf[j] - y0 * ym[j])
01081                     + s[j] * yf * xm[j]) / (mq[j]+y0q)
01082                  + (c[j] * (pq[j] * pf[j] - y0 * yp[j])
01083                    - s[j] * yf * xp[j]) / (pq[j]+y0q);
01084          }
01085          k = y * k + exp( -xq );
01086       }
01087    }
01088    return k / 2.506628 / sigma; 
01089 }
01090 
01091 
01092 Bool_t TMath::RootsCubic(const Double_t coef[4],Double_t &a, Double_t &b, Double_t &c)
01093 {
01094    
01095    
01096    
01097    
01098    
01099    
01100    
01101    
01102 
01103    Bool_t complex = kFALSE;
01104    Double_t r,s,t,p,q,d,ps3,ps33,qs2,u,v,tmp,lnu,lnv,su,sv,y1,y2,y3;
01105    a    = 0;
01106    b    = 0;
01107    c    = 0;
01108    if (coef[3] == 0) return complex;
01109    r    = coef[2]/coef[3];
01110    s    = coef[1]/coef[3];
01111    t    = coef[0]/coef[3];
01112    p    = s - (r*r)/3;
01113    ps3  = p/3;
01114    q    = (2*r*r*r)/27.0 - (r*s)/3 + t;
01115    qs2  = q/2;
01116    ps33 = ps3*ps3*ps3;
01117    d    = ps33 + qs2*qs2;
01118    if (d>=0) {
01119       complex = kTRUE;
01120       d   = TMath::Sqrt(d);
01121       u   = -qs2 + d;
01122       v   = -qs2 - d;
01123       tmp = 1./3.;
01124       lnu = TMath::Log(TMath::Abs(u));
01125       lnv = TMath::Log(TMath::Abs(v));
01126       su  = TMath::Sign(1.,u);
01127       sv  = TMath::Sign(1.,v);
01128       u   = su*TMath::Exp(tmp*lnu);
01129       v   = sv*TMath::Exp(tmp*lnv);
01130       y1  = u + v;
01131       y2  = -y1/2;
01132       y3  = ((u-v)*TMath::Sqrt(3.))/2;
01133       tmp = r/3;
01134       a   = y1 - tmp;
01135       b   = y2 - tmp;
01136       c   = y3;
01137    } else {
01138       Double_t phi,cphi,phis3,c1,c2,c3,pis3;
01139       ps3   = -ps3;
01140       ps33  = -ps33;
01141       cphi  = -qs2/TMath::Sqrt(ps33);
01142       phi   = TMath::ACos(cphi);
01143       phis3 = phi/3;
01144       pis3  = TMath::Pi()/3;
01145       c1    = TMath::Cos(phis3);
01146       c2    = TMath::Cos(pis3 + phis3);
01147       c3    = TMath::Cos(pis3 - phis3);
01148       tmp   = TMath::Sqrt(ps3);
01149       y1    = 2*tmp*c1;
01150       y2    = -2*tmp*c2;
01151       y3    = -2*tmp*c3;
01152       tmp = r/3;
01153       a   = y1 - tmp;
01154       b   = y2 - tmp;
01155       c   = y3 - tmp;
01156    }
01157    return complex;
01158 }
01159 
01160 
01161 void TMath::Quantiles(Int_t n, Int_t nprob, Double_t *x, Double_t *quantiles, Double_t *prob, Bool_t isSorted, Int_t *index, Int_t type)
01162 {
01163    
01164    
01165    
01166    
01167    
01168    
01169    
01170    
01171    
01172    
01173    
01174    
01175    
01176    
01177    
01178    
01179    
01180    
01181    
01182    
01183    
01184    
01185    
01186    
01187    
01188    
01189    
01190    
01191    
01192    
01193    
01194    
01195    
01196    
01197    
01198 
01199    if (type<1 || type>9){
01200       printf("illegal value of type\n");
01201       return;
01202    }
01203    Double_t g, npm, np, xj, xjj;
01204    Int_t j, intnpm;
01205    Int_t *ind = 0;
01206    Bool_t isAllocated = kFALSE;
01207    if (!isSorted){
01208       if (index) ind = index;
01209       else {
01210          ind = new Int_t[n];
01211          isAllocated = kTRUE;
01212       }
01213    }
01214    npm=0;
01215    
01216    if (type<4){
01217       for (Int_t i=0; i<nprob; i++){
01218          npm = n*prob[i];
01219          if (npm < 1){
01220             if(isSorted)
01221                quantiles[i] = x[0];
01222             else
01223                quantiles[i] = TMath::KOrdStat(n, x, 0, ind);
01224          } else {
01225             j=TMath::Max(TMath::FloorNint(npm)-1, 0);
01226             if (npm - j -1 > 1e-14){
01227                if (isSorted)
01228                   quantiles[i] = x[j+1];
01229                else
01230                   quantiles[i] = TMath::KOrdStat(n, x, j+1, ind);
01231             } else {
01232                if (isSorted) xj = x[j];
01233                else xj = TMath::KOrdStat(n, x, j, ind);
01234                if (type==1) quantiles[i] = xj;
01235                if (type==2) {
01236                   if (isSorted) xjj = x[j+1];
01237                   else xjj = TMath::KOrdStat(n, x, j+1, ind);
01238                   quantiles[i] = 0.5*(xj + xjj);
01239                }
01240                if (type==3) {
01241                   if (!TMath::Even(j-1)){
01242                      if (isSorted) xjj = x[j+1];
01243                      else xjj = TMath::KOrdStat(n, x, j+1, ind);
01244                      quantiles[i] = xjj;
01245                   } else
01246                      quantiles[i] = xj;
01247                }
01248             }
01249          }
01250       }
01251    }
01252    if (type>3){
01253       for (Int_t i=0; i<nprob; i++){
01254          np=n*prob[i];
01255          if (np<1 && type!=7 && type!=4)
01256             quantiles[i] = TMath::KOrdStat(n, x, 0, ind);
01257          else {
01258             if (type==4) npm = np;
01259             if (type==5) npm = np + 0.5;
01260             if (type==6) npm = np + prob[i];
01261             if (type==7) npm = np - prob[i] +1;
01262             if (type==8) npm = np+(1./3.)*(1+prob[i]);
01263             if (type==9) npm = np + 0.25*prob[i] + 0.375;
01264             intnpm = TMath::FloorNint(npm);
01265             j = TMath::Max(intnpm - 1, 0);
01266             g = npm - intnpm;
01267             if (isSorted){
01268                xj = x[j];
01269                xjj = x[j+1];
01270             } else {
01271                xj = TMath::KOrdStat(n, x, j, ind);
01272                xjj = TMath::KOrdStat(n, x, j+1, ind);
01273             }
01274             quantiles[i] = (1-g)*xj + g*xjj;
01275          }
01276       }
01277    }
01278 
01279    if (isAllocated)
01280       delete [] ind;
01281 }
01282 
01283 
01284 void TMath::BubbleHigh(Int_t Narr, Double_t *arr1, Int_t *arr2)
01285 {
01286    
01287    
01288    
01289    
01290    
01291    
01292    
01293    
01294    
01295 
01296    if (Narr <= 0) return;
01297    double *localArr1 = new double[Narr];
01298    int    *localArr2 = new int[Narr];
01299    int iEl;
01300    int iEl2;
01301 
01302    for(iEl = 0; iEl < Narr; iEl++) {
01303       localArr1[iEl] = arr1[iEl];
01304       localArr2[iEl] = iEl;
01305    }
01306 
01307    for (iEl = 0; iEl < Narr; iEl++) {
01308       for (iEl2 = Narr-1; iEl2 > iEl; --iEl2) {
01309          if (localArr1[iEl2-1] < localArr1[iEl2]) {
01310             double tmp        = localArr1[iEl2-1];
01311             localArr1[iEl2-1] = localArr1[iEl2];
01312             localArr1[iEl2]   = tmp;
01313 
01314             int    tmp2       = localArr2[iEl2-1];
01315             localArr2[iEl2-1] = localArr2[iEl2];
01316             localArr2[iEl2]   = tmp2;
01317          }
01318       }
01319    }
01320 
01321    for (iEl = 0; iEl < Narr; iEl++) {
01322       arr2[iEl] = localArr2[iEl];
01323    }
01324    delete [] localArr2;
01325    delete [] localArr1;
01326 }
01327 
01328 
01329 void TMath::BubbleLow(Int_t Narr, Double_t *arr1, Int_t *arr2)
01330 {
01331    
01332    
01333    
01334 
01335    if (Narr <= 0) return;
01336    double *localArr1 = new double[Narr];
01337    int    *localArr2 = new int[Narr];
01338    int iEl;
01339    int iEl2;
01340 
01341    for (iEl = 0; iEl < Narr; iEl++) {
01342       localArr1[iEl] = arr1[iEl];
01343       localArr2[iEl] = iEl;
01344    }
01345 
01346    for (iEl = 0; iEl < Narr; iEl++) {
01347       for (iEl2 = Narr-1; iEl2 > iEl; --iEl2) {
01348          if (localArr1[iEl2-1] > localArr1[iEl2]) {
01349             double tmp        = localArr1[iEl2-1];
01350             localArr1[iEl2-1] = localArr1[iEl2];
01351             localArr1[iEl2]   = tmp;
01352 
01353             int    tmp2       = localArr2[iEl2-1];
01354             localArr2[iEl2-1] = localArr2[iEl2];
01355             localArr2[iEl2]   = tmp2;
01356          }
01357       }
01358    }
01359 
01360    for (iEl = 0; iEl < Narr; iEl++) {
01361       arr2[iEl] = localArr2[iEl];
01362    }
01363    delete [] localArr2;
01364    delete [] localArr1;
01365 }
01366 
01367 
01368 
01369 ULong_t TMath::Hash(const void *txt, Int_t ntxt)
01370 {
01371    
01372    
01373    
01374    
01375    
01376    
01377    
01378    
01379    
01380    
01381    
01382    
01383    
01384    
01385    
01386    
01387    
01388    
01389 
01390    return TString::Hash(txt,ntxt);
01391 }
01392 
01393 
01394 
01395 ULong_t TMath::Hash(const char *txt)
01396 {
01397    return Hash(txt, Int_t(strlen(txt)));
01398 }
01399 
01400 
01401 Double_t TMath::BesselI0(Double_t x)
01402 {
01403    
01404    
01405    
01406 
01407    
01408    const Double_t p1=1.0,          p2=3.5156229,    p3=3.0899424,
01409                   p4=1.2067492,    p5=0.2659732,    p6=3.60768e-2,  p7=4.5813e-3;
01410 
01411    const Double_t q1= 0.39894228,  q2= 1.328592e-2, q3= 2.25319e-3,
01412                   q4=-1.57565e-3,  q5= 9.16281e-3,  q6=-2.057706e-2,
01413                   q7= 2.635537e-2, q8=-1.647633e-2, q9= 3.92377e-3;
01414 
01415    const Double_t k1 = 3.75;
01416    Double_t ax = TMath::Abs(x);
01417 
01418    Double_t y=0, result=0;
01419 
01420    if (ax < k1) {
01421       Double_t xx = x/k1;
01422       y = xx*xx;
01423       result = p1+y*(p2+y*(p3+y*(p4+y*(p5+y*(p6+y*p7)))));
01424    } else {
01425       y = k1/ax;
01426       result = (TMath::Exp(ax)/TMath::Sqrt(ax))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*(q7+y*(q8+y*q9))))))));
01427    }
01428    return result;
01429 }
01430 
01431 
01432 Double_t TMath::BesselK0(Double_t x)
01433 {
01434    
01435    
01436    
01437    
01438    
01439    
01440 
01441    
01442    const Double_t p1=-0.57721566,  p2=0.42278420,   p3=0.23069756,
01443                   p4= 3.488590e-2, p5=2.62698e-3,   p6=1.0750e-4,    p7=7.4e-6;
01444 
01445    const Double_t q1= 1.25331414,  q2=-7.832358e-2, q3= 2.189568e-2,
01446                   q4=-1.062446e-2, q5= 5.87872e-3,  q6=-2.51540e-3,  q7=5.3208e-4;
01447 
01448    if (x <= 0) {
01449       Error("TMath::BesselK0", "*K0* Invalid argument x = %g\n",x);
01450       return 0;
01451    }
01452 
01453    Double_t y=0, result=0;
01454 
01455    if (x <= 2) {
01456       y = x*x/4;
01457       result = (-log(x/2.)*TMath::BesselI0(x))+(p1+y*(p2+y*(p3+y*(p4+y*(p5+y*(p6+y*p7))))));
01458    } else {
01459       y = 2/x;
01460       result = (exp(-x)/sqrt(x))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*q7))))));
01461    }
01462    return result;
01463 }
01464 
01465 
01466 Double_t TMath::BesselI1(Double_t x)
01467 {
01468    
01469    
01470    
01471    
01472    
01473    
01474 
01475    
01476    const Double_t p1=0.5,          p2=0.87890594,   p3=0.51498869,
01477                   p4=0.15084934,   p5=2.658733e-2,  p6=3.01532e-3,  p7=3.2411e-4;
01478 
01479    const Double_t q1= 0.39894228,  q2=-3.988024e-2, q3=-3.62018e-3,
01480                   q4= 1.63801e-3,  q5=-1.031555e-2, q6= 2.282967e-2,
01481                   q7=-2.895312e-2, q8= 1.787654e-2, q9=-4.20059e-3;
01482 
01483    const Double_t k1 = 3.75;
01484    Double_t ax = TMath::Abs(x);
01485 
01486    Double_t y=0, result=0;
01487 
01488    if (ax < k1) {
01489       Double_t xx = x/k1;
01490       y = xx*xx;
01491       result = x*(p1+y*(p2+y*(p3+y*(p4+y*(p5+y*(p6+y*p7))))));
01492    } else {
01493       y = k1/ax;
01494       result = (exp(ax)/sqrt(ax))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*(q7+y*(q8+y*q9))))))));
01495       if (x < 0) result = -result;
01496    }
01497    return result;
01498 }
01499 
01500 
01501 Double_t TMath::BesselK1(Double_t x)
01502 {
01503    
01504    
01505    
01506    
01507    
01508    
01509 
01510    
01511    const Double_t p1= 1.,          p2= 0.15443144,  p3=-0.67278579,
01512                   p4=-0.18156897,  p5=-1.919402e-2, p6=-1.10404e-3,  p7=-4.686e-5;
01513 
01514    const Double_t q1= 1.25331414,  q2= 0.23498619,  q3=-3.655620e-2,
01515                   q4= 1.504268e-2, q5=-7.80353e-3,  q6= 3.25614e-3,  q7=-6.8245e-4;
01516 
01517    if (x <= 0) {
01518       Error("TMath::BesselK1", "*K1* Invalid argument x = %g\n",x);
01519       return 0;
01520    }
01521 
01522    Double_t y=0,result=0;
01523 
01524    if (x <= 2) {
01525       y = x*x/4;
01526       result = (log(x/2.)*TMath::BesselI1(x))+(1./x)*(p1+y*(p2+y*(p3+y*(p4+y*(p5+y*(p6+y*p7))))));
01527    } else {
01528       y = 2/x;
01529       result = (exp(-x)/sqrt(x))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*q7))))));
01530    }
01531    return result;
01532 }
01533 
01534 
01535 Double_t TMath::BesselK(Int_t n,Double_t x)
01536 {
01537    
01538    
01539    
01540    
01541 
01542    if (x <= 0 || n < 0) {
01543       Error("TMath::BesselK", "*K* Invalid argument(s) (n,x) = (%d, %g)\n",n,x);
01544       return 0;
01545    }
01546 
01547    if (n==0) return TMath::BesselK0(x);
01548    if (n==1) return TMath::BesselK1(x);
01549 
01550    
01551    Double_t tox = 2/x;
01552    Double_t bkm = TMath::BesselK0(x);
01553    Double_t bk  = TMath::BesselK1(x);
01554    Double_t bkp = 0;
01555    for (Int_t j=1; j<n; j++) {
01556       bkp = bkm+Double_t(j)*tox*bk;
01557       bkm = bk;
01558       bk  = bkp;
01559    }
01560    return bk;
01561 }
01562 
01563 
01564 Double_t TMath::BesselI(Int_t n,Double_t x)
01565 {
01566    
01567    
01568    
01569    
01570 
01571    Int_t iacc = 40; 
01572    const Double_t kBigPositive = 1.e10;
01573    const Double_t kBigNegative = 1.e-10;
01574 
01575    if (n < 0) {
01576       Error("TMath::BesselI", "*I* Invalid argument (n,x) = (%d, %g)\n",n,x);
01577       return 0;
01578    }
01579 
01580    if (n==0) return TMath::BesselI0(x);
01581    if (n==1) return TMath::BesselI1(x);
01582 
01583    if (x == 0) return 0;
01584    if (TMath::Abs(x) > kBigPositive) return 0;
01585 
01586    Double_t tox = 2/TMath::Abs(x);
01587    Double_t bip = 0, bim = 0;
01588    Double_t bi  = 1;
01589    Double_t result = 0;
01590    Int_t m = 2*((n+Int_t(sqrt(Float_t(iacc*n)))));
01591    for (Int_t j=m; j>=1; j--) {
01592       bim = bip+Double_t(j)*tox*bi;
01593       bip = bi;
01594       bi  = bim;
01595       
01596       if (TMath::Abs(bi) > kBigPositive)  {
01597          result *= kBigNegative;
01598          bi     *= kBigNegative;
01599          bip    *= kBigNegative;
01600       }
01601       if (j==n) result=bip;
01602    }
01603 
01604    result *= TMath::BesselI0(x)/bi; 
01605    if ((x < 0) && (n%2 == 1)) result = -result;
01606 
01607    return result;
01608 }
01609 
01610 
01611 Double_t TMath::BesselJ0(Double_t x)
01612 {
01613    
01614 
01615    Double_t ax,z;
01616    Double_t xx,y,result,result1,result2;
01617    const Double_t p1  = 57568490574.0, p2  = -13362590354.0, p3 = 651619640.7;
01618    const Double_t p4  = -11214424.18,  p5  = 77392.33017,    p6 = -184.9052456;
01619    const Double_t p7  = 57568490411.0, p8  = 1029532985.0,   p9 = 9494680.718;
01620    const Double_t p10 = 59272.64853,   p11 = 267.8532712;
01621 
01622    const Double_t q1  = 0.785398164;
01623    const Double_t q2  = -0.1098628627e-2,  q3  = 0.2734510407e-4;
01624    const Double_t q4  = -0.2073370639e-5,  q5  = 0.2093887211e-6;
01625    const Double_t q6  = -0.1562499995e-1,  q7  = 0.1430488765e-3;
01626    const Double_t q8  = -0.6911147651e-5,  q9  = 0.7621095161e-6;
01627    const Double_t q10 =  0.934935152e-7,   q11 = 0.636619772;
01628 
01629    if ((ax=fabs(x)) < 8) {
01630       y=x*x;
01631       result1 = p1 + y*(p2 + y*(p3 + y*(p4  + y*(p5  + y*p6))));
01632       result2 = p7 + y*(p8 + y*(p9 + y*(p10 + y*(p11 + y))));
01633       result  = result1/result2;
01634    } else {
01635       z  = 8/ax;
01636       y  = z*z;
01637       xx = ax-q1;
01638       result1 = 1  + y*(q2 + y*(q3 + y*(q4 + y*q5)));
01639       result2 = q6 + y*(q7 + y*(q8 + y*(q9 - y*q10)));
01640       result  = sqrt(q11/ax)*(cos(xx)*result1-z*sin(xx)*result2);
01641    }
01642    return result;
01643 }
01644 
01645 
01646 Double_t TMath::BesselJ1(Double_t x)
01647 {
01648    
01649 
01650    Double_t ax,z;
01651    Double_t xx,y,result,result1,result2;
01652    const Double_t p1  = 72362614232.0,  p2  = -7895059235.0, p3 = 242396853.1;
01653    const Double_t p4  = -2972611.439,   p5  = 15704.48260,   p6 = -30.16036606;
01654    const Double_t p7  = 144725228442.0, p8  = 2300535178.0,  p9 = 18583304.74;
01655    const Double_t p10 = 99447.43394,    p11 = 376.9991397;
01656 
01657    const Double_t q1  = 2.356194491;
01658    const Double_t q2  = 0.183105e-2,     q3  = -0.3516396496e-4;
01659    const Double_t q4  = 0.2457520174e-5, q5  = -0.240337019e-6;
01660    const Double_t q6  = 0.04687499995,   q7  = -0.2002690873e-3;
01661    const Double_t q8  = 0.8449199096e-5, q9  = -0.88228987e-6;
01662    const Double_t q10 = 0.105787412e-6,  q11 = 0.636619772;
01663 
01664    if ((ax=fabs(x)) < 8) {
01665       y=x*x;
01666       result1 = x*(p1 + y*(p2 + y*(p3 + y*(p4  + y*(p5  + y*p6)))));
01667       result2 = p7    + y*(p8 + y*(p9 + y*(p10 + y*(p11 + y))));
01668       result  = result1/result2;
01669    } else {
01670       z  = 8/ax;
01671       y  = z*z;
01672       xx = ax-q1;
01673       result1 = 1  + y*(q2 + y*(q3 + y*(q4 + y*q5)));
01674       result2 = q6 + y*(q7 + y*(q8 + y*(q9 + y*q10)));
01675       result  = sqrt(q11/ax)*(cos(xx)*result1-z*sin(xx)*result2);
01676       if (x < 0) result = -result;
01677    }
01678    return result;
01679 }
01680 
01681 
01682 Double_t TMath::BesselY0(Double_t x)
01683 {
01684    
01685 
01686    Double_t z,xx,y,result,result1,result2;
01687    const Double_t p1  = -2957821389.,  p2  = 7062834065.0, p3  = -512359803.6;
01688    const Double_t p4  = 10879881.29,   p5  = -86327.92757, p6  = 228.4622733;
01689    const Double_t p7  = 40076544269.,  p8  = 745249964.8,  p9  = 7189466.438;
01690    const Double_t p10 = 47447.26470,   p11 = 226.1030244,  p12 = 0.636619772;
01691 
01692    const Double_t q1  =  0.785398164;
01693    const Double_t q2  = -0.1098628627e-2, q3  = 0.2734510407e-4;
01694    const Double_t q4  = -0.2073370639e-5, q5  = 0.2093887211e-6;
01695    const Double_t q6  = -0.1562499995e-1, q7  = 0.1430488765e-3;
01696    const Double_t q8  = -0.6911147651e-5, q9  = 0.7621095161e-6;
01697    const Double_t q10 = -0.934945152e-7,  q11 = 0.636619772;
01698 
01699    if (x < 8) {
01700       y = x*x;
01701       result1 = p1 + y*(p2 + y*(p3 + y*(p4  + y*(p5  + y*p6))));
01702       result2 = p7 + y*(p8 + y*(p9 + y*(p10 + y*(p11 + y))));
01703       result  = (result1/result2) + p12*TMath::BesselJ0(x)*log(x);
01704    } else {
01705       z  = 8/x;
01706       y  = z*z;
01707       xx = x-q1;
01708       result1 = 1  + y*(q2 + y*(q3 + y*(q4 + y*q5)));
01709       result2 = q6 + y*(q7 + y*(q8 + y*(q9 + y*q10)));
01710       result  = sqrt(q11/x)*(sin(xx)*result1+z*cos(xx)*result2);
01711    }
01712    return result;
01713 }
01714 
01715 
01716 Double_t TMath::BesselY1(Double_t x)
01717 {
01718    
01719 
01720    Double_t z,xx,y,result,result1,result2;
01721    const Double_t p1  = -0.4900604943e13, p2  = 0.1275274390e13;
01722    const Double_t p3  = -0.5153438139e11, p4  = 0.7349264551e9;
01723    const Double_t p5  = -0.4237922726e7,  p6  = 0.8511937935e4;
01724    const Double_t p7  =  0.2499580570e14, p8  = 0.4244419664e12;
01725    const Double_t p9  =  0.3733650367e10, p10 = 0.2245904002e8;
01726    const Double_t p11 =  0.1020426050e6,  p12 = 0.3549632885e3;
01727    const Double_t p13 =  0.636619772;
01728    const Double_t q1  =  2.356194491;
01729    const Double_t q2  =  0.183105e-2,     q3  = -0.3516396496e-4;
01730    const Double_t q4  =  0.2457520174e-5, q5  = -0.240337019e-6;
01731    const Double_t q6  =  0.04687499995,   q7  = -0.2002690873e-3;
01732    const Double_t q8  =  0.8449199096e-5, q9  = -0.88228987e-6;
01733    const Double_t q10 =  0.105787412e-6,  q11 =  0.636619772;
01734 
01735    if (x < 8) {
01736       y=x*x;
01737       result1 = x*(p1 + y*(p2 + y*(p3 + y*(p4 + y*(p5  + y*p6)))));
01738       result2 = p7 + y*(p8 + y*(p9 + y*(p10 + y*(p11  + y*(p12+y)))));
01739       result  = (result1/result2) + p13*(TMath::BesselJ1(x)*log(x)-1/x);
01740    } else {
01741       z  = 8/x;
01742       y  = z*z;
01743       xx = x-q1;
01744       result1 = 1  + y*(q2 + y*(q3 + y*(q4 + y*q5)));
01745       result2 = q6 + y*(q7 + y*(q8 + y*(q9 + y*q10)));
01746       result  = sqrt(q11/x)*(sin(xx)*result1+z*cos(xx)*result2);
01747    }
01748    return result;
01749 }
01750 
01751 
01752 Double_t TMath::StruveH0(Double_t x)
01753 {
01754    
01755    
01756    
01757 
01758    const Int_t n1 = 15;
01759    const Int_t n2 = 25;
01760    const Double_t c1[16] = { 1.00215845609911981, -1.63969292681309147,
01761                              1.50236939618292819, -.72485115302121872,
01762                               .18955327371093136, -.03067052022988,
01763                               .00337561447375194, -2.6965014312602e-4,
01764                              1.637461692612e-5,   -7.8244408508e-7,
01765                              3.021593188e-8,      -9.6326645e-10,
01766                              2.579337e-11,        -5.8854e-13,
01767                              1.158e-14,           -2e-16 };
01768    const Double_t c2[26] = {  .99283727576423943, -.00696891281138625,
01769                              1.8205103787037e-4,  -1.063258252844e-5,
01770                              9.8198294287e-7,     -1.2250645445e-7,
01771                              1.894083312e-8,      -3.44358226e-9,
01772                              7.1119102e-10,       -1.6288744e-10,
01773                              4.065681e-11,        -1.091505e-11,
01774                              3.12005e-12,         -9.4202e-13,
01775                              2.9848e-13,          -9.872e-14,
01776                              3.394e-14,           -1.208e-14,
01777                              4.44e-15,            -1.68e-15,
01778                              6.5e-16,             -2.6e-16,
01779                              1.1e-16,             -4e-17,
01780                              2e-17,               -1e-17 };
01781 
01782    const Double_t c0  = 2/TMath::Pi();
01783 
01784    Int_t i;
01785    Double_t alfa, h, r, y, b0, b1, b2;
01786    Double_t v = TMath::Abs(x);
01787 
01788    v = TMath::Abs(x);
01789    if (v < 8) {
01790       y = v/8;
01791       h = 2*y*y -1;
01792       alfa = h + h;
01793       b0 = 0;
01794       b1 = 0;
01795       b2 = 0;
01796       for (i = n1; i >= 0; --i) {
01797          b0 = c1[i] + alfa*b1 - b2;
01798          b2 = b1;
01799          b1 = b0;
01800       }
01801       h = y*(b0 - h*b2);
01802    } else {
01803       r = 1/v;
01804       h = 128*r*r -1;
01805       alfa = h + h;
01806       b0 = 0;
01807       b1 = 0;
01808       b2 = 0;
01809       for (i = n2; i >= 0; --i) {
01810          b0 = c2[i] + alfa*b1 - b2;
01811          b2 = b1;
01812          b1 = b0;
01813       }
01814       h = TMath::BesselY0(v) + r*c0*(b0 - h*b2);
01815    }
01816    if (x < 0)  h = -h;
01817    return h;
01818 }
01819 
01820 
01821 Double_t TMath::StruveH1(Double_t x)
01822 {
01823    
01824    
01825    
01826 
01827    const Int_t n3 = 16;
01828    const Int_t n4 = 22;
01829    const Double_t c3[17] = { .5578891446481605,   -.11188325726569816,
01830                             -.16337958125200939,   .32256932072405902,
01831                             -.14581632367244242,   .03292677399374035,
01832                             -.00460372142093573,  4.434706163314e-4,
01833                             -3.142099529341e-5,   1.7123719938e-6,
01834                             -7.416987005e-8,      2.61837671e-9,
01835                             -7.685839e-11,        1.9067e-12,
01836                             -4.052e-14,           7.5e-16,
01837                             -1e-17 };
01838    const Double_t c4[23] = { 1.00757647293865641,  .00750316051248257,
01839                             -7.043933264519e-5,   2.66205393382e-6,
01840                             -1.8841157753e-7,     1.949014958e-8,
01841                             -2.6126199e-9,        4.236269e-10,
01842                             -7.955156e-11,        1.679973e-11,
01843                             -3.9072e-12,          9.8543e-13,
01844                             -2.6636e-13,          7.645e-14,
01845                             -2.313e-14,           7.33e-15,
01846                             -2.42e-15,            8.3e-16,
01847                             -3e-16,               1.1e-16,
01848                             -4e-17,               2e-17,-1e-17 };
01849 
01850    const Double_t c0  = 2/TMath::Pi();
01851    const Double_t cc  = 2/(3*TMath::Pi());
01852 
01853    Int_t i, i1;
01854    Double_t alfa, h, r, y, b0, b1, b2;
01855    Double_t v = TMath::Abs(x);
01856 
01857    if (v == 0) {
01858       h = 0;
01859    } else if (v <= 0.3) {
01860       y = v*v;
01861       r = 1;
01862       h = 1;
01863       i1 = (Int_t)(-8. / TMath::Log10(v));
01864       for (i = 1; i <= i1; ++i) {
01865          h = -h*y / ((2*i+ 1)*(2*i + 3));
01866          r += h;
01867       }
01868       h = cc*y*r;
01869    } else if (v < 8) {
01870       h = v*v/32 -1;
01871       alfa = h + h;
01872       b0 = 0;
01873       b1 = 0;
01874       b2 = 0;
01875       for (i = n3; i >= 0; --i) {
01876          b0 = c3[i] + alfa*b1 - b2;
01877          b2 = b1;
01878          b1 = b0;
01879       }
01880       h = b0 - h*b2;
01881    } else {
01882       h = 128/(v*v) -1;
01883       alfa = h + h;
01884       b0 = 0;
01885       b1 = 0;
01886       b2 = 0;
01887       for (i = n4; i >= 0; --i) {
01888          b0 = c4[i] + alfa*b1 - b2;
01889          b2 = b1;
01890          b1 = b0;
01891       }
01892       h = TMath::BesselY1(v) + c0*(b0 - h*b2);
01893    }
01894    return h;
01895 }
01896 
01897 
01898 
01899 Double_t TMath::StruveL0(Double_t x)
01900 {
01901    
01902    
01903 
01904    const Double_t pi=TMath::Pi();
01905 
01906    Double_t s=1.0;
01907    Double_t r=1.0;
01908 
01909    Double_t a0,sl0,a1,bi0;
01910 
01911    Int_t km,i;
01912 
01913    if (x<=20.) {
01914       a0=2.0*x/pi;
01915       for (i=1; i<=60;i++) {
01916          r*=(x/(2*i+1))*(x/(2*i+1));
01917          s+=r;
01918          if(TMath::Abs(r/s)<1.e-12) break;
01919       }
01920       sl0=a0*s;
01921    } else {
01922       km=int(5*(x+1.0));
01923       if(x>=50.0)km=25;
01924       for (i=1; i<=km; i++) {
01925          r*=(2*i-1)*(2*i-1)/x/x;
01926          s+=r;
01927          if(TMath::Abs(r/s)<1.0e-12) break;
01928       }
01929       a1=TMath::Exp(x)/TMath::Sqrt(2*pi*x);
01930       r=1.0;
01931       bi0=1.0;
01932       for (i=1; i<=16; i++) {
01933          r=0.125*r*(2.0*i-1.0)*(2.0*i-1.0)/(i*x);
01934          bi0+=r;
01935          if(TMath::Abs(r/bi0)<1.0e-12) break;
01936       }
01937 
01938       bi0=a1*bi0;
01939       sl0=-2.0/(pi*x)*s+bi0;
01940    }
01941    return sl0;
01942 }
01943 
01944 
01945 Double_t TMath::StruveL1(Double_t x)
01946 {
01947    
01948    
01949 
01950    const Double_t pi=TMath::Pi();
01951    Double_t a1,sl1,bi1,s;
01952    Double_t r=1.0;
01953    Int_t km,i;
01954 
01955    if (x<=20.) {
01956       s=0.0;
01957       for (i=1; i<=60;i++) {
01958          r*=x*x/(4.0*i*i-1.0);
01959          s+=r;
01960          if(TMath::Abs(r)<TMath::Abs(s)*1.e-12) break;
01961       }
01962       sl1=2.0/pi*s;
01963    } else {
01964       s=1.0;
01965       km=int(0.5*x);
01966       if(x>50.0)km=25;
01967       for (i=1; i<=km; i++) {
01968          r*=(2*i+3)*(2*i+1)/x/x;
01969          s+=r;
01970          if(TMath::Abs(r/s)<1.0e-12) break;
01971       }
01972       sl1=2.0/pi*(-1.0+1.0/(x*x)+3.0*s/(x*x*x*x));
01973       a1=TMath::Exp(x)/TMath::Sqrt(2*pi*x);
01974       r=1.0;
01975       bi1=1.0;
01976       for (i=1; i<=16; i++) {
01977          r=-0.125*r*(4.0-(2.0*i-1.0)*(2.0*i-1.0))/(i*x);
01978          bi1+=r;
01979          if(TMath::Abs(r/bi1)<1.0e-12) break;
01980       }
01981       sl1+=a1*bi1;
01982    }
01983    return sl1;
01984 }
01985 
01986 
01987 Double_t TMath::Beta(Double_t p, Double_t q)
01988 {
01989    
01990 
01991    return ::ROOT::Math::beta(p, q);
01992 }
01993 
01994 
01995 Double_t TMath::BetaCf(Double_t x, Double_t a, Double_t b)
01996 {
01997    
01998    
01999 
02000    Int_t itmax = 500;
02001    Double_t eps = 3.e-14;
02002    Double_t fpmin = 1.e-30;
02003 
02004    Int_t m, m2;
02005    Double_t aa, c, d, del, qab, qam, qap;
02006    Double_t h;
02007    qab = a+b;
02008    qap = a+1.0;
02009    qam = a-1.0;
02010    c = 1.0;
02011    d = 1.0 - qab*x/qap;
02012    if (TMath::Abs(d)<fpmin) d=fpmin;
02013    d=1.0/d;
02014    h=d;
02015    for (m=1; m<=itmax; m++) {
02016       m2=m*2;
02017       aa = m*(b-m)*x/((qam+ m2)*(a+m2));
02018       d = 1.0 +aa*d;
02019       if(TMath::Abs(d)<fpmin) d = fpmin;
02020       c = 1 +aa/c;
02021       if (TMath::Abs(c)<fpmin) c = fpmin;
02022       d=1.0/d;
02023       h*=d*c;
02024       aa = -(a+m)*(qab +m)*x/((a+m2)*(qap+m2));
02025       d=1.0+aa*d;
02026       if(TMath::Abs(d)<fpmin) d = fpmin;
02027       c = 1.0 +aa/c;
02028       if (TMath::Abs(c)<fpmin) c = fpmin;
02029       d=1.0/d;
02030       del = d*c;
02031       h*=del;
02032       if (TMath::Abs(del-1)<=eps) break;
02033    }
02034    if (m>itmax) {
02035       Info("TMath::BetaCf", "a or b too big, or itmax too small, a=%g, b=%g, x=%g, h=%g, itmax=%d",
02036            a,b,x,h,itmax);
02037    }
02038    return h;
02039 }
02040 
02041 
02042 Double_t TMath::BetaDist(Double_t x, Double_t p, Double_t q)
02043 {
02044    
02045    
02046    
02047    
02048    
02049    
02050 
02051    if ((x<0) || (x>1) || (p<=0) || (q<=0)){
02052       Error("TMath::BetaDist", "parameter value outside allowed range");
02053       return 0;
02054    }
02055    Double_t beta = TMath::Beta(p, q);
02056    Double_t r = TMath::Power(x, p-1)*TMath::Power(1-x, q-1)/beta;
02057    return r;
02058 }
02059 
02060 
02061 Double_t TMath::BetaDistI(Double_t x, Double_t p, Double_t q)
02062 {
02063    
02064    
02065    
02066    
02067    
02068 
02069    if ((x<0) || (x>1) || (p<=0) || (q<=0)){
02070       Error("TMath::BetaDistI", "parameter value outside allowed range");
02071       return 0;
02072    }
02073    Double_t betai = TMath::BetaIncomplete(x, p, q);
02074    return betai;
02075 }
02076 
02077 
02078 Double_t TMath::BetaIncomplete(Double_t x, Double_t a, Double_t b)
02079 {
02080    
02081 
02082    return ::ROOT::Math::inc_beta(x, a, b);
02083 }
02084 
02085 
02086 Double_t TMath::Binomial(Int_t n,Int_t k)
02087 {
02088    
02089 
02090    if (k==0 || n==k) return 1;
02091    if (n<=0 || k<0 || n<k) return 0;
02092 
02093    Int_t k1=TMath::Min(k,n-k);
02094    Int_t k2=n-k1;
02095    Double_t fact=k2+1;
02096    for (Double_t i=k1;i>1.;--i)
02097       fact *= (k2+i)/i;
02098    return fact;
02099 }
02100 
02101 
02102 Double_t TMath::BinomialI(Double_t p, Int_t n, Int_t k)
02103 {
02104    
02105    
02106    
02107    
02108    
02109    
02110    
02111    
02112    
02113    
02114 
02115    if(k <= 0) return 1.0;
02116    if(k > n) return 0.0;
02117    if(k == n) return TMath::Power(p, n);
02118 
02119    return BetaIncomplete(p, Double_t(k), Double_t(n-k+1));
02120 }
02121 
02122 
02123 Double_t TMath::CauchyDist(Double_t x, Double_t t, Double_t s)
02124 {
02125    
02126    
02127    
02128    
02129    
02130    
02131    
02132    
02133    
02134    
02135    
02136    
02137    
02138    
02139    
02140    
02141    
02142 
02143    Double_t temp= (x-t)*(x-t)/(s*s);
02144    Double_t result = 1/(s*TMath::Pi()*(1+temp));
02145    return result;
02146 }
02147 
02148 
02149 Double_t TMath::ChisquareQuantile(Double_t p, Double_t ndf)
02150 {
02151    
02152    
02153    
02154    
02155    
02156    
02157    
02158 
02159    Double_t c[]={0, 0.01, 0.222222, 0.32, 0.4, 1.24, 2.2,
02160                  4.67, 6.66, 6.73, 13.32, 60.0, 70.0,
02161                  84.0, 105.0, 120.0, 127.0, 140.0, 175.0,
02162                  210.0, 252.0, 264.0, 294.0, 346.0, 420.0,
02163                  462.0, 606.0, 672.0, 707.0, 735.0, 889.0,
02164                  932.0, 966.0, 1141.0, 1182.0, 1278.0, 1740.0,
02165                  2520.0, 5040.0};
02166    Double_t e = 5e-7;
02167    Double_t aa = 0.6931471806;
02168    Int_t maxit = 20;
02169    Double_t ch, p1, p2, q, t, a, b, x;
02170    Double_t s1, s2, s3, s4, s5, s6;
02171 
02172    if (ndf <= 0) return 0;
02173 
02174    Double_t g = TMath::LnGamma(0.5*ndf);
02175 
02176    Double_t xx = 0.5 * ndf;
02177    Double_t cp = xx - 1;
02178    if (ndf >= TMath::Log(p)*(-c[5])){
02179    
02180       if (ndf > c[3]) {
02181          x = TMath::NormQuantile(p);
02182          
02183          p1=c[2]/ndf;
02184          ch = ndf*TMath::Power((x*TMath::Sqrt(p1) + 1 - p1), 3);
02185          if (ch > c[6]*ndf + 6)
02186             ch = -2 * (TMath::Log(1-p) - cp * TMath::Log(0.5 * ch) + g);
02187       } else {
02188          ch = c[4];
02189          a = TMath::Log(1-p);
02190          do{
02191             q = ch;
02192             p1 = 1 + ch * (c[7]+ch);
02193             p2 = ch * (c[9] + ch * (c[8] + ch));
02194             t = -0.5 + (c[7] + 2 * ch) / p1 - (c[9] + ch * (c[10] + 3 * ch)) / p2;
02195             ch = ch - (1 - TMath::Exp(a + g + 0.5 * ch + cp * aa) *p2 / p1) / t;
02196          }while (TMath::Abs(q/ch - 1) > c[1]);
02197       }
02198    } else {
02199       ch = TMath::Power((p * xx * TMath::Exp(g + xx * aa)),(1./xx));
02200       if (ch < e) return ch;
02201    }
02202 
02203    for (Int_t i=0; i<maxit; i++){
02204       q = ch;
02205       p1 = 0.5 * ch;
02206       p2 = p - TMath::Gamma(xx, p1);
02207 
02208       t = p2 * TMath::Exp(xx * aa + g + p1 - cp * TMath::Log(ch));
02209       b = t / ch;
02210       a = 0.5 * t - b * cp;
02211       s1 = (c[19] + a * (c[17] + a * (c[14] + a * (c[13] + a * (c[12] +c[11] * a))))) / c[24];
02212       s2 = (c[24] + a * (c[29] + a * (c[32] + a * (c[33] + c[35] * a)))) / c[37];
02213       s3 = (c[19] + a * (c[25] + a * (c[28] + c[31] * a))) / c[37];
02214       s4 = (c[20] + a * (c[27] + c[34] * a) + cp * (c[22] + a * (c[30] + c[36] * a))) / c[38];
02215       s5 = (c[13] + c[21] * a + cp * (c[18] + c[26] * a)) / c[37];
02216       s6 = (c[15] + cp * (c[23] + c[16] * cp)) / c[38];
02217       ch = ch + t * (1 + 0.5 * t * s1 - b * cp * (s1 - b * (s2 - b * (s3 - b * (s4 - b * (s5 - b * s6))))));
02218       if (TMath::Abs(q / ch - 1) > e) break;
02219    }
02220    return ch;
02221 }
02222 
02223 
02224 Double_t TMath::FDist(Double_t F, Double_t N, Double_t M)
02225 {
02226    
02227    
02228    
02229    
02230    
02231    
02232    
02233    
02234    
02235    
02236    
02237    
02238    
02239    
02240    
02241    
02242    return ::ROOT::Math::fdistribution_pdf(F,N,M);
02243 }
02244 
02245 
02246 Double_t TMath::FDistI(Double_t F, Double_t N, Double_t M)
02247 {
02248    
02249    
02250    
02251    
02252    
02253    
02254    
02255    
02256    
02257    
02258    
02259 
02260    Double_t fi = ::ROOT::Math::fdistribution_cdf(F,N,M);
02261    return fi;
02262 }
02263 
02264 
02265 Double_t TMath::GammaDist(Double_t x, Double_t gamma, Double_t mu, Double_t beta)
02266 {
02267    
02268    
02269    
02270    
02271    
02272    
02273    
02274    
02275    
02276    
02277 
02278 
02279    
02280 
02281    if ((x<mu) || (gamma<=0) || (beta <=0)) {
02282       Error("TMath::GammaDist", "illegal parameter values");
02283       return 0;
02284    }
02285    return ::ROOT::Math::gamma_pdf(x, gamma, beta, mu); 
02286 }
02287 
02288 
02289 Double_t TMath::LaplaceDist(Double_t x, Double_t alpha, Double_t beta)
02290 {
02291    
02292    
02293    
02294    
02295    
02296    
02297    Double_t temp;
02298    temp  = TMath::Exp(-TMath::Abs((x-alpha)/beta));
02299    temp /= (2.*beta);
02300    return temp;
02301 }
02302 
02303 
02304 Double_t TMath::LaplaceDistI(Double_t x, Double_t alpha, Double_t beta)
02305 {
02306    
02307    
02308    
02309    
02310    
02311    
02312 
02313    Double_t temp;
02314    if (x<=alpha){
02315       temp = 0.5*TMath::Exp(-TMath::Abs((x-alpha)/beta));
02316    } else {
02317       temp = 1-0.5*TMath::Exp(-TMath::Abs((x-alpha)/beta));
02318    }
02319    return temp;
02320 }
02321 
02322 
02323 Double_t TMath::LogNormal(Double_t x, Double_t sigma, Double_t theta, Double_t m)
02324 {
02325    
02326    
02327    
02328    
02329    
02330    
02331    
02332    
02333    
02334    
02335 
02336 
02337    
02338 
02339    if ((x<theta) || (sigma<=0) || (m<=0)) {
02340       Error("TMath::Lognormal", "illegal parameter values");
02341       return 0;
02342    }
02343    
02344    
02345    
02346    return ::ROOT::Math::lognormal_pdf(x, TMath::Log(m), sigma, theta); 
02347 
02348 }
02349 
02350 
02351 Double_t TMath::NormQuantile(Double_t p)
02352 {
02353    
02354    
02355    
02356 
02357    if ((p<=0)||(p>=1)) {
02358       Error("TMath::NormQuantile", "probability outside (0, 1)");
02359       return 0;
02360    }
02361 
02362    Double_t  a0 = 3.3871328727963666080e0;
02363    Double_t  a1 = 1.3314166789178437745e+2;
02364    Double_t  a2 = 1.9715909503065514427e+3;
02365    Double_t  a3 = 1.3731693765509461125e+4;
02366    Double_t  a4 = 4.5921953931549871457e+4;
02367    Double_t  a5 = 6.7265770927008700853e+4;
02368    Double_t  a6 = 3.3430575583588128105e+4;
02369    Double_t  a7 = 2.5090809287301226727e+3;
02370    Double_t  b1 = 4.2313330701600911252e+1;
02371    Double_t  b2 = 6.8718700749205790830e+2;
02372    Double_t  b3 = 5.3941960214247511077e+3;
02373    Double_t  b4 = 2.1213794301586595867e+4;
02374    Double_t  b5 = 3.9307895800092710610e+4;
02375    Double_t  b6 = 2.8729085735721942674e+4;
02376    Double_t  b7 = 5.2264952788528545610e+3;
02377    Double_t  c0 = 1.42343711074968357734e0;
02378    Double_t  c1 = 4.63033784615654529590e0;
02379    Double_t  c2 = 5.76949722146069140550e0;
02380    Double_t  c3 = 3.64784832476320460504e0;
02381    Double_t  c4 = 1.27045825245236838258e0;
02382    Double_t  c5 = 2.41780725177450611770e-1;
02383    Double_t  c6 = 2.27238449892691845833e-2;
02384    Double_t  c7 = 7.74545014278341407640e-4;
02385    Double_t  d1 = 2.05319162663775882187e0;
02386    Double_t  d2 = 1.67638483018380384940e0;
02387    Double_t  d3 = 6.89767334985100004550e-1;
02388    Double_t  d4 = 1.48103976427480074590e-1;
02389    Double_t  d5 = 1.51986665636164571966e-2;
02390    Double_t  d6 = 5.47593808499534494600e-4;
02391    Double_t  d7 = 1.05075007164441684324e-9;
02392    Double_t  e0 = 6.65790464350110377720e0;
02393    Double_t  e1 = 5.46378491116411436990e0;
02394    Double_t  e2 = 1.78482653991729133580e0;
02395    Double_t  e3 = 2.96560571828504891230e-1;
02396    Double_t  e4 = 2.65321895265761230930e-2;
02397    Double_t  e5 = 1.24266094738807843860e-3;
02398    Double_t  e6 = 2.71155556874348757815e-5;
02399    Double_t  e7 = 2.01033439929228813265e-7;
02400    Double_t  f1 = 5.99832206555887937690e-1;
02401    Double_t  f2 = 1.36929880922735805310e-1;
02402    Double_t  f3 = 1.48753612908506148525e-2;
02403    Double_t  f4 = 7.86869131145613259100e-4;
02404    Double_t  f5 = 1.84631831751005468180e-5;
02405    Double_t  f6 = 1.42151175831644588870e-7;
02406    Double_t  f7 = 2.04426310338993978564e-15;
02407 
02408    Double_t split1 = 0.425;
02409    Double_t split2=5.;
02410    Double_t konst1=0.180625;
02411    Double_t konst2=1.6;
02412 
02413    Double_t q, r, quantile;
02414    q=p-0.5;
02415    if (TMath::Abs(q)<split1) {
02416       r=konst1-q*q;
02417       quantile = q* (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3)
02418                  * r + a2) * r + a1) * r + a0) /
02419                  (((((((b7 * r + b6) * r + b5) * r + b4) * r + b3)
02420                  * r + b2) * r + b1) * r + 1.);
02421    } else {
02422       if(q<0) r=p;
02423       else    r=1-p;
02424       
02425       if (r<=0)
02426          quantile=0;
02427       else {
02428          r=TMath::Sqrt(-TMath::Log(r));
02429          if (r<=split2) {
02430             r=r-konst2;
02431             quantile=(((((((c7 * r + c6) * r + c5) * r + c4) * r + c3)
02432                      * r + c2) * r + c1) * r + c0) /
02433                      (((((((d7 * r + d6) * r + d5) * r + d4) * r + d3)
02434                      * r + d2) * r + d1) * r + 1);
02435          } else{
02436             r=r-split2;
02437             quantile=(((((((e7 * r + e6) * r + e5) * r + e4) * r + e3)
02438                      * r + e2) * r + e1) * r + e0) /
02439                      (((((((f7 * r + f6) * r + f5) * r + f4) * r + f3)
02440                      * r + f2) * r + f1) * r + 1);
02441          }
02442          if (q<0) quantile=-quantile;
02443       }
02444    }
02445    return quantile;
02446 }
02447 
02448 
02449 Bool_t TMath::Permute(Int_t n, Int_t *a)
02450 {
02451    
02452    
02453    
02454    
02455    
02456    
02457 
02458    Int_t i,itmp;
02459    Int_t i1=-1;
02460 
02461    
02462    for(i=n-2; i>-1; i--) {
02463       if(a[i]<a[i+1]) {
02464          i1=i;
02465          break;
02466       }
02467    }
02468    
02469    if(i1==-1) return kFALSE;
02470    else {
02471       
02472       
02473       for(i=n-1;i>i1;i--) {
02474          if(a[i] > a[i1]) {
02475             
02476             itmp=a[i1];
02477             a[i1]=a[i];
02478             a[i]=itmp;
02479             break;
02480          }
02481       }
02482       
02483       
02484       for(i=0;i<(n-i1-1)/2;i++) {
02485          itmp=a[i1+i+1];
02486          a[i1+i+1]=a[n-i-1];
02487          a[n-i-1]=itmp;
02488       }
02489    }
02490    return kTRUE;
02491 }
02492 
02493 
02494 Double_t TMath::Student(Double_t T, Double_t ndf)
02495 {
02496    
02497    
02498    
02499    
02500    
02501    
02502    
02503    
02504    
02505    
02506    
02507    
02508    
02509    
02510    
02511    
02512    
02513    
02514    
02515    
02516    
02517    
02518    
02519    
02520    
02521    
02522 
02523    if (ndf < 1) {
02524       return 0;
02525    }
02526 
02527    Double_t r   = ndf;
02528    Double_t rh  = 0.5*r;
02529    Double_t rh1 = rh + 0.5;
02530    Double_t denom = TMath::Sqrt(r*TMath::Pi())*TMath::Gamma(rh)*TMath::Power(1+T*T/r, rh1);
02531    return TMath::Gamma(rh1)/denom;
02532 }
02533 
02534 
02535 Double_t TMath::StudentI(Double_t T, Double_t ndf)
02536 {
02537    
02538    
02539    
02540    
02541    
02542    
02543 
02544    Double_t r = ndf;
02545 
02546    Double_t si = (T>0) ?
02547                  (1 - 0.5*BetaIncomplete((r/(r + T*T)), r*0.5, 0.5)) :
02548                  0.5*BetaIncomplete((r/(r + T*T)), r*0.5, 0.5);
02549    return si;
02550 }
02551 
02552 
02553 Double_t TMath::StudentQuantile(Double_t p, Double_t ndf, Bool_t lower_tail)
02554 {
02555    
02556    
02557    
02558    
02559    
02560    
02561    
02562    
02563    
02564    
02565    
02566    
02567 
02568    Double_t quantile;
02569    Double_t temp;
02570    Bool_t neg;
02571    Double_t q;
02572    if (ndf<1 || p>=1 || p<=0) {
02573       Error("TMath::StudentQuantile", "illegal parameter values");
02574       return 0;
02575    }
02576    if ((lower_tail && p>0.5)||(!lower_tail && p<0.5)){
02577       neg=kFALSE;
02578       q=2*(lower_tail ? (1-p) : p);
02579    } else {
02580       neg=kTRUE;
02581       q=2*(lower_tail? p : (1-p));
02582    }
02583 
02584    if ((ndf-1)<1e-8) {
02585       temp=TMath::PiOver2()*q;
02586       quantile = TMath::Cos(temp)/TMath::Sin(temp);
02587    } else {
02588       if ((ndf-2)<1e-8) {
02589          quantile = TMath::Sqrt(2./(q*(2-q))-2);
02590       } else {
02591          Double_t a=1./(ndf-0.5);
02592          Double_t b=48./(a*a);
02593          Double_t c=((20700*a/b -98)*a-16)*a+96.36;
02594          Double_t d=((94.5/(b+c)-3.)/b+1)*TMath::Sqrt(a*TMath::PiOver2())*ndf;
02595          Double_t x=q*d;
02596          Double_t y=TMath::Power(x, (2./ndf));
02597          if (y>0.05+a){
02598             
02599             x=TMath::NormQuantile(q*0.5);
02600             y=x*x;
02601             if (ndf<5) c+=0.3*(ndf-4.5)*(x+0.6);
02602             c+=(((0.05*d*x-5.)*x-7.)*x-2.)*x +b;
02603             y=(((((0.4*y+6.3)*y+36.)*y+94.5)/c - y-3.)/b+1)*x;
02604             y=a*y*y;
02605             if(y>0.002) y  = TMath::Exp(y)-1;
02606             else        y += 0.5*y*y;
02607          } else {
02608             y=((1./(((ndf+6.)/(ndf*y)-0.089*d-0.822)*(ndf+2.)*3)+0.5/(ndf+4.))*y-1.)*
02609               (ndf+1.)/(ndf+2.)+1/y;
02610          }
02611          quantile = TMath::Sqrt(ndf*y);
02612       }
02613    }
02614    if(neg) quantile=-quantile;
02615    return quantile;
02616 }
02617 
02618 
02619 Double_t TMath::Vavilov(Double_t x, Double_t kappa, Double_t beta2)
02620 {
02621    
02622    
02623    
02624    
02625    
02626    
02627    
02628    
02629    
02630    
02631    
02632    
02633 
02634 
02635 
02636 
02637 
02638 
02639    Double_t *ac = new Double_t[14];
02640    Double_t *hc = new Double_t[9];
02641 
02642    Int_t itype;
02643    Int_t npt;
02644    TMath::VavilovSet(kappa, beta2, 0, 0, ac, hc, itype, npt);
02645    Double_t v =  TMath::VavilovDenEval(x, ac, hc, itype);
02646    delete [] ac;
02647    delete [] hc;
02648    return v;
02649 }
02650 
02651 
02652 Double_t TMath::VavilovI(Double_t x, Double_t kappa, Double_t beta2)
02653 {
02654    
02655    
02656    
02657    
02658    
02659    
02660    
02661    
02662    
02663    
02664    
02665    
02666 
02667    Double_t *ac = new Double_t[14];
02668    Double_t *hc = new Double_t[9];
02669    Double_t *wcm = new Double_t[201];
02670    Int_t itype;
02671    Int_t npt;
02672    Int_t k;
02673    Double_t xx, v;
02674    TMath::VavilovSet(kappa, beta2, 1, wcm, ac, hc, itype, npt);
02675    if (x < ac[0]) v = 0;
02676    else if (x >=ac[8]) v = 1;
02677    else {
02678       xx = x - ac[0];
02679       k = Int_t(xx*ac[10]);
02680       v = TMath::Min(wcm[k] + (xx - k*ac[9])*(wcm[k+1]-wcm[k])*ac[10], 1.);
02681    }
02682    delete [] ac;
02683    delete [] hc;
02684    delete [] wcm;
02685    return v;
02686 }
02687 
02688 
02689 Double_t TMath::LandauI(Double_t x)
02690 {
02691    
02692    
02693    
02694    
02695    
02696    return ::ROOT::Math::landau_cdf(x);
02697 }
02698 
02699 
02700 
02701 void TMath::VavilovSet(Double_t rkappa, Double_t beta2, Bool_t mode, Double_t *WCM, Double_t *AC, Double_t *HC, Int_t &itype, Int_t &npt)
02702 {
02703    
02704 
02705 
02706    Double_t BKMNX1 = 0.02, BKMNY1 = 0.05, BKMNX2 = 0.12, BKMNY2 = 0.05,
02707       BKMNX3 = 0.22, BKMNY3 = 0.05, BKMXX1 = 0.1 , BKMXY1 = 1,
02708       BKMXX2 = 0.2 , BKMXY2 = 1   , BKMXX3 = 0.3 , BKMXY3 = 1;
02709 
02710    Double_t FBKX1 = 2/(BKMXX1-BKMNX1), FBKX2 = 2/(BKMXX2-BKMNX2),
02711       FBKX3 = 2/(BKMXX3-BKMNX3), FBKY1 = 2/(BKMXY1-BKMNY1),
02712       FBKY2 = 2/(BKMXY2-BKMNY2), FBKY3 = 2/(BKMXY3-BKMNY3);
02713 
02714    Double_t FNINV[] = {0, 1, 0.5, 0.33333333, 0.25, 0.2};
02715 
02716    Double_t EDGEC[]= {0, 0, 0.16666667e+0, 0.41666667e-1, 0.83333333e-2,
02717                       0.13888889e-1, 0.69444444e-2, 0.77160493e-3};
02718 
02719    Double_t U1[] = {0, 0.25850868e+0,  0.32477982e-1, -0.59020496e-2,
02720                     0.            , 0.24880692e-1,  0.47404356e-2,
02721                     -0.74445130e-3,  0.73225731e-2,  0.           ,
02722                     0.11668284e-2,  0.           , -0.15727318e-2,-0.11210142e-2};
02723 
02724    Double_t U2[] = {0, 0.43142611e+0,  0.40797543e-1, -0.91490215e-2,
02725                     0.           ,  0.42127077e-1,  0.73167928e-2,
02726                     -0.14026047e-2,  0.16195241e-1,  0.24714789e-2,
02727                     0.20751278e-2,  0.           , -0.25141668e-2,-0.14064022e-2};
02728 
02729    Double_t U3[] = {0,  0.25225955e+0,  0.64820468e-1, -0.23615759e-1,
02730                     0.           ,  0.23834176e-1,  0.21624675e-2,
02731                     -0.26865597e-2, -0.54891384e-2,  0.39800522e-2,
02732                     0.48447456e-2, -0.89439554e-2, -0.62756944e-2,-0.24655436e-2};
02733 
02734    Double_t U4[] = {0, 0.12593231e+1, -0.20374501e+0,  0.95055662e-1,
02735                     -0.20771531e-1, -0.46865180e-1, -0.77222986e-2,
02736                     0.32241039e-2,  0.89882920e-2, -0.67167236e-2,
02737                     -0.13049241e-1,  0.18786468e-1,  0.14484097e-1};
02738 
02739    Double_t U5[] = {0, -0.24864376e-1, -0.10368495e-2,  0.14330117e-2,
02740                     0.20052730e-3,  0.18751903e-2,  0.12668869e-2,
02741                     0.48736023e-3,  0.34850854e-2,  0.           ,
02742                     -0.36597173e-3,  0.19372124e-2,  0.70761825e-3, 0.46898375e-3};
02743 
02744    Double_t U6[] = {0,  0.35855696e-1, -0.27542114e-1,  0.12631023e-1,
02745                     -0.30188807e-2, -0.84479939e-3,  0.           ,
02746                     0.45675843e-3, -0.69836141e-2,  0.39876546e-2,
02747                     -0.36055679e-2,  0.           ,  0.15298434e-2, 0.19247256e-2};
02748 
02749    Double_t U7[] = {0, 0.10234691e+2, -0.35619655e+1,  0.69387764e+0,
02750                     -0.14047599e+0, -0.19952390e+1, -0.45679694e+0,
02751                     0.           ,  0.50505298e+0};
02752    Double_t U8[] = {0,  0.21487518e+2, -0.11825253e+2,  0.43133087e+1,
02753                     -0.14500543e+1, -0.34343169e+1, -0.11063164e+1,
02754                     -0.21000819e+0,  0.17891643e+1, -0.89601916e+0,
02755                     0.39120793e+0,  0.73410606e+0,  0.           ,-0.32454506e+0};
02756 
02757    Double_t V1[] = {0, 0.27827257e+0, -0.14227603e-2,  0.24848327e-2,
02758                     0.           ,  0.45091424e-1,  0.80559636e-2,
02759                     -0.38974523e-2,  0.           , -0.30634124e-2,
02760                     0.75633702e-3,  0.54730726e-2,  0.19792507e-2};
02761 
02762    Double_t V2[] = {0, 0.41421789e+0, -0.30061649e-1,  0.52249697e-2,
02763                     0.           ,  0.12693873e+0,  0.22999801e-1,
02764                     -0.86792801e-2,  0.31875584e-1, -0.61757928e-2,
02765                     0.           ,  0.19716857e-1,  0.32596742e-2};
02766 
02767    Double_t V3[] = {0, 0.20191056e+0, -0.46831422e-1,  0.96777473e-2,
02768                     -0.17995317e-2,  0.53921588e-1,  0.35068740e-2,
02769                     -0.12621494e-1, -0.54996531e-2, -0.90029985e-2,
02770                     0.34958743e-2,  0.18513506e-1,  0.68332334e-2,-0.12940502e-2};
02771 
02772    Double_t V4[] = {0, 0.13206081e+1,  0.10036618e+0, -0.22015201e-1,
02773                     0.61667091e-2, -0.14986093e+0, -0.12720568e-1,
02774                     0.24972042e-1, -0.97751962e-2,  0.26087455e-1,
02775                     -0.11399062e-1, -0.48282515e-1, -0.98552378e-2};
02776 
02777    Double_t V5[] = {0, 0.16435243e-1,  0.36051400e-1,  0.23036520e-2,
02778                     -0.61666343e-3, -0.10775802e-1,  0.51476061e-2,
02779                     0.56856517e-2, -0.13438433e-1,  0.           ,
02780                     0.           , -0.25421507e-2,  0.20169108e-2,-0.15144931e-2};
02781 
02782    Double_t V6[] = {0, 0.33432405e-1,  0.60583916e-2, -0.23381379e-2,
02783                     0.83846081e-3, -0.13346861e-1, -0.17402116e-2,
02784                     0.21052496e-2,  0.15528195e-2,  0.21900670e-2,
02785                     -0.13202847e-2, -0.45124157e-2, -0.15629454e-2, 0.22499176e-3};
02786 
02787    Double_t V7[] = {0, 0.54529572e+1, -0.90906096e+0,  0.86122438e-1,
02788                     0.           , -0.12218009e+1, -0.32324120e+0,
02789                     -0.27373591e-1,  0.12173464e+0,  0.           ,
02790                     0.           ,  0.40917471e-1};
02791 
02792    Double_t V8[] = {0, 0.93841352e+1, -0.16276904e+1,  0.16571423e+0,
02793                     0.           , -0.18160479e+1, -0.50919193e+0,
02794                     -0.51384654e-1,  0.21413992e+0,  0.           ,
02795                     0.           ,  0.66596366e-1};
02796 
02797    Double_t W1[] = {0, 0.29712951e+0,  0.97572934e-2,  0.           ,
02798                     -0.15291686e-2,  0.35707399e-1,  0.96221631e-2,
02799                     -0.18402821e-2, -0.49821585e-2,  0.18831112e-2,
02800                     0.43541673e-2,  0.20301312e-2, -0.18723311e-2,-0.73403108e-3};
02801 
02802    Double_t W2[] = {0, 0.40882635e+0,  0.14474912e-1,  0.25023704e-2,
02803                     -0.37707379e-2,  0.18719727e+0,  0.56954987e-1,
02804                     0.           ,  0.23020158e-1,  0.50574313e-2,
02805                     0.94550140e-2,  0.19300232e-1};
02806 
02807    Double_t W3[] = {0, 0.16861629e+0,  0.           ,  0.36317285e-2,
02808                     -0.43657818e-2,  0.30144338e-1,  0.13891826e-1,
02809                     -0.58030495e-2, -0.38717547e-2,  0.85359607e-2,
02810                     0.14507659e-1,  0.82387775e-2, -0.10116105e-1,-0.55135670e-2};
02811 
02812    Double_t W4[] = {0, 0.13493891e+1, -0.26863185e-2, -0.35216040e-2,
02813                     0.24434909e-1, -0.83447911e-1, -0.48061360e-1,
02814                     0.76473951e-2,  0.24494430e-1, -0.16209200e-1,
02815                     -0.37768479e-1, -0.47890063e-1,  0.17778596e-1, 0.13179324e-1};
02816 
02817    Double_t W5[] = {0,  0.10264945e+0,  0.32738857e-1,  0.           ,
02818                     0.43608779e-2, -0.43097757e-1, -0.22647176e-2,
02819                     0.94531290e-2, -0.12442571e-1, -0.32283517e-2,
02820                     -0.75640352e-2, -0.88293329e-2,  0.52537299e-2, 0.13340546e-2};
02821 
02822    Double_t W6[] = {0, 0.29568177e-1, -0.16300060e-2, -0.21119745e-3,
02823                     0.23599053e-2, -0.48515387e-2, -0.40797531e-2,
02824                     0.40403265e-3,  0.18200105e-2, -0.14346306e-2,
02825                     -0.39165276e-2, -0.37432073e-2,  0.19950380e-2, 0.12222675e-2};
02826 
02827    Double_t W8[] = {0,  0.66184645e+1, -0.73866379e+0,  0.44693973e-1,
02828                     0.           , -0.14540925e+1, -0.39529833e+0,
02829                     -0.44293243e-1,  0.88741049e-1};
02830 
02831    itype = 0;
02832    if (rkappa <0.01 || rkappa >12) {
02833       Error("Vavilov distribution", "illegal value of kappa");
02834       return;
02835    }
02836 
02837    Double_t DRK[6];
02838    Double_t DSIGM[6];
02839    Double_t ALFA[8];
02840    Int_t j;
02841    Double_t x, y, xx, yy, x2, x3, y2, y3, xy, p2, p3, q2, q3, pq;
02842    if (rkappa >= 0.29) {
02843       itype = 1;
02844       npt = 100;
02845       Double_t wk = 1./TMath::Sqrt(rkappa);
02846 
02847       AC[0] = (-0.032227*beta2-0.074275)*rkappa + (0.24533*beta2+0.070152)*wk + (-0.55610*beta2-3.1579);
02848       AC[8] = (-0.013483*beta2-0.048801)*rkappa + (-1.6921*beta2+8.3656)*wk + (-0.73275*beta2-3.5226);
02849       DRK[1] = wk*wk;
02850       DSIGM[1] = TMath::Sqrt(rkappa/(1-0.5*beta2));
02851       for (j=1; j<=4; j++) {
02852          DRK[j+1] = DRK[1]*DRK[j];
02853          DSIGM[j+1] = DSIGM[1]*DSIGM[j];
02854          ALFA[j+1] = (FNINV[j]-beta2*FNINV[j+1])*DRK[j];
02855       }
02856       HC[0]=TMath::Log(rkappa)+beta2+0.42278434;
02857       HC[1]=DSIGM[1];
02858       HC[2]=ALFA[3]*DSIGM[3];
02859       HC[3]=(3*ALFA[2]*ALFA[2] + ALFA[4])*DSIGM[4]-3;
02860       HC[4]=(10*ALFA[2]*ALFA[3]+ALFA[5])*DSIGM[5]-10*HC[2];
02861       HC[5]=HC[2]*HC[2];
02862       HC[6]=HC[2]*HC[3];
02863       HC[7]=HC[2]*HC[5];
02864       for (j=2; j<=7; j++)
02865          HC[j]*=EDGEC[j];
02866       HC[8]=0.39894228*HC[1];
02867    }
02868    else if (rkappa >=0.22) {
02869       itype = 2;
02870       npt = 150;
02871       x = 1+(rkappa-BKMXX3)*FBKX3;
02872       y = 1+(TMath::Sqrt(beta2)-BKMXY3)*FBKY3;
02873       xx = 2*x;
02874       yy = 2*y;
02875       x2 = xx*x-1;
02876       x3 = xx*x2-x;
02877       y2 = yy*y-1;
02878       y3 = yy*y2-y;
02879       xy = x*y;
02880       p2 = x2*y;
02881       p3 = x3*y;
02882       q2 = y2*x;
02883       q3 = y3*x;
02884       pq = x2*y2;
02885       AC[1] = W1[1] + W1[2]*x + W1[4]*x3 + W1[5]*y + W1[6]*y2 + W1[7]*y3 +
02886          W1[8]*xy + W1[9]*p2 + W1[10]*p3 + W1[11]*q2 + W1[12]*q3 + W1[13]*pq;
02887       AC[2] = W2[1] + W2[2]*x + W2[3]*x2 + W2[4]*x3 + W2[5]*y + W2[6]*y2 +
02888          W2[8]*xy + W2[9]*p2 + W2[10]*p3 + W2[11]*q2;
02889       AC[3] = W3[1] + W3[3]*x2 + W3[4]*x3 + W3[5]*y + W3[6]*y2 + W3[7]*y3 +
02890          W3[8]*xy + W3[9]*p2 + W3[10]*p3 + W3[11]*q2 + W3[12]*q3 + W3[13]*pq;
02891       AC[4] = W4[1] + W4[2]*x + W4[3]*x2 + W4[4]*x3 + W4[5]*y + W4[6]*y2 + W4[7]*y3 +
02892          W4[8]*xy + W4[9]*p2 + W4[10]*p3 + W4[11]*q2 + W4[12]*q3 + W4[13]*pq;
02893       AC[5] = W5[1] + W5[2]*x + W5[4]*x3 + W5[5]*y + W5[6]*y2 + W5[7]*y3 +
02894          W5[8]*xy + W5[9]*p2 + W5[10]*p3 + W5[11]*q2 + W5[12]*q3 + W5[13]*pq;
02895       AC[6] = W6[1] + W6[2]*x + W6[3]*x2 + W6[4]*x3 + W6[5]*y + W6[6]*y2 + W6[7]*y3 +
02896          W6[8]*xy + W6[9]*p2 + W6[10]*p3 + W6[11]*q2 + W6[12]*q3 + W6[13]*pq;
02897       AC[8] = W8[1] + W8[2]*x + W8[3]*x2 + W8[5]*y + W8[6]*y2 + W8[7]*y3 + W8[8]*xy;
02898       AC[0] = -3.05;
02899    } else if (rkappa >= 0.12) {
02900       itype = 3;
02901       npt = 200;
02902       x = 1 + (rkappa-BKMXX2)*FBKX2;
02903       y = 1 + (TMath::Sqrt(beta2)-BKMXY2)*FBKY2;
02904       xx = 2*x;
02905       yy = 2*y;
02906       x2 = xx*x-1;
02907       x3 = xx*x2-x;
02908       y2 = yy*y-1;
02909       y3 = yy*y2-y;
02910       xy = x*y;
02911       p2 = x2*y;
02912       p3 = x3*y;
02913       q2 = y2*x;
02914       q3 = y3*x;
02915       pq = x2*y2;
02916       AC[1] = V1[1] + V1[2]*x + V1[3]*x2 + V1[5]*y + V1[6]*y2 + V1[7]*y3 +
02917          V1[9]*p2 + V1[10]*p3 + V1[11]*q2 + V1[12]*q3;
02918       AC[2] = V2[1] + V2[2]*x + V2[3]*x2 + V2[5]*y + V2[6]*y2 + V2[7]*y3 +
02919          V2[8]*xy + V2[9]*p2 + V2[11]*q2 + V2[12]*q3;
02920       AC[3] = V3[1] + V3[2]*x + V3[3]*x2 + V3[4]*x3 + V3[5]*y + V3[6]*y2 + V3[7]*y3 +
02921          V3[8]*xy + V3[9]*p2 + V3[10]*p3 + V3[11]*q2 + V3[12]*q3 + V3[13]*pq;
02922       AC[4] = V4[1] + V4[2]*x + V4[3]*x2 + V4[4]*x3 + V4[5]*y + V4[6]*y2 + V4[7]*y3 +
02923          V4[8]*xy + V4[9]*p2 + V4[10]*p3 + V4[11]*q2 + V4[12]*q3;
02924       AC[5] = V5[1] + V5[2]*x + V5[3]*x2 + V5[4]*x3 + V5[5]*y + V5[6]*y2 + V5[7]*y3 +
02925          V5[8]*xy + V5[11]*q2 + V5[12]*q3 + V5[13]*pq;
02926       AC[6] = V6[1] + V6[2]*x + V6[3]*x2 + V6[4]*x3 + V6[5]*y + V6[6]*y2 + V6[7]*y3 +
02927          V6[8]*xy + V6[9]*p2 + V6[10]*p3 + V6[11]*q2 + V6[12]*q3 + V6[13]*pq;
02928       AC[7] = V7[1] + V7[2]*x + V7[3]*x2 + V7[5]*y + V7[6]*y2 + V7[7]*y3 +
02929          V7[8]*xy + V7[11]*q2;
02930       AC[8] = V8[1] + V8[2]*x + V8[3]*x2 + V8[5]*y + V8[6]*y2 + V8[7]*y3 +
02931          V8[8]*xy + V8[11]*q2;
02932       AC[0] = -3.04;
02933    } else {
02934       itype = 4;
02935       if (rkappa >=0.02) itype = 3;
02936       npt = 200;
02937       x = 1+(rkappa-BKMXX1)*FBKX1;
02938       y = 1+(TMath::Sqrt(beta2)-BKMXY1)*FBKY1;
02939       xx = 2*x;
02940       yy = 2*y;
02941       x2 = xx*x-1;
02942       x3 = xx*x2-x;
02943       y2 = yy*y-1;
02944       y3 = yy*y2-y;
02945       xy = x*y;
02946       p2 = x2*y;
02947       p3 = x3*y;
02948       q2 = y2*x;
02949       q3 = y3*x;
02950       pq = x2*y2;
02951       if (itype==3){
02952          AC[1] = U1[1] + U1[2]*x + U1[3]*x2 + U1[5]*y + U1[6]*y2 + U1[7]*y3 +
02953             U1[8]*xy + U1[10]*p3 + U1[12]*q3 + U1[13]*pq;
02954          AC[2] = U2[1] + U2[2]*x + U2[3]*x2 + U2[5]*y + U2[6]*y2 + U2[7]*y3 +
02955             U2[8]*xy + U2[9]*p2 + U2[10]*p3 + U2[12]*q3 + U2[13]*pq;
02956          AC[3] = U3[1] + U3[2]*x + U3[3]*x2 + U3[5]*y + U3[6]*y2 + U3[7]*y3 +
02957             U3[8]*xy + U3[9]*p2 + U3[10]*p3 + U3[11]*q2 + U3[12]*q3 + U3[13]*pq;
02958          AC[4] = U4[1] + U4[2]*x + U4[3]*x2 + U4[4]*x3 + U4[5]*y + U4[6]*y2 + U4[7]*y3 +
02959             U4[8]*xy + U4[9]*p2 + U4[10]*p3 + U4[11]*q2 + U4[12]*q3;
02960          AC[5] = U5[1] + U5[2]*x + U5[3]*x2 + U5[4]*x3 + U5[5]*y + U5[6]*y2 + U5[7]*y3 +
02961             U5[8]*xy + U5[10]*p3 + U5[11]*q2 + U5[12]*q3 + U5[13]*pq;
02962          AC[6] = U6[1] + U6[2]*x + U6[3]*x2 + U6[4]*x3 + U6[5]*y + U6[7]*y3 +
02963             U6[8]*xy + U6[9]*p2 + U6[10]*p3 + U6[12]*q3 + U6[13]*pq;
02964          AC[7] = U7[1] + U7[2]*x + U7[3]*x2 + U7[4]*x3 + U7[5]*y + U7[6]*y2 + U7[8]*xy;
02965       }
02966       AC[8] = U8[1] + U8[2]*x + U8[3]*x2 + U8[4]*x3 + U8[5]*y + U8[6]*y2 + U8[7]*y3 +
02967          U8[8]*xy + U8[9]*p2 + U8[10]*p3 + U8[11]*q2 + U8[13]*pq;
02968       AC[0] = -3.03;
02969    }
02970 
02971    AC[9] = (AC[8] - AC[0])/npt;
02972    AC[10] = 1./AC[9];
02973    if (itype == 3) {
02974       x = (AC[7]-AC[8])/(AC[7]*AC[8]);
02975       y = 1./TMath::Log(AC[8]/AC[7]);
02976       p2 = AC[7]*AC[7];
02977       AC[11] = p2*(AC[1]*TMath::Exp(-AC[2]*(AC[7]+AC[5]*p2)-
02978                                     AC[3]*TMath::Exp(-AC[4]*(AC[7]+AC[6]*p2)))-0.045*y/AC[7])/(1+x*y*AC[7]);
02979       AC[12] = (0.045+x*AC[11])*y;
02980    }
02981    if (itype == 4) AC[13] = 0.995/LandauI(AC[8]);
02982 
02983    if (mode==0) return;
02984    
02985    x = AC[0];
02986    WCM[0] = 0;
02987    Double_t fl, fu;
02988    Int_t k;
02989    fl = TMath::VavilovDenEval(x, AC, HC, itype);
02990    for (k=1; k<=npt; k++) {
02991       x += AC[9];
02992       fu = TMath::VavilovDenEval(x, AC, HC, itype);
02993       WCM[k] = WCM[k-1] + fl + fu;
02994       fl = fu;
02995    }
02996    x = 0.5*AC[9];
02997    for (k=1; k<=npt; k++)
02998       WCM[k]*=x;
02999 }
03000 
03001 
03002 Double_t TMath::VavilovDenEval(Double_t rlam, Double_t *AC, Double_t *HC, Int_t itype)
03003 {
03004    
03005 
03006    Double_t v = 0;
03007    if (rlam < AC[0] || rlam > AC[8])
03008       return 0;
03009    Int_t k;
03010    Double_t x, fn, s;
03011    Double_t h[10];
03012    if (itype ==1 ) {
03013       fn = 1;
03014       x = (rlam + HC[0])*HC[1];
03015       h[1] = x;
03016       h[2] = x*x -1;
03017       for (k=2; k<=8; k++) {
03018          fn++;
03019          h[k+1] = x*h[k]-fn*h[k-1];
03020       }
03021       s = 1 + HC[7]*h[9];
03022       for (k=2; k<=6; k++)
03023          s+=HC[k]*h[k+1];
03024       v = HC[8]*TMath::Exp(-0.5*x*x)*TMath::Max(s, 0.);
03025    }
03026    else if (itype == 2) {
03027       x = rlam*rlam;
03028       v = AC[1]*TMath::Exp(-AC[2]*(rlam+AC[5]*x) - AC[3]*TMath::Exp(-AC[4]*(rlam+AC[6]*x)));
03029    }
03030    else if (itype == 3) {
03031       if (rlam < AC[7]) {
03032          x = rlam*rlam;
03033          v = AC[1]*TMath::Exp(-AC[2]*(rlam+AC[5]*x)-AC[3]*TMath::Exp(-AC[4]*(rlam+AC[6]*x)));
03034       } else {
03035          x = 1./rlam;
03036          v = (AC[11]*x + AC[12])*x;
03037       }
03038    }
03039    else if (itype == 4) {
03040       v = AC[13]*TMath::Landau(rlam);
03041    }
03042    return v;
03043 }