Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-08 03:35:56

0001 #ifndef RecoAlgos_CandidateProducer_h
0002 #define RecoAlgos_CandidateProducer_h
0003 /** \class CandidateProducer
0004  *
0005  * Framework module that produces a collection
0006  * of candidates from generic compoment
0007  *
0008  * \author Luca Lista, INFN
0009  *
0010  * \version $Revision: 1.4 $
0011  *
0012  * $Id: CandidateProducer.h,v 1.4 2010/02/11 00:10:53 wmtan Exp $
0013  *
0014  */
0015 #include "CommonTools/UtilAlgos/interface/AnySelector.h"
0016 #include "CommonTools/UtilAlgos/interface/EventSetupInitTrait.h"
0017 #include "CommonTools/UtilAlgos/interface/MasterCollectionHelper.h"
0018 #include "DataFormats/Candidate/interface/CandidateFwd.h"
0019 #include "DataFormats/Common/interface/Handle.h"
0020 #include "FWCore/Framework/interface/Event.h"
0021 #include "FWCore/Framework/interface/stream/EDProducer.h"
0022 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0023 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0024 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
0025 #include "FWCore/Utilities/interface/InputTag.h"
0026 
0027 namespace converter {
0028   namespace helper {
0029     template <typename T>
0030     struct CandConverter {};
0031 
0032     struct ConcreteCreator {
0033       template <typename CColl, typename Comp, typename Conv>
0034       static void create(size_t idx, CColl& cands, const Comp& components, Conv& converter) {
0035         typename Conv::Candidate c;
0036         typedef edm::Ref<std::vector<typename Conv::value_type> > ref_type;
0037         ref_type ref = components.template getConcreteRef<ref_type>(idx);
0038         converter.convert(ref, c);
0039         cands.push_back(c);
0040       }
0041     };
0042 
0043     struct PolymorphicCreator {
0044       template <typename CColl, typename Comp, typename Conv>
0045       static void create(size_t idx, CColl& cands, const Comp& components, Conv& converter) {
0046         typename Conv::Candidate* c = new typename Conv::Candidate;
0047         typedef edm::Ref<std::vector<typename Conv::value_type> > ref_type;
0048         ref_type ref = components.template getConcreteRef<ref_type>(idx);
0049         converter.convert(ref, *c);
0050         cands.push_back(c);
0051       }
0052     };
0053 
0054     template <typename CColl>
0055     struct CandCreator {
0056       typedef ConcreteCreator type;
0057     };
0058 
0059     template <>
0060     struct CandCreator<reco::CandidateCollection> {
0061       typedef PolymorphicCreator type;
0062     };
0063   }  // namespace helper
0064 }  // namespace converter
0065 
0066 template <typename TColl,
0067           typename CColl,
0068           typename Selector = AnySelector,
0069           typename Conv = typename converter::helper::CandConverter<typename TColl::value_type>::type,
0070           typename Creator = typename converter::helper::CandCreator<CColl>::type,
0071           typename Init = typename ::reco::modules::EventSetupInit<Selector>::type>
0072 class CandidateProducer : public edm::stream::EDProducer<> {
0073 public:
0074   /// constructor from parameter set
0075   CandidateProducer(const edm::ParameterSet& cfg)
0076       : srcToken_(consumes<TColl>(cfg.template getParameter<edm::InputTag>("src"))),
0077         converter_(cfg, consumesCollector()),
0078         selectorInit_(consumesCollector()),
0079         selector_(reco::modules::make<Selector>(cfg, consumesCollector())),
0080         initialized_(false) {
0081     produces<CColl>();
0082   }
0083   /// destructor
0084   ~CandidateProducer() override {}
0085 
0086   /// fillDescriptions
0087   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0088     edm::ParameterSetDescription desc;
0089     desc.add<edm::InputTag>("src", edm::InputTag(""));
0090     Conv::fillPSetDescription(desc);
0091     descriptions.addWithDefaultLabel(desc);
0092   }
0093 
0094 private:
0095   /// begin job (first run)
0096   void beginRun(const edm::Run&, const edm::EventSetup& es) override {
0097     if (!initialized_) {
0098       converter_.beginFirstRun(es);
0099       initialized_ = true;
0100     }
0101   }
0102   /// process one event
0103   void produce(edm::Event& evt, const edm::EventSetup& es) override {
0104     edm::Handle<TColl> src;
0105     evt.getByToken(srcToken_, src);
0106     selectorInit_.init(selector_, evt, es);
0107     ::helper::MasterCollection<TColl> master(src, evt);
0108     std::unique_ptr<CColl> cands(new CColl);
0109     if (!src->empty()) {
0110       size_t size = src->size();
0111       cands->reserve(size);
0112       for (size_t idx = 0; idx != size; ++idx) {
0113         if (selector_((*src)[idx]))
0114           Creator::create(master.index(idx), *cands, master, converter_);
0115       }
0116     }
0117     evt.put(std::move(cands));
0118   }
0119   /// label of source collection and tag
0120   edm::EDGetTokenT<TColl> srcToken_;
0121   /// converter helper
0122   Conv converter_;
0123   /// selector
0124   Init selectorInit_;
0125   Selector selector_;
0126   /// particles initialized?
0127   bool initialized_;
0128 };
0129 
0130 #endif