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',