diff --git a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py index 7f7ba9fc88693cc729039ca3cfca5abaa8f7c03d..604fe60492f9fd06b882ea0a157d162d7d0f4f7d 100644 --- a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py +++ b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py @@ -231,9 +231,15 @@ def getTopoCalibMoments(configFlags): ,"TileCalibHitDeadMaterial"] return TopoCalibMoments -def CaloTopoClusterCfg(configFlags): +# Steering options for trigger +# Maybe offline reco options should be extracted from flags elsewhere +def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib=None,sequenceName='AthAlgSeq'): result=ComponentAccumulator() - + from AthenaCommon.AlgSequence import AthSequencer + result.addSequence(AthSequencer(sequenceName)) + + if not clustersname: clustersname = "CaloTopoClusters" + from LArGeoAlgsNV.LArGMConfig import LArGMCfg from TileGeoModel.TileGMConfig import TileGMCfg from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg @@ -259,12 +265,12 @@ def CaloTopoClusterCfg(configFlags): from TileConditions.TileConditionsConfig import tileCondCfg result.merge(tileCondCfg(configFlags)) - theCaloClusterSnapshot=CaloClusterSnapshot(OutputName="CaloTopoClusters",SetCrossLinks=True) + theCaloClusterSnapshot=CaloClusterSnapshot(OutputName=clustersname,SetCrossLinks=True) # maker tools TopoMaker = CaloTopoClusterMaker("TopoMaker") - TopoMaker.CellsName = "AllCalo" + TopoMaker.CellsName = cellsname TopoMaker.CalorimeterNames=["LAREM", "LARHEC", "LARFCAL", @@ -325,8 +331,8 @@ def CaloTopoClusterCfg(configFlags): # EnergyCut = 500*MeV, - CaloTopoCluster=CaloClusterMaker("CaloTopoCluster") - CaloTopoCluster.ClustersOutputName="CaloTopoCluster" + CaloTopoCluster=CaloClusterMaker(clustersname) + CaloTopoCluster.ClustersOutputName=clustersname CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter] @@ -336,16 +342,18 @@ def CaloTopoClusterCfg(configFlags): CaloTopoCluster.ClusterCorrectionTools += [getTopoMoments(configFlags)] - CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot] - - if configFlags.Calo.TopoCluster.doTopoClusterLocalCalib: - CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters" + if doLCCalib==None: + doLCCalib = configFlags.Calo.TopoCluster.doTopoClusterLocalCalib + if doLCCalib: + CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot] + if not clustersname: + CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters" CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(configFlags) # Needed? from CaloRec import CaloClusterTopoCoolFolder - result.addEventAlgo(CaloTopoCluster,primary=True) + result.addEventAlgo(CaloTopoCluster,primary=True,sequenceName=sequenceName) return result diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py index 5bf80a583f74bf153dfddf58ed5781b8f57b6772..889f8a4906f3559edbff8c585d9576df2292de16 100644 --- a/Control/AthenaConfiguration/python/AllConfigFlags.py +++ b/Control/AthenaConfiguration/python/AllConfigFlags.py @@ -28,7 +28,7 @@ def _createCfgFlags(): acf.addFlag('Input.ProjectName', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("Project","data17_13TeV") ) # former global.ProjectName def _inputCollections(inputFile): - rawCollections = GetFileMD(inputFile).get("SGKeys").split() + rawCollections = GetFileMD(inputFile).get("SGKeys","").split() collections = filter(lambda col: not col.endswith('Aux.'), rawCollections) return collections diff --git a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py index 8b0298b4e607570e8fd9ca7193c00130d7a758ce..e09712c13456da17f34e7d43ed6d290a407225f8 100644 --- a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py +++ b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py @@ -10,6 +10,8 @@ def LArGMCfg(configFlags): from LArGeoAlgsNV.LArGeoAlgsNVConf import LArDetectorToolNV result.getPrimary().DetectorTools += [ LArDetectorToolNV(ApplyAlignments=doAlignment) ] + if not configFlags.Detector.SimulateCalo: + result.getPrimary().DetectorTools["LArDetectorToolNV"].GeometryConfig = "RECO" if doAlignment: if configFlags.Input.isMC: diff --git a/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py b/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py index 6e8660d39bd6a4fde19517f7d70cbd8fb1c7aa37..d0756da2af0356c1e9d02099f5496786dc28eb61 100644 --- a/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py +++ b/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py @@ -148,10 +148,11 @@ def getJetCalibToolPrereqs(modspec,jetdef): prereqs.append("mod:ConstitFourMom") if "JetArea" in calibseq: prereqs.append("input:EventDensity") - prereqs += ["mod:CaloEnergies"] if "GSC" in calibseq: - prereqs += ["mod:TrackMoments", - "ghost:MuonSegment"] + prereqs += ["mod:CaloEnergies"] + if calibcontext != "TrigRun2": # No track/MS GSC for trigger w/o FTK + prereqs += ["mod:TrackMoments", + "ghost:MuonSegment"] jetcaliblog.debug("Prereqs for calibseq '{0}': {1}".format(calibseq,str(prereqs))) return prereqs diff --git a/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py b/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py index 769ccca1c49cb1d781a4f3ce8457044386e7b46c..50b09e6a6df3cc416fba8160fce01cbc5872c33e 100644 --- a/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py +++ b/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py @@ -232,18 +232,17 @@ def JetInputCfg(inputdeps, configFlags, sequenceName): jetlog.info("Setting up jet inputs.") components = ComponentAccumulator(sequenceName) - jetlog.info("Inspecting first input file") + jetlog.info("Inspecting input file contents") # Get the list of SG keys for the first input file # I consider it silly to run on a set of mixed file types firstinput = configFlags.Input.Files[0] import os, pickle - from AthenaConfiguration.AutoConfigFlags import GetFileMD # PeekFiles returns a dict for each input file - filecontents = GetFileMD([firstinput])["SGKeys"].split(' ') + filecontents = configFlags.Input.Collections constit = inputdeps[0] # Truth and track particle inputs are handled later - if constit.basetype not in [xAODType.TruthParticle, xAODType.TrackParticle]: + if constit.basetype not in [xAODType.TruthParticle, xAODType.TrackParticle] and constit.inputname!=constit.rawname: # Protection against reproduction of existing containers if constit.inputname in filecontents: jetlog.debug("Input container {0} for label {1} already in input file.".format(constit.inputname, constit.label)) diff --git a/TileCalorimeter/TileGeoModel/python/TileGMConfig.py b/TileCalorimeter/TileGeoModel/python/TileGMConfig.py index 09abf446a680245206c2dc2f2c28f4dda21ab5ee..12ba7101236eb06ee44149ec54cecd82d485d9ec 100644 --- a/TileCalorimeter/TileGeoModel/python/TileGMConfig.py +++ b/TileCalorimeter/TileGeoModel/python/TileGMConfig.py @@ -8,6 +8,8 @@ def TileGMCfg(configFlags): from TileGeoModel.TileGeoModelConf import TileDetectorTool result.getPrimary().DetectorTools += [ TileDetectorTool() ] + if not configFlags.Detector.SimulateCalo: + result.getPrimary().DetectorTools["TileDetectorTool"].GeometryConfig = "RECO" return result diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py index de12451e15ec101bfa36268baa633555052591ea..19779b812eea3c2d363eace6c429790c3a3609c1 100644 --- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py +++ b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py @@ -42,7 +42,6 @@ def trigCaloDataAccessSvcCfg( flags ): from TileGeoModel.TileGMConfig import TileGMCfg acc.merge( TileGMCfg( flags ) ) - acc.getService('GeoModelSvc').DetectorTools['TileDetectorTool'].GeometryConfig = 'RECO' from RegionSelector.RegSelConfig import regSelCfg acc.merge( regSelCfg( flags ) ) diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref index 1e27e6878acfebec8f29f79b19aaacdbaec0b317..d00a03b825ab987d054de691810d67d6973ff1fd 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref @@ -3,6 +3,8 @@ Py:Athena INFO now loading newJOtest.pkl ... TrigSignatureMo... INFO Chains passing step (1st row events & 2nd row decision counts): TrigSignatureMo... INFO Chain name L1, AfterPS, step1 step2 Output TrigSignatureMo... INFO All 10 10 0 0 2 +TrigSignatureMo... INFO HLT_2j35_L1J20 10 10 0 0 0 +TrigSignatureMo... INFO HLT_2j35_L1J20 decisions 0 0 TrigSignatureMo... INFO HLT_e3_etcut_L1EM3 10 10 6 0 0 TrigSignatureMo... INFO HLT_e3_etcut_L1EM3 decisions 15 0 TrigSignatureMo... INFO HLT_e5_etcut_L1EM3 10 10 4 0 0 @@ -13,6 +15,10 @@ TrigSignatureMo... INFO HLT_g10_etcut_L1EM7 10 10 2 TrigSignatureMo... INFO HLT_g10_etcut_L1EM7 decisions 4 4 TrigSignatureMo... INFO HLT_g15_etcut_L1EM12 10 10 2 2 2 TrigSignatureMo... INFO HLT_g15_etcut_L1EM12 decisions 3 3 +TrigSignatureMo... INFO HLT_j45_L1J20 10 10 0 0 0 +TrigSignatureMo... INFO HLT_j45_L1J20 decisions 0 0 +TrigSignatureMo... INFO HLT_j85_L1J20 10 10 0 0 0 +TrigSignatureMo... INFO HLT_j85_L1J20 decisions 0 0 TrigSignatureMo... INFO HLT_mu10_L1MU10 10 10 0 0 0 TrigSignatureMo... INFO HLT_mu10_L1MU10 decisions 0 0 TrigSignatureMo... INFO HLT_mu20_L1MU20 10 10 0 0 0 diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py index d50d4661bdd71d9885aed2ae1207a6c4f406f209..11f83493ccb19216cab9562d540147b596c8bbd3 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py @@ -16,6 +16,7 @@ def createMenuFlags(): flags.addFlag('Trigger.menu.muon', []) flags.addFlag('Trigger.menu.electron', []) flags.addFlag('Trigger.menu.photon', []) + flags.addFlag('Trigger.menu.jet', []) flags.addFlag('Trigger.menu.combined', []) return flags diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Jet/generateJet.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Jet/generateJet.py new file mode 100644 index 0000000000000000000000000000000000000000..13b6ec6e5c2264682990b160b369dcc3c870d92d --- /dev/null +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Jet/generateJet.py @@ -0,0 +1,83 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import MenuSequence, ChainStep, Chain, InEventReco, getChainStepName, createStepView +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + + +def generateChains( flags, chainDict ): + + stepName = getChainStepName('Jet', 1) + stepReco, stepView = createStepView(stepName) + + acc = ComponentAccumulator() + acc.addSequence(stepView) + + # All this should be some common FS cell module? + from TrigT2CaloCommon.TrigCaloDataAccessConfig import trigCaloDataAccessSvcCfg + acc.merge( trigCaloDataAccessSvcCfg(flags) ) + cdaSvc = acc.getService("TrigCaloDataAccessSvc") # should be made primary component + + acc.printConfig() + + from TrigT2CaloCommon.CaloDef import clusterFSInputMaker + inEventReco = InEventReco("JetReco",inputMaker=clusterFSInputMaker()) + + cellsname = "CaloCellsFS" + clustersname = "HLT_CaloTopoClustersFS" + + from TrigCaloRec.TrigCaloRecConfig import HLTCaloCellMaker + cellmaker=HLTCaloCellMaker("HLTCaloCellMaker_FS") + cellmaker.RoIs="FSJETRoI" + cellmaker.TrigDataAccessMT=cdaSvc + cellmaker.CellsName=cellsname + + inEventReco.addRecoAlg(cellmaker) + + from CaloRec.CaloTopoClusterConfig import CaloTopoClusterCfg + inEventReco.mergeReco( CaloTopoClusterCfg(flags,cellsname=cellsname,clustersname=clustersname,doLCCalib=False,sequenceName=inEventReco.recoSeq.name()) ) + + #sequencing of actual jet reconstruction + from JetRecConfig import JetRecConfig + from JetRecConfig.JetDefinition import JetConstit, JetDefinition, xAODType + + #hardcoded jet collection for now + clustermods = ["ECPSFrac","ClusterMoments"] + trigMinPt = 7e3 + TrigEMTopo = JetConstit( xAODType.CaloCluster, ["EM"]) + TrigEMTopo.rawname = clustersname + TrigEMTopo.inputname = clustersname + TrigAntiKt4EMTopoSubJES = JetDefinition( "AntiKt", 0.4, TrigEMTopo, ptmin=trigMinPt,ptminfilter=trigMinPt) + TrigAntiKt4EMTopoSubJES.modifiers = ["Calib:TrigRun2:data:JetArea_EtaJES_GSC_Insitu","Sort"] + clustermods + + #TODO: modify jet constituent configs to override offline configs for trigger calo cluster input. + jetprefix="Trig" + jetsuffix="subjesIS" + jetRecoComps = JetRecConfig.JetRecCfg(TrigAntiKt4EMTopoSubJES, flags, jetprefix, jetsuffix) + inEventReco.mergeReco(jetRecoComps) + + acc.merge(inEventReco,stepReco.getName()) + + #hypo + from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigJetHypoAlgMT + from TrigHLTJetHypo.TrigJetHypoToolConfig import trigJetHypoToolFromDict + hypo = TrigJetHypoAlgMT("TrigJetHypoAlgMT_a4tcem_subjesIS") + jetsfullname = jetprefix+TrigAntiKt4EMTopoSubJES.basename+jetsuffix+"Jets" + hypo.Jets = jetsfullname + acc.addEventAlgo(hypo) + + jetSequence = MenuSequence( Sequence = inEventReco.sequence(), + Maker = inEventReco.inputMaker(), + Hypo = hypo, + HypoToolGen = trigJetHypoToolFromDict, + CA = acc) + + jetStep = ChainStep(stepName, [jetSequence]) + + import pprint + pprint.pprint(chainDict) + + acc.printConfig() + + chain = Chain( chainDict['chainName'], chainDict['L1item'], [ jetStep ] ) + + return chain diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py index 8add498930e67e6e948e6d0c8a38717ff0642a14..a8ca18e1bcd9a280afb47d7edfa35188da6803d8 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py @@ -28,17 +28,23 @@ def stepCF_ControlFlow_to_dot(stepCF): return o def _parOR (seq): - if seq.ModeOR is True: - if seq.Sequential is False: - if seq.StopOverride is True: - return True + try: + if seq.ModeOR is True: + if seq.Sequential is False: + if seq.StopOverride is True: + return True + except AttributeError: + return False # Offline sequence may not have these set return False def _seqAND(seq): - if seq.ModeOR is False: - if seq.Sequential is True: - if seq.StopOverride is False: - return True + try: + if seq.ModeOR is False: + if seq.Sequential is True: + if seq.StopOverride is False: + return True + except AttributeError: + return False # Offline sequence may not have these set return False def _seqColor(seq): diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py index 54f095bd8563be9e19d8c4c16c6902832117dee9..fec61a36e88963592cb099e3788431d1697fc1df 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py @@ -48,6 +48,12 @@ def setupMenu(flags): get_flag_item('HLT_g15_etcut_L1EM12', [], ['RATE:SinglePhoton', 'BW:Photon']) ] + flags.Trigger.menu.jet = [ + get_flag_item('HLT_j45_L1J20', [], ['RATE:SingleJet', 'BW:Jet']), + get_flag_item('HLT_j85_L1J20', [], ['RATE:SingleJet', 'BW:Jet']), + get_flag_item('HLT_2j35_L1J20', [], ['RATE:SingleJet', 'BW:Jet']), + ] + # flags.Trigger.menu.combined = [ # get_flag_item('HLT_e8_mu8_L1EM6_MU6', [], ['RATE:SingleMuon', 'BW:Muon']) # ] diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py index 5baceed10a73ae8d872499f5e62340f76276aacc..eb07c7b0b2f0df524d80e122e081094240014617 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py @@ -564,8 +564,41 @@ class ChainStep(object): from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator class InEventReco( ComponentAccumulator ): """ Class to handle in-event reco """ + def __init__(self, name, inputMaker=None): + super( InEventReco, self ).__init__() + self.name = name + from AthenaCommon.CFElements import parOR, seqAND + self.mainSeq = seqAND( name ) + self.addSequence( self.mainSeq ) + + # Details below to be checked + self.inputMakerAlg = inputMaker + + # Avoid registering a duplicate + self.addEventAlgo( self.inputMakerAlg, self.mainSeq.name() ) + self.recoSeq = parOR( "InputSeq_"+self.inputMakerAlg.name()) + self.addSequence( self.recoSeq, self.mainSeq.name() ) pass + def mergeReco( self, ca ): + """ Merged CA movnig reconstruction algorithms into the right sequence """ + return self.merge( ca, sequenceName=self.recoSeq.getName() ) + + def addRecoAlg( self, alg ): + """Reconstruction alg to be run per event""" + log.warning( "InViewReco.addRecoAlgo: consider using mergeReco that takes care of the CA accumulation and moving algorithms" ) + self.addEventAlgo( alg, self.recoSeq.name() ) + + def addHypoAlg(self, alg): + self.addEventAlgo( alg, self.mainSeq.name() ) + + def sequence( self ): + return self.mainSeq + + def inputMaker( self ): + return self.inputMakerAlg + + class InViewReco( ComponentAccumulator ): """ Class to handle in-view reco, sets up the View maker if not provided and exposes InputMaker so that more inputs to it can be added in the process of assembling the menu """