|
||||
File indexing completed on 2024-04-06 12:24:17
0001 #ifndef PhysicsTools_UtilAlgos_interface_EDFilterObjectWrapper_h 0002 #define PhysicsTools_UtilAlgos_interface_EDFilterObjectWrapper_h 0003 0004 /** 0005 \class EDFilterObjectWrapper EDFilterObjectWrapper.h "PhysicsTools/UtilAlgos/interface/EDFilterObjectWrapper.h" 0006 \brief Wrapper class for a class of type BasicFilter to "convert" it into a full EDFilter 0007 0008 This template class is a wrapper round classes of type Selector<T> and similar signature. 0009 It operates on container classes of type C which roughly satisfy std::vector template 0010 parameters. 0011 0012 From this class the wrapper expects the following member functions: 0013 0014 + a contructor with a const edm::ParameterSet& as input. 0015 + a filter function that operates on classes of type C::value_type 0016 0017 the function is called within the wrapper. The wrapper translates the common class into 0018 a basic EDFilter as shown below: 0019 0020 #include "PhysicsTools/UtilAlgos/interface/EDFilterObjectWrapper.h" 0021 #include "PhysicsTools/SelectorUtils/interface/PFJetIdSelectionFunctor.h" 0022 typedef edm::FilterWrapper<PFJetIdSelectionFunctor> PFJetIdFilter; 0023 0024 #include "FWCore/Framework/interface/MakerMacros.h" 0025 DEFINE_FWK_MODULE(PFJetIdFilter); 0026 0027 You can find this example in PhysicsTools/UtilAlgos/plugins/JetIDSelectionFunctorFilter.cc. 0028 In the first place the module will act as an EDProducer: it will put a new collection 0029 containing the selected objects into the event. Depending on the choice of parameter _filter_ 0030 it will discard events for which the collection of selected events is empty. It will such also 0031 act as an EDFilter and thus is specified as such. The parameter _filter_ does not need to be 0032 specified. 0033 0034 NOTE: in the current implementation this wrapper class does not support use of the EventSetup. 0035 If you want to make use of this feature we recommend you to start from an EDProducer from the 0036 very beginning and just to stay within the full framework. 0037 */ 0038 0039 #include "FWCore/Framework/interface/stream/EDFilter.h" 0040 #include "FWCore/Common/interface/EventBase.h" 0041 #include "FWCore/Framework/interface/Event.h" 0042 #include "FWCore/ParameterSet/interface/ParameterSet.h" 0043 0044 namespace edm { 0045 0046 template <class T, class C> 0047 class FilterObjectWrapper : public edm::stream::EDFilter<> { 0048 public: 0049 /// some convenient typedefs. Recall that C is a container class. 0050 typename C::iterator iterator; 0051 typename C::const_iterator const_iterator; 0052 0053 /// default contructor. Declares the output (type "C") and the filter (of type T, operates on C::value_type) 0054 FilterObjectWrapper(const edm::ParameterSet& cfg) : src_(consumes<C>(cfg.getParameter<edm::InputTag>("src"))) { 0055 filter_ = std::shared_ptr<T>(new T(cfg.getParameter<edm::ParameterSet>("filterParams"))); 0056 if (cfg.exists("filter")) { 0057 doFilter_ = cfg.getParameter<bool>("filter"); 0058 } else { 0059 doFilter_ = false; 0060 } 0061 produces<C>(); 0062 } 0063 /// default destructor 0064 ~FilterObjectWrapper() override {} 0065 /// everything which has to be done during the event loop. NOTE: We can't use the eventSetup in FWLite so ignore it 0066 bool filter(edm::Event& event, const edm::EventSetup& eventSetup) override { 0067 // create a collection of the objects to put into the event 0068 auto objsToPut = std::make_unique<C>(); 0069 // get the handle to the objects in the event. 0070 edm::Handle<C> h_c; 0071 event.getByToken(src_, h_c); 0072 // loop through and add passing value_types to the output vector 0073 for (typename C::const_iterator ibegin = h_c->begin(), iend = h_c->end(), i = ibegin; i != iend; ++i) { 0074 if ((*filter_)(*i)) { 0075 objsToPut->push_back(*i); 0076 } 0077 } 0078 // put objs in the event 0079 bool pass = !objsToPut->empty(); 0080 event.put(std::move(objsToPut)); 0081 if (doFilter_) 0082 return pass; 0083 else 0084 return true; 0085 } 0086 0087 protected: 0088 /// InputTag of the input source 0089 edm::EDGetTokenT<C> src_; 0090 /// shared pointer to analysis class of type BasicAnalyzer 0091 std::shared_ptr<T> filter_; 0092 /// whether or not to filter based on size 0093 bool doFilter_; 0094 }; 0095 0096 } // namespace edm 0097 0098 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.2.1 LXR engine. The LXR team |