diff --git a/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py b/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py index 847c4c80b85ded16ce28b84ceb6c494f975c87a8..048cc1561fcb0876dc94bf5c6d0d58cc77de9eef 100644 --- a/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py +++ b/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py @@ -79,6 +79,11 @@ def AthenaMonitoringCfg(flags): info('Set up Jet monitoring') from JetMonitoring.JetMonitoringStandard import standardJetMonitoring result.merge(standardJetMonitoring(flags)) + #Need to create links between global FE, created in jet finding, and other objects + #MET monitoring will need these in some workflows (but not in tier0ESD) + if flags.DQ.Environment != 'tier0ESD': + from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg + result.merge(PFGlobalFlowElementLinkingCfg(flags)) if flags.DQ.Steering.doJetInputsMon: info('Set up Jet Inputs monitoring') @@ -158,4 +163,4 @@ def AthenaMonitoringPostprocessingCfg(flags): ppa.FileKey = ((flags.DQ.FileKey + '/') if not flags.DQ.FileKey.endswith('/') else flags.DQ.FileKey) result.addEventAlgo(ppa, "AthEndSeq") - return result \ No newline at end of file + return result diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommon.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommon.py index e9668e3a513dd2714b9bf5a573ea07a6d9ac6942..0fb4146a3110f41c6d41ee337dd3ab3bc0036b72 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommon.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommon.py @@ -76,6 +76,16 @@ jetList = [AntiKt4EMTopo_deriv, addDAODJets(jetList,DerivationFrameworkJob) +#We also need to build links between the newly created jet constituents (GlobalFE) +#and electrons,photons,muons and taus +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.ComponentAccumulator import CAtoGlobalWrapper +from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg +CAtoGlobalWrapper(PFGlobalFlowElementLinkingCfg,ConfigFlags) +#AOD do not have calorimeter cells for CaloCalTopoCluster, so we have to use +#this special setting for the muon-FE links. +DerivationFrameworkJob.PFMuonGlobalFlowElementAssoc.m_UseMuonTopoClusters=True + # Special rho definition for PFlow jets addSidebandEventShape(sequence=DerivationFrameworkJob) # Event cleaning flags diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommonConfig.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommonConfig.py index 146cd9e8d9443c849db423e59bc120ff64bae8ee..b12368ff50b1948895d30498b4dbf90a9fd28d46 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommonConfig.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/python/PhysCommonConfig.py @@ -71,6 +71,13 @@ def PhysCommonAugmentationsCfg(ConfigFlags,**kwargs): from DerivationFrameworkTau.TauCommonConfig import AddTauWPDecorationCfg from DerivationFrameworkJetEtMiss.METCommonConfig import METCommonCfg acc.merge(JetCommonCfg(ConfigFlags)) + #We also need to build links between the newly created jet constituents (GlobalFE) + #and electrons,photons,muons and taus + from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg + acc.merge(PFGlobalFlowElementLinkingCfg(ConfigFlags)) + #AOD do not have calorimeter cells for CaloCalTopoCluster, so we have to use + #this special setting for the muon-FE links. + acc.getEventAlgo("PFMuonGlobalFlowElementAssoc").m_UseMuonTopoClusters=True acc.merge(AddDiTauLowPtCfg(ConfigFlags, prefix = 'PhysCommon')) acc.merge(AddTauWPDecorationCfg(ConfigFlags, prefix = 'PhysCommon', evetoFixTag="v1")) FTagJetColl = ['AntiKt4EMPFlowJets','AntiKtVR30Rmax4Rmin02TrackJets'] diff --git a/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx b/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx index 5c7e7d8e2d20d50b54e847fca9c2cfc4b93a316f..5ce9904a8aafc8ff93f158c5ac87c8ec3a55517f 100755 --- a/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx +++ b/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx @@ -71,8 +71,8 @@ namespace met { declareProperty( "UseFELinks", m_useFELinks = false ); declareProperty( "NeutralPFOLinksKey", m_neutralPFOLinksKey = "neutralpfoLinks"); declareProperty( "ChargedPFOLinksKey", m_chargedPFOLinksKey = "chargedpfoLinks"); - declareProperty( "NeutralFELinksKey", m_neutralFELinksKey = "neutralFELinks"); - declareProperty( "ChargedFELinksKey", m_chargedFELinksKey = "chargedFELinks"); + declareProperty( "NeutralFELinksKey", m_neutralFELinksKey = "neutralGlobalFELinks"); + declareProperty( "ChargedFELinksKey", m_chargedFELinksKey = "chargedGlobalFELinks"); } // Destructor diff --git a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py index 28ca04c5eb136eb6bd7915faf6f2bb127fd274ad..02f0eea3ddeecbccb2af31b8940a97d99b2a980f 100644 --- a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py +++ b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py @@ -513,8 +513,12 @@ def CombinedMuonOutputCfg(flags): # FIXME! Next two lines are hack to remove derivation framework variables that are added by DRAW building and are supposed to be transient wp_decors = ["DFCommonMuonsTight", "DFCommonGoodMuon", "DFCommonMuonsMedium", - "DFCommonMuonsLoose", "InnerDetectorPt", "MuonSpectrometerPt"] - excludedMuonAuxData = ".-"+".-".join(iso_vars+wp_decors) + "DFCommonMuonsLoose", "InnerDetectorPt", "MuonSpectrometerPt"] + #Remove GlobalFELinks and related variables - these are links between FlowElement (FE) containers created in jet finding and muons. + #Since these transient FE containers are not in the ESD/AOD, we should not write out these links. + gpf_vars=[ "chargedGlobalFELinks", "neutralGlobalFELinks", "muon_efrac_matched_GlobalFE", "deltaR_muon_clus_GlobalFEalg"] + excludedMuonAuxData = ".-"+".-".join(iso_vars+wp_decors+gpf_vars) + aod_items += ["xAOD::MuonAuxContainer#MuonsAux" + excludedMuonAuxData] aod_items += ["xAOD::MuonAuxContainer#MuonsLRTAux" + excludedMuonAuxData] diff --git a/Reconstruction/MuonIdentification/MuonCombinedRecExample/share/MuonCombined_OutputItemsAOD.py b/Reconstruction/MuonIdentification/MuonCombinedRecExample/share/MuonCombined_OutputItemsAOD.py index 419087096bf2a110f24eb5d26f19e9d0d513f35d..98ac8e064ede6d84cb8d8593f816bd91d32d4739 100644 --- a/Reconstruction/MuonIdentification/MuonCombinedRecExample/share/MuonCombined_OutputItemsAOD.py +++ b/Reconstruction/MuonIdentification/MuonCombinedRecExample/share/MuonCombined_OutputItemsAOD.py @@ -30,7 +30,10 @@ if DetFlags.detdescr.Calo_on(): # FIXME - check if the objects below still make if DetFlags.detdescr.Muon_on(): excludedAuxData = '-clusterAssociation' common_flags = [ "DFCommonMuonsTight", "DFCommonGoodMuon","DFCommonMuonsMedium", "DFCommonMuonsLoose", "InnerDetectorPt", "MuonSpectrometerPt" ] - excludedMuonAuxData = ".-"+".-".join(iso_vars() + common_flags) + #Also remove GlobalFELinks and associated variables - these are links between FlowElement (FE) containers created in jet finding and muons. Since these transient FE containers are not in the AOD, + # we should not write out these links or variables + gpf_vars = ["chargedGlobalFELinks","neutralGlobalFELinks","deltaR_muon_clus_GlobalFEalg","muon_efrac_matched_GlobalFE"] + excludedMuonAuxData = ".-"+".-".join(iso_vars() + common_flags + gpf_vars) # Adding the xAOD content by default track_particles = GetCombinedTrackParticles()[0] for trk_cont in track_particles: diff --git a/Reconstruction/RecExample/RecExCommon/share/CombinedRec_config.py b/Reconstruction/RecExample/RecExCommon/share/CombinedRec_config.py index 0eb59a9ef2f1810b8507e697ad632156424bf60c..beff39a2fe052c7f70624e3285292b6580a9aced 100755 --- a/Reconstruction/RecExample/RecExCommon/share/CombinedRec_config.py +++ b/Reconstruction/RecExample/RecExCommon/share/CombinedRec_config.py @@ -177,8 +177,15 @@ if recAlgs.doEFlow() and jobproperties.eflowRecFlags.usePFFlowElementAssoc: from eflowRec.PFCfg import PFTauFlowElementLinkingCfg CAtoGlobalWrapper(PFTauFlowElementLinkingCfg,ConfigFlags) except Exception: - treatException("Could not set up tau-FE links") + treatException("Could not set up tau-FE links") +#Links to/from global FE containers created during jet finding +if(jetOK): + try: + from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg + CAtoGlobalWrapper(PFGlobalFlowElementLinkingCfg,ConfigFlags) + except Exception: + treatException("Could not setup PFGlobalFlowElementAssoc Algorithms") # # functionality : Missing Et # diff --git a/Reconstruction/RecJobTransforms/python/RecoSteering.py b/Reconstruction/RecJobTransforms/python/RecoSteering.py index 0ab8dec4b5b9d80cc8c68d359181a5f91290a906..c1f9d2f0f21a1783692e7bcbb53052112aac585c 100644 --- a/Reconstruction/RecJobTransforms/python/RecoSteering.py +++ b/Reconstruction/RecJobTransforms/python/RecoSteering.py @@ -136,6 +136,10 @@ def RecoSteering(flags): if flags.Reco.EnableJet: from JetRecConfig.JetRecoSteering import JetRecoSteeringCfg acc.merge(JetRecoSteeringCfg(flags)) + #We also need to build links between the newly created jet constituents (GlobalFE) + #and electrons,photons,muons and taus + from eflowRec.PFCfg import PFGlobalFlowElementLinkingCfg + acc.merge(PFGlobalFlowElementLinkingCfg(flags)) log.info("---------- Configured jets") # btagging diff --git a/Reconstruction/eflowRec/python/PFCfg.py b/Reconstruction/eflowRec/python/PFCfg.py index dade392165e9cab19d318806154fcddd18a85a6c..3d118f422ae487081ebd4c863af69f2ccf0b8d5e 100644 --- a/Reconstruction/eflowRec/python/PFCfg.py +++ b/Reconstruction/eflowRec/python/PFCfg.py @@ -196,10 +196,12 @@ def getLCNeutralFlowElementCreatorAlgorithm(inputFlags,neutralFlowElementOutputN return LCFlowElementNeutralCreatorAlgorithm -def getEGamFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",AODTest=False,doTCC=False): +def getEGamFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",AODTest=False,doTCC=False,useGlobal=False,algName=""): PFEGamFlowElementLinkerAlgorithmFactory=CompFactory.PFEGamFlowElementAssoc - PFEGamFlowElementLinkerAlgorithm=PFEGamFlowElementLinkerAlgorithmFactory("PFEGamFlowElementAssoc") + if (algName == ""): + algName = "PFEGamFlowElementAssoc" + PFEGamFlowElementLinkerAlgorithm=PFEGamFlowElementLinkerAlgorithmFactory(algName) #set an an alternate name if needed #this uses some gaudi core magic, namely that you can change the name of the handle as it is a callable attribute, despite the attribute not being explicitly listed in the header @@ -268,17 +270,44 @@ def getEGamFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_ PFEGamFlowElementLinkerAlgorithm.ChargedFEPhotonDecorKey="TrackCaloClustersCharged.TCC_PhotonLinks" PFEGamFlowElementLinkerAlgorithm.NeutralFEPhotonDecorKey="TrackCaloClustersNeutral.TCC_PhotonLinks" + if(useGlobal): + # ReadHandles to change + PFEGamFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer="GlobalNeutralParticleFlowObjects" + PFEGamFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer="GlobalChargedParticleFlowObjects" + + #Now to change the writeHandles + # first the Electron -> FE links + EL_NFE_Link=str(PFEGamFlowElementLinkerAlgorithm.ElectronNeutralFEDecorKey) + PFEGamFlowElementLinkerAlgorithm.ElectronNeutralFEDecorKey=EL_NFE_Link.replace("FELinks","GlobalFELinks") + EL_CFE_Link=str(PFEGamFlowElementLinkerAlgorithm.ElectronChargedFEDecorKey) + PFEGamFlowElementLinkerAlgorithm.ElectronChargedFEDecorKey=EL_CFE_Link.replace("FELinks","GlobalFELinks") + #then the converse case (FE -> Electron) + + PFEGamFlowElementLinkerAlgorithm.ChargedFEElectronDecorKey="GlobalChargedParticleFlowObjects.GlobalFE_ElectronLinks" + PFEGamFlowElementLinkerAlgorithm.NeutralFEElectronDecorKey="GlobalNeutralParticleFlowObjects.GLobalFE_ElectronLinks" + + + # first the Photon -> FE links + PH_NFE_Link=str(PFEGamFlowElementLinkerAlgorithm.PhotonNeutralFEDecorKey) + PFEGamFlowElementLinkerAlgorithm.PhotonNeutralFEDecorKey=PH_NFE_Link.replace("FELinks","GlobalFELinks") + PH_CFE_Link=str(PFEGamFlowElementLinkerAlgorithm.PhotonChargedFEDecorKey) + PFEGamFlowElementLinkerAlgorithm.PhotonChargedFEDecorKey=PH_CFE_Link.replace("FELinks","GlobalFELinks") + #then the converse case (FE -> Photons) + PFEGamFlowElementLinkerAlgorithm.ChargedFEPhotonDecorKey="GlobalChargedParticleFlowObjects.TCC_PhotonLinks" + PFEGamFlowElementLinkerAlgorithm.NeutralFEPhotonDecorKey="GlobalNeutralParticleFlowObjects.TCC_PhotonLinks" return PFEGamFlowElementLinkerAlgorithm -def getMuonFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",LinkNeutralFEClusters=True,useMuonTopoClusters=False,AODTest=False,doTCC=False): +def getMuonFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",LinkNeutralFEClusters=True,useMuonTopoClusters=False,AODTest=False,doTCC=False,useGlobal=False,algName=""): PFMuonFlowElementLinkerAlgorithmFactory=CompFactory.PFMuonFlowElementAssoc - PFMuonFlowElementLinkerAlgorithm=PFMuonFlowElementLinkerAlgorithmFactory("PFMuonFlowElementAssoc") + if (algName == ""): + algName="PFMuonFlowElementAssoc" + PFMuonFlowElementLinkerAlgorithm=PFMuonFlowElementLinkerAlgorithmFactory(algName) #set an an alternate name if needed #this uses some gaudi core magic, namely that you can change the name of the handle as it is a callable attribute, despite the attribute not being explicitly listed in the header as such @@ -336,6 +365,24 @@ def getMuonFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_ PFMuonFlowElementLinkerAlgorithm.MuonContainer_muon_efrac_matched_FE="Muons.muon_efrac_matched_TCC" # this is because the algorithm adds this debug container which we don't need PFMuonFlowElementLinkerAlgorithm.MuonContainer_ClusterInfo_deltaR="Muons.deltaR_muon_clus_TCCalg" + + if(useGlobal): + PFMuonFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer="GlobalChargedParticleFlowObjects" + PFMuonFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer="GlobalNeutralParticleFlowObjects" + + PFMuonFlowElementLinkerAlgorithm.MuonContainer_chargedFELinks="Muons.chargedGlobalFELinks" + PFMuonFlowElementLinkerAlgorithm.MuonContainer_neutralFELinks="Muons.neutralGlobalFELinks" + + PFMuonFlowElementLinkerAlgorithm.JetETMissNeutralFlowElementContainer_FE_MuonLinks="GlobalNeutralParticleFlowObjects.GlobalFE_MuonLinks" + PFMuonFlowElementLinkerAlgorithm.JetETMissChargedFlowElements_FE_MuonLinks="GlobalChargedParticleFlowObjects.GlobalFE_MuonLinks" + + PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_nMatchedMuons="GlobalNeutralParticleFlowObjects.GlobalFE_nMatchedMuons" + PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_FE_efrac_matched_muon="GlobalNeutralParticleFlowObjects.GlobalFE_efrac_matched_muon" + + PFMuonFlowElementLinkerAlgorithm.MuonContainer_muon_efrac_matched_FE="Muons.muon_efrac_matched_GlobalFE" + # this is because the algorithm adds this debug container which we don't need + PFMuonFlowElementLinkerAlgorithm.MuonContainer_ClusterInfo_deltaR="Muons.deltaR_muon_clus_GlobalFEalg" + if(LinkNeutralFEClusters): if (doTCC or AODTest): # since the cells are deleted on AOD, if you try to run the link between NFE and Muon on AOD, it will crash. Terminate to catch this. @@ -352,10 +399,13 @@ def getMuonFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_ -def getTauFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",AODTest=False,doTCC=False) : +def getTauFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",AODTest=False,doTCC=False,useGlobal=False,algName=""): PFTauFlowElementLinkerAlgorithmFactory=CompFactory.PFTauFlowElementAssoc - PFTauFlowElementLinkerAlgorithm=PFTauFlowElementLinkerAlgorithmFactory("PFTauFlowElementAssoc") + if(algName == ""): + algName = "PFTauFlowElementAssoc" + + PFTauFlowElementLinkerAlgorithm=PFTauFlowElementLinkerAlgorithmFactory(algName) #set an an alternate name if needed #this uses some gaudi core magic, namely that you can change the name of the handle as it is a callable attribute, despite the attribute not being explicitly listed in the header @@ -390,6 +440,16 @@ def getTauFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name="",charged_F PFTauFlowElementLinkerAlgorithm.NeutralFETauDecorKey="TrackCaloClustersNeutral.TCC_TauLinks" PFTauFlowElementLinkerAlgorithm.ChargedFETauDecorKey="TrackCaloClustersCharged.TCC_TauLinks" + #This allows to set the links on the global particle flow containers created by JetPFlowSelectionAlg in JetRecTools + if(useGlobal): + PFTauFlowElementLinkerAlgorithm.JetETMissNeutralFlowElementContainer="GlobalNeutralParticleFlowObjects" + PFTauFlowElementLinkerAlgorithm.JetETMissChargedFlowElementContainer="GlobalChargedParticleFlowObjects" + + PFTauFlowElementLinkerAlgorithm.TauNeutralFEDecorKey="TauJets.neutralGlobalFELinks" + PFTauFlowElementLinkerAlgorithm.TauChargedFEDecorKey="TauJets.chargedGlobalFELinks" + + PFTauFlowElementLinkerAlgorithm.NeutralFETauDecorKey="GlobalNeutralParticleFlowObjects.GlobalFE_TauLinks" + PFTauFlowElementLinkerAlgorithm.ChargedFETauDecorKey="GlobalChargedParticleFlowObjects.GlobalFE_TauLinks" return PFTauFlowElementLinkerAlgorithm @@ -414,12 +474,18 @@ def getOfflinePFAlgorithm(inputFlags): result.addEventAlgo(PFAlgorithm) return result -def PFTauFlowElementLinkingCfg(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",AODTest=False): +def PFTauFlowElementLinkingCfg(inputFlags,neutral_FE_cont_name="",charged_FE_cont_name="",AODTest=False,doTCC=False,useGlobal=False,algName=""): result=ComponentAccumulator() - result.addEventAlgo(getTauFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name,charged_FE_cont_name,AODTest)) + result.addEventAlgo(getTauFlowElementAssocAlgorithm(inputFlags,neutral_FE_cont_name,charged_FE_cont_name,AODTest,doTCC,useGlobal,algName)) return result +def PFGlobalFlowElementLinkingCfg(inputFlags): + result=ComponentAccumulator() + result.addEventAlgo(getTauFlowElementAssocAlgorithm(inputFlags,useGlobal=True,algName="PFTauGlobalFlowElementAssoc")) + result.addEventAlgo(getMuonFlowElementAssocAlgorithm(inputFlags,useGlobal=True,algName="PFMuonGlobalFlowElementAssoc")) + result.addEventAlgo(getEGamFlowElementAssocAlgorithm(inputFlags,useGlobal=True,algName="PFEGamGlobalFlowElementAssoc")) + return result diff --git a/Reconstruction/eflowRec/src/PFMuonFlowElementAssoc.cxx b/Reconstruction/eflowRec/src/PFMuonFlowElementAssoc.cxx index ce5ea4f9e539f93b00f32469b643d7f7e5cdd9fa..fd2f4cbb0ffc299af0999769a6bc8633e6b789c7 100644 --- a/Reconstruction/eflowRec/src/PFMuonFlowElementAssoc.cxx +++ b/Reconstruction/eflowRec/src/PFMuonFlowElementAssoc.cxx @@ -159,22 +159,21 @@ StatusCode PFMuonFlowElementAssoc::execute(const EventContext& ctx) const { for (const xAOD::FlowElement* FE : *NeutralFEmuonWriteDecorHandle) { int nMatchedFE = 0; // get the index of the cluster corresponding to the Neutral FlowElements - size_t FEclusterindex = FE->otherObjects().at(0)->index(); + ATH_MSG_DEBUG("P1"); + const xAOD::IParticle* otherObject = FE->otherObjects().at(0); + //This is expected to happen for low energy FE - sometimes the linked cluster has E < 0 and + //is thinned away in the AOD + if (!otherObject){ + ATH_MSG_DEBUG("No linked cluster for Neutral FE with E, eta and phi" << FE->e() << ", " << FE->eta() << " and " << FE->phi()); + continue; + } + size_t FEclusterindex = otherObject->index(); // FE->otherObjects returns a vector of IParticles. We only want the first one const xAOD::IParticle* FE_Iparticle = FE->otherObjects().at(0); - // dynamic cast to CaloCluster - const xAOD::CaloCluster* FE_cluster = dynamic_cast<const xAOD::CaloCluster*>(FE_Iparticle); // cast to CaloCluster - // retrieve the link to cells - const CaloClusterCellLink* CellLink = FE_cluster->getCellLinks(); - // build the iterator(s) for the looping over the elements inside the CellLink - if (!CellLink && !m_UseMuonTopoClusters) { // safety check if no celll link and we're doing the cell based matching only - ATH_MSG_WARNING("Flow Element cluster link is nullptr"); - continue; - } - CaloClusterCellLink::const_iterator FE_FirstCell = CellLink->begin(); - CaloClusterCellLink::const_iterator FE_LastCell = CellLink->end(); + // dynamic cast to CaloCluster + const xAOD::CaloCluster* FE_cluster = dynamic_cast<const xAOD::CaloCluster*>(FE_Iparticle); // cast to CaloCluster // debug for Negative energy cluster @@ -198,8 +197,10 @@ StatusCode PFMuonFlowElementAssoc::execute(const EventContext& ctx) const { // get the linker to the topo clusters const std::vector<ElementLink<xAOD::CaloClusterContainer>>& linksToTopoClusters = acc_constClusterLinks(*cluster); for (const ElementLink<xAOD::CaloClusterContainer>& TopoClusterLink : linksToTopoClusters) { + //This is expected to happen for low energy cluster - sometimes the linked cluster has E < 0 and + //is thinned away in the AOD if (!TopoClusterLink.isValid()) { - ATH_MSG_WARNING("Muon Calo cluster's TopoCluster link not found, skip"); + ATH_MSG_DEBUG("Muon Calo cluster's TopoCluster link not found, skip"); continue; } const xAOD::CaloCluster* MuonTopoCluster = *TopoClusterLink; // de-ref the link to get the topo-cluster @@ -209,7 +210,7 @@ StatusCode PFMuonFlowElementAssoc::execute(const EventContext& ctx) const { // index() is the unique index of the muon in the muon container FEMuonLinks.emplace_back(*muonReadHandle, muon->index()); // index() is the unique index of the cFlowElement in the cFlowElementcontaine - muonNeutralFEVec.at(muon->index()).push_back(FlowElementLink_t(*NeutralFEReadHandle, FE->index())); + muonNeutralFEVec.at(muon->index()).push_back(FlowElementLink_t(*NeutralFEReadHandle, FE->index())); ATH_MSG_VERBOSE("Got a match between NFE and Muon"); nMatchedFE++; // count number of matches between FE and muons if (neg_E_cluster) ATH_MSG_ERROR("Muon cluster matched to negative E topocluster from FE"); @@ -221,6 +222,17 @@ StatusCode PFMuonFlowElementAssoc::execute(const EventContext& ctx) const { // Retrieve cells in both the FE cluster and muon cluster // Define the link as where at least one calo cell is shared between the FE cluster and the Muon Cluster + // retrieve the link to cells + const CaloClusterCellLink* CellLink = FE_cluster->getCellLinks(); + // build the iterator(s) for the looping over the elements inside the CellLink + if (!CellLink && !m_UseMuonTopoClusters) { // safety check if no celll link and we're doing the cell based matching only + ATH_MSG_WARNING("Flow Element cluster link is nullptr"); + continue; + } + + CaloClusterCellLink::const_iterator FE_FirstCell = CellLink->begin(); + CaloClusterCellLink::const_iterator FE_LastCell = CellLink->end(); + // retrieve cells associated to Muon cluster const CaloClusterCellLink* Muon_Clus_CellLink = cluster->getCellLinks(); if (!Muon_Clus_CellLink) { @@ -283,7 +295,6 @@ StatusCode PFMuonFlowElementAssoc::execute(const EventContext& ctx) const { } } // end of calocluster specific block - // loop over caloclusters } // loop over muons NeutralFEmuon_nMatches_WriteDecorHandle(*FE) = nMatchedFE; diff --git a/Reconstruction/eflowRec/src/PFTauFlowElementAssoc.cxx b/Reconstruction/eflowRec/src/PFTauFlowElementAssoc.cxx index 5e678744050b769b324dd4605d36d7d8e2fd96dd..5cebbca217d1584fd99c4b4d5dc260f892239f97 100644 --- a/Reconstruction/eflowRec/src/PFTauFlowElementAssoc.cxx +++ b/Reconstruction/eflowRec/src/PFTauFlowElementAssoc.cxx @@ -77,8 +77,9 @@ StatusCode PFTauFlowElementAssoc::execute(const EventContext &ctx) const { // Loop over the taus for (const xAOD::TauJet* tau : *tauNeutralFEWriteDecorHandle) { - // Skip taus that won't be written to AOD - if(!acc_passThinning(*tau)) continue; + // Skip taus that won't be written to AOD - first check the variable exists + // because older ESD and any AOD used as input do not have this variable. + if(acc_passThinning.isAvailable(*tau) && !acc_passThinning(*tau)) continue; // Get tau vertex const xAOD::Vertex* tauVertex = tau->vertex(); // Get the clusters associated to the tau @@ -125,7 +126,9 @@ StatusCode PFTauFlowElementAssoc::execute(const EventContext &ctx) const { // Loop over the taus for (const xAOD::TauJet* tau : *tauChargedFEWriteDecorHandle) { - if(!acc_passThinning(*tau)) continue; + // Skip taus that won't be written to AOD - first check the variable exists + // because older ESD and any AOD used as input do not have this variable. + if(acc_passThinning.isAvailable(*tau) && !acc_passThinning(*tau)) continue; // Get tau tracks associated to the tau std::vector<const xAOD::TauTrack*> tauTracks = tau->tracks(); for (const auto *tauTrack : tauTracks) { diff --git a/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py b/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py index cef6eb8539bc27cbac39ba6068a4a154f1341602..e2b35a0727924a2306397fef29de68115fb0d21e 100644 --- a/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py +++ b/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py @@ -91,7 +91,9 @@ def createEgammaConfigFlags(): '-topoetconeCorrBitset') egcf.addFlag("Egamma.Keys.Output.Electrons", 'Electrons') - egcf.addFlag("Egamma.Keys.Output.ElectronsSuppESD", '') + #Remove GlobalFELinks - these are links between FlowElement (FE) containers created in jet finding and electrons/photons. Since these transient FE containers are not in the ESD/AOD, we should not write out these links. + gpf_vars='-chargedGlobalFELinks.-neutralGlobalFELinks.' + egcf.addFlag("Egamma.Keys.Output.ElectronsSuppESD", gpf_vars) egcf.addFlag("Egamma.Keys.Output.ElectronsSuppAOD", lambda prevFlags: ( prevFlags.Egamma.Keys.Output.ElectronsSuppESD + @@ -116,7 +118,7 @@ def createEgammaConfigFlags(): prevFlags.Egamma.Keys.Output.ForwardClustersSuppESD)) egcf.addFlag("Egamma.Keys.Output.Photons", 'Photons') - egcf.addFlag("Egamma.Keys.Output.PhotonsSuppESD", '') + egcf.addFlag("Egamma.Keys.Output.PhotonsSuppESD", gpf_vars) egcf.addFlag("Egamma.Keys.Output.PhotonsSuppAOD", lambda prevFlags: ( prevFlags.Egamma.Keys.Output.PhotonsSuppESD + diff --git a/Reconstruction/egamma/egammaRec/python/egammaKeys.py b/Reconstruction/egamma/egammaRec/python/egammaKeys.py index 0231a3ae783aec6db36fd3725243d198a9a41bf4..41cc7e5d3c9fd09f6925994b4789ebc6b83313f2 100644 --- a/Reconstruction/egamma/egammaRec/python/egammaKeys.py +++ b/Reconstruction/egamma/egammaRec/python/egammaKeys.py @@ -18,8 +18,11 @@ class egammaKeysDict: ShowerShapesSuppress = '.-e033.-e011.-e333.-e335.-e337.-e377' PhotonisemSuppress = '.-isEMLoose.-isEMTight' ElectronisemSupress = '.-isEMLHLoose.-isEMLHTight.-isEMLHMedium.-isEMLoose.-isEMMultiLepton.-isEMMedium.-isEMTight' - ElectronSuppress = ShowerShapesSuppress + ElectronisemSupress + '.-EgammaCovarianceMatrix' - PhotonSuppress = ShowerShapesSuppress + PhotonisemSuppress + #When we run jet finding we create links between global FE and electrons/photons + #Global FE do not go into the ESD/AOD, so we suppress the links to them here + GlobalPFlowSuppress = '.-chargedGlobalFELinks.-neutralGlobalFELinks' + ElectronSuppress = ShowerShapesSuppress + ElectronisemSupress + '.-EgammaCovarianceMatrix' + GlobalPFlowSuppress + PhotonSuppress = ShowerShapesSuppress + PhotonisemSuppress + GlobalPFlowSuppress FwdElectronisemSupress = '.-isEMTight.-isEMMedium.-isEMLoose' isovar_suppress = "-" + ".-".join(iso_vars()) egisovar_suppress = isovar_suppress + '.-ptconeCorrBitset.-ptconecoreTrackPtrCorrection.-topoetconeCorrBitset' @@ -47,7 +50,7 @@ class egammaKeysDict: Electron=[ 'xAOD::ElectronContainer', 'Electrons', - egisovar_suppress, + egisovar_suppress + GlobalPFlowSuppress, ElectronSuppress], EgammaRec=['egammaRecContainer', 'egammaRecCollection', @@ -68,7 +71,7 @@ class egammaKeysDict: '-SisterCluster', ''], Photon=['xAOD::PhotonContainer', 'Photons', - phisovar_suppress, + phisovar_suppress + GlobalPFlowSuppress, PhotonSuppress], TrackParticle=[ 'xAOD::TrackParticleContainer', diff --git a/Reconstruction/tauRec/python/TauConfig.py b/Reconstruction/tauRec/python/TauConfig.py index a09c214933cf5682224b51668de3feee0202de97..5e61c7253bbcfe46022220d37a6679d6897823c3 100755 --- a/Reconstruction/tauRec/python/TauConfig.py +++ b/Reconstruction/tauRec/python/TauConfig.py @@ -221,10 +221,12 @@ def TauOutputCfg(flags): TauESDList = list(TauAODList) # add AOD specific - TauAODList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters.-mu.-nVtxPU.-ABS_ETA_LEAD_TRACK.-TAU_ABSDELTAPHI.-TAU_ABSDELTAETA.-absipSigLeadTrk.-passThinning" ] + #Also remove GlobalFELinks - these are links between FlowElement (FE) containers created in jet finding and taus. Since these transient FE containers are not in the AOD, we should not write out these links. + TauAODList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters.-mu.-nVtxPU.-ABS_ETA_LEAD_TRACK.-TAU_ABSDELTAPHI.-TAU_ABSDELTAETA.-absipSigLeadTrk.-passThinning.-chargedGlobalFELinks.-neutralGlobalFELinks" ] # addEOD specific - TauESDList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters" ] + #Also remove GlobalFELinks - these are links between FlowElement (FE) containers created in jet finding and taus. Since these transient FE containers are not in the AOD, we should not write out these links. + TauESDList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters.-chargedGlobalFELinks.-neutralGlobalFELinks" ] TauESDList += [ "xAOD::PFOContainer#TauChargedParticleFlowObjects" ] TauESDList += [ "xAOD::PFOAuxContainer#TauChargedParticleFlowObjectsAux." ] diff --git a/Reconstruction/tauRec/share/TauAODList.py b/Reconstruction/tauRec/share/TauAODList.py index 67e03866f3be3472750ee6de2f6d03129e37173a..38f07b395373c075bb90041bc77469d9bc1107e6 100644 --- a/Reconstruction/tauRec/share/TauAODList.py +++ b/Reconstruction/tauRec/share/TauAODList.py @@ -14,7 +14,8 @@ TauAODList = [] # Taus #------------------------------------------------------------------------------ TauAODList += [ "xAOD::TauJetContainer#TauJets" ] -TauAODList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters.-mu.-nVtxPU.-ABS_ETA_LEAD_TRACK.-TAU_ABSDELTAPHI.-TAU_ABSDELTAETA.-absipSigLeadTrk.-passThinning" ] +#Also remove GlobalFELinks - these are links between FlowElement (FE) containers created in jet finding and taus. Since these transient FE containers are not in the AOD, we should not write out these links. +TauAODList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters.-mu.-nVtxPU.-ABS_ETA_LEAD_TRACK.-TAU_ABSDELTAPHI.-TAU_ABSDELTAETA.-absipSigLeadTrk.-passThinning.-chargedGlobalFELinks.-neutralGlobalFELinks" ] #------------------------------------------------------------------------------ # Tau tracks diff --git a/Reconstruction/tauRec/share/TauESDList.py b/Reconstruction/tauRec/share/TauESDList.py index 2d04f1c40f04c30d322db4527a59d74b91ad8eba..defe2a52354d595666d670a5c338111e611e4ffc 100644 --- a/Reconstruction/tauRec/share/TauESDList.py +++ b/Reconstruction/tauRec/share/TauESDList.py @@ -14,7 +14,8 @@ TauESDList = [] # Taus #------------------------------------------------------------------------------ TauESDList += [ "xAOD::TauJetContainer#TauJets" ] -TauESDList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters" ] +#Also remove GlobalFELinks - these are links between FlowElement (FE) containers created in jet finding and taus. Since these transient FE containers are not in the AOD, we should not write out these links. +TauESDList += [ "xAOD::TauJetAuxContainer#TauJetsAux.-VertexedClusters.-chargedGlobalFELinks.-neutralGlobalFELinks" ] #------------------------------------------------------------------------------ # Tau tracks diff --git a/Tools/WorkflowTestRunner/python/References.py b/Tools/WorkflowTestRunner/python/References.py index c58854cbd5e433ca32f16cb01a739abd066159d9..c7221506b41fa83d03eda7931f67aaae46a2f66e 100644 --- a/Tools/WorkflowTestRunner/python/References.py +++ b/Tools/WorkflowTestRunner/python/References.py @@ -19,7 +19,7 @@ references_map = { "d1726": "v4", "d1759": "v5", # Reco - "q442": "v7", - "q445": "v17", - "q449": "v15", + "q442": "v9", + "q445": "v18", + "q449": "v16", }