45 double exactIntegral(
double a,
double b) {
47 return (TMath::ATan(2*b)- TMath::ATan(2*a))/ TMath::Pi();
49 double func(
double x){
51 return TMath::BreitWigner(x);
55 double func2(
const double *x,
const double * = 0){
57 return TMath::BreitWigner(x[0]);
63 void testIntegPerf(
double x1,
double x2,
int n = 100000){
66 std::cout <<
"\n\n***************************************************************\n";
67 std::cout <<
"Test integration performances in interval [ " << x1 <<
" , " << x2 <<
" ]\n\n";
71 double dx = (x2-x1)/
double(n);
74 ROOT::Math::WrappedFunction<> f1(func);
77 ROOT::Math::Integrator ig(f1 );
80 for (
int i = 0; i < n; ++i) {
82 s1+= ig.Integral(x1,x);
85 std::cout <<
"Time using ROOT::Math::Integrator :\t" << timer.RealTime() << std::endl;
86 std::cout <<
"Number of function calls = " << nc/n << std::endl;
87 int pr = std::cout.precision(18); std::cout << s1 << std::endl; std::cout.precision(pr);
92 TF1 *fBW =
new TF1(
"fBW",func2,x1, x2,0);
97 for (
int i = 0; i < n; ++i) {
99 s2+= fBW->Integral(x1,x );
102 std::cout <<
"Time using TF1::Integral :\t\t\t" << timer.RealTime() << std::endl;
103 std::cout <<
"Number of function calls = " << nc/n << std::endl;
104 pr = std::cout.precision(18); std::cout << s1 << std::endl; std::cout.precision(pr);
109 void DrawCumulative(
double x1,
double x2,
int n = 100){
111 std::cout <<
"\n\n***************************************************************\n";
112 std::cout <<
"Drawing cumulatives of BreitWigner in interval [ " << x1 <<
" , " << x2 <<
" ]\n\n";
115 double dx = (x2-x1)/
double(n);
117 TH1D *cum0 =
new TH1D(
"cum0",
"", n, x1, x2);
118 for (
int i = 1; i <= n; ++i) {
119 double x = x1 + dx*i;
120 cum0->SetBinContent(i, exactIntegral(x1, x));
125 ROOT::Math::Functor1D f1(& func);
128 ROOT::Math::Integrator ig(f1, ROOT::Math::IntegrationOneDim::kADAPTIVE,1.E-12,1.E-12);
130 TH1D *cum1 =
new TH1D(
"cum1",
"", n, x1, x2);
131 for (
int i = 1; i <= n; ++i) {
132 double x = x1 + dx*i;
133 cum1->SetBinContent(i, ig.Integral(x1,x));
137 TF1 *fBW =
new TF1(
"fBW",
"TMath::BreitWigner(x, 0, 1)",x1, x2);
140 TH1D *cum2 =
new TH1D(
"cum2",
"", n, x1, x2);
141 for (
int i = 1; i <= n; ++i) {
142 double x = x1 + dx*i;
143 cum2->SetBinContent(i, fBW->Integral(x1,x));
146 TH1D *cum10 =
new TH1D(
"cum10",
"", n, x1, x2);
147 TH1D *cum20 =
new TH1D(
"cum23",
"", n, x1, x2);
148 for (
int i = 1; i <= n; ++i) {
149 double delta = cum1->GetBinContent(i) - cum0->GetBinContent(i);
150 double delta2 = cum2->GetBinContent(i) - cum0->GetBinContent(i);
152 cum10->SetBinContent(i, delta );
153 cum10->SetBinError(i, std::numeric_limits<double>::epsilon() * cum1->GetBinContent(i) );
154 cum20->SetBinContent(i, delta2 );
158 TCanvas *c1 =
new TCanvas(
"c1",
"Integration example",20,10,800,500);
162 cum0->SetLineColor(kBlack);
163 cum0->SetTitle(
"BreitWigner - the cumulative");
165 cum1->SetLineStyle(2);
166 cum2->SetLineStyle(3);
167 cum1->SetLineColor(kBlue);
168 cum2->SetLineColor(kRed);
171 cum1->DrawCopy(
"same");
173 cum2->DrawCopy(
"same");
176 cum10->SetTitle(
"Difference");
178 cum10->SetLineColor(kBlue);
180 cum20->SetLineColor(kRed);
181 cum20->Draw(
"hsame");
183 TLegend * l =
new TLegend(0.11, 0.8, 0.7 ,0.89);
184 l->AddEntry(cum10,
"GSL integration - analytical ");
185 l->AddEntry(cum20,
"TF1::Integral - analytical ");
190 std::cout <<
"\n***************************************************************\n";
197 void mathmoreIntegration(
double a = -2,
double b = 2)
199 DrawCumulative(a, b);