CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_4/src/DQM/TrackingMonitor/plugins/LogMessageMonitor.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    LogMessageMonitor
00004 // Class:      LogMessageMonitor
00005 // 
00026 //
00027 // Original Author:  Mia Tosi,40 3-B32,+41227671609,
00028 //         Created:  Thu Mar  8 14:34:13 CET 2012
00029 // $Id: LogMessageMonitor.cc,v 1.3 2012/07/18 21:58:39 tosi Exp $
00030 //
00031 //
00032 
00033 #include "DQM/TrackingMonitor/plugins/LogMessageMonitor.h"
00034 
00035 #include "DQMServices/Core/interface/DQMStore.h"
00036 #include "DQMServices/Core/interface/MonitorElement.h"
00037 #include "DataFormats/Common/interface/Handle.h"
00038 
00039 #include "FWCore/MessageLogger/interface/ELseverityLevel.h"
00040 #include "FWCore/MessageLogger/interface/ELstring.h"
00041 #include "FWCore/MessageLogger/interface/ErrorSummaryEntry.h"
00042 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00043 
00044 #include "DQM/TrackingMonitor/interface/GetLumi.h"
00045 #include "CommonTools/TriggerUtils/interface/GenericTriggerEventFlag.h"
00046 //
00047 // constants, enums and typedefs
00048 //
00049 
00050 //
00051 // static data member definitions
00052 //
00053 
00054 //
00055 // constructors and destructor
00056 //
00057 LogMessageMonitor::LogMessageMonitor(const edm::ParameterSet& iConfig)
00058   : dqmStore_( edm::Service<DQMStore>().operator->() )
00059   , conf_ ( iConfig )
00060   , pluginsMonName_    ( iConfig.getParameter<std::string>              ("pluginsMonName")  )
00061   , modules_vector_    ( iConfig.getParameter<std::vector<std::string> >("modules")         )
00062   , categories_vector_ ( iConfig.getParameter<std::vector<std::string> >("categories")      )
00063   , doWarningsPlots_   ( iConfig.getParameter<bool>                     ("doWarningsPlots") )
00064   , doPUmonitoring_    ( iConfig.getParameter<bool>                     ("doPUmonitoring")  ) 
00065 {
00066    //now do what ever initialization is needed
00067   lumiDetails_         = new GetLumi( iConfig.getParameter<edm::ParameterSet>("BXlumiSetup") ); 
00068   genTriggerEventFlag_ = new GenericTriggerEventFlag(iConfig);
00069 }
00070 
00071 
00072 LogMessageMonitor::~LogMessageMonitor()
00073 {
00074  
00075    // do anything here that needs to be done at desctruction time
00076    // (e.g. close files, deallocate resources etc.)
00077   //  if ( lumiDetails_         ) delete lumiDetails_;
00078   if ( genTriggerEventFlag_ ) delete genTriggerEventFlag_;
00079 
00080 }
00081 
00082 
00083 //
00084 // member functions
00085 //
00086 
00087 // ------------ method called for each event  ------------
00088 void
00089 LogMessageMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00090 {
00091 
00092   // Filter out events if Trigger Filtering is requested
00093   if (genTriggerEventFlag_->on()&& ! genTriggerEventFlag_->accept( iEvent, iSetup) ) return;
00094 
00095   double BXlumi = -1.;
00096   if ( doPUmonitoring_ )
00097     lumiDetails_->getValue(iEvent);
00098   
00099     // Take the ErrorSummaryEntry container
00100   edm::Handle<std::vector<edm::ErrorSummaryEntry> >  errors;
00101   iEvent.getByLabel("logErrorHarvester",errors);
00102   // Check that errors is valid
00103   if(!errors.isValid()) return; 
00104   // Compare severity level of error with ELseveritylevel instance el : "-e" should be the lowest error
00105   edm::ELseverityLevel el("-e");
00106   
00107   // Find the total number of errors in iEvent
00108   if(errors->size()==0){
00109     if ( doPUmonitoring_ ) {
00110       for(size_t i = 0; i < modulesMap.size(); i++) {
00111         ModulesErrorsVsBXlumi[i] -> Fill(BXlumi,0.);
00112         if ( doWarningsPlots_ )
00113           ModulesWarningsVsBXlumi[i] -> Fill(BXlumi,0.);
00114       }
00115     }
00116   } else {
00117 
00118     size_t nCategories = categories_vector_.size();
00119 
00120     for( size_t i = 0, n = errors->size();
00121         i < n ; i++){    
00122       
00123       //      std::cout << "Severity for error/warning: " << (*errors)[i].severity << " " <<(*errors)[i].module  << std::endl;
00124       
00125       // remove the first part of the module string, what is before ":"
00126       std::string s = (*errors)[i].module;
00127       //      std::cout << "s: " << s << std::endl;
00128       size_t pos = s.find(':');
00129       std::string s_temp = s.substr(pos+1,s.size());
00130       std::map<std::string,int>::const_iterator it = modulesMap.find(s_temp);
00131       //      std::cout << "it: " << " --> " << s_temp << std::endl;
00132       if (it!=modulesMap.end()){
00133         // IF THIS IS AN ERROR on the ELseverityLevel SCALE, FILL ERROR HISTS
00134         if((*errors)[i].severity.getLevel() >= el.getLevel()){
00135           //      if (categoryECount.size()<=40)
00136           //        categoryECount[(*errors)[i].category]+=(*errors)[i].count;
00137           //       std::map<std::string,int>::const_iterator it = modulesMap.find((*errors)[i].category);
00138           //      std::cout << "it->second: " << it->second << std::endl;
00139           if ( doPUmonitoring_ )
00140             ModulesErrorsVsBXlumi[it->second]->Fill (BXlumi, (*errors)[i].count);
00141 
00142           // loop over the different categories of errors
00143           // defined by configuration file
00144           // if the category is not in the given list
00145           // it fills the bin "others"
00146           for (size_t icategory = 0; icategory < nCategories-1; icategory++) {
00147             if ( (*errors)[i].category==categories_vector_[icategory] )
00148               CategoriesVsModules->Fill(it->second,icategory);
00149             else
00150               CategoriesVsModules->Fill(it->second,nCategories-1);                
00151           }
00152 
00153         } else {
00154           // IF ONLY WARNING, FILL WARNING HISTS
00155           if ( doWarningsPlots_ ) 
00156             if ( doPUmonitoring_ )
00157               ModulesWarningsVsBXlumi[it->second]->Fill(BXlumi, (*errors)[i].count);
00158         }
00159       }
00160     }
00161   }
00162 }
00163 
00164 
00165 // ------------ method called once each job just before starting event loop  ------------
00166 void 
00167 LogMessageMonitor::beginJob()
00168 {
00169    std::string MEFolderName = conf_.getParameter<std::string>("LogFolderName"); 
00170 
00171    dqmStore_->setCurrentFolder(MEFolderName);
00172 
00173    categories_vector_.push_back("others");
00174    size_t nModules    = modules_vector_.size();
00175    size_t nCategories = categories_vector_.size();
00176 
00177    histname = pluginsMonName_+"ErrorsVsModules";
00178    CategoriesVsModules = dqmStore_->book2D(histname, histname, nModules, 0., double(nModules), nCategories, 0., double(nCategories) );
00179    CategoriesVsModules->setAxisTitle("modules",1);
00180    for (size_t imodule = 0; imodule < nModules; imodule++)
00181      CategoriesVsModules->setBinLabel(imodule+1,modules_vector_[imodule],1);
00182    CategoriesVsModules->setAxisTitle("categories",2);
00183    for (size_t icategories = 0; icategories < nCategories; icategories++)
00184      CategoriesVsModules->setBinLabel(icategories+1,categories_vector_[icategories],2);
00185    
00186    // MAKE MODULEMAP USING INPUT FROM CFG FILE
00187    for (size_t i = 0; i < modules_vector_.size(); i++){
00188      modulesMap.insert( std::pair<std::string,int>(modules_vector_[i],i) );
00189    }
00190 
00191    if ( doPUmonitoring_ ) {
00192      // BOOK THE HISTOGRAMS
00193      // get binning from the configuration
00194      edm::ParameterSet BXlumiParameters = conf_.getParameter<edm::ParameterSet>("BXlumiSetup");
00195      int    BXlumiBin   = BXlumiParameters.getParameter<int>("BXlumiBin");
00196      double BXlumiMin   = BXlumiParameters.getParameter<double>("BXlumiMin");
00197      double BXlumiMax   = BXlumiParameters.getParameter<double>("BXlumiMax");
00198    
00199      size_t i = 0;
00200      for(std::map<std::string,int>::const_iterator it = modulesMap.begin();
00201          it != modulesMap.end(); ++it, i++){ 
00202        
00203        dqmStore_->setCurrentFolder(MEFolderName + "/PUmonitoring/Errors");      
00204        
00205        histname = "errorsVsBXlumi_" + it->first;
00206        ModulesErrorsVsBXlumi.push_back( dynamic_cast<MonitorElement*>(dqmStore_->bookProfile( histname, histname, BXlumiBin, BXlumiMin, BXlumiMax, 0.,100, "")) );
00207        ModulesErrorsVsBXlumi[i] -> setAxisTitle("BXlumi [10^{30} Hz cm^{-2}]", 1);
00208        ModulesErrorsVsBXlumi[i] -> setAxisTitle("Mean number of errors", 2);
00209        
00210        if ( doWarningsPlots_ ) {
00211          dqmStore_->setCurrentFolder(MEFolderName + "/PUmonitoring/Warnings");      
00212          
00213          histname = "warningVsBXlumi_" + it->first;
00214          ModulesWarningsVsBXlumi.push_back( dynamic_cast<MonitorElement*>(dqmStore_->bookProfile( histname, histname, BXlumiBin, BXlumiMin, BXlumiMax, 0.,100, "")) );
00215          ModulesWarningsVsBXlumi[i] -> setAxisTitle("BXlumi [10^{30} Hz cm^{-2}]", 1);
00216          ModulesWarningsVsBXlumi[i] -> setAxisTitle("Mean number of warnings", 2);
00217        }
00218      }   
00219    }
00220 
00221 }
00222 
00223 // ------------ method called once each job just after ending the event loop  ------------
00224 void 
00225 LogMessageMonitor::endJob() 
00226 {
00227     bool outputMEsInRootFile   = conf_.getParameter<bool>("OutputMEsInRootFile");
00228     std::string outputFileName = conf_.getParameter<std::string>("OutputFileName");
00229     if(outputMEsInRootFile)
00230     {
00231         dqmStore_->showDirStructure();
00232         dqmStore_->save(outputFileName);
00233     }
00234 }
00235 
00236 // ------------ method called when starting to processes a run  ------------
00237 void 
00238 LogMessageMonitor::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
00239 {
00240   if ( genTriggerEventFlag_->on() ) genTriggerEventFlag_->initRun( iRun, iSetup );
00241 }
00242 
00243 // ------------ method called when ending the processing of a run  ------------
00244 void 
00245 LogMessageMonitor::endRun(edm::Run const&, edm::EventSetup const&)
00246 {
00247 }
00248 
00249 // ------------ method called when starting to processes a luminosity block  ------------
00250 void 
00251 LogMessageMonitor::beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
00252 {
00253 }
00254 
00255 // ------------ method called when ending the processing of a luminosity block  ------------
00256 void 
00257 LogMessageMonitor::endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
00258 {
00259 }
00260 
00261 // ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
00262 void
00263 LogMessageMonitor::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
00264   //The following says we do not know what parameters are allowed so do no validation
00265   // Please change this to state exactly what you do use, even if it is no parameters
00266   edm::ParameterSetDescription desc;
00267   desc.setUnknown();
00268   descriptions.addDefault(desc);
00269 }
00270 
00271 //define this as a plug-in
00272 DEFINE_FWK_MODULE(LogMessageMonitor);