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
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
00037 if(dqm->dirExists(subDir_)) dqm->cd(subDir_);
00038 else {
00039 edm::LogWarning("EmDQMPostProcessor") << "cannot find directory: " << subDir_ << " , skipping";
00040 return;
00041 }
00042
00044
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
00054
00056
00057 std::vector<std::string> postfixes;
00058 std::string tmpstring="";
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
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
00075
00076
00077
00078
00079 float value=0;
00080 float error=0;
00081
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
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
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
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
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
00143 std::string genName;
00144
00145
00146 filterName2= total->getTH1F()->GetXaxis()->GetBinLabel(1);
00147
00148
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
00157 if(!num || !genPlot) break;
00158
00159
00160 if (!dqm) break;
00161
00162
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
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
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
00183 if(!num || !denom) break;
00184
00185
00186 if (!dqm) break;
00187
00188
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
00205 if (!dqm) break;
00206
00207
00208
00209
00210
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);