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