diff --git a/DDSim/DD4hepSimulation.py b/DDSim/DD4hepSimulation.py index 57ec1693332c0e914f3316a014a2825978ea57a2..48f9c8881b01afe6dfb3f7ffbb8f93b9580f057f 100644 --- a/DDSim/DD4hepSimulation.py +++ b/DDSim/DD4hepSimulation.py @@ -73,6 +73,9 @@ class DD4hepSimulation(object): self.vertexSigma = [0.0, 0.0, 0.0, 0.0] self.vertexOffset = [0.0, 0.0, 0.0, 0.0] self.enableDetailedShowerMode = False + self.eventParameters = [] + self.runNumberOffset = 0 + self.eventNumberOffset = 0 self._errorMessages = [] self._dumpParameter = False @@ -194,6 +197,15 @@ class DD4hepSimulation(object): parser.add_argument("--dumpSteeringFile", action="store_true", dest="dumpSteeringFile", default=self._dumpSteeringFile, help="print an example steering file to stdout") + + parser.add_argument("--eventParameters", nargs='+', dest="eventParameters", action="store", default=[], + help="Event parameters to write in every event. Use C/F/I ids to specify parameter type. E.g parameterName/F=0.42 to set a float parameter" ) + + parser.add_argument("--runNumberOffset", action="store", dest="runNumberOffset", default=self.runNumberOffset, type=int, + help="The run number offset to write in slcio output file. E.g setting it to 42 will start counting runs from 42 instead of 0") + + parser.add_argument("--eventNumberOffset", action="store", dest="eventNumberOffset", default=self.eventNumberOffset, type=int, + help="The event number offset to write in slcio output file. E.g setting it to 42 will start counting events from 42 instead of 0") #output, or do something smarter with fullHelp only for example ConfigHelper.addAllHelper(self, parser) @@ -226,6 +238,9 @@ class DD4hepSimulation(object): self.enableDetailedShowerMode = parsed.enableDetailedShowerMode self.vertexOffset = parsed.vertexOffset self.vertexSigma = parsed.vertexSigma + self.eventParameters = parsed.eventParameters + self.runNumberOffset = parsed.runNumberOffset if parsed.runNumberOffset > 0 else 0 + self.eventNumberOffset = parsed.eventNumberOffset if parsed.eventNumberOffset > 0 else 0 self._consistencyChecks() @@ -331,6 +346,9 @@ class DD4hepSimulation(object): if self.outputFile.endswith(".slcio"): lcOut = simple.setupLCIOOutput('LcioOutput', self.outputFile) lcOut.RunHeader = self.__addParametersToRunHeader() + lcOut.EventParametersString, lcOut.EventParametersInt, lcOut.EventParametersFloat = self.__addParametersToEvent( self.eventParameters ) + lcOut.RunNumberOffset = self.runNumberOffset + lcOut.EventNumberOffset = self.eventNumberOffset elif self.outputFile.endswith(".root"): simple.setupROOTOutput('RootOutput', self.outputFile) @@ -618,6 +636,52 @@ class DD4hepSimulation(object): return runHeader + + def __addParametersToEvent(self, parameters): + """ extract event parameters from the command line, to write in the header + of each event. + + :param parameters: list of command line parameters to parse + """ + print parameters + stringParameters, intParameters, floatParameters, allParameters = {}, {}, {}, [] + for p in parameters: + parameterAndValue = p.split( "=", 1 ) + if len(parameterAndValue) is not 2: + self._errorMessages.append("ERROR: Couldn't decode event parameter '%s'" %(p)) + raise SyntaxError("ERROR: Couldn't decode event parameter '%s'" %(p)) + continue + parameterAndType = parameterAndValue[0].split( "/", 1 ) + if len(parameterAndType) is not 2: + self._errorMessages.append("ERROR: Couldn't decode event parameter '%s'" %(p)) + raise SyntaxError("ERROR: Couldn't decode event parameter '%s'" %(p)) + continue + pname = parameterAndType[0] + ptype = parameterAndType[1] + pvalue = parameterAndValue[1] + if ptype.lower() not in ["c", "f", "i"]: + self._errorMessages.append("ERROR: Event parameter '%s' with invalid type '%s'" %(pname, ptype)) + raise ValueError("ERROR: Event parameter '%s' with invalid type '%s'" %(pname, ptype)) + continue + if pname in allParameters: + self._errorMessages.append("ERROR: Event parameter '%s' specified twice" %(pname)) + raise RuntimeError("ERROR: Event parameter '%s' specified twice" %(pname)) + continue + if not len(pvalue): + self._errorMessages.append("ERROR: Event parameter '%s' has empty value" %(pname)) + raise RuntimeError("ERROR: Event parameter '%s' has empty value" %(pname)) + continue + allParameters.append(pname) + print "Event parameter '%s', type '%s', value='%s'"%(pname, ptype, pvalue) + if ptype.lower() is "c": + stringParameters[pname] = pvalue + elif ptype.lower() is "f": + floatParameters[pname] = pvalue + elif ptype.lower() is "i": + intParameters[pname] = pvalue + return stringParameters, intParameters, floatParameters + + def __setupSensitiveDetectors(self, detectors, setupFuction, defaultFilter=None): """ attach sensitive detector actions for all subdetectors can be steered with the `Action` ConfigHelpers