The Gaudi Framework
master (bdbe7744)
Toggle main menu visibility
Loading...
Searching...
No Matches
HepRndmBaseEngine.h
Go to the documentation of this file.
1
/***********************************************************************************\
2
* (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3
* *
4
* This software is distributed under the terms of the Apache version 2 licence, *
5
* copied verbatim in the file "LICENSE". *
6
* *
7
* In applying this licence, CERN does not waive the privileges and immunities *
8
* granted to it by virtue of its status as an Intergovernmental Organization *
9
* or submit itself to any jurisdiction. *
10
\***********************************************************************************/
11
//====================================================================
12
// CLHEP Basic Random Engine definition file
13
//--------------------------------------------------------------------
14
//
15
// Package : HepRndm ( The LHCb Offline System)
16
// Author : M.Frank
17
// History :
18
// +---------+----------------------------------------------+---------
19
// | Date | Comment | Who
20
// +---------+----------------------------------------------+---------
21
// | 29/10/99| Initial version | MF
22
// +---------+----------------------------------------------+---------
23
//
24
//====================================================================
25
#pragma once
26
27
// Framework include files
28
#include "
RndmEngine.h
"
29
#include <CLHEP/Random/Random.h>
30
#include <memory>
31
#include <mutex>
32
#include <utility>
33
34
// Forward declarations
35
namespace
CLHEP
{
36
class
HepRandomEngine;
37
}
38
39
namespace
HepRndm
{
40
41
template
<
typename
Engine>
42
class
SynchronizedEngine
:
public
Engine
{
43
44
private
:
45
mutable
std::mutex
m_mutex
;
46
47
public
:
48
using
Engine::Engine;
49
50
public
:
51
// reimplement anything that should be locked for thread safety
52
53
double
flat
()
override
{
54
std::lock_guard<std::mutex> lock(
m_mutex
);
55
return
Engine::flat();
56
}
57
void
flatArray
(
const
int
size,
double
* vect )
override
{
58
std::lock_guard<std::mutex> lock(
m_mutex
);
59
Engine::flatArray( size, vect );
60
}
61
void
setSeed
(
long
seed,
int
n )
override
{
62
std::lock_guard<std::mutex> lock(
m_mutex
);
63
return
Engine::setSeed( seed, n );
64
}
65
void
setSeeds
(
const
long
*
seeds
,
int
n )
override
{
66
std::lock_guard<std::mutex> lock(
m_mutex
);
67
return
Engine::setSeeds
(
seeds
, n );
68
}
69
void
saveStatus
(
const
char
filename[] =
"Config.conf"
)
const override
{
70
std::lock_guard<std::mutex> lock(
m_mutex
);
71
return
Engine::saveStatus( filename );
72
}
73
void
restoreStatus
(
const
char
filename[] =
"Config.conf"
)
override
{
74
std::lock_guard<std::mutex> lock(
m_mutex
);
75
return
Engine::restoreStatus( filename );
76
}
77
void
showStatus
()
const override
{
78
std::lock_guard<std::mutex> lock(
m_mutex
);
79
return
Engine::showStatus();
80
}
81
std::ostream&
put
( std::ostream& os )
const override
{
82
std::lock_guard<std::mutex> lock(
m_mutex
);
83
return
Engine::put( os );
84
}
85
std::istream&
get
( std::istream& is )
override
{
86
std::lock_guard<std::mutex> lock(
m_mutex
);
87
return
Engine::get( is );
88
}
89
std::istream&
getState
( std::istream& is )
override
{
90
std::lock_guard<std::mutex> lock(
m_mutex
);
91
return
Engine::getState( is );
92
}
93
std::vector<unsigned long>
put
()
const override
{
94
std::lock_guard<std::mutex> lock(
m_mutex
);
95
return
Engine::put();
96
}
97
bool
get
(
const
std::vector<unsigned long>& v )
override
{
98
std::lock_guard<std::mutex> lock(
m_mutex
);
99
return
Engine::get( v );
100
}
101
bool
getState
(
const
std::vector<unsigned long>& v )
override
{
102
std::lock_guard<std::mutex> lock(
m_mutex
);
103
return
Engine::getState( v );
104
}
105
operator
double()
override
{
106
std::lock_guard<std::mutex> lock(
m_mutex
);
107
return
Engine::operator double();
108
}
109
operator
float()
override
{
110
std::lock_guard<std::mutex> lock(
m_mutex
);
111
return
Engine::operator float();
112
}
113
operator
unsigned
int()
override
{
114
std::lock_guard<std::mutex> lock(
m_mutex
);
115
return
Engine::operator
unsigned
int();
116
}
117
};
118
119
class
BaseEngine
:
public
RndmEngine
{
120
protected
:
121
std::unique_ptr<CLHEP::HepRandomEngine>
m_hepEngine
;
122
Gaudi::Property<bool>
m_threadSafe
{
this
,
"ThreadSafe"
,
true
};
123
124
public
:
125
BaseEngine
(
const
std::string&
name
,
ISvcLocator
* loc ) :
RndmEngine
(
name
, loc ) {}
126
CLHEP::HepRandomEngine*
hepEngine
() {
return
m_hepEngine
.get(); }
127
const
CLHEP::HepRandomEngine*
hepEngine
()
const
{
return
m_hepEngine
.get(); }
128
// Retrieve single random number
129
double
rndm
()
const override
{
return
m_hepEngine
->flat(); }
130
131
StatusCode
finalize
()
override
{
132
if
(
m_hepEngine
) { CLHEP::HepRandom::setTheEngine(
nullptr
); }
133
m_hepEngine
.reset();
134
return
RndmEngine::finalize
();
135
}
136
137
protected
:
138
void
initEngine
() {
m_hepEngine
=
createEngine
(); }
139
virtual
std::unique_ptr<CLHEP::HepRandomEngine>
createEngine
() = 0;
140
template
<
typename
Engine
,
typename
... Args>
141
auto
create_engine
( Args&&... args ) {
142
return
(
m_threadSafe
.value() ? std::make_unique<
SynchronizedEngine<Engine>
>( std::forward<Args>( args )... )
143
: std::make_unique<Engine>( std::forward<Args>( args )... ) );
144
}
145
};
146
}
// namespace HepRndm
RndmEngine.h
Gaudi::Property
Implementation of property with value of concrete type.
Definition
Property.h:35
HepRndm::BaseEngine::create_engine
auto create_engine(Args &&... args)
Definition
HepRndmBaseEngine.h:141
HepRndm::BaseEngine::hepEngine
const CLHEP::HepRandomEngine * hepEngine() const
Definition
HepRndmBaseEngine.h:127
HepRndm::BaseEngine::rndm
double rndm() const override
Definition
HepRndmBaseEngine.h:129
HepRndm::BaseEngine::finalize
StatusCode finalize() override
Definition
HepRndmBaseEngine.h:131
HepRndm::BaseEngine::hepEngine
CLHEP::HepRandomEngine * hepEngine()
Definition
HepRndmBaseEngine.h:126
HepRndm::BaseEngine::createEngine
virtual std::unique_ptr< CLHEP::HepRandomEngine > createEngine()=0
HepRndm::BaseEngine::initEngine
void initEngine()
Definition
HepRndmBaseEngine.h:138
HepRndm::BaseEngine::BaseEngine
BaseEngine(const std::string &name, ISvcLocator *loc)
Definition
HepRndmBaseEngine.h:125
HepRndm::BaseEngine::m_threadSafe
Gaudi::Property< bool > m_threadSafe
Definition
HepRndmBaseEngine.h:122
HepRndm::BaseEngine::m_hepEngine
std::unique_ptr< CLHEP::HepRandomEngine > m_hepEngine
Definition
HepRndmBaseEngine.h:121
HepRndm::Engine
Definition
HepRndmEngine.h:34
HepRndm::Engine::setSeeds
StatusCode setSeeds(const std::vector< long > &seed) override
Set seeds.
Definition
HepRndmEngines.cpp:112
HepRndm::Engine::seeds
StatusCode seeds(std::vector< long > &seed) const override
Retrieve seeds.
Definition
HepRndmEngines.cpp:126
HepRndm::SynchronizedEngine
Definition
HepRndmBaseEngine.h:42
HepRndm::SynchronizedEngine::m_mutex
std::mutex m_mutex
Definition
HepRndmBaseEngine.h:45
HepRndm::SynchronizedEngine::put
std::ostream & put(std::ostream &os) const override
Definition
HepRndmBaseEngine.h:81
HepRndm::SynchronizedEngine::setSeed
void setSeed(long seed, int n) override
Definition
HepRndmBaseEngine.h:61
HepRndm::SynchronizedEngine::restoreStatus
void restoreStatus(const char filename[]="Config.conf") override
Definition
HepRndmBaseEngine.h:73
HepRndm::SynchronizedEngine::get
std::istream & get(std::istream &is) override
Definition
HepRndmBaseEngine.h:85
HepRndm::SynchronizedEngine::put
std::vector< unsigned long > put() const override
Definition
HepRndmBaseEngine.h:93
HepRndm::SynchronizedEngine::getState
std::istream & getState(std::istream &is) override
Definition
HepRndmBaseEngine.h:89
HepRndm::SynchronizedEngine::flatArray
void flatArray(const int size, double *vect) override
Definition
HepRndmBaseEngine.h:57
HepRndm::SynchronizedEngine::flat
double flat() override
Definition
HepRndmBaseEngine.h:53
HepRndm::SynchronizedEngine::setSeeds
void setSeeds(const long *seeds, int n) override
Definition
HepRndmBaseEngine.h:65
HepRndm::SynchronizedEngine::saveStatus
void saveStatus(const char filename[]="Config.conf") const override
Definition
HepRndmBaseEngine.h:69
HepRndm::SynchronizedEngine::getState
bool getState(const std::vector< unsigned long > &v) override
Definition
HepRndmBaseEngine.h:101
HepRndm::SynchronizedEngine::get
bool get(const std::vector< unsigned long > &v) override
Definition
HepRndmBaseEngine.h:97
HepRndm::SynchronizedEngine::showStatus
void showStatus() const override
Definition
HepRndmBaseEngine.h:77
ISvcLocator
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition
ISvcLocator.h:42
RndmEngine
Random Generator engine definition.
Definition
RndmEngine.h:51
Service::finalize
StatusCode finalize() override
Definition
Service.cpp:223
Service::name
const std::string & name() const override
Retrieve name of the service.
Definition
Service.cpp:333
StatusCode
This class is used for returning status codes from appropriate routines.
Definition
StatusCode.h:64
CLHEP
Definition
HepRndmBaseEngine.h:35
HepRndm
Definition
HepRndmBaseEngine.h:39
GaudiSvc
src
RndmGenSvc
HepRndmBaseEngine.h
Generated on
for The Gaudi Framework by
1.17.0