CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/DQMServices/Components/plugins/MEtoEDMConverter.cc

Go to the documentation of this file.
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   // get information from parameter set
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   // use value of first digit to determine default output level (inclusive)
00033   // 0 is none, 1 is basic, 2 is fill output, 3 is gather output
00034   verbosity %= 10;
00035   
00036   // print out Parameter Set information being used
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   // get dqm info
00049   dbe = 0;
00050   dbe = edm::Service<DQMStore>().operator->();
00051 
00052   std::string sName;
00053 
00054   // create persistent objects
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     // keep track just of package names
00107     std::map<std::string,int> packages;
00108 
00109     // count various objects we have
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     // get contents out of DQM
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       // keep track of leading directory (i.e. package)
00132       StringList dir = StringOps::split((*mmi)->getPathname(),"/");
00133       ++packages[dir[0]];
00134 
00135       // check type
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     } // end loop through monitor elements
00221 
00222     // list unique packages
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   // keep track of number of runs processed
00260   ++iCount[nrun];
00261 
00262   if (verbosity > 0) {  // keep track of number of runs processed
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   // clear contents of monitor elements
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   } // end loop through monitor elements
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   // extract ME information into vectors
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     // store only flagged ME at endLumi transition, and Run-based
00386     // histo at endRun transition
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     // store only flagged ME at endLumi transition, and Run-based
00467     // histo at endRun transition
00468     if (iLumiOnly && !me->getLumiFlag()) continue;
00469     if (!iLumiOnly && me->getLumiFlag()) continue;
00470 
00471     // get monitor elements
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       // remove ME after copy to EDM is done.
00532       if (deleteAfterCopy)
00533         dbe->removeElement(me->getPathname(),me->getName());
00534     }
00535 
00536   } // end loop through monitor elements
00537 
00538   std::string sName;
00539 
00540   if (iLumiOnly) {
00541     sName = fName + "Lumi";
00542   } else {
00543     sName = fName + "Run";
00544   }
00545 
00546   // produce objects to put in events
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 }