//+ 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" //!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(& TMath::BreitWigner); 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) { 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 |
|