Files
geant4/source/global/HEPRandom/test/G4RandDistributionTest.cc
T
2016-06-08 15:34:16 +02:00

234 lines
8.9 KiB
C++

// This code implementation is the intellectual property of
// the GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4RandDistributionTest.cc,v 1.3 1999/11/23 15:00:00 gcosmo Exp $
// GEANT4 tag $Name: geant4-01-01 $
//
//
// ----------------------------------------------------------------------
#include "Randomize.hh"
#include "G4ios.hh"
HepJamesRandom theJamesEngine;
RandEngine theRandEngine;
DRand48Engine theDRand48Engine;
RanluxEngine theRanluxEngine(19780503,4);
RanecuEngine theRanecuEngine;
void init()
{
char Pause;
G4cout << G4endl << G4endl;
G4cout << "---------------------------- Random shooting test -----------------------------" << G4endl;
G4cout << " -------------------- " << G4endl;
G4cout << " >>> Random Engines available <<<" << G4endl << G4endl;
G4cout << " > HepJamesRandom (default)" << G4endl;
G4cout << " > Rand" << G4endl;
G4cout << " > DRand48" << G4endl;
G4cout << " > Ranlux" << G4endl;
G4cout << " > Ranecu" << G4endl << G4endl;
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
} // end init()
void layout()
{
HepFloat m=3.0;
const HepInt size=5;
HepDouble vect[size];
G4cout << " Flat ]0,1[ : " << RandFlat::shoot() << G4endl;
G4cout << " Flat ]0,5[ : " << RandFlat::shoot(5) << G4endl;
G4cout << " Flat ]-5,3[ : " << RandFlat::shoot(-5,3) << G4endl;
G4cout << " Exp (m=1) : " << RandExponential::shoot() << G4endl;
G4cout << " Exp (m=3) : " << RandExponential::shoot(3) << G4endl;
G4cout << " Gauss (m=1) : " << RandGauss::shoot() << G4endl;
G4cout << " Gauss (m=3,v=1) : " << RandGauss::shoot(3,1) << G4endl;
G4cout << " Wigner(1,0.2) : " << RandBreitWigner::shoot(1,0.2) << G4endl;
G4cout << " Wigner(1,0.2,1) : " << RandBreitWigner::shoot(1,0.2,1) << G4endl;
G4cout << " Wigner2(1,0.2) : " << RandBreitWigner::shootM2(1,0.2) << G4endl;
G4cout << " Wigner2(1,0.2,1) : " << RandBreitWigner::shootM2(1,0.2,1) << G4endl;
G4cout << " IntFlat [0,99[ : " << RandFlat::shootInt(99) << G4endl;
G4cout << " IntFlat [-99,37[ : " << RandFlat::shootInt(-99,37) << G4endl;
G4cout << " Poisson (m=3.0) : " << RandPoisson::shoot(m) << G4endl;
G4cout << G4endl;
G4cout << " Shooting an array of 5 flat numbers ..." << G4endl << G4endl;
RandFlat::shootArray(size,vect);
for ( HepInt i=0; i<size; ++i )
G4cout << " " << vect[i];
G4cout << G4endl << G4endl;
} // end layout()
void dist_layout()
{
HepFloat m=3.0;
const HepInt size=5;
HepDouble vect[size];
char Pause;
HepJamesRandom aJamesEngine;
RandEngine aRandEngine;
DRand48Engine aDRand48Engine;
RanluxEngine aRanluxEngine(19780503,4);
RanecuEngine aRanecuEngine;
RandFlat aFlatObj(aJamesEngine);
RandExponential anExponentialObj(aRandEngine);
RandGauss aGaussObj(aDRand48Engine);
RandBreitWigner aBreitObj(aRanluxEngine);
RandPoisson aPoissonObj(aRanecuEngine);
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << "-------------------- Shooting test on distribution objects --------------------" << G4endl;
G4cout << G4endl;
G4cout << " Flat ]0,1[ : " << aFlatObj.fire() << G4endl;
G4cout << " Flat ]0,5[ : " << aFlatObj.fire(5) << G4endl;
G4cout << " Flat ]-5,3[ : " << aFlatObj.fire(-5,3) << G4endl;
G4cout << " Exp (m=1) : " << anExponentialObj.fire() << G4endl;
G4cout << " Exp (m=3) : " << anExponentialObj.fire(3) << G4endl;
G4cout << " Gauss (m=1) : " << aGaussObj.fire() << G4endl;
G4cout << " Gauss (m=3,v=1) : " << aGaussObj.fire(3,1) << G4endl;
G4cout << " Wigner(1,0.2) : " << aBreitObj.fire(1,0.2) << G4endl;
G4cout << " Wigner(1,0.2,1) : " << aBreitObj.fire(1,0.2,1) << G4endl;
G4cout << " Wigner2(1,0.2) : " << aBreitObj.fireM2(1,0.2) << G4endl;
G4cout << " Wigner2(1,0.2,1) : " << aBreitObj.fireM2(1,0.2,1) << G4endl;
G4cout << " IntFlat [0,99[ : " << aFlatObj.fireInt(99) << G4endl;
G4cout << " IntFlat [-99,37[ : " << aFlatObj.fireInt(-99,37) << G4endl;
G4cout << " Poisson (m=3.0) : " << aPoissonObj.fire(m) << G4endl;
G4cout << G4endl;
G4cout << " Shooting an array of 5 flat numbers ..." << G4endl << G4endl;
aFlatObj.fireArray(size,vect);
for ( HepInt i=0; i<size; ++i )
G4cout << " " << vect[i];
G4cout << G4endl << G4endl;
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
} // end dist_layout()
void user_layout()
{
HepFloat m=3.0;
const HepInt size=5;
HepDouble vect[size];
char sel;
HepRandomEngine* anEngine;
G4cout << G4endl << G4endl;
G4cout << "-------------------- Shooting test skeeping the generator ---------------------" << G4endl;
G4cout << G4endl;
G4cout << " >>> Select a Random Engine <<<" << G4endl << G4endl;
G4cout << " 1. HepJamesRandom (default)" << G4endl;
G4cout << " 2. Rand" << G4endl;
G4cout << " 3. DRand48" << G4endl;
G4cout << " 4. Ranlux" << G4endl;
G4cout << " 5. Ranecu" << G4endl << G4endl;
G4cout << " > ";
G4cin >> sel;
while ((sel!='1')&&(sel!='2')&&(sel!='3')&&(sel!='4')&&(sel!='5')) {
G4cout << G4endl << " >>> Choice not legal !! [1..5]<<<" << G4endl;
G4cin >> sel;
}
switch (sel) {
case '1':
anEngine = &theJamesEngine;
break;
case '2':
anEngine = &theRandEngine;
break;
case '3':
anEngine = &theDRand48Engine;
break;
case '4':
anEngine = &theRanluxEngine;
break;
case '5':
anEngine = &theRanecuEngine;
break;
default:
anEngine = &theJamesEngine;
break;
}
G4cout << G4endl;
G4cout << " Flat ]0,1[ : " << RandFlat::shoot(anEngine) << G4endl;
G4cout << " Flat ]0,5[ : " << RandFlat::shoot(anEngine,5) << G4endl;
G4cout << " Flat ]-5,3[ : " << RandFlat::shoot(anEngine,-5,3) << G4endl;
G4cout << " Exp (m=1) : " << RandExponential::shoot(anEngine) << G4endl;
G4cout << " Exp (m=3) : " << RandExponential::shoot(anEngine,3) << G4endl;
G4cout << " Gauss (m=1) : " << RandGauss::shoot(anEngine) << G4endl;
G4cout << " Gauss (m=3,v=1) : " << RandGauss::shoot(anEngine,3,1) << G4endl;
G4cout << " Wigner(1,0.2) : " << RandBreitWigner::shoot(anEngine,1,0.2) << G4endl;
G4cout << " Wigner(1,0.2,1) : " << RandBreitWigner::shoot(anEngine,1,0.2,1) << G4endl;
G4cout << " Wigner2(1,0.2) : " << RandBreitWigner::shootM2(anEngine,1,0.2) << G4endl;
G4cout << " Wigner2(1,0.2,1) : " << RandBreitWigner::shootM2(anEngine,1,0.2,1) << G4endl;
G4cout << " IntFlat [0,99[ : " << RandFlat::shootInt(anEngine,99) << G4endl;
G4cout << " IntFlat [-99,37[ : " << RandFlat::shootInt(anEngine,-99,37) << G4endl;
G4cout << " Poisson (m=3.0) : " << RandPoisson::shoot(anEngine,m) << G4endl;
G4cout << G4endl;
G4cout << " Shooting an array of 5 flat numbers ..." << G4endl << G4endl;
RandFlat::shootArray(anEngine,size,vect);
for ( HepInt i=0; i<size; ++i )
G4cout << " " << vect[i];
G4cout << G4endl << G4endl;
} // end layout()
void start_test()
{
char Pause;
G4cout << "------------------------- Test on HepJamesRandom ----------------------------" << G4endl;
G4cout << G4endl;
layout();
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
G4cout << "--------------------------- Test on RandEngine ------------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theRandEngine);
layout();
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
G4cout << "------------------------- Test on DRand48Engine -----------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theDRand48Engine);
layout();
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
G4cout << "--------------------- Test on RanluxEngine (luxury 4) ------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theRanluxEngine);
layout();
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
G4cout << "-------------------------- Test on RanecuEngine ------------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theRanecuEngine);
layout();
dist_layout();
user_layout();
} // end start_test()
HepInt main() {
init();
start_test();
return 0;
}