325 Read trigger configuration keys (SMK, L1PSK, HLTPSK) and DB info from OKS via WEBDAQ REST API.
327 This reads the keys from the partition's TriggerConfiguration object and its
328 related L1TriggerConfiguration and TriggerDBConnection objects.
331 - Partition -> TriggerConfiguration -> L1TriggerConfiguration (Lvl1PrescaleKey)
332 - Partition -> TriggerConfiguration -> TriggerDBConnection (SuperMasterKey)
333 - Partition -> TriggerConfiguration -> HLTImplementationDB (hltPrescaleKey)
336 partition: The partition name (default: from TDAQ_PARTITION env var)
337 webdaq_base: Base URL for webis_server (default: from TDAQ_WEBDAQ_BASE env var)
338 strict: If True, raise an exception if OKS read fails (for --online-environment)
341 dict with keys: SMK, L1PSK, HLTPSK, db_alias (values may be None if not found)
344 RuntimeError: If strict=True and OKS read fails
349 if webdaq_base
is None:
350 webdaq_base = os.environ.get(
'TDAQ_WEBDAQ_BASE')
353 msg =
"TDAQ_WEBDAQ_BASE not set, cannot read from OKS"
355 raise RuntimeError(msg +
" (required for --online-environment)")
357 return {
'SMK':
None,
'L1PSK':
None,
'HLTPSK':
None,
'db_alias':
None}
360 if partition
is None:
361 partition = os.environ.get(
'TDAQ_PARTITION',
'ATLAS')
363 log.info(
"Reading trigger configuration keys from OKS via WEBDAQ: %s (partition=%s)",
364 webdaq_base, partition)
366 result = {
'SMK':
None,
'L1PSK':
None,
'HLTPSK':
None,
'db_alias':
None}
368 def extract_oks_data(response_json):
370 Extract data from OKS compact format: [name, type, attributes, relationships]
371 Returns tuple (attributes_dict, relationships_dict)
373 if isinstance(response_json, list)
and len(response_json) >= 4:
374 return response_json[2], response_json[3]
375 elif isinstance(response_json, list)
and len(response_json) >= 3:
376 return response_json[2], {}
377 return response_json, {}
380 """Extract object ID from a relationship reference."""
381 if isinstance(ref, list)
and len(ref) >= 2:
383 elif isinstance(ref, dict)
and 'id' in ref:
385 elif isinstance(ref, str):
394 url = f
"{webdaq_base}/info/current/{partition}/oks/Partition/{partition}?format=compact"
395 log.debug(
"Fetching Partition from OKS: %s", url)
397 response = requests.get(url, timeout=10)
398 if response.status_code == 200:
399 part_attrs, part_rels = extract_oks_data(response.json())
400 log.debug(
"Partition attributes: %s", part_attrs)
401 log.debug(
"Partition relationships: %s", part_rels)
405 if 'TriggerConfiguration' in part_rels:
406 trig_conf_id = get_ref_id(part_rels[
'TriggerConfiguration'])
409 log.debug(
"TriggerConfiguration ID: %s", trig_conf_id)
412 url = f
"{webdaq_base}/info/current/{partition}/oks/TriggerConfiguration/{trig_conf_id}?format=compact"
413 response = requests.get(url, timeout=10)
414 if response.status_code == 200:
415 trig_attrs, trig_rels = extract_oks_data(response.json())
416 log.debug(
"TriggerConfiguration attributes: %s", trig_attrs)
417 log.debug(
"TriggerConfiguration relationships: %s", trig_rels)
420 if 'l1' in trig_rels:
421 l1_id = get_ref_id(trig_rels[
'l1'])
423 url = f
"{webdaq_base}/info/current/{partition}/oks/L1TriggerConfiguration/{l1_id}?format=compact"
424 resp = requests.get(url, timeout=10)
425 if resp.status_code == 200:
426 l1_attrs, _ = extract_oks_data(resp.json())
427 log.debug(
"L1TriggerConfiguration attributes: %s", l1_attrs)
428 if 'Lvl1PrescaleKey' in l1_attrs:
429 result[
'L1PSK'] = int(l1_attrs[
'Lvl1PrescaleKey'])
430 log.info(
"Got L1PSK=%d from OKS", result[
'L1PSK'])
433 if 'TriggerDBConnection' in trig_rels:
434 db_id = get_ref_id(trig_rels[
'TriggerDBConnection'])
436 url = f
"{webdaq_base}/info/current/{partition}/oks/TriggerDBConnection/{db_id}?format=compact"
437 resp = requests.get(url, timeout=10)
438 if resp.status_code == 200:
439 db_attrs, _ = extract_oks_data(resp.json())
440 log.debug(
"TriggerDBConnection attributes: %s", db_attrs)
441 if 'SuperMasterKey' in db_attrs:
442 result[
'SMK'] = int(db_attrs[
'SuperMasterKey'])
443 log.info(
"Got SMK=%d from OKS", result[
'SMK'])
444 if 'Alias' in db_attrs:
445 result[
'db_alias'] = db_attrs[
'Alias']
446 log.info(
"Got db_alias=%s from OKS", result[
'db_alias'])
449 if 'hlt' in trig_rels:
450 hlt_id = get_ref_id(trig_rels[
'hlt'])
452 url = f
"{webdaq_base}/info/current/{partition}/oks/HLTImplementationDB/{hlt_id}?format=compact"
453 resp = requests.get(url, timeout=10)
454 if resp.status_code == 200:
455 hlt_attrs, _ = extract_oks_data(resp.json())
456 log.debug(
"HLTImplementationDB attributes: %s", hlt_attrs)
457 if 'hltPrescaleKey' in hlt_attrs:
458 result[
'HLTPSK'] = int(hlt_attrs[
'hltPrescaleKey'])
459 log.info(
"Got HLTPSK=%d from OKS", result[
'HLTPSK'])
461 msg = f
"Failed to fetch Partition from OKS: HTTP {response.status_code}"
463 raise RuntimeError(msg +
" (required for --online-environment)")
466 except requests.exceptions.RequestException
as e:
467 msg = f
"Error fetching trigger keys from OKS: {e}"
469 raise RuntimeError(msg +
" (required for --online-environment)")
471 except (ValueError, KeyError, TypeError)
as e:
472 msg = f
"Error parsing trigger keys from OKS: {e}"
474 raise RuntimeError(msg +
" (required for --online-environment)")
479 missing = [k
for k
in [
'SMK',
'L1PSK',
'HLTPSK']
if result.get(k)
is None]
481 raise RuntimeError(f
"Failed to get {', '.join(missing)} from OKS (required for --online-environment)")
852 """Update run parameters from IS, file, or conditions DB"""
855 if getattr(args,
'online_environment',
False):
856 log.info(
"Reading run parameters from Information Service via WEBDAQ")
860 solenoid_override = getattr(args,
'solenoid_current',
None)
861 toroids_override = getattr(args,
'toroids_current',
None)
864 partition=getattr(args,
'partition',
None),
865 webdaq_base=getattr(args,
'webdaq_base',
None),
867 solenoid_current_override=solenoid_override,
868 toroids_current_override=toroids_override)
870 if args.run_number
is None and run_params.run_number
is not None:
871 args.run_number = run_params.run_number
872 log.info(
"Using run_number=%d from IS", args.run_number)
873 if args.lb_number
is None and run_params.lb_number
is not None:
874 args.lb_number = run_params.lb_number
875 log.info(
"Using lb_number=%d from IS", args.lb_number)
876 if args.sor_time
is None and run_params.sor_time
is not None:
877 args.sor_time = run_params.sor_time
878 log.info(
"Using sor_time=%s from IS", args.sor_time)
879 if args.detector_mask
is None and run_params.detector_mask
is not None:
880 args.detector_mask = run_params.detector_mask
881 log.info(
"Using detector_mask=%s from IS", args.detector_mask)
883 args.solenoid_current = run_params.solenoid_current
884 args.toroids_current = run_params.toroids_current
885 args.beam_type = run_params.beam_type
886 args.beam_energy = run_params.beam_energy
888 if (args.run_number
is not None and args.lb_number
is None)
or (args.run_number
is None and args.lb_number
is not None):
889 log.error(
"Both or neither of the options -R (--run-number) and -L (--lb-number) have to be specified")
893 from eformat
import EventStorage
894 dr = EventStorage.pickDataReader(args.file[0])
895 if args.run_number
is None:
896 args.run_number = dr.runNumber()
897 args.lb_number = dr.lumiblockNumber()
898 args.T0_project_tag = dr.projectTag()
899 args.beam_type = dr.beamType()
900 args.beam_energy = dr.beamEnergy()
901 args.trigger_type = dr.triggerType()
902 args.stream = dr.stream()
903 args.lumiblock = dr.lumiblockNumber()
904 args.file_detector_mask =
"{:032x}".format(dr.detectorMask())
906 args.T0_project_tag = getattr(args,
'T0_project_tag',
'')
907 args.beam_type = getattr(args,
'beam_type', 0)
908 args.beam_energy = getattr(args,
'beam_energy', 0)
909 args.trigger_type = getattr(args,
'trigger_type', 0)
910 args.stream = getattr(args,
'stream',
'')
911 args.lumiblock = getattr(args,
'lumiblock', 0)
912 args.file_detector_mask = getattr(args,
'file_detector_mask',
'00000000000000000000000000000000')
915 if (args.sor_time
is None or args.detector_mask
is None)
and args.run_number
is not None:
916 sor_params = AthHLT.get_sor_params(args.run_number)
917 log.debug(
'SOR parameters: %s', sor_params)
918 if sor_params
is None:
919 log.error(
"Run %d does not exist. If you want to use this run-number specify "
920 "remaining run parameters, e.g.: --sor-time=now --detector-mask=all", args.run_number)
923 if args.sor_time
is None and sor_params
is not None:
924 args.sor_time =
arg_sor_time(str(sor_params[
'SORTime']))
926 if args.detector_mask
is None and sor_params
is not None:
927 dmask = sor_params[
'DetectorMask']
928 if args.run_number < AthHLT.CondDB._run2:
932 if args.dump_config_exit
and not args.run_number:
937 if getattr(args,
'solenoid_current',
None)
is None:
938 args.solenoid_current = RunParams.DEFAULT_SOLENOID_CURRENT
939 log.debug(
"Using default solenoid_current=%.1f", args.solenoid_current)
940 if getattr(args,
'toroids_current',
None)
is None:
941 args.toroids_current = RunParams.DEFAULT_TOROIDS_CURRENT
942 log.debug(
"Using default toroids_current=%.1f", args.toroids_current)
1132 parser = argparse.ArgumentParser(prog=
'athenaEF.py', formatter_class=
1133 lambda prog : argparse.ArgumentDefaultsHelpFormatter(prog, max_help_position=32, width=100),
1134 usage =
'%(prog)s [OPTION]... -f FILE jobOptions',
1136 parser.expert_groups = []
1139 g = parser.add_argument_group(
'Options')
1140 g.add_argument(
'jobOptions', nargs=
'?', help=
'job options: CA module (package.module:function), pickle file (.pkl), or JSON file (.json)')
1141 g.add_argument(
'--threads', metavar=
'N', type=int, default=1, help=
'number of threads')
1142 g.add_argument(
'--concurrent-events', metavar=
'N', type=int, help=
'number of concurrent events if different from --threads')
1143 g.add_argument(
'--log-level',
'-l', metavar=
'LVL', default=
'INFO', help=
'OutputLevel of athena')
1144 g.add_argument(
'--precommand',
'-c', metavar=
'CMD', action=
'append', default=[],
1145 help=
'Python commands executed before job options')
1146 g.add_argument(
'--postcommand',
'-C', metavar=
'CMD', action=
'append', default=[],
1147 help=
'Python commands executed after job options')
1148 g.add_argument(
'--interactive',
'-i', action=
'store_true', help=
'interactive mode')
1149 g.add_argument(
'--help',
'-h', nargs=
'?', choices=[
'all'], action=MyHelp, help=
'show help')
1151 g = parser.add_argument_group(
'Input/Output')
1152 g.add_argument(
'--file',
'--filesInput',
'-f', action=
'append', help=
'input RAW file')
1153 g.add_argument(
'--save-output',
'-o', metavar=
'FILE', help=
'output file name')
1154 g.add_argument(
'--number-of-events',
'--evtMax',
'-n', metavar=
'N', type=int, default=
None,
1155 help=
'processes N events (default: from DB/config, -1 means all)')
1156 g.add_argument(
'--skip-events',
'--skipEvents',
'-k', metavar=
'N', type=int, default=
None,
1157 help=
'skip N first events')
1158 g.add_argument(
'--loop-files', action=argparse.BooleanOptionalAction, default=
None,
1159 help=
'loop over input files if no more events')
1160 g.add_argument(
'--efdf-interface-library', metavar=
'LIB', default=
None,
1161 help=
'name of the EFDF interface shared library to load (default: TrigDFEmulator)')
1164 g = parser.add_argument_group(
'Performance and debugging')
1165 g.add_argument(
'--perfmon', action=
'store_true', help=
'enable PerfMon')
1166 g.add_argument(
'--tcmalloc', action=
'store_true', default=
True, help=
'use tcmalloc')
1167 g.add_argument(
'--stdcmalloc', action=
'store_true', help=
'use stdcmalloc')
1168 g.add_argument(
'--stdcmath', action=
'store_true', help=
'use stdcmath library')
1169 g.add_argument(
'--imf', action=
'store_true', default=
True, help=
'use Intel math library')
1170 g.add_argument(
'--timeout', metavar=
'MSEC', type=int, default=
None,
1171 help=
'event processing timeout (HardTimeout) in milliseconds. '
1172 f
'NB: only the soft timeout ({SOFT_TIMEOUT_FRACTION*100:.0f}%% of it) is enforced')
1175 g = parser.add_argument_group(
'Conditions')
1176 g.add_argument(
'--run-number',
'-R', metavar=
'RUN', type=int,
1177 help=
'run number (if None, read from first event)')
1178 g.add_argument(
'--lb-number',
'-L', metavar=
'LBN', type=int,
1179 help=
'lumiblock number (if None, read from first event)')
1180 g.add_argument(
'--conditions-run', metavar=
'RUN', type=int, default=
None,
1181 help=
'reference run number for conditions lookup (use when IS run number has no COOL data)')
1182 g.add_argument(
'--sor-time', type=arg_sor_time,
1183 help=
'The Start Of Run time. Three formats are accepted: '
1184 '1) the string "now", for current time; '
1185 '2) the number of nanoseconds since epoch (e.g. 1386355338658000000 or int(time.time() * 1e9)); '
1186 '3) human-readable "20/11/18 17:40:42.3043". If not specified the sor-time is read from the conditions DB')
1187 g.add_argument(
'--detector-mask', metavar=
'MASK', type=arg_detector_mask,
1188 help=
'detector mask (if None, read from the conditions DB), use string "all" to enable all detectors')
1191 g = parser.add_argument_group(
'Database')
1192 g.add_argument(
'--use-database',
'-b', action=
'store_true',
1193 help=
'configure from trigger database using SMK')
1194 g.add_argument(
'--db-server', metavar=
'DB', default=
'TRIGGERDB_RUN3', help=
'DB server name (alias)')
1195 g.add_argument(
'--smk', type=int, default=
None, help=
'Super Master Key')
1196 g.add_argument(
'--l1psk', type=int, default=
None, help=
'L1 prescale key')
1197 g.add_argument(
'--hltpsk', type=int, default=
None, help=
'HLT prescale key')
1198 g.add_argument(
'--use-crest', action=
'store_true', default=
False,
1199 help=
'Use CREST for trigger configuration')
1200 g.add_argument(
'--crest-server', metavar=
'URL', default=
None,
1201 help=
'CREST server URL (defaults to flags.Trigger.crestServer)')
1202 g.add_argument(
'--dump-config', action=
'store_true', help=
'Dump joboptions JSON file')
1203 g.add_argument(
'--dump-config-exit', action=
'store_true', help=
'Dump joboptions JSON file and exit')
1206 g = parser.add_argument_group(
'Magnets')
1207 g.add_argument(
'--solenoid-current', type=float, default=
None,
1208 help=
'Solenoid current in Amperes (default: nominal current for offline running, required from IS online)')
1209 g.add_argument(
'--toroids-current', type=float, default=
None,
1210 help=
'Toroids current in Amperes (default: nominal current for offline running, required from IS online)')
1213 g = parser.add_argument_group(
'Online')
1214 g.add_argument(
'--online-environment', action=
'store_true',
1215 help=
'Enable online environment: read run parameters from IS and trigger '
1216 'configuration keys (SMK, L1PSK, HLTPSK) from OKS via WEBDAQ REST API')
1217 g.add_argument(
'--partition', metavar=
'NAME', default=
None,
1218 help=
'TDAQ partition name (defaults to TDAQ_PARTITION environment variable)')
1219 g.add_argument(
'--webdaq-base', metavar=
'URL', default=
None,
1220 help=
'WEBDAQ base URL (defaults to TDAQ_WEBDAQ_BASE environment variable)')
1223 g = parser.add_argument_group(
'Online Histogramming')
1224 g.add_argument(
'--oh-monitoring',
'-M', action=
'store_true', default=
False,
1225 help=
'enable online histogram publishing via WebdaqHistSvc')
1228 g = parser.add_argument_group(
'Expert')
1229 parser.expert_groups.append(g)
1230 (args, unparsed_args) = parser.parse_known_args()
1234 from PyUtils.Helpers
import ROOTSetup
1235 ROOTSetup(batch=
True)
1239 ROOT.ROOT.EnableThreadSafety()
1242 import AthenaCommon.Logging
1243 AthenaCommon.Logging.log.setLevel(getattr(logging, args.log_level))
1244 AthenaCommon.Logging.log.setFormat(
"%(asctime)s Py:%(name)-31s %(levelname)7s %(message)s")
1247 if not args.concurrent_events:
1248 args.concurrent_events = args.threads
1251 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
1252 from TrigServices.TriggerUnixStandardSetup
import setDefaultOnlineFlags
1255 flags = initConfigFlags()
1256 setDefaultOnlineFlags(flags)
1259 from AthenaCommon
import Constants
1260 flags.Exec.OutputLevel = getattr(Constants, args.log_level)
1263 if args.oh_monitoring:
1264 flags.Trigger.Online.useOnlineWebdaqHistSvc =
True
1265 log.info(
"Enabled WebdaqHistSvc for online histogram publishing")
1268 log.info(
"Using CREST for trigger configuration: %s", args.use_crest)
1270 flags.Trigger.useCrest =
True
1271 if args.crest_server:
1272 flags.Trigger.crestServer = args.crest_server
1274 args.crest_server = flags.Trigger.crestServer
1282 force_psk = args.use_database
and ((args.hltpsk
is not None)
or args.online_environment)
1284 if args.use_database:
1289 if not args.use_database
and args.jobOptions
and not args.jobOptions.endswith(
'.json'):
1290 AthHLT.unparsedArguments = unparsed_args
1291 for flag_arg
in unparsed_args:
1292 flags.fillFromString(flag_arg)
1300 if args.conditions_run
is not None:
1301 log.info(
"Using conditions from reference run %d (overriding run %s for IOV lookup)",
1302 args.conditions_run, args.run_number)
1303 flags.Input.ConditionsRunNumber = args.conditions_run
1306 if args.number_of_events
is not None and args.number_of_events > 0:
1307 flags.Exec.MaxEvents = args.number_of_events
1310 if args.skip_events
is not None and args.skip_events > 0:
1311 flags.Exec.SkipEvents = args.skip_events
1317 flags.PerfMon.doFastMonMT = args.perfmon
1324 overrides.set(
'AvalancheSchedulerSvc.ThreadPoolSize', args.threads)
1325 overrides.set(
'EventDataSvc.NSlots', args.concurrent_events)
1327 ef_files = args.file
if args.file
else []
1329 overrides.set(
'EFInterfaceSvc.Files', ef_files)
1330 overrides.set(
'EFInterfaceSvc.T0ProjectTag', args.T0_project_tag)
1331 overrides.set(
'EFInterfaceSvc.BeamType', args.beam_type)
1332 overrides.set(
'EFInterfaceSvc.BeamEnergy', args.beam_energy)
1333 overrides.set(
'EFInterfaceSvc.TriggerType', args.trigger_type)
1334 overrides.set(
'EFInterfaceSvc.Stream', args.stream)
1335 overrides.set(
'EFInterfaceSvc.Lumiblock', args.lumiblock)
1336 overrides.set(
'EFInterfaceSvc.DetMask', args.file_detector_mask)
1337 if args.run_number
is not None:
1338 overrides.set(
'EFInterfaceSvc.RunNumber', args.run_number)
1339 if args.save_output
is not None:
1340 overrides.set(
'EFInterfaceSvc.OutputFileName', args.save_output)
1341 if args.loop_files
is not None:
1342 overrides.set(
'EFInterfaceSvc.LoopOverFiles', args.loop_files)
1343 if args.number_of_events
is not None:
1344 overrides.set(
'EFInterfaceSvc.NumEvents', args.number_of_events)
1345 if args.skip_events
is not None:
1346 overrides.set(
'EFInterfaceSvc.SkipEvents', args.skip_events)
1347 if args.efdf_interface_library
is not None:
1348 overrides.set(
'EFInterfaceSvc.EFDFInterfaceLibraryName', args.efdf_interface_library)
1350 if args.timeout
is not None:
1351 overrides.set(
'HltEventLoopMgr.HardTimeout', float(args.timeout))
1352 overrides.set(
'HltEventLoopMgr.SoftTimeoutFraction', SOFT_TIMEOUT_FRACTION)
1353 if args.conditions_run
is not None:
1355 overrides.set(
'HltEventLoopMgr.forceRunNumber', args.conditions_run)
1358 overrides.set(
'HLTPrescaleCondAlg.Source',
'DB')
1363 if not args.online_environment:
1364 if args.oh_monitoring:
1365 overrides.declare_type(
'THistSvc',
'WebdaqHistSvc')
1366 overrides.create_service(
'WebdaqInfoSvc')
1368 overrides.declare_type(
'THistSvc',
'THistSvc')
1369 overrides.drop_service(
'WebdaqInfoSvc')
1373 log.info(
"Executing precommand(s)")
1374 for cmd
in args.precommand:
1375 log.info(
" %s", cmd)
1376 exec(cmd, globals(), {
'flags': flags})
1379 is_database = args.use_database
1383 if not is_database
and args.jobOptions:
1384 jobOptions = args.jobOptions
1385 is_pickle = jobOptions.endswith(
'.pkl')
1386 is_json = jobOptions.endswith(
'.json')
1392 crestconn = TriggerCrestUtil.getCrestConnection(args.db_server)
1393 db_alias = f
"{args.crest_server}/{crestconn}"
1394 log.info(
"Loading configuration via CREST from %s with SMK %d", db_alias, args.smk)
1396 db_alias = args.db_server
1397 log.info(
"Loading configuration from database %s with SMK %d", db_alias, args.smk)
1401 acc =
load_from_database(db_alias, args.smk, args.l1psk, args.hltpsk, run_params, overrides=overrides)
1402 log.info(
"Configuration loaded from database")
1406 log.info(
"Loading configuration from pickle file: %s", jobOptions)
1407 with open(jobOptions,
'rb')
as f:
1408 acc = pickle.load(f)
1409 log.info(
"Configuration loaded from pickle")
1413 log.info(
"Loading configuration from JSON file: %s", jobOptions)
1416 acc =
load_from_json(jobOptions, run_params, overrides=overrides)
1417 log.info(
"Configuration loaded from JSON")
1424 log.info(
"Loading CA configuration from: %s", jobOptions)
1427 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
1428 from AthenaConfiguration.MainServicesConfig
import addMainSequences
1429 from TrigServices.TriggerUnixStandardSetup
import commonServicesCfg
1430 from AthenaConfiguration.ComponentFactory
import CompFactory
1432 locked_flags = flags.clone()
1436 cfg = ComponentAccumulator(CompFactory.AthSequencer(
"AthMasterSeq", Sequential=
True))
1437 cfg.setAppProperty(
'ExtSvcCreates',
False)
1438 cfg.setAppProperty(
"MessageSvcType",
"TrigMessageSvc")
1439 cfg.setAppProperty(
"JobOptionsSvcType",
"TrigConf::JobOptionsSvc")
1442 addMainSequences(locked_flags, cfg)
1443 cfg.merge(commonServicesCfg(locked_flags))
1446 cfg_func = AthHLT.getCACfg(jobOptions)
1447 cfg.merge(cfg_func(flags))
1450 if args.postcommand:
1451 log.info(
"Executing postcommand(s)")
1452 for cmd
in args.postcommand:
1453 log.info(
" %s", cmd)
1454 exec(cmd, globals(), {
'flags': flags,
'cfg': cfg})
1455 args.postcommand = []
1458 fname =
"HLTJobOptions"
1459 log.info(
"Dumping configuration to %s.pkl and %s.json", fname, fname)
1460 with open(f
"{fname}.pkl",
"wb")
as f:
1463 from TrigConfIO.JsonUtils
import create_joboptions_json
1464 create_joboptions_json(f
"{fname}.pkl", f
"{fname}.json")
1467 if args.dump_config_exit:
1468 log.info(
"Configuration dumped to %s.json. Exiting...", fname)
1472 log.info(
"Configuration dumped to %s.json. Re-exec...", fname)
1473 AthHLT.reload_from_json(f
"{fname}.json", suppress_args=unparsed_args + [
'--dump-config'], jobOptions=args.jobOptions)
1476 if args.postcommand:
1477 log.info(
"Executing postcommand(s)")
1478 for cmd
in args.postcommand:
1479 log.info(
" %s", cmd)
1480 exec(cmd, globals(), {
'flags': flags,
'acc': acc})
1483 if args.dump_config
or args.dump_config_exit:
1484 fname =
"HLTJobOptions"
1488 from TrigConfIO.HLTTriggerConfigAccess
import HLTJobOptionsAccess
1489 log.info(
"Fetching configuration from database for dump...")
1490 jo_access = HLTJobOptionsAccess(dbalias=acc.db_server, smkey=acc.smk)
1491 props = jo_access.algorithms()
1493 log.info(
"Dumping configuration to %s.json", fname)
1494 hlt_json = {
'filetype':
'joboptions',
'properties': props}
1495 with open(f
"{fname}.json",
"w")
as f:
1496 json.dump(hlt_json, f, indent=4, sort_keys=
True, ensure_ascii=
True)
1500 props = acc.properties
1502 log.info(
"Dumping configuration to %s.json", fname)
1503 hlt_json = {
'filetype':
'joboptions',
'properties': props}
1504 with open(f
"{fname}.json",
"w")
as f:
1505 json.dump(hlt_json, f, indent=4, sort_keys=
True, ensure_ascii=
True)
1507 log.warning(
"No properties available to dump")
1511 app_props, msg_props, comp_props = acc.gatherProps()
1512 props = {
"ApplicationMgr": app_props,
"MessageSvc": msg_props}
1513 for comp, name, value
in comp_props:
1514 props.setdefault(comp, {})[name] = value
1516 log.info(
"Dumping configuration to %s.json", fname)
1517 hlt_json = {
'filetype':
'joboptions',
'properties': props}
1518 with open(f
"{fname}.json",
"w")
as f:
1519 json.dump(hlt_json, f, indent=4, sort_keys=
True, ensure_ascii=
True)
1524 if args.dump_config_exit:
1525 log.info(
"Configuration dumped. Exiting...")
1529 log.info(
"Starting Athena execution...")
1534 worker_dir = os.path.join(os.getcwd(),
"athenaHLT_workers",
"athenaHLT-01")
1535 if not os.path.exists(worker_dir):
1536 log.info(
"Creating worker directory: %s", worker_dir)
1537 os.makedirs(worker_dir, exist_ok=
True)
1542 if args.interactive:
1543 log.info(
"Interactive mode - call acc.run() to execute")
1545 code.interact(local={
'acc': acc,
'flags': flags})
1548 from AthenaCommon
import ExitCodes
1552 sc = acc.run(args.number_of_events)
1554 exitcode = ExitCodes.EXE_ALG_FAILURE
1555 except SystemExit
as e:
1556 exitcode = ExitCodes.EXE_ALG_FAILURE
if e.code == 1
else e.code
1558 traceback.print_exc()
1559 exitcode = ExitCodes.UNKNOWN_EXCEPTION
1563 log.info(
'Leaving with code %d: "%s"', exitcode, ExitCodes.what(exitcode))