diff --git a/Control/AthenaConfiguration/python/AthConfigFlags.py b/Control/AthenaConfiguration/python/AthConfigFlags.py index 2deb44627d12c4c98c812f4cca380c1f89c57712..f84d6c574b204da29b283bae952a38b21e26673c 100644 --- a/Control/AthenaConfiguration/python/AthConfigFlags.py +++ b/Control/AthenaConfiguration/python/AthConfigFlags.py @@ -82,6 +82,7 @@ class FlagAddress(object): if self._flags.hasFlag( merged ): return self._flags._get( merged ) + raise RuntimeError( "No such flag: {} The name is likely incomplete.".format(merged) ) def __setattr__( self, name, value ): @@ -203,6 +204,9 @@ class AthConfigFlags(object): for f in self._flagdict.keys(): if f.startswith(path): return True + for c in self._dynaflags.keys(): + if c.startswith(path): + return True return False def hasFlag(self, name): @@ -291,12 +295,12 @@ class AthConfigFlags(object): #End loop over flags pass - #Last sanity check: Make sure that teh replaced section still contains teh same names: - if (replacedNames!=replacementNames): + #Last sanity check: Make sure that the replaced section still contains the same names: + if not replacementNames.issuperset(replacedNames): _msg.error(replacedNames) _msg.error(replacementNames) - raise RuntimeError("Attempt to replace incompatible subsets: None matching flag names are " - + repr(replacedNames ^ replacementNames )) + raise RuntimeError("Attempt to replace incompatible flags subsets: distinct flag are " + + repr(replacementNames - replacedNames)) newFlags = AthConfigFlags(newFlagDict) newFlags._dynaflags = deepcopy(self._dynaflags) return newFlags @@ -318,24 +322,28 @@ class AthConfigFlags(object): self._flagdict[fullName]=flag for (name,loader) in other._dynaflags.items(): - if prefix+"."+name in self._dynaflags: - raise KeyError("Duplicated dynamic flags name: {}".format( name ) ) - self._dynaflags.update(other._dynaflags) - #self.join( loader(), name ) - + fullName = prefix+"."+name if prefix != "" else name + if fullName in self._dynaflags: + raise KeyError("Duplicated dynamic flags name: {}".format( fullName ) ) + _msg.debug("Joining dynamic flags with %s", fullName) + self._dynaflags[fullName] = loader return - def dump(self): + def dump(self, pattern=".*"): + import re + compiled = re.compile(pattern) print("{:40} : {}".format( "Flag Name","Value" ) ) for name in sorted(self._flagdict): - print("{:40} : {}".format( name, repr(self._flagdict[name] ) ) ) + if compiled.match(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} : {:>30} : {}".format( "Category","Generator name", "Defined in" ) ) for name,gen_and_prefix in sorted(self._dynaflags.items()): - print("{:25} : {:>30} : {}".format( name, gen_and_prefix[0].__name__, '/'.join(gen_and_prefix[0].__code__.co_filename.split('/')[-2:]) ) ) + if compiled.match(name): + print("{:25} : {:>30} : {}".format( name, gen_and_prefix[0].__name__, '/'.join(gen_and_prefix[0].__code__.co_filename.split('/')[-2:]) ) ) def initAll(self): diff --git a/Trigger/TrigTools/TrigInDetConfig/CMakeLists.txt b/Trigger/TrigTools/TrigInDetConfig/CMakeLists.txt index eb0acbd46a1185ad7607d44f8d85e88fb5d9da5b..cd14d84535dab0e98c07942810e7b68dc919717e 100644 --- a/Trigger/TrigTools/TrigInDetConfig/CMakeLists.txt +++ b/Trigger/TrigTools/TrigInDetConfig/CMakeLists.txt @@ -9,3 +9,4 @@ atlas_subdir( TrigInDetConfig ) atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} ) atlas_add_test( TrigInDetCfg SCRIPT python -m TrigInDetConfig.TrigInDetConfig POST_EXEC_SCRIPT nopost.sh ) +atlas_add_test( TrigTrackingCutFlags SCRIPT python -m TrigInDetConfig.TrigTrackingCutFlags POST_EXEC_SCRIPT nopost.sh ) diff --git a/Trigger/TrigTools/TrigInDetConfig/python/TrigInDetConfig.py b/Trigger/TrigTools/TrigInDetConfig/python/TrigInDetConfig.py index b8bb91cab32874b3fb033f4df73952eff8c14548..9099aac72f957488fae1c25d2a8b21b9606ae71f 100644 --- a/Trigger/TrigTools/TrigInDetConfig/python/TrigInDetConfig.py +++ b/Trigger/TrigTools/TrigInDetConfig/python/TrigInDetConfig.py @@ -24,7 +24,7 @@ def SiDetElementsRoadMaker_xkCfg( flags, **kwargs ): PropagatorTool = acc.getPublicTool( "InDetTrigPatternPropagator" ), usePixel = flags.Detector.RecoPixel, # DetFlags.haveRIO.pixel_on(), useSCT = flags.Detector.RecoSCT, #DetFlags.haveRIO.SCT_on(), - RoadWidth = 10, #InDetTrigCutValues.RoadWidth() + RoadWidth = flags.InDet.Tracking.roadWidth, ) acc.addPublicTool( tool ) return acc @@ -114,7 +114,6 @@ def SiTrackMaker_xkCfg(flags, **kwargs): """ based on: InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigConfigRecNewTracking.py , should be moved elsewhere """ - import AthenaCommon.SystemOfUnits as Unit name = kwargs.pop("name", "SiTrackMaker_xk") acc = ComponentAccumulator() acc.merge( SiDetElementsRoadMaker_xkCfg( flags, **kwargs ) ) @@ -131,16 +130,16 @@ def SiTrackMaker_xkCfg(flags, **kwargs): tool = CompFactory.InDet.SiTrackMaker_xk( name, RoadTool = acc.getPublicTool( "InDetTrigSiDetElementsRoadMaker" ), CombinatorialTrackFinder = combTrackFinderTool, - pTmin = 1000*Unit.MeV, # TODO use flag for these props - nClustersMin = 7, - nHolesMax = 3, - nHolesGapMax = 3, - SeedsFilterLevel = 0, - Xi2max = 15, - Xi2maxNoAdd = 35, - nWeightedClustersMin = 6, + pTmin = flags.InDet.Tracking.minPT, + nClustersMin = flags.InDet.Tracking.minClusters, + nHolesMax = flags.InDet.Tracking.nHolesMax, + nHolesGapMax = flags.InDet.Tracking.nHolesGapMax, + SeedsFilterLevel = flags.InDet.Tracking.seedFilterLevel, + Xi2max = flags.InDet.Tracking.Xi2max, + Xi2maxNoAdd = flags.InDet.Tracking.Xi2maxNoAdd, + nWeightedClustersMin = flags.InDet.Tracking.nWeightedClustersMin, #CosmicTrack = InDetFlags.doCosmics(), - Xi2maxMultiTracks = 15, + Xi2maxMultiTracks = flags.InDet.Tracking.Xi2max, # follwoing: Trigger/TrigTools/TrigInDetConfig/python/EFIDTracking.py UseAssociationTool = False ) acc.addPublicTool( tool ) return acc @@ -208,7 +207,7 @@ def InDetTrackSummaryHelperToolCfg(flags, **kwargs): TRTStrawSummarySvc = trtStrawSummaryTool, usePixel = flags.Detector.RecoPixel, #DetFlags.haveRIO.pixel_on(), useSCT = flags.Detector.RecoSCT, #DetFlags.haveRIO.SCT_on(), - useTRT = True, # flags.Detector.TRTOn, #DetFlags.haveRIO.TRT_on() + useTRT = flags.Detector.RecoTRT, # flags.Detector.TRTOn, #DetFlags.haveRIO.TRT_on() ) acc.addPublicTool( tool ) @@ -433,6 +432,7 @@ def TrigInDetCondCfg( flags ): return acc def TrigInDetConfig( flags, roisKey="EMRoIs", signatureName='' ): + #If signature specified add suffix to the name of each algorithms signature = "_" + signatureName if signatureName else '' @@ -622,7 +622,7 @@ def TrigInDetConfig( flags, roisKey="EMRoIs", signatureName='' ): acc.addCondAlgo( CompFactory.InDet.SiElementPropertiesTableCondAlg(name = "InDetSiElementPropertiesTableCondAlg") ) InDet__SiTrackerSpacePointFinder=CompFactory.InDet.SiTrackerSpacePointFinder - InDetSiTrackerSpacePointFinder = InDet__SiTrackerSpacePointFinder(name = "TrigSPFinder"+ signature, + InDetSiTrackerSpacePointFinder = InDet__SiTrackerSpacePointFinder(name = "InDetSiTrackerSpacePointFinder_"+ signature, SiSpacePointMakerTool = InDetSiSpacePointMakerTool, PixelsClustersName = "PixelTrigClusters", SCT_ClustersName = "SCT_TrigClusters", @@ -672,7 +672,7 @@ def TrigInDetConfig( flags, roisKey="EMRoIs", signatureName='' ): ReadKey = "PixelDetectorElementCollection", WriteKey = "PixelDetElementBoundaryLinks_xk") ) - ftf = CompFactory.TrigFastTrackFinder( name = "FTF" + signature, + ftf = CompFactory.TrigFastTrackFinder( name = "TrigFastTrackFinder_" + signature, LayerNumberTool = acc.getPublicTool( "TrigL2LayerNumberTool_FTF" ), SpacePointProviderTool = acc.getPublicTool( "TrigSPConversionTool" + signature.lower() ), TrackSummaryTool = acc.getPublicTool( "TrigSummaryTool_FTF" ), @@ -682,51 +682,47 @@ def TrigInDetConfig( flags, roisKey="EMRoIs", signatureName='' ): RoIs = roisKey, trigZFinder = CompFactory.TrigZFinder(), doZFinder = False, # this and all below, copied over from comparison with running JOs, TODO find a proper surce of this settings - SeedRadBinWidth = 2, - TrackInitialD0Max = 20.0, + SeedRadBinWidth = flags.InDet.Tracking.seedRadBinWidth, + TrackInitialD0Max = 1000. if flags.InDet.Tracking.extension == 'cosmics' else 20.0, TracksName = "TrigFastTrackFinder_Tracks"+signature, OutputCollectionSuffix = signature, TripletDoPSS = False, - Triplet_D0Max = 4.0, - Triplet_D0_PPS_Max = 1.7, + Triplet_D0Max = flags.InDet.Tracking.d0SeedMax, + Triplet_D0_PPS_Max = flags.InDet.Tracking.d0SeedPPSMax, Triplet_MaxBufferLength = 3, Triplet_MinPtFrac = 1, Triplet_nMaxPhiSlice = 53, - doCloneRemoval = True, - doResMon = False, - doSeedRedundancyCheck = True, - pTmin = 1000.0, + doCloneRemoval = flags.InDet.Tracking.doCloneRemoval, + doResMon = flags.InDet.Tracking.doResMon, + doSeedRedundancyCheck = flags.InDet.Tracking.checkRedundantSeeds, + pTmin = flags.InDet.Tracking.minPT, useNewLayerNumberScheme = True, - MinHits = 5 - ) - #ftf.RoIs = roisKey - ftf.OutputLevel=DEBUG + MinHits = 5) acc.addEventAlgo( ftf ) - #CondSvc=CompFactory.CondSvc - #acc.addService(CondSvc()) - - - #from TrigInDetConf.TrigInDetRecCommonTools import InDetTrigFastTrackSummaryTool - #from TrigInDetConf.TrigInDetPostTools import InDetTrigParticleCreatorToolFTF - - #InDet__TrigTrackingxAODCnvMT=CompFactory.InDet.TrigTrackingxAODCnvMT - #theTrackParticleCreatorAlg = InDet__TrigTrackingxAODCnvMT(name = "InDetTrigTrackParticleCreatorAlg", - # doIBLresidual = False, - # TrackName = "TrigFastTrackFinder_Tracks", - # TrackParticlesName = "IDTrack", - # ParticleCreatorTool = InDetTrigParticleCreatorToolFTF) - #theTrackParticleCreatorAlg.roiCollectionName = roisKey - #acc.addEventAlgo(theTrackParticleCreatorAlg) - + creatorTool = CompFactory.Trk.TrackParticleCreatorTool( name = "InDetTrigParticleCreatorToolFTF", + Extrapolator = acc.getPublicTool( "TrigInDetExtrapolator" ), + TrackSummaryTool = acc.getPublicTool( "TrigSummaryTool_FTF" ), + KeepParameters = True, + ComputeAdditionalInfo = True) + acc.addPublicTool(creatorTool) + trackParticleCnv=CompFactory.InDet.TrigTrackingxAODCnvMT(name = "InDetTrigTrackParticleCreatorAlg" + signature, + TrackName = ftf.TracksName, + TrackParticlesName = "TrigFastTrackFinder_Tracks_" + signature, + ParticleCreatorTool = acc.getPublicTool("InDetTrigParticleCreatorToolFTF")) + acc.addEventAlgo(trackParticleCnv) return acc -def indetInViewRecoCfg( flags, viewMakerName, signature='' ): +def indetInViewRecoCfg( inflags, viewMakerName, signature='' ): """ TBD if this function should be defined here or moved to the menu are, for sake of symmetry it is kept here now There would certainly be additional algorithms """ + # redirect InDet.Tracking flags to point to a specific trigger setting + flags = inflags.cloneAndReplace("InDet.Tracking", "Trigger.InDetTracking."+signature) + + from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import InViewReco reco = InViewReco( viewMakerName ) algAcc = TrigInDetConfig( flags, roisKey=reco.inputMaker().InViewRoIs, signatureName=signature ) @@ -761,7 +757,7 @@ if __name__ == "__main__": from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg acc.merge(ByteStreamReadCfg(ConfigFlags)) - acc.merge( TrigInDetConfig( ConfigFlags ) ) + acc.merge( indetInViewRecoCfg( ConfigFlags, viewMakerName="IMTest", signature="Electron" ) ) from RegionSelector.RegSelConfig import regSelCfg rsc = regSelCfg( ConfigFlags ) acc.merge( rsc ) diff --git a/Trigger/TrigTools/TrigInDetConfig/python/TrigTrackingCutFlags.py b/Trigger/TrigTools/TrigInDetConfig/python/TrigTrackingCutFlags.py new file mode 100644 index 0000000000000000000000000000000000000000..6c9e24bbad58e1d8b58f039a740cc57160502a21 --- /dev/null +++ b/Trigger/TrigTools/TrigInDetConfig/python/TrigTrackingCutFlags.py @@ -0,0 +1,39 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +import AthenaCommon.SystemOfUnits as Units +from AthenaConfiguration.AthConfigFlags import AthConfigFlags +from InDetConfig.TrackingCutsFlags import createTrackingFlags + + +def __sliceFlags(): + flags = createTrackingFlags() + flags.addFlag("seedRadBinWidth", 2) + flags.addFlag("d0SeedMax", 4.0) + flags.addFlag("d0SeedPPSMax", 1.7) + flags.addFlag("doCloneRemoval", True) + flags.addFlag("doResMon", False) + flags.addFlag("checkRedundantSeeds", False) + return flags + +def __electronFlags(): + flags = __sliceFlags() + flags.minPT = Units.GeV * 0.5 # TODO revise values + flags.checkRedundantSeeds=True + return flags + +def createTrigTrackingFlags(): + flags = AthConfigFlags() + flags.addFlagsCategory('Trigger.InDetTracking.Electron', __electronFlags, prefix=True) + return flags + +if __name__ == "__main__": + from AthenaCommon.Logging import logging + _msg = logging.getLogger('AthConfigFlags') + _msg.setLevel(2) + from AthenaConfiguration.AllConfigFlags import ConfigFlags as flags + flags.Trigger.doID + flags.dump(".*Trig") + + flags.Trigger.InDetTracking.Electron.minPT = 2.0 * Units.GeV + newflags = flags.cloneAndReplace('InDet.Tracking', 'Trigger.InDetTracking.Electron') + assert newflags.InDet.Tracking.minPT == 2.0 * Units.GeV + flags.dump() \ No newline at end of file diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py index a44e40225d6898f8f95da5c7e149b17572aa5d9b..20b243769ba91f9e613c0a16f74f0d592d7db22a 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py @@ -275,6 +275,8 @@ def createTriggerFlags(): return createMuonConfigFlags() flags.addFlagsCategory('Trigger.Offline', __muon, prefix=True) + from TrigInDetConfig.TrigTrackingCutFlags import createTrigTrackingFlags + flags.addFlagsCategory( 'Trigger.InDetTracking', createTrigTrackingFlags ) from TriggerJobOpts.MenuConfigFlags import createMenuFlags flags.join( createMenuFlags() )