00001
00002
00012 #include <cassert>
00013
00014 #include "DQMServices/Components/plugins/MEtoEDMConverter.h"
00015 #include "classlib/utils/StringList.h"
00016 #include "classlib/utils/StringOps.h"
00017
00018 using namespace lat;
00019
00020 MEtoEDMConverter::MEtoEDMConverter(const edm::ParameterSet & iPSet) :
00021 fName(""), verbosity(0), frequency(0), deleteAfterCopy(false)
00022 {
00023 std::string MsgLoggerCat = "MEtoEDMConverter_MEtoEDMConverter";
00024
00025
00026 fName = iPSet.getUntrackedParameter<std::string>("Name","MEtoEDMConverter");
00027 verbosity = iPSet.getUntrackedParameter<int>("Verbosity",0);
00028 frequency = iPSet.getUntrackedParameter<int>("Frequency",50);
00029 path = iPSet.getUntrackedParameter<std::string>("MEPathToSave");
00030 deleteAfterCopy = iPSet.getUntrackedParameter<bool>("deleteAfterCopy",false);
00031
00032
00033
00034 verbosity %= 10;
00035
00036
00037 if (verbosity >= 0) {
00038 edm::LogInfo(MsgLoggerCat)
00039 << "\n===============================\n"
00040 << "Initialized as EDProducer with parameter values:\n"
00041 << " Name = " << fName << "\n"
00042 << " Verbosity = " << verbosity << "\n"
00043 << " Frequency = " << frequency << "\n"
00044 << " Path = " << path << "\n"
00045 << "===============================\n";
00046 }
00047
00048
00049 dbe = 0;
00050 dbe = edm::Service<DQMStore>().operator->();
00051
00052 std::string sName;
00053
00054
00055
00056 sName = fName + "Run";
00057 produces<MEtoEDM<TH1F>, edm::InRun>(sName);
00058 produces<MEtoEDM<TH1S>, edm::InRun>(sName);
00059 produces<MEtoEDM<TH1D>, edm::InRun>(sName);
00060 produces<MEtoEDM<TH2F>, edm::InRun>(sName);
00061 produces<MEtoEDM<TH2S>, edm::InRun>(sName);
00062 produces<MEtoEDM<TH2D>, edm::InRun>(sName);
00063 produces<MEtoEDM<TH3F>, edm::InRun>(sName);
00064 produces<MEtoEDM<TProfile>, edm::InRun>(sName);
00065 produces<MEtoEDM<TProfile2D>, edm::InRun>(sName);
00066 produces<MEtoEDM<double>, edm::InRun>(sName);
00067 produces<MEtoEDM<long long>, edm::InRun>(sName);
00068 produces<MEtoEDM<TString>, edm::InRun>(sName);
00069
00070 sName = fName + "Lumi";
00071 produces<MEtoEDM<TH1F>, edm::InLumi>(sName);
00072 produces<MEtoEDM<TH1S>, edm::InLumi>(sName);
00073 produces<MEtoEDM<TH1D>, edm::InLumi>(sName);
00074 produces<MEtoEDM<TH2F>, edm::InLumi>(sName);
00075 produces<MEtoEDM<TH2S>, edm::InLumi>(sName);
00076 produces<MEtoEDM<TH2D>, edm::InLumi>(sName);
00077 produces<MEtoEDM<TH3F>, edm::InLumi>(sName);
00078 produces<MEtoEDM<TProfile>, edm::InLumi>(sName);
00079 produces<MEtoEDM<TProfile2D>, edm::InLumi>(sName);
00080 produces<MEtoEDM<double>, edm::InLumi>(sName);
00081 produces<MEtoEDM<long long>, edm::InLumi>(sName);
00082 produces<MEtoEDM<TString>, edm::InLumi>(sName);
00083
00084 iCount.clear();
00085
00086 assert(sizeof(int64_t) == sizeof(long long));
00087
00088 }
00089
00090 MEtoEDMConverter::~MEtoEDMConverter()
00091 {
00092 }
00093
00094 void
00095 MEtoEDMConverter::beginJob()
00096 {
00097 }
00098
00099 void
00100 MEtoEDMConverter::endJob(void)
00101 {
00102 std::string MsgLoggerCat = "MEtoEDMConverter_endJob";
00103
00104 if (verbosity > 0) {
00105
00106
00107 std::map<std::string,int> packages;
00108
00109
00110 unsigned nTH1F = 0;
00111 unsigned nTH1S = 0;
00112 unsigned nTH1D = 0;
00113 unsigned nTH2F = 0;
00114 unsigned nTH2S = 0;
00115 unsigned nTH2D = 0;
00116 unsigned nTH3F = 0;
00117 unsigned nTProfile = 0;
00118 unsigned nTProfile2D = 0;
00119 unsigned nDouble = 0;
00120 unsigned nInt64 = 0;
00121 unsigned nString = 0;
00122
00123 if (verbosity > 1) std::cout << std::endl << "Summary :" << std::endl;
00124
00125
00126 std::vector<MonitorElement *>::iterator mmi, mme;
00127 std::vector<MonitorElement *> items(dbe->getAllContents(""));
00128
00129 for (mmi = items.begin (), mme = items.end (); mmi != mme; ++mmi) {
00130
00131
00132 StringList dir = StringOps::split((*mmi)->getPathname(),"/");
00133 ++packages[dir[0]];
00134
00135
00136 if (verbosity > 1) std::cout << "MEobject:" << std::endl;
00137 MonitorElement *me = *mmi;
00138 TObject *tobj = me->getRootObject();
00139 switch (me->kind())
00140 {
00141 case MonitorElement::DQM_KIND_INT:
00142 ++nInt64;
00143 if (verbosity > 1)
00144 std::cout << " scalar: " << tobj->GetName() << ": Int64\n";
00145 break;
00146
00147 case MonitorElement::DQM_KIND_REAL:
00148 ++nDouble;
00149 if (verbosity > 1)
00150 std::cout << " scalar: " << tobj->GetName() << ": Double\n";
00151 break;
00152
00153 case MonitorElement::DQM_KIND_STRING:
00154 ++nString;
00155 if (verbosity > 1)
00156 std::cout << " scalar: " << tobj->GetName() << ": String\n";
00157 break;
00158
00159 case MonitorElement::DQM_KIND_TH1F:
00160 ++nTH1F;
00161 if (verbosity > 1)
00162 std::cout << " normal: " << tobj->GetName() << ": TH1F\n";
00163 break;
00164
00165 case MonitorElement::DQM_KIND_TH1S:
00166 ++nTH1S;
00167 if (verbosity > 1)
00168 std::cout << " normal: " << tobj->GetName() << ": TH1S\n";
00169 break;
00170
00171 case MonitorElement::DQM_KIND_TH1D:
00172 ++nTH1D;
00173 if (verbosity > 1)
00174 std::cout << " normal: " << tobj->GetName() << ": TH1D\n";
00175 break;
00176
00177 case MonitorElement::DQM_KIND_TH2F:
00178 ++nTH2F;
00179 if (verbosity > 1)
00180 std::cout << " normal: " << tobj->GetName() << ": TH2F\n";
00181 break;
00182
00183 case MonitorElement::DQM_KIND_TH2S:
00184 ++nTH2S;
00185 if (verbosity > 1)
00186 std::cout << " normal: " << tobj->GetName() << ": TH2S\n";
00187 break;
00188
00189 case MonitorElement::DQM_KIND_TH2D:
00190 ++nTH2D;
00191 if (verbosity > 1)
00192 std::cout << " normal: " << tobj->GetName() << ": TH2D\n";
00193 break;
00194
00195 case MonitorElement::DQM_KIND_TH3F:
00196 ++nTH3F;
00197 if (verbosity > 1)
00198 std::cout << " normal: " << tobj->GetName() << ": TH3F\n";
00199 break;
00200
00201 case MonitorElement::DQM_KIND_TPROFILE:
00202 ++nTProfile;
00203 if (verbosity > 1)
00204 std::cout << " normal: " << tobj->GetName() << ": TProfile\n";
00205 break;
00206
00207 case MonitorElement::DQM_KIND_TPROFILE2D:
00208 ++nTProfile2D;
00209 if (verbosity > 1)
00210 std::cout << " normal: " << tobj->GetName() << ": TProfile2D\n";
00211 break;
00212
00213 default:
00214 edm::LogError(MsgLoggerCat)
00215 << "ERROR: The DQM object '" << me->getFullname()
00216 << "' is neither a ROOT object nor a recognised "
00217 << "simple object.\n";
00218 continue;
00219 }
00220 }
00221
00222
00223 std::cout << "Packages accessing DQM:" << std::endl;
00224 std::map<std::string,int>::iterator pkgIter;
00225 for (pkgIter = packages.begin(); pkgIter != packages.end(); ++pkgIter)
00226 std::cout << " " << pkgIter->first << ": " << pkgIter->second
00227 << std::endl;
00228
00229 std::cout << "We have " << nTH1F << " TH1F objects" << std::endl;
00230 std::cout << "We have " << nTH1S << " TH1S objects" << std::endl;
00231 std::cout << "We have " << nTH1D << " TH1D objects" << std::endl;
00232 std::cout << "We have " << nTH2F << " TH2F objects" << std::endl;
00233 std::cout << "We have " << nTH2S << " TH2S objects" << std::endl;
00234 std::cout << "We have " << nTH2D << " TH2D objects" << std::endl;
00235 std::cout << "We have " << nTH3F << " TH3F objects" << std::endl;
00236 std::cout << "We have " << nTProfile << " TProfile objects" << std::endl;
00237 std::cout << "We have " << nTProfile2D << " TProfile2D objects" << std::endl;
00238 std::cout << "We have " << nDouble << " Double objects" << std::endl;
00239 std::cout << "We have " << nInt64 << " Int64 objects" << std::endl;
00240 std::cout << "We have " << nString << " String objects" << std::endl;
00241
00242 if (verbosity > 1) std::cout << std::endl;
00243
00244 }
00245
00246 if (verbosity >= 0)
00247 edm::LogInfo(MsgLoggerCat)
00248 << "Terminating having processed " << iCount.size() << " runs.";
00249
00250 }
00251
00252 void
00253 MEtoEDMConverter::beginRun(edm::Run const& iRun, const edm::EventSetup& iSetup)
00254 {
00255 std::string MsgLoggerCat = "MEtoEDMConverter_beginRun";
00256
00257 int nrun = iRun.run();
00258
00259
00260 ++iCount[nrun];
00261
00262 if (verbosity > 0) {
00263 edm::LogInfo(MsgLoggerCat)
00264 << "Processing run " << nrun << " (" << iCount.size() << " runs total)";
00265 } else if (verbosity == 0) {
00266 if (nrun%frequency == 0 || iCount.size() == 1) {
00267 edm::LogInfo(MsgLoggerCat)
00268 << "Processing run " << nrun << " (" << iCount.size() << " runs total)";
00269 }
00270 }
00271
00272
00273 std::vector<MonitorElement *>::iterator mmi, mme;
00274 std::vector<MonitorElement *> items(dbe->getAllContents(path));
00275
00276 for (mmi = items.begin (), mme = items.end (); mmi != mme; ++mmi) {
00277
00278 MonitorElement *me = *mmi;
00279
00280 switch (me->kind())
00281 {
00282 case MonitorElement::DQM_KIND_INT:
00283 break;
00284
00285 case MonitorElement::DQM_KIND_REAL:
00286 break;
00287
00288 case MonitorElement::DQM_KIND_STRING:
00289 break;
00290
00291 case MonitorElement::DQM_KIND_TH1F:
00292 me->Reset();
00293 break;
00294
00295 case MonitorElement::DQM_KIND_TH1S:
00296 me->Reset();
00297 break;
00298
00299 case MonitorElement::DQM_KIND_TH1D:
00300 me->Reset();
00301 break;
00302
00303 case MonitorElement::DQM_KIND_TH2F:
00304 me->Reset();
00305 break;
00306
00307 case MonitorElement::DQM_KIND_TH2S:
00308 me->Reset();
00309 break;
00310
00311 case MonitorElement::DQM_KIND_TH2D:
00312 me->Reset();
00313 break;
00314
00315 case MonitorElement::DQM_KIND_TH3F:
00316 me->Reset();
00317 break;
00318
00319 case MonitorElement::DQM_KIND_TPROFILE:
00320 me->Reset();
00321 break;
00322
00323 case MonitorElement::DQM_KIND_TPROFILE2D:
00324 me->Reset();
00325 break;
00326
00327 default:
00328 edm::LogError(MsgLoggerCat)
00329 << "ERROR: The DQM object '" << me->getFullname()
00330 << "' is neither a ROOT object nor a recognised "
00331 << "simple object.\n";
00332 continue;
00333 }
00334
00335 }
00336 }
00337 void
00338 MEtoEDMConverter::endRun(edm::Run const& iRun, const edm::EventSetup& iSetup)
00339 {
00340 }
00341
00342 void
00343 MEtoEDMConverter::endRunProduce(edm::Run& iRun, const edm::EventSetup& iSetup)
00344 {
00345 dbe->scaleElements();
00346 putData(iRun, false);
00347 }
00348
00349 void
00350 MEtoEDMConverter::endLuminosityBlockProduce(edm::LuminosityBlock& iLumi, const edm::EventSetup& iSetup)
00351 {
00352 putData(iLumi, true);
00353 }
00354
00355 template <class T>
00356 void
00357 MEtoEDMConverter::putData(T& iPutTo, bool iLumiOnly)
00358 {
00359 std::string MsgLoggerCat = "MEtoEDMConverter_putData";
00360
00361 if (verbosity > 0)
00362 edm::LogInfo (MsgLoggerCat) << "\nStoring MEtoEDM dataformat histograms.";
00363
00364
00365 std::vector<MonitorElement *>::iterator mmi, mme;
00366 std::vector<MonitorElement *> items(dbe->getAllContents(path));
00367
00368 unsigned int n1F=0;
00369 unsigned int n1S=0;
00370 unsigned int n1D=0;
00371 unsigned int n2F=0;
00372 unsigned int n2S=0;
00373 unsigned int n2D=0;
00374 unsigned int n3F=0;
00375 unsigned int nProf=0;
00376 unsigned int nProf2=0;
00377 unsigned int nDouble=0;
00378 unsigned int nInt64=0;
00379 unsigned int nString=0;
00380
00381 for (mmi = items.begin (), mme = items.end (); mmi != mme; ++mmi) {
00382
00383 MonitorElement *me = *mmi;
00384
00385
00386
00387 if (iLumiOnly && !me->getLumiFlag()) continue;
00388 if (!iLumiOnly && me->getLumiFlag()) continue;
00389
00390 switch (me->kind())
00391 {
00392 case MonitorElement::DQM_KIND_INT:
00393 ++nInt64;
00394 break;
00395
00396 case MonitorElement::DQM_KIND_REAL:
00397 ++nDouble;
00398 break;
00399
00400 case MonitorElement::DQM_KIND_STRING:
00401 ++nString;
00402 break;
00403
00404 case MonitorElement::DQM_KIND_TH1F:
00405 ++n1F;
00406 break;
00407
00408 case MonitorElement::DQM_KIND_TH1S:
00409 ++n1S;
00410 break;
00411
00412 case MonitorElement::DQM_KIND_TH1D:
00413 ++n1D;
00414 break;
00415
00416 case MonitorElement::DQM_KIND_TH2F:
00417 ++n2F;
00418 break;
00419
00420 case MonitorElement::DQM_KIND_TH2S:
00421 ++n2S;
00422 break;
00423
00424 case MonitorElement::DQM_KIND_TH2D:
00425 ++n2D;
00426 break;
00427
00428 case MonitorElement::DQM_KIND_TH3F:
00429 ++n3F;
00430 break;
00431
00432 case MonitorElement::DQM_KIND_TPROFILE:
00433 ++nProf;
00434 break;
00435
00436 case MonitorElement::DQM_KIND_TPROFILE2D:
00437 ++nProf2;
00438 break;
00439
00440 default:
00441 edm::LogError(MsgLoggerCat)
00442 << "ERROR: The DQM object '" << me->getFullname()
00443 << "' is neither a ROOT object nor a recognised "
00444 << "simple object.\n";
00445 continue;
00446 }
00447 }
00448
00449 std::auto_ptr<MEtoEDM<long long> > pOutInt(new MEtoEDM<long long>(nInt64));
00450 std::auto_ptr<MEtoEDM<double> > pOutDouble(new MEtoEDM<double>(nDouble));
00451 std::auto_ptr<MEtoEDM<TString> > pOutString(new MEtoEDM<TString>(nString));
00452 std::auto_ptr<MEtoEDM<TH1F> > pOut1(new MEtoEDM<TH1F>(n1F));
00453 std::auto_ptr<MEtoEDM<TH1S> > pOut1s(new MEtoEDM<TH1S>(n1S));
00454 std::auto_ptr<MEtoEDM<TH1D> > pOut1d(new MEtoEDM<TH1D>(n1D));
00455 std::auto_ptr<MEtoEDM<TH2F> > pOut2(new MEtoEDM<TH2F>(n2F));
00456 std::auto_ptr<MEtoEDM<TH2S> > pOut2s(new MEtoEDM<TH2S>(n2S));
00457 std::auto_ptr<MEtoEDM<TH2D> > pOut2d(new MEtoEDM<TH2D>(n2D));
00458 std::auto_ptr<MEtoEDM<TH3F> > pOut3(new MEtoEDM<TH3F>(n3F));
00459 std::auto_ptr<MEtoEDM<TProfile> > pOutProf(new MEtoEDM<TProfile>(nProf));
00460 std::auto_ptr<MEtoEDM<TProfile2D> > pOutProf2(new MEtoEDM<TProfile2D>(nProf2));
00461
00462 for (mmi = items.begin (), mme = items.end (); mmi != mme; ++mmi) {
00463
00464 MonitorElement *me = *mmi;
00465
00466
00467
00468 if (iLumiOnly && !me->getLumiFlag()) continue;
00469 if (!iLumiOnly && me->getLumiFlag()) continue;
00470
00471
00472 switch (me->kind())
00473 {
00474 case MonitorElement::DQM_KIND_INT:
00475 pOutInt->putMEtoEdmObject(me->getFullname(),me->getTags(),me->getIntValue());
00476 break;
00477
00478 case MonitorElement::DQM_KIND_REAL:
00479 pOutDouble->putMEtoEdmObject(me->getFullname(),me->getTags(),me->getFloatValue());
00480 break;
00481
00482 case MonitorElement::DQM_KIND_STRING:
00483 pOutString->putMEtoEdmObject(me->getFullname(),me->getTags(),me->getStringValue());
00484 break;
00485
00486 case MonitorElement::DQM_KIND_TH1F:
00487 pOut1->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTH1F());
00488 break;
00489
00490 case MonitorElement::DQM_KIND_TH1S:
00491 pOut1s->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTH1S());
00492 break;
00493
00494 case MonitorElement::DQM_KIND_TH1D:
00495 pOut1d->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTH1D());
00496 break;
00497
00498 case MonitorElement::DQM_KIND_TH2F:
00499 pOut2->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTH2F());
00500 break;
00501
00502 case MonitorElement::DQM_KIND_TH2S:
00503 pOut2s->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTH2S());
00504 break;
00505
00506 case MonitorElement::DQM_KIND_TH2D:
00507 pOut2d->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTH2D());
00508 break;
00509
00510 case MonitorElement::DQM_KIND_TH3F:
00511 pOut3->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTH3F());
00512 break;
00513
00514 case MonitorElement::DQM_KIND_TPROFILE:
00515 pOutProf->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTProfile());
00516 break;
00517
00518 case MonitorElement::DQM_KIND_TPROFILE2D:
00519 pOutProf2->putMEtoEdmObject(me->getFullname(),me->getTags(),*me->getTProfile2D());
00520 break;
00521
00522 default:
00523 edm::LogError(MsgLoggerCat)
00524 << "ERROR: The DQM object '" << me->getFullname()
00525 << "' is neither a ROOT object nor a recognised "
00526 << "simple object.\n";
00527 continue;
00528 }
00529
00530 if (!iLumiOnly) {
00531
00532 if (deleteAfterCopy)
00533 dbe->removeElement(me->getPathname(),me->getName());
00534 }
00535
00536 }
00537
00538 std::string sName;
00539
00540 if (iLumiOnly) {
00541 sName = fName + "Lumi";
00542 } else {
00543 sName = fName + "Run";
00544 }
00545
00546
00547 iPutTo.put(pOutInt,sName);
00548 iPutTo.put(pOutDouble,sName);
00549 iPutTo.put(pOutString,sName);
00550 iPutTo.put(pOut1,sName);
00551 iPutTo.put(pOut1s,sName);
00552 iPutTo.put(pOut1d,sName);
00553 iPutTo.put(pOut2,sName);
00554 iPutTo.put(pOut2s,sName);
00555 iPutTo.put(pOut2d,sName);
00556 iPutTo.put(pOut3,sName);
00557 iPutTo.put(pOutProf,sName);
00558 iPutTo.put(pOutProf2,sName);
00559
00560 }
00561
00562 void
00563 MEtoEDMConverter::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00564 {
00565
00566 }