From c7924fb4d053f6a7cc6b18b2264b680071922290 Mon Sep 17 00:00:00 2001
From: Andre Sailer <andre.philippe.sailer@cern.ch>
Date: Tue, 5 Jul 2016 16:59:41 +0000
Subject: [PATCH] DDSim.Random: Move initialisation script to Helper/Random

Add option to enable eventSeed plugin
Add possibility to create switches automatically, this does not allow 'choice' so we need to if/else the whole function call add_argument
---
 DDSim/DD4hepSimulation.py | 42 +++++++++++++++++++--------------------
 DDSim/Helper/Random.py    | 33 ++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 22 deletions(-)

diff --git a/DDSim/DD4hepSimulation.py b/DDSim/DD4hepSimulation.py
index c46f8d601..d26a7ad50 100644
--- a/DDSim/DD4hepSimulation.py
+++ b/DDSim/DD4hepSimulation.py
@@ -320,9 +320,7 @@ class DD4hepSimulation(object):
     actionList = []
 
     ##configure the random seed
-    rndm = DDG4.Action(kernel,'Geant4Random/R1')
-    self.__setupRandomGenerator(rndm)
-    rndm.initialize()
+    rndm = self.random.initialize( DDG4, kernel, self.output.random )
 
     if self.enableGun:
       gun = DDG4.GeneratorAction(kernel,"Geant4ParticleGun/"+"Gun")
@@ -459,17 +457,6 @@ class DD4hepSimulation(object):
     kernel.run()
     kernel.terminate()
 
-
-  def __setupRandomGenerator(self, rndm):
-    """set the properties for the random number generator"""
-    if self.random.seed is not None:
-      rndm.Seed = self.random.seed
-      rndm.Luxury = self.random.luxury
-    if self.random.type is not None:
-      rndm.Type = self.random.type
-    if self.output.random <= 3:
-      rndm.showStatus()
-
   def __setMagneticFieldOptions(self, simple):
     """ create and configure the magnetic tracking setup """
     field = simple.addConfig('Geant4FieldTrackingSetupAction/MagFieldTrackingSetup')
@@ -514,14 +501,25 @@ class DD4hepSimulation(object):
     for name, obj in vars(self).iteritems():
       if isinstance( obj, ConfigHelper ):
         for var,valAndDoc in obj.getOptions().iteritems():
-          parser.add_argument("--%s.%s" % (name, var),
-                              action="store",
-                              dest="%s.%s" % (name, var),
-                              default = valAndDoc[0],
-                              help = valAndDoc[1],
-                              choices = valAndDoc[2],
-                              # type = type(val),
-                             )
+          if var.startswith("enable"):
+            parser.add_argument("--%s.%s" % (name, var),
+                                action="store_true",
+                                dest="%s.%s" % (name, var),
+                                default = valAndDoc[0],
+                                help = valAndDoc[1],
+                                #choices = valAndDoc[2], ##not allowed for store_true
+                                # type = type(val),
+                               )
+          else:
+            parser.add_argument("--%s.%s" % (name, var),
+                                action="store",
+                                dest="%s.%s" % (name, var),
+                                default = valAndDoc[0],
+                                help = valAndDoc[1],
+                                choices = valAndDoc[2],
+                                # type = type(val),
+                               )
+
 
   def __parseAllHelper( self, parsed ):
     """ parse all the options for the helper """
diff --git a/DDSim/Helper/Random.py b/DDSim/Helper/Random.py
index 7dc49e20a..7a2449d9f 100644
--- a/DDSim/Helper/Random.py
+++ b/DDSim/Helper/Random.py
@@ -11,3 +11,36 @@ class Random (ConfigHelper):
     self.luxury = 1
     self.replace_gRandom = True
     self.file = None
+    self._random = None
+
+    self._enableEventSeed_HELP = "If True, calculate random seed for each event based on eventID and runID\n" \
+                              "allows reproducibility even when SkippingEvents"
+    self.enableEventSeed = False
+
+  def initialize(self, DDG4, kernel, output):
+    """ initialize the random generator
+
+    :param DDG4: DDG4 module
+    :param kernel: Geant4 kernel
+    :param int output: output level
+    :returns: Geant4Random instance
+    """
+    if self._random:
+      return self._random
+    self._random = DDG4.Action(kernel,'Geant4Random/R1')
+
+    if self.seed is not None:
+      self._random.Seed = self.seed
+      self._random.Luxury = self.luxury
+    if self.type is not None:
+      self._random.Type = self.type
+
+    self._random.initialize()
+
+    if self.seed is not None and self.enableEventSeed:
+      self._eventseed = DDG4.RunAction(kernel,'Geant4EventSeed/EventSeeder1')
+
+    ## Needs to be called after initilisation
+    if output <= 3:
+      self._random.showStatus()
+    return self._random
-- 
GitLab