CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/FWCore/Modules/src/LogErrorFilter.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    LogErrorFilter
00004 // Class:      LogErrorFilter
00005 //
00013 //
00014 // Original Author:  Jean-Roch Vlimant
00015 //         Created:  Thu Nov 12 15:59:28 CET 2009
00016 //
00017 //
00018 
00019 // user include files
00020 #include "FWCore/Framework/interface/EDFilter.h"
00021 #include "FWCore/Framework/interface/Event.h"
00022 #include "FWCore/Framework/interface/MakerMacros.h"
00023 #include "FWCore/MessageLogger/interface/ErrorSummaryEntry.h"
00024 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
00025 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00026 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
00027 
00028 // system include files
00029 #include <memory>
00030 
00031 //
00032 // class declaration
00033 //
00034 
00035 class LogErrorFilter : public edm::EDFilter {
00036 public:
00037   explicit LogErrorFilter(edm::ParameterSet const&);
00038   ~LogErrorFilter();
00039   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
00040 
00041 private:
00042   virtual bool filter(edm::Event&, edm::EventSetup const&);
00043 
00044   // ----------member data ---------------------------
00045   edm::InputTag harvesterTag_;
00046   bool atLeastOneError_;
00047   bool atLeastOneWarning_;
00048   bool atLeastOneEntry_;
00049   std::vector<std::string> avoidCategories_;
00050 
00051 };
00052 
00053 //
00054 // constants, enums and typedefs
00055 //
00056 
00057 //
00058 // static data member definitions
00059 //
00060 
00061 //
00062 // constructors and destructor
00063 //
00064 LogErrorFilter::LogErrorFilter(edm::ParameterSet const& iConfig) :
00065   harvesterTag_(iConfig.getParameter<edm::InputTag>("harvesterTag")),
00066   atLeastOneError_(iConfig.getParameter<bool>("atLeastOneError")),
00067   atLeastOneWarning_(iConfig.getParameter<bool>("atLeastOneWarning")),
00068   atLeastOneEntry_(atLeastOneError_ && atLeastOneWarning_),
00069   avoidCategories_(iConfig.getParameter<std::vector<std::string> >("avoidCategories")) {
00070   if(!atLeastOneError_ && !atLeastOneWarning_) {
00071     throw edm::Exception(edm::errors::Configuration) <<
00072       "Useless configuration of the error/warning filter. Need to select on an error or a warning or both.\n";
00073   }
00074 }
00075 
00076 LogErrorFilter::~LogErrorFilter() {
00077    // do anything here that needs to be done at desctruction time
00078    // (e.g. close files, deallocate resources etc.)
00079 }
00080 
00081 //
00082 // member functions
00083 //
00084 
00085 // ------------ method called on each new Event  ------------
00086 bool
00087 LogErrorFilter::filter(edm::Event& iEvent, edm::EventSetup const&) {
00088   edm::Handle<std::vector<edm::ErrorSummaryEntry> > errorsAndWarnings;
00089   iEvent.getByLabel(harvesterTag_,errorsAndWarnings);
00090 
00091   if(errorsAndWarnings.failedToGet()) {
00092     return false;
00093   } else {
00094     if(atLeastOneEntry_) {
00095       if(avoidCategories_.size() != 0) {
00096         for(unsigned int iE = 0; iE != errorsAndWarnings->size(); ++iE) {
00097           //veto categories from user input.
00098           if(std::find(avoidCategories_.begin(),avoidCategories_.end(), ((*errorsAndWarnings)[iE]).category) != avoidCategories_.end()) {
00099             continue;
00100           } else {
00101             return true;
00102           }
00103         }
00104         return false;
00105       } else {
00106         return (errorsAndWarnings->size() != 0);
00107       }
00108     } else {
00109       if(atLeastOneError_ || atLeastOneWarning_) {
00110         unsigned int nError = 0;
00111         unsigned int nWarning = 0;
00112         for(unsigned int iE = 0; iE != errorsAndWarnings->size(); ++iE) {
00113           //veto categories from user input.
00114           if(avoidCategories_.size() != 0) {
00115             if(std::find(avoidCategories_.begin(),avoidCategories_.end(), ((*errorsAndWarnings)[iE]).category) != avoidCategories_.end()) {
00116               continue;
00117             }
00118           }
00119           edm::ELseverityLevel const& severity = ((*errorsAndWarnings)[iE]).severity;
00120           //count errors
00121           if(severity.getLevel() == edm::ELseverityLevel::ELsev_error || severity.getLevel() == edm::ELseverityLevel::ELsev_error2) {
00122             ++nError;
00123           }
00124           //count warnings
00125           if(severity.getLevel() == edm::ELseverityLevel::ELsev_warning || severity.getLevel() == edm::ELseverityLevel::ELsev_warning2) {
00126             ++nWarning;
00127           }
00128         }
00129         if(atLeastOneError_ && nError != 0) {
00130           return (true);
00131         }
00132         if(atLeastOneWarning_ && nWarning != 0) {
00133           return (true);
00134         }
00135       }
00136     }
00137   }
00138   return (false);
00139 }
00140 
00141 void
00142 LogErrorFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
00143   edm::ParameterSetDescription desc;
00144   desc.add<edm::InputTag>("harvesterTag");
00145   desc.add<bool>("atLeastOneError");
00146   desc.add<bool>("atLeastOneWarning");
00147   desc.add<std::vector<std::string> >("avoidCategories");
00148   descriptions.add("logErrorFilter", desc);
00149 }
00150 
00151 //define this as a plug-in
00152 DEFINE_FWK_MODULE(LogErrorFilter);