CMS 3D CMS Logo

FFTJetCorrectionESProducer.h
Go to the documentation of this file.
1 #ifndef JetMETCorrections_FFTJetModules_plugins_FFTJetCorrectionESProducer_h
2 #define JetMETCorrections_FFTJetModules_plugins_FFTJetCorrectionESProducer_h
3 
4 // -*- C++ -*-
5 //
6 // Package: FFTJetModules
7 // Class: FFTJetCorrectionESProducer
8 //
16 //
17 // Original Author: Igor Volobouev
18 // Created: Thu Aug 2 22:34:02 CDT 2012
19 //
20 //
21 
22 
23 // system include files
24 #include <sstream>
25 
26 #include <memory>
27 
28 #include "Alignment/Geners/interface/CompressedIO.hh"
29 
30 // user include files
36 
39 
44 
46 
47 //
48 // Don't make the function which builds the sequence
49 // a member of the producer class -- this way it gets
50 // instantiated only as many times as there are corrector
51 // sequence types but not as many times as there are
52 // record types.
53 //
54 template<class CorrectorSequence>
55 static void
57  const FFTJetCorrectorParameters& tablePars,
58  const std::vector<edm::ParameterSet>& sequence,
59  const bool isArchiveCompressed, const bool verbose,
60  CorrectorSequence* ptr)
61 {
62  typedef typename CorrectorSequence::Corrector Corrector;
63  typedef typename CorrectorSequence::jet_type jet_type;
64 
65  // Load the archive stored in the FFTJetCorrectorParameters object
66  CPP11_auto_ptr<gs::StringArchive> ar;
67  {
68  std::istringstream is(tablePars.str());
69  if (isArchiveCompressed)
70  ar = gs::read_compressed_item<gs::StringArchive>(is);
71  else
72  ar = gs::read_item<gs::StringArchive>(is);
73  }
74 
75  ptr->clear();
76 
77  // Go over the parameter sets in the VPSet and
78  // configure all correction levels. Add each new
79  // level to the sequence.
80  const unsigned nLevels = sequence.size();
81  for (unsigned lev=0; lev<nLevels; ++lev)
82  ptr->addCorrector(parseFFTJetCorrector<Corrector>(
83  sequence[lev], *ar, verbose));
84 
85  // Check for proper level order.
86  // Assume that level 0 is special and can happen anywhere.
87  unsigned previousLevel = 0;
88  for (unsigned lev=0; lev<nLevels; ++lev)
89  {
90  const unsigned level = (*ptr)[lev].level();
91  if (level)
92  {
93  if (level <= previousLevel)
94  throw cms::Exception("FFTJetBadConfig")
95  << "Error in buildCorrectorSequence: "
96  << "correction levels are out of order\n";
97  previousLevel = level;
98  }
99  }
100 }
101 
102 //
103 // class declaration
104 //
105 template<typename CT>
107 {
108 public:
109  // Lookup various types
111  typedef FFTJetCorrectorSequence<
112  jet_type,
116  typedef std::shared_ptr<CorrectorSequence> ReturnType;
119 
122 
123  ReturnType produce(const MyRecord&);
124 
125 private:
126 
127  // Module parameters
128  std::vector<edm::ParameterSet> sequence;
130  bool verbose;
131 
133  ParentRecord>;
135 };
136 
137 //
138 // constructors and destructor
139 //
140 template<typename CT>
142  const edm::ParameterSet& psIn)
143  : sequence(psIn.getParameter<std::vector<edm::ParameterSet> >("sequence")),
144  isArchiveCompressed(psIn.getParameter<bool>("isArchiveCompressed")),
145  verbose(psIn.getUntrackedParameter<bool>("verbose", false))
146 {
147  // The following line is needed to tell the framework what
148  // data is being produced
149  setWhatProduced(this);
150 }
151 
152 // ------------ method called to produce the data ------------
153 template<typename CT>
156 {
157  auto host = holder_.makeOrGet([]() {
158  return new HostType;
159  });
160 
161  host->template ifRecordChanges<ParentRecord>(iRecord,
162  [this,product=host.get()](auto const& rec) {
164  rec.get(parHandle);
165  buildCorrectorSequence<CorrectorSequence>(
166  *parHandle, sequence, isArchiveCompressed, verbose, product);
167  });
168 
169  return host;
170 }
171 
172 #endif // JetMETCorrections_FFTJetModules_plugins_FFTJetCorrectionESProducer_h
auto setWhatProduced(T *iThis, const es::Label &iLabel={})
Definition: ESProducer.h:124
host
Definition: query.py:115
const std::string & str() const
static void buildCorrectorSequence(const FFTJetCorrectorParameters &tablePars, const std::vector< edm::ParameterSet > &sequence, const bool isArchiveCompressed, const bool verbose, CorrectorSequence *ptr)
edm::ReusableObjectHolder< HostType > holder_
std::shared_ptr< T > makeOrGet(F iFunc)
If there isn&#39;t an object already available, creates a new one using iFunc.
FFTJetCorrectorParametersRcd< CT > ParentRecord
FFTJetCorrectionESProducer(const edm::ParameterSet &)
FFTJetCorrectionsTypemap< CT >::jet_type jet_type
ReturnType produce(const MyRecord &)
FFTJetCorrectorSequenceRcd< CT > MyRecord
HLT enums.
edm::ESProductHost< CorrectorSequence, ParentRecord > HostType
FFTJetCorrectorSequence< jet_type, FFTJetCorrectorTransientFromJet, FFTJetCorrectorResultFromTransient > CorrectorSequence
std::vector< edm::ParameterSet > sequence
std::shared_ptr< CorrectorSequence > ReturnType