From 212678c3426d9ce3f70616f4452d997931a8737d Mon Sep 17 00:00:00 2001 From: Tadej Novak <tadej.novak@cern.ch> Date: Fri, 14 Aug 2020 17:21:54 +0200 Subject: [PATCH] Initial new-style transform prototype --- .../python/OverlayHelpers.py | 64 +++++++++ .../python/OverlayHelpersLegacy.py | 50 +++++++ .../python/OverlaySkeleton.py | 125 ++++++++++++++++++ .../python/OverlayTestHelpers.py | 43 +----- .../python/OverlayTransformHelpers.py | 7 +- .../scripts/Overlay_tf.py | 2 +- .../share/skeleton_LegacyOverlay.py | 25 ++-- .../OverlayConfiguration/test/OverlayTest.py | 5 +- 8 files changed, 263 insertions(+), 58 deletions(-) create mode 100644 Simulation/Overlay/OverlayConfiguration/python/OverlayHelpers.py create mode 100644 Simulation/Overlay/OverlayConfiguration/python/OverlayHelpersLegacy.py create mode 100644 Simulation/Overlay/OverlayConfiguration/python/OverlaySkeleton.py diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlayHelpers.py b/Simulation/Overlay/OverlayConfiguration/python/OverlayHelpers.py new file mode 100644 index 00000000000..4abd2753b69 --- /dev/null +++ b/Simulation/Overlay/OverlayConfiguration/python/OverlayHelpers.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +"""Overlay configuration helpers + +Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +""" + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaConfiguration.ComponentFactory import CompFactory + + +def OverlayMessageSvcCfg(flags): + """MessageSvc for overlay""" + MessageSvc = CompFactory.MessageSvc + acc = ComponentAccumulator() + acc.addService(MessageSvc(setError=["HepMcParticleLink"])) + return acc + + +def setupOverlayDetectorFlags(configFlags, detectors): + """Setup Overlay detector flags""" + if not detectors or 'BCM' in detectors or 'ID' in detectors: + configFlags.Detector.OverlayBCM = True + if not detectors or 'DBM' in detectors or 'ID' in detectors: + configFlags.Detector.OverlayDBM = True + if not detectors or 'Pixel' in detectors or 'ID' in detectors: + configFlags.Detector.OverlayPixel = True + if not detectors or 'SCT' in detectors or 'ID' in detectors: + configFlags.Detector.OverlaySCT = True + if not detectors or 'TRT' in detectors or 'ID' in detectors: + configFlags.Detector.OverlayTRT = True + if not detectors or 'LAr' in detectors or 'Calo' in detectors or 'L1Calo' in detectors: + configFlags.Detector.OverlayLAr = True + if not detectors or 'Tile' in detectors or 'Calo' in detectors or 'L1Calo' in detectors: + configFlags.Detector.OverlayTile = True + if not detectors or 'L1Calo' in detectors: + configFlags.Detector.OverlayL1Calo = not configFlags.Overlay.DataOverlay + if not detectors or 'CSC' in detectors or 'Muon' in detectors: + configFlags.Detector.OverlayCSC = True + if not detectors or 'MDT' in detectors or 'Muon' in detectors: + configFlags.Detector.OverlayMDT = True + if not detectors or 'RPC' in detectors or 'Muon' in detectors: + configFlags.Detector.OverlayRPC = True + if not detectors or 'TGC' in detectors or 'Muon' in detectors: + configFlags.Detector.OverlayTGC = True + if not detectors or 'sTGC' in detectors or 'Muon' in detectors: + configFlags.Detector.OverlaysTGC = True + if not detectors or 'MM' in detectors or 'Muon' in detectors: + configFlags.Detector.OverlayMM = True + + +def accFromFragment(acc_string, flags): + """Return initialized accumulator from post include fragment.""" + parts = acc_string.split('.') + if len(parts) < 3: + raise ValueError('Post include should be of the form Package.Module.Function') + + function = parts[-1] + module = '.'.join(parts[:-1]) + + from importlib import import_module + loaded_module = import_module(module) + function_def = getattr(loaded_module, function) + + return function_def(flags) diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlayHelpersLegacy.py b/Simulation/Overlay/OverlayConfiguration/python/OverlayHelpersLegacy.py new file mode 100644 index 00000000000..d49cbdf69cf --- /dev/null +++ b/Simulation/Overlay/OverlayConfiguration/python/OverlayHelpersLegacy.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +"""Overlay legacy configuration helpers + +Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +""" + + +def setupOverlayLegacyDetectorFlags(detectors): + """Setup Overlay legacy detector flags""" + from AthenaCommon.DetFlags import DetFlags + if not detectors: + DetFlags.all_setOn() + DetFlags.bpipe_setOff() + DetFlags.FTK_setOff() + return DetFlags + + # Truth is always on + DetFlags.Truth_setOn() + + # Other subdetectors + if not detectors or 'BCM' in detectors or 'ID' in detectors: + DetFlags.BCM_setOn() + if not detectors or 'DBM' in detectors or 'ID' in detectors: + DetFlags.DBM_setOn() + if not detectors or 'Pixel' in detectors or 'ID' in detectors: + DetFlags.pixel_setOn() + if not detectors or 'SCT' in detectors or 'ID' in detectors: + DetFlags.SCT_setOn() + if not detectors or 'TRT' in detectors or 'ID' in detectors: + DetFlags.TRT_setOn() + if not detectors or 'LAr' in detectors or 'Calo' in detectors or 'L1Calo' in detectors: + DetFlags.LAr_setOn() + if not detectors or 'Tile' in detectors or 'Calo' in detectors or 'L1Calo' in detectors: + DetFlags.Tile_setOn() + if not detectors or 'L1Calo' in detectors: + DetFlags.LVL1_setOn() + if not detectors or 'CSC' in detectors or 'Muon' in detectors: + DetFlags.CSC_setOn() + if not detectors or 'MDT' in detectors or 'Muon' in detectors: + DetFlags.MDT_setOn() + if not detectors or 'RPC' in detectors or 'Muon' in detectors: + DetFlags.RPC_setOn() + if not detectors or 'TGC' in detectors or 'Muon' in detectors: + DetFlags.TGC_setOn() + if not detectors or 'sTGC' in detectors or 'Muon' in detectors: + DetFlags.sTGC_setOn() + if not detectors or 'MM' in detectors or 'Muon' in detectors: + DetFlags.Micromegas_setOn() + + return DetFlags diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlaySkeleton.py b/Simulation/Overlay/OverlayConfiguration/python/OverlaySkeleton.py new file mode 100644 index 00000000000..6f9ab978101 --- /dev/null +++ b/Simulation/Overlay/OverlayConfiguration/python/OverlaySkeleton.py @@ -0,0 +1,125 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + +import sys + +from PyJobTransforms.CommonRunArgsToFlags import commonRunArgsToFlags +from OverlayConfiguration.OverlayHelpers import setupOverlayDetectorFlags, OverlayMessageSvcCfg + + +def defaultOverlayFlags(configFlags, detectors): + """Fill default overlay flags""" + # TODO: how to autoconfigure those + configFlags.GeoModel.Align.Dynamic = False + configFlags.Digitization.DoCaloNoise = False + configFlags.Digitization.DoInnerDetectorNoise = False + configFlags.Digitization.DoDigiTruth = False + configFlags.LAr.OFCShapeFolder = "4samples1phase" + configFlags.LAr.ROD.DoOFCPileupOptimization = True + configFlags.LAr.ROD.nSamples = 4 + configFlags.LAr.ROD.NumberOfCollisions = 20 + configFlags.LAr.ROD.UseHighestGainAutoCorr = True + configFlags.Tile.BestPhaseFromCOOL = False + configFlags.Tile.correctTime = False + configFlags.Tile.zeroAmplitudeWithoutDigits = False + + setupOverlayDetectorFlags(configFlags, detectors) + + +def fromRunArgs(runArgs): + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior = True + + from AthenaCommon.Logging import logging + logOverlay = logging.getLogger('Overlay') + logOverlay.info('****************** STARTING OVERLAY *****************') + + logOverlay.info('**** Transformation run arguments') + logOverlay.info(str(runArgs)) + + logOverlay.info('**** Setting-up configuration flags') + from AthenaConfiguration.AllConfigFlags import ConfigFlags + commonRunArgsToFlags(runArgs, ConfigFlags) + + hasRDO_BKGInput = hasattr(runArgs, 'inputRDO_BKGFile') + hasBS_SKIMInput = hasattr(runArgs, 'inputBS_SKIMFile') + + if not hasattr(runArgs, 'inputHITSFile'): + raise RuntimeError('No input HITS file defined') + + if hasRDO_BKGInput and hasBS_SKIMInput: + raise RuntimeError('Both RDO_BKG and BS_SKIM are defined') + if not hasRDO_BKGInput and not hasBS_SKIMInput: + raise RuntimeError('Define one of RDO_BKG and BS_SKIM file types') + + if hasRDO_BKGInput: + logOverlay.info('Running MC+MC overlay') + ConfigFlags.Overlay.DataOverlay = False + ConfigFlags.Input.isMC = True + ConfigFlags.Input.Files = runArgs.inputRDO_BKGFile + ConfigFlags.Input.SecondaryFiles = runArgs.inputHITSFile + else: + logOverlay.info('Running MC+data overlay') + ConfigFlags.Overlay.DataOverlay = True + ConfigFlags.Input.isMC = False + ConfigFlags.Input.Files = runArgs.inputHITSFile + ConfigFlags.Input.SecondaryFiles = runArgs.inputBS_SKIMFile + + if hasattr(runArgs, 'outputRDOFile'): + if runArgs.outputRDOFile == 'None': + ConfigFlags.Output.RDOFileName = '' + else: + ConfigFlags.Output.RDOFileName = runArgs.outputRDOFile + else: + raise RuntimeError('No output RDO file defined') + + if hasattr(runArgs, 'outputRDO_SGNLFile'): + ConfigFlags.Output.RDO_SGNLFileName = runArgs.outputRDO_SGNLFile + + # Autoconfigure enabled subdetectors + if hasattr(runArgs, 'detectors'): + detectors = runArgs.detectors + else: + detectors = None + + # Setup digitization flags + from Digitization.DigitizationConfigFlags import digitizationRunArgsToFlags + digitizationRunArgsToFlags(runArgs, ConfigFlags) + + # Setup common overlay flags + defaultOverlayFlags(ConfigFlags, detectors) + + # Pre-exec + if hasattr(runArgs, 'preExec') and runArgs.preExec != 'NONE' and runArgs.preExec: + for cmd in runArgs.preExec: + exec(cmd) + + # Pre-include + if hasattr(runArgs, 'preInclude') and runArgs.preInclude: + raise ValueError('preInclude not supported') + + # TODO not parsed yet: + # '--fSampltag' + # '--triggerConfig' + + # Lock flags + ConfigFlags.lock() + + # Main overlay steering + from OverlayConfiguration.OverlaySteering import OverlayMainCfg + acc = OverlayMainCfg(ConfigFlags) + acc.merge(OverlayMessageSvcCfg(ConfigFlags)) + + # Post-include + if hasattr(runArgs, 'postInclude') and runArgs.postInclude: + from OverlayConfiguration.OverlayHelpers import accFromFragment + for fragment in runArgs.postInclude: + acc.merge(accFromFragment(fragment, ConfigFlags)) + + # Post-exec + if hasattr(runArgs, 'postExec') and runArgs.postExec != 'NONE' and runArgs.postExec: + for cmd in runArgs.postExec: + exec(cmd) + + # Run the final accumulator + sc = acc.run() + sys.exit(not sc.isSuccess()) diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py b/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py index 73bc0dff6b1..9c7db234860 100644 --- a/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py +++ b/Simulation/Overlay/OverlayConfiguration/python/OverlayTestHelpers.py @@ -8,6 +8,7 @@ from argparse import ArgumentParser from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from AthenaConfiguration.ComponentFactory import CompFactory +from OverlayConfiguration.OverlayHelpers import setupOverlayDetectorFlags def JobOptsDumperCfg(flags): @@ -18,14 +19,6 @@ def JobOptsDumperCfg(flags): return acc -def TestMessageSvcCfg(flags): - """MessageSvc for overlay""" - MessageSvc = CompFactory.MessageSvc - acc = ComponentAccumulator() - acc.addService(MessageSvc(setError=["HepMcParticleLink"])) - return acc - - def CommonTestArgumentParser(prog): """Common overlay test argument parser""" parser = ArgumentParser(prog=prog) @@ -46,38 +39,6 @@ def CommonTestArgumentParser(prog): return parser -def setupOverlayTestDetectorFlags(configFlags, detectors): - """Setup Overlay detector flags""" - if not detectors or 'BCM' in detectors or 'ID' in detectors: - configFlags.Detector.OverlayBCM = True - if not detectors or 'DBM' in detectors or 'ID' in detectors: - configFlags.Detector.OverlayDBM = True - if not detectors or 'Pixel' in detectors or 'ID' in detectors: - configFlags.Detector.OverlayPixel = True - if not detectors or 'SCT' in detectors or 'ID' in detectors: - configFlags.Detector.OverlaySCT = True - if not detectors or 'TRT' in detectors or 'ID' in detectors: - configFlags.Detector.OverlayTRT = True - if not detectors or 'LAr' in detectors or 'Calo' in detectors or 'L1Calo' in detectors: - configFlags.Detector.OverlayLAr = True - if not detectors or 'Tile' in detectors or 'Calo' in detectors or 'L1Calo' in detectors: - configFlags.Detector.OverlayTile = True - if not detectors or 'L1Calo' in detectors: - configFlags.Detector.OverlayL1Calo = not configFlags.Overlay.DataOverlay - if not detectors or 'CSC' in detectors or 'Muon' in detectors: - configFlags.Detector.OverlayCSC = True - if not detectors or 'MDT' in detectors or 'Muon' in detectors: - configFlags.Detector.OverlayMDT = True - if not detectors or 'RPC' in detectors or 'Muon' in detectors: - configFlags.Detector.OverlayRPC = True - if not detectors or 'TGC' in detectors or 'Muon' in detectors: - configFlags.Detector.OverlayTGC = True - if not detectors or 'sTGC' in detectors or 'Muon' in detectors: - configFlags.Detector.OverlaysTGC = True - if not detectors or 'MM' in detectors or 'Muon' in detectors: - configFlags.Detector.OverlayMM = True - - def defaultTestFlags(configFlags, args): """Fill default overlay flags for testing""" configFlags.GeoModel.Align.Dynamic = False @@ -118,7 +79,7 @@ def defaultTestFlags(configFlags, args): if args.outputSig: configFlags.Output.RDO_SGNLFileName = args.outputSig - setupOverlayTestDetectorFlags(configFlags, args.detectors if 'detectors' in args else None) + setupOverlayDetectorFlags(configFlags, args.detectors if 'detectors' in args else None) def postprocessAndLockFlags(configFlags, args): diff --git a/Simulation/Overlay/OverlayConfiguration/python/OverlayTransformHelpers.py b/Simulation/Overlay/OverlayConfiguration/python/OverlayTransformHelpers.py index a0cbaa1dd8b..f2634eaeb23 100644 --- a/Simulation/Overlay/OverlayConfiguration/python/OverlayTransformHelpers.py +++ b/Simulation/Overlay/OverlayConfiguration/python/OverlayTransformHelpers.py @@ -3,13 +3,17 @@ Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration """ -from PyJobTransforms.trfArgClasses import argBSFile, argFactory, argRDOFile, argSubstep +from PyJobTransforms.trfArgClasses import argBSFile, argFactory, argRDOFile, argString, argSubstep from PyJobTransforms.trfExe import athenaExecutor def addOverlayTrfArgs(parser): """Add common overlay command-line parser arguments.""" parser.defineArgGroup('Overlay', 'Common Overlay Options') + parser.add_argument('--detectors', + type=argFactory(argString), + help='Detectors autoconfiguration string', + group='Overlay') parser.add_argument('--outputRDO_SGNLFile', nargs='+', type=argFactory(argRDOFile, io='output'), help='The output RDO file of the MC signal alone', @@ -52,6 +56,7 @@ def addOverlayArguments(parser): def addOverlaySubstep(executor_set, in_reco_chain=False): executor = athenaExecutor(name='Overlay', skeletonFile='OverlayConfiguration/skeleton_LegacyOverlay.py', + skeletonCA='OverlayConfiguration.OverlaySkeleton', substep='overlay', tryDropAndReload=False, perfMonFile='ntuple.pmon.gz', diff --git a/Simulation/Overlay/OverlayConfiguration/scripts/Overlay_tf.py b/Simulation/Overlay/OverlayConfiguration/scripts/Overlay_tf.py index 6723fc838a0..73db14e41a8 100755 --- a/Simulation/Overlay/OverlayConfiguration/scripts/Overlay_tf.py +++ b/Simulation/Overlay/OverlayConfiguration/scripts/Overlay_tf.py @@ -19,7 +19,7 @@ msg.info('logging set in %s', sys.argv[0]) # Prodsys hack... -ListOfDefaultPositionalKeys = ['--AMIConfig', '--AMITag', '--AddCaloDigi', '--CA', '--DBRelease', '--PileUpPremixing', '--argJSON', '--asetup', '--athena', '--athenaMPEventsBeforeFork', '--athenaMPMergeTargetSize', '--athenaMPStrategy', '--athenaMPUseEventOrders', '--athenaopts', '--attempt', '--beamType', '--checkEventCount', '--command', '--conditionsTag', '--digiRndmSvc', '--digiSeedOffset1', '--digiSeedOffset2', '--digiSteeringConf', '--doAllNoise', '--dumpJSON', '--dumpPickle', '--env', '--eventAcceptanceEfficiency', '--eventService', '--execOnly', '--fSampltag', '--fileValidation', '--geometryVersion', '--ignoreErrors', '--ignoreFiles', +ListOfDefaultPositionalKeys = ['--AMIConfig', '--AMITag', '--AddCaloDigi', '--CA', '--DBRelease', '--PileUpPremixing', '--argJSON', '--asetup', '--athena', '--athenaMPEventsBeforeFork', '--athenaMPMergeTargetSize', '--athenaMPStrategy', '--athenaMPUseEventOrders', '--athenaopts', '--attempt', '--beamType', '--checkEventCount', '--command', '--conditionsTag', '--detectors', '--digiRndmSvc', '--digiSeedOffset1', '--digiSeedOffset2', '--digiSteeringConf', '--doAllNoise', '--dumpJSON', '--dumpPickle', '--env', '--eventAcceptanceEfficiency', '--eventService', '--execOnly', '--fSampltag', '--fileValidation', '--geometryVersion', '--ignoreErrors', '--ignoreFiles', '--ignorePatterns', '--imf', '--inputBS_SKIMFile', '--inputFileValidation', '--inputHITSFile', '--inputRDO_BKGFile', '--jobid', '--maxEvents', '--multiprocess', '--multithreaded', '--outputFileValidation', '--outputRDOFile', '--outputRDO_FILTFile', '--outputRDO_SGNLFile', '--parallelFileValidation', '--postExec', '--postInclude', '--preExec', '--preInclude', '--reportName', '--reportType', '--runNumber', '--samplingFractionDbTag', '--sharedWriter', '--showGraph', '--showPath', '--showSteps', '--skipEvents', '--steering', '--taskid', '--tcmalloc', '--triggerConfig', '--valgrind', '--valgrindDefaultOpts', '--valgrindExtraOpts'] diff --git a/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py b/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py index 39a6f8798a1..63e701386fd 100644 --- a/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py +++ b/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py @@ -46,8 +46,11 @@ if not hasRDO_BKGInput and not hasBS_SKIMInput: # Set overlay specifics globalflags.isOverlay.set_Value_and_Lock(True) +# Force MT mode +overlayFlags.isOverlayMT.set_Value_and_Lock(True) if hasRDO_BKGInput: logOverlay.info('Running MC+MC overlay') + overlayFlags.isDataOverlay.set_Value_and_Lock(False) globalflags.DataSource.set_Value_and_Lock('geant4') else: logOverlay.info('Running MC+data overlay') @@ -59,10 +62,6 @@ else: from AthenaCommon.BeamFlags import jobproperties jobproperties.Beam.beamType.set_Value_and_Lock('collisions') -overlayFlags.isDataOverlay.set_Value_and_Lock(False) -# TODO: temporarily force MT -overlayFlags.isOverlayMT.set_Value_and_Lock(True) - # Common athena flags if hasattr(overlayArgs, 'skipEvents'): athenaCommonFlags.SkipEvents.set_Value_and_Lock(overlayArgs.skipEvents) @@ -95,6 +94,10 @@ if hasattr(overlayArgs, 'geometryVersion'): globalflags.DetDescrVersion.set_Value_and_Lock(overlayArgs.geometryVersion) if hasattr(overlayArgs, 'conditionsTag'): globalflags.ConditionsTag.set_Value_and_Lock(overlayArgs.conditionsTag) +if hasattr(overlayArgs, 'detectors'): + overlayDetectors = overlayArgs.detectors +else: + overlayDetectors = None # Digitization flags if hasattr(overlayArgs, 'digiSeedOffset1'): @@ -132,17 +135,13 @@ if 'DetFlags' in dir(): logOverlay.warning( 'DetFlags already defined! This means DetFlags should have been fully configured already..') else: - from AthenaCommon.DetFlags import DetFlags - DetFlags.all_setOn() - DetFlags.bpipe_setOff() - DetFlags.FTK_setOff() + from OverlayConfiguration.OverlayHelpersLegacy import setupOverlayLegacyDetectorFlags + DetFlags = setupOverlayLegacyDetectorFlags(overlayDetectors) - if hasattr(overlayArgs, 'triggerConfig') and overlayArgs.triggerConfig == 'NONE': - DetFlags.LVL1_setOff() - else: - DetFlags.LVL1_setOn() +if hasattr(overlayArgs, 'triggerConfig') and overlayArgs.triggerConfig == 'NONE': + DetFlags.LVL1_setOff() - DetFlags.digitize.LVL1_setOff() +DetFlags.digitize.LVL1_setOff() from AtlasGeoModel.MuonGMJobProperties import MuonGeometryFlags if not MuonGeometryFlags.hasCSC(): diff --git a/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py b/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py index a238ed6196a..e166ed0bed1 100755 --- a/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py +++ b/Simulation/Overlay/OverlayConfiguration/test/OverlayTest.py @@ -10,9 +10,10 @@ import sys from AthenaCommon.Configurable import Configurable from AthenaConfiguration.AllConfigFlags import ConfigFlags +from OverlayConfiguration.OverlayHelpers import OverlayMessageSvcCfg from OverlayConfiguration.OverlaySteering import OverlayMainCfg from OverlayConfiguration.OverlayTestHelpers import \ - CommonTestArgumentParser, JobOptsDumperCfg, TestMessageSvcCfg, \ + CommonTestArgumentParser, JobOptsDumperCfg, \ defaultTestFlags, postprocessAndLockFlags, printAndRun # Set up logging and new style config @@ -49,7 +50,7 @@ if args.profile: from PerfMonVTune.PerfMonVTuneConfig import VTuneProfilerServiceCfg acc.merge(VTuneProfilerServiceCfg(ConfigFlags)) acc.merge(JobOptsDumperCfg(ConfigFlags)) -acc.merge(TestMessageSvcCfg(ConfigFlags)) +acc.merge(OverlayMessageSvcCfg(ConfigFlags)) # dump pickle with open("ConfigOverlay.pkl", "wb") as f: -- GitLab