CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/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/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 // -- Constructor
00058 //
00059 SiPixelEDAClient::SiPixelEDAClient(const edm::ParameterSet& ps) :
00060   ModuleWeb("SiPixelEDAClient"){
00061 // cout<<"Entering  SiPixelEDAClient::SiPixelEDAClient: "<<endl;
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); //client
00071   actionOnRunEnd_        = ps.getUntrackedParameter<bool>("ActionOnRunEnd",true); //client
00072   evtOffsetForInit_      = ps.getUntrackedParameter<int>("EventOffsetForInit",10); //client
00073   offlineXMLfile_        = ps.getUntrackedParameter<bool>("UseOfflineXMLFile",false); //client
00074   hiRes_                 = ps.getUntrackedParameter<bool>("HighResolutionOccupancy",false); //client
00075   noiseRate_             = ps.getUntrackedParameter<double>("NoiseRateCutValue",0.001); //client
00076   noiseRateDenominator_  = ps.getUntrackedParameter<int>("NEventsForNoiseCalculation",100000); //client
00077   Tier0Flag_             = ps.getUntrackedParameter<bool>("Tier0Flag",false); //client
00078   doHitEfficiency_       = ps.getUntrackedParameter<bool>("DoHitEfficiency",true); //client
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')) { // pops off the newline character 
00091       html_out_ << buf ;
00092     }
00093     fin.close();
00094 
00095   }
00096   
00097   // instantiate web interface
00098   sipixelWebInterface_ = new SiPixelWebInterface(bei_,offlineXMLfile_,Tier0Flag_);
00099   //instantiate the three work horses of the client:
00100   sipixelInformationExtractor_ = new SiPixelInformationExtractor(offlineXMLfile_);
00101   sipixelActionExecutor_ = new SiPixelActionExecutor(offlineXMLfile_, Tier0Flag_);
00102   sipixelDataQuality_ = new SiPixelDataQuality(offlineXMLfile_);
00103   
00104 // cout<<"...leaving  SiPixelEDAClient::SiPixelEDAClient. "<<endl;
00105 }
00106 //
00107 // -- Destructor
00108 //
00109 SiPixelEDAClient::~SiPixelEDAClient(){
00110 //  cout<<"Entering SiPixelEDAClient::~SiPixelEDAClient: "<<endl;
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 //  cout<<"...leaving SiPixelEDAClient::~SiPixelEDAClient. "<<endl;
00131 }
00132 //
00133 // -- Begin Job
00134 //
00135 void SiPixelEDAClient::beginJob(){
00136   firstRun = true;
00137 }
00138 //
00139 // -- Begin Run
00140 //
00141 void SiPixelEDAClient::beginRun(Run const& run, edm::EventSetup const& eSetup) {
00142   edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: Begining of Run";
00143 //  cout<<"Entering SiPixelEDAClient::beginRun: "<<endl;
00144 
00145   if(firstRun){
00146   
00147   // Read the summary configuration file
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   // Setting up QTests:
00163 //  sipixelActionExecutor_->setupQTests(bei_);
00164   // Creating Summary Histos:
00165   sipixelActionExecutor_->createSummary(bei_);
00166   // Booking Deviation Histos:
00167   if(!Tier0Flag_) sipixelActionExecutor_->bookDeviations(bei_);
00168   // Booking Efficiency Histos:
00169   if(doHitEfficiency_) sipixelActionExecutor_->bookEfficiency(bei_);
00170   // Creating occupancy plots:
00171   sipixelActionExecutor_->bookOccupancyPlots(bei_, hiRes_);
00172   // Booking noisy pixel ME's:
00173   if(noiseRate_>0.) sipixelInformationExtractor_->bookNoisyPixels(bei_, noiseRate_, Tier0Flag_);
00174   // Booking summary report ME's:
00175   sipixelDataQuality_->bookGlobalQualityFlag(bei_, Tier0Flag_, nFEDs_);
00176   // Booking Static Tracker Maps:
00177 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "adc");
00178 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "charge");
00179 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "ndigis");
00180 //  sipixelActionExecutor_->bookTrackerMaps(bei_, "NErrors");
00181   
00182   firstRun = false;
00183   }
00184 
00185 //  cout<<"...leaving SiPixelEDAClient::beginRun. "<<endl;
00186 
00187 }
00188 //
00189 // -- Begin  Luminosity Block
00190 //
00191 void SiPixelEDAClient::beginLuminosityBlock(edm::LuminosityBlock const& lumiSeg, 
00192                                             edm::EventSetup const& context) {
00193 //  cout<<"Entering SiPixelEDAClient::beginLuminosityBlock: "<<endl;
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 //  cout<<"...leaving SiPixelEDAClient::beginLuminosityBlock. "<<endl;
00203 }
00204 //
00205 //  -- Analyze 
00206 //
00207 void SiPixelEDAClient::analyze(const edm::Event& e, const edm::EventSetup& eSetup){
00208 //  cout<<"[SiPixelEDAClient::analyze()] "<<endl;
00209   nEvents_++;  
00210   if(!Tier0Flag_){
00211    
00212     if(nEvents_==1){
00213       // check if any Pixel FED is in readout:
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     // This is needed for plotting with the Pixel Expert GUI (interactive client):
00228     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::CreatePlots);
00229     sipixelWebInterface_->performAction();
00230   }
00231   
00232 }
00233 //
00234 // -- End Luminosity Block
00235 //
00236 void SiPixelEDAClient::endLuminosityBlock(edm::LuminosityBlock const& lumiSeg, edm::EventSetup const& eSetup) {
00237 //  cout<<"Entering SiPixelEDAClient::endLuminosityBlock: "<<endl;
00238 
00239   edm::LogInfo ("SiPixelEDAClient") <<"[SiPixelEDAClient]: End of LS transition, performing the DQM client operation";
00240 
00241   nLumiSecs_++;
00242   //cout << "nLumiSecs_: "<< nLumiSecs_ << endl;
00243   
00244   edm::LogInfo("SiPixelEDAClient") << "====================================================== " << endl << " ===> Iteration # " << nLumiSecs_ << " " << lumiSeg.luminosityBlock() << endl  << "====================================================== " << endl;
00245 
00246   if(actionOnLumiSec_ && !Tier0Flag_ && nLumiSecs_ % 1 == 0 ){
00247     //cout << " Updating Summary " << endl;
00248     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::Summary);
00249     sipixelWebInterface_->performAction();
00250      //cout << " Updating efficiency plots" << endl;
00251     if(doHitEfficiency_) sipixelActionExecutor_->createEfficiency(bei_);
00252     //cout << " Checking QTest results " << endl;
00253     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::QTestResult);
00254     sipixelWebInterface_->performAction();
00255      //cout << " Updating occupancy plots" << endl;
00256     sipixelActionExecutor_->createOccupancy(bei_);
00257     //cout  << " Checking Pixel quality flags " << endl;;
00258     bei_->cd();
00259     bool init=true;
00260     //sipixelDataQuality_->computeGlobalQualityFlag(bei_,init,nFEDs_,Tier0Flag_);
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     //cout << " Checking for new noisy pixels " << endl;
00266     init=true;
00267     if(noiseRate_>=0.) sipixelInformationExtractor_->findNoisyPixels(bei_, init, noiseRate_, noiseRateDenominator_, eSetup);
00268     // cout << "*** Creating Tracker Map Histos for End Run ***" << endl;
00269 //    sipixelActionExecutor_->createMaps(bei_, "adc_siPixelDigis", "adc", Mean);
00270 //    sipixelActionExecutor_->createMaps(bei_, "charge_siPixelClusters", "charge", Mean);
00271 //    sipixelActionExecutor_->createMaps(bei_, "ndigis_siPixelDigis", "ndigis", WeightedSum);
00272 //    sipixelActionExecutor_->createMaps(bei_, "NErrors_siPixelDigis", "NErrors", WeightedSum);
00273     // cout << "*** Done with Tracker Map Histos for End Run ***" << endl;
00274   }   
00275          
00276 //  cout<<"...leaving SiPixelEDAClient::endLuminosityBlock. "<<endl;
00277 }
00278 //
00279 // -- End Run
00280 //
00281 void SiPixelEDAClient::endRun(edm::Run const& run, edm::EventSetup const& eSetup){
00282   //cout<<"Entering SiPixelEDAClient::endRun: "<<endl;
00283 
00284   //edm::LogVerbatim ("SiPixelEDAClient") <<"[SiPixelEDAClient]: End of Run, saving  DQM output ";
00285   //int iRun = run.run();
00286   
00287   if(actionOnRunEnd_){
00288     //cout << " Updating Summary " << endl;
00289     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::Summary);
00290     sipixelWebInterface_->performAction();
00291      //cout << " Updating efficiency plots" << endl;
00292     if(doHitEfficiency_) sipixelActionExecutor_->createEfficiency(bei_);
00293     //cout << " Checking QTest results " << endl;
00294     sipixelWebInterface_->setActionFlag(SiPixelWebInterface::QTestResult);
00295     sipixelWebInterface_->performAction();
00296     //cout << " Updating occupancy plots" << endl;
00297     sipixelActionExecutor_->createOccupancy(bei_);
00298     //cout  << " Checking Pixel quality flags " << endl;;
00299     bei_->cd();
00300     bool init=true;
00301     sipixelDataQuality_->computeGlobalQualityFlag(bei_,init,nFEDs_,Tier0Flag_);
00302     init=true;
00303     bei_->cd();
00304     //cout  << " Making run end reportSummaryMap: " <<nFEDs_<< endl;;
00305     sipixelDataQuality_->fillGlobalQualityPlot(bei_,init,eSetup,nFEDs_,Tier0Flag_,nLumiSecs_);
00306     //cout << " Checking for new noisy pixels " << endl;
00307     init=true;
00308     if(noiseRate_>=0.) sipixelInformationExtractor_->findNoisyPixels(bei_, init, noiseRate_, noiseRateDenominator_, eSetup);
00309     // cout << "*** Creating Tracker Map Histos for End Run ***" << endl;
00310 //    sipixelActionExecutor_->createMaps(bei_, "adc_siPixelDigis", "adc", Mean);
00311 //    sipixelActionExecutor_->createMaps(bei_, "charge_siPixelClusters", "charge", Mean);
00312 //    sipixelActionExecutor_->createMaps(bei_, "ndigis_siPixelDigis", "ndigis", WeightedSum);
00313 //    sipixelActionExecutor_->createMaps(bei_, "NErrors_siPixelDigis", "NErrors", WeightedSum);
00314     // cout << "*** Done with Tracker Map Histos for End Run ***" << endl;
00315 
00316     // On demand, dump module ID's and stuff on the screen:
00317     //sipixelActionExecutor_->dumpModIds(bei_,eSetup);
00318     // On demand, dump summary histo values for reference on the screen:
00319     //sipixelActionExecutor_->dumpRefValues(bei_,eSetup);
00320   }
00321   
00322 //  cout<<"...leaving SiPixelEDAClient::endRun. "<<endl;
00323 }
00324 
00325 //
00326 // -- End Job
00327 //
00328 void SiPixelEDAClient::endJob(){
00329 //  cout<<"In SiPixelEDAClient::endJob "<<endl;
00330   edm::LogInfo("SiPixelEDAClient") <<"[SiPixelEDAClient]: endjob called!";
00331 
00332 }
00333 //
00334 // -- Create default web page
00335 //
00336 void SiPixelEDAClient::defaultWebPage(xgi::Input *in, xgi::Output *out)
00337 {
00338 //  cout<<"Entering SiPixelEDAClient::defaultWebPage: "<<endl;
00339       
00340   bool isRequest = false;
00341   cgicc::Cgicc cgi(in);
00342   cgicc::CgiEnvironment cgie(in);
00343   //  edm::LogInfo("SiPixelEDAClient") <<"[SiPixelEDAClient]: defaultWebPage "
00344   //             << " query string : " << cgie.getQueryString();
00345   //  if ( xgi::Utils::hasFormElement(cgi,"ClientRequest") ) isRequest = true;
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     // Handles all HTTP requests of the form
00352     int iter = nEvents_/100;
00353     sipixelWebInterface_->handleEDARequest(in, out, iter);
00354   }
00355 
00356 //  cout<<"...leaving SiPixelEDAClient::defaultWebPage. "<<endl;
00357 }
00358