piRandom.C

Go to the documentation of this file.
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      /* pi */
00019 #endif
00020 
00021 #define NLOOP 1000;
00022 //#define NEVT 20000000;
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   //r.SetSeed(int(std::pow(2.0,28)));
00034   int m = NLOOP;
00035   int n = NEVT;
00036   for (int j = 0; j < m; ++j) { 
00037 
00038     //std::cout << r.GetSeed() << "   "; 
00039 
00040     w.Start();
00041 //     if ( n < 40000000) iseed = std::rand();
00042 //     iseed = 0;
00043     //TRandom3 r3(0);
00044     //r.SetSeed( 0 ); // generate random seeds
00045     //TRandom3 r3(0); 
00046     //r.SetSeed (static_cast<UInt_t> (4294967296.*r3.Rndm()) );
00047 
00048   // estimate PI
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   //Random<GSLRngRand>       r1;
00080 //   Random<GSLRngTaus>       r2;
00081 //   Random<GSLRngRanLux>     r3;
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 }

Generated on Tue Jul 5 14:34:58 2011 for ROOT_528-00b_version by  doxygen 1.5.1