CMS 3D CMS Logo

Public Member Functions | Private Attributes

EmDQMPostProcessor Class Reference

#include <EmDQMPostProcessor.h>

Inheritance diagram for EmDQMPostProcessor:
edm::EDAnalyzer

List of all members.

Public Member Functions

void analyze (const edm::Event &event, const edm::EventSetup &eventSetup)
 EmDQMPostProcessor (const edm::ParameterSet &pset)
void endRun (edm::Run const &, edm::EventSetup const &)
 ~EmDQMPostProcessor ()

Private Attributes

std::string subDir_

Detailed Description

Definition at line 9 of file EmDQMPostProcessor.h.


Constructor & Destructor Documentation

EmDQMPostProcessor::EmDQMPostProcessor ( const edm::ParameterSet pset)

Definition at line 16 of file EmDQMPostProcessor.cc.

References edm::ParameterSet::getUntrackedParameter(), and subDir_.

{
  subDir_ = pset.getUntrackedParameter<std::string>("subDir");
}
EmDQMPostProcessor::~EmDQMPostProcessor ( ) [inline]

Definition at line 12 of file EmDQMPostProcessor.h.

{};

Member Function Documentation

void EmDQMPostProcessor::analyze ( const edm::Event event,
const edm::EventSetup eventSetup 
) [inline, virtual]

Implements edm::EDAnalyzer.

Definition at line 14 of file EmDQMPostProcessor.h.

{};
void EmDQMPostProcessor::endRun ( edm::Run const &  run,
edm::EventSetup const &  es 
) [virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 21 of file EmDQMPostProcessor.cc.

References newFWLiteAna::bin, DQMStore::book1D(), DQMStore::cd(), dir, DQMStore::dirExists(), error, align_tpl::filter, reco_skim_cfg_mod::filterName, DQMStore::get(), MonitorElement::getBinContent(), MonitorElement::getNbinsX(), DQMStore::getSubdirs(), getTH1F(), MonitorElement::getTH1F(), DQMStore::goUp(), cmsCodeRules::cppFunctionSkipper::operator, DQMStore::pwd(), MonitorElement::setBinContent(), MonitorElement::setBinError(), MonitorElement::setBinLabel(), MonitorElement::setTitle(), mathSSE::sqrt(), subDir_, cond::rpcobtemp::temp, pileupDistInMC::total, relativeConstraints::value, and summarizeEdmComparisonLogfiles::varNames.

{
  // setup DQM stor               //
  
  DQMStore * dqm = 0;
  dqm = edm::Service<DQMStore>().operator->();

  if ( ! dqm ) {
    edm::LogInfo("EmDQMPostProcessor") << "Cannot create DQMStore instance\n";
    return;
  }


  //go to the directory to be processed
  if(dqm->dirExists(subDir_)) dqm->cd(subDir_);
  else {
    edm::LogWarning("EmDQMPostProcessor") << "cannot find directory: " << subDir_ << " , skipping";
    return;
  }

  //loop over all triggers/samples//

  std::vector<std::string> subdirectories = dqm->getSubdirs();
  for(std::vector<std::string>::iterator dir = subdirectories.begin() ;dir!= subdirectories.end(); dir++ ){
    dqm->cd(*dir);


    // Do everything twice: once for mc-matched histos,   //
    // once for unmatched histos                          //

    std::vector<std::string> postfixes;
    std::string tmpstring=""; //unmatched histos
    postfixes.push_back(tmpstring);
    tmpstring="_MC_matched";
    postfixes.push_back(tmpstring);

    for(std::vector<std::string>::iterator postfix=postfixes.begin(); postfix!=postfixes.end();postfix++){
      
      // computer per-event efficiencies //
      
      std::string histoName="efficiency_by_step"+ *postfix;
      std::string baseName = "total_eff"+ *postfix;
      MonitorElement* total = dqm->book1D(histoName.c_str(),dqm->get(dqm->pwd() + "/" + baseName)->getTH1F());
      total->setTitle(histoName);
      
      //     std::vector<std::string> mes = dqm->getMEs();
      //     for(std::vector<std::string>::iterator me = mes.begin() ;me!= mes.end(); me++ )
      //       std::cout <<*me <<std::endl;
      //     std::cout <<std::endl;
      
      float value=0;
      float error=0;    
      //compute stepwise total efficiencies 
      for(int bin= total->getNbinsX()-2 ; bin > 1  ; bin--){
        value=0;
        error=0;
        if(total->getBinContent(bin-1) != 0){
          value = total->getBinContent(bin)/total->getBinContent(bin-1) ;
          error = sqrt(value*(1-value)/total->getBinContent(bin-1));
        }
        total->setBinContent(bin,value);
        total->setBinError(bin,error);
      }
      
      //set first bin to L1 efficiency
      if(total->getBinContent(total->getNbinsX()) !=0 ){
        value = total->getBinContent(1)/total->getBinContent(total->getNbinsX()) ;
        error = sqrt(value*(1-value)/total->getBinContent(total->getNbinsX()));
      }else{
      value=0;error=0;
      }
      total->setBinContent(1,value);
      total->setBinError(1,error);
      
      //total efficiency relative to gen
      if(total->getBinContent(total->getNbinsX()) !=0 ){
        value = dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(total->getNbinsX()-2)/total->getBinContent(total->getNbinsX()) ;
        error = sqrt(value*(1-value)/total->getBinContent(total->getNbinsX()));
      }else{
        value=0;error=0;
      }
      total->setBinContent(total->getNbinsX(),value);
      total->setBinError(total->getNbinsX(),error);
      total->setBinLabel(total->getNbinsX(),"total efficiency rel. gen");
      
      //total efficiency relative to L1
      if(total->getBinContent(total->getNbinsX()) !=0 ){
        value = dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(total->getNbinsX()-2)/dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(1) ;
        error = sqrt(value*(1-value)/dqm->get(dqm->pwd() + "/" + baseName)->getBinContent(1));
      }else{
        value=0;error=0;
      }
      total->setBinContent(total->getNbinsX()-1,value);
      total->setBinError(total->getNbinsX()-1,error);
      total->setBinLabel(total->getNbinsX()-1,"total efficiency rel. L1");
      
      total->getTH1F()->SetMaximum(1.2);
      total->getTH1F()->SetMinimum(0);
      
      // compute per-object efficiencies       //
      MonitorElement *eff, *num, *denom, *genPlot, *effVsGen, *effL1VsGen;
      std::vector<std::string> varNames; 
      varNames.push_back("eta"); 
      varNames.push_back("phi"); 
      varNames.push_back("et");

      std::string filterName;
      std::string filterName2;
      std::string denomName;
      std::string numName;

      // Get the gen-level plots
      std::string genName;

      // Get the L1 over gen filter first
      filterName2= total->getTH1F()->GetXaxis()->GetBinLabel(1);
        
      //loop over variables (eta/phi/et)
      for(std::vector<std::string>::iterator var = varNames.begin(); var != varNames.end() ; var++){
        numName   = dqm->pwd() + "/" + filterName2 + *var + *postfix;
        genName   = dqm->pwd() + "/gen_" + *var ;
        num       = dqm->get(numName);
        genPlot   = dqm->get(genName);
        effL1VsGen = dqm->book1D("efficiency_"+filterName2+"_vs_"+*var +*postfix, dqm->get(numName)->getTH1F());

        // Check if histograms actually exist
        if(!num || !genPlot) break; 
        
        // Make sure we are able to book new element
        if (!dqm) break;

        // Create the efficiency plot
        effL1VsGen->setTitle("efficiency_"+filterName2+"_vs_"+*var + *postfix);
        effL1VsGen->getTH1F()->SetMaximum(1.2);
        effL1VsGen->getTH1F()->SetMinimum(0);
        effL1VsGen->getTH1F()->GetXaxis()->SetTitle(var->c_str());
        effL1VsGen->getTH1F()->Divide(num->getTH1F(),genPlot->getTH1F(),1,1,"b" );
      }
    
      // get the filter names from the bin-labels of the master-histogram
      for (int filter=1; filter < total->getNbinsX()-2; filter++) {
        filterName = total->getTH1F()->GetXaxis()->GetBinLabel(filter);
        filterName2= total->getTH1F()->GetXaxis()->GetBinLabel(filter+1);
        
        //loop over variables (eta/et)
        for(std::vector<std::string>::iterator var = varNames.begin(); var != varNames.end() ; var++){
          numName   = dqm->pwd() + "/" + filterName2 + *var + *postfix;
          denomName = dqm->pwd() + "/" + filterName  + *var + *postfix;
          num       = dqm->get(numName);
          denom     = dqm->get(denomName);

          // Check if histograms actually exist
          if(!num || !denom) break; 

          // Make sure we are able to book new element
          if (!dqm) break;

          // Is this the last filter? Book efficiency vs gen level
          std::string temp = *postfix;
          if (filter==total->getNbinsX()-3 && temp.find("matched")!=std::string::npos) {
            genName = dqm->pwd() + "/gen_" + *var;
            genPlot = dqm->get(genName);
            effVsGen = dqm->book1D("final_eff_vs_"+*var, dqm->get(genName)->getTH1F());
            if (!dqm) break;

            effVsGen->setTitle("Efficiency Compared to Gen vs "+*var);
            effVsGen->getTH1F()->SetMaximum(1.2); effVsGen->getTH1F()->SetMinimum(0.0);
            effVsGen->getTH1F()->GetXaxis()->SetTitle(var->c_str());
            effVsGen->getTH1F()->Divide(num->getTH1F(),genPlot->getTH1F(),1,1,"b" );
          }

          eff = dqm->book1D("efficiency_"+filterName2+"_vs_"+*var +*postfix, dqm->get(numName)->getTH1F());
          
          // Make sure we were able to book new element
          if (!dqm) break;

          // Create the efficiency plot
          /* num->getTH1F()->Sumw2();
          denom->getTH1F()->Sumw2(); 
          eff->getTH1F()->Sumw2(); */

          eff->setTitle("efficiency_"+filterName2+"_vs_"+*var + *postfix);
          eff->getTH1F()->SetMaximum(1.2);
          eff->getTH1F()->SetMinimum(0);
          eff->getTH1F()->GetXaxis()->SetTitle(var->c_str());
          eff->getTH1F()->Divide(num->getTH1F(),denom->getTH1F(),1,1,"b" );
        }
      }
    } 
    dqm->goUp();
  }
  
}

Member Data Documentation

std::string EmDQMPostProcessor::subDir_ [private]

Definition at line 18 of file EmDQMPostProcessor.h.

Referenced by EmDQMPostProcessor(), and endRun().