Newer
Older
"""Helper object for configuring the LCIO output file (meta)"""
from __future__ import absolute_import, unicode_literals
import datetime
import os
Marko Petric
committed
import logging
Marko Petric
committed
logger = logging.getLogger(__name__)
"""Configuration for the LCIO output file settings"""
self._eventParameters_EXTRA = {'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",
'nargs': '+'}
self.eventParameters = []
self._runNumberOffset_EXTRA = {'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",
self._eventNumberOffset_EXTRA = {'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",
def parseEventParameters(self):
"""
Parse the event parameters and return 3 event parameter dictionnaries, respectively
for string, int and float parameters
"""
stringParameters, intParameters, floatParameters, allParameters = {}, {}, {}, []
for p in self.eventParameters:
if len(parameterAndValue) != 2:
raise SyntaxError("ERROR: Couldn't decode event parameter '%s'" % (p))
parameterAndType = parameterAndValue[0].split("/", 1)
if len(parameterAndType) != 2:
raise SyntaxError("ERROR: Couldn't decode event parameter '%s'" % (p))
pname = parameterAndType[0]
ptype = parameterAndType[1]
pvalue = parameterAndValue[1]
if ptype.lower() not in ["c", "f", "i"]:
raise ValueError("ERROR: Event parameter '%s' with invalid type '%s'" % (pname, ptype))
if pname in allParameters:
raise RuntimeError("ERROR: Event parameter '%s' specified twice" % (pname))
raise RuntimeError("ERROR: Event parameter '%s' has empty value" % (pname))
allParameters.append(pname)
logger.info("Event parameter '%s', type '%s', value='%s'" % (pname, ptype, pvalue))
if ptype.lower() == "c":
stringParameters[pname] = pvalue
elif ptype.lower() == "f":
floatParameters[pname] = pvalue
elif ptype.lower() == "i":
intParameters[pname] = pvalue
return stringParameters, intParameters, floatParameters
@staticmethod
def addParametersToRunHeader(sim):
"""add the parameters to the (lcio) run Header"""
runHeader = {}
parameters = vars(sim)
for parName, parameter in six.iteritems(parameters):
options = parameter.getOptions()
for opt, optionsDict in six.iteritems(options):
runHeader["%s.%s" % (parName, opt)] = str(optionsDict['default'])
else:
runHeader[parName] = str(parameter)
if sim.steeringFile and os.path.exists(sim.steeringFile) and os.path.isfile(sim.steeringFile):
with open(sim.steeringFile) as sFile:
runHeader["SteeringFileContent"] = sFile.read()
if sim.macroFile and os.path.exists(sim.macroFile) and os.path.isfile(sim.macroFile):
with open(sim.macroFile) as mFile:
runHeader["MacroFileContent"] = mFile.read()
if sim._argv:
runHeader["CommandLine"] = " ".join(sim._argv)
runHeader["WorkingDirectory"] = os.getcwd()
# ILCSoft, LCGEo location from environment variables, names from init_ilcsoft.sh
runHeader["ILCSoft_location"] = os.environ.get("ILCSOFT", "Unknown")
runHeader["lcgeo_location"] = os.environ.get("lcgeo_DIR", "Unknown")
# add date
runHeader["DateUTC"] = str(datetime.datetime.utcnow()) + " UTC"
import getpass
runHeader["User"] = getpass.getuser()
return runHeader