diff --git a/Control/AthenaConfiguration/python/AthConfigFlags.py b/Control/AthenaConfiguration/python/AthConfigFlags.py index a8cbed4b6d1e9b757da66d546541d01918529dc9..064cb5301a14adae47d1b77815ccb7cd62321bf3 100644 --- a/Control/AthenaConfiguration/python/AthConfigFlags.py +++ b/Control/AthenaConfiguration/python/AthConfigFlags.py @@ -71,6 +71,7 @@ class FlagAddress(object): def __nonzero__(self): raise RuntimeError( "No such flag: "+ self._name+". The name is likely incomplete." ) + def __bool__(self): raise RuntimeError( "No such flag: "+ self._name+". The name is likely incomplete." ) @@ -96,7 +97,7 @@ class AthConfigFlags(object): raise RuntimeError("Attempt to add a flag to an already-locked container") if name in self._flagdict: - raise KeyError("Duplicated flag name: %s" % name) + raise KeyError("Duplicated flag name: {}".format( name )) self._flagdict[name]=CfgFlag(setDef) return @@ -110,7 +111,7 @@ class AthConfigFlags(object): def _loadDynaFlags(self, name): flagBaseName = name.split('.')[0] if flagBaseName in self._dynaflags: - self._msg.debug("dynamically loading the flag %s", flagBaseName) + self._msg.debug("dynamically loading the flag {}".format( flagBaseName) ) isLocked = self._locked self._locked = False self.join( self._dynaflags[flagBaseName]() ) @@ -125,6 +126,7 @@ class AthConfigFlags(object): def hasFlag(self, name): if name in self._flagdict: return True + self._msg.debug("Flag not loaded yet {}".format( name ) ) self._loadDynaFlags( name.split('.')[0] ) return name in self._flagdict @@ -136,11 +138,11 @@ class AthConfigFlags(object): if name in self._flagdict: self._flagdict[name].set(value) return - errString="No flag with name \'%s\' found" % name + errString="No flag with name \'{}\' found".format( name ) from difflib import get_close_matches closestMatch=get_close_matches(name,self._flagdict.keys(),1) if len(closestMatch)>0: - errString+=". Did you mean \'%s\'?" % closestMatch[0] + errString+=". Did you mean \'{}\'?".format( closestMatch[0] ) raise KeyError(errString) def _get(self,name): @@ -148,11 +150,11 @@ class AthConfigFlags(object): if name in self._flagdict: return self._flagdict[name].get(self) - errString="No flag with name \'%s\' found" % name + errString="No flag with name \'{}\' found".format( name ) from difflib import get_close_matches closestMatch=get_close_matches(name,self._flagdict.keys(),1) if len(closestMatch)>0: - errString+=". Did you mean \'%s\'?" % closestMatch[0] + errString+=". Did you mean \'{}\'?".format( closestMatch[0] ) raise KeyError(errString) def __call__(self,name): @@ -174,7 +176,11 @@ class AthConfigFlags(object): def cloneAndReplace(self,subsetToReplace,replacementSubset): #This is to replace subsets of configuration flags like #egamamaFlags.GSF by egamma.TrigGSFFlavor1 + self.dump() + self._msg.info("cloning flags and replacing {} by {}".format( subsetToReplace, replacementSubset ) ) + self._loadDynaFlags( subsetToReplace ) + if not subsetToReplace.endswith("."): subsetToReplace+="." pass @@ -185,7 +191,7 @@ class AthConfigFlags(object): #Sanity check: Don't replace a by a if (subsetToReplace == replacementSubset): raise RuntimeError("Called cloneAndReplace with identical strings") - + replacedNames=set() replacementNames=set() newFlagDict=dict() @@ -214,40 +220,41 @@ class AthConfigFlags(object): self._msg.error(replacementNames) raise RuntimeError("Attempt to replace incompatible subsets: None matching flag names are " + repr(replacedNames ^ replacementNames )) + newFlags = AthConfigFlags(newFlagDict) + newFlags._dynaflags = deepcopy(self._dynaflags) + newFlags.dump() + return newFlags - return AthConfigFlags(newFlagDict) - - def join(self,other, prefix=''): + def join(self, other, prefix=''): if (self._locked): raise RuntimeError("Attempt to join with and already-locked container") for (name,flag) in six.iteritems(other._flagdict): fullName = prefix+"."+name if prefix != "" else name if fullName in self._flagdict: - raise KeyError("Duplicated flag name: %s" % fullName) + raise KeyError("Duplicated flag name: {}".format( fullName ) ) self._flagdict[fullName]=flag for (name,loader) in six.iteritems(other._dynaflags): if prefix+"."+name in self._dynaflags: - raise KeyError("Duplicated dynamic flags name: %s" % name) + raise KeyError("Duplicated dynamic flags name: {}".format( name ) ) self.join( loader(), name ) return def dump(self): - print("%-40.40s : %s" % ("Flag Name","Value")) + print("{:40} : {}".format( "Flag Name","Value" ) ) for name in sorted(self._flagdict): - print("%-40.40s : %s" % (name,repr(self._flagdict[name]))) + print("{:40} : {}".format( name, repr(self._flagdict[name] ) ) ) if len(self._dynaflags) == 0: return print("Flag categories that can be loaded dynamically") - print("%-25.25s : %30s : %s" % ("Category","Generator name", "Defined in" )) + print("{:25} : {:>30} : {}".format( "Category","Generator name", "Defined in" ) ) for name,gen in sorted(six.iteritems(self._dynaflags)): - print("%-25.25s : %30s : %s" % - (name, gen.__name__, '/'.join(six.get_function_code(gen).co_filename.split('/')[-2:]))) + print("{:25} : {:>30} : {}".format( name, gen.__name__, '/'.join(six.get_function_code(gen).co_filename.split('/')[-2:]) ) ) def initAll(self): #Mostly a self-test method @@ -270,22 +277,22 @@ class AthConfigFlags(object): #Safety check on arg: Contains exactly one '=' and left side is a valid flag argsplit=arg.split("=") if len(argsplit)!=2: - raise ValueError("Can't interpret argument %s, expected a key=value format" % arg) + raise ValueError("Can't interpret argument {}, expected a key=value format".format( arg ) ) key=argsplit[0].strip() if not self.hasFlag(key): - raise KeyError("%s is not a known configuration flag" % key) + raise KeyError("{} is not a known configuration flag".format( key ) ) value=argsplit[1].strip() try: - exec("type(%s)" % value) + exec("type({})".format( value ) ) except NameError: #Can't determine type, assume we got an un-quoted string - value="\"%s\"" % value + value="\"{}\"".format( value ) #Arg looks good enough, just exec it: - argToExec="self.%s=%s" % (key,value) + argToExec="self.{}={}".format( key, value ) exec(argToExec) pass @@ -346,8 +353,14 @@ class TestFlagsSetupDynamic(TestFlagsSetup): nf.addFlagsCategory( 'Z.clone', theXFlags ) return nf + def theTFlags(): + nf = AthConfigFlags() + nf.addFlag("T.Abool", False) + return nf + self.flags.addFlagsCategory( 'Z', theZFlags ) self.flags.addFlagsCategory( 'X', theXFlags ) + self.flags.addFlagsCategory( 'T', theTFlags ) self.flags.dump() print("") @@ -387,6 +400,7 @@ class TestOverwriteFlags(TestFlagsSetupDynamic): self.flags.X.a = 30 copyf = self.flags.cloneAndReplace( "X", "Z.clone.X") self.assertEqual( copyf.X.a, 20, "dynamically loaded flags have wrong value") + self.assertEqual( copyf.T.Abool, False, "The flags clone does not have dynamic flags") copyf.dump() print("") diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref index cfb1be07dd84db0137e4be568a38e8d804956393..8f4741bfb95f09e535660ebdb409f7c0b07e1498 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref @@ -1,5 +1,3 @@ -Storing config in the config newJOtest.pkl -Py:Athena INFO now loading newJOtest.pkl ... TrigSignatureMo... INFO Chains passing step (1st row events & 2nd row decision counts): TrigSignatureMo... INFO ChainName L1 AfterPS Step1 Step2 Output TrigSignatureMo... INFO All 20 20 - - 0 diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py index 2e9e6771eaba0b2391fb0e7808777d6090ed35a6..66f117dbd6ae04e49ce0cf5e3bccaf18ee6660ec 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py @@ -68,7 +68,7 @@ from TrigInDetConfig.InDetConfig import TrigInDetCondConfig acc.merge( TrigInDetCondConfig( flags ) ) acc.getEventAlgo( "TrigSignatureMoniMT" ).OutputLevel=DEBUG -print acc.getEventAlgo( "TrigSignatureMoniMT" ) + from AthenaCommon.Logging import logging @@ -85,7 +85,7 @@ acc.foreach_component("*HLTTop/*GenericMonitoringTool*").OutputLevel = WARNING # acc.printConfig() fname = "newJOtest.pkl" -print "Storing config in the config", fname +print( "Storing config in the file {}".format( fname ) ) with open(fname, "wb") as p: acc.store( p, nEvents=20, useBootStrapFile=False, threaded=True ) p.close() diff --git a/Trigger/TrigValidation/TrigUpgradeTest/test/test_trigUpgr_newJO_build.sh b/Trigger/TrigValidation/TrigUpgradeTest/test/test_trigUpgr_newJO_build.sh index 8310770fbd86f629dbe995a13e6d647d32732bf4..ead4e5afb8df7ed3520961e5dee76a43160ddbf5 100755 --- a/Trigger/TrigValidation/TrigUpgradeTest/test/test_trigUpgr_newJO_build.sh +++ b/Trigger/TrigValidation/TrigUpgradeTest/test/test_trigUpgr_newJO_build.sh @@ -10,7 +10,7 @@ export THREADS=1 export SLOTS=1 export JOBOPTION="newJOtest.pkl" export FROMPICKLE=1 -export REGTESTEXP=".*ERROR (?\!attempt to add a duplicate).*|.*FATAL.*|.*newJOtest.pkl.*|TrigSignatureMo.*INFO.*" +export REGTESTEXP=".*ERROR (?\!attempt to add a duplicate).*|.*FATAL.*|TrigSignatureMo.*INFO.*" # Find the regtest reference installed with the release export REGTESTREF=`find_data.py TrigUpgradeTest/newJO_build.ref`