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