Belle II Software  release-05-02-19
checkRandomNumbers.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 """
5 Check that random numbers don't change and are consistent.
6 
7 This steering file runs through a set of exp/run combinations and prints
8 the first few random numbers in initialize(), beginRun(), event() and endRun().
9 
10 It also sets the framework to debugging output and shows the information used
11 to calculate the random generator state.
12 """
13 
14 import struct
15 import basf2
16 from ROOT import gRandom
17 
18 
19 def double_to_hex(double):
20  """Convert a double to a hex string representation"""
21  # we pack the float to a little-endian double end interpret it as
22  # little-endian unsigned 64 bit int
23  return "%016X" % struct.unpack("<Q", struct.pack("<d", double))[0]
24 
25 
26 class RandomTestModule(basf2.Module):
27  """Print some random numbers to check reproducibility"""
28 
29  def __init__(self, name):
30  """Make sure we can run in multiple processes"""
31  super(RandomTestModule, self).__init__()
32  self.set_property_flags(basf2.ModulePropFlags.PARALLELPROCESSINGCERTIFIED)
33 
34  self.name = name
35 
36  def get_numbers(self, name):
37  """Print the first 20 random numbers"""
38  numbers = ["First 20 random values in %s::%s()" % (self.name, name)]
39  for row in range(5):
40  numbers.append(", ".join(double_to_hex(gRandom.Rndm()) for i in range(4)))
41  basf2.B2INFO("\n ".join(numbers))
42 
43  def initialize(self):
44  """Show random numbers in initialize"""
45  self.get_numbers("initialize")
46 
47  def beginRun(self):
48  """Show random numbers in beginRun"""
49  self.get_numbers("beginRun")
50 
51  def event(self):
52  """Show random numbers in event"""
53  self.get_numbers("event")
54 
55  def endRun(self):
56  """Show random numbers in endRun"""
57  self.get_numbers("endRun")
58 
59 
60 
61 main = basf2.Path()
62 # generate a few runs which look good in hex
63 main.add_module("EventInfoSetter", evtNumList=[3, 4, 5],
64  runList=[0x11121314, 0x21222324, 0x31323334],
65  expList=[0x123, 0x234, 0x345])
66 # We could add a single processing RandomBarrier to check random barrier
67 # transport in multi processing. But since output is unordered in multi
68 # processing we don't do this in the automatic test
69 # main.add_module("RandomBarrier").set_property_flags(0)
70 main.add_module("EventInfoPrinter")
71 main.add_module(RandomTestModule("test1"))
72 main.add_module("RandomBarrier")
73 main.add_module(RandomTestModule("test2"))
74 
75 # now the libraries are loaded so we can set the loglevel to debug, set the seed
76 # and start processing
77 logging_framework = basf2.logging.package("framework")
78 logging_framework.set_log_level(basf2.LogLevel.DEBUG)
79 logging_framework.set_debug_level(200)
80 logging_framework.set_info(basf2.LogLevel.DEBUG, basf2.LogInfo.LEVEL | basf2.LogInfo.MESSAGE)
81 basf2.set_random_seed("this is the seed")
82 
83 basf2.process(main)
checkRandomNumbers.RandomTestModule.get_numbers
def get_numbers(self, name)
Definition: checkRandomNumbers.py:36
basf2.process
def process(path, max_event=0)
Definition: __init__.py:25
checkRandomNumbers.RandomTestModule.name
name
save a name for the module to print it
Definition: checkRandomNumbers.py:34
checkRandomNumbers.RandomTestModule.event
def event(self)
Definition: checkRandomNumbers.py:51
checkRandomNumbers.RandomTestModule
Definition: checkRandomNumbers.py:26
checkRandomNumbers.RandomTestModule.beginRun
def beginRun(self)
Definition: checkRandomNumbers.py:47
checkRandomNumbers.RandomTestModule.__init__
def __init__(self, name)
Definition: checkRandomNumbers.py:29
checkRandomNumbers.RandomTestModule.endRun
def endRun(self)
Definition: checkRandomNumbers.py:55
checkRandomNumbers.RandomTestModule.initialize
def initialize(self)
Definition: checkRandomNumbers.py:43