Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-05 23:51:10

0001 #ifndef CommonTools_UtilAlgos_OverlapExclusionSelector_h
0002 #define CommonTools_UtilAlgos_OverlapExclusionSelector_h
0003 
0004 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "FWCore/Utilities/interface/InputTag.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/Framework/interface/ConsumesCollector.h"
0009 #include "DataFormats/Common/interface/Handle.h"
0010 
0011 namespace edm {
0012   class EventSetup;
0013 }
0014 
0015 template <typename C, typename T, typename O>
0016 class OverlapExclusionSelector {
0017 public:
0018   OverlapExclusionSelector(const edm::ParameterSet& cfg, edm::ConsumesCollector&& iC)
0019       : OverlapExclusionSelector(cfg, iC) {}
0020   OverlapExclusionSelector(const edm::ParameterSet& cfg, edm::ConsumesCollector& iC);
0021   void newEvent(const edm::Event&, const edm::EventSetup&) const;
0022   bool operator()(const T&) const;
0023 
0024   static void fillPSetDescription(edm::ParameterSetDescription& desc) {
0025     desc.add<edm::InputTag>("overlap", edm::InputTag(""));
0026   }
0027 
0028 private:
0029   edm::EDGetTokenT<C> srcToken_;
0030   mutable typename C::const_iterator begin_, end_;
0031   O overlap_;
0032 };
0033 
0034 template <typename C, typename T, typename O>
0035 OverlapExclusionSelector<C, T, O>::OverlapExclusionSelector(const edm::ParameterSet& cfg, edm::ConsumesCollector& iC)
0036     : srcToken_(iC.consumes<C>(cfg.template getParameter<edm::InputTag>("overlap"))), overlap_(cfg) {}
0037 
0038 template <typename C, typename T, typename O>
0039 void OverlapExclusionSelector<C, T, O>::newEvent(const edm::Event& evt, const edm::EventSetup&) const {
0040   edm::Handle<C> h;
0041   evt.getByToken(srcToken_, h);
0042   begin_ = h->begin();
0043   end_ = h->end();
0044 }
0045 
0046 template <typename C, typename T, typename O>
0047 bool OverlapExclusionSelector<C, T, O>::operator()(const T& t) const {
0048   bool noOverlap = true;
0049   for (typename C::const_iterator i = begin_; i != end_; ++i) {
0050     if (overlap_(*i, t)) {
0051       noOverlap = false;
0052       break;
0053     }
0054   }
0055   return noOverlap;
0056 }
0057 
0058 #include "CommonTools/UtilAlgos/interface/EventSetupInitTrait.h"
0059 
0060 EVENTSETUP_STD_INIT_T3(OverlapExclusionSelector);
0061 
0062 #endif