00001
00002 #include "DQMOffline/EGamma/interface/ElectronDqmAnalyzerBase.h"
00003 #include "DQMServices/Core/interface/DQMStore.h"
00004 #include "DQMServices/Core/interface/MonitorElement.h"
00005 #include "FWCore/ServiceRegistry/interface/Service.h"
00006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 #include "TMath.h"
00009 #include "TFile.h"
00010 #include "TH1F.h"
00011 #include "TH1I.h"
00012 #include "TH2F.h"
00013 #include "TProfile.h"
00014 #include "TTree.h"
00015 #include <iostream>
00016 #include <algorithm>
00017 #include <sstream>
00018
00019 ElectronDqmAnalyzerBase::ElectronDqmAnalyzerBase( const edm::ParameterSet& conf )
00020 : bookPrefix_("ele"), bookIndex_(0), histoNamesReady(false), finalDone_(false)
00021 {
00022 verbosity_ = conf.getUntrackedParameter<int>("Verbosity") ;
00023 finalStep_ = conf.getParameter<std::string>("FinalStep") ;
00024 inputFile_ = conf.getParameter<std::string>("InputFile") ;
00025 outputFile_ = conf.getParameter<std::string>("OutputFile") ;
00026 inputInternalPath_ = conf.getParameter<std::string>("InputFolderName") ;
00027 outputInternalPath_ = conf.getParameter<std::string>("OutputFolderName") ;
00028 }
00029
00030 ElectronDqmAnalyzerBase::~ElectronDqmAnalyzerBase()
00031 {}
00032
00033 void ElectronDqmAnalyzerBase::setBookPrefix( const std::string & prefix )
00034 { bookPrefix_ = prefix ; }
00035
00036 void ElectronDqmAnalyzerBase::setBookIndex( short index )
00037 { bookIndex_ = index ; }
00038
00039 std::string ElectronDqmAnalyzerBase::newName( const std::string & name )
00040 {
00041 if (bookPrefix_.empty())
00042 { return name ; }
00043 std::ostringstream oss ;
00044 oss<<bookPrefix_ ;
00045 if (bookIndex_>=0)
00046 { oss<<bookIndex_++ ; }
00047 oss<<"_"<<name ;
00048 return oss.str() ;
00049 }
00050
00051 const std::string * ElectronDqmAnalyzerBase::find( const std::string & name )
00052 {
00053 typedef std::vector<std::string> HistoNames ;
00054 typedef HistoNames::iterator HistoNamesItr ;
00055 if (!histoNamesReady)
00056 { histoNamesReady = true ; histoNames_ = store_->getMEs() ; }
00057 HistoNamesItr histoName ;
00058 std::vector<HistoNamesItr> res ;
00059 for ( histoName = histoNames_.begin() ; histoName != histoNames_.end() ; ++histoName )
00060 {
00061 std::size_t nsize = name.size(), lsize = histoName->size() ;
00062
00063
00064
00065
00066 if ( (lsize>=nsize) &&
00067 (histoName->find(name)==(lsize-nsize)) )
00068 { res.push_back(histoName) ; }
00069 }
00070 if (res.size()==0)
00071 {
00072 std::ostringstream oss ;
00073 oss<<"Histogram "<<name<<" not found in "<<outputInternalPath_ ;
00074 char sep = ':' ;
00075 for ( histoName = histoNames_.begin() ; histoName != histoNames_.end() ; ++histoName )
00076 { oss<<sep<<' '<<*histoName ; sep = ',' ; }
00077 oss<<'.' ;
00078 edm::LogWarning("ElectronDqmAnalyzerBase::find")<<oss.str() ;
00079 return 0 ;
00080 }
00081 else if (res.size()>1)
00082 {
00083 std::ostringstream oss ;
00084 oss<<"Ambiguous histograms for "<<name<<" in "<<outputInternalPath_ ;
00085 char sep = ':' ;
00086 std::vector<HistoNamesItr>::iterator resItr ;
00087 for ( resItr = res.begin() ; resItr != res.end() ; ++resItr )
00088 { oss<<sep<<' '<<(**resItr) ; sep = ',' ; }
00089 oss<<'.' ;
00090 edm::LogWarning("ElectronDqmAnalyzerBase::find")<<oss.str() ;
00091 return 0 ;
00092 }
00093 else
00094 {
00095 return &*res[0] ;
00096 }
00097 }
00098
00099 void ElectronDqmAnalyzerBase::beginJob()
00100 {
00101 store_ = edm::Service<DQMStore>().operator->() ;
00102 if (!store_)
00103 { edm::LogError("ElectronDqmAnalyzerBase::prepareStore")<<"No DQMStore found !" ; }
00104 store_->setVerbose(verbosity_) ;
00105 if (inputFile_!="")
00106 { store_->open(inputFile_) ; }
00107 store_->setCurrentFolder(outputInternalPath_) ;
00108 book() ;
00109 }
00110
00111 void ElectronDqmAnalyzerBase::endRun( edm::Run const &, edm::EventSetup const & )
00112 {
00113 if (finalStep_=="AtRunEnd")
00114 {
00115 if (finalDone_)
00116 { edm::LogWarning("ElectronDqmAnalyzerBase::endRun")<<"finalize() already called" ; }
00117 store_->setCurrentFolder(outputInternalPath_) ;
00118 finalize() ;
00119 finalDone_ = true ;
00120 }
00121 }
00122 void ElectronDqmAnalyzerBase::endLuminosityBlock( edm::LuminosityBlock const &, edm::EventSetup const & )
00123 {
00124 if (finalStep_=="AtLumiEnd")
00125 {
00126 if (finalDone_)
00127 { edm::LogWarning("ElectronDqmAnalyzerBase::endLuminosityBlock")<<"finalize() already called" ; }
00128 store_->setCurrentFolder(outputInternalPath_) ;
00129 finalize() ;
00130 finalDone_ = true ;
00131 }
00132 }
00133
00134 void ElectronDqmAnalyzerBase::endJob()
00135 {
00136 if (finalStep_=="AtJobEnd")
00137 {
00138 if (finalDone_)
00139 { edm::LogWarning("ElectronDqmAnalyzerBase::endJob")<<"finalize() already called" ; }
00140 store_->setCurrentFolder(outputInternalPath_) ;
00141 finalize() ;
00142 finalDone_ = true ;
00143 }
00144 if (outputFile_!="")
00145 { store_->save(outputFile_) ; }
00146 }
00147
00148 MonitorElement * ElectronDqmAnalyzerBase::get( const std::string & name )
00149 {
00150 const std::string * fullName = find(name) ;
00151 if (fullName)
00152 { return store_->get(inputInternalPath_+"/"+*fullName) ; }
00153 else
00154 { return 0 ; }
00155 }
00156
00157 void ElectronDqmAnalyzerBase::remove( const std::string & name )
00158 {
00159 const std::string * fullName = find(name) ;
00160 if (fullName)
00161 {
00162 store_->setCurrentFolder(inputInternalPath_) ;
00163 store_->removeElement(*fullName) ;
00164 }
00165 }
00166
00167 void ElectronDqmAnalyzerBase::remove_other_dirs()
00168 {
00169 std::string currentPath = store_->pwd() ;
00170 store_->cd() ;
00171
00172 std::string currentFolder ;
00173 std::vector<std::string> subDirs ;
00174 std::vector<std::string>::iterator subDir ;
00175 std::string delimiter = "/" ;
00176
00177 std::string::size_type lastPos = currentPath.find_first_not_of(delimiter,0) ;
00178 std::string::size_type pos = currentPath.find_first_of(delimiter,lastPos) ;
00179 while (std::string::npos != pos || std::string::npos != lastPos)
00180 {
00181 if (currentFolder.empty())
00182 { currentFolder = currentPath.substr(lastPos, pos - lastPos) ; }
00183 else
00184 {
00185 currentFolder += "/" ;
00186 currentFolder += currentPath.substr(lastPos, pos - lastPos) ;
00187 }
00188 lastPos = currentPath.find_first_not_of(delimiter, pos);
00189 pos = currentPath.find_first_of(delimiter, lastPos);
00190
00191 subDirs = store_->getSubdirs() ;
00192 for ( subDir = subDirs.begin() ; subDir != subDirs.end() ; subDir++ )
00193 {
00194 if (currentFolder!=(*subDir))
00195 { store_->rmdir(*subDir) ; }
00196 }
00197 store_->cd(currentFolder) ;
00198 }
00199 }
00200
00201 MonitorElement * ElectronDqmAnalyzerBase::bookH1andDivide
00202 ( const std::string & name, const std::string & num, const std::string & denom,
00203 const std::string & titleX, const std::string & titleY,
00204 const std::string & title )
00205 { return bookH1andDivide(name,get(num),get(denom),titleX,titleY,title) ; }
00206
00207 MonitorElement * ElectronDqmAnalyzerBase::bookH2andDivide
00208 ( const std::string & name, const std::string & num, const std::string & denom,
00209 const std::string & titleX, const std::string & titleY,
00210 const std::string & title )
00211 { return bookH2andDivide(name,get(num),get(denom),titleX,titleY,title) ; }
00212
00213 MonitorElement * ElectronDqmAnalyzerBase::cloneH1
00214 ( const std::string & clone, const std::string & original,
00215 const std::string & title )
00216 { return cloneH1(clone,get(original),title) ; }
00217
00218 MonitorElement * ElectronDqmAnalyzerBase::profileX
00219 ( const std::string & me2d, const std::string & title, const std::string & titleX, const std::string & titleY,
00220 Double_t minimum, Double_t maximum )
00221 { return profileX(get(me2d),title,titleX,titleY,minimum,maximum) ; }
00222
00223 MonitorElement * ElectronDqmAnalyzerBase::profileY
00224 ( const std::string & me2d,
00225 const std::string & title, const std::string & titleX, const std::string & titleY,
00226 Double_t minimum, Double_t maximum )
00227 { return profileY(get(me2d),title,titleX,titleY,minimum,maximum) ; }
00228
00229 MonitorElement * ElectronDqmAnalyzerBase::bookH1
00230 ( const std::string & name, const std::string & title,
00231 int nchX, double lowX, double highX,
00232 const std::string & titleX, const std::string & titleY,
00233 Option_t * option )
00234 {
00235 MonitorElement * me = store_->book1D(newName(name),title,nchX,lowX,highX) ;
00236 if (titleX!="") { me->getTH1F()->GetXaxis()->SetTitle(titleX.c_str()) ; }
00237 if (titleY!="") { me->getTH1F()->GetYaxis()->SetTitle(titleY.c_str()) ; }
00238 if (TString(option)!="") { me->getTH1F()->SetOption(option) ; }
00239 return me ;
00240 }
00241
00242 MonitorElement * ElectronDqmAnalyzerBase::bookH1withSumw2
00243 ( const std::string & name, const std::string & title,
00244 int nchX, double lowX, double highX,
00245 const std::string & titleX, const std::string & titleY,
00246 Option_t * option )
00247 {
00248 MonitorElement * me = store_->book1D(newName(name),title,nchX,lowX,highX) ;
00249 me->getTH1F()->Sumw2() ;
00250 if (titleX!="") { me->getTH1F()->GetXaxis()->SetTitle(titleX.c_str()) ; }
00251 if (titleY!="") { me->getTH1F()->GetYaxis()->SetTitle(titleY.c_str()) ; }
00252 if (TString(option)!="") { me->getTH1F()->SetOption(option) ; }
00253 return me ;
00254 }
00255
00256 MonitorElement * ElectronDqmAnalyzerBase::bookH2
00257 ( const std::string & name, const std::string & title,
00258 int nchX, double lowX, double highX,
00259 int nchY, double lowY, double highY,
00260 const std::string & titleX, const std::string & titleY,
00261 Option_t * option )
00262 {
00263 MonitorElement * me = store_->book2D(newName(name),title,nchX,lowX,highX,nchY,lowY,highY) ;
00264 if (titleX!="") { me->getTH2F()->GetXaxis()->SetTitle(titleX.c_str()) ; }
00265 if (titleY!="") { me->getTH2F()->GetYaxis()->SetTitle(titleY.c_str()) ; }
00266 if (TString(option)!="") { me->getTH2F()->SetOption(option) ; }
00267 return me ;
00268 }
00269
00270 MonitorElement * ElectronDqmAnalyzerBase::bookH2withSumw2
00271 ( const std::string & name, const std::string & title,
00272 int nchX, double lowX, double highX,
00273 int nchY, double lowY, double highY,
00274 const std::string & titleX, const std::string & titleY,
00275 Option_t * option )
00276 {
00277 MonitorElement * me = store_->book2D(newName(name),title,nchX,lowX,highX,nchY,lowY,highY) ;
00278 me->getTH2F()->Sumw2() ;
00279 if (titleX!="") { me->getTH2F()->GetXaxis()->SetTitle(titleX.c_str()) ; }
00280 if (titleY!="") { me->getTH2F()->GetYaxis()->SetTitle(titleY.c_str()) ; }
00281 if (TString(option)!="") { me->getTH2F()->SetOption(option) ; }
00282 return me ;
00283 }
00284
00285 MonitorElement * ElectronDqmAnalyzerBase::bookP1
00286 ( const std::string & name, const std::string & title,
00287 int nchX, double lowX, double highX,
00288 double lowY, double highY,
00289 const std::string & titleX, const std::string & titleY,
00290 Option_t * option )
00291 {
00292 MonitorElement * me = store_->bookProfile(newName(name),title,nchX,lowX,highX,lowY,highY," ") ;
00293 if (titleX!="") { me->getTProfile()->GetXaxis()->SetTitle(titleX.c_str()) ; }
00294 if (titleY!="") { me->getTProfile()->GetYaxis()->SetTitle(titleY.c_str()) ; }
00295 if (TString(option)!="") { me->getTProfile()->SetOption(option) ; }
00296 return me ;
00297 }
00298
00299 MonitorElement * ElectronDqmAnalyzerBase::bookH1andDivide
00300 ( const std::string & name, MonitorElement * num, MonitorElement * denom,
00301 const std::string & titleX, const std::string & titleY,
00302 const std::string & title )
00303 {
00304 if ((!num)||(!denom)) return 0 ;
00305 std::string name2 = newName(name) ;
00306 TH1F * h_temp = (TH1F *)num->getTH1F()->Clone(name2.c_str()) ;
00307 h_temp->Reset() ;
00308 h_temp->Divide(num->getTH1(),denom->getTH1(),1,1,"b") ;
00309 h_temp->GetXaxis()->SetTitle(titleX.c_str()) ;
00310 h_temp->GetYaxis()->SetTitle(titleY.c_str()) ;
00311 if (title!="") { h_temp->SetTitle(title.c_str()) ; }
00312 if (verbosity_>0) { h_temp->Print() ; }
00313 MonitorElement * me = store_->book1D(name2,h_temp) ;
00314 delete h_temp ;
00315 return me ;
00316 }
00317
00318 MonitorElement * ElectronDqmAnalyzerBase::bookH2andDivide
00319 ( const std::string & name, MonitorElement * num, MonitorElement * denom,
00320 const std::string & titleX, const std::string & titleY,
00321 const std::string & title )
00322 {
00323 if ((!num)||(!denom)) return 0 ;
00324 std::string name2 = newName(name) ;
00325 TH2F * h_temp = (TH2F *)num->getTH2F()->Clone(name2.c_str()) ;
00326 h_temp->Reset() ;
00327 h_temp->Divide(num->getTH1(),denom->getTH1(),1,1,"b") ;
00328 h_temp->GetXaxis()->SetTitle(titleX.c_str()) ;
00329 h_temp->GetYaxis()->SetTitle(titleY.c_str()) ;
00330 if (title!="") { h_temp->SetTitle(title.c_str()) ; }
00331 if (verbosity_>0) { h_temp->Print() ; }
00332 MonitorElement * me = store_->book2D(name2,h_temp) ;
00333 delete h_temp ;
00334 return me ;
00335 }
00336
00337 MonitorElement * ElectronDqmAnalyzerBase::cloneH1
00338 ( const std::string & name, MonitorElement * original,
00339 const std::string & title )
00340 {
00341 if (!original) return 0 ;
00342 std::string name2 = newName(name) ;
00343 TH1F * h_temp = (TH1F *)original->getTH1F()->Clone(name2.c_str()) ;
00344 h_temp->Reset() ;
00345 if (title!="") { h_temp->SetTitle(title.c_str()) ; }
00346 MonitorElement * me = store_->book1D(name2,h_temp) ;
00347 delete h_temp ;
00348 return me ;
00349 }
00350
00351 MonitorElement * ElectronDqmAnalyzerBase::profileX
00352 ( MonitorElement * me2d,
00353 const std::string & title, const std::string & titleX, const std::string & titleY,
00354 Double_t minimum, Double_t maximum )
00355 {
00356 std::string name2 = me2d->getName()+"_pfx" ;
00357 TProfile * p1_temp = me2d->getTH2F()->ProfileX() ;
00358 if (title!="") { p1_temp->SetTitle(title.c_str()) ; }
00359 if (titleX!="") { p1_temp->GetXaxis()->SetTitle(titleX.c_str()) ; }
00360 if (titleY!="") { p1_temp->GetYaxis()->SetTitle(titleY.c_str()) ; }
00361 if (minimum!=-1111) { p1_temp->SetMinimum(minimum) ; }
00362 if (maximum!=-1111) { p1_temp->SetMaximum(maximum) ; }
00363 MonitorElement * me = store_->bookProfile(name2,p1_temp) ;
00364 delete p1_temp ;
00365 return me ;
00366 }
00367
00368 MonitorElement * ElectronDqmAnalyzerBase::profileY
00369 ( MonitorElement * me2d,
00370 const std::string & title, const std::string & titleX, const std::string & titleY,
00371 Double_t minimum, Double_t maximum )
00372 {
00373 std::string name2 = me2d->getName()+"_pfy" ;
00374 TProfile * p1_temp = me2d->getTH2F()->ProfileY() ;
00375 if (title!="") { p1_temp->SetTitle(title.c_str()) ; }
00376 if (titleX!="") { p1_temp->GetXaxis()->SetTitle(titleX.c_str()) ; }
00377 if (titleY!="") { p1_temp->GetYaxis()->SetTitle(titleY.c_str()) ; }
00378 if (minimum!=-1111) { p1_temp->SetMinimum(minimum) ; }
00379 if (maximum!=-1111) { p1_temp->SetMaximum(maximum) ; }
00380 MonitorElement * me = store_->bookProfile(name2,p1_temp) ;
00381 delete p1_temp ;
00382 return me ;
00383 }
00384