Back to home page

EIC code displayed by LXR

 
 

    


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     # no closeProperties, allow adding arbitrary information to runHeader
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     # steeringFile content
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     # macroFile content
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     # add command line
0094     if sim._argv:
0095       runHeader["CommandLine"] = " ".join(sim._argv)
0096 
0097     # add current working directory (where we call from)
0098     runHeader["WorkingDirectory"] = os.getcwd()
0099 
0100     # ILCSoft, LCGEo location from environment variables, names from init_ilcsoft.sh
0101     runHeader["ILCSoft_location"] = os.environ.get("ILCSOFT", "Unknown")
0102     runHeader["lcgeo_location"] = os.environ.get("lcgeo_DIR", "Unknown")
0103 
0104     # add date
0105     runHeader["DateUTC"] = str(datetime.datetime.utcnow()) + " UTC"
0106 
0107     # add User
0108     import getpass
0109     try:
0110         runHeader["User"] = getpass.getuser()
0111     except KeyError:
0112         runHeader["User"] = str(os.getuid())
0113 
0114     return runHeader