diff --git a/Reconstruction/MET/METReconstruction/CMakeLists.txt b/Reconstruction/MET/METReconstruction/CMakeLists.txt index 96860c7863a28c6be313761341a7d2ab7b513b25..c9b8aa0139b6807b4bdc6066a9fc8aeeb60c5683 100644 --- a/Reconstruction/MET/METReconstruction/CMakeLists.txt +++ b/Reconstruction/MET/METReconstruction/CMakeLists.txt @@ -24,7 +24,7 @@ atlas_depends_on_subdirs( PUBLIC Reconstruction/MET/METRecoInterface Reconstruction/PFlow/PFlowUtils Reconstruction/RecoTools/CaloClusterMatching - Reconstruction/RecoTools/RecoToolInterfaces + Reconstruction/RecoTools/RecoToolInterfaces PRIVATE Calorimeter/CaloEvent Control/AthContainers diff --git a/Reconstruction/MET/METReconstruction/METReconstruction/METAssociationTool.h b/Reconstruction/MET/METReconstruction/METReconstruction/METAssociationTool.h index 76848e481433d9597b8c6ba8072666d979568fcb..8759371c38560a2bfe6144d642bdb1aeb6e4ac35 100644 --- a/Reconstruction/MET/METReconstruction/METReconstruction/METAssociationTool.h +++ b/Reconstruction/MET/METReconstruction/METReconstruction/METAssociationTool.h @@ -106,6 +106,12 @@ namespace met{ ToolHandleArray<IMETAssocToolBase> m_metassociators; + // Monitor timing + int m_timedetail; + + mutable unsigned int m_nevt; + mutable TStopwatch m_clock; + mutable std::vector<TStopwatch> m_toolclocks; }; } diff --git a/Reconstruction/MET/METReconstruction/METReconstruction/METAssociator.h b/Reconstruction/MET/METReconstruction/METReconstruction/METAssociator.h index 7aea99dcc16ff2c571be57bc8d089a00f89f4e76..3fa816f52a88b9e9900c92b8cdda11e9d618ee15 100644 --- a/Reconstruction/MET/METReconstruction/METReconstruction/METAssociator.h +++ b/Reconstruction/MET/METReconstruction/METReconstruction/METAssociator.h @@ -85,6 +85,9 @@ namespace met { std::string m_forcoll; double m_foreta; + double m_cenTrackPtThr; + double m_forTrackPtThr; + // reconstruction process to be defined in the individual tools // pure virtual -- we have no default virtual StatusCode executeTool(xAOD::MissingETContainer* metCont, xAOD::MissingETAssociationMap* metMap) = 0; diff --git a/Reconstruction/MET/METReconstruction/METReconstruction/METMuonAssociator.h b/Reconstruction/MET/METReconstruction/METReconstruction/METMuonAssociator.h index d9b62f25ca36c70f2cb3d7d9a4f4bbae396899e8..477b19075a9ba93a0affab503e7caaf65eda5dd1 100644 --- a/Reconstruction/MET/METReconstruction/METReconstruction/METMuonAssociator.h +++ b/Reconstruction/MET/METReconstruction/METReconstruction/METMuonAssociator.h @@ -71,6 +71,8 @@ namespace met{ private: + bool m_doMuonClusterMatch; + /// Default constructor: METMuonAssociator(); diff --git a/Reconstruction/MET/METReconstruction/METReconstruction/METTrackFilterTool.h b/Reconstruction/MET/METReconstruction/METReconstruction/METTrackFilterTool.h index 007ff89fc851f3f6a7769551679c1ad36b2e08e5..b674e907532b6894737016c6b78fa010993a2335 100644 --- a/Reconstruction/MET/METReconstruction/METReconstruction/METTrackFilterTool.h +++ b/Reconstruction/MET/METReconstruction/METReconstruction/METTrackFilterTool.h @@ -117,6 +117,9 @@ namespace met{ bool m_trk_doEoverPsel; std::string m_cl_inputkey; + + double m_cenTrackPtThr; + double m_forTrackPtThr; }; } diff --git a/Reconstruction/MET/METReconstruction/Root/METAssociationTool.cxx b/Reconstruction/MET/METReconstruction/Root/METAssociationTool.cxx index 1e6ab14b55a4e49776e6b8fa4f9765d5e777fcab..fd1a900e52d5090e2404bc7820c15d5b9d891fbe 100644 --- a/Reconstruction/MET/METReconstruction/Root/METAssociationTool.cxx +++ b/Reconstruction/MET/METReconstruction/Root/METAssociationTool.cxx @@ -49,6 +49,7 @@ namespace met { declareProperty( "METSuffix", m_metsuffix = "AntiKt4LCTopo" ); declareProperty( "TCSignalState", m_signalstate = 1 ); declareProperty( "AllowOverwrite", m_overwrite = false ); + declareProperty( "TimingDetail", m_timedetail = 0 ); } // Destructor @@ -73,16 +74,22 @@ namespace met { ATH_MSG_INFO(" Association map ==> " << m_mapname); } - // retrieve builders - for(ToolHandleArray<IMETAssocToolBase>::const_iterator iBuilder=m_metassociators.begin(); - iBuilder != m_metassociators.end(); ++iBuilder) { - ToolHandle<IMETAssocToolBase> tool = *iBuilder; + // retrieve associators and generate clocks + unsigned int ntool = m_metassociators.size(); + unsigned int itool = 0; + m_toolclocks.resize(ntool); + for(ToolHandleArray<IMETAssocToolBase>::const_iterator iAssociator=m_metassociators.begin(); + iAssociator != m_metassociators.end(); ++iAssociator) { + ToolHandle<IMETAssocToolBase> tool = *iAssociator; if( tool.retrieve().isFailure() ) { ATH_MSG_FATAL("Failed to retrieve tool: " << tool->name()); return StatusCode::FAILURE; }; ATH_MSG_INFO("Retrieved tool: " << tool->name() ); + m_toolclocks[itool].Reset(); + ++itool; } + m_clock.Reset(); return StatusCode::SUCCESS; } @@ -161,6 +168,37 @@ namespace met { { ATH_MSG_INFO ("Finalizing " << name() << "..."); + if ( m_timedetail > 0 ) { + double ctime = m_clock.CpuTime()*1000; + double wtime = m_clock.RealTime()*1000; + double actime = 0.0; + double awtime = 0.0; + if ( m_nevt > 0 ) { + actime = ctime/double(m_nevt); + awtime = wtime/double(m_nevt); + } + ATH_MSG_INFO(" Total CPU/wall time: " << ctime << "/" << wtime << " ms"); + ATH_MSG_INFO(" Avg. CPU/wall time: " << actime << "/" << awtime << " ms"); + } + + if ( m_timedetail > 1 && m_nevt > 0 ) { + unsigned int ntool = m_metassociators.size(); + ATH_MSG_INFO(" CPU/wall time [ms] for " << ntool << " tools:"); + unsigned int itool=0; + + // time associators + for(ToolHandleArray<IMETAssocToolBase>::const_iterator iAssociator=m_metassociators.begin(); + iAssociator != m_metassociators.end(); ++iAssociator) { + ToolHandle<IMETAssocToolBase> th = *iAssociator; + double tctime = m_toolclocks[itool].CpuTime()/double(m_nevt)*1000; + double twtime = m_toolclocks[itool].RealTime()/double(m_nevt)*1000; + ATH_MSG_INFO(" " << setw(30) << th.typeAndName() + << fixed << setprecision(3) << setw(10) << tctime + << fixed << setprecision(3) << setw(10) << twtime); + ++itool; + } + } + return StatusCode::SUCCESS; } @@ -179,6 +217,8 @@ namespace met { StatusCode METAssociationTool::buildMET(xAOD::MissingETContainer* metCont, xAOD::MissingETAssociationMap* metMap) const { + if ( m_timedetail > 0 ) m_clock.Start(false); + // Set the topocluster signal states for the duration of this method // Cluster signal states will revert upon the return. CaloClusterChangeSignalStateList stateHelperList; @@ -194,17 +234,31 @@ namespace met { } } + unsigned int itool=0; // Run the MET reconstruction tools in sequence - for(ToolHandleArray<IMETAssocToolBase>::const_iterator iBuilder=m_metassociators.begin(); - iBuilder != m_metassociators.end(); ++iBuilder) { - ToolHandle<IMETAssocToolBase> tool = *iBuilder; + for(ToolHandleArray<IMETAssocToolBase>::const_iterator iAssociator=m_metassociators.begin(); + iAssociator != m_metassociators.end(); ++iAssociator) { + ToolHandle<IMETAssocToolBase> tool = *iAssociator; + if ( m_timedetail > 1 ) m_toolclocks[itool].Start(false); if (tool->execute(metCont,metMap).isFailure()){ ATH_MSG_WARNING("Failed to execute tool: " << tool->name()); + if ( m_timedetail > 0 ) m_clock.Stop(); + if ( m_timedetail > 1 ) m_toolclocks[itool].Stop(); return StatusCode::FAILURE; } + if ( m_timedetail > 1 ) { + m_toolclocks[itool].Stop(); + ATH_MSG_VERBOSE(" " << tool->name() << " CPU/wall time: " << m_clock.CpuTime()*1000 + << "/" << m_clock.RealTime()*1000 << " ms"); + } + ++itool; } bool foundOverlaps = metMap->identifyOverlaps(); ATH_MSG_DEBUG( (foundOverlaps ? "Overlaps" : "No overlaps") << " identified!"); + if ( m_timedetail > 0 ) m_clock.Stop(); + ATH_MSG_DEBUG(" " << this->name() << " total CPU/wall time: " << m_clock.CpuTime()*1000 + << "/" << m_clock.RealTime()*1000 << " ms"); + ++m_nevt; return StatusCode::SUCCESS; } diff --git a/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx b/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx index af80083e07952a8be6050dcb532710ccddba9f84..b7f87b573f76ae72c98caa875318f9bc91c172c8 100644 --- a/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx +++ b/Reconstruction/MET/METReconstruction/Root/METAssociator.cxx @@ -55,7 +55,7 @@ namespace met { declareProperty( "PFlow", m_pflow = false ); declareProperty( "UseRapidity", m_useRapidity = false ); declareProperty( "PFOTool", m_pfotool ); - declareProperty( "UseIsolationTools", m_useIsolationTools=false ); + declareProperty( "UseIsolationTools", m_useIsolationTools=true ); declareProperty( "TrackSelectorTool", m_trkseltool ); declareProperty( "TrackIsolationTool", m_trkIsolationTool ); declareProperty( "CaloIsolationTool", m_caloIsolationTool ); @@ -63,6 +63,8 @@ namespace met { declareProperty( "IgnoreJetConst", m_skipconst = false ); declareProperty( "ForwardColl", m_forcoll = "" ); declareProperty( "ForwardDef", m_foreta = 2.5 ); + declareProperty( "CentralTrackPtThr", m_cenTrackPtThr = 200e+3 ); + declareProperty( "ForwardTrackPtThr", m_forTrackPtThr = 120e+3 ); } // Destructor @@ -334,8 +336,8 @@ namespace met { bool METAssociator::isGoodEoverP(const xAOD::TrackParticle* trk,const xAOD::IParticleContainer*& tcCont) const { - if( (fabs(trk->eta())<1.5 && trk->pt()>200e3) || - (fabs(trk->eta())>=1.5 && trk->pt()>120e3) ) { + if( (fabs(trk->eta())<1.5 && trk->pt()>m_cenTrackPtThr) || + (fabs(trk->eta())>=1.5 && trk->pt()>m_forTrackPtThr) ) { // Get relative error on qoverp float Rerr = Amg::error(trk->definingParametersCovMatrix(),4)/fabs(trk->qOverP()); @@ -398,7 +400,7 @@ namespace met { if(isolfrac<0.1) { // isolated track cuts if(Rerr>0.4) return false; - else if (EoverP<0.65 && (EoverP>0.1 || Rerr>0.1)) return false; + else if (EoverP<0.65 && ((EoverP>0.1 && Rerr>0.05) || Rerr>0.1)) return false; } else { // non-isolated track cuts float trkptsum = ptcone20+trk->pt(); diff --git a/Reconstruction/MET/METReconstruction/Root/METJetAssocTool.cxx b/Reconstruction/MET/METReconstruction/Root/METJetAssocTool.cxx index 8dc2a47171642757534a21c4767d21e8826e13f2..b7e49c1c01e25bbf0afe12af316c9d85913a092c 100644 --- a/Reconstruction/MET/METReconstruction/Root/METJetAssocTool.cxx +++ b/Reconstruction/MET/METReconstruction/Root/METJetAssocTool.cxx @@ -125,7 +125,7 @@ namespace met { selectedTracks.reserve(jettracks.size()); for(const auto& trk : jettracks) { const TrackParticle* pTrk = static_cast<const TrackParticle*>(trk); - if( acceptTrack(pTrk,pv) ) { + if(acceptTrack(pTrk,pv) && isGoodEoverP(pTrk,tcCont)) { selectedTracks.push_back(trk); ATH_MSG_VERBOSE("Accept track " << trk << " px, py = " << trk->p4().Px() << ", " << trk->p4().Py()); } diff --git a/Reconstruction/MET/METReconstruction/Root/METMuonAssociator.cxx b/Reconstruction/MET/METReconstruction/Root/METMuonAssociator.cxx index 28cb767f9513dc41277572a2b0d72bba1880554d..ab05bea4f8d6da06c88949248eb9687d9a208ed7 100644 --- a/Reconstruction/MET/METReconstruction/Root/METMuonAssociator.cxx +++ b/Reconstruction/MET/METReconstruction/Root/METMuonAssociator.cxx @@ -32,7 +32,9 @@ namespace met { METMuonAssociator::METMuonAssociator(const std::string& name) : AsgTool(name), METAssociator(name) - {} + { + declareProperty("DoClusterMatch", m_doMuonClusterMatch=true); + } // Destructor /////////////// @@ -91,7 +93,7 @@ namespace met { { const xAOD::Muon *mu = static_cast<const xAOD::Muon*>(obj); const CaloCluster* muclus = mu->cluster(); - if(muclus) { + if(muclus && m_doMuonClusterMatch) { ATH_MSG_VERBOSE("Muon " << mu->index() << " with pt " << mu->pt() << ", eta " << mu->eta() << ", phi " << mu->phi() diff --git a/Reconstruction/MET/METReconstruction/Root/METRecoTool.cxx b/Reconstruction/MET/METReconstruction/Root/METRecoTool.cxx index 5b67302983bd5095275b58be444ec325af62ab24..402c1c137b6360a60a982d54f552e9ddb3a76d12 100644 --- a/Reconstruction/MET/METReconstruction/Root/METRecoTool.cxx +++ b/Reconstruction/MET/METReconstruction/Root/METRecoTool.cxx @@ -199,10 +199,10 @@ namespace met { // time builders for(ToolHandleArray<IMETToolBase>::const_iterator iBuilder=m_metbuilders.begin(); iBuilder != m_metbuilders.end(); ++iBuilder) { - ToolHandle<IMETToolBase> tool = *iBuilder; + ToolHandle<IMETToolBase> th = *iBuilder; double tctime = m_toolclocks[itool].CpuTime()/double(m_nevt)*1000; double twtime = m_toolclocks[itool].RealTime()/double(m_nevt)*1000; - ATH_MSG_INFO(" " << setw(30) << tool->name() + ATH_MSG_INFO(" " << setw(30) << th.typeAndName() << fixed << setprecision(3) << setw(10) << tctime << fixed << setprecision(3) << setw(10) << twtime); ++itool; @@ -211,10 +211,10 @@ namespace met { // time refiners for(ToolHandleArray<IMETToolBase>::const_iterator iRefiner=m_metrefiners.begin(); iRefiner != m_metrefiners.end(); ++iRefiner) { - ToolHandle<IMETToolBase> tool = *iRefiner; + ToolHandle<IMETToolBase> th = *iRefiner; double tctime = m_toolclocks[itool].CpuTime()/double(m_nevt)*1000; double twtime = m_toolclocks[itool].RealTime()/double(m_nevt)*1000; - ATH_MSG_INFO(" " << setw(30) << tool->name() + ATH_MSG_INFO(" " << setw(30) << th.typeAndName() << fixed << setprecision(3) << setw(10) << tctime << fixed << setprecision(3) << setw(10) << twtime); ++itool; diff --git a/Reconstruction/MET/METReconstruction/Root/METTrackFilterTool.cxx b/Reconstruction/MET/METReconstruction/Root/METTrackFilterTool.cxx index 4f82e7b5669d49947750953f23cce6f75a800468..e65b944af09b39393d96b4c887f8aa4bcba1e42e 100644 --- a/Reconstruction/MET/METReconstruction/Root/METTrackFilterTool.cxx +++ b/Reconstruction/MET/METReconstruction/Root/METTrackFilterTool.cxx @@ -65,9 +65,11 @@ namespace met { declareProperty( "TrackSelectorTool", m_trkseltool ); declareProperty( "TrackVxAssocTool", m_trkToVertexTool ); declareProperty( "DoLepRecovery", m_doLepRecovery=false ); - declareProperty( "UseIsolationTools", m_useIsolationTools=false ); + declareProperty( "UseIsolationTools", m_useIsolationTools=true ); declareProperty( "TrackIsolationTool", m_trkIsolationTool ); declareProperty( "CaloIsolationTool", m_caloIsolationTool ); + declareProperty( "CentralTrackPtThr", m_cenTrackPtThr = 200e+3 ); + declareProperty( "ForwardTrackPtThr", m_forTrackPtThr = 120e+3 ); } // Destructor @@ -124,8 +126,8 @@ namespace met { const std::vector<const xAOD::TrackParticle*>& trkList, const xAOD::CaloClusterContainer* clusters) const { - if( (fabs(trk->eta())<1.5 && trk->pt()>200e3) || - (fabs(trk->eta())>=1.5 && trk->pt()>120e3) ) { + if( (fabs(trk->eta())<1.5 && trk->pt()>m_cenTrackPtThr) || + (fabs(trk->eta())>=1.5 && trk->pt()>m_forTrackPtThr) ) { // Get relative error on qoverp float Rerr = Amg::error(trk->definingParametersCovMatrix(),4)/fabs(trk->qOverP()); @@ -190,7 +192,7 @@ namespace met { if(isolfrac<0.1) { // isolated track cuts if(Rerr>0.4) return false; - else if (EoverP<0.65 && (EoverP>0.1 || Rerr>0.1)) return false; + else if (EoverP<0.65 && ((EoverP>0.1 && Rerr>0.05) || Rerr>0.1)) return false; } else { // non-isolated track cuts float trkptsum = ptcone20+trk->pt(); diff --git a/Reconstruction/MET/METReconstruction/python/METAssocConfig.py b/Reconstruction/MET/METReconstruction/python/METAssocConfig.py index 04f37e5bba364d099be58f7438b6f833724560b1..547d064c1f671b4fae04ea1f285bd519e94213b9 100644 --- a/Reconstruction/MET/METReconstruction/python/METAssocConfig.py +++ b/Reconstruction/MET/METReconstruction/python/METAssocConfig.py @@ -30,22 +30,6 @@ defaultInputKey = { 'EMOCClusColl':'EMOriginTopoClusters', } -# # old naming scheme -# defaultInputKey = { -# 'Ele' :'ElectronCollection', -# 'Gamma' :'PhotonCollection', -# 'Tau' :'TauRecContainer', -# 'LCJet' :'AntiKt4LCTopoJets', -# 'EMJet' :'AntiKt4EMTopoJets', -# 'PFlowJet' :'AntiKt4EMPFlowJets', -# 'Muon' :'Muons', -# 'Soft' :'', -# 'ClusColl' :'CaloCalTopoCluster', -# 'TrkColl' :'InDetTrackParticles', -# 'PrimVxColl':'PrimaryVertices', -# 'Truth' :'TruthParticle', -# } - prefix = 'METAssocConfig: ' ################################################################################# @@ -85,12 +69,12 @@ def getAssociator(config,suffix,doPFlow=False, tool = CfgMgr.met__METMuonAssociator('MET_MuonAssociator_'+suffix) if config.objType == 'Soft': tool = CfgMgr.met__METSoftAssociator('MET_SoftAssociator_'+suffix) + tool.DecorateSoftConst = True if doOriginCorrClus: tool.LCModClusterKey = defaultInputKey['LCOCClusColl'] tool.EMModClusterKey = defaultInputKey['EMOCClusColl'] if config.objType == 'Truth': tool = CfgMgr.met__METTruthAssociator('MET_TruthAssociator_'+suffix) - ToolSvc == tool tool.RecoJetKey = config.inputKey if doPFlow: pfotool = CfgMgr.CP__RetrievePFOTool('MET_PFOTool_'+suffix) @@ -116,11 +100,12 @@ def getAssociator(config,suffix,doPFlow=False, # tool.TrackSelectorTool = trkseltool # - tool.UseIsolationTools = False #True + tool.UseIsolationTools = True tool.TrackIsolationTool = trkisotool tool.CaloIsolationTool = caloisotool - ToolSvc += tool + if not hasattr(ToolSvc,tool.name()): + ToolSvc += tool return tool ################################################################################# @@ -175,14 +160,17 @@ class METAssocConfig: CutLevel="TightPrimary", maxZ0SinTheta=3, maxD0=2) - ToolSvc += self.trkseltool + if not hasattr(ToolSvc,self.trkseltool.name()): + ToolSvc += self.trkseltool self.trkisotool = CfgMgr.xAOD__TrackIsolationTool("TrackIsolationTool_MET") self.trkisotool.TrackSelectionTool = self.trkseltool # As configured above - ToolSvc += self.trkisotool + if not hasattr(ToolSvc,self.trkisotool.name()): + ToolSvc += self.trkisotool self.caloisotool = CfgMgr.xAOD__CaloIsolationTool("CaloIsolationTool_MET") - ToolSvc += self.caloisotool + if not hasattr(ToolSvc,self.caloisotool.name()): + ToolSvc += self.caloisotool self.associators = {} self.assoclist = [] # need an ordered list @@ -205,7 +193,8 @@ def getMETAssocTool(topconfig): assocTool = CfgMgr.met__METAssociationTool('MET_AssociationTool_'+topconfig.suffix, METAssociators = topconfig.assoclist, METSuffix = topconfig.suffix, - TCSignalState=tcstate) + TCSignalState=tcstate, + TimingDetail=0) if metFlags.AllowOverwrite: assocTool.AllowOverwrite = True return assocTool diff --git a/Reconstruction/MET/METReconstruction/python/METAssocConfig_readAOD.py b/Reconstruction/MET/METReconstruction/python/METAssocConfig_readAOD.py new file mode 100644 index 0000000000000000000000000000000000000000..51aa6d682256f85b9f99f905518454ef96e5b5cd --- /dev/null +++ b/Reconstruction/MET/METReconstruction/python/METAssocConfig_readAOD.py @@ -0,0 +1,240 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + + + +from AthenaCommon import CfgMgr + +################################################################################# +# Define some default values + +clusterSigStates = { + 'EMScale':0, + 'LocHad':1, + 'Mod':1 +} + +defaultInputKey = { + 'Ele' :'Electrons', + 'Gamma' :'Photons', + 'Tau' :'TauJets', + 'LCJet' :'AntiKt4LCTopoJets', + 'EMJet' :'AntiKt4EMTopoJets', + 'PFlowJet' :'AntiKt4EMPFlowJets', + 'Muon' :'Muons', + 'Soft' :'', + 'ClusColl' :'CaloCalTopoClusters', + 'TrkColl' :'InDetTrackParticles', + 'PrimVxColl':'PrimaryVertices', + 'Truth' :'TruthParticles', + 'LCOCClusColl':'LCOriginTopoClusters', + 'EMOCClusColl':'EMOriginTopoClusters', + } + +# # old naming scheme +# defaultInputKey = { +# 'Ele' :'ElectronCollection', +# 'Gamma' :'PhotonCollection', +# 'Tau' :'TauRecContainer', +# 'LCJet' :'AntiKt4LCTopoJets', +# 'EMJet' :'AntiKt4EMTopoJets', +# 'PFlowJet' :'AntiKt4EMPFlowJets', +# 'Muon' :'Muons', +# 'Soft' :'', +# 'ClusColl' :'CaloCalTopoCluster', +# 'TrkColl' :'InDetTrackParticles', +# 'PrimVxColl':'PrimaryVertices', +# 'Truth' :'TruthParticle', +# } + +prefix = 'METAssocConfig: ' + +################################################################################# +# Configuration of builders + +class AssocConfig: + def __init__(self,objType='',inputKey=''): + self.objType = objType + self.inputKey = inputKey + +def getAssociator(config,suffix,doPFlow=False, + trkseltool=None,trkisotool=None,caloisotool=None, + doOriginCorrClus=True): + tool = None + + import cppyy + try: cppyy.loadDictionary('METReconstructionDict') + except: pass + + from AthenaCommon.AppMgr import ToolSvc + # Construct tool and set defaults for case-specific configuration + if config.objType == 'Ele': + from ROOT import met + tool = CfgMgr.met__METElectronAssociator('MET_ElectronAssociator_'+suffix,TCMatchMethod=met.DeltaR) + if config.objType == 'Gamma': + from ROOT import met + tool = CfgMgr.met__METPhotonAssociator('MET_PhotonAssociator_'+suffix,TCMatchMethod=met.DeltaR) + if config.objType == 'Tau': + tool = CfgMgr.met__METTauAssociator('MET_TauAssociator_'+suffix) + if config.objType == 'LCJet': + tool = CfgMgr.met__METJetAssocTool('MET_LCJetAssocTool_'+suffix) + if config.objType == 'EMJet': + tool = CfgMgr.met__METJetAssocTool('MET_EMJetAssocTool_'+suffix) + if config.objType == 'PFlowJet': + tool = CfgMgr.met__METJetAssocTool('MET_PFlowJetAssocTool_'+suffix) + if config.objType == 'Muon': + tool = CfgMgr.met__METMuonAssociator('MET_MuonAssociator_'+suffix,DoClusterMatch=False) + if config.objType == 'Soft': + tool = CfgMgr.met__METSoftAssociator('MET_SoftAssociator_'+suffix) + if doOriginCorrClus: + tool.LCModClusterKey = defaultInputKey['LCOCClusColl'] + tool.EMModClusterKey = defaultInputKey['EMOCClusColl'] + if config.objType == 'Truth': + tool = CfgMgr.met__METTruthAssociator('MET_TruthAssociator_'+suffix) + ToolSvc == tool + tool.RecoJetKey = config.inputKey + if doPFlow: + pfotool = CfgMgr.CP__RetrievePFOTool('MET_PFOTool_'+suffix) + ToolSvc += pfotool + tool.PFOTool = pfotool + tool.PFlow = True + else: + tool.UseModifiedClus = doOriginCorrClus + + # set input/output key names + if config.inputKey == '': + tool.InputCollection = defaultInputKey[config.objType] + config.inputKey = tool.InputCollection + if doOriginCorrClus: + tool.ClusColl = defaultInputKey['LCOCClusColl'] + if 'EMTopo' in suffix: tool.ClusColl = defaultInputKey['EMOCClusColl'] + tool.TrkColl = defaultInputKey['TrkColl'] + else: + tool.InputCollection = config.inputKey + + from METReconstruction.METRecoFlags import metFlags + tool.UseTracks = metFlags.UseTracks() + # + tool.TrackSelectorTool = trkseltool + # + tool.UseIsolationTools = True + tool.TrackIsolationTool = trkisotool + tool.CaloIsolationTool = caloisotool + #tool.UseLowThreshold = False + + ToolSvc += tool + return tool + +################################################################################# +# Top level MET configuration + +class METAssocConfig: + def outputCollections(self): + if doTruth: return 'MET_Core_'+self.suffix + else: return 'MET_Core_'+self.suffix,'MET_Reference_'+self.suffix + # + def outputMap(self): + return 'METAssoc_'+self.suffix + return 'METAssoc_'+self.suffix + # + def setupAssociators(self,buildconfigs): + print prefix, 'Setting up associators for MET config '+self.suffix + for config in buildconfigs: + if config.objType in self.associators: + print prefix, 'Config '+self.suffix+' already contains a associator of type '+config.objType + raise LookupError + else: + associator = getAssociator(config=config,suffix=self.suffix, + doPFlow=self.doPFlow, + trkseltool=self.trkseltool, + trkisotool=self.trkisotool, + caloisotool=self.caloisotool, + doOriginCorrClus=self.doOriginCorrClus) + from METReconstruction.METRecoFlags import metFlags + if config.objType == 'Soft' and metFlags.DecorateSoftConst: + print "activate soft term decoration" + associator.DecorateSoftConst = True + self.associators[config.objType] = associator + self.assoclist.append(associator) + print prefix, ' Added '+config.objType+' tool named '+associator.name() + # + def __init__(self,suffix,buildconfigs=[], + doPFlow=False,doTruth=False, + trksel=None,doOriginCorrClus=False): + if doTruth: + print prefix, 'Creating MET TruthAssoc config \''+suffix+'\'' + else: + print prefix, 'Creating MET Assoc config \''+suffix+'\'' + self.suffix = suffix + self.doPFlow = doPFlow + self.doOriginCorrClus=doOriginCorrClus + self.doTruth = doTruth + from AthenaCommon.AppMgr import ToolSvc + if trksel: + self.trkseltool = trksel + else: + self.trkseltool=CfgMgr.InDet__InDetTrackSelectionTool("IDTrkSel_METAssoc", + CutLevel="TightPrimary", + maxZ0SinTheta=3, + maxD0=2) + ToolSvc += self.trkseltool + + self.trkisotool = CfgMgr.xAOD__TrackIsolationTool("TrackIsolationTool_MET") + self.trkisotool.TrackSelectionTool = self.trkseltool # As configured above + ToolSvc += self.trkisotool + + self.caloisotool = CfgMgr.xAOD__CaloIsolationTool("CaloIsolationTool_MET") + self.caloisotool.addCaloExtensionDecoration = False + ToolSvc += self.caloisotool + + self.associators = {} + self.assoclist = [] # need an ordered list + # + self.setupAssociators(buildconfigs) + +# Set up a top-level tool with mostly defaults +def getMETAssocTool(topconfig): + assocTool = None + from METReconstruction.METRecoFlags import metFlags + if topconfig.doTruth: + assocTool = CfgMgr.met__METAssociationTool('MET_TruthAssociationTool_'+topconfig.suffix, + METAssociators = topconfig.assoclist, + METSuffix = topconfig.suffix) + else: + tcstate = clusterSigStates['LocHad'] + if 'EMTopo' in topconfig.suffix: tcstate = clusterSigStates['EMScale'] + if topconfig.doOriginCorrClus: + tcstate = clusterSigStates['Mod'] + assocTool = CfgMgr.met__METAssociationTool('MET_AssociationTool_'+topconfig.suffix, + METAssociators = topconfig.assoclist, + METSuffix = topconfig.suffix, + TCSignalState=tcstate) + if metFlags.AllowOverwrite: + assocTool.AllowOverwrite = True + return assocTool + +# Allow user to configure reco tools directly or get more default configurations +def getMETAssocAlg(algName='METAssociation',configs={},tools=[]): + + assocTools = [] + assocTools += tools + + from METReconstruction.METRecoFlags import metFlags + if configs=={} and tools==[]: + print prefix, 'Taking configurations from METRecoFlags' + configs = metFlags.METAssocConfigs() + print configs + for key,conf in configs.iteritems(): + print prefix, 'Generate METAssocTool for MET_'+key + assoctool = getMETAssocTool(conf) + assocTools.append(assoctool) + metFlags.METAssocTools()[key] = assoctool + + from AthenaCommon.AppMgr import ToolSvc + for tool in assocTools: + ToolSvc += tool + print prefix, 'Added METAssocTool \''+tool.name()+'\' to alg '+algName + + assocAlg = CfgMgr.met__METRecoAlg(name=algName, + RecoTools=assocTools) +# assocAlg.OutputLevel=DEBUG + return assocAlg diff --git a/Reconstruction/MET/METReconstruction/python/METRecoConfig.py b/Reconstruction/MET/METReconstruction/python/METRecoConfig.py index 6bb49cbadaa0d2ac2604cd0ef1f1d6424be85e6d..012734561499553d0368e641d422ba7690eb2f71 100644 --- a/Reconstruction/MET/METReconstruction/python/METRecoConfig.py +++ b/Reconstruction/MET/METReconstruction/python/METRecoConfig.py @@ -98,7 +98,8 @@ def getBuilder(config,suffix,doTracks,doCells,doTriggerMET,doOriginCorrClus): tool.InputComposition = 'PFlow' pfotool = CfgMgr.CP__RetrievePFOTool('MET_PFOTool_'+suffix) from AthenaCommon.AppMgr import ToolSvc - ToolSvc += pfotool + if not hasattr(ToolSvc,pfotool.name()): + ToolSvc += pfotool tool.PFOTool = pfotool if suffix == 'Truth': tool = CfgMgr.met__METTruthTool('MET_TruthTool_'+config.objType) @@ -130,7 +131,8 @@ def getBuilder(config,suffix,doTracks,doCells,doTriggerMET,doOriginCorrClus): else: tool.MissingETKey = config.outputKey from AthenaCommon.AppMgr import ToolSvc - ToolSvc += tool + if not hasattr(ToolSvc,tool.name()): + ToolSvc += tool return tool ################################################################################# @@ -163,7 +165,8 @@ def getRefiner(config,suffix,trkseltool=None,trkvxtool=None,trkisotool=None,calo if config.type == 'MuonEloss': tool = CfgMgr.met__METMuonElossTool('MET_MuonElossTool_'+suffix) tool.MissingETKey = config.outputKey - ToolSvc += tool + if not hasattr(ToolSvc,tool.name()): + ToolSvc += tool return tool ################################################################################# @@ -178,7 +181,8 @@ def getRegions(config,suffix): tool.InputMETKey = config.outputKey tool.RegionValues = [ 1.5, 3.2, 10 ] from AthenaCommon.AppMgr import ToolSvc - ToolSvc += tool + if not hasattr(ToolSvc,tool.name()): + ToolSvc += tool return tool ################################################################################# @@ -258,20 +262,24 @@ class METConfig: # from AthenaCommon.AppMgr import ToolSvc self.trkseltool=CfgMgr.InDet__InDetTrackSelectionTool("IDTrkSel_MET", - CutLevel="TightPrimary", - maxZ0SinTheta=3, - maxD0=2) - ToolSvc += self.trkseltool + CutLevel="TightPrimary", + maxZ0SinTheta=3, + maxD0=2) + if not hasattr(ToolSvc,self.trkseltool.name()): + ToolSvc += self.trkseltool # self.trkvxtool=CfgMgr.CP__TightTrackVertexAssociationTool("TightTrackVertexAssociationTool_MET", dzSinTheta_cut=1.5, doPV=False) - ToolSvc += self.trkvxtool + if not hasattr(ToolSvc,self.trkvxtool.name()): + ToolSvc += self.trkvxtool # self.trkisotool = CfgMgr.xAOD__TrackIsolationTool("TrackIsolationTool_MET") self.trkisotool.TrackSelectionTool = self.trkseltool # As configured above - ToolSvc += self.trkisotool + if not hasattr(ToolSvc,self.trkisotool.name()): + ToolSvc += self.trkisotool # self.caloisotool = CfgMgr.xAOD__CaloIsolationTool("CaloIsolationTool_MET") - ToolSvc += self.caloisotool + if not hasattr(ToolSvc,self.caloisotool.name()): + ToolSvc += self.caloisotool self.setupBuilders(buildconfigs) self.setupRefiners(refconfigs) @@ -283,7 +291,8 @@ def getMETRecoTool(topconfig): METRefiners = topconfig.reflist, METContainer = topconfig.outputCollection(), METComponentMap = topconfig.outputMap(), - WarnIfDuplicate = topconfig.duplicateWarning) + WarnIfDuplicate = topconfig.duplicateWarning, + TimingDetail=0) if topconfig.doSum: recoTool.METFinalName = defaultOutputKey['Total'] diff --git a/Reconstruction/MET/METReconstruction/share/RunMETReco_Associator.py b/Reconstruction/MET/METReconstruction/share/RunMETReco_Associator.py index d492a6c814f789517ab88ee80f110db149465cbe..13bfe5d10313ed7a307e5f752f8b0881d8407ec7 100644 --- a/Reconstruction/MET/METReconstruction/share/RunMETReco_Associator.py +++ b/Reconstruction/MET/METReconstruction/share/RunMETReco_Associator.py @@ -3,17 +3,14 @@ from AthenaCommon.AthenaCommonFlags import athenaCommonFlags from AthenaCommon.AppMgr import ServiceMgr from AthenaCommon import CfgMgr -#import METReconstruction.METConfig_Calo - from RecExConfig.RecFlags import rec -#if rec.doTruth: -# import METReconstruction.METConfig_Truth filelist = [#"valid2.110401.PowhegPythia_P2012_ttbar_nonallhad.recon.AOD.e3099_s2578_r7226/AOD.06803710._000047.pool.root.1", #"valid2.110401.PowhegPythia_P2012_ttbar_nonallhad.recon.AOD.e3099_s2578_r7226/AOD.06803710._000254.pool.root.1", - "myESD.pool.root" +# "myESD.pool.root" # "/atlas/data1/userdata/khoo/Data15/mc15_ESD/mc15_13TeV.422008.ParticleGun_single_ele_Pt100.recon.ESD.e4459_s2726_r7143_tid06642056_00/ESD.06642056._000021.pool.root.1" -# "/atlas/data1/userdata/khoo/Data15/mc15_ESD/mc15_13TeV.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.recon.ESD.e3698_s2608_s2183_r7509_tid07497143_00/ESD.07497143._000004.pool.root.1" + "/atlas/data1/userdata/khoo/Data15/ESD/valid1.110401.PowhegPythia_P2012_ttbar_nonallhad.recon.ESD.e3099_s2578_r7579_r7578_r7579/ESD.07670800._003079.pool.root.1", + "/atlas/data1/userdata/khoo/Data15/ESD/valid1.110401.PowhegPythia_P2012_ttbar_nonallhad.recon.ESD.e3099_s2578_r7579_r7578_r7579/ESD.07670800._003152.pool.root.1" ] from AthenaCommon.AthenaCommonFlags import athenaCommonFlags athenaCommonFlags.FilesInput = filelist @@ -36,25 +33,37 @@ globalflags.DetDescrVersion = inputFileSummary['geometry'] from AthenaCommon.DetFlags import DetFlags DetFlags.detdescr.all_setOff() -#DetFlags.detdescr.Calo_setOn() +DetFlags.detdescr.Calo_setOn() if hasattr(DetFlags,'BField_on'): DetFlags.BField_setOn() +from TrkDetDescrSvc.AtlasTrackingGeometrySvc import AtlasTrackingGeometrySvc +AtlasTrackingGeometrySvc = svcMgr.AtlasTrackingGeometrySvc +#from AthenaCommon.CfgGetter import getService +#getService("AtlasTrackingGeometrySvc") include('RecExCond/AllDet_detDescr.py') from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() +############################################################################ +# Rerun the AntiKt4EMTopoJets with newer config + +from JetRec.JetRecStandard import jtm +jtm.addJetFinder("NewAntiKt4EMTopoJets", "AntiKt", 0.4, "emtopo", "calib", ghostArea=0.01, ptmin= 2000, ptminFilter= 5000, calibOpt="ar") +from JetRec.JetAlgorithm import addJetRecoToAlgSequence +addJetRecoToAlgSequence(eventShapeTools=[]) + ############################################################################ # Set up muon and egamma topocluster links -#egammaTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("EgammaTCLinks", -# ClustersToDecorate="egammaClusters") -#egammatopoTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("TopoEgammaTCLinks", -# ClustersToDecorate="egammaTopoSeededClusters") -#muonTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("MuonTCLinks", -# ClustersToDecorate="MuonClusterCollection", -# UseLeadCellEtaPhi=True) -#topSequence += egammaTCLinkAlg -#topSequence += egammatopoTCLinkAlg -# topSequence += muonTCLinkAlg +egammaTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("EgammaTCLinks", + ClustersToDecorate="egammaClusters") +egammatopoTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("TopoEgammaTCLinks", + ClustersToDecorate="egammaTopoSeededClusters") +muonTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("MuonTCLinks", + ClustersToDecorate="MuonClusterCollection", + UseLeadCellEtaPhi=True) +topSequence += egammaTCLinkAlg +topSequence += egammatopoTCLinkAlg +topSequence += muonTCLinkAlg # Set up default configurations #import METReconstruction.METConfig_Associator @@ -110,10 +119,10 @@ topSequence += metAlg from METUtilities.METMakerConfig import getMETMakerAlg for key,conf in metFlags.METAssocConfigs().iteritems(): if not conf.doTruth: - makerAlg = getMETMakerAlg(conf.suffix,jetColl="AntiKt4EMTopoJets") + makerAlg = getMETMakerAlg(conf.suffix,jetColl="NewAntiKt4EMTopoJets") topSequence += makerAlg -ToolSvc.METMaker_NewAntiKt4EMTopo.OutputLevel = DEBUG -ToolSvc.METMaker_NewAntiKt4EMTopo_OriginCorr.OutputLevel = DEBUG +#ToolSvc.METMaker_NewAntiKt4EMTopo.OutputLevel = DEBUG +#ToolSvc.METMaker_NewAntiKt4EMTopo_OriginCorr.OutputLevel = DEBUG from METReconstruction.METRecoConfig import METConfig,BuildConfig @@ -146,6 +155,7 @@ if write_xAOD: from AthenaCommon.Resilience import protectedInclude protectedInclude("METReconstruction/METReconstructionOutputAODList_jobOptions.py") + svcMgr.AthenaPoolCnvSvc.PoolAttributes += [ "DEFAULT_SPLITLEVEL ='99'" ] from OutputStreamAthenaPool.MultipleStreamManager import MSMgr xaodStream = MSMgr.NewPoolRootStream( "StreamAOD", "xAOD.pool.root" ) for item in MissingETAODList: @@ -154,6 +164,19 @@ if write_xAOD: xaodStream.AddItem('xAOD::MissingETContainer#MET_LocHadTopo') xaodStream.AddItem('xAOD::MissingETAuxContainer#MET_LocHadTopoAux.') -theApp.EvtMax = 10 + for jetrec in jtm.jetrecs: + xaodStream.AddItem("xAOD::JetContainer#" + jetrec.name()) + xaodStream.AddItem("xAOD::JetAuxContainer#" + jetrec.name() + "Aux.") + + xaodStream.AddItem("xAOD::CaloClusterContainer#EMOriginTopoClusters") + xaodStream.AddItem("xAOD::CaloClusterContainer#LCOriginTopoClusters") + xaodStream.AddItem("xAOD::ShallowAuxContainer#LCOriginTopoClustersAux.") + xaodStream.AddItem("xAOD::ShallowAuxContainer#EMOriginTopoClustersAux.") + +from Valkyrie.JobOptCfg import ValgrindSvc +svcMgr += ValgrindSvc( OutputLevel = VERBOSE, + ProfiledAlgs = ["jetalg","METAssociation"] ) + +theApp.EvtMax = 100 ServiceMgr.EventSelector.SkipEvents = 0 ServiceMgr.MessageSvc.defaultLimit = 9999 diff --git a/Reconstruction/MET/METReconstruction/share/RunMETReco_Associator_AOD.py b/Reconstruction/MET/METReconstruction/share/RunMETReco_Associator_AOD.py new file mode 100644 index 0000000000000000000000000000000000000000..c4aa17de227d2d350ca64b728358fe5484f28aff --- /dev/null +++ b/Reconstruction/MET/METReconstruction/share/RunMETReco_Associator_AOD.py @@ -0,0 +1,135 @@ +options=locals() +options.setdefault('EvtMax',10) +options.setdefault('UseIsolationTools',True) +options.setdefault('Inputfile',"/home/masaito/maxi183/datafiles/mc15_13TeV/AOD/mc15_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.merge.AOD.e3601_s2576_s2132_r7725_r7676/AOD.07918963._000185.pool.root.1") +options.setdefault('Outputfile',"xAOD.pool.root") + +import AthenaPoolCnvSvc.ReadAthenaPool +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from AthenaCommon.AppMgr import ServiceMgr +from AthenaCommon import CfgMgr + +#import METReconstruction.METConfig_Calo + +from RecExConfig.RecFlags import rec +#if rec.doTruth: +# import METReconstruction.METConfig_Truth + +filelist = [#"valid2.110401.PowhegPythia_P2012_ttbar_nonallhad.recon.AOD.e3099_s2578_r7226/AOD.06803710._000047.pool.root.1", + #"valid2.110401.PowhegPythia_P2012_ttbar_nonallhad.recon.AOD.e3099_s2578_r7226/AOD.06803710._000254.pool.root.1", +# "myESD.pool.root" +# "/atlas/data1/userdata/khoo/Data15/mc15_ESD/mc15_13TeV.422008.ParticleGun_single_ele_Pt100.recon.ESD.e4459_s2726_r7143_tid06642056_00/ESD.06642056._000021.pool.root.1" +# "/atlas/data1/userdata/khoo/Data15/mc15_ESD/mc15_13TeV.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.recon.ESD.e3698_s2608_s2183_r7509_tid07497143_00/ESD.07497143._000004.pool.root.1" +# "/atlas/data1/userdata/khoo/Data15/xAOD_20.7/mc15_13TeV.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.merge.AOD.e3698_s2608_s2183_r7725_r7676/AOD.07915894._000339.pool.root.1" +# "/home/masaito/data4/QualificationTask/MakeMETReconstruction_aodtoaod3_2/test01/run/output_new/AODM/output.AOD.pool.root" +# "/home/masaito/maxi183/datafiles/mc15_13TeV/AOD/mc15_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.merge.AOD.e3601_s2576_s2132_r7725_r7676/AOD.07918963._000185.pool.root.1" + ] +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +#athenaCommonFlags.FilesInput = filelist +athenaCommonFlags.FilesInput = [Inputfile] +ServiceMgr.EventSelector.InputCollections = athenaCommonFlags.FilesInput() + +############################################################################ +# Set up detector description for cell access + +from AthenaCommon.GlobalFlags import globalflags +globalflags.DetGeo = 'atlas' + +from RecExConfig.InputFilePeeker import inputFileSummary +print inputFileSummary +if inputFileSummary['evt_type'][0] == 'IS_DATA': + globalflags.DataSource = 'data' +else: + globalflags.DataSource = 'geant4' + +globalflags.DetDescrVersion = inputFileSummary['geometry'] + +from AthenaCommon.DetFlags import DetFlags +DetFlags.detdescr.all_setOff() +#DetFlags.detdescr.Calo_setOn() +if hasattr(DetFlags,'BField_on'): DetFlags.BField_setOn() +include('RecExCond/AllDet_detDescr.py') +include('TrkDetDescrSvc/AtlasTrackingGeometrySvc.py') + +from AthenaCommon.AlgSequence import AlgSequence +topSequence = AlgSequence() + +############################################################################ +# Set up muon and egamma topocluster links +#egammaTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("EgammaTCLinks", +# ClustersToDecorate="egammaClusters") +#egammatopoTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("TopoEgammaTCLinks", +# ClustersToDecorate="egammaTopoSeededClusters") +#muonTCLinkAlg = CfgMgr.ClusterMatching__CaloClusterMatchLinkAlg("MuonTCLinks", +# ClustersToDecorate="MuonClusterCollection", +# UseLeadCellEtaPhi=True) +#topSequence += egammaTCLinkAlg +#topSequence += egammatopoTCLinkAlg +# topSequence += muonTCLinkAlg + +# Set up default configurations +#import METReconstruction.METConfig_Associator + +#include('RecExCond/AllDet_detDescr.py') +from AthenaCommon.AlgSequence import AlgSequence +topSequence = AlgSequence() + +############################################################################ +# Set up an extra associator for testing +from METReconstruction.METRecoFlags import metFlags +from METReconstruction.METAssocConfig_readAOD import AssocConfig, METAssocConfig +JetType = 'EMJet' +#todo check pflow + +associators = [AssocConfig(JetType), + AssocConfig('Muon'), + AssocConfig('Ele'), + AssocConfig('Gamma'), + AssocConfig('Tau'), + AssocConfig('Soft')] +cfg_akt4em = METAssocConfig('NewAntiKt4EMTopo', + associators, + doPFlow=False, + doOriginCorrClus=False + ) +for assoc in cfg_akt4em.assoclist: + assoc.UseIsolationTools=UseIsolationTools + +metFlags.METAssocConfigs()[cfg_akt4em.suffix] = cfg_akt4em +metFlags.METAssocOutputList().append(cfg_akt4em.suffix) + +from METReconstruction.METAssocConfig import getMETAssocAlg + +# Get the configuration directly from METRecoFlags +# Can also provide a dict of configurations or list of RecoTools or both +metAlg = getMETAssocAlg('METAssociation') +topSequence += metAlg + +from METUtilities.METMakerConfig import getMETMakerAlg +for key,conf in metFlags.METAssocConfigs().iteritems(): + if not conf.doTruth: + makerAlg = getMETMakerAlg(conf.suffix,jetColl="AntiKt4EMTopoJets") + topSequence += makerAlg +#ToolSvc.METMaker_NewAntiKt4EMTopo.OutputLevel = DEBUG + +from METReconstruction.METRecoConfig import METConfig,BuildConfig + +write_xAOD = True +if write_xAOD: + + # The list of output containers/maps is autogenerated and stored in metFlags + # This jO extracts them with the appropriate formatting + from AthenaCommon.Resilience import protectedInclude + protectedInclude("METReconstruction/METReconstructionOutputAODList_jobOptions.py") + + from OutputStreamAthenaPool.MultipleStreamManager import MSMgr + xaodStream = MSMgr.NewPoolRootStream( "StreamAOD", Outputfile ) + for item in MissingETAODList: + xaodStream.AddItem(item) + + xaodStream.AddItem('xAOD::MissingETContainer#MET_Reference_AntiKt4EMTopo') + xaodStream.AddItem('xAOD::MissingETAuxContainer#MET_Reference_AntiKt4EMTopoAux.') + +theApp.EvtMax = EvtMax +ServiceMgr.EventSelector.SkipEvents = 0 +ServiceMgr.MessageSvc.defaultLimit = 9999