diff --git a/DDSim/DD4hepSimulation.py b/DDSim/DD4hepSimulation.py index c46f8d601b785f8fe54791d132cd283da111b164..d26a7ad50c99fe3b5875a126b7bea12ca6492552 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 7dc49e20a79ad594e206152ab84565388c21b9cc..7a2449d9f3e5684c3a862b7d4e15ec379d308f9e 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