ATLAS Offline Software
AtlasCLHEP_RandomGenerators_test.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
8 #include "CLHEP/Random/Ranlux64Engine.h"
9 #include "CLHEP/Random/RanecuEngine.h"
10 #include "CLHEP/Random/MTwistEngine.h"
11 #include "CLHEP/Random/RandGauss.h"
12 #include "CLHEP/Random/RandGaussQ.h"
13 #include "CLHEP/Random/RandExponential.h"
14 #include "CLHEP/Random/RandGaussZiggurat.h"
15 #include "CLHEP/Random/RandExpZiggurat.h"
16 
18 
19 // Gaudi includes
20 #include "GaudiKernel/DataSvc.h"
21 #include "GaudiKernel/Chrono.h"
22 #include "GaudiKernel/ISvcLocator.h"
23 #include "GaudiKernel/MsgStream.h"
24 #include "GaudiKernel/ListItem.h"
25 
26 #include <string>
27 
28 //#include "rnorrexp_org.icc"
29 
31 
32  AtlasCLHEP_RandomGenerators_test::AtlasCLHEP_RandomGenerators_test(const std::string& name, ISvcLocator* pSvcLocator):
33  AthAlgorithm(name,pSvcLocator),
34  m_chrono(0),
35  m_ranlux64(nullptr),
36  m_ranecu(nullptr),
37  m_mtwist(nullptr),
38  m_histSvc(nullptr),
39  m_rndmSvc1("AtRanluxGenSvc", name),
40  m_randomEngine1(0),
41  m_randomEngineName1("rnd_AtRanluxGenSvc"),
42  m_rndmSvc2("AtDSFMTGenSvc", name),
43  m_randomEngine2(0),
44  m_randomEngineName2("rnd_AtDSFMTGenSvc")
45  {
46  declareProperty("ntest", m_ntest);
47  }
48 
49  //__________________________________________________________________________
51  }
52 
53  //__________________________________________________________________________
55  {
56  if(!serviceLocator()->service("ChronoStatSvc" , m_chrono ).isSuccess()){
57  ATH_MSG_FATAL( "Cannot retrieve ChronoStatSvc ");
58  return StatusCode::FAILURE;
59  }
60 
61  m_ranlux64=new CLHEP::Ranlux64Engine();
62  m_ranecu=new CLHEP::RanecuEngine();
63  m_mtwist=new CLHEP::MTwistEngine();
64 
65  // Random number service
66  if ( m_rndmSvc1.retrieve().isFailure() ) {
67  msg(MSG::ERROR)<< "Could not retrieve " << m_rndmSvc1 << endmsg;
68  return StatusCode::FAILURE;
69  }
70  if ( m_rndmSvc2.retrieve().isFailure() ) {
71  msg(MSG::ERROR)<< "Could not retrieve " << m_rndmSvc2 << endmsg;
72  return StatusCode::FAILURE;
73  }
74 
75  //Get own engine with own seeds:
77  if (!m_randomEngine1) {
78  msg(MSG::ERROR)<< "Could not get random engine '" << m_randomEngineName1 << "'" << endmsg;
79  return StatusCode::FAILURE;
80  }
82  if (!m_randomEngine2) {
83  msg(MSG::ERROR)<< "Could not get random engine '" << m_randomEngineName2 << "'" << endmsg;
84  return StatusCode::FAILURE;
85  }
86 
87  if((service("THistSvc", m_histSvc)).isFailure()) {
88  msg(MSG::ERROR) << "Cannot allocate THistSvc service" << endmsg;
89  return StatusCode::FAILURE;
90  }
91 
92  m_hflat=new TH1D("RandFlat","RandFlat",1000,0,1);
93  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hflat->GetName(), m_hflat).isSuccess()) {
94  msg(MSG::WARNING) << "Could not register histogram "<< m_hflat->GetName() << endmsg;
95  }
96 
97  m_hgauss1=new TH1D("RandGauss","RandGauss",700,-7,7);
98  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hgauss1->GetName(), m_hgauss1).isSuccess()) {
99  msg(MSG::WARNING) << "Could not register histogram "<< m_hgauss1->GetName() << endmsg;
100  }
101 
102  m_hgauss2=new TH1D("RandGaussQ","RandGaussQ",700,-7,7);
103  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hgauss2->GetName(), m_hgauss2).isSuccess()) {
104  msg(MSG::WARNING) << "Could not register histogram "<< m_hgauss2->GetName() << endmsg;
105  }
106 
107  m_hgauss3=new TH1D("RandGaussZigurat","RandGaussZigurat",700,-7,7);
108  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hgauss3->GetName(), m_hgauss3).isSuccess()) {
109  msg(MSG::WARNING) << "Could not register histogram "<< m_hgauss3->GetName() << endmsg;
110  }
111 
112  m_hexp1=new TH1D("RandExponential","RandExponential",900,0,30);
113  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hexp1->GetName(), m_hexp1).isSuccess()) {
114  msg(MSG::WARNING) << "Could not register histogram "<< m_hexp1->GetName() << endmsg;
115  }
116 
117  m_hexp2=new TH1D("RandExpZiggurat","RandExpZiggurat",900,0,30);
118  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hexp2->GetName(), m_hexp2).isSuccess()) {
119  msg(MSG::WARNING) << "Could not register histogram "<< m_hexp2->GetName() << endmsg;
120  }
121 
122  m_hbin1=new TH1D("RandBinomial","RandBinomial",4,-0.5,3.5);
123  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hbin1->GetName(), m_hbin1).isSuccess()) {
124  msg(MSG::WARNING) << "Could not register histogram "<< m_hbin1->GetName() << endmsg;
125  }
126 
127  m_hbin2=new TH1D("RandBinomialFixedP","RandBinomialFixedP",4,-0.5,3.5);
128  if(!m_histSvc->regHist(std::string("/PLOTS/") + m_hbin2->GetName(), m_hbin2).isSuccess()) {
129  msg(MSG::WARNING) << "Could not register histogram "<< m_hbin2->GetName() << endmsg;
130  }
131 
132 
133  return StatusCode::SUCCESS;
134  }
135 
137  {
138 
139  return StatusCode::SUCCESS;
140  }
141 
142  //_________________________________________________________________________
144  {
145  int ntest=m_ntest;
146 
147  msg(MSG::DEBUG)<<"event="<<m_ievent<<" ntest="<<ntest<<endmsg;
148 
149  m_chrono -> chronoStart("flat");
150  double sum_flat=0;
151  for(int i=0;i<ntest;++i) {
152  double g=m_randomEngine2->flat();
153  m_hflat->Fill(g);
154  sum_flat+=g;
155  }
156  sum_flat/=ntest;
157  m_chrono -> chronoStop("flat");
158  msg(MSG::DEBUG)<<" avg "<<"flat"<<"="<<sum_flat<<endmsg;
159 
160  m_chrono -> chronoStart("RandGauss");
161  double sum_rnd1=0;
162  for(int i=0;i<ntest;++i) {
163  double g=CLHEP::RandGauss::shoot(m_randomEngine2);
164  m_hgauss1->Fill(g);
165  sum_rnd1+=g;
166  }
167  sum_rnd1/=ntest;
168  m_chrono -> chronoStop("RandGauss");
169  msg(MSG::DEBUG)<<" avg "<<"RandGauss"<<"="<<sum_rnd1<<endmsg;
170 
171  m_chrono -> chronoStart("RandGaussQ");
172  double sum_rnd2=0;
173  for(int i=0;i<ntest;++i) {
174  double g=CLHEP::RandGaussQ::shoot(m_randomEngine2);
175  m_hgauss2->Fill(g);
176  sum_rnd2+=g;
177  }
178  sum_rnd2/=ntest;
179  m_chrono -> chronoStop("RandGaussQ");
180  msg(MSG::DEBUG)<<" avg "<<"RandGaussQ"<<"="<<sum_rnd2<<endmsg;
181 
182  m_chrono -> chronoStart("RandGaussZiggurat");
183  double sum_zig=0;
184  for(int i=0;i<ntest;++i) {
185  double g=CLHEP::RandGaussZiggurat::shoot(m_randomEngine2);
186  m_hgauss3->Fill(g);
187  sum_zig+=g;
188  }
189  sum_zig/=ntest;
190  m_chrono -> chronoStop("RandGaussZiggurat");
191  msg(MSG::DEBUG)<<" avg "<<"RandGaussZiggurat"<<"="<<sum_zig<<endmsg;
192 
193  m_chrono -> chronoStart("RandExponential");
194  double sum_exp=0;
195  for(int i=0;i<ntest;++i) {
196  double g=CLHEP::RandExponential::shoot(m_randomEngine2);
197  m_hexp1->Fill(g);
198  sum_exp+=g;
199  }
200  sum_exp/=ntest;
201  m_chrono -> chronoStop("RandExponential");
202  msg(MSG::DEBUG)<<" avg "<<"RandExponential"<<"="<<sum_exp<<endmsg;
203 
204  m_chrono -> chronoStart("RandExpZiggurat");
205  double sum_expZ=0;
206  for(int i=0;i<ntest;++i) {
207  double g=CLHEP::RandExpZiggurat::shoot(m_randomEngine2);
208  m_hexp2->Fill(g);
209  sum_expZ+=g;
210  }
211  sum_expZ/=ntest;
212  m_chrono -> chronoStop("RandExpZiggurat");
213  msg(MSG::DEBUG)<<" avg "<<"RandExpZiggurat"<<"="<<sum_expZ<<endmsg;
214 
215  CLHEP::RandBinomialFixedP lu(*m_randomEngine2,1,0.4,12); // Needs to be called with the random engine as reference, as a pointer gets deleted by CLHEP::RandBinomial!
216 
217  for(int n=1;n<6;n+=1) {
218  double sum_bin=0;
219  m_chrono -> chronoStart("RandBinomial_"+std::to_string(n));
220  for(int i=0;i<ntest;++i) {
221  double g=CLHEP::RandBinomial::shoot(m_randomEngine2,n,0.4);
222  if(n==3) m_hbin1->Fill(g);
223  sum_bin+=g;
224  }
225  m_chrono -> chronoStop("RandBinomial_"+std::to_string(n));
226  sum_bin/=ntest;
227  msg(MSG::DEBUG) << " avg RandBinomial("<<n<<")="<<sum_bin<< endmsg;
228 
229  double sum_stdbin=0;
230  m_chrono -> chronoStart("RBinomialFP_"+std::to_string(n));
231  for(int i=0;i<ntest;++i) {
232  double g=lu.fire(m_randomEngine2, n );
233  if(n==3) m_hbin2->Fill(g);
234  sum_stdbin+=g;
235  }
236  m_chrono -> chronoStop("RBinomialFP_"+std::to_string(n));
237  sum_stdbin/=ntest;
238  msg(MSG::DEBUG) << " avg RandBinomialFixedP("<<n<<")="<<sum_stdbin<< endmsg;
239  }
240 
241 
242  /*
243 
244  m_chrono -> chronoStart(m_randomEngineName1);
245  double sum_rnd1=0;
246  for(int i=0;i<ntest;++i) {
247  sum_rnd1+=m_randomEngine1->flat();
248  }
249  sum_rnd1/=ntest;
250  m_chrono -> chronoStop(m_randomEngineName1);
251  msg(MSG::DEBUG)<<" avg "<<m_randomEngineName1<<"="<<sum_rnd1<<endmsg;
252 
253  m_chrono -> chronoStart(m_randomEngineName2);
254  double sum_rnd2=0;
255  for(int i=0;i<ntest;++i) {
256  sum_rnd2+=m_randomEngine2->flat();
257  }
258  sum_rnd2/=ntest;
259  m_chrono -> chronoStop(m_randomEngineName2);
260  msg(MSG::DEBUG)<<" avg "<<m_randomEngineName2<<"="<<sum_rnd2<<endmsg;
261 
262  m_chrono -> chronoStart("ranlux64");
263  m_ranlux64->setSeed(seed,1);
264  double sum_ranlux64=0;
265  for(int i=0;i<ntest;++i) {
266  sum_ranlux64+=m_ranlux64->flat();
267  }
268  sum_ranlux64/=ntest;
269  m_chrono -> chronoStop("ranlux64");
270  msg(MSG::DEBUG)<<" avg ranlux64="<<sum_ranlux64<<endmsg;
271 
272  m_chrono -> chronoStart("ranecu");
273  m_ranecu->setSeed(seed,1);
274  double sum_ranecu=0;
275  for(int i=0;i<ntest;++i) {
276  sum_ranecu+=m_ranecu->flat();
277  }
278  sum_ranecu/=ntest;
279  m_chrono -> chronoStop("ranecu");
280  msg(MSG::DEBUG)<<" avg ranecu="<<sum_ranecu<<endmsg;
281 
282  m_chrono -> chronoStart("mtwist");
283  m_mtwist->setSeed(seed,1);
284  double sum_mtwist=0;
285  for(int i=0;i<ntest;++i) {
286  sum_mtwist+=m_mtwist->flat();
287  }
288  sum_mtwist/=ntest;
289  m_chrono -> chronoStop("mtwist");
290  msg(MSG::DEBUG)<<" avg mtwist="<<sum_mtwist<<endmsg;
291 
292  */
293 
294  ++m_ievent;
295 
296  return StatusCode::SUCCESS;
297  }
298 
299 } // end of namespace bracket
300 
301 
302 
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hbin2
TH1 * m_hbin2
Definition: AtlasCLHEP_RandomGenerators_test.h:57
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::finalize
StatusCode finalize()
Definition: AtlasCLHEP_RandomGenerators_test.cxx:136
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hexp1
TH1 * m_hexp1
Definition: AtlasCLHEP_RandomGenerators_test.h:53
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_histSvc
ITHistSvc * m_histSvc
Definition: AtlasCLHEP_RandomGenerators_test.h:38
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_rndmSvc1
ServiceHandle< IAtRndmGenSvc > m_rndmSvc1
Definition: AtlasCLHEP_RandomGenerators_test.h:40
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hgauss3
TH1 * m_hgauss3
Definition: AtlasCLHEP_RandomGenerators_test.h:51
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_rndmSvc2
ServiceHandle< IAtRndmGenSvc > m_rndmSvc2
Definition: AtlasCLHEP_RandomGenerators_test.h:43
AtlasCLHEP_RandomGenerators
Definition: AtlasCLHEP_RandomGenerators_test.cxx:30
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hgauss1
TH1 * m_hgauss1
Definition: AtlasCLHEP_RandomGenerators_test.h:49
TH1D
Definition: rootspy.cxx:342
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hbin1
TH1 * m_hbin1
Definition: AtlasCLHEP_RandomGenerators_test.h:56
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_chrono
IChronoStatSvc * m_chrono
central crono service
Definition: AtlasCLHEP_RandomGenerators_test.h:33
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::AtlasCLHEP_RandomGenerators_test
AtlasCLHEP_RandomGenerators_test(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
Definition: AtlasCLHEP_RandomGenerators_test.cxx:32
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_randomEngine1
CLHEP::HepRandomEngine * m_randomEngine1
Definition: AtlasCLHEP_RandomGenerators_test.h:41
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_ranecu
CLHEP::HepRandomEngine * m_ranecu
Definition: AtlasCLHEP_RandomGenerators_test.h:36
CLHEP::RandBinomialFixedP::fire
double fire()
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_ievent
int m_ievent
Definition: AtlasCLHEP_RandomGenerators_test.h:61
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_ntest
int m_ntest
Definition: AtlasCLHEP_RandomGenerators_test.h:59
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_mtwist
CLHEP::HepRandomEngine * m_mtwist
Definition: AtlasCLHEP_RandomGenerators_test.h:37
TH1::Fill
int Fill(double)
Definition: rootspy.cxx:285
CLHEP::RandBinomialFixedP
Definition: RandBinomialFixedP.h:18
AthAlgorithm
Definition: AthAlgorithm.h:47
RandBinomialFixedP.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_randomEngineName1
std::string m_randomEngineName1
Definition: AtlasCLHEP_RandomGenerators_test.h:42
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hexp2
TH1 * m_hexp2
Definition: AtlasCLHEP_RandomGenerators_test.h:54
AtlasCLHEP_RandomGenerators_test.h
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_randomEngineName2
std::string m_randomEngineName2
Definition: AtlasCLHEP_RandomGenerators_test.h:45
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::execute
StatusCode execute()
Definition: AtlasCLHEP_RandomGenerators_test.cxx:143
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::initialize
StatusCode initialize()
Definition: AtlasCLHEP_RandomGenerators_test.cxx:54
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_randomEngine2
CLHEP::HepRandomEngine * m_randomEngine2
Definition: AtlasCLHEP_RandomGenerators_test.h:44
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hflat
TH1 * m_hflat
Definition: AtlasCLHEP_RandomGenerators_test.h:47
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::~AtlasCLHEP_RandomGenerators_test
~AtlasCLHEP_RandomGenerators_test()
Definition: AtlasCLHEP_RandomGenerators_test.cxx:50
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_ranlux64
CLHEP::HepRandomEngine * m_ranlux64
Definition: AtlasCLHEP_RandomGenerators_test.h:35
AtlasCLHEP_RandomGenerators::AtlasCLHEP_RandomGenerators_test::m_hgauss2
TH1 * m_hgauss2
Definition: AtlasCLHEP_RandomGenerators_test.h:50