Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-20 03:45:12

0001 #ifndef RecoAlgos_ObjectSelectorBase_h
0002 #define RecoAlgos_ObjectSelectorBase_h
0003 /** \class ObjectSelectorBase
0004  *
0005  * selects a subset of a collection.
0006  *
0007  * \author Luca Lista, INFN
0008  *
0009  * \version $Revision: 1.3 $
0010  *
0011  * $Id: ObjectSelectorBase.h,v 1.3 2010/02/20 20:55:27 wmtan Exp $
0012  *
0013  */
0014 
0015 #include "FWCore/Framework/interface/Event.h"
0016 #include "FWCore/Framework/interface/ConsumesCollector.h"
0017 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0020 #include "FWCore/Utilities/interface/InputTag.h"
0021 #include "CommonTools/UtilAlgos/interface/ParameterAdapter.h"
0022 #include <utility>
0023 #include <vector>
0024 #include <memory>
0025 #include <algorithm>
0026 
0027 template <typename Selector,
0028           typename OutputCollection,
0029           typename SizeSelector,
0030           typename PostProcessor,
0031           typename StoreManager,
0032           typename Base,
0033           typename Init>
0034 class ObjectSelectorBase : public Base {
0035 public:
0036   /// constructor
0037   // ObjectSelectorBase()=default;
0038   explicit ObjectSelectorBase(const edm::ParameterSet& cfg)
0039       : Base(cfg),
0040         srcToken_(
0041             this->template consumes<typename Selector::collection>(cfg.template getParameter<edm::InputTag>("src"))),
0042         filter_(false),
0043         throwOnMissing_(cfg.getUntrackedParameter<bool>("throwOnMissing", true)),
0044         selectorInit_(this->consumesCollector()),
0045         selector_(cfg, this->consumesCollector()),
0046         sizeSelector_(reco::modules::make<SizeSelector>(cfg)),
0047         postProcessor_(cfg, this->consumesCollector()) {
0048     const std::string filter("filter");
0049     std::vector<std::string> bools = cfg.template getParameterNamesForType<bool>();
0050     bool found = std::find(bools.begin(), bools.end(), filter) != bools.end();
0051     if (found)
0052       filter_ = cfg.template getParameter<bool>(filter);
0053     postProcessor_.init(*this);
0054   }
0055   /// destructor
0056   ~ObjectSelectorBase() override {}
0057 
0058   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0059     edm::ParameterSetDescription desc;
0060     desc.add<edm::InputTag>("src", edm::InputTag(""));
0061     Selector::fillPSetDescription(desc);
0062     desc.add<bool>("filter", false);
0063     desc.addUntracked<bool>("throwOnMissing", true);
0064     descriptions.addWithDefaultLabel(desc);
0065   }
0066 
0067 private:
0068   /// process one event
0069   bool filter(edm::Event& evt, const edm::EventSetup& es) override {
0070     selectorInit_.init(selector_, evt, es);
0071     edm::Handle<typename Selector::collection> source;
0072     evt.getByToken(srcToken_, source);
0073     // if throwOnMissing is false, but the input source is not valid
0074     // allow all events to pass
0075     if (!throwOnMissing_ && !source.isValid()) {
0076       return !filter_;
0077     }
0078 
0079     StoreManager manager(source);
0080     selector_.select(source, evt, es);
0081     manager.cloneAndStore(selector_.begin(), selector_.end(), evt);
0082     bool result = (!filter_ || sizeSelector_(manager.size()));
0083     edm::OrphanHandle<OutputCollection> filtered = manager.put(evt);
0084     postProcessor_.process(filtered, evt);
0085     return result;
0086   }
0087   /// source collection label
0088   edm::EDGetTokenT<typename Selector::collection> srcToken_;
0089   /// filter event
0090   bool filter_;
0091   /// trhow on missing
0092   bool throwOnMissing_;
0093   /// Object collection selector
0094   Init selectorInit_;
0095   Selector selector_;
0096   /// selected object collection size selector
0097   SizeSelector sizeSelector_;
0098   /// post processor
0099   PostProcessor postProcessor_;
0100 };
0101 
0102 #endif