CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/Validation/RecoEgamma/plugins/ConversionPostprocessing.cc

Go to the documentation of this file.
00001 #include <iostream>
00002 //
00003 
00004 #include "Validation/RecoEgamma/plugins/ConversionPostprocessing.h"
00005 
00006 //
00007 
00021 using namespace std;
00022 
00023 
00024 ConversionPostprocessing::ConversionPostprocessing(const edm::ParameterSet& pset)
00025 {
00026 
00027   dbe_ = 0;
00028   dbe_ = edm::Service<DQMStore>().operator->();
00029   dbe_->setVerbose(0);
00030   parameters_ = pset;
00031 
00032 
00033   standAlone_ = pset.getParameter<bool>("standAlone");
00034   batch_ = pset.getParameter<bool>("batch");
00035   outputFileName_ = pset.getParameter<string>("OutputFileName");
00036   inputFileName_  = pset.getParameter<std::string>("InputFileName");
00037 
00038 
00039   etMin = parameters_.getParameter<double>("etMin");
00040   etMax = parameters_.getParameter<double>("etMax");
00041   etBin = parameters_.getParameter<int>("etBin");
00042 
00043   etaMin = parameters_.getParameter<double>("etaMin");
00044   etaMax = parameters_.getParameter<double>("etaMax");
00045   etaBin = parameters_.getParameter<int>("etaBin");
00046   etaBin2 = parameters_.getParameter<int>("etaBin2");
00047 
00048   phiMin = parameters_.getParameter<double>("phiMin");
00049   phiMax = parameters_.getParameter<double>("phiMax");
00050   phiBin = parameters_.getParameter<int>("phiBin");
00051 
00052   rMin = parameters_.getParameter<double>("rMin");
00053   rMax = parameters_.getParameter<double>("rMax");
00054   rBin = parameters_.getParameter<int>("rBin");
00055 
00056   zMin = parameters_.getParameter<double>("zMin");
00057   zMax = parameters_.getParameter<double>("zMax");
00058   zBin = parameters_.getParameter<int>("zBin");
00059 
00060 
00061 
00062 }
00063 
00064 
00065 
00066 ConversionPostprocessing::~ConversionPostprocessing()
00067 {}
00068 
00069 void ConversionPostprocessing::beginJob()
00070 {
00071 
00072 }
00073 
00074 void ConversionPostprocessing::analyze(const edm::Event& e, const edm::EventSetup& esup)
00075 {}
00076 
00077 
00078 void ConversionPostprocessing::endJob() {
00079 
00080 if(standAlone_) runPostprocessing();
00081 
00082 }
00083 
00084 void ConversionPostprocessing::endRun(const edm::Run& run, const edm::EventSetup& setup) {
00085 
00086   if(!standAlone_) runPostprocessing();
00087 
00088 }
00089 
00090 
00091 
00092 void ConversionPostprocessing::runPostprocessing()
00093 {
00094 
00095 
00096 
00097   std::string simInfoPathName = "EgammaV/ConversionValidator/SimulationInfo/";
00098   std::string convPathName    = "EgammaV/ConversionValidator/ConversionInfo/";
00099   std::string effPathName     = "EgammaV/ConversionValidator/EfficienciesAndFakeRate/";
00100 
00101 
00102   if(batch_)  dbe_->open(inputFileName_);
00103 
00104   dbe_->setCurrentFolder(effPathName);
00105   // Conversion reconstruction efficiency
00106   std::string histname = "convEffVsEtaTwoTracks";
00107   convEffEtaTwoTracks_ =  dbe_->book1D(histname,histname,etaBin2,etaMin, etaMax);
00108 
00109   histname = "convEffVsPhiTwoTracks";
00110   convEffPhiTwoTracks_ =  dbe_->book1D(histname,histname,phiBin,phiMin,phiMax);
00111 
00112   histname = "convEffVsRTwoTracks";
00113   convEffRTwoTracks_ =  dbe_->book1D(histname,histname,rBin,rMin, rMax);
00114 
00115   histname = "convEffVsZTwoTracks";
00116   convEffZTwoTracks_ =  dbe_->book1D(histname,histname,zBin,zMin,zMax);
00117 
00118   histname = "convEffVsEtTwoTracks";
00119   convEffEtTwoTracks_ =  dbe_->book1D(histname,histname,etBin,etMin, etMax);
00120   //
00121   histname = "convEffVsEtaTwoTracksAndVtxProbGT0";
00122   convEffEtaTwoTracksAndVtxProbGT0_ =  dbe_->book1D(histname,histname,etaBin2,etaMin, etaMax);
00123   histname = "convEffVsEtaTwoTracksAndVtxProbGT0005";
00124   convEffEtaTwoTracksAndVtxProbGT0005_ =  dbe_->book1D(histname,histname,etaBin2,etaMin, etaMax);
00125   histname = "convEffVsRTwoTracksAndVtxProbGT0";
00126   convEffRTwoTracksAndVtxProbGT0_ =  dbe_->book1D(histname,histname,rBin,rMin,rMax);
00127   histname = "convEffVsRTwoTracksAndVtxProbGT0005";
00128   convEffRTwoTracksAndVtxProbGT0005_ =  dbe_->book1D(histname,histname,rBin,rMin,rMax);
00129   //
00130   // Fake rate
00131   histname = "convFakeRateVsEtaTwoTracks";
00132   convFakeRateEtaTwoTracks_ =  dbe_->book1D(histname,histname,etaBin2,etaMin, etaMax);
00133   histname = "convFakeRateVsPhiTwoTracks";
00134   convFakeRatePhiTwoTracks_ =  dbe_->book1D(histname,histname,phiBin,phiMin,phiMax);
00135   histname = "convFakeRateVsRTwoTracks";
00136   convFakeRateRTwoTracks_ =  dbe_->book1D(histname,histname,rBin,rMin, rMax);
00137   histname = "convFakeRateVsZTwoTracks";
00138   convFakeRateZTwoTracks_ =  dbe_->book1D(histname,histname,zBin,zMin,zMax);
00139   histname = "convFakeRateVsEtTwoTracks";
00140   convFakeRateEtTwoTracks_ =  dbe_->book1D(histname,histname,etBin,etMin, etMax);
00141 
00142   // efficiencies
00143   dividePlots(dbe_->get(effPathName+"convEffVsEtaTwoTracks"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksEta"),dbe_->get(simInfoPathName+"h_VisSimConvEta"),"effic");
00144   dividePlots(dbe_->get(effPathName+"convEffVsPhiTwoTracks"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksPhi"),dbe_->get(simInfoPathName+"h_VisSimConvPhi"),"effic");
00145   dividePlots(dbe_->get(effPathName+"convEffVsRTwoTracks"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksR"),dbe_->get(simInfoPathName+"h_VisSimConvR"),"effic");
00146   dividePlots(dbe_->get(effPathName+"convEffVsZTwoTracks"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksZ"),dbe_->get(simInfoPathName+"h_VisSimConvZ"),"effic");
00147   dividePlots(dbe_->get(effPathName+"convEffVsEtTwoTracks"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksEt"),dbe_->get(simInfoPathName+"h_VisSimConvEt"),"effic");
00148   dividePlots(dbe_->get(effPathName+"convEffVsEtaTwoTracksAndVtxProbGT0"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksEtaAndVtxPGT0"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksEta"),"effic");
00149   dividePlots(dbe_->get(effPathName+"convEffVsEtaTwoTracksAndVtxProbGT0005"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksEtaAndVtxPGT0005"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksEta"),"effic");
00150   dividePlots(dbe_->get(effPathName+"convEffVsRTwoTracksAndVtxProbGT0"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksRAndVtxPGT0"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksR"),"effic");
00151   dividePlots(dbe_->get(effPathName+"convEffVsRTwoTracksAndVtxProbGT0005"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksRAndVtxPGT0005"),dbe_->get(simInfoPathName+"h_SimConvTwoMTracksR"),"effic");
00152 
00153 
00154   // fake rate
00155   dividePlots(dbe_->get(effPathName+"convFakeRateVsEtaTwoTracks"),dbe_->get(convPathName+"convEtaAss2"),dbe_->get(convPathName+"convEta2"),"fakerate");
00156   dividePlots(dbe_->get(effPathName+"convFakeRateVsPhiTwoTracks"),dbe_->get(convPathName+"convPhiAss"),dbe_->get(convPathName+"convPhi"),"fakerate");
00157   dividePlots(dbe_->get(effPathName+"convFakeRateVsRTwoTracks"),dbe_->get(convPathName+"convRAss"),dbe_->get(convPathName+"convR"),"fakerate");
00158   dividePlots(dbe_->get(effPathName+"convFakeRateVsZTwoTracks"),dbe_->get(convPathName+"convZAss"),dbe_->get(convPathName+"convZ"),"fakerate");
00159   dividePlots(dbe_->get(effPathName+"convFakeRateVsEtTwoTracks"),dbe_->get(convPathName+"convPtAss"),dbe_->get(convPathName+"convPt"),"fakerate");
00160 
00161 
00162 
00163   if(standAlone_) dbe_->save(outputFileName_);
00164   else if(batch_) dbe_->save(inputFileName_);
00165 }
00166 
00167 
00168 void ConversionPostprocessing::endLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& setup)
00169 {
00170 
00171 
00172 }
00173 
00174 
00175 
00176 void  ConversionPostprocessing::dividePlots(MonitorElement* dividend, MonitorElement* numerator, MonitorElement* denominator, std::string type ){
00177   double value,err;
00178   
00179   //quick fix to avoid seg. faults due to null pointers.
00180   if (dividend==0 || numerator==0 || denominator==0)return;
00181 
00182   for (int j=1; j<=numerator->getNbinsX(); j++){
00183 
00184     if (denominator->getBinContent(j)!=0){
00185       if (type=="effic")
00186         value = ((double) numerator->getBinContent(j))/((double) denominator->getBinContent(j));
00187       else if (type=="fakerate")
00188         value = 1-((double) numerator->getBinContent(j))/((double) denominator->getBinContent(j));
00189       else return;
00190       err = sqrt( value*(1-value) / ((double) denominator->getBinContent(j)) );
00191       dividend->setBinContent(j, value);
00192       if ( err !=0 ) dividend->setBinError(j,err);
00193     }
00194     else {
00195       dividend->setBinContent(j, 0);
00196       dividend->setBinError(j,0);
00197     }
00198 
00199   }
00200 
00201 
00202 }
00203 
00204 
00205 void  ConversionPostprocessing::dividePlots(MonitorElement* dividend, MonitorElement* numerator, double denominator){
00206   double value,err;
00207 
00208   //quick fix to avoid seg. faults due to null pointers.
00209   if (dividend==0 || numerator==0 )return;
00210 
00211   for (int j=1; j<=numerator->getNbinsX(); j++){
00212     if (denominator!=0){
00213       value = ((double) numerator->getBinContent(j))/denominator;
00214       err = sqrt( value*(1-value) / denominator);
00215       dividend->setBinContent(j, value);
00216       dividend->setBinError(j,err);
00217     }
00218     else {
00219       dividend->setBinContent(j, 0);
00220     }
00221   }
00222 
00223 }
00224