Go to the documentation of this file.00001 #ifndef PhysicsTools_UtilAlgos_interface_EDFilterObjectWrapper_h
00002 #define PhysicsTools_UtilAlgos_interface_EDFilterObjectWrapper_h
00003
00040 #include "FWCore/Framework/interface/EDFilter.h"
00041 #include "FWCore/Common/interface/EventBase.h"
00042 #include "FWCore/Framework/interface/Event.h"
00043 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00044 #include <boost/shared_ptr.hpp>
00045
00046 namespace edm {
00047
00048 template<class T, class C>
00049 class FilterObjectWrapper : public EDFilter {
00050
00051 public:
00053 typename C::iterator iterator;
00054 typename C::const_iterator const_iterator;
00055
00057 FilterObjectWrapper(const edm::ParameterSet& cfg) : src_( cfg.getParameter<edm::InputTag>("src"))
00058 {
00059 filter_ = boost::shared_ptr<T>( new T(cfg.getParameter<edm::ParameterSet>("filterParams")) );
00060 if ( cfg.exists("filter") ) {
00061 doFilter_ = cfg.getParameter<bool>("filter");
00062 } else {
00063 doFilter_ = false;
00064 }
00065 produces<C>();
00066 }
00068 virtual ~FilterObjectWrapper(){}
00070 virtual bool filter(edm::Event& event, const edm::EventSetup& eventSetup){
00071
00072 std::auto_ptr<C> objsToPut( new C() );
00073
00074 edm::Handle<C> h_c;
00075 event.getByLabel( src_, h_c );
00076
00077 for ( typename C::const_iterator ibegin = h_c->begin(), iend = h_c->end(), i = ibegin; i != iend; ++i ){
00078 if ( (*filter_)(*i) ){
00079 objsToPut->push_back( *i );
00080 }
00081 }
00082
00083 bool pass = objsToPut->size() > 0;
00084 event.put(objsToPut);
00085 if ( doFilter_ )
00086 return pass;
00087 else
00088 return true;
00089 }
00090
00091 protected:
00093 edm::InputTag src_;
00095 boost::shared_ptr<T> filter_;
00097 bool doFilter_;
00098 };
00099
00100 }
00101
00102 #endif