CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CommonTools/UtilAlgos/interface/ObjectSelector.h

Go to the documentation of this file.
00001 #ifndef RecoAlgos_ObjectSelector_h
00002 #define RecoAlgos_ObjectSelector_h
00003 
00015 #include "FWCore/Framework/interface/EDFilter.h"
00016 #include "FWCore/Framework/interface/Event.h"
00017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00018 #include "FWCore/Utilities/interface/InputTag.h"
00019 #include "CommonTools/UtilAlgos/interface/ParameterAdapter.h"
00020 #include "CommonTools/UtilAlgos/interface/NonNullNumberSelector.h"
00021 #include "CommonTools/UtilAlgos/interface/StoreManagerTrait.h"
00022 #include "CommonTools/UtilAlgos/interface/SelectedOutputCollectionTrait.h"
00023 #include "CommonTools/UtilAlgos/interface/NullPostProcessor.h"
00024 #include "CommonTools/UtilAlgos/interface/EventSetupInitTrait.h"
00025 #include <utility>
00026 #include <vector>
00027 #include <memory>
00028 #include <algorithm>
00029 
00030 template<typename Selector, 
00031          typename OutputCollection = typename ::helper::SelectedOutputCollectionTrait<typename Selector::collection>::type,
00032          typename SizeSelector = NonNullNumberSelector,
00033          typename PostProcessor = ::helper::NullPostProcessor<OutputCollection>,
00034          typename StoreManager = typename ::helper::StoreManagerTrait<OutputCollection>::type,
00035          typename Base = typename ::helper::StoreManagerTrait<OutputCollection>::base,
00036          typename Init = typename ::reco::modules::EventSetupInit<Selector>::type
00037          >
00038 class ObjectSelector : public Base {
00039 public:
00041   explicit ObjectSelector(const edm::ParameterSet & cfg) :
00042     Base(cfg),
00043     src_(cfg.template getParameter<edm::InputTag>("src")),
00044     filter_(false),
00045     selector_(cfg),
00046     sizeSelector_(reco::modules::make<SizeSelector>(cfg)),
00047     postProcessor_(cfg) {
00048     const std::string filter("filter");
00049     std::vector<std::string> bools = cfg.template getParameterNamesForType<bool>();
00050     bool found = std::find(bools.begin(), bools.end(), filter) != bools.end();
00051     if (found) filter_ = cfg.template getParameter<bool>(filter);
00052     postProcessor_.init(* this);
00053    }
00055   virtual ~ObjectSelector() { }
00056   
00057 private:
00059   bool filter(edm::Event& evt, const edm::EventSetup& es) {
00060     Init::init(selector_, evt, es);
00061     using namespace std;
00062     edm::Handle<typename Selector::collection> source;
00063     evt.getByLabel(src_, source);
00064     StoreManager manager(source);
00065     selector_.select(source, evt, es);
00066     manager.cloneAndStore(selector_.begin(), selector_.end(), evt);
00067     bool result = (! filter_ || sizeSelector_(manager.size()));
00068     edm::OrphanHandle<OutputCollection> filtered = manager.put(evt);
00069     postProcessor_.process(filtered, evt);
00070     return result;
00071   }
00073   edm::InputTag src_;
00075   bool filter_;
00077   Selector selector_;
00079   SizeSelector sizeSelector_;
00081   PostProcessor postProcessor_;
00082 };
00083 
00084 #endif