11 #include "framework/core/RandomGenerator.h"
12 #include "framework/utilities/sha3hash/Hash.h"
13 #include "framework/logging/Logger.h"
14 #include "framework/datastore/StoreObjPtr.h"
15 #include "framework/dataobjects/EventMetaData.h"
27 template<
class T>
void addValueToBuffer(std::vector<unsigned char>& buffer,
const T& value)
29 static_assert(std::is_integral<T>::value,
"integral type required");
30 constexpr
int bytes =
sizeof(T);
31 for (
int i = bytes - 1; i >= 0; --i) {
32 buffer.push_back((value >> (i * 8)) & 0xFF);
40 SetName(name.c_str());
41 SetTitle(
"Belle2 Random Generator");
48 std::copy_n(seed, n,
m_seed.data());
64 std::vector<unsigned char> buffer;
76 B2ERROR(
"No EventMetaData, cannot set state of RandomGenerator from event data");
79 addValueToBuffer(buffer, evt->getExperiment());
80 addValueToBuffer(buffer, evt->getRun());
83 addValueToBuffer(buffer, evt->getEvent());
88 hash.
update(buffer.size(), buffer.data());
96 #ifndef LOG_NO_B2DEBUG
98 std::stringstream info;
99 info <<
"Random Generator '" << GetName() <<
"' State info:\n";
100 info <<
" seed (" << std::dec <<
m_seed.size() <<
"):\n ";
101 for (
auto c :
m_seed) { info << std::setw(2) << std::setfill(
'0') << std::hex << (int)c <<
" "; }
102 info <<
"\n event info (mode=" <<
m_mode <<
"): \n";
103 info <<
" barrier:" << std::dec <<
m_barrier;
106 info <<
" EXP:" << evt->getExperiment() <<
" RUN:" << evt->getRun();
108 info <<
" EVT:" << evt->getEvent();
111 info <<
"\n event bytes (" << std::dec << buffer.size() <<
"):\n ";
112 for (
auto c : buffer) { info << std::setw(2) << std::setfill(
'0') << std::hex << (int)c <<
" "; }
113 info <<
"\n state (index=" <<
m_index <<
"): ";
114 for (
int i = 0; i < 16; ++i) {
115 info << ((i % 4 == 0) ?
"\n " :
" ") << std::setw(16) << std::setfill(
'0') << std::hex <<
m_state[i];
125 RndmArray(n /
sizeof(ULong64_t), (ULong64_t*)array);
126 const Int_t remainder = n %
sizeof(ULong64_t);
131 std::copy_n((
unsigned char*)&r, remainder, array + (n - remainder - 1));