68 struct gsl_function_struct
    70   double (* 
function) (
double x, 
void * params);
    74 #define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)    78                          double epsabs, 
double epsrel,
    79                          double *
result, 
double *abserr,
   180     oocoutE((
TObject*)0,
Eval) << 
"RooGaussKronrodIntegrator1D::setLimits: cannot override integrand's limits" << endl;
   267 #define GSL_SUCCESS 0   268 #define GSL_EBADTOL 13     270 #define GSL_ERROR(a,b) oocoutE((TObject*)0,Eval) << "RooGaussKronrodIntegrator1D::integral() ERROR: " << a << endl ; return b ;   271 #define GSL_DBL_MIN        2.2250738585072014e-308   272 #define GSL_DBL_EPSILON    2.2204460492503131e-16   279                          double epsabs, 
double epsrel,
   280                          double *
result, 
double *abserr,
   286 static double rescale_error (
double err, 
const double result_abs, 
const double result_asc) ;
   289 rescale_error (
double err, 
const double result_abs, 
const double result_asc)
   293   if (result_asc != 0 && err != 0)
   295         double scale = 
TMath::Power((200 * err / result_asc), 1.5) ;
   299             err = result_asc * scale ;
   327 static const double x1[5] = {
   328   0.973906528517171720077964012084452,
   329   0.865063366688984510732096688423493,
   330   0.679409568299024406234327365114874,
   331   0.433395394129247190799265943165784,
   332   0.148874338981631210884826001129720
   336 static const double w10[5] = {
   337   0.066671344308688137593568809893332,
   338   0.149451349150580593145776339657697,
   339   0.219086362515982043995534934228163,
   340   0.269266719309996355091226921569469,
   341   0.295524224714752870173892994651338
   345 static const double x2[5] = {
   346   0.995657163025808080735527280689003,
   347   0.930157491355708226001207180059508,
   348   0.780817726586416897063717578345042,
   349   0.562757134668604683339000099272694,
   350   0.294392862701460198131126603103866
   354 static const double w21a[5] = {
   355   0.032558162307964727478818972459390,
   356   0.075039674810919952767043140916190,
   357   0.109387158802297641899210590325805,
   358   0.134709217311473325928054001771707,
   359   0.147739104901338491374841515972068
   363 static const double w21b[6] = {
   364   0.011694638867371874278064396062192,
   365   0.054755896574351996031381300244580,
   366   0.093125454583697605535065465083366,
   367   0.123491976262065851077958109831074,
   368   0.142775938577060080797094273138717,
   369   0.149445554002916905664936468389821
   373 static const double x3[11] = {
   374   0.999333360901932081394099323919911,
   375   0.987433402908088869795961478381209,
   376   0.954807934814266299257919200290473,
   377   0.900148695748328293625099494069092,
   378   0.825198314983114150847066732588520,
   379   0.732148388989304982612354848755461,
   380   0.622847970537725238641159120344323,
   381   0.499479574071056499952214885499755,
   382   0.364901661346580768043989548502644,
   383   0.222254919776601296498260928066212,
   384   0.074650617461383322043914435796506
   388 static const double w43a[10] = {
   389   0.016296734289666564924281974617663,
   390   0.037522876120869501461613795898115,
   391   0.054694902058255442147212685465005,
   392   0.067355414609478086075553166302174,
   393   0.073870199632393953432140695251367,
   394   0.005768556059769796184184327908655,
   395   0.027371890593248842081276069289151,
   396   0.046560826910428830743339154433824,
   397   0.061744995201442564496240336030883,
   398   0.071387267268693397768559114425516
   402 static const double w43b[12] = {
   403   0.001844477640212414100389106552965,
   404   0.010798689585891651740465406741293,
   405   0.021895363867795428102523123075149,
   406   0.032597463975345689443882222526137,
   407   0.042163137935191811847627924327955,
   408   0.050741939600184577780189020092084,
   409   0.058379395542619248375475369330206,
   410   0.064746404951445885544689259517511,
   411   0.069566197912356484528633315038405,
   412   0.072824441471833208150939535192842,
   413   0.074507751014175118273571813842889,
   414   0.074722147517403005594425168280423
   418 static const double x4[22] = {
   419   0.999902977262729234490529830591582,
   420   0.997989895986678745427496322365960,
   421   0.992175497860687222808523352251425,
   422   0.981358163572712773571916941623894,
   423   0.965057623858384619128284110607926,
   424   0.943167613133670596816416634507426,
   425   0.915806414685507209591826430720050,
   426   0.883221657771316501372117548744163,
   427   0.845710748462415666605902011504855,
   428   0.803557658035230982788739474980964,
   429   0.757005730685495558328942793432020,
   430   0.706273209787321819824094274740840,
   431   0.651589466501177922534422205016736,
   432   0.593223374057961088875273770349144,
   433   0.531493605970831932285268948562671,
   434   0.466763623042022844871966781659270,
   435   0.399424847859218804732101665817923,
   436   0.329874877106188288265053371824597,
   437   0.258503559202161551802280975429025,
   438   0.185695396568346652015917141167606,
   439   0.111842213179907468172398359241362,
   440   0.037352123394619870814998165437704
   444 static const double w87a[21] = {
   445   0.008148377384149172900002878448190,
   446   0.018761438201562822243935059003794,
   447   0.027347451050052286161582829741283,
   448   0.033677707311637930046581056957588,
   449   0.036935099820427907614589586742499,
   450   0.002884872430211530501334156248695,
   451   0.013685946022712701888950035273128,
   452   0.023280413502888311123409291030404,
   453   0.030872497611713358675466394126442,
   454   0.035693633639418770719351355457044,
   455   0.000915283345202241360843392549948,
   456   0.005399280219300471367738743391053,
   457   0.010947679601118931134327826856808,
   458   0.016298731696787335262665703223280,
   459   0.021081568889203835112433060188190,
   460   0.025370969769253827243467999831710,
   461   0.029189697756475752501446154084920,
   462   0.032373202467202789685788194889595,
   463   0.034783098950365142750781997949596,
   464   0.036412220731351787562801163687577,
   465   0.037253875503047708539592001191226
   469 static const double w87b[23] = {
   470   0.000274145563762072350016527092881,
   471   0.001807124155057942948341311753254,
   472   0.004096869282759164864458070683480,
   473   0.006758290051847378699816577897424,
   474   0.009549957672201646536053581325377,
   475   0.012329447652244853694626639963780,
   476   0.015010447346388952376697286041943,
   477   0.017548967986243191099665352925900,
   478   0.019938037786440888202278192730714,
   479   0.022194935961012286796332102959499,
   480   0.024339147126000805470360647041454,
   481   0.026374505414839207241503786552615,
   482   0.028286910788771200659968002987960,
   483   0.030052581128092695322521110347341,
   484   0.031646751371439929404586051078883,
   485   0.033050413419978503290785944862689,
   486   0.034255099704226061787082821046821,
   487   0.035262412660156681033782717998428,
   488   0.036076989622888701185500318003895,
   489   0.036698604498456094498018047441094,
   490   0.037120549269832576114119958413599,
   491   0.037334228751935040321235449094698,
   492   0.037361073762679023410321241766599
   499                      double epsabs, 
double epsrel,
   500                      double * 
result, 
double * abserr, 
size_t * neval)
   502   double fv1[5], fv2[5], fv3[5], fv4[5];
   504   double res10, res21, res43, res87;    
   505   double result_kronrod, err ; 
   509   const double half_length =  0.5 * (b - 
a);
   510   const double abs_half_length = 
fabs (half_length);
   511   const double center = 0.5 * (b + 
a);
   521       GSL_ERROR (
"tolerance cannot be acheived with given epsabs and epsrel",
   528   res21 = 
w21b[5] * f_center;
   531   for (k = 0; k < 5; k++)
   533       const double abscissa = half_length * 
x1[k];
   534       const double fval1 = 
GSL_FN_EVAL(f, center + abscissa);
   535       const double fval2 = 
GSL_FN_EVAL(f, center - abscissa);
   536       const double fval = fval1 + fval2;
   537       res10 += 
w10[k] * fval;
   538       res21 += 
w21a[k] * fval;
   545   for (k = 0; k < 5; k++)
   547       const double abscissa = half_length * 
x2[k];
   548       const double fval1 = 
GSL_FN_EVAL(f, center + abscissa);
   549       const double fval2 = 
GSL_FN_EVAL(f, center - abscissa);
   550       const double fval = fval1 + fval2;
   551       res21 += 
w21b[k] * fval;
   553       savfun[k + 5] = fval;
   558   resabs *= abs_half_length ;
   561     const double mean = 0.5 * res21;
   563     resasc = 
w21b[5] * 
fabs (f_center - mean);
   565     for (k = 0; k < 5; k++)
   568           (
w21a[k] * (
fabs (fv1[k] - mean) + 
fabs (fv2[k] - mean))
   569           + 
w21b[k] * (fabs (fv3[k] - mean) + 
fabs (fv4[k] - mean)));
   571     resasc *= abs_half_length ;
   574   result_kronrod = res21 * half_length;
   576   err = 
rescale_error ((res21 - res10) * half_length, resabs, resasc) ;
   580   if (err < epsabs || err < epsrel * fabs (result_kronrod))
   582       * result = result_kronrod ;
   590   res43 = 
w43b[11] * f_center;
   592   for (k = 0; k < 10; k++)
   594       res43 += savfun[k] * 
w43a[k];
   597   for (k = 0; k < 11; k++)
   599       const double abscissa = half_length * 
x3[k];
   600       const double fval = (
GSL_FN_EVAL(f, center + abscissa) 
   602       res43 += fval * 
w43b[k];
   603       savfun[k + 10] = fval;
   608   result_kronrod = res43 * half_length;
   609   err = 
rescale_error ((res43 - res21) * half_length, resabs, resasc);
   611   if (err < epsabs || err < epsrel * fabs (result_kronrod))
   613       * result = result_kronrod ;
   621   res87 = 
w87b[22] * f_center;
   623   for (k = 0; k < 21; k++)
   625       res87 += savfun[k] * 
w87a[k];
   628   for (k = 0; k < 22; k++)
   630       const double abscissa = half_length * 
x4[k];
   637   result_kronrod = res87 * half_length ;
   639   err = 
rescale_error ((res87 - res43) * half_length, resabs, resasc);
   641   if (err < epsabs || err < epsrel * fabs (result_kronrod))
   643       * result = result_kronrod ;
   651   * result = result_kronrod ;
 RooAbsIntegrator is the abstract interface for integrators of real-valued functions that implement th...
 
static double rescale_error(double err, const double result_abs, const double result_asc)
 
RooNumIntConfig holds the configuration parameters of the various numeric integrators used by RooReal...
 
Bool_t _useIntegrandLimits
 
int gsl_integration_qng(const gsl_function *f, double a, double b, double epsabs, double epsrel, double *result, double *abserr, size_t *neval)
 
static const double w87a[21]
 
static const double w43b[12]
 
static const double w21b[6]
 
RooNumIntFactory is a factory to instantiate numeric integrators from a given function binding and a ...
 
RooGaussKronrodIntegrator1D implements the Gauss-Kronrod integration algorithm. 
 
RooGaussKronrodIntegrator1D()
coverity[UNINIT_CTOR] Default constructor 
 
Double_t _xmax
Lower integration bound. 
 
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
 
static const double x2[5]
 
Double_t integrand(const Double_t x[]) const
 
Double_t _epsAbs
do not persist 
 
static const double x4[22]
 
Bool_t initialize()
Perform one-time initialization of integrator. 
 
static const double w10[5]
 
static const double w43a[10]
 
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
 
static void registerIntegrator(RooNumIntFactory &fact)
Register RooGaussKronrodIntegrator1D, its parameters and capabilities with RooNumIntConfig. 
 
UInt_t getDimension() const
 
virtual Double_t integral(const Double_t *yvec=0)
Calculate and return integral. 
 
virtual ~RooGaussKronrodIntegrator1D()
Destructor. 
 
virtual Bool_t checkLimits() const
Check that our integration range is finite and otherwise return kFALSE. 
 
const RooAbsFunc * _function
 
virtual Double_t getMinLimit(UInt_t dimension) const =0
 
static const double w21a[5]
 
const RooAbsFunc * integrand() const
 
static const double w87b[23]
 
static const double x1[5]
 
struct gsl_function_struct gsl_function
 
virtual Double_t getMaxLimit(UInt_t dimension) const =0
 
Bool_t setLimits(Double_t *xmin, Double_t *xmax)
Change our integration limits. 
 
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
 
Mother of all ROOT objects. 
 
virtual RooAbsIntegrator * clone(const RooAbsFunc &function, const RooNumIntConfig &config) const
Clone integrator with given function and configuration. Needed for RooNumIntFactory. 
 
Double_t * xvec(Double_t &xx)
 
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
 
friend double RooGaussKronrodIntegrator1D_GSL_GlueFunction(double x, void *data)
 
#define GSL_FN_EVAL(F, x)
 
Abstract interface for evaluating a real-valued function of one real variable and performing numerica...
 
Bool_t storeProtoIntegrator(RooAbsIntegrator *proto, const RooArgSet &defConfig, const char *depName="")
Method accepting registration of a prototype numeric integrator along with a RooArgSet of its default...
 
static const double x3[11]