diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py index 6e63fd26a26ea961a8029a9d9068e24b051802f2..59178d829fe7a55edf2347fdd90ec5cea17aaf9b 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py @@ -307,48 +307,24 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare, isPhyslite, noPhysliteB # Now make view containers for the inputs to the met calculation - metInputs = { 'jets' : 'METJets_%SYS%', - 'taus' : 'METTauJets_%SYS%', - 'muons' : 'METMuons_%SYS%', - 'electrons' : 'METElectrons_%SYS%', - 'photons' : 'METPhotons_%SYS%' } - viewalg = createAlgorithm( 'CP::AsgViewFromSelectionAlg','METElectronsViewAlg' ) - viewalg.selection = [ 'selectPtEta', 'baselineSelection_loose,as_char' ] - viewalg.input = 'AnaElectrons_%SYS%' - viewalg.output = 'METElectrons_%SYS%' - algSeq += viewalg - - viewalg = createAlgorithm( 'CP::AsgViewFromSelectionAlg','METPhotonsViewAlg' ) - viewalg.selection = [ 'selectPtEta', 'baselineSelection_tight,as_char' ] - viewalg.input = 'AnaPhotons_%SYS%' - viewalg.output = 'METPhotons_%SYS%' - algSeq += viewalg - - viewalg = createAlgorithm( 'CP::AsgViewFromSelectionAlg','METMuonsViewAlg' ) - viewalg.selection = [ 'selectPtEta', 'baselineSelection_medium,as_char' ] - viewalg.input = 'AnaMuons_%SYS%' - viewalg.output = 'METMuons_%SYS%' - algSeq += viewalg - - viewalg = createAlgorithm( 'CP::AsgViewFromSelectionAlg','METTauJetsViewAlg' ) - viewalg.selection = [ 'selectPtEta', 'baselineSelection_tight,as_char' ] - viewalg.input = 'AnaTauJets_%SYS%' - viewalg.output = 'METTauJets_%SYS%' - algSeq += viewalg - - viewalg = createAlgorithm( 'CP::AsgViewFromSelectionAlg','METJetsViewAlg' ) - viewalg.selection = [ 'selectPtEta' ] - viewalg.input = 'AnaJets_%SYS%' - viewalg.output = 'METJets_%SYS%' - algSeq += viewalg - + metInputs = { 'jets' : 'AnaJets_%SYS%', + 'taus' : 'AnaTauJets_%SYS%', + 'muons' : 'AnaMuons_%SYS%', + 'electrons' : 'AnaElectrons_%SYS%', + 'photons' : 'AnaPhotons_%SYS%' } # Include, and then set up the met analysis algorithm sequence: from MetAnalysisAlgorithms.MetAnalysisSequence import makeMetAnalysisSequence if isPhyslite : metSuffix = 'AnalysisMET' else : metSuffix = jetContainer[:-4] - metSequence = makeMetAnalysisSequence( dataType, metSuffix=metSuffix ) + metSequence = makeMetAnalysisSequence( + dataType, + metSuffix=metSuffix, + electronsSelection = "selectPtEta && baselineSelection_loose,as_char", + photonsSelection = "selectPtEta && baselineSelection_tight,as_char", + muonsSelection = "selectPtEta && baselineSelection_medium,as_char", + tausSelection = "selectPtEta && baselineSelection_tight,as_char" ) metSequence.configure( inputName = metInputs, outputName = 'AnaMET_%SYS%' ) diff --git a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/CMakeLists.txt b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/CMakeLists.txt index 42956163c631a8ff34bb833baf9f1c4e83396ae6..0078e635f9e234b50c5ca50090ff4bc42af6bf99 100644 --- a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/CMakeLists.txt +++ b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/CMakeLists.txt @@ -20,10 +20,8 @@ atlas_depends_on_subdirs( atlas_add_library( MetAnalysisAlgorithmsLib MetAnalysisAlgorithms/*.h MetAnalysisAlgorithms/*.icc Root/*.cxx PUBLIC_HEADERS MetAnalysisAlgorithms - LINK_LIBRARIES xAODMissingET - SystematicsHandlesLib AnaAlgorithmLib METInterface - SelectionHelpersLib METUtilitiesLib - PRIVATE_LINK_LIBRARIES ) + LINK_LIBRARIES AnaAlgorithmLib METInterface SystematicsHandlesLib SelectionHelpersLib xAODBase xAODMissingET + PRIVATE_LINK_LIBRARIES METUtilitiesLib xAODEventInfo ) atlas_add_dictionary( MetAnalysisAlgorithmsDict MetAnalysisAlgorithms/MetAnalysisAlgorithmsDict.h diff --git a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/MetAnalysisAlgorithms/MetMakerAlg.h b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/MetAnalysisAlgorithms/MetMakerAlg.h index 7bf2b28ef695af5a800f2f5625e25439f53a99d0..81f688c9c6e89dd9ac668d7fff41dbd21df828b5 100644 --- a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/MetAnalysisAlgorithms/MetMakerAlg.h +++ b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/MetAnalysisAlgorithms/MetMakerAlg.h @@ -13,6 +13,7 @@ #include <SystematicsHandles/SysReadHandle.h> #include <SystematicsHandles/SysWriteHandle.h> #include <SystematicsHandles/SysListHandle.h> +#include <SelectionHelpers/SysReadSelectionHandle.h> #include <METInterface/IMETMaker.h> #include <METInterface/IMETSystematicsTool.h> @@ -73,6 +74,11 @@ namespace CP SysReadHandle<xAOD::IParticleContainer> m_electronsHandle { this, "electrons", "", "the electron container to use" }; + /// \brief the selection on the input electrons + private: + SysReadSelectionHandle m_electronsSelection { + this, "electronsSelection", "", "the selection on the input electrons" }; + /// \brief the key for \ref m_electronsHandle private: std::string m_electronsKey {"RefEle"}; @@ -82,6 +88,11 @@ namespace CP SysReadHandle<xAOD::IParticleContainer> m_photonsHandle { this, "photons", "", "the photon container to use" }; + /// \brief the selection on the input photons + private: + SysReadSelectionHandle m_photonsSelection { + this, "photonsSelection", "", "the selection on the input photons" }; + /// \brief the key for \ref m_photonsHandle private: std::string m_photonsKey {"RefGamma"}; @@ -91,6 +102,11 @@ namespace CP SysReadHandle<xAOD::IParticleContainer> m_muonsHandle { this, "muons", "", "the muon container to use" }; + /// \brief the selection on the input muons + private: + SysReadSelectionHandle m_muonsSelection { + this, "muonsSelection", "", "the selection on the input muons" }; + /// \brief the key for \ref m_muonsHandle private: std::string m_muonsKey {"Muons"}; @@ -100,6 +116,11 @@ namespace CP SysReadHandle<xAOD::IParticleContainer> m_tausHandle { this, "taus", "", "the tau container to use" }; + /// \brief the selection on the input taus + private: + SysReadSelectionHandle m_tausSelection { + this, "tausSelection", "", "the selection on the input taus" }; + /// \brief the key for \ref m_tausHandle private: std::string m_tausKey {"RefTau"}; diff --git a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/Root/MetMakerAlg.cxx b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/Root/MetMakerAlg.cxx index cf0bed632ba197da5760a1cd2c3d1b974aa81e4b..dab90141394f8464388913493e317ab20307df04 100644 --- a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/Root/MetMakerAlg.cxx +++ b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/Root/MetMakerAlg.cxx @@ -14,6 +14,8 @@ #include <xAODMissingET/MissingETAuxContainer.h> +#include "AthContainers/ConstDataVector.h" + // // method implementations // @@ -52,6 +54,10 @@ namespace CP &m_muonsHandle, &m_tausHandle, &m_invisHandle}) { ANA_CHECK (handle->initialize (m_systematicsList, SG::AllowEmpty)); } + ANA_CHECK (m_electronsSelection.initialize(m_systematicsList, m_electronsHandle, SG::AllowEmpty)); + ANA_CHECK (m_muonsSelection.initialize(m_systematicsList, m_muonsHandle, SG::AllowEmpty)); + ANA_CHECK (m_photonsSelection.initialize(m_systematicsList, m_photonsHandle, SG::AllowEmpty)); + ANA_CHECK (m_tausSelection.initialize(m_systematicsList, m_tausHandle, SG::AllowEmpty)); ANA_CHECK (m_jetsHandle.initialize (m_systematicsList)); ANA_CHECK (m_metHandle.initialize (m_systematicsList)); @@ -95,6 +101,7 @@ namespace CP // (and photons). auto processParticles = [&] (SysReadHandle<xAOD::IParticleContainer>& handle, + SysReadSelectionHandle &selection, xAOD::Type::ObjectType type, const std::string& term) -> StatusCode { if (!handle) { @@ -102,19 +109,24 @@ namespace CP } const xAOD::IParticleContainer* particles = nullptr; ANA_CHECK (handle.retrieve (particles, sys)); + ConstDataVector<xAOD::IParticleContainer> selected(SG::VIEW_ELEMENTS); + for (const xAOD::IParticle *particle : *particles) + if (selection.getBool(*particle, sys)) + selected.push_back(particle); ANA_CHECK (m_makerTool->rebuildMET (term, type, met.get(), - particles, metMap)); + selected.asDataVector(), metMap)); return StatusCode::SUCCESS; }; // Calculate the terms coming from the user's selected objects. - ANA_CHECK (processParticles (m_electronsHandle, xAOD::Type::Electron, - m_electronsKey)); - ANA_CHECK (processParticles (m_photonsHandle, xAOD::Type::Photon, - m_photonsKey)); - ANA_CHECK (processParticles (m_tausHandle, xAOD::Type::Tau, m_tausKey)); - ANA_CHECK (processParticles (m_muonsHandle, xAOD::Type::Muon, - m_muonsKey)); + ANA_CHECK (processParticles (m_electronsHandle, m_electronsSelection, + xAOD::Type::Electron, m_electronsKey)); + ANA_CHECK (processParticles (m_photonsHandle, m_photonsSelection, + xAOD::Type::Photon, m_photonsKey)); + ANA_CHECK (processParticles (m_tausHandle, m_tausSelection, + xAOD::Type::Tau, m_tausKey)); + ANA_CHECK (processParticles (m_muonsHandle, m_muonsSelection, + xAOD::Type::Muon, m_muonsKey)); const xAOD::JetContainer *jets {nullptr}; ANA_CHECK (m_jetsHandle.retrieve (jets, sys)); diff --git a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisAlgorithmsTest.py b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisAlgorithmsTest.py index c51ad766950e9d3a31c63ac05822b9547bea13dc..986335c7b60ca3695424221c63298293a77cdba2 100644 --- a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisAlgorithmsTest.py +++ b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisAlgorithmsTest.py @@ -26,7 +26,7 @@ def makeSequence (dataType) : # that the input container is non-const eleCopyAlg = createAlgorithm( 'CP::AsgShallowCopyAlg', 'MetEleCopyAlg' ) eleCopyAlg.input = 'Electrons' - eleCopyAlg.output = 'DecorElectrons_%SYS%' + eleCopyAlg.output = 'METElectrons_%SYS%' algSeq += eleCopyAlg @@ -35,19 +35,16 @@ def makeSequence (dataType) : selalg.selectionTool.minPt = 10e3 selalg.selectionTool.maxEta = 2.47 selalg.selectionDecoration = 'selectPtEta' - selalg.particles = 'DecorElectrons_%SYS%' + selalg.particles = 'METElectrons_%SYS%' algSeq += selalg - # Now make a view container holding only the electrons for the MET calculation - viewalg = createAlgorithm( 'CP::AsgViewFromSelectionAlg','METEleViewAlg' ) - viewalg.selection = [ 'selectPtEta' ] - viewalg.input = 'DecorElectrons_%SYS%' - viewalg.output = 'METElectrons_%SYS%' - algSeq += viewalg - # Include, and then set up the met analysis algorithm sequence: from MetAnalysisAlgorithms.MetAnalysisSequence import makeMetAnalysisSequence - metSequence = makeMetAnalysisSequence( dataType, metSuffix = jetContainer[:-4] ) + metSequence = makeMetAnalysisSequence( + dataType, + metSuffix = jetContainer[:-4], + electronsSelection = 'selectPtEta' + ) metSequence.configure( inputName = { 'jets' : 'AnalysisJets_%SYS%', 'muons' : 'Muons', 'electrons' : 'METElectrons_%SYS%' }, diff --git a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisSequence.py b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisSequence.py index 0308e697696ecc2ab340c4cb949c4147b29b7250..24b821b71ade70e50ced67bce874c44b79ee1f1c 100644 --- a/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisSequence.py +++ b/PhysicsAnalysis/Algorithms/MetAnalysisAlgorithms/python/MetAnalysisSequence.py @@ -7,7 +7,11 @@ from AnaAlgorithm.DualUseConfig import createAlgorithm, addPrivateTool def makeMetAnalysisSequence( dataType, metSuffix, postfix = '', useFJVT = True, - treatPUJets = True ): + treatPUJets = True, + electronsSelection = "", + muonsSelection = "", + photonsSelection = "", + tausSelection = ""): """Create a met analysis algorithm sequence After creating the sequence object, it needs to be configured with a call @@ -25,6 +29,8 @@ def makeMetAnalysisSequence( dataType, metSuffix, Note that defining a jet container is mandatory, but all other input containers are optional. + Selections on each container can also be defined + Keyword arguments: dataType -- The data type to run on ("data", "mc" or "afii") metSuffix -- Suffix for the (core) MET objects to use from the input @@ -57,6 +63,10 @@ def makeMetAnalysisSequence( dataType, metSuffix, addPrivateTool( alg, 'systematicsTool', 'met::METSystematicsTool' ) alg.metCore = 'MET_Core_' + metSuffix alg.metAssociation = 'METAssoc_' + metSuffix + alg.electronsSelection = electronsSelection + alg.muonsSelection = muonsSelection + alg.photonsSelection = photonsSelection + alg.tausSelection = tausSelection seq.append( alg, inputPropName = { 'jets' : 'jets', 'electrons' : 'electrons',