CMS 3D CMS Logo

QualityTester.cc

Go to the documentation of this file.
00001 /*
00002  * \file QualityTester.cc
00003  *
00004  * $Date: 2008/11/24 20:07:28 $
00005  * $Revision: 1.15 $
00006  * \author M. Zanetti - CERN PH
00007  *
00008  */
00009 
00010 #include "DQMServices/Components/interface/QualityTester.h"
00011 #include "DQMServices/ClientConfig/interface/QTestHandle.h"
00012 #include "DQMServices/Core/interface/DQMStore.h"
00013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00014 #include "FWCore/ServiceRegistry/interface/Service.h"
00015 #include <FWCore/ParameterSet/interface/FileInPath.h>
00016 #include <stdio.h>
00017 #include <sstream>
00018 #include <math.h>
00019 
00020 using namespace edm;
00021 using namespace std;
00022 
00023 QualityTester::QualityTester(const ParameterSet& ps)
00024 {
00025   prescaleFactor = ps.getUntrackedParameter<int>("prescaleFactor", 1);
00026   getQualityTestsFromFile = ps.getUntrackedParameter<bool>("getQualityTestsFromFile", true);
00027   reportThreshold = ps.getUntrackedParameter<string>("reportThreshold", "");
00028   testInEventloop = ps.getUntrackedParameter<bool>("testInEventloop",false);
00029   qtestOnEndRun   = ps.getUntrackedParameter<bool>("qtestOnEndRun",false);
00030   qtestOnEndJob   = ps.getUntrackedParameter<bool>("qtestOnEndJob",false);
00031   qtestOnEndLumi  = ps.getUntrackedParameter<bool>("qtestOnEndLumi",true);
00032   verboseQT       = ps.getUntrackedParameter<bool>("verboseQT", true);
00033 
00034   bei = &*edm::Service<DQMStore>();
00035 
00036   qtHandler=new QTestHandle;
00037 
00038   // if you use this module, it's non-sense not to provide the QualityTests.xml
00039   if (getQualityTestsFromFile) {
00040     edm::FileInPath qtlist = ps.getUntrackedParameter<edm::FileInPath>("qtList");
00041     qtHandler->configureTests(FileInPath(qtlist).fullPath(), bei);
00042   }
00043 
00044   nEvents = 0;
00045 
00046 }
00047 
00048 
00049 QualityTester::~QualityTester()
00050 {
00051   delete qtHandler;
00052 }
00053 
00054 void QualityTester::analyze(const edm::Event& e, const edm::EventSetup& c) 
00055 {
00056   if (testInEventloop) {
00057     nEvents++;
00058     if (getQualityTestsFromFile 
00059         && prescaleFactor > 0 
00060         && nEvents % prescaleFactor == 0)  {
00061       performTests();
00062     }
00063   }
00064 }
00065 
00066 void QualityTester::endLuminosityBlock(LuminosityBlock const& lumiSeg, EventSetup const& context)
00067 {
00068   if (!testInEventloop&&qtestOnEndLumi) {
00069     if (getQualityTestsFromFile
00070         && prescaleFactor > 0
00071         && lumiSeg.id().luminosityBlock() % prescaleFactor == 0) {
00072       performTests();
00073     }
00074   }
00075 }
00076 
00077 void QualityTester::endRun(const Run& r, const EventSetup& context){
00078   if (qtestOnEndRun) performTests();
00079 }
00080 
00081 void QualityTester::endJob(){
00082   if (qtestOnEndJob) performTests();
00083 }
00084 
00085 void QualityTester::performTests(void)
00086 {
00087     // done here because new ME can appear while processing data
00088     qtHandler->attachTests(bei,verboseQT);
00089 
00090     edm::LogVerbatim ("QualityTester") << "Running the Quality Test";
00091 
00092     bei->runQTests();
00093 
00094     if (reportThreshold.size() != 0)
00095     {
00096       std::map< std::string, std::vector<std::string> > theAlarms
00097         = qtHandler->checkDetailedQTStatus(bei);
00098 
00099       for (std::map<std::string,std::vector<std::string> >::iterator itr = theAlarms.begin();
00100            itr != theAlarms.end(); ++itr)
00101       {
00102         const std::string &alarmType = itr->first;
00103         const std::vector<std::string> &msgs = itr->second;
00104         if ((reportThreshold == "black")
00105             || (reportThreshold == "orange" && (alarmType == "orange" || alarmType == "red"))
00106             || (reportThreshold == "red" && alarmType == "red"))
00107         {
00108           std::cout << std::endl;
00109           std::cout << "Error Type: " << alarmType << std::endl;
00110           for (std::vector<std::string>::const_iterator msg = msgs.begin();
00111                msg != msgs.end(); ++msg)
00112             std::cout << *msg << std::endl;
00113         }
00114       }
00115       std::cout << std::endl;
00116     }
00117 }

Generated on Tue Jun 9 17:34:11 2009 for CMSSW by  doxygen 1.5.4