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