00001 #include "FEDMonitorClient.h"
00002
00003 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00004 #include "DQMServices/Core/interface/DQMStore.h"
00005 #include "DQMServices/Core/interface/MonitorElement.h"
00006
00007 #include <iostream>
00008 #include <typeinfo>
00009 #include <map>
00010 #include <sstream>
00011
00012 #include "xgi/Method.h"
00013 #include "xgi/Utils.h"
00014
00015 #include "cgicc/Cgicc.h"
00016 #include "cgicc/FormEntry.h"
00017 #include "cgicc/HTMLClasses.h"
00018
00019 using namespace std;
00020 namespace dqm{
00021 namespace daq{
00022
00023
00024 FEDMonitorClient::FEDMonitorClient( const edm::ParameterSet& pset) :
00025 ModuleWeb("FEDMonitorClient")
00026 , qtHandle_(0)
00027 , nUpdates_(0)
00028 , qtesttodo_(pset.getUntrackedParameter<bool>("doQTests",false))
00029 , autorefresh_(false)
00030 {
00031
00032
00033 dbe = edm::Service<DQMStore>().operator->();
00034
00035
00036
00037 mui = new DQMOldReceiver();
00038
00039 dbe->showDirStructure();
00040
00041 if(qtesttodo_) bookQTests(pset);
00042
00043 }
00044 void FEDMonitorClient::analyze(const edm::Event & e, const edm::EventSetup& c)
00045 {
00046 eventId_ = e.id().event();
00047 runId_ = e.id().run();
00048 nUpdates_++;
00049 }
00050
00051 void FEDMonitorClient::endLuminosityBlock(edm::LuminosityBlock const &lb, edm::EventSetup const &es)
00052 {
00053 std::cout << "here I will do something intelligent later " << std::endl;
00054 }
00055 void FEDMonitorClient::bookQTests(const edm::ParameterSet &pset)
00056 {
00057 qtHandle_ = new QTestHandle;
00058 qtHandle_->configureTests(pset.getUntrackedParameter<std::string>("qtList", "QualityTests.xml"),dbe);
00059 if(qtHandle_) qtHandle_->attachTests(dbe);
00060 }
00061
00062 void FEDMonitorClient::defaultWebPage(xgi::Input *in, xgi::Output *out)
00063 {
00064
00065 std::string path;
00066 std::string mname;
00067 try
00068 {
00069 cgicc::Cgicc cgi(in);
00070 if ( xgi::Utils::hasFormElement(cgi,"autorefresh") )
00071 autorefresh_ = xgi::Utils::getFormElement(cgi, "autorefresh")->getIntegerValue() != 0;
00072 if ( xgi::Utils::hasFormElement(cgi,"module") )
00073 mname = xgi::Utils::getFormElement(cgi, "module")->getValue();
00074 cgicc::CgiEnvironment cgie(in);
00075 path = cgie.getPathInfo() + "?" + cgie.getQueryString();
00076 }
00077 catch (const std::exception & e)
00078 {
00079
00080 }
00081
00082
00083 using std::endl;
00084 *out << "<html>" << endl;
00085 *out << "<head>" << endl;
00086
00087 *out << "<title>" << typeid(FEDMonitorClient).name()
00088 << " MAIN</title>" << endl;
00089 if (autorefresh_) {
00090 *out << "<meta https-equiv=\"refresh\" content=\"3\">" << endl;
00091 }
00092
00093 *out << "</head>" << endl;
00094 *out << "<body>" << endl;
00095
00096 *out << cgicc::form().set("method","GET").set("action", path )
00097 << std::endl;
00098 *out << cgicc::input().set("type","hidden").set("name","module").set("value", mname)
00099 << std::endl;
00100 *out << cgicc::input().set("type","hidden").set("name","autorefresh").set("value", autorefresh_?"0":"1")
00101 << std::endl;
00102 *out << cgicc::input().set("type","submit").set("value",autorefresh_?"Toggle AutoRefresh OFF":"Toggle AutoRefresh ON")
00103 << std::endl;
00104 *out << cgicc::form() << std::endl;
00105
00106
00107 *out << "<p>Run: " << runId_ << " Total updates: " << nUpdates_ << " Last Event analyzed: "
00108 << eventId_;
00109
00110
00111 *out << " FED Monitor status " << endl;
00112
00113
00114 int status = dbe->getStatus();
00115 switch(status)
00116 {
00117 case dqm::qstatus::ERROR:
00118 *out << " Error(s)";
00119 break;
00120 case dqm::qstatus::WARNING:
00121 *out << " Warning(s)";
00122 break;
00123 case dqm::qstatus::OTHER:
00124 *out << " Some tests did not run;";
00125 break;
00126 default:
00127 *out << (nUpdates_ > 2 ? " No problems" : "Starting");
00128 }
00129
00130 *out << "<table>" << endl;
00131 *out << "<tr><th>SubSystem</th><th>Present/Nominal</th><th>Errors</th><th>Warnings</th><th>Other</th></tr>" << endl;
00132
00133
00134
00135
00136
00137
00138
00139
00140 int sstn = 0;
00141 int sste = 0;
00142 int sstw = 0;
00143 int ssto = 0;
00144 pair<int, int> range = FEDNumbering::getSiStripFEDIds();
00145 int sstt = range.second - range.first + 1;
00146 for (int i = range.first; i <= range.second; i++)
00147 {
00148 ostringstream oss;
00149 oss << "FEDs/Collated/fed" << i;
00150 MonitorElement *me = dbe->get(oss.str());
00151 if(me != 0)
00152 {
00153 sstn++;
00154 if(me->hasError()) sste++;
00155 if(me->hasWarning()) sstw++;
00156 if(me->hasOtherReport()) ssto++;
00157 }
00158 }
00159 *out << "<tr><td bgcolor=";
00160 if(sstn==0)
00161 *out << "\"grey\"";
00162 else if(sste!=0)
00163 *out << "\"red\"";
00164 else if(sstw!=0)
00165 *out << "\"orange\"";
00166 else if(ssto!=0)
00167 *out << "\"yellow\"";
00168 else
00169 *out << "\"green\"";
00170
00171 *out << ">SiStrip </td><td> " << sstn << "/" << sstt
00172 << " </td><td> " << sste << " </td><td> " << sstw
00173 << " </td><td> " << ssto << " </td></tr> " << endl;
00174
00175 sstn = 0; sste=0; sstw=0; ssto=0;
00176 range = FEDNumbering::getSiPixelFEDIds();
00177 sstt = range.second - range.first + 1;
00178 for (int i = range.first; i <= range.second; i++)
00179 {
00180 ostringstream oss;
00181 oss << "FEDs/Collated/fed" << i;
00182 MonitorElement *me = dbe->get(oss.str());
00183 if(me != 0)
00184 {
00185 sstn++;
00186 if(me->hasError()) sste++;
00187 if(me->hasWarning()) sstw++;
00188 if(me->hasOtherReport()) ssto++;
00189 }
00190 }
00191 *out << "<tr><td bgcolor=";
00192 if(sstn==0)
00193 *out << "\"grey\"";
00194 else if(sste!=0)
00195 *out << "\"red\"";
00196 else if(sstw!=0)
00197 *out << "\"orange\"";
00198 else if(ssto!=0)
00199 *out << "\"yellow\"";
00200 else
00201 *out << "\"green\"";
00202
00203 *out << ">SiPixel </td><td> " << sstn << "/" << sstt
00204 << " </td><td> " << sste << " </td><td> " << sstw
00205 << " </td><td> " << ssto << " </td></tr> " << endl;
00206
00207 sstn = 0; sste=0; sstw=0; ssto=0;
00208 range = FEDNumbering::getDTFEDIds();
00209 sstt = range.second - range.first + 1;
00210 for (int i = range.first; i <= range.second; i++)
00211 {
00212 ostringstream oss;
00213 oss << "FEDs/Collated/fed" << i;
00214 MonitorElement *me = dbe->get(oss.str());
00215 if(me != 0)
00216 {
00217 sstn++;
00218 if(me->hasError()) sste++;
00219 if(me->hasWarning()) sstw++;
00220 if(me->hasOtherReport()) ssto++;
00221 }
00222 }
00223 *out << "<tr><td bgcolor=";
00224 if(sstn==0)
00225 *out << "\"grey\"";
00226 else if(sste!=0)
00227 *out << "\"red\"";
00228 else if(sstw!=0)
00229 *out << "\"orange\"";
00230 else if(ssto!=0)
00231 *out << "\"yellow\"";
00232 else
00233 *out << "\"green\"";
00234
00235 *out << ">DT </td><td> " << sstn << "/" << sstt
00236 << " </td><td> " << sste << " </td><td> " << sstw
00237 << " </td><td> " << ssto << " </td></tr> " << endl;
00238
00239
00240 sstn = 0; sste=0; sstw=0; ssto=0;
00241 range = FEDNumbering::getCSCFEDIds();
00242 sstt = range.second - range.first + 1;
00243 for (int i = range.first; i <= range.second; i++)
00244 {
00245 ostringstream oss;
00246 oss << "FEDs/Collated/fed" << i;
00247 MonitorElement *me = dbe->get(oss.str());
00248 if(me != 0)
00249 {
00250 sstn++;
00251 if(me->hasError()) sste++;
00252 if(me->hasWarning()) sstw++;
00253 if(me->hasOtherReport()) ssto++;
00254 }
00255 }
00256 *out << "<tr><td bgcolor=";
00257 if(sstn==0)
00258 *out << "\"grey\"";
00259 else if(sste!=0)
00260 *out << "\"red\"";
00261 else if(sstw!=0)
00262 *out << "\"orange\"";
00263 else if(ssto!=0)
00264 *out << "\"yellow\"";
00265 else
00266 *out << "\"green\"";
00267
00268 *out << ">CSC </td><td> " << sstn << "/" << sstt
00269 << " </td><td> " << sste << " </td><td> " << sstw
00270 << " </td><td> " << ssto << " </td></tr> " << endl;
00271
00272 sstn = 0; sste=0; sstw=0; ssto=0;
00273 range = FEDNumbering::getDTTFFEDIds();
00274 sstt = range.second - range.first + 1;
00275 for (int i = range.first; i <= range.second; i++)
00276 {
00277 ostringstream oss;
00278 oss << "FEDs/Collated/fed" << i;
00279 MonitorElement *me = dbe->get(oss.str());
00280 if(me != 0)
00281 {
00282 sstn++;
00283 if(me->hasError()) sste++;
00284 if(me->hasWarning()) sstw++;
00285 if(me->hasOtherReport()) ssto++;
00286 }
00287 }
00288 *out << "<tr><td bgcolor=";
00289 if(sstn==0)
00290 *out << "\"grey\"";
00291 else if(sste!=0)
00292 *out << "\"red\"";
00293 else if(sstw!=0)
00294 *out << "\"orange\"";
00295 else if(ssto!=0)
00296 *out << "\"yellow\"";
00297 else
00298 *out << "\"green\"";
00299
00300 *out << ">DTTF </td><td> " << sstn << "/" << sstt
00301 << " </td><td> " << sste << " </td><td> " << sstw
00302 << " </td><td> " << ssto << " </td></tr> " << endl;
00303
00304
00305 sstn = 0; sste=0; sstw=0; ssto=0;
00306 range = FEDNumbering::getRPCFEDIds();
00307 sstt = range.second - range.first + 1;
00308 for (int i = range.first; i <= range.second; i++)
00309 {
00310 ostringstream oss;
00311 oss << "FEDs/Collated/fed" << i;
00312 MonitorElement *me = dbe->get(oss.str());
00313 if(me != 0)
00314 {
00315 sstn++;
00316 if(me->hasError()) sste++;
00317 if(me->hasWarning()) sstw++;
00318 if(me->hasOtherReport()) ssto++;
00319 }
00320 }
00321 *out << "<tr><td bgcolor=";
00322 if(sstn==0)
00323 *out << "\"grey\"";
00324 else if(sste!=0)
00325 *out << "\"red\"";
00326 else if(sstw!=0)
00327 *out << "\"orange\"";
00328 else if(ssto!=0)
00329 *out << "\"yellow\"";
00330 else
00331 *out << "\"green\"";
00332
00333 *out << ">RPC </td><td> " << sstn << "/" << sstt
00334 << " </td><td> " << sste << " </td><td> " << sstw
00335 << " </td><td> " << ssto << " </td></tr> " << endl;
00336
00337 sstn = 0; sste=0; sstw=0; ssto=0;
00338 range = FEDNumbering::getPreShowerFEDIds();
00339 sstt = range.second - range.first + 1;
00340 for (int i = range.first; i <= range.second; i++)
00341 {
00342 ostringstream oss;
00343 oss << "FEDs/Collated/fed" << i;
00344 MonitorElement *me = dbe->get(oss.str());
00345 if(me != 0)
00346 {
00347 sstn++;
00348 if(me->hasError()) sste++;
00349 if(me->hasWarning()) sstw++;
00350 if(me->hasOtherReport()) ssto++;
00351 }
00352 }
00353 *out << "<tr><td bgcolor=";
00354 if(sstn==0)
00355 *out << "\"grey\"";
00356 else if(sste!=0)
00357 *out << "\"red\"";
00358 else if(sstw!=0)
00359 *out << "\"orange\"";
00360 else if(ssto!=0)
00361 *out << "\"yellow\"";
00362 else
00363 *out << "\"green\"";
00364
00365 *out << ">PreShower </td><td> " << sstn << "/" << sstt
00366 << " </td><td> " << sste << " </td><td> " << sstw
00367 << " </td><td> " << ssto << " </td></tr> " << endl;
00368
00369 sstn = 0; sste=0; sstw=0; ssto=0;
00370 range = FEDNumbering::getEcalFEDIds();
00371 sstt = range.second - range.first + 1;
00372 for (int i = range.first; i <= range.second; i++)
00373 {
00374 ostringstream oss;
00375 oss << "FEDs/Collated/fed" << i;
00376 MonitorElement *me = dbe->get(oss.str());
00377 if(me != 0)
00378 {
00379 sstn++;
00380 if(me->hasError()) sste++;
00381 if(me->hasWarning()) sstw++;
00382 if(me->hasOtherReport()) ssto++;
00383 }
00384 }
00385 *out << "<tr><td bgcolor=";
00386 if(sstn==0)
00387 *out << "\"grey\"";
00388 else if(sste!=0)
00389 *out << "\"red\"";
00390 else if(sstw!=0)
00391 *out << "\"orange\"";
00392 else if(ssto!=0)
00393 *out << "\"yellow\"";
00394 else
00395 *out << "\"green\"";
00396
00397 *out << ">Ecal </td><td> " << sstn << "/" << sstt
00398 << " </td><td> " << sste << " </td><td> " << sstw
00399 << " </td><td> " << ssto << " </td></tr> " << endl;
00400
00401 sstn = 0; sste=0; sstw=0; ssto=0;
00402 range = FEDNumbering::getHcalFEDIds();
00403 sstt = range.second - range.first + 1;
00404 for (int i = range.first; i <= range.second; i++)
00405 {
00406 ostringstream oss;
00407 oss << "FEDs/Collated/fed" << i;
00408 MonitorElement *me = dbe->get(oss.str());
00409 if(me != 0)
00410 {
00411 sstn++;
00412 if(me->hasError()) sste++;
00413 if(me->hasWarning()) sstw++;
00414 if(me->hasOtherReport()) ssto++;
00415 }
00416 }
00417 *out << "<tr><td bgcolor=";
00418 if(sstn==0)
00419 *out << "\"grey\"";
00420 else if(sste!=0)
00421 *out << "\"red\"";
00422 else if(sstw!=0)
00423 *out << "\"orange\"";
00424 else if(ssto!=0)
00425 *out << "\"yellow\"";
00426 else
00427 *out << "\"green\"";
00428
00429 *out << ">Hcal </td><td> " << sstn << "/" << sstt
00430 << " </td><td> " << sste << " </td><td> " << sstw
00431 << " </td><td> " << ssto << " </td></tr> " << endl;
00432
00433 sstn = 0; sste=0; sstw=0; ssto=0;
00434 range = FEDNumbering::getTriggerGTPFEDIds();
00435 sstt = range.second - range.first + 1;
00436 for (int i = range.first; i <= range.second; i++)
00437 {
00438 ostringstream oss;
00439 oss << "FEDs/Collated/fed" << i;
00440 MonitorElement *me = dbe->get(oss.str());
00441 if(me != 0)
00442 {
00443 sstn++;
00444 if(me->hasError()) sste++;
00445 if(me->hasWarning()) sstw++;
00446 if(me->hasOtherReport()) ssto++;
00447 }
00448 }
00449 *out << "<tr><td bgcolor=";
00450 if(sstn==0)
00451 *out << "\"grey\"";
00452 else if(sste!=0)
00453 *out << "\"red\"";
00454 else if(sstw!=0)
00455 *out << "\"orange\"";
00456 else if(ssto!=0)
00457 *out << "\"yellow\"";
00458 else
00459 *out << "\"green\"";
00460
00461 *out << ">GTP </td><td> " << sstn << "/" << sstt
00462 << " </td><td> " << sste << " </td><td> " << sstw
00463 << " </td><td> " << ssto << " </td></tr> " << endl;
00464
00465 sstn = 0; sste=0; sstw=0; ssto=0;
00466 range = FEDNumbering::getTriggerEGTPFEDIds();
00467 sstt = range.second - range.first + 1;
00468 for (int i = range.first; i <= range.second; i++)
00469 {
00470 ostringstream oss;
00471 oss << "FEDs/Collated/fed" << i;
00472 MonitorElement *me = dbe->get(oss.str());
00473 if(me != 0)
00474 {
00475 sstn++;
00476 if(me->hasError()) sste++;
00477 if(me->hasWarning()) sstw++;
00478 if(me->hasOtherReport()) ssto++;
00479 }
00480 }
00481 *out << "<tr><td bgcolor=";
00482 if(sstn==0)
00483 *out << "\"grey\"";
00484 else if(sste!=0)
00485 *out << "\"red\"";
00486 else if(sstw!=0)
00487 *out << "\"orange\"";
00488 else if(ssto!=0)
00489 *out << "\"yellow\"";
00490 else
00491 *out << "\"green\"";
00492
00493 *out << ">EGTP </td><td> " << sstn << "/" << sstt
00494 << " </td><td> " << sste << " </td><td> " << sstw
00495 << " </td><td> " << ssto << " </td></tr> " << endl;
00496
00497
00498 sstn = 0; sste=0; sstw=0; ssto=0;
00499 range = FEDNumbering::getCSCTFFEDIds();
00500 sstt = range.second - range.first + 1;
00501 for (int i = range.first; i <= range.second; i++)
00502 {
00503 ostringstream oss;
00504 oss << "FEDs/Collated/fed" << i;
00505 MonitorElement *me = dbe->get(oss.str());
00506 if(me != 0)
00507 {
00508 sstn++;
00509 if(me->hasError()) sste++;
00510 if(me->hasWarning()) sstw++;
00511 if(me->hasOtherReport()) ssto++;
00512 }
00513 }
00514 *out << "<tr><td bgcolor=";
00515 if(sstn==0)
00516 *out << "\"grey\"";
00517 else if(sste!=0)
00518 *out << "\"red\"";
00519 else if(sstw!=0)
00520 *out << "\"orange\"";
00521 else if(ssto!=0)
00522 *out << "\"yellow\"";
00523 else
00524 *out << "\"green\"";
00525
00526 *out << ">CSCTF </td><td> " << sstn << "/" << sstt
00527 << " </td><td> " << sste << " </td><td> " << sstw
00528 << " </td><td> " << ssto << " </td></tr> " << endl;
00529
00530 sstn = 0; sste=0; sstw=0; ssto=0;
00531 range = FEDNumbering::getDAQeFEDFEDIds();
00532 sstt = range.second - range.first + 1;
00533 for (int i = range.first; i <= range.second; i++)
00534 {
00535 ostringstream oss;
00536 oss << "FEDs/Collated/fed" << i;
00537 MonitorElement *me = dbe->get(oss.str());
00538 if(me != 0)
00539 {
00540 sstn++;
00541 if(me->hasError()) sste++;
00542 if(me->hasWarning()) sstw++;
00543 if(me->hasOtherReport()) ssto++;
00544 }
00545 }
00546 *out << "<tr><td bgcolor=";
00547 if(sstn==0)
00548 *out << "\"grey\"";
00549 else if(sste!=0)
00550 *out << "\"red\"";
00551 else if(sstw!=0)
00552 *out << "\"orange\"";
00553 else if(ssto!=0)
00554 *out << "\"yellow\"";
00555 else
00556 *out << "\"green\"";
00557
00558 *out << ">eFED </td><td> " << sstn << "/" << sstt
00559 << " </td><td> " << sste << " </td><td> " << sstw
00560 << " </td><td> " << ssto << " </td></tr> " << endl;
00561
00562 *out << "</table>" << endl;
00563 *out << "</body>" << endl;
00564 *out << "</html>" << endl;
00565 }
00566 std::string FEDMonitorClient::findSubsystemPath(std::string &subs)
00567 {
00568 return subs;
00569 }
00570
00571 }
00572 }