CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/src/DQM/SiPixelMonitorClient/src/SiPixelEDAClient.cc

Go to the documentation of this file.
00001 #include "DQM/SiPixelMonitorClient/interface/SiPixelEDAClient.h"
00002 
00003 // Framework
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 // -- Constructor
00060 //
00061 SiPixelEDAClient::SiPixelEDAClient(const edm::ParameterSet& ps) :
00062   ModuleWeb("SiPixelEDAClient"){
00063 // cout<<"Entering  SiPixelEDAClient::SiPixelEDAClient: "<<endl;
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); //client
00073   actionOnRunEnd_        = ps.getUntrackedParameter<bool>("ActionOnRunEnd",true); //client
00074   evtOffsetForInit_      = ps.getUntrackedParameter<int>("EventOffsetForInit",10); //client
00075   offlineXMLfile_        = ps.getUntrackedParameter<bool>("UseOfflineXMLFile",false); //client
00076   hiRes_                 = ps.getUntrackedParameter<bool>("HighResolutionOccupancy",false); //client
00077   noiseRate_             = ps.getUntrackedParameter<double>("NoiseRateCutValue",0.001); //client
00078   noiseRateDenominator_  = ps.getUntrackedParameter<int>("NEventsForNoiseCalculation",100000); //client
00079   Tier0Flag_             = ps.getUntrackedParameter<bool>("Tier0Flag",false); //client
00080   doHitEfficiency_       = ps.getUntrackedParameter<bool>("DoHitEfficiency",true); //client
00081   inputSource_           = ps.getUntrackedParameter<string>("inputSource",  "source");
00082   isUpgrade_             = ps.getUntrackedParameter<bool>("isUpgrade",false); //client
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')) { // pops off the newline character 
00095       html_out_ << buf ;
00096     }
00097     fin.close();
00098 
00099   }
00100   
00101   // instantiate web interface
00102   sipixelWebInterface_ = new SiPixelWebInterface(bei_,offlineXMLfile_,Tier0Flag_);
00103   //instantiate the three work horses of the client:
00104   sipixelInformationExtractor_ = new SiPixelInformationExtractor(offlineXMLfile_);
00105   sipixelActionExecutor_ = new SiPixelActionExecutor(offlineXMLfile_, Tier0Flag_);
00106   sipixelDataQuality_ = new SiPixelDataQuality(offlineXMLfile_);
00107   
00108 // cout<<"...leaving  SiPixelEDAClient::SiPixelEDAClient. "<<endl;
00109 }
00110 //
00111 // -- Destructor
00112 //
00113 SiPixelEDAClient::~SiPixelEDAClient(){
00114 //  cout<<"Entering SiPixelEDAClient::~SiPixelEDAClient: "<<endl;
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 //  cout<<"...leaving SiPixelEDAClient::~SiPixelEDAClient. "<<endl;
00135 }
00136 //
00137 // -- Begin Job
00138 //
00139 void SiPixelEDAClient::beginJob(){
00140   firstRun = true;
00141 }
00142 //
00143 // -- Begin Run
00144 //
00145 void SiPixelEDAClient::beginRun(Run const& run, edm::EventSetup const& eSetup) {
00146   edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: Begining of Run";
00147 //  cout<<"Entering SiPixelEDAClient::beginRun: "<<endl;
00148 
00149   if(firstRun){
00150   
00151   // Read the summary configuration file
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   // Setting up QTests:
00167 //  sipixelActionExecutor_->setupQTests(bei_);
00168   // Creating Summary Histos:
00169   sipixelActionExecutor_->createSummary(bei_, isUpgrade_);
00170   // Booking Deviation Histos:
00171   if(!Tier0Flag_) sipixelActionExecutor_->bookDeviations(bei_, isUpgrade_);
00172   // Booking Efficiency Histos:
00173   if(doHitEfficiency_) sipixelActionExecutor_->bookEfficiency(bei_, isUpgrade_);
00174   // Creating occupancy plots:
00175   sipixelActionExecutor_->bookOccupancyPlots(bei_, hiRes_);
00176   // Booking noisy pixel ME's:
00177   if(noiseRate_>0.) sipixelInformationExtractor_->bookNoisyPixels(bei_, noiseRate_, Tier0Flag_);
00178   // Booking summary report ME's:
00179   sipixelDataQuality_->bookGlobalQualityFlag(bei_, Tier0Flag_, nFEDs_);
00180   // Booking Static Tracker Maps:
00181 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "adc");
00182 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "charge");
00183 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "ndigis");
00184 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "NErrors");
00185   
00186   
00187   firstRun = false;
00188   }
00189 
00190 //  cout<<"...leaving SiPixelEDAClient::beginRun. "<<endl;
00191 
00192 }
00193 //
00194 // -- Begin  Luminosity Block
00195 //
00196 void SiPixelEDAClient::beginLuminosityBlock(edm::LuminosityBlock const& lumiSeg, 
00197                                             edm::EventSetup const& context) {
00198 //  cout<<"Entering SiPixelEDAClient::beginLuminosityBlock: "<<endl;
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     //std::cout<<"Nevts in lastLS in EDAClient: "<<nEvents_lastLS_<<" "<<nErrorsBarrel_lastLS_<<" "<<nErrorsEndcap_lastLS_<<std::endl;
00209     me->Reset();
00210   }
00211 //  cout<<"...leaving SiPixelEDAClient::beginLuminosityBlock. "<<endl;
00212 }
00213 //
00214 //  -- Analyze 
00215 //
00216 void SiPixelEDAClient::analyze(const edm::Event& e, const edm::EventSetup& eSetup){
00217 //  cout<<"[SiPixelEDAClient::analyze()] "<<endl;
00218   nEvents_++;  
00219   if(!Tier0Flag_){
00220    
00221     if(nEvents_==1){
00222       // check if any Pixel FED is in readout:
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     // This is needed for plotting with the Pixel Expert GUI (interactive client):
00237     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::CreatePlots);
00238     sipixelWebInterface_->performAction();
00239   }
00240   
00241 }
00242 //
00243 // -- End Luminosity Block
00244 //
00245 void SiPixelEDAClient::endLuminosityBlock(edm::LuminosityBlock const& lumiSeg, edm::EventSetup const& eSetup) {
00246   //cout<<"Entering SiPixelEDAClient::endLuminosityBlock: "<<endl;
00247 
00248   edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: End of LS transition, performing the DQM client operation";
00249 
00250   nLumiSecs_++;
00251   //cout << "nLumiSecs_: "<< nLumiSecs_ << endl;
00252   
00253   edm::LogInfo("SiPixelEDAClient") << "====================================================== " << endl << " ===> Iteration # " << nLumiSecs_ << " " << lumiSeg.luminosityBlock() << endl  << "====================================================== " << endl;
00254   
00255   //if(actionOnLumiSec_ && !Tier0Flag_ && nLumiSecs_ % 1 == 0 ){
00256   if(actionOnLumiSec_ && nLumiSecs_ % 1 == 0 ){
00257     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::Summary);
00258     sipixelWebInterface_->performAction();
00259      //cout << " Updating efficiency plots" << endl;
00260     if(doHitEfficiency_) sipixelActionExecutor_->createEfficiency(bei_, isUpgrade_);
00261     //cout << " Checking QTest results " << endl;
00262     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::QTestResult);
00263     sipixelWebInterface_->performAction();
00264      //cout << " Updating occupancy plots" << endl;
00265     sipixelActionExecutor_->createOccupancy(bei_);
00266     //cout  << " Checking Pixel quality flags " << endl;;
00267     bei_->cd();
00268     bool init=true;
00269     //sipixelDataQuality_->computeGlobalQualityFlag(bei_,init,nFEDs_,Tier0Flag_);
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     //cout << " Checking for new noisy pixels " << endl;
00275     init=true;
00276     if(noiseRate_>=0.) sipixelInformationExtractor_->findNoisyPixels(bei_, init, noiseRate_, noiseRateDenominator_, eSetup);
00277     // cout << "*** Creating Tracker Map Histos for End Run ***" << endl;
00278 //    sipixelActionExecutor_->createMaps(bei_, "adc_siPixelDigis", "adc", Mean);
00279 //    sipixelActionExecutor_->createMaps(bei_, "charge_siPixelClusters", "charge", Mean);
00280 //    sipixelActionExecutor_->createMaps(bei_, "ndigis_siPixelDigis", "ndigis", WeightedSum);
00281 //    sipixelActionExecutor_->createMaps(bei_, "NErrors_siPixelDigis", "NErrors", WeightedSum);
00282     // cout << "*** Done with Tracker Map Histos for End Run ***" << endl;
00283   }   
00284          
00285   //cout<<"...leaving SiPixelEDAClient::endLuminosityBlock. "<<endl;
00286 }
00287 //
00288 // -- End Run
00289 //
00290 void SiPixelEDAClient::endRun(edm::Run const& run, edm::EventSetup const& eSetup){
00291   //cout<<"Entering SiPixelEDAClient::endRun: "<<endl;
00292 
00293   //edm::LogVerbatim ("SiPixelEDAClient") <<"[SiPixelEDAClient]: End of Run, saving  DQM output ";
00294   //int iRun = run.run();
00295   
00296   if(actionOnRunEnd_){
00297     //cout << " Updating Summary " << endl;
00298     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::Summary);
00299 //IASONAS//    sipixelWebInterface_->performAction();
00300      //cout << " Updating efficiency plots" << endl;
00301     if(doHitEfficiency_) sipixelActionExecutor_->createEfficiency(bei_, isUpgrade_);
00302     //cout << " Checking QTest results " << endl;
00303     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::QTestResult);
00304     sipixelWebInterface_->performAction();
00305     //cout << " Updating occupancy plots" << endl;
00306     sipixelActionExecutor_->createOccupancy(bei_);
00307     //cout  << " Checking Pixel quality flags " << endl;;
00308     bei_->cd();
00309     bool init=true;
00310     sipixelDataQuality_->computeGlobalQualityFlag(bei_,init,nFEDs_,Tier0Flag_);
00311     init=true;
00312     bei_->cd();
00313     //cout  << " Making run end reportSummaryMap: " <<nFEDs_<< endl;;
00314     sipixelDataQuality_->fillGlobalQualityPlot(bei_,init,eSetup,nFEDs_,Tier0Flag_,nLumiSecs_);
00315     //cout << " Checking for new noisy pixels " << endl;
00316     init=true;
00317     if(noiseRate_>=0.) sipixelInformationExtractor_->findNoisyPixels(bei_, init, noiseRate_, noiseRateDenominator_, eSetup);
00318     // cout << "*** Creating Tracker Map Histos for End Run ***" << endl;
00319 //    sipixelActionExecutor_->createMaps(bei_, "adc_siPixelDigis", "adc", Mean);
00320 //    sipixelActionExecutor_->createMaps(bei_, "charge_siPixelClusters", "charge", Mean);
00321 //    sipixelActionExecutor_->createMaps(bei_, "ndigis_siPixelDigis", "ndigis", WeightedSum);
00322 //    sipixelActionExecutor_->createMaps(bei_, "NErrors_siPixelDigis", "NErrors", WeightedSum);
00323     // cout << "*** Done with Tracker Map Histos for End Run ***" << endl;
00324 
00325     // On demand, dump module ID's and stuff on the screen:
00326     //sipixelActionExecutor_->dumpModIds(bei_,eSetup);
00327     // On demand, dump summary histo values for reference on the screen:
00328     //sipixelActionExecutor_->dumpRefValues(bei_,eSetup);
00329   }
00330   
00331 //  cout<<"...leaving SiPixelEDAClient::endRun. "<<endl;
00332 }
00333 
00334 //
00335 // -- End Job
00336 //
00337 void SiPixelEDAClient::endJob(){
00338 //  cout<<"In SiPixelEDAClient::endJob "<<endl;
00339   edm::LogInfo("SiPixelEDAClient") <<"[SiPixelEDAClient]: endjob called!";
00340 
00341 }
00342 //
00343 // -- Create default web page
00344 //
00345 void SiPixelEDAClient::defaultWebPage(xgi::Input *in, xgi::Output *out)
00346 {
00347 //  cout<<"Entering SiPixelEDAClient::defaultWebPage: "<<endl;
00348       
00349   bool isRequest = false;
00350   cgicc::Cgicc cgi(in);
00351   cgicc::CgiEnvironment cgie(in);
00352   //  edm::LogInfo("SiPixelEDAClient") <<"[SiPixelEDAClient]: defaultWebPage "
00353   //             << " query string : " << cgie.getQueryString();
00354   //  if ( xgi::Utils::hasFormElement(cgi,"ClientRequest") ) isRequest = true;
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     // Handles all HTTP requests of the form
00361     int iter = nEvents_/100;
00362     sipixelWebInterface_->handleEDARequest(in, out, iter);
00363   }
00364 
00365 //  cout<<"...leaving SiPixelEDAClient::defaultWebPage. "<<endl;
00366 }
00367