Newer
Older
"""Helper object for configuring the LCIO output file (meta)"""
import datetime
import os
Marko Petric
committed
import logging
logging.basicConfig(format='%(levelname)s: %(message)s')
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
from DDSim.Helper.ConfigHelper import ConfigHelper
class Meta( ConfigHelper ):
"""Configuration for the LCIO output file settings"""
def __init__( self ):
super(Meta, self).__init__()
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.runNumberOffset = 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"}
self.eventNumberOffset = 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:
parameterAndValue = p.split( "=", 1 )
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))
if not pvalue:
raise RuntimeError("ERROR: Event parameter '%s' has empty value" %(pname))
allParameters.append(pname)
Marko Petric
committed
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
@staticmethod
def addParametersToRunHeader(sim):
"""add the parameters to the (lcio) run Header"""
runHeader = {}
parameters = vars(sim)
for parName, parameter in parameters.iteritems():
if isinstance( parameter, ConfigHelper ):
options = parameter.getOptions()
for opt,optionsDict in options.iteritems():
runHeader["%s.%s"%(parName, opt)] = str(optionsDict['default'])
else:
runHeader[parName] = str(parameter)
### steeringFile content
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()
### macroFile content
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()
### add command line
if sim._argv:
runHeader["CommandLine"] = " ".join(sim._argv)
### add current working directory (where we call from)
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"
### add User
import getpass
runHeader["User"] = getpass.getuser()
return runHeader