CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/HLTriggerOffline/Egamma/src/EmDQMPostProcessor.cc

Go to the documentation of this file.
00001 #include "HLTriggerOffline/Egamma/interface/EmDQMPostProcessor.h"
00002 
00003 #include "DQMServices/Core/interface/DQMStore.h"
00004 #include "DQMServices/Core/interface/MonitorElement.h"
00005 #include "FWCore/ServiceRegistry/interface/Service.h"
00006 #include "FWCore/Framework/interface/MakerMacros.h"
00007 
00008 
00009 #include <iostream>
00010 #include <string.h>
00011 #include <iomanip>
00012 #include <fstream>
00013 #include <math.h>
00014 
00015 
00016 EmDQMPostProcessor::EmDQMPostProcessor(const edm::ParameterSet& pset)
00017 {
00018   subDir_ = pset.getUntrackedParameter<std::string>("subDir");
00019 }
00020 
00021 void EmDQMPostProcessor::endRun(edm::Run const& run, edm::EventSetup const& es)
00022 {
00024   // setup DQM stor               //
00026   
00027   DQMStore * dqm = 0;
00028   dqm = edm::Service<DQMStore>().operator->();
00029 
00030   if ( ! dqm ) {
00031     edm::LogInfo("EmDQMPostProcessor") << "Cannot create DQMStore instance\n";
00032     return;
00033   }
00034 
00035 
00036   //go to the directory to be processed
00037   if(dqm->dirExists(subDir_)) dqm->cd(subDir_);
00038   else {
00039     edm::LogWarning("EmDQMPostProcessor") << "cannot find directory: " << subDir_ << " , skipping";
00040     return;
00041   }
00042 
00044   //loop over all triggers/samples//
00046 
00047   std::vector<std::string> subdirectories = dqm->getSubdirs();
00048   for(std::vector<std::string>::iterator dir = subdirectories.begin() ;dir!= subdirectories.end(); dir++ ){
00049     dqm->cd(*dir);
00050 
00051 
00053     // Do everything twice: once for mc-matched histos,   //
00054     // once for unmatched histos                          //
00056 
00057     std::vector<std::string> postfixes;
00058     std::string tmpstring=""; //unmatched histos
00059     postfixes.push_back(tmpstring);
00060     tmpstring="_MC_matched";
00061     postfixes.push_back(tmpstring);
00062 
00063     for(std::vector<std::string>::iterator postfix=postfixes.begin(); postfix!=postfixes.end();postfix++){
00064       
00066       // computer per-event efficiencies //
00068       
00069       std::string histoName="efficiency_by_step"+ *postfix;
00070       std::string baseName = "total_eff"+ *postfix;
00071       MonitorElement* total = dqm->book1D(histoName.c_str(),dqm->get(dqm->pwd() + "/" + baseName)->getTH1F());
00072       total->setTitle(histoName);
00073       
00074       //     std::vector<std::string> mes = dqm->getMEs();
00075       //     for(std::vector<std::string>::iterator me = mes.begin() ;me!= mes.end(); me++ )
00076       //       std::cout <<*me <<std::endl;
00077       //     std::cout <<std::endl;
00078       
00079       float value=0;
00080       float error=0;    
00081       //compute stepwise total efficiencies 
00082       for(int bin= total->getNbinsX()-2 ; bin > 1  ; bin--){
00083         value=0;
00084         error=0;
00085         if(total->getBinContent(bin-1) != 0){
00086           value = total->getBinContent(bin)/total->getBinContent(bin-1) ;
00087           error = sqrt(value*(1-value)/total->getBinContent(bin-1));
00088         }
00089         total->setBinContent(bin,value);
00090         total->setBinError(bin,error);
00091       }
00092       
00093       //set first bin to L1 efficiency
00094       if(total->getBinContent(total->getNbinsX()) !=0 ){
00095         value = total->getBinContent(1)/total->getBinContent(total->getNbinsX()) ;
00096         error = sqrt(value*(1-value)/total->getBinContent(total->getNbinsX()));
00097       }else{
00098       value=0;error=0;
00099       }
00100       total->setBinContent(1,value);
00101       total->setBinError(1,error);
00102       
00103       //total efficiency relative to gen
00104       if(total->getBinContent(total->getNbinsX()) !=0 ){
00105         value = dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(total->getNbinsX()-2)/total->getBinContent(total->getNbinsX()) ;
00106         error = sqrt(value*(1-value)/total->getBinContent(total->getNbinsX()));
00107       }else{
00108         value=0;error=0;
00109       }
00110       total->setBinContent(total->getNbinsX(),value);
00111       total->setBinError(total->getNbinsX(),error);
00112       total->setBinLabel(total->getNbinsX(),"total efficiency rel. gen");
00113       
00114       //total efficiency relative to L1
00115       if(total->getBinContent(total->getNbinsX()) !=0 ){
00116         value = dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(total->getNbinsX()-2)/dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(1) ;
00117         error = sqrt(value*(1-value)/dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(1));
00118       }else{
00119         value=0;error=0;
00120       }
00121       total->setBinContent(total->getNbinsX()-1,value);
00122       total->setBinError(total->getNbinsX()-1,error);
00123       total->setBinLabel(total->getNbinsX()-1,"total efficiency rel. L1");
00124       
00125       total->getTH1F()->SetMaximum(1.2);
00126       total->getTH1F()->SetMinimum(0);
00127       
00129       // compute per-object efficiencies       //
00131       MonitorElement *eff, *num, *denom, *genPlot, *effVsGen, *effL1VsGen;
00132       std::vector<std::string> varNames; 
00133       varNames.push_back("eta"); 
00134       varNames.push_back("phi"); 
00135       varNames.push_back("et");
00136 
00137       std::string filterName;
00138       std::string filterName2;
00139       std::string denomName;
00140       std::string numName;
00141 
00142       // Get the gen-level plots
00143       std::string genName;
00144 
00145       // Get the L1 over gen filter first
00146       filterName2= total->getTH1F()->GetXaxis()->GetBinLabel(1);
00147         
00148       //loop over variables (eta/phi/et)
00149       for(std::vector<std::string>::iterator var = varNames.begin(); var != varNames.end() ; var++){
00150         numName   = dqm->pwd() + "/" + filterName2 + *var + *postfix;
00151         genName   = dqm->pwd() + "/gen_" + *var ;
00152         num       = dqm->get(numName);
00153         genPlot   = dqm->get(genName);
00154         effL1VsGen = dqm->book1D("efficiency_"+filterName2+"_vs_"+*var +*postfix, dqm->get(numName)->getTH1F());
00155 
00156         // Check if histograms actually exist
00157         if(!num || !genPlot) break; 
00158         
00159         // Make sure we are able to book new element
00160         if (!dqm) break;
00161 
00162         // Create the efficiency plot
00163         effL1VsGen->setTitle("efficiency_"+filterName2+"_vs_"+*var + *postfix);
00164         effL1VsGen->getTH1F()->SetMaximum(1.2);
00165         effL1VsGen->getTH1F()->SetMinimum(0);
00166         effL1VsGen->getTH1F()->GetXaxis()->SetTitle(var->c_str());
00167         effL1VsGen->getTH1F()->Divide(num->getTH1F(),genPlot->getTH1F(),1,1,"b" );
00168       }
00169     
00170       // get the filter names from the bin-labels of the master-histogram
00171       for (int filter=1; filter < total->getNbinsX()-2; filter++) {
00172         filterName = total->getTH1F()->GetXaxis()->GetBinLabel(filter);
00173         filterName2= total->getTH1F()->GetXaxis()->GetBinLabel(filter+1);
00174         
00175         //loop over variables (eta/et)
00176         for(std::vector<std::string>::iterator var = varNames.begin(); var != varNames.end() ; var++){
00177           numName   = dqm->pwd() + "/" + filterName2 + *var + *postfix;
00178           denomName = dqm->pwd() + "/" + filterName  + *var + *postfix;
00179           num       = dqm->get(numName);
00180           denom     = dqm->get(denomName);
00181 
00182           // Check if histograms actually exist
00183           if(!num || !denom) break; 
00184 
00185           // Make sure we are able to book new element
00186           if (!dqm) break;
00187 
00188           // Is this the last filter? Book efficiency vs gen level
00189           std::string temp = *postfix;
00190           if (filter==total->getNbinsX()-3 && temp.find("matched")!=std::string::npos) {
00191             genName = dqm->pwd() + "/gen_" + *var;
00192             genPlot = dqm->get(genName);
00193             effVsGen = dqm->book1D("final_eff_vs_"+*var, dqm->get(genName)->getTH1F());
00194             if (!dqm) break;
00195 
00196             effVsGen->setTitle("Efficiency Compared to Gen vs "+*var);
00197             effVsGen->getTH1F()->SetMaximum(1.2); effVsGen->getTH1F()->SetMinimum(0.0);
00198             effVsGen->getTH1F()->GetXaxis()->SetTitle(var->c_str());
00199             effVsGen->getTH1F()->Divide(num->getTH1F(),genPlot->getTH1F(),1,1,"b" );
00200           }
00201 
00202           eff = dqm->book1D("efficiency_"+filterName2+"_vs_"+*var +*postfix, dqm->get(numName)->getTH1F());
00203           
00204           // Make sure we were able to book new element
00205           if (!dqm) break;
00206 
00207           // Create the efficiency plot
00208           /* num->getTH1F()->Sumw2();
00209           denom->getTH1F()->Sumw2(); 
00210           eff->getTH1F()->Sumw2(); */
00211 
00212           eff->setTitle("efficiency_"+filterName2+"_vs_"+*var + *postfix);
00213           eff->getTH1F()->SetMaximum(1.2);
00214           eff->getTH1F()->SetMinimum(0);
00215           eff->getTH1F()->GetXaxis()->SetTitle(var->c_str());
00216           eff->getTH1F()->Divide(num->getTH1F(),denom->getTH1F(),1,1,"b" );
00217         }
00218       }
00219     } 
00220     dqm->goUp();
00221   }
00222   
00223 }
00224 DEFINE_FWK_MODULE(EmDQMPostProcessor);