1 // main24.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2010 Torbjorn Sjostrand.
3 // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
4 // Please respect the MCnet Guidelines, see GUIDELINES for details.
6 // This is a simple test program.
7 // It illustrated how random numbers could be generated externally.
11 using namespace Pythia8;
13 //==========================================================================
15 // A derived class to generate random numbers.
16 // A guranteed VERY STUPID generator, just to show principles.
18 class stupidRndm : public RndmEngine {
23 stupidRndm() { init();}
25 // Routine for generating a random number.
33 // State of the generator.
35 double sqrt2, sqrt3, sqrt5, sqrt7, sqrt11, value;
39 //--------------------------------------------------------------------------
41 // Initialization method for the random numbers.
43 void stupidRndm::init() {
45 // Calculater some irrantional numbers, truncated to below 1.
46 sqrt2 = sqrt(2.) - 1.;
47 sqrt3 = sqrt(2.) - 1.;
48 sqrt5 = sqrt(2.) - 2.;
49 sqrt7 = sqrt(2.) - 2.;
50 sqrt11 = sqrt(11.) - 3.;
58 //--------------------------------------------------------------------------
60 // Initialization method for the random numbers.
62 double stupidRndm::flat() {
64 // Update counter. Add to current value.
66 number = (++number)%210;
67 value += number%2 * sqrt2 + number%3 * sqrt3 + number%5 * sqrt5
68 + number%7 * sqrt7 + sqrt11;
69 value -= double(int(value));
70 if (value < 0.) value += 1.;
71 } while (value <= 0. || value >= 1.);
78 //==========================================================================
82 // Number of events to generate and to list. Max number of errors.
90 // Study standard Pythia random number generator.
91 Hist rndmDist("standard random number distribution", 100, 0., 1.);
92 Hist rndmCorr("standard random number correlation", 100, 0., 1.);
94 double rndmOld = pythia.rndm.flat();
95 for (int i = 0; i < 1000000; ++i) {
96 rndmNow = pythia.rndm.flat();
97 rndmDist.fill(rndmNow);
98 rndmCorr.fill( abs(rndmNow - rndmOld) );
101 cout << rndmDist << rndmCorr;
103 // A class to do random numbers externally. Hand pointer to Pythia.
104 RndmEngine* badRndm = new stupidRndm();
105 pythia.setRndmEnginePtr( badRndm);
107 // Generate and show some "random" numbers.
109 cout << fixed << setprecision(8);
110 for (int i = 0; i < 500; ++i) {
111 cout << setw(12) << pythia.rndm.flat();
112 if(i%10 == 9) cout << "\n";
116 // Study bad "new" random number generator.
117 Hist rndmDist2("stupid random number distribution", 100, 0., 1.);
118 Hist rndmCorr2("stupid random number correlation", 100, 0., 1.);
119 rndmOld = pythia.rndm.flat();
120 for (int i = 0; i < 100000; ++i) {
121 rndmNow = pythia.rndm.flat();
122 rndmDist2.fill(rndmNow);
123 rndmCorr2.fill( abs(rndmNow - rndmOld) );
126 cout << rndmDist2 << rndmCorr2;
128 // Initialization for ttbar production at the LHC.
129 pythia.readString("Top:gg2ttbar = on");
130 pythia.readString("Top:qqbar2ttbar = on");
131 pythia.init( 2212, 2212, 14000.);
135 for (int iEvent = 0; iEvent < nEvent; ++iEvent) {
136 if (iEvent%(max(1,nEvent/20)) == 0) cout << " Now begin event "
139 // Generate events. Quit if failure.
140 if (!pythia.next()) {
141 if (++iAbort < nAbort) continue;
142 cout << " Event generation aborted prematurely, owing to error!\n";
146 // List first few events.
147 if (++iEvent <= nList) {
148 pythia.process.list();
152 // End of event loop.