Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-31 02:19:53

0001 #ifndef RecoBTau_JetTagComputerESProducer_h
0002 #define RecoBTau_JetTagComputerESProducer_h
0003 
0004 #include <string>
0005 #include <memory>
0006 #include <type_traits>
0007 
0008 #include "FWCore/Framework/interface/ESProducer.h"
0009 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h"
0012 #include "RecoBTau/JetTagComputer/interface/JetTagComputer.h"
0013 
0014 /**
0015  * The idea here is to provide two implementations for
0016  * JetTagConmputerESProducer: one for those ConcreteJetTagComputers
0017  * that consume ES products and thus need the ESGetTokens, and one for
0018  * those that do not. All ConcreteJetTagComputers are required to have
0019  * a nested type called 'Tokens'.
0020  *
0021  * Those that need the ESGetTokens should define the nested type as a
0022  * struct/class containing the ESGetTokens and a constructor taking
0023  * edm::ParameterSet and edm::ESConsumesCollector as arguments. In
0024  * this case the constructor of ConcreteJetTagComputer takes this
0025  * 'Tokens' object as an additional argument.
0026  *
0027  * Those that do not need ESGetTokens should define the nested type as
0028  * void, and in this case no further modifications are needed.
0029  */
0030 namespace jet_tag_computer_esproducer_impl {
0031   template <typename ConcreteJetTagComputer, bool>
0032   class JetTagComputerESProducer : public edm::ESProducer {
0033   private:
0034     // check that the template parameter inherits from JetTagComputer
0035     static_assert(std::is_convertible_v<ConcreteJetTagComputer*, JetTagComputer*>);
0036 
0037   public:
0038     using Tokens = typename ConcreteJetTagComputer::Tokens;
0039 
0040     JetTagComputerESProducer(const edm::ParameterSet& pset)
0041         : m_tokens(pset, setWhatProduced(this, pset.getParameter<std::string>("@module_label"))), m_pset(pset) {}
0042 
0043     std::unique_ptr<JetTagComputer> produce(const JetTagComputerRecord& record) {
0044       std::unique_ptr<JetTagComputer> jetTagComputer = std::make_unique<ConcreteJetTagComputer>(m_pset, m_tokens);
0045       jetTagComputer->initialize(record);
0046       jetTagComputer->setupDone();
0047       return jetTagComputer;
0048     }
0049 
0050     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0051       edm::ParameterSetDescription desc;
0052       ConcreteJetTagComputer::fillPSetDescription(desc);
0053       descriptions.addWithDefaultLabel(desc);
0054     }
0055 
0056   private:
0057     const Tokens m_tokens;
0058     const edm::ParameterSet m_pset;
0059   };
0060 
0061   template <typename ConcreteJetTagComputer>
0062   class JetTagComputerESProducer<ConcreteJetTagComputer, true> : public edm::ESProducer {
0063   private:
0064     // check that the template parameter inherits from JetTagComputer
0065     static_assert(std::is_convertible_v<ConcreteJetTagComputer*, JetTagComputer*>);
0066 
0067   public:
0068     JetTagComputerESProducer(const edm::ParameterSet& pset) : m_pset(pset) {
0069       setWhatProduced(this, pset.getParameter<std::string>("@module_label"));
0070     }
0071 
0072     std::unique_ptr<JetTagComputer> produce(const JetTagComputerRecord& record) {
0073       std::unique_ptr<JetTagComputer> jetTagComputer = std::make_unique<ConcreteJetTagComputer>(m_pset);
0074       jetTagComputer->initialize(record);
0075       jetTagComputer->setupDone();
0076       return jetTagComputer;
0077     }
0078 
0079     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0080       edm::ParameterSetDescription desc;
0081       ConcreteJetTagComputer::fillPSetDescription(desc);
0082       descriptions.addWithDefaultLabel(desc);
0083     }
0084 
0085   private:
0086     const edm::ParameterSet m_pset;
0087   };
0088 }  // namespace jet_tag_computer_esproducer_impl
0089 
0090 template <typename T>
0091 using JetTagComputerESProducer =
0092     jet_tag_computer_esproducer_impl::JetTagComputerESProducer<T, std::is_same_v<typename T::Tokens, void>>;
0093 
0094 #endif  // RecoBTau_JetTagComputerESProducer_h