00001
00002
00003
00004
00005
00006
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
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
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 }