File indexing completed on 2026-09-16 08:24:29
0001 """Helper object for configuring the LCIO output file (meta)"""
0002
0003 from DDSim.Helper.ConfigHelper import ConfigHelper
0004 import datetime
0005 import io
0006 import os
0007 import logging
0008
0009 logger = logging.getLogger(__name__)
0010
0011
0012 class Meta(ConfigHelper):
0013 """Configuration for the LCIO output file settings"""
0014
0015 def __init__(self):
0016 super(Meta, self).__init__()
0017 self._eventParameters_EXTRA = {'help': "Event parameters to write in every event. "
0018 "Use C/F/I ids to specify parameter type. "
0019 "E.g parameterName/F=0.42 to set a float parameter",
0020 'nargs': '+'}
0021 self.eventParameters = []
0022 self._runParameters_EXTRA = {'help': "Run parameters to write in the run header. "
0023 "Use C/F/I ids to specify parameter type. "
0024 "E.g parameterName/F=0.42 to set a float parameter",
0025 'nargs': '+'}
0026 self.runParameters = []
0027 self._runNumberOffset_EXTRA = {'help': "The run number offset to write in slcio output file. "
0028 "E.g setting it to 42 will start counting runs from 42 instead of 0",
0029 'type': int}
0030 self.runNumberOffset = 0
0031 self._eventNumberOffset_EXTRA = {'help': "The event number offset to write in slcio output file."
0032 " E.g setting it to 42 will start counting events from 42 instead of 0",
0033 'type': int}
0034 self.eventNumberOffset = 0
0035
0036
0037 def parseMetaParameters(self, parameterType="event"):
0038 """
0039 Parse the metadata parameters and return 3 parameter dictionaries, respectively
0040 for string, int and float parameters
0041 """
0042 stringParameters, intParameters, floatParameters, allParameters = {}, {}, {}, []
0043
0044 for p in getattr(self, f"{parameterType}Parameters", []):
0045 parameterAndValue = p.split("=", 1)
0046 if len(parameterAndValue) != 2:
0047 raise SyntaxError(f"ERROR: Couldn't decode {parameterType} parameter '{p}'")
0048 parameterAndType = parameterAndValue[0].split("/", 1)
0049 if len(parameterAndType) != 2:
0050 raise SyntaxError(f"ERROR: Couldn't decode {parameterType} parameter '{p}'")
0051 pname = parameterAndType[0]
0052 ptype = parameterAndType[1]
0053 pvalue = parameterAndValue[1]
0054 if ptype.lower() not in ["c", "f", "i"]:
0055 raise ValueError(f"ERROR: {parameterType} parameter '{pname}' with invalid type '{ptype}'")
0056 if pname in allParameters:
0057 raise RuntimeError(f"ERROR: {parameterType} parameter '{pname}' specified twice")
0058 if not pvalue:
0059 raise RuntimeError(f"ERROR: {parameterType} parameter '{pname}' has empty value")
0060 allParameters.append(pname)
0061 logger.info(f"{parameterType} parameter '{pname}', type='{ptype}', value='{pvalue}'")
0062 if ptype.lower() == "c":
0063 stringParameters[pname] = pvalue
0064 elif ptype.lower() == "f":
0065 floatParameters[pname] = pvalue
0066 elif ptype.lower() == "i":
0067 intParameters[pname] = pvalue
0068 return stringParameters, intParameters, floatParameters
0069
0070 @staticmethod
0071 def addParametersToRunHeader(sim):
0072 """add the parameters to the (lcio) run Header"""
0073 runHeader = {}
0074 parameters = vars(sim)
0075 for parName, parameter in parameters.items():
0076 if isinstance(parameter, ConfigHelper):
0077 options = parameter.getOptions()
0078 for opt, optionsDict in options.items():
0079 runHeader["%s.%s" % (parName, opt)] = str(optionsDict['default'])
0080 else:
0081 runHeader[parName] = str(parameter)
0082
0083
0084 if sim.steeringFile and os.path.exists(sim.steeringFile) and os.path.isfile(sim.steeringFile):
0085 with io.open(sim.steeringFile) as sFile:
0086 runHeader["SteeringFileContent"] = sFile.read()
0087
0088
0089 if sim.macroFile and os.path.exists(sim.macroFile) and os.path.isfile(sim.macroFile):
0090 with io.open(sim.macroFile) as mFile:
0091 runHeader["MacroFileContent"] = mFile.read()
0092
0093
0094 if sim._argv:
0095 runHeader["CommandLine"] = " ".join(sim._argv)
0096
0097
0098 runHeader["WorkingDirectory"] = os.getcwd()
0099
0100
0101 runHeader["ILCSoft_location"] = os.environ.get("ILCSOFT", "Unknown")
0102 runHeader["lcgeo_location"] = os.environ.get("lcgeo_DIR", "Unknown")
0103
0104
0105 runHeader["DateUTC"] = str(datetime.datetime.utcnow()) + " UTC"
0106
0107
0108 import getpass
0109 try:
0110 runHeader["User"] = getpass.getuser()
0111 except KeyError:
0112 runHeader["User"] = str(os.getuid())
0113
0114 return runHeader