diff --git a/DDSim/DD4hepSimulation.py b/DDSim/DD4hepSimulation.py index 0cf75503aeed8c11dab8c073b7923a778f7041b3..359dc0486895a8088b8cc7c605a0eae3cf5f9a14 100644 --- a/DDSim/DD4hepSimulation.py +++ b/DDSim/DD4hepSimulation.py @@ -40,12 +40,13 @@ from DDSim.Helper.Action import Action from DDSim.Helper.Random import Random import os import sys - +import datetime class DD4hepSimulation(object): """Class to hold all the parameters and functions to run simulation""" def __init__(self): + self.steeringFile = None self.compactFile = "" self.inputFiles = [] self.outputFile = "dummyOutput.slcio" @@ -60,7 +61,6 @@ class DD4hepSimulation(object): self.enableGun = False self.vertexSigma = [0.0, 0.0, 0.0, 0.0] self.vertexOffset = [0.0, 0.0, 0.0, 0.0] - self.magneticFieldDict = {} self.detailedShowerMode = False self.errorMessages = [] @@ -78,31 +78,34 @@ class DD4hepSimulation(object): os.environ['G4UI_USE_TCSH'] = "1" - def readSteeringFile(self, steeringFile): + def readSteeringFile(self): """Reads a steering file and sets the parameters to that of the DD4hepSimulation object present in the steering file. """ globs = {} locs = {} - if not steeringFile: + if not self.steeringFile: return - execfile(steeringFile, globs, locs) + sFileTemp = self.steeringFile + execfile(self.steeringFile, globs, locs) for _name, obj in locs.items(): if isinstance(obj, DD4hepSimulation): self.__dict__ = obj.__dict__ + self.steeringFile = os.path.abspath(sFileTemp) def parseOptions(self): """parse the command line options""" parser = argparse.ArgumentParser("Running DD4hep Simulations:", formatter_class=argparse.RawTextHelpFormatter) - parser.add_argument("--steeringFile", "-S", action="store", default=None, + parser.add_argument("--steeringFile", "-S", action="store", default=self.steeringFile, help="Steering file to change default behaviour") #first we parse just the steering file, but only if we don't want to see the help message if not any( opt in sys.argv for opt in ('-h','--help')): parsed, _unknown = parser.parse_known_args() - self.readSteeringFile(parsed.steeringFile) + self.steeringFile = parsed.steeringFile + self.readSteeringFile() parser.add_argument("--compactFile", action="store", default=self.compactFile, help="The compact XML file") @@ -167,7 +170,7 @@ class DD4hepSimulation(object): self.dumpParameter = parsed.dumpParameter - self.compactFile = parsed.compactFile + self.compactFile = os.path.abspath(parsed.compactFile) self.inputFiles = parsed.inputFiles self.inputFiles = self.__checkFileFormat( self.inputFiles, (".stdhep", ".slcio", ".HEPEvt", ".hepevt", ".hepmc")) self.outputFile = parsed.outputFile @@ -179,7 +182,7 @@ class DD4hepSimulation(object): self.skipNEvents = parsed.skipNEvents self.physicsList = parsed.physicsList self.crossingAngleBoost = parsed.crossingAngleBoost - self.macroFile = parsed.macroFile + self.macroFile = os.path.abspath(parsed.macroFile) self.enableGun = parsed.enableGun self.detailedShowerMode = parsed.detailedShowerMode self.vertexOffset = parsed.vertexOffset @@ -281,7 +284,8 @@ class DD4hepSimulation(object): # Configure I/O if self.outputFile.endswith(".slcio"): - simple.setupLCIOOutput('LcioOutput', self.outputFile) + lcOut = simple.setupLCIOOutput('LcioOutput', self.outputFile) + lcOut.RunHeader = self.__addParametersToRunHeader() elif self.outputFile.endswith(".root"): simple.setupROOTOutput('RootOutput', self.outputFile) @@ -539,6 +543,44 @@ class DD4hepSimulation(object): self.errorMessages.append( "ERROR: printLevel '%s' unknown" % level ) return -1 + def __addParametersToRunHeader( self ): + """add the parameters to the (lcio) run Header""" + runHeader = {} + parameters = vars(self) + for parName, parameter in parameters.iteritems(): + if isinstance( parameter, ConfigHelper ): + options = parameter.getOptions() + for opt,valAndDoc in options.iteritems(): + runHeader["%s.%s"%(parName, opt)] = str(valAndDoc[0]) + else: + runHeader[parName] = str(parameter) + + ### steeringFile content + if self.steeringFile and os.path.exists(self.steeringFile) and os.path.isfile(self.steeringFile): + with open(self.steeringFile) as sFile: + runHeader["SteeringFileContent"] = sFile.read() + + ### macroFile content + if self.macroFile and os.path.exists(self.macroFile) and os.path.isfile(self.macroFile): + with open(self.macroFile) as mFile: + runHeader["MacroFileContent"] = mFile.read() + + ### add command line + if sys.argv: + runHeader["CommandLine"] = " ".join(sys.argv) + + ### add current working directory (where we call from) + runHeader["WorkingDirectory"] = os.getcwd() + + ### add date + runHeader["DateUTC"] = str(datetime.datetime.utcnow())+" UTC" + + ### add User + import getpass + runHeader["User"] = getpass.getuser() + + return runHeader + ################################################################################ ### MODULE FUNCTIONS GO HERE