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