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

283 lines
8.3 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: G4RandGlobalTest.cc,v 1.3 1999/11/23 15:00:00 gcosmo Exp $
// GEANT4 tag $Name: geant4-01-01 $
//
//
// ----------------------------------------------------------------------
#include "Randomize.hh"
#include "G4ios.hh"
RandEngine theRandEngine;
DRand48Engine theDRand48Engine;
RanluxEngine theRanluxEngine(19780503,4);
RanecuEngine theRanecuEngine;
//======================== CHI-SQUARED TEST ============================
HepInt box[10], chi[8], more=1;
HepInt prob[8] = { 1, 5, 25, 50, 75, 95, 99, 100 };
HepFloat perc[8] = { 2.09, 3.33, 5.90, 8.34, 11.39, 16.92, 21.67, 100.0 };
void even_test(HepInt seq)
{
HepInt i,j;
char Pause;
for (i=0; i<8; ++i)
chi[i]=0;
G4cout << "\t\t\t --- CHI-SQUARED TEST ---" << G4endl;
HepInt fac = HepInt(seq/100);
G4cout << G4endl;
for (HepInt k=0; k<seq; ++k) {
for (i=0; i<10; ++i)
box[i]=0;
for (i=0; i<1000; ++i) {
HepInt h = HepInt(100*G4UniformRand());
for (j=0; j<10; ++j)
if ((10*j <= h) && (h < 10*(j+1))) ++box[j];
}
HepFloat X=0;
for (i=0; i<10; ++i) {
HepFloat t=HepFloat(box[i]-100);
X += t*t;
}
X /= 100;
if (k == (seq%100)) {
G4cout << "\tDistribution of a single run (rand_valuex100) ..."
<< G4endl << G4endl;
G4cout << "\t\t 1 10 20 30 40 50 60 70 80 90 100" << G4endl;
G4cout << "\t\t";
for (j=0; j<10; ++j)
G4cout << box[j] << " ";
G4cout << G4endl;
G4cout << "\t\t\t Chi-squared = " << X << G4endl << G4endl;
}
for (i=0; i<8; ++i)
if (X <= perc[i]) ++chi[i];
}
G4cout << "\tDistribution of Chi-squared for " << seq << " sequences ..."
<< G4endl << G4endl;
G4cout << "\t\t\t %" << "\tChi-sq " << "\tExpected" << G4endl;
for (j=0; j<8; ++j)
G4cout << "\t\t\tX <= " << perc[j] << ":\t" << chi[j]/fac
<< "\t" << prob[j] << G4endl;
G4cout << G4endl;
G4cout << G4endl;
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
if (more == 1)
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
} // end even_test()
//====================== SERIAL CORRELATION TEST =======================
void corr_test(HepInt seq)
{
HepInt i,j;
char Pause;
HepDouble U;
HepDouble UU;
HepDouble UV;
HepDouble corr = 0.;
HepDouble stde = 0.;
HepDouble mv = -1./999;
HepDouble std = (-mv)*sqrt(HepDouble(1000*(997)/(1001)));
HepDouble next, uni, w, mve, temp[10000];
G4cout << "\t\t\t--- SERIAL CORRELATION TEST ---" << G4endl << G4endl;
for (j=0; j<seq; ++j) {
U = 0.; UU = 0.; UV = 0.;
uni = G4UniformRand();
w = uni;
for (i=1; i<1000; ++i) {
next = G4UniformRand();
U += next;
UU += next*next;
UV += uni*next;
uni = next;
}
U += w;
UU += w*w;
UV += uni*w;
temp[j] = (1000*UV-U*U)/(1000*UU-U*U);
corr += temp[j];
}
mve = corr/seq;
for (j=0; j<seq; ++j) {
temp[j] -= mve;
stde += temp[j]*temp[j];
}
stde = sqrt((1./(seq-1))*stde);
G4cout << "Mean value predicted : " << mv << "\t"
<< "Standard deviation predicted: " << std << G4endl
<< "Mean value effective : " << mve << "\t"
<< "Standard deviation effective: " << stde << G4endl << G4endl;
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
} // end corr_test
//=========================== SPATIAL TEST =============================
#define PI 3.1415926
static unsigned long twotoj[16] = { 0x1L,0x2L,0x4L,0x8L,0x10L,0x20L,0x40L,
0x80L,0x100L,0x200L,0x400L,0x800L,
0x1000L,0x2000L,0x4000L,0x8000L };
HepFloat fnc(HepFloat x1, HepFloat x2, HepFloat x3, HepFloat x4)
{
return (HepFloat) sqrt(x1*x1+x2*x2+x3*x3+x4*x4);
}
void spat_test ()
{
char Pause;
long iy[4],jpower,k;
HepInt i,j;
HepFloat x1,x2,x3,x4,yprob[4];
G4cout << "\t\t\t --- SPATIAL TEST ---" << G4endl
<< "\tCalculates PI statistically using volume of unit n-sphere "
<< "n = 2,3,4"
<< G4endl << G4endl;
for (i=1; i<=3; i++) iy[i]=0;
G4cout << "\t\t\t# pts\tPI\t(4/3)PI\t(1/2)PI^2" << G4endl << G4endl;
for (j=1; j<=15; j++) {
for (k=twotoj[j-1]; k>=0; k--) {
x1 = (HepFloat) G4UniformRand();
x2 = (HepFloat) G4UniformRand();
x3 = (HepFloat) G4UniformRand();
x4 = (HepFloat) G4UniformRand();
if (fnc(x1,x2,0.,0.) < 1.) ++iy[1];
if (fnc(x1,x2,x3,0.) < 1.) ++iy[2];
if (fnc(x1,x2,x3,x4) < 1.) ++iy[3];
}
jpower = twotoj[j];
for (i=1; i<=3; i++)
yprob[i] = (HepFloat) twotoj[i+1]*iy[i]/jpower;
if ((jpower <= 32768) && (jpower != 0))
G4cout << "\t\t\t" << jpower << "\t" << yprob[1] << "\t"
<< yprob[2] << "\t" << yprob[3] << G4endl;
}
G4cout << G4endl;
G4cout << "\t\t\tactual" << "\t" << PI << "\t"
<< 4.*PI/3. << "\t" << .5*PI*PI << G4endl << G4endl;
if (more != 99) {
G4cout << " ----- Press <ENTER> to continue -----";
if ( (Pause = G4cin.get()) != '\n') exit(0);
G4cout << G4endl;
}
} // end spat_test()
//============================= GLOBAL =================================
void init()
{
G4cout << G4endl << G4endl;
G4cout << "-------------------------- Random distribution 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 << " >>> Tests performed <<< " << G4endl << G4endl;
G4cout << " > Even distribution test" << G4endl;
G4cout << " > Serial correlation test" << G4endl;
G4cout << " > Spatial test" << G4endl;
G4cout << G4endl << G4endl;
} // end init()
void layout(HepInt seq)
{
even_test(seq);
corr_test(seq);
spat_test();
} // end layout()
void start_test()
{
char sel;
HepInt seq;
G4cout << " Select the number of random values sequences:" << G4endl;
G4cout << "\t a - 100 sequences of 1000 random values" << G4endl;
G4cout << "\t b - 1000 sequences of 1000 random values" << G4endl;
G4cout << "\t c - 10000 sequences of 1000 random values" << G4endl;
G4cout << " > ";
G4cin >> sel;
if ((sel!='a')&&(sel!='b')&&(sel!='c'))
exit(0);
switch (sel) {
case 'a':
seq = 100;
break;
case 'b':
seq = 1000;
break;
case 'c':
seq = 10000;
break;
default:
seq = 100;
break;
}
G4cout << G4endl << G4endl;
G4cout << "------------------------- Test on HepJamesRandom ----------------------------" << G4endl;
G4cout << G4endl;
layout(seq);
G4cout << G4endl << G4endl;
more = 0;
G4cout << "--------------------------- Test on RandEngine ------------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theRandEngine);
layout(seq);
G4cout << G4endl << G4endl;
G4cout << "------------------------- Test on DRand48Engine -----------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theDRand48Engine);
layout(seq);
G4cout << G4endl << G4endl;
G4cout << "--------------------- Test on RanluxEngine (luxury 4) ------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theRanluxEngine);
layout(seq);
G4cout << G4endl << G4endl;
more = 99;
G4cout << "-------------------------- Test on RanecuEngine ------------------------------" << G4endl;
G4cout << G4endl;
HepRandom::setTheEngine(&theRanecuEngine);
layout(seq);
} // end start_test()
HepInt main() {
init();
start_test();
return 0;
}