From $ROOTSYS/tutorials/math/mathmoreIntegration.C

//+ Example on the  usage of the adaptive 1D integration algorithm of MathMore
// it calculates the numerically cumulative integral of a distribution (like in this case the BreitWigner)
// to execute the macro type it (you need to compile with AClic)
//
// root[0]: .x mathmoreIntegration.C+
//
// This tutorials require having libMathMore built with ROOT.
//
// To build mathmore you need to have a version of GSL >= 1.8 installed in your system
// The ROOT configure will automatically find GSL if the script gsl-config (from GSL) is in your PATH,.
// otherwise you need to configure root with the options --gsl-incdir and --gsl-libdir.
//
//
// Authors: M. Slawinska and L. Moneta

#include "TMath.h"
#include "TH1.h"
#include "TCanvas.h"
#include "TLegend.h"

//#include "TLabel.h"
#include "Math/Functor.h"
#include "Math/WrappedFunction.h"
#include "Math/IFunction.h"
#include "Math/Integrator.h"
#include <iostream>

#include "TStopwatch.h"
#include "TF1.h"

#include <limits>

//!calculates exact integral of Breit Wigner distribution
//!and compares with existing methods

int nc = 0;
double exactIntegral( double a, double b) {

  return (TMath::ATan(2*b)- TMath::ATan(2*a))/ TMath::Pi();
}
double func( double x){
   nc++;
   return TMath::BreitWigner(x);
}
// TF1 requires the function to have the ( )( double *, double *) signature
double func2(const double *x, const double * = 0){
   nc++;
   return TMath::BreitWigner(x[0]);
}




void  testIntegPerf(double x1, double x2, int n = 100000){


   std::cout << "\n\n***************************************************************\n";
   std::cout << "Test integration performances in interval [ " << x1 << " , " << x2 << " ]\n\n";

  TStopwatch timer;

  double dx = (x2-x1)/double(n);

  //ROOT::Math::Functor1D<ROOT::Math::IGenFunction> f1(& TMath::BreitWigner);
  ROOT::Math::WrappedFunction<> f1(func);

  timer.Start();
  ROOT::Math::Integrator ig(f1 );
  double s1 = 0.0;
  nc = 0;
  for (int i = 0; i < n; ++i) {
     double x = x1 + dx*i;
     s1+= ig.Integral(x1,x);
  }
  timer.Stop();
  std::cout << "Time using ROOT::Math::Integrator        :\t" << timer.RealTime() << std::endl;
  std::cout << "Number of function calls = " << nc/n << std::endl;
  int pr = std::cout.precision(18);  std::cout << s1 << std::endl;  std::cout.precision(pr);



  //TF1 *fBW = new TF1("fBW","TMath::BreitWigner(x)",x1, x2);  //  this is faster but cannot measure number of function calls
  TF1 *fBW = new TF1("fBW",func2,x1, x2,0);

  timer.Start();
  nc = 0;
  double s2 = 0;
  for (int i = 0; i < n; ++i) {
     double x = x1 + dx*i;
     s2+= fBW->Integral(x1,x );
  }
  timer.Stop();
  std::cout << "Time using TF1::Integral :\t\t\t" << timer.RealTime() << std::endl;
  std::cout << "Number of function calls = " << nc/n << std::endl;
  pr = std::cout.precision(18);  std::cout << s1 << std::endl;  std::cout.precision(pr);


}

void  DrawCumulative(double x1, double x2, int n = 100){

   std::cout << "\n\n***************************************************************\n";
   std::cout << "Drawing cumulatives of BreitWigner in interval [ " << x1 << " , " << x2 << " ]\n\n";


   double dx = (x2-x1)/double(n);

   TH1D *cum0 = new TH1D("cum0", "", n, x1, x2); //exact cumulative
   for (int i = 1; i <= n; ++i) {
      double x = x1 + dx*i;
      cum0->SetBinContent(i, exactIntegral(x1, x));

   }

   // alternative method using ROOT::Math::Functor class
   ROOT::Math::Functor1D f1(& func);


   ROOT::Math::Integrator ig(f1, ROOT::Math::IntegrationOneDim::kADAPTIVE,1.E-12,1.E-12);

   TH1D *cum1 = new TH1D("cum1", "", n, x1, x2);
   for (int i = 1; i <= n; ++i) {
      double x = x1 + dx*i;
      cum1->SetBinContent(i, ig.Integral(x1,x));
   }


   TF1 *fBW = new TF1("fBW","TMath::BreitWigner(x, 0, 1)",x1, x2);


   TH1D *cum2 = new TH1D("cum2", "", n, x1, x2);
   for (int i = 1; i <= n; ++i) {
      double x = x1 + dx*i;
      cum2->SetBinContent(i, fBW->Integral(x1,x));
   }

   TH1D *cum10 = new TH1D("cum10", "", n, x1, x2); //difference between  1 and exact
   TH1D *cum20 = new TH1D("cum23", "", n, x1, x2); //difference between 2 and excact
   for (int i = 1; i <= n; ++i) {
      double delta  =  cum1->GetBinContent(i) - cum0->GetBinContent(i);
      double delta2 =  cum2->GetBinContent(i) - cum0->GetBinContent(i);
      //std::cout << " diff for " << x << " is " << delta << "  " << cum1->GetBinContent(i) << std::endl;
      cum10->SetBinContent(i, delta );
      cum10->SetBinError(i, std::numeric_limits<double>::epsilon() * cum1->GetBinContent(i) );
      cum20->SetBinContent(i, delta2 );
   }


   TCanvas *c1 = new TCanvas("c1","Integration example",20,10,800,500);
   c1->Divide(2,1);
   c1->Draw();

   cum0->SetLineColor(kBlack);
   cum0->SetTitle("BreitWigner - the cumulative");
   cum0->SetStats(0);
   cum1->SetLineStyle(2);
   cum2->SetLineStyle(3);
   cum1->SetLineColor(kBlue);
   cum2->SetLineColor(kRed);
   c1->cd(1);
   cum0->DrawCopy("h");
   cum1->DrawCopy("same");
   //cum2->DrawCopy("same");
   cum2->DrawCopy("same");

   c1->cd(2);
   cum10->SetTitle("Difference");
   cum10->SetStats(0);
   cum10->SetLineColor(kBlue);
   cum10->Draw("e0");
   cum20->SetLineColor(kRed);
   cum20->Draw("hsame");

   TLegend * l = new TLegend(0.11, 0.8, 0.7 ,0.89);
   l->AddEntry(cum10, "GSL integration - analytical ");
   l->AddEntry(cum20, "TF1::Integral  - analytical ");
   l->Draw();


   c1->Update();
   std::cout << "\n***************************************************************\n";


}



void mathmoreIntegration(double a = -2, double b = 2)
{
#if defined(__CINT__) && !defined(__MAKECINT__)
  cout << "WARNING: This tutorial can run only using ACliC, you must run it by doing: " << endl;
  cout << "\t .x $ROOTSYS/tutorials/math/mathmoreIntegration.C+" << endl;
  return;
#endif

   DrawCumulative(a, b);
   testIntegPerf(a, b);
}

 mathmoreIntegration.C:1
 mathmoreIntegration.C:2
 mathmoreIntegration.C:3
 mathmoreIntegration.C:4
 mathmoreIntegration.C:5
 mathmoreIntegration.C:6
 mathmoreIntegration.C:7
 mathmoreIntegration.C:8
 mathmoreIntegration.C:9
 mathmoreIntegration.C:10
 mathmoreIntegration.C:11
 mathmoreIntegration.C:12
 mathmoreIntegration.C:13
 mathmoreIntegration.C:14
 mathmoreIntegration.C:15
 mathmoreIntegration.C:16
 mathmoreIntegration.C:17
 mathmoreIntegration.C:18
 mathmoreIntegration.C:19
 mathmoreIntegration.C:20
 mathmoreIntegration.C:21
 mathmoreIntegration.C:22
 mathmoreIntegration.C:23
 mathmoreIntegration.C:24
 mathmoreIntegration.C:25
 mathmoreIntegration.C:26
 mathmoreIntegration.C:27
 mathmoreIntegration.C:28
 mathmoreIntegration.C:29
 mathmoreIntegration.C:30
 mathmoreIntegration.C:31
 mathmoreIntegration.C:32
 mathmoreIntegration.C:33
 mathmoreIntegration.C:34
 mathmoreIntegration.C:35
 mathmoreIntegration.C:36
 mathmoreIntegration.C:37
 mathmoreIntegration.C:38
 mathmoreIntegration.C:39
 mathmoreIntegration.C:40
 mathmoreIntegration.C:41
 mathmoreIntegration.C:42
 mathmoreIntegration.C:43
 mathmoreIntegration.C:44
 mathmoreIntegration.C:45
 mathmoreIntegration.C:46
 mathmoreIntegration.C:47
 mathmoreIntegration.C:48
 mathmoreIntegration.C:49
 mathmoreIntegration.C:50
 mathmoreIntegration.C:51
 mathmoreIntegration.C:52
 mathmoreIntegration.C:53
 mathmoreIntegration.C:54
 mathmoreIntegration.C:55
 mathmoreIntegration.C:56
 mathmoreIntegration.C:57
 mathmoreIntegration.C:58
 mathmoreIntegration.C:59
 mathmoreIntegration.C:60
 mathmoreIntegration.C:61
 mathmoreIntegration.C:62
 mathmoreIntegration.C:63
 mathmoreIntegration.C:64
 mathmoreIntegration.C:65
 mathmoreIntegration.C:66
 mathmoreIntegration.C:67
 mathmoreIntegration.C:68
 mathmoreIntegration.C:69
 mathmoreIntegration.C:70
 mathmoreIntegration.C:71
 mathmoreIntegration.C:72
 mathmoreIntegration.C:73
 mathmoreIntegration.C:74
 mathmoreIntegration.C:75
 mathmoreIntegration.C:76
 mathmoreIntegration.C:77
 mathmoreIntegration.C:78
 mathmoreIntegration.C:79
 mathmoreIntegration.C:80
 mathmoreIntegration.C:81
 mathmoreIntegration.C:82
 mathmoreIntegration.C:83
 mathmoreIntegration.C:84
 mathmoreIntegration.C:85
 mathmoreIntegration.C:86
 mathmoreIntegration.C:87
 mathmoreIntegration.C:88
 mathmoreIntegration.C:89
 mathmoreIntegration.C:90
 mathmoreIntegration.C:91
 mathmoreIntegration.C:92
 mathmoreIntegration.C:93
 mathmoreIntegration.C:94
 mathmoreIntegration.C:95
 mathmoreIntegration.C:96
 mathmoreIntegration.C:97
 mathmoreIntegration.C:98
 mathmoreIntegration.C:99
 mathmoreIntegration.C:100
 mathmoreIntegration.C:101
 mathmoreIntegration.C:102
 mathmoreIntegration.C:103
 mathmoreIntegration.C:104
 mathmoreIntegration.C:105
 mathmoreIntegration.C:106
 mathmoreIntegration.C:107
 mathmoreIntegration.C:108
 mathmoreIntegration.C:109
 mathmoreIntegration.C:110
 mathmoreIntegration.C:111
 mathmoreIntegration.C:112
 mathmoreIntegration.C:113
 mathmoreIntegration.C:114
 mathmoreIntegration.C:115
 mathmoreIntegration.C:116
 mathmoreIntegration.C:117
 mathmoreIntegration.C:118
 mathmoreIntegration.C:119
 mathmoreIntegration.C:120
 mathmoreIntegration.C:121
 mathmoreIntegration.C:122
 mathmoreIntegration.C:123
 mathmoreIntegration.C:124
 mathmoreIntegration.C:125
 mathmoreIntegration.C:126
 mathmoreIntegration.C:127
 mathmoreIntegration.C:128
 mathmoreIntegration.C:129
 mathmoreIntegration.C:130
 mathmoreIntegration.C:131
 mathmoreIntegration.C:132
 mathmoreIntegration.C:133
 mathmoreIntegration.C:134
 mathmoreIntegration.C:135
 mathmoreIntegration.C:136
 mathmoreIntegration.C:137
 mathmoreIntegration.C:138
 mathmoreIntegration.C:139
 mathmoreIntegration.C:140
 mathmoreIntegration.C:141
 mathmoreIntegration.C:142
 mathmoreIntegration.C:143
 mathmoreIntegration.C:144
 mathmoreIntegration.C:145
 mathmoreIntegration.C:146
 mathmoreIntegration.C:147
 mathmoreIntegration.C:148
 mathmoreIntegration.C:149
 mathmoreIntegration.C:150
 mathmoreIntegration.C:151
 mathmoreIntegration.C:152
 mathmoreIntegration.C:153
 mathmoreIntegration.C:154
 mathmoreIntegration.C:155
 mathmoreIntegration.C:156
 mathmoreIntegration.C:157
 mathmoreIntegration.C:158
 mathmoreIntegration.C:159
 mathmoreIntegration.C:160
 mathmoreIntegration.C:161
 mathmoreIntegration.C:162
 mathmoreIntegration.C:163
 mathmoreIntegration.C:164
 mathmoreIntegration.C:165
 mathmoreIntegration.C:166
 mathmoreIntegration.C:167
 mathmoreIntegration.C:168
 mathmoreIntegration.C:169
 mathmoreIntegration.C:170
 mathmoreIntegration.C:171
 mathmoreIntegration.C:172
 mathmoreIntegration.C:173
 mathmoreIntegration.C:174
 mathmoreIntegration.C:175
 mathmoreIntegration.C:176
 mathmoreIntegration.C:177
 mathmoreIntegration.C:178
 mathmoreIntegration.C:179
 mathmoreIntegration.C:180
 mathmoreIntegration.C:181
 mathmoreIntegration.C:182
 mathmoreIntegration.C:183
 mathmoreIntegration.C:184
 mathmoreIntegration.C:185
 mathmoreIntegration.C:186
 mathmoreIntegration.C:187
 mathmoreIntegration.C:188
 mathmoreIntegration.C:189
 mathmoreIntegration.C:190
 mathmoreIntegration.C:191
 mathmoreIntegration.C:192
 mathmoreIntegration.C:193
 mathmoreIntegration.C:194
 mathmoreIntegration.C:195
 mathmoreIntegration.C:196
 mathmoreIntegration.C:197
 mathmoreIntegration.C:198
 mathmoreIntegration.C:199
 mathmoreIntegration.C:200