Go to the documentation of this file.00001 #ifndef RecoAlgos_ObjectPairFilter_h
00002 #define RecoAlgos_ObjectPairFilter_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 <vector>
00021 #include <algorithm>
00022
00023 template<typename C, typename S>
00024 class ObjectPairFilter : public edm::EDFilter {
00025 public:
00027 explicit ObjectPairFilter( const edm::ParameterSet & cfg ) :
00028 select_( reco::modules::make<S>( cfg ) ),
00029 src_( cfg.template getParameter<edm::InputTag>( "src" ) ),
00030 minNumber_( 1 ) {
00031 std::vector<std::string> ints = cfg.template getParameterNamesForType<unsigned int>();
00032 const std::string minNumber( "minNumber" );
00033 bool foundMinNumber = std::find( ints.begin(), ints.end(), minNumber ) != ints.end();
00034 if ( foundMinNumber )
00035 minNumber_ = cfg.template getParameter<unsigned int>( minNumber );
00036 }
00037
00038 private:
00040 bool filter( edm::Event& evt, const edm::EventSetup& ) {
00041 edm::Handle<C> source;
00042 evt.getByLabel( src_, source );
00043 size_t n = 0;
00044 for( typename C::const_iterator i = source->begin(); i != source->end(); ++ i )
00045 for( typename C::const_iterator j = i + 1; j != source->end(); ++ j ) {
00046 if ( select_( * i, * j ) ) n ++;
00047 if ( n >= minNumber_ ) return true;
00048 }
00049 return false;
00050 }
00052 S select_;
00054 edm::InputTag src_;
00056 unsigned int minNumber_;
00057 };
00058
00059 #endif