CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/PhysicsTools/UtilAlgos/interface/EDFilterObjectWrapper.h

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       // create a collection of the objects to put into the event
00072       std::auto_ptr<C> objsToPut( new C() );
00073       // get the handle to the objects in the event.
00074       edm::Handle<C> h_c;     
00075       event.getByLabel( src_, h_c );
00076       // loop through and add passing value_types to the output vector
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       // put objs in the event
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