00001 #include "Math/Random.h"
00002 #include "Math/GSLRndmEngines.h"
00003 #include "TStopwatch.h"
00004 #include "TRandom1.h"
00005 #include "TRandom2.h"
00006 #include "TRandom3.h"
00007 #include <iostream>
00008 #include <cmath>
00009 #include <typeinfo>
00010 #include "TH1D.h"
00011 #include "TStyle.h"
00012 #include "TF1.h"
00013 #include "TPaveLabel.h"
00014
00015 #include "TCanvas.h"
00016
00017 #ifndef PI
00018 #define PI 3.14159265358979323846264338328
00019 #endif
00020
00021 #define NLOOP 1000;
00022
00023 #define NEVT 10000;
00024
00025 using namespace ROOT::Math;
00026
00027 template <class R>
00028 void generate( R & r, TH1D * h) {
00029
00030 TStopwatch w;
00031
00032 r.SetSeed(0);
00033
00034 int m = NLOOP;
00035 int n = NEVT;
00036 for (int j = 0; j < m; ++j) {
00037
00038
00039
00040 w.Start();
00041
00042
00043
00044
00045
00046
00047
00048
00049 double n1=0;
00050 double rn[2000];
00051 double x;
00052 double y;
00053 for (int ievt = 0; ievt < n; ievt+=1000 ) {
00054 r.RndmArray(2000,rn);
00055 for (int i=0; i < 1000; i++) {
00056 x=rn[2*i];
00057 y=rn[2*i+1];
00058 if ( ( x*x + y*y ) <= 1.0 ) n1++;
00059 }
00060 }
00061 double piEstimate = 4.0 * double(n1)/double(n);
00062 double delta = piEstimate-PI;
00063 h->Fill(delta);
00064 }
00065
00066 w.Stop();
00067 std::cout << std::endl;
00068 std::cout << "Random: " << typeid(r).name()
00069 << "\n\tTime = " << w.RealTime() << " " << w.CpuTime() << std::endl;
00070 std::cout << "Time/call: " << w.CpuTime()/(2*n)*1.0E9 << std::endl;
00071 }
00072
00073 int piRandom() {
00074
00075 TRandom r0;
00076 TRandom1 r1;
00077 TRandom2 r2;
00078 TRandom3 r3;
00079
00080
00081
00082
00083 double n = NEVT;
00084 int nloop = NLOOP;
00085 double dy = 15/std::sqrt(n);
00086
00087 TH1D * h0 = new TH1D("h0","TRandom delta",100,-dy,dy);
00088 TH1D * h1 = new TH1D("h1","TRandom1 delta",100,-dy,dy);
00089 TH1D * h2 = new TH1D("h2","TRandom2 delta",100,-dy,dy);
00090 TH1D * h3 = new TH1D("h3","TRandom3 delta",100,-dy,dy);
00091
00092 double sigma = std::sqrt( PI * (4 - PI)/n );
00093 std::cout << "**********************************************************" << std::endl;
00094 std::cout << " Generate " << int(n) << " for " << nloop << " times " << std::endl;
00095 std::cout << "**********************************************************" << std::endl;
00096 std::cout << "\tExpected Sigma = " << sigma << std::endl;
00097
00098 #define INTERACTIVE
00099 #ifdef INTERACTIVE
00100
00101 double del, err;
00102 TCanvas * c1 = new TCanvas("c1_piRandom","PI Residuals");
00103 gStyle->SetOptFit(1111);
00104 gStyle->SetOptLogy();
00105 c1->Divide(2,2);
00106 c1->cd(1);
00107 generate(r0,h0);
00108 h0->Fit("gaus");
00109 h0->Draw();
00110 TF1 * fg = (TF1*) h0->FindObject("gaus");
00111 if (fg) {
00112 del = (fg->GetParameter(2)-sigma);
00113 err = fg->GetParError(2);
00114 }
00115 else { del = -999; err = 1; }
00116
00117 char text[20];
00118 sprintf(text,"Spread %8.4f",del/err);
00119 TPaveLabel * pl0 = new TPaveLabel(0.6,0.3,0.9,0.4,text,"brNDC");
00120 pl0->Draw();
00121
00122
00123
00124
00125 c1->cd(2);
00126 generate(r1,h1);
00127 h1->Fit("gaus");
00128 h1->Draw();
00129 fg = (TF1*) h1->FindObject("gaus");
00130 if (fg) {
00131 del = (fg->GetParameter(2)-sigma);
00132 err = fg->GetParError(2);
00133 }
00134 else { del = -999; err = 1; }
00135
00136 sprintf(text,"Spread %8.4f",del/err);
00137 TPaveLabel * pl1 = new TPaveLabel(0.6,0.3,0.9,0.4,text,"brNDC");
00138 pl1->Draw();
00139
00140
00141 c1->cd(3);
00142 generate(r2,h2);
00143 h2->Fit("gaus");
00144 h2->Draw();
00145 fg = (TF1*) h2->FindObject("gaus");
00146 if (fg) {
00147 del = (fg->GetParameter(2)-sigma);
00148 err = fg->GetParError(2);
00149 }
00150 else { del = -999; err = 1; }
00151
00152 sprintf(text,"Spread %8.4f",del/err);
00153 TPaveLabel * pl2 = new TPaveLabel(0.6,0.3,0.9,0.4,text,"brNDC");
00154 pl2->Draw();
00155
00156
00157 c1->cd(4);
00158 generate(r3,h3);
00159 h3->Fit("gaus");
00160 h3->Draw();
00161 fg = (TF1*) h3->FindObject("gaus");
00162 if (fg) {
00163 del = (fg->GetParameter(2)-sigma);
00164 err = fg->GetParError(2);
00165 }
00166 else { del = -999; err = 1; }
00167
00168 sprintf(text,"Spread %8.4f",del/err);
00169 TPaveLabel * pl3 = new TPaveLabel(0.6,0.3,0.9,0.4,text,"brNDC");
00170 pl3->Draw();
00171
00172 #else
00173 generate(r0,h0);
00174 generate(r1,h1);
00175 generate(r2,h2);
00176 generate(r3,h3);
00177 #endif
00178
00179 return 0;
00180
00181 }
00182
00183 int main() {
00184
00185 piRandom();
00186 return 0;
00187 }