00001 #include "DQM/SiPixelMonitorClient/interface/SiPixelEDAClient.h"
00002
00003
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005 #include "FWCore/Framework/interface/EventSetup.h"
00006 #include "FWCore/Framework/interface/LuminosityBlock.h"
00007 #include "FWCore/ServiceRegistry/interface/Service.h"
00008 #include "FWCore/ParameterSet/interface/FileInPath.h"
00009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00010
00011 #include "DataFormats/DetId/interface/DetId.h"
00012 #include "DataFormats/GeometrySurface/interface/Surface.h"
00013 #include "DataFormats/SiPixelDetId/interface/PixelBarrelName.h"
00014 #include "DataFormats/SiPixelDetId/interface/PixelBarrelNameUpgrade.h"
00015 #include "DataFormats/SiPixelDetId/interface/PixelEndcapName.h"
00016 #include "DataFormats/SiPixelDetId/interface/PixelEndcapNameUpgrade.h"
00017 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
00018 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00019 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00020 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00021
00022 #include "CondFormats/SiPixelObjects/interface/DetectorIndex.h"
00023 #include "CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h"
00024
00025 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
00026 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00027 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00028 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h"
00029 #include "Geometry/CommonTopologies/interface/PixelTopology.h"
00030
00031 #include "DQMServices/Core/interface/DQMStore.h"
00032 #include "DQMServices/Core/interface/MonitorElement.h"
00033
00034 #include "DQM/SiPixelMonitorClient/interface/SiPixelWebInterface.h"
00035 #include "DQM/SiPixelMonitorClient/interface/SiPixelActionExecutor.h"
00036 #include "DQM/SiPixelMonitorClient/interface/SiPixelInformationExtractor.h"
00037 #include "DQM/SiPixelMonitorClient/interface/SiPixelDataQuality.h"
00038 #include "DQM/SiPixelMonitorClient/interface/SiPixelUtility.h"
00039
00040 #include "xgi/Method.h"
00041 #include "xgi/Utils.h"
00042
00043 #include "cgicc/Cgicc.h"
00044 #include "cgicc/FormEntry.h"
00045 #include "cgicc/HTMLClasses.h"
00046
00047 #include <iostream>
00048 #include <iomanip>
00049 #include <stdio.h>
00050 #include <string>
00051 #include <sstream>
00052 #include <math.h>
00053
00054 #define BUF_SIZE 256
00055
00056 using namespace edm;
00057 using namespace std;
00058
00059
00060
00061 SiPixelEDAClient::SiPixelEDAClient(const edm::ParameterSet& ps) :
00062 ModuleWeb("SiPixelEDAClient"){
00063
00064
00065 edm::LogInfo("SiPixelEDAClient") << " Creating SiPixelEDAClient " << "\n" ;
00066
00067 bei_ = Service<DQMStore>().operator->();
00068
00069 summaryFrequency_ = ps.getUntrackedParameter<int>("SummaryCreationFrequency",20);
00070 tkMapFrequency_ = ps.getUntrackedParameter<int>("TkMapCreationFrequency",50);
00071 staticUpdateFrequency_ = ps.getUntrackedParameter<int>("StaticUpdateFrequency",10);
00072 actionOnLumiSec_ = ps.getUntrackedParameter<bool>("ActionOnLumiSection",false);
00073 actionOnRunEnd_ = ps.getUntrackedParameter<bool>("ActionOnRunEnd",true);
00074 evtOffsetForInit_ = ps.getUntrackedParameter<int>("EventOffsetForInit",10);
00075 offlineXMLfile_ = ps.getUntrackedParameter<bool>("UseOfflineXMLFile",false);
00076 hiRes_ = ps.getUntrackedParameter<bool>("HighResolutionOccupancy",false);
00077 noiseRate_ = ps.getUntrackedParameter<double>("NoiseRateCutValue",0.001);
00078 noiseRateDenominator_ = ps.getUntrackedParameter<int>("NEventsForNoiseCalculation",100000);
00079 Tier0Flag_ = ps.getUntrackedParameter<bool>("Tier0Flag",false);
00080 doHitEfficiency_ = ps.getUntrackedParameter<bool>("DoHitEfficiency",true);
00081 inputSource_ = ps.getUntrackedParameter<string>("inputSource", "source");
00082 isUpgrade_ = ps.getUntrackedParameter<bool>("isUpgrade",false);
00083
00084 if(!Tier0Flag_){
00085 string localPath = string("DQM/SiPixelMonitorClient/test/loader.html");
00086 ifstream fin(edm::FileInPath(localPath).fullPath().c_str(), ios::in);
00087 char buf[BUF_SIZE];
00088
00089 if (!fin) {
00090 cerr << "Input File: loader.html"<< " could not be opened!" << endl;
00091 return;
00092 }
00093
00094 while (fin.getline(buf, BUF_SIZE, '\n')) {
00095 html_out_ << buf ;
00096 }
00097 fin.close();
00098
00099 }
00100
00101
00102 sipixelWebInterface_ = new SiPixelWebInterface(bei_,offlineXMLfile_,Tier0Flag_);
00103
00104 sipixelInformationExtractor_ = new SiPixelInformationExtractor(offlineXMLfile_);
00105 sipixelActionExecutor_ = new SiPixelActionExecutor(offlineXMLfile_, Tier0Flag_);
00106 sipixelDataQuality_ = new SiPixelDataQuality(offlineXMLfile_);
00107
00108
00109 }
00110
00111
00112
00113 SiPixelEDAClient::~SiPixelEDAClient(){
00114
00115
00116 edm::LogInfo("SiPixelEDAClient") << " Deleting SiPixelEDAClient " << "\n" ;
00117 if (sipixelWebInterface_) {
00118 delete sipixelWebInterface_;
00119 sipixelWebInterface_ = 0;
00120 }
00121 if (sipixelInformationExtractor_) {
00122 delete sipixelInformationExtractor_;
00123 sipixelInformationExtractor_ = 0;
00124 }
00125 if (sipixelActionExecutor_) {
00126 delete sipixelActionExecutor_;
00127 sipixelActionExecutor_ = 0;
00128 }
00129 if (sipixelDataQuality_) {
00130 delete sipixelDataQuality_;
00131 sipixelDataQuality_ = 0;
00132 }
00133
00134
00135 }
00136
00137
00138
00139 void SiPixelEDAClient::beginJob(){
00140 firstRun = true;
00141 }
00142
00143
00144
00145 void SiPixelEDAClient::beginRun(Run const& run, edm::EventSetup const& eSetup) {
00146 edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: Begining of Run";
00147
00148
00149 if(firstRun){
00150
00151
00152 if (!sipixelWebInterface_->readConfiguration(tkMapFrequency_,summaryFrequency_)) {
00153 edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: Error to read configuration file!! Summary will not be produced!!!";
00154 summaryFrequency_ = -1;
00155 tkMapFrequency_ = -1;
00156 actionOnLumiSec_ = false;
00157 actionOnRunEnd_ = true;
00158 evtOffsetForInit_ = -1;
00159 }
00160 nLumiSecs_ = 0;
00161 nEvents_ = 0;
00162 if(Tier0Flag_) nFEDs_ = 40;
00163 else nFEDs_ = 0;
00164
00165 bei_->setCurrentFolder("Pixel/");
00166
00167
00168
00169 sipixelActionExecutor_->createSummary(bei_, isUpgrade_);
00170
00171 if(!Tier0Flag_) sipixelActionExecutor_->bookDeviations(bei_, isUpgrade_);
00172
00173 if(doHitEfficiency_) sipixelActionExecutor_->bookEfficiency(bei_, isUpgrade_);
00174
00175 sipixelActionExecutor_->bookOccupancyPlots(bei_, hiRes_);
00176
00177 if(noiseRate_>0.) sipixelInformationExtractor_->bookNoisyPixels(bei_, noiseRate_, Tier0Flag_);
00178
00179 sipixelDataQuality_->bookGlobalQualityFlag(bei_, Tier0Flag_, nFEDs_);
00180
00181
00182
00183
00184
00185
00186
00187 firstRun = false;
00188 }
00189
00190
00191
00192 }
00193
00194
00195
00196 void SiPixelEDAClient::beginLuminosityBlock(edm::LuminosityBlock const& lumiSeg,
00197 edm::EventSetup const& context) {
00198
00199
00200 edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: Begin of LS transition";
00201
00202 nEvents_lastLS_=0; nErrorsBarrel_lastLS_=0; nErrorsEndcap_lastLS_=0;
00203 MonitorElement * me = bei_->get("Pixel/AdditionalPixelErrors/byLumiErrors");
00204 if(me){
00205 nEvents_lastLS_ = int(me->getBinContent(0));
00206 nErrorsBarrel_lastLS_ = int(me->getBinContent(1));
00207 nErrorsEndcap_lastLS_ = int(me->getBinContent(2));
00208
00209 me->Reset();
00210 }
00211
00212 }
00213
00214
00215
00216 void SiPixelEDAClient::analyze(const edm::Event& e, const edm::EventSetup& eSetup){
00217
00218 nEvents_++;
00219 if(!Tier0Flag_){
00220
00221 if(nEvents_==1){
00222
00223 edm::Handle<FEDRawDataCollection> rawDataHandle;
00224 e.getByLabel(inputSource_, rawDataHandle);
00225 if(!rawDataHandle.isValid()){
00226 edm::LogInfo("SiPixelEDAClient") << inputSource_ << " is empty";
00227 return;
00228 }
00229 const FEDRawDataCollection& rawDataCollection = *rawDataHandle;
00230 nFEDs_ = 0;
00231 for(int i = 0; i != 40; i++){
00232 if(rawDataCollection.FEDData(i).size() && rawDataCollection.FEDData(i).data()) nFEDs_++;
00233 }
00234 }
00235
00236
00237 sipixelWebInterface_->setActionFlag(SiPixelWebInterface::CreatePlots);
00238 sipixelWebInterface_->performAction();
00239 }
00240
00241 }
00242
00243
00244
00245 void SiPixelEDAClient::endLuminosityBlock(edm::LuminosityBlock const& lumiSeg, edm::EventSetup const& eSetup) {
00246
00247
00248 edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: End of LS transition, performing the DQM client operation";
00249
00250 nLumiSecs_++;
00251
00252
00253 edm::LogInfo("SiPixelEDAClient") << "====================================================== " << endl << " ===> Iteration # " << nLumiSecs_ << " " << lumiSeg.luminosityBlock() << endl << "====================================================== " << endl;
00254
00255
00256 if(actionOnLumiSec_ && nLumiSecs_ % 1 == 0 ){
00257 sipixelWebInterface_->setActionFlag(SiPixelWebInterface::Summary);
00258 sipixelWebInterface_->performAction();
00259
00260 if(doHitEfficiency_) sipixelActionExecutor_->createEfficiency(bei_, isUpgrade_);
00261
00262 sipixelWebInterface_->setActionFlag(SiPixelWebInterface::QTestResult);
00263 sipixelWebInterface_->performAction();
00264
00265 sipixelActionExecutor_->createOccupancy(bei_);
00266
00267 bei_->cd();
00268 bool init=true;
00269
00270 sipixelDataQuality_->computeGlobalQualityFlagByLumi(bei_,init,nFEDs_,Tier0Flag_,nEvents_lastLS_,nErrorsBarrel_lastLS_,nErrorsEndcap_lastLS_);
00271 init=true;
00272 bei_->cd();
00273 sipixelDataQuality_->fillGlobalQualityPlot(bei_,init,eSetup,nFEDs_,Tier0Flag_,nLumiSecs_);
00274
00275 init=true;
00276 if(noiseRate_>=0.) sipixelInformationExtractor_->findNoisyPixels(bei_, init, noiseRate_, noiseRateDenominator_, eSetup);
00277
00278
00279
00280
00281
00282
00283 }
00284
00285
00286 }
00287
00288
00289
00290 void SiPixelEDAClient::endRun(edm::Run const& run, edm::EventSetup const& eSetup){
00291
00292
00293
00294
00295
00296 if(actionOnRunEnd_){
00297
00298 sipixelWebInterface_->setActionFlag(SiPixelWebInterface::Summary);
00299
00300
00301 if(doHitEfficiency_) sipixelActionExecutor_->createEfficiency(bei_, isUpgrade_);
00302
00303 sipixelWebInterface_->setActionFlag(SiPixelWebInterface::QTestResult);
00304 sipixelWebInterface_->performAction();
00305
00306 sipixelActionExecutor_->createOccupancy(bei_);
00307
00308 bei_->cd();
00309 bool init=true;
00310 sipixelDataQuality_->computeGlobalQualityFlag(bei_,init,nFEDs_,Tier0Flag_);
00311 init=true;
00312 bei_->cd();
00313
00314 sipixelDataQuality_->fillGlobalQualityPlot(bei_,init,eSetup,nFEDs_,Tier0Flag_,nLumiSecs_);
00315
00316 init=true;
00317 if(noiseRate_>=0.) sipixelInformationExtractor_->findNoisyPixels(bei_, init, noiseRate_, noiseRateDenominator_, eSetup);
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329 }
00330
00331
00332 }
00333
00334
00335
00336
00337 void SiPixelEDAClient::endJob(){
00338
00339 edm::LogInfo("SiPixelEDAClient") <<"[SiPixelEDAClient]: endjob called!";
00340
00341 }
00342
00343
00344
00345 void SiPixelEDAClient::defaultWebPage(xgi::Input *in, xgi::Output *out)
00346 {
00347
00348
00349 bool isRequest = false;
00350 cgicc::Cgicc cgi(in);
00351 cgicc::CgiEnvironment cgie(in);
00352
00353
00354
00355 string q_string = cgie.getQueryString();
00356 if (q_string.find("RequestID") != string::npos) isRequest = true;
00357 if (!isRequest) {
00358 *out << html_out_.str() << std::endl;
00359 } else {
00360
00361 int iter = nEvents_/100;
00362 sipixelWebInterface_->handleEDARequest(in, out, iter);
00363 }
00364
00365
00366 }
00367