CMS 3D CMS Logo

MEtoEDMConverter.cc
Go to the documentation of this file.
1 
9 // framework & common header files
24 
25 //DQM services
28 
29 #include "classlib/utils/StringList.h"
30 #include "classlib/utils/StringOps.h"
31 
32 // helper files
33 #include <iostream>
34 #include <cstdlib>
35 #include <string>
36 #include <memory>
37 #include <vector>
38 #include <map>
39 #include <cassert>
40 #include <cstdint>
41 
42 #include "TString.h"
43 #include "TH1F.h"
44 #include "TH1S.h"
45 #include "TH1D.h"
46 #include "TH1I.h"
47 #include "TH2F.h"
48 #include "TH2S.h"
49 #include "TH2D.h"
50 #include "TH2I.h"
51 #include "TH3F.h"
52 #include "TProfile.h"
53 #include "TProfile2D.h"
54 #include "TObjString.h"
55 
56 namespace meedm {
57  struct Void {};
58 } // namespace meedm
59 
60 //Using RunCache and LuminosityBlockCache tells the framework the module is able to
61 // allow multiple concurrent Runs and LuminosityBlocks.
62 
63 class MEtoEDMConverter : public edm::one::EDProducer<edm::RunCache<meedm::Void>,
64  edm::LuminosityBlockCache<meedm::Void>,
65  edm::EndLuminosityBlockProducer,
66  edm::EndRunProducer,
67  edm::one::SharedResources> {
68 public:
71 
72  explicit MEtoEDMConverter(const edm::ParameterSet&);
73  ~MEtoEDMConverter() override;
74  void beginJob() override;
75  void produce(edm::Event&, const edm::EventSetup&) override;
76  std::shared_ptr<meedm::Void> globalBeginRun(edm::Run const&, const edm::EventSetup&) const override;
77  void globalEndRun(edm::Run const&, const edm::EventSetup&) override;
78  void endRunProduce(edm::Run&, const edm::EventSetup&) override;
81  std::shared_ptr<meedm::Void> globalBeginLuminosityBlock(edm::LuminosityBlock const&,
82  edm::EventSetup const&) const override;
83 
84  template <class T>
85  void putData(DQMStore::IGetter& g, T& iPutTo, bool iLumiOnly, uint32_t run, uint32_t lumi);
86 
87  using TagList = std::vector<uint32_t>;
88 
89 private:
91  int verbosity;
92  int frequency;
94 
95  // private statistics information
96  std::map<int, int> iCount;
97 
98 }; // end class declaration
99 
100 using namespace lat;
101 
103  std::string MsgLoggerCat = "MEtoEDMConverter_MEtoEDMConverter";
104 
105  // get information from parameter set
106  fName = iPSet.getUntrackedParameter<std::string>("Name", "MEtoEDMConverter");
107  verbosity = iPSet.getUntrackedParameter<int>("Verbosity", 0);
108  frequency = iPSet.getUntrackedParameter<int>("Frequency", 50);
109  path = iPSet.getUntrackedParameter<std::string>("MEPathToSave");
110  // use value of first digit to determine default output level (inclusive)
111  // 0 is none, 1 is basic, 2 is fill output, 3 is gather output
112  verbosity %= 10;
113 
114  // print out Parameter Set information being used
115  if (verbosity >= 0) {
116  edm::LogInfo(MsgLoggerCat) << "\n===============================\n"
117  << "Initialized as EDProducer with parameter values:\n"
118  << " Name = " << fName << "\n"
119  << " Verbosity = " << verbosity << "\n"
120  << " Frequency = " << frequency << "\n"
121  << " Path = " << path << "\n"
122  << "===============================\n";
123  }
124 
125  std::string sName;
126 
127  // create persistent objects
128 
129  sName = fName + "Run";
130  produces<MEtoEDM<TH1F>, edm::Transition::EndRun>(sName);
131  produces<MEtoEDM<TH1S>, edm::Transition::EndRun>(sName);
132  produces<MEtoEDM<TH1D>, edm::Transition::EndRun>(sName);
133  produces<MEtoEDM<TH1I>, edm::Transition::EndRun>(sName);
134  produces<MEtoEDM<TH2F>, edm::Transition::EndRun>(sName);
135  produces<MEtoEDM<TH2S>, edm::Transition::EndRun>(sName);
136  produces<MEtoEDM<TH2D>, edm::Transition::EndRun>(sName);
137  produces<MEtoEDM<TH2I>, edm::Transition::EndRun>(sName);
138  produces<MEtoEDM<TH3F>, edm::Transition::EndRun>(sName);
139  produces<MEtoEDM<TProfile>, edm::Transition::EndRun>(sName);
140  produces<MEtoEDM<TProfile2D>, edm::Transition::EndRun>(sName);
141  produces<MEtoEDM<double>, edm::Transition::EndRun>(sName);
142  produces<MEtoEDM<long long>, edm::Transition::EndRun>(sName);
143  produces<MEtoEDM<TString>, edm::Transition::EndRun>(sName);
144 
145  sName = fName + "Lumi";
146  produces<MEtoEDM<TH1F>, edm::Transition::EndLuminosityBlock>(sName);
147  produces<MEtoEDM<TH1S>, edm::Transition::EndLuminosityBlock>(sName);
148  produces<MEtoEDM<TH1D>, edm::Transition::EndLuminosityBlock>(sName);
149  produces<MEtoEDM<TH1I>, edm::Transition::EndLuminosityBlock>(sName);
150  produces<MEtoEDM<TH2F>, edm::Transition::EndLuminosityBlock>(sName);
151  produces<MEtoEDM<TH2S>, edm::Transition::EndLuminosityBlock>(sName);
152  produces<MEtoEDM<TH2D>, edm::Transition::EndLuminosityBlock>(sName);
153  produces<MEtoEDM<TH2I>, edm::Transition::EndLuminosityBlock>(sName);
154  produces<MEtoEDM<TH3F>, edm::Transition::EndLuminosityBlock>(sName);
155  produces<MEtoEDM<TProfile>, edm::Transition::EndLuminosityBlock>(sName);
156  produces<MEtoEDM<TProfile2D>, edm::Transition::EndLuminosityBlock>(sName);
157  produces<MEtoEDM<double>, edm::Transition::EndLuminosityBlock>(sName);
158  produces<MEtoEDM<long long>, edm::Transition::EndLuminosityBlock>(sName);
159  produces<MEtoEDM<TString>, edm::Transition::EndLuminosityBlock>(sName);
160 
161  consumesMany<DQMToken, edm::InLumi>();
162  consumesMany<DQMToken, edm::InRun>();
163  usesResource("DQMStore");
164 
165  static_assert(sizeof(int64_t) == sizeof(long long), "type int64_t is not the same length as long long");
166 }
167 
169 
171 
172 std::shared_ptr<meedm::Void> MEtoEDMConverter::globalBeginRun(edm::Run const& iRun,
173  const edm::EventSetup& iSetup) const {
174  return std::shared_ptr<meedm::Void>();
175 }
176 
177 void MEtoEDMConverter::globalEndRun(edm::Run const& iRun, const edm::EventSetup& iSetup) {}
178 
181  store->meBookerGetter([&](DQMStore::IBooker& b, DQMStore::IGetter& g) { putData(g, iRun, false, iRun.run(), 0); });
182 }
183 
185  edm::EventSetup const&) const {
186  return std::shared_ptr<meedm::Void>();
187 }
188 
192  putData(g, iLumi, true, iLumi.run(), iLumi.id().luminosityBlock());
193  });
194 }
195 
196 template <class T>
197 void MEtoEDMConverter::putData(DQMStore::IGetter& iGetter, T& iPutTo, bool iLumiOnly, uint32_t run, uint32_t lumi) {
198  std::string MsgLoggerCat = "MEtoEDMConverter_putData";
199 
200  if (verbosity > 0)
201  edm::LogInfo(MsgLoggerCat) << "\nStoring MEtoEDM dataformat histograms.";
202 
203  // extract ME information into vectors
204  std::vector<MonitorElement*>::iterator mmi, mme;
205  std::vector<MonitorElement*> items(iGetter.getAllContents(path, run, lumi));
206 
207  unsigned int n1F = 0;
208  unsigned int n1S = 0;
209  unsigned int n1D = 0;
210  unsigned int n1I = 0;
211  unsigned int n2F = 0;
212  unsigned int n2S = 0;
213  unsigned int n2D = 0;
214  unsigned int n2I = 0;
215  unsigned int n3F = 0;
216  unsigned int nProf = 0;
217  unsigned int nProf2 = 0;
218  unsigned int nDouble = 0;
219  unsigned int nInt64 = 0;
220  unsigned int nString = 0;
221 
222  for (mmi = items.begin(), mme = items.end(); mmi != mme; ++mmi) {
223  MonitorElement* me = *mmi;
224 
225  // store only flagged ME at endLumi transition, and Run-based
226  // histo at endRun transition
227  if (iLumiOnly && !me->getLumiFlag())
228  continue;
229  if (!iLumiOnly && me->getLumiFlag())
230  continue;
231 
232  switch (me->kind()) {
234  ++nInt64;
235  break;
236 
238  ++nDouble;
239  break;
240 
242  ++nString;
243  break;
244 
246  ++n1F;
247  break;
248 
250  ++n1S;
251  break;
252 
254  ++n1D;
255  break;
256 
258  ++n1I;
259  break;
260 
262  ++n2F;
263  break;
264 
266  ++n2S;
267  break;
268 
270  ++n2D;
271  break;
272 
274  ++n2I;
275  break;
276 
278  ++n3F;
279  break;
280 
282  ++nProf;
283  break;
284 
286  ++nProf2;
287  break;
288 
289  default:
290  edm::LogError(MsgLoggerCat) << "ERROR: The DQM object '" << me->getFullname()
291  << "' is neither a ROOT object nor a recognised "
292  << "simple object.\n";
293  continue;
294  }
295  }
296 
297  std::unique_ptr<MEtoEDM<long long> > pOutInt(new MEtoEDM<long long>(nInt64));
298  std::unique_ptr<MEtoEDM<double> > pOutDouble(new MEtoEDM<double>(nDouble));
299  std::unique_ptr<MEtoEDM<TString> > pOutString(new MEtoEDM<TString>(nString));
300  std::unique_ptr<MEtoEDM<TH1F> > pOut1(new MEtoEDM<TH1F>(n1F));
301  std::unique_ptr<MEtoEDM<TH1S> > pOut1s(new MEtoEDM<TH1S>(n1S));
302  std::unique_ptr<MEtoEDM<TH1D> > pOut1d(new MEtoEDM<TH1D>(n1D));
303  std::unique_ptr<MEtoEDM<TH1I> > pOut1i(new MEtoEDM<TH1I>(n1I));
304  std::unique_ptr<MEtoEDM<TH2F> > pOut2(new MEtoEDM<TH2F>(n2F));
305  std::unique_ptr<MEtoEDM<TH2S> > pOut2s(new MEtoEDM<TH2S>(n2S));
306  std::unique_ptr<MEtoEDM<TH2D> > pOut2d(new MEtoEDM<TH2D>(n2D));
307  std::unique_ptr<MEtoEDM<TH2I> > pOut2i(new MEtoEDM<TH2I>(n2I));
308  std::unique_ptr<MEtoEDM<TH3F> > pOut3(new MEtoEDM<TH3F>(n3F));
309  std::unique_ptr<MEtoEDM<TProfile> > pOutProf(new MEtoEDM<TProfile>(nProf));
310  std::unique_ptr<MEtoEDM<TProfile2D> > pOutProf2(new MEtoEDM<TProfile2D>(nProf2));
311 
312  for (mmi = items.begin(), mme = items.end(); mmi != mme; ++mmi) {
313  MonitorElement* me = *mmi;
314 
315  // store only flagged ME at endLumi transition, and Run-based
316  // histo at endRun transition
317  // DQMStore should only hand out matching MEs
318  assert(iLumiOnly == me->getLumiFlag());
319 
320  // get monitor elements
321  switch (me->kind()) {
323  pOutInt->putMEtoEdmObject(me->getFullname(), me->getIntValue());
324  break;
325 
327  pOutDouble->putMEtoEdmObject(me->getFullname(), me->getFloatValue());
328  break;
329 
331  pOutString->putMEtoEdmObject(me->getFullname(), me->getStringValue());
332  break;
333 
335  pOut1->putMEtoEdmObject(me->getFullname(), *me->getTH1F());
336  break;
337 
339  pOut1s->putMEtoEdmObject(me->getFullname(), *me->getTH1S());
340  break;
341 
343  pOut1d->putMEtoEdmObject(me->getFullname(), *me->getTH1D());
344  break;
345 
347  pOut1i->putMEtoEdmObject(me->getFullname(), *me->getTH1I());
348  break;
349 
351  pOut2->putMEtoEdmObject(me->getFullname(), *me->getTH2F());
352  break;
353 
355  pOut2s->putMEtoEdmObject(me->getFullname(), *me->getTH2S());
356  break;
357 
359  pOut2d->putMEtoEdmObject(me->getFullname(), *me->getTH2D());
360  break;
361 
363  pOut2i->putMEtoEdmObject(me->getFullname(), *me->getTH2I());
364  break;
365 
367  pOut3->putMEtoEdmObject(me->getFullname(), *me->getTH3F());
368  break;
369 
371  pOutProf->putMEtoEdmObject(me->getFullname(), *me->getTProfile());
372  break;
373 
375  pOutProf2->putMEtoEdmObject(me->getFullname(), *me->getTProfile2D());
376  break;
377 
378  default:
379  edm::LogError(MsgLoggerCat) << "ERROR: The DQM object '" << me->getFullname()
380  << "' is neither a ROOT object nor a recognised "
381  << "simple object.\n";
382  continue;
383  }
384 
385  } // end loop through monitor elements
386 
387  std::string sName;
388 
389  if (iLumiOnly) {
390  sName = fName + "Lumi";
391  } else {
392  sName = fName + "Run";
393  }
394 
395  // produce objects to put in events
396  iPutTo.put(std::move(pOutInt), sName);
397  iPutTo.put(std::move(pOutDouble), sName);
398  iPutTo.put(std::move(pOutString), sName);
399  iPutTo.put(std::move(pOut1), sName);
400  iPutTo.put(std::move(pOut1s), sName);
401  iPutTo.put(std::move(pOut1d), sName);
402  iPutTo.put(std::move(pOut2), sName);
403  iPutTo.put(std::move(pOut2s), sName);
404  iPutTo.put(std::move(pOut2d), sName);
405  iPutTo.put(std::move(pOut2i), sName);
406  iPutTo.put(std::move(pOut3), sName);
407  iPutTo.put(std::move(pOutProf), sName);
408  iPutTo.put(std::move(pOutProf2), sName);
409 }
410 
412 
LuminosityBlockNumber_t luminosityBlock() const
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
dqm::legacy::DQMStore DQMStore
~MEtoEDMConverter() override
Log< level::Error, false > LogError
void endRunProduce(edm::Run &, const edm::EventSetup &) override
assert(be >=bs)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
std::vector< uint32_t > TagList
void beginJob() override
T getUntrackedParameter(std::string const &, T const &) const
void produce(edm::Event &, const edm::EventSetup &) override
int iEvent
Definition: GenABIO.cc:224
RunNumber_t run() const
Definition: RunBase.h:40
std::shared_ptr< meedm::Void > globalBeginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) const override
virtual std::vector< dqm::harvesting::MonitorElement * > getAllContents(std::string const &path) const
Definition: DQMStore.cc:609
std::shared_ptr< meedm::Void > globalBeginRun(edm::Run const &, const edm::EventSetup &) const override
void meBookerGetter(iFunc f)
Definition: DQMStore.h:709
void globalEndRun(edm::Run const &, const edm::EventSetup &) override
Log< level::Info, false > LogInfo
LuminosityBlockID id() const
std::map< int, int > iCount
double b
Definition: hdecay.h:118
dqm::legacy::MonitorElement MonitorElement
MEtoEDMConverter(const edm::ParameterSet &)
void putData(DQMStore::IGetter &g, T &iPutTo, bool iLumiOnly, uint32_t run, uint32_t lumi)
long double T
void globalEndLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
def move(src, dest)
Definition: eostools.py:511
void endLuminosityBlockProduce(edm::LuminosityBlock &, const edm::EventSetup &) override
Definition: Run.h:45