CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MEtoEDMConverter.cc
Go to the documentation of this file.
1 
2 
10 #include <cassert>
11 
13 #include "classlib/utils/StringList.h"
14 #include "classlib/utils/StringOps.h"
17 
18 using namespace lat;
19 
21  std::string MsgLoggerCat = "MEtoEDMConverter_MEtoEDMConverter";
22 
23  // get information from parameter set
24  fName = iPSet.getUntrackedParameter<std::string>("Name", "MEtoEDMConverter");
25  verbosity = iPSet.getUntrackedParameter<int>("Verbosity", 0);
26  frequency = iPSet.getUntrackedParameter<int>("Frequency", 50);
27  path = iPSet.getUntrackedParameter<std::string>("MEPathToSave");
28  enableMultiThread_ = false;
29  // use value of first digit to determine default output level (inclusive)
30  // 0 is none, 1 is basic, 2 is fill output, 3 is gather output
31  verbosity %= 10;
32 
33  // print out Parameter Set information being used
34  if (verbosity >= 0) {
35  edm::LogInfo(MsgLoggerCat) << "\n===============================\n"
36  << "Initialized as EDProducer with parameter values:\n"
37  << " Name = " << fName << "\n"
38  << " Verbosity = " << verbosity << "\n"
39  << " Frequency = " << frequency << "\n"
40  << " Path = " << path << "\n"
41  << "===============================\n";
42  }
43 
44  std::string sName;
45 
46  // create persistent objects
47 
48  sName = fName + "Run";
49  produces<MEtoEDM<TH1F>, edm::Transition::EndRun>(sName);
50  produces<MEtoEDM<TH1S>, edm::Transition::EndRun>(sName);
51  produces<MEtoEDM<TH1D>, edm::Transition::EndRun>(sName);
52  produces<MEtoEDM<TH2F>, edm::Transition::EndRun>(sName);
53  produces<MEtoEDM<TH2S>, edm::Transition::EndRun>(sName);
54  produces<MEtoEDM<TH2D>, edm::Transition::EndRun>(sName);
55  produces<MEtoEDM<TH3F>, edm::Transition::EndRun>(sName);
56  produces<MEtoEDM<TProfile>, edm::Transition::EndRun>(sName);
57  produces<MEtoEDM<TProfile2D>, edm::Transition::EndRun>(sName);
58  produces<MEtoEDM<double>, edm::Transition::EndRun>(sName);
59  produces<MEtoEDM<long long>, edm::Transition::EndRun>(sName);
60  produces<MEtoEDM<TString>, edm::Transition::EndRun>(sName);
61 
62  sName = fName + "Lumi";
63  produces<MEtoEDM<TH1F>, edm::Transition::EndLuminosityBlock>(sName);
64  produces<MEtoEDM<TH1S>, edm::Transition::EndLuminosityBlock>(sName);
65  produces<MEtoEDM<TH1D>, edm::Transition::EndLuminosityBlock>(sName);
66  produces<MEtoEDM<TH2F>, edm::Transition::EndLuminosityBlock>(sName);
67  produces<MEtoEDM<TH2S>, edm::Transition::EndLuminosityBlock>(sName);
68  produces<MEtoEDM<TH2D>, edm::Transition::EndLuminosityBlock>(sName);
69  produces<MEtoEDM<TH3F>, edm::Transition::EndLuminosityBlock>(sName);
70  produces<MEtoEDM<TProfile>, edm::Transition::EndLuminosityBlock>(sName);
71  produces<MEtoEDM<TProfile2D>, edm::Transition::EndLuminosityBlock>(sName);
72  produces<MEtoEDM<double>, edm::Transition::EndLuminosityBlock>(sName);
73  produces<MEtoEDM<long long>, edm::Transition::EndLuminosityBlock>(sName);
74  produces<MEtoEDM<TString>, edm::Transition::EndLuminosityBlock>(sName);
75 
76  consumesMany<DQMToken, edm::InLumi>();
77  consumesMany<DQMToken, edm::InRun>();
78  usesResource("DQMStore");
79 
80  static_assert(sizeof(int64_t) == sizeof(long long), "type int64_t is not the same length as long long");
81 }
82 
84 
86  // Determine if we are running multithreading asking to the DQMStore. Not to be moved in the ctor
89 }
90 
92 
93 std::shared_ptr<meedm::Void> MEtoEDMConverter::globalBeginRun(edm::Run const& iRun,
94  const edm::EventSetup& iSetup) const {
95  return std::shared_ptr<meedm::Void>();
96 }
97 
98 void MEtoEDMConverter::globalEndRun(edm::Run const& iRun, const edm::EventSetup& iSetup) {}
99 
102  store->meBookerGetter([&](DQMStore::IBooker& b, DQMStore::IGetter& g) { putData(g, iRun, false, iRun.run(), 0); });
103 }
104 
106  edm::EventSetup const&) const {
107  return std::shared_ptr<meedm::Void>();
108 }
109 
113  putData(g, iLumi, true, iLumi.run(), iLumi.id().luminosityBlock());
114  });
115 }
116 
117 template <class T>
118 void MEtoEDMConverter::putData(DQMStore::IGetter& iGetter, T& iPutTo, bool iLumiOnly, uint32_t run, uint32_t lumi) {
119  std::string MsgLoggerCat = "MEtoEDMConverter_putData";
120 
121  if (verbosity > 0)
122  edm::LogInfo(MsgLoggerCat) << "\nStoring MEtoEDM dataformat histograms.";
123 
124  // extract ME information into vectors
125  std::vector<MonitorElement*>::iterator mmi, mme;
126  std::vector<MonitorElement*> items(
127  iGetter.getAllContents(path, enableMultiThread_ ? run : 0, enableMultiThread_ ? lumi : 0));
128 
129  unsigned int n1F = 0;
130  unsigned int n1S = 0;
131  unsigned int n1D = 0;
132  unsigned int n2F = 0;
133  unsigned int n2S = 0;
134  unsigned int n2D = 0;
135  unsigned int n3F = 0;
136  unsigned int nProf = 0;
137  unsigned int nProf2 = 0;
138  unsigned int nDouble = 0;
139  unsigned int nInt64 = 0;
140  unsigned int nString = 0;
141 
142  for (mmi = items.begin(), mme = items.end(); mmi != mme; ++mmi) {
143  MonitorElement* me = *mmi;
144 
145  // store only flagged ME at endLumi transition, and Run-based
146  // histo at endRun transition
147  if (iLumiOnly && !me->getLumiFlag())
148  continue;
149  if (!iLumiOnly && me->getLumiFlag())
150  continue;
151 
152  switch (me->kind()) {
154  ++nInt64;
155  break;
156 
158  ++nDouble;
159  break;
160 
162  ++nString;
163  break;
164 
166  ++n1F;
167  break;
168 
170  ++n1S;
171  break;
172 
174  ++n1D;
175  break;
176 
178  ++n2F;
179  break;
180 
182  ++n2S;
183  break;
184 
186  ++n2D;
187  break;
188 
190  ++n3F;
191  break;
192 
194  ++nProf;
195  break;
196 
198  ++nProf2;
199  break;
200 
201  default:
202  edm::LogError(MsgLoggerCat) << "ERROR: The DQM object '" << me->getFullname()
203  << "' is neither a ROOT object nor a recognised "
204  << "simple object.\n";
205  continue;
206  }
207  }
208 
209  std::unique_ptr<MEtoEDM<long long> > pOutInt(new MEtoEDM<long long>(nInt64));
210  std::unique_ptr<MEtoEDM<double> > pOutDouble(new MEtoEDM<double>(nDouble));
211  std::unique_ptr<MEtoEDM<TString> > pOutString(new MEtoEDM<TString>(nString));
212  std::unique_ptr<MEtoEDM<TH1F> > pOut1(new MEtoEDM<TH1F>(n1F));
213  std::unique_ptr<MEtoEDM<TH1S> > pOut1s(new MEtoEDM<TH1S>(n1S));
214  std::unique_ptr<MEtoEDM<TH1D> > pOut1d(new MEtoEDM<TH1D>(n1D));
215  std::unique_ptr<MEtoEDM<TH2F> > pOut2(new MEtoEDM<TH2F>(n2F));
216  std::unique_ptr<MEtoEDM<TH2S> > pOut2s(new MEtoEDM<TH2S>(n2S));
217  std::unique_ptr<MEtoEDM<TH2D> > pOut2d(new MEtoEDM<TH2D>(n2D));
218  std::unique_ptr<MEtoEDM<TH3F> > pOut3(new MEtoEDM<TH3F>(n3F));
219  std::unique_ptr<MEtoEDM<TProfile> > pOutProf(new MEtoEDM<TProfile>(nProf));
220  std::unique_ptr<MEtoEDM<TProfile2D> > pOutProf2(new MEtoEDM<TProfile2D>(nProf2));
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  // get monitor elements
233  switch (me->kind()) {
235  pOutInt->putMEtoEdmObject(me->getFullname(), me->getIntValue());
236  break;
237 
239  pOutDouble->putMEtoEdmObject(me->getFullname(), me->getFloatValue());
240  break;
241 
243  pOutString->putMEtoEdmObject(me->getFullname(), me->getStringValue());
244  break;
245 
247  pOut1->putMEtoEdmObject(me->getFullname(), *me->getTH1F());
248  break;
249 
251  pOut1s->putMEtoEdmObject(me->getFullname(), *me->getTH1S());
252  break;
253 
255  pOut1d->putMEtoEdmObject(me->getFullname(), *me->getTH1D());
256  break;
257 
259  pOut2->putMEtoEdmObject(me->getFullname(), *me->getTH2F());
260  break;
261 
263  pOut2s->putMEtoEdmObject(me->getFullname(), *me->getTH2S());
264  break;
265 
267  pOut2d->putMEtoEdmObject(me->getFullname(), *me->getTH2D());
268  break;
269 
271  pOut3->putMEtoEdmObject(me->getFullname(), *me->getTH3F());
272  break;
273 
275  pOutProf->putMEtoEdmObject(me->getFullname(), *me->getTProfile());
276  break;
277 
279  pOutProf2->putMEtoEdmObject(me->getFullname(), *me->getTProfile2D());
280  break;
281 
282  default:
283  edm::LogError(MsgLoggerCat) << "ERROR: The DQM object '" << me->getFullname()
284  << "' is neither a ROOT object nor a recognised "
285  << "simple object.\n";
286  continue;
287  }
288 
289  } // end loop through monitor elements
290 
291  std::string sName;
292 
293  if (iLumiOnly) {
294  sName = fName + "Lumi";
295  } else {
296  sName = fName + "Run";
297  }
298 
299  // produce objects to put in events
300  iPutTo.put(std::move(pOutInt), sName);
301  iPutTo.put(std::move(pOutDouble), sName);
302  iPutTo.put(std::move(pOutString), sName);
303  iPutTo.put(std::move(pOut1), sName);
304  iPutTo.put(std::move(pOut1s), sName);
305  iPutTo.put(std::move(pOut1d), sName);
306  iPutTo.put(std::move(pOut2), sName);
307  iPutTo.put(std::move(pOut2s), sName);
308  iPutTo.put(std::move(pOut2d), sName);
309  iPutTo.put(std::move(pOut3), sName);
310  iPutTo.put(std::move(pOutProf), sName);
311  iPutTo.put(std::move(pOutProf2), sName);
312 }
313 
LuminosityBlockID id() const
virtual TH2D * getTH2D() const
T getUntrackedParameter(std::string const &, T const &) const
virtual TH2F * getTH2F() const
std::shared_ptr< meedm::Void > globalBeginRun(edm::Run const &, const edm::EventSetup &) const override
RunNumber_t run() const
Definition: RunBase.h:40
void meBookerGetter(iFunc f)
Definition: DQMStore.h:331
virtual TH1F * getTH1F() const
virtual int64_t getIntValue() const
Kind kind() const
Get the type of the monitor element.
~MEtoEDMConverter() override
void endRunProduce(edm::Run &, const edm::EventSetup &) override
Definition: DQMStore.h:35
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
virtual TH1S * getTH1S() const
void beginJob() override
const std::string getFullname() const
get full name of ME including Pathname
void produce(edm::Event &, const edm::EventSetup &) override
int iEvent
Definition: GenABIO.cc:224
RunNumber_t run() const
std::shared_ptr< meedm::Void > globalBeginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) const override
void globalEndRun(edm::Run const &, const edm::EventSetup &) override
virtual TProfile2D * getTProfile2D() const
virtual TH2S * getTH2S() const
virtual TProfile * getTProfile() const
virtual TH1D * getTH1D() const
double b
Definition: hdecay.h:118
LuminosityBlockNumber_t luminosityBlock() const
bool getLumiFlag() const
true if ME is meant to be stored for each luminosity section
virtual double getFloatValue() const
void endJob() override
virtual const std::string & getStringValue() const
MEtoEDMConverter(const edm::ParameterSet &)
void putData(DQMStore::IGetter &g, T &iPutTo, bool iLumiOnly, uint32_t run, uint32_t lumi)
long double T
virtual TH3F * getTH3F() const
def move(src, dest)
Definition: eostools.py:511
std::vector< MonitorElement * > getAllContents(std::string const &path, uint32_t runNumber=0, uint32_t lumi=0)
Definition: DQMStore.cc:431
void endLuminosityBlockProduce(edm::LuminosityBlock &, const edm::EventSetup &) override
Definition: Run.h:45