00001
00002 #ifndef FlavourHistograms_H
00003 #define FlavourHistograms_H
00004
00005 #include "DQMServices/Core/interface/DQMStore.h"
00006 #include "DQMServices/Core/interface/MonitorElement.h"
00007 #include "FWCore/ServiceRegistry/interface/Service.h"
00008
00009
00010
00011 #include "TH1F.h"
00012 #include "TCanvas.h"
00013 #include "TROOT.h"
00014 #include "TSystem.h"
00015 #include "TStyle.h"
00016
00017 #include "DQMOffline/RecoB/interface/Tools.h"
00018 #include "DQMOffline/RecoB/interface/HistoProviderDQM.h"
00019 #include <iostream>
00020 #include <string>
00021
00022
00023
00024
00025
00026
00027 template <class T>
00028 class FlavourHistograms {
00029
00030 public:
00031
00032 FlavourHistograms (const std::string& baseNameTitle_ , const std::string& baseNameDescription_ ,
00033 const int& nBins_ , const double& lowerBound_ , const double& upperBound_ ,
00034 const bool& statistics_ , const bool& plotLog_ , const bool& plotNormalized_ ,
00035 const std::string& plotFirst_ , const bool& update, const std::string& folder, const bool& mc) ;
00036
00037 virtual ~FlavourHistograms () ;
00038
00039
00040
00041
00042
00043
00044
00045 void fill ( const int & flavour, const T & variable) const;
00046
00047
00048 void fill ( const int & flavour, const T * variable) const;
00049
00050
00051 void settitle(const char* title) ;
00052
00053 void plot (TPad * theCanvas = 0) ;
00054
00055 void epsPlot(const std::string& name);
00056
00057
00058
00059 void divide ( const FlavourHistograms<T> & bHD ) const ;
00060
00061 inline void SetMaximum(const double& max) { theMax = max;}
00062 inline void SetMinimum(const double& min) { theMin = min;}
00063
00064
00065
00066 inline std::string baseNameTitle () const { return theBaseNameTitle ; }
00067 inline std::string baseNameDescription () const { return theBaseNameDescription ; }
00068 inline int nBins () const { return theNBins ; }
00069 inline double lowerBound () const { return theLowerBound ; }
00070 inline double upperBound () const { return theUpperBound ; }
00071 inline bool statistics () const { return theStatistics ; }
00072 inline bool plotLog () const { return thePlotLog ; }
00073 inline bool plotNormalized () const { return thePlotNormalized ; }
00074 inline std::string plotFirst () const { return thePlotFirst ; }
00075 inline int* arrayDimension () const { return theArrayDimension; }
00076 inline int maxDimension () const {return theMaxDimension; }
00077 inline int indexToPlot () const {return theIndexToPlot; }
00078
00079
00080 inline TH1F * histo_all () const { return theHisto_all->getTH1F() ; }
00081 inline TH1F * histo_d () const { return theHisto_d ->getTH1F() ; }
00082 inline TH1F * histo_u () const { return theHisto_u->getTH1F() ; }
00083 inline TH1F * histo_s () const { return theHisto_s->getTH1F() ; }
00084 inline TH1F * histo_c () const { return theHisto_c->getTH1F() ; }
00085 inline TH1F * histo_b () const { return theHisto_b->getTH1F() ; }
00086 inline TH1F * histo_g () const { return theHisto_g->getTH1F() ; }
00087 inline TH1F * histo_ni () const { return theHisto_ni->getTH1F() ; }
00088 inline TH1F * histo_dus () const { return theHisto_dus->getTH1F() ; }
00089 inline TH1F * histo_dusg () const { return theHisto_dusg->getTH1F() ; }
00090
00091 std::vector<TH1F*> getHistoVector() const;
00092
00093
00094 protected:
00095
00096 void fillVariable ( const int & flavour , const T & var ) const;
00097
00098
00099
00100
00101
00102
00103
00104
00105 int * theArrayDimension ;
00106 int theMaxDimension ;
00107 int theIndexToPlot ;
00108
00109 std::string theBaseNameTitle ;
00110 std::string theBaseNameDescription ;
00111 int theNBins ;
00112 double theLowerBound ;
00113 double theUpperBound ;
00114 bool theStatistics ;
00115 bool thePlotLog ;
00116 bool thePlotNormalized ;
00117 std::string thePlotFirst ;
00118 double theMin, theMax;
00119
00120
00121 MonitorElement *theHisto_all ;
00122 MonitorElement *theHisto_d ;
00123 MonitorElement *theHisto_u ;
00124 MonitorElement *theHisto_s ;
00125 MonitorElement *theHisto_c ;
00126 MonitorElement *theHisto_b ;
00127 MonitorElement *theHisto_g ;
00128 MonitorElement *theHisto_ni ;
00129 MonitorElement *theHisto_dus ;
00130 MonitorElement *theHisto_dusg ;
00131
00132
00133
00134
00135
00136 TCanvas* theCanvas ;
00137 private:
00138 FlavourHistograms(){}
00139
00140 bool mcPlots_;
00141
00142 } ;
00143
00144 template <class T>
00145 FlavourHistograms<T>::FlavourHistograms (const std::string& baseNameTitle_ , const std::string& baseNameDescription_ ,
00146 const int& nBins_ , const double& lowerBound_ , const double& upperBound_ ,
00147 const bool& statistics_ , const bool& plotLog_ , const bool& plotNormalized_ ,
00148 const std::string& plotFirst_, const bool& update, const std::string& folder, const bool& mc) :
00149
00150
00151 theMaxDimension(-1), theIndexToPlot(-1), theBaseNameTitle ( baseNameTitle_ ) , theBaseNameDescription ( baseNameDescription_ ) ,
00152 theNBins ( nBins_ ) , theLowerBound ( lowerBound_ ) , theUpperBound ( upperBound_ ) ,
00153 theStatistics ( statistics_ ) , thePlotLog ( plotLog_ ) , thePlotNormalized ( plotNormalized_ ) ,
00154 thePlotFirst ( plotFirst_ ), theMin(-1.), theMax(-1.), mcPlots_(mc)
00155 {
00156
00157 theArrayDimension = 0 ;
00158
00159
00160 if ( thePlotFirst == "l" || thePlotFirst == "c" || thePlotFirst == "b" ) {
00161
00162 }
00163 else {
00164
00165 std::cout << "FlavourHistograms::FlavourHistograms : thePlotFirst was not correct : " << thePlotFirst << std::endl ;
00166 std::cout << "FlavourHistograms::FlavourHistograms : Set it to default value (l)! " << std::endl ;
00167 thePlotFirst = "l" ;
00168 }
00169
00170 if (!update) {
00171
00172 HistoProviderDQM prov("Btag",folder);
00173 theHisto_all = (prov.book1D( theBaseNameTitle + "ALL" , theBaseNameDescription + " all jets" , theNBins , theLowerBound , theUpperBound )) ;
00174 if (mcPlots_) {
00175 theHisto_d = (prov.book1D ( theBaseNameTitle + "D" , theBaseNameDescription + " d-jets" , theNBins , theLowerBound , theUpperBound )) ;
00176 theHisto_u = (prov.book1D ( theBaseNameTitle + "U" , theBaseNameDescription + " u-jets" , theNBins , theLowerBound , theUpperBound )) ;
00177 theHisto_s = (prov.book1D ( theBaseNameTitle + "S" , theBaseNameDescription + " s-jets" , theNBins , theLowerBound , theUpperBound )) ;
00178 theHisto_c = (prov.book1D ( theBaseNameTitle + "C" , theBaseNameDescription + " c-jets" , theNBins , theLowerBound , theUpperBound )) ;
00179 theHisto_b = (prov.book1D ( theBaseNameTitle + "B" , theBaseNameDescription + " b-jets" , theNBins , theLowerBound , theUpperBound )) ;
00180 theHisto_g = (prov.book1D ( theBaseNameTitle + "G" , theBaseNameDescription + " g-jets" , theNBins , theLowerBound , theUpperBound )) ;
00181 theHisto_ni = (prov.book1D ( theBaseNameTitle + "NI" , theBaseNameDescription + " ni-jets" , theNBins , theLowerBound , theUpperBound )) ;
00182 theHisto_dus = (prov.book1D ( theBaseNameTitle + "DUS" , theBaseNameDescription + " dus-jets" , theNBins , theLowerBound , theUpperBound )) ;
00183 theHisto_dusg = (prov.book1D ( theBaseNameTitle + "DUSG" , theBaseNameDescription + " dusg-jets" , theNBins , theLowerBound , theUpperBound )) ;
00184 }else{
00185 theHisto_d = 0;
00186 theHisto_u = 0;
00187 theHisto_s = 0;
00188 theHisto_c = 0;
00189 theHisto_b = 0;
00190 theHisto_g = 0;
00191 theHisto_ni = 0;
00192 theHisto_dus = 0;
00193 theHisto_dusg = 0;
00194 }
00195
00196 if ( theStatistics ) {
00197 theHisto_all ->getTH1F()->Sumw2() ;
00198 if (mcPlots_ ) {
00199
00200 theHisto_d ->getTH1F()->Sumw2() ;
00201 theHisto_u ->getTH1F()->Sumw2() ;
00202 theHisto_s ->getTH1F()->Sumw2() ;
00203 theHisto_c ->getTH1F()->Sumw2() ;
00204 theHisto_b ->getTH1F()->Sumw2() ;
00205 theHisto_g ->getTH1F()->Sumw2() ;
00206 theHisto_ni ->getTH1F()->Sumw2() ;
00207 theHisto_dus ->getTH1F()->Sumw2() ;
00208 theHisto_dusg->getTH1F()->Sumw2() ;
00209 }
00210 }
00211 } else {
00212 HistoProviderDQM prov("Btag",folder);
00213 theHisto_all = prov.access(theBaseNameTitle + "ALL" ) ;
00214 if (mcPlots_) {
00215
00216 theHisto_d = prov.access(theBaseNameTitle + "D" ) ;
00217 theHisto_u = prov.access(theBaseNameTitle + "U" ) ;
00218 theHisto_s = prov.access(theBaseNameTitle + "S" ) ;
00219 theHisto_c = prov.access(theBaseNameTitle + "C" ) ;
00220 theHisto_b =prov.access(theBaseNameTitle + "B" ) ;
00221 theHisto_g =prov.access(theBaseNameTitle + "G" ) ;
00222 theHisto_ni =prov.access(theBaseNameTitle + "NI" ) ;
00223 theHisto_dus =prov.access(theBaseNameTitle + "DUS" ) ;
00224 theHisto_dusg =prov.access(theBaseNameTitle + "DUSG") ;
00225 }
00226 }
00227
00228
00229 theCanvas = 0 ;
00230 }
00231
00232
00233 template <class T>
00234 FlavourHistograms<T>::~FlavourHistograms () {
00235
00236 delete theCanvas ;
00237 }
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250 template <class T> void
00251 FlavourHistograms<T>::fill ( const int & flavour, const T & variable) const
00252 {
00253
00254 fillVariable ( flavour , variable ) ;
00255 }
00256
00257 template <class T> void
00258 FlavourHistograms<T>::fill ( const int & flavour, const T * variable) const
00259 {
00260 if ( theArrayDimension == 0 ) {
00261
00262 fillVariable ( flavour , *variable ) ;
00263 } else {
00264
00265 int iMax = (*theArrayDimension > theMaxDimension) ? theMaxDimension : *theArrayDimension ;
00266
00267 for ( int i = 0 ; i != iMax ; ++i ) {
00268
00269 if ( ( theIndexToPlot < 0 ) || ( i == theIndexToPlot ) ) {
00270 fillVariable ( flavour , *(variable+i) ) ;
00271 }
00272 }
00273
00274
00275 if ( theIndexToPlot >= iMax ) {
00276
00277 const T& theZero = static_cast<T> ( 0.0 ) ;
00278 fillVariable ( flavour , theZero ) ;
00279 }
00280 }
00281 }
00282
00283
00284 template <class T>
00285 void FlavourHistograms<T>::settitle(const char* title) {
00286 if(theHisto_all) theHisto_all ->setAxisTitle(title) ;
00287 if (mcPlots_) {
00288
00289 theHisto_d ->setAxisTitle(title) ;
00290 theHisto_u ->setAxisTitle(title) ;
00291 theHisto_s ->setAxisTitle(title) ;
00292 theHisto_c ->setAxisTitle(title) ;
00293 theHisto_b ->setAxisTitle(title) ;
00294 theHisto_g ->setAxisTitle(title) ;
00295 theHisto_ni ->setAxisTitle(title) ;
00296 theHisto_dus ->setAxisTitle(title) ;
00297 theHisto_dusg->setAxisTitle(title) ;
00298 }
00299 }
00300
00301
00302 template <class T>
00303 void FlavourHistograms<T>::plot (TPad * theCanvas ) {
00304
00305
00306 bool btppNI = false;
00307 bool btppColour = true;
00308
00309 if (theCanvas)
00310 theCanvas->cd();
00311
00312 RecoBTag::setTDRStyle()->cd();
00313 gPad->UseCurrentStyle();
00314
00315
00316
00317
00318
00319
00320
00321 gPad->SetLogy ( 0 ) ;
00322 if ( thePlotLog ) gPad->SetLogy ( 1 ) ;
00323 gPad->SetGridx ( 0 ) ;
00324 gPad->SetGridy ( 0 ) ;
00325 gPad->SetTitle ( 0 ) ;
00326
00327 MonitorElement * histo[4];
00328 int col[4], lineStyle[4], markerStyle[4];
00329 int lineWidth = 1 ;
00330
00331 const double markerSize = gPad->GetWh() * gPad->GetHNDC() / 500.;
00332
00333
00334 histo[0] = theHisto_dusg ;
00335
00336 histo[1] = theHisto_b ;
00337 histo[2] = theHisto_c ;
00338 histo[3]= 0 ;
00339
00340 double max = theMax;
00341 if (theMax<=0.) {
00342 max = theHisto_dusg->getTH1F()->GetMaximum();
00343 if (theHisto_b->getTH1F()->GetMaximum() > max) max = theHisto_b->getTH1F()->GetMaximum();
00344 if (theHisto_c->getTH1F()->GetMaximum() > max) max = theHisto_c->getTH1F()->GetMaximum();
00345 }
00346
00347 if (btppNI) {
00348 histo[3] = theHisto_ni ;
00349 if (theHisto_ni->getTH1F()->GetMaximum() > max) max = theHisto_ni->getTH1F()->GetMaximum();
00350 }
00351
00352 if ( btppColour ) {
00353 col[0] = 4 ;
00354 col[1] = 2 ;
00355 col[2] = 6 ;
00356 col[3] = 3 ;
00357 lineStyle[0] = 1 ;
00358 lineStyle[1] = 1 ;
00359 lineStyle[2] = 1 ;
00360 lineStyle[3] = 1 ;
00361 markerStyle[0] = 20 ;
00362 markerStyle[1] = 21 ;
00363 markerStyle[2] = 22 ;
00364 markerStyle[3] = 23 ;
00365 lineWidth = 1 ;
00366 }
00367 else {
00368 col[1] = 1 ;
00369 col[2] = 1 ;
00370 col[3] = 1 ;
00371 col[0] = 1 ;
00372 lineStyle[0] = 2 ;
00373 lineStyle[1] = 1 ;
00374 lineStyle[2] = 3 ;
00375 lineStyle[3] = 4 ;
00376 markerStyle[0] = 20 ;
00377 markerStyle[1] = 21 ;
00378 markerStyle[2] = 22 ;
00379 markerStyle[3] = 23 ;
00380 }
00381
00382
00383
00384
00385 if ( thePlotFirst == "c" ) {
00386 histo[0] = theHisto_c ;
00387 if ( btppColour ) col[0] = 6 ;
00388 if ( !btppColour ) lineStyle[0] = 3 ;
00389 histo[2] = theHisto_dusg ;
00390 if ( btppColour ) col[2] = 4 ;
00391 if ( !btppColour ) lineStyle[2] = 2 ;
00392 }
00393
00394
00395 if ( thePlotFirst == "b" ) {
00396 histo[0] = theHisto_b ;
00397 if ( btppColour ) col[0] = 2 ;
00398 if ( !btppColour ) lineStyle[0] = 1 ;
00399 histo[1] = theHisto_dusg ;
00400 if ( btppColour ) col[1] = 4 ;
00401 if ( !btppColour ) lineStyle[1] = 2 ;
00402 }
00403
00404
00405 histo[0] ->getTH1F()->GetXaxis()->SetTitle ( theBaseNameDescription.c_str() ) ;
00406 histo[0] ->getTH1F()->GetYaxis()->SetTitle ( "Arbitrary Units" ) ;
00407 histo[0] ->getTH1F()->GetYaxis()->SetTitleOffset(1.25) ;
00408
00409 for (int i=0; i != 4; ++i) {
00410 if (histo[i]== 0 ) continue;
00411 histo[i] ->getTH1F()->SetStats ( false ) ;
00412 histo[i] ->getTH1F()->SetLineStyle ( lineStyle[i] ) ;
00413 histo[i] ->getTH1F()->SetLineWidth ( lineWidth ) ;
00414 histo[i] ->getTH1F()->SetLineColor ( col[i] ) ;
00415 histo[i] ->getTH1F()->SetMarkerStyle ( markerStyle[i] ) ;
00416 histo[i] ->getTH1F()->SetMarkerColor ( col[i] ) ;
00417 histo[i] ->getTH1F()->SetMarkerSize ( markerSize ) ;
00418 }
00419
00420 if ( thePlotNormalized ) {
00421
00422 if (histo[0]->getTH1F()->GetEntries() != 0) {histo[0]->getTH1F() ->DrawNormalized() ;} else { histo[0]->getTH1F() ->SetMaximum(1.0);
00423 histo[0] ->getTH1F()->Draw() ;}
00424 if (histo[1]->getTH1F()->GetEntries() != 0) histo[1] ->getTH1F()->DrawNormalized("Same") ;
00425 if (histo[2]->getTH1F()->GetEntries() != 0) histo[2]->getTH1F() ->DrawNormalized("Same") ;
00426 if ((histo[3] != 0) && (histo[3]->getTH1F()->GetEntries() != 0)) histo[3] ->getTH1F()->DrawNormalized("Same") ;
00427 }
00428 else {
00429 histo[0]->getTH1F()->SetMaximum(max*1.05);
00430 if (theMin!=-1.) histo[0]->getTH1F()->SetMinimum(theMin);
00431 histo[0]->getTH1F()->Draw() ;
00432 histo[1]->getTH1F()->Draw("Same") ;
00433 histo[2]->getTH1F()->Draw("Same") ;
00434 if ( histo[3] != 0 ) histo[3]->getTH1F()->Draw("Same") ;
00435 }
00436
00437 }
00438
00439 template <class T>
00440 void FlavourHistograms<T>::epsPlot(const std::string& name)
00441 {
00442 TCanvas tc(theBaseNameTitle.c_str() , theBaseNameDescription.c_str());
00443
00444 plot(&tc);
00445 tc.Print((name + theBaseNameTitle + ".eps").c_str());
00446 }
00447
00448
00449
00450
00451 template <class T>
00452 void FlavourHistograms<T>::divide ( const FlavourHistograms<T> & bHD ) const {
00453
00454
00455
00456
00457
00458 theHisto_all ->getTH1F()-> Divide ( theHisto_all->getTH1F() , bHD.histo_all () , 1.0 , 1.0 , "b" ) ;
00459 if (mcPlots_) {
00460 theHisto_d ->getTH1F()-> Divide ( theHisto_d ->getTH1F() , bHD.histo_d () , 1.0 , 1.0 , "b" ) ;
00461 theHisto_u ->getTH1F()-> Divide ( theHisto_u ->getTH1F() , bHD.histo_u () , 1.0 , 1.0 , "b" ) ;
00462 theHisto_s ->getTH1F()-> Divide ( theHisto_s ->getTH1F() , bHD.histo_s () , 1.0 , 1.0 , "b" ) ;
00463 theHisto_c ->getTH1F()-> Divide ( theHisto_c ->getTH1F() , bHD.histo_c () , 1.0 , 1.0 , "b" ) ;
00464 theHisto_b ->getTH1F()-> Divide ( theHisto_b ->getTH1F() , bHD.histo_b () , 1.0 , 1.0 , "b" ) ;
00465 theHisto_g ->getTH1F()-> Divide ( theHisto_g ->getTH1F() , bHD.histo_g () , 1.0 , 1.0 , "b" ) ;
00466 theHisto_ni ->getTH1F()-> Divide ( theHisto_ni->getTH1F() , bHD.histo_ni () , 1.0 , 1.0 , "b" ) ;
00467 theHisto_dus ->getTH1F()-> Divide ( theHisto_dus->getTH1F() , bHD.histo_dus () , 1.0 , 1.0 , "b" ) ;
00468 theHisto_dusg ->getTH1F()-> Divide ( theHisto_dusg->getTH1F() , bHD.histo_dusg() , 1.0 , 1.0 , "b" ) ;
00469 }
00470 }
00471
00472
00473 template <class T>
00474 void FlavourHistograms<T>::fillVariable ( const int & flavour , const T & var ) const {
00475
00476 theHisto_all ->Fill ( var ) ;
00477
00478 if (!mcPlots_) return;
00479
00480 switch(flavour) {
00481 case 1:
00482 theHisto_d->Fill( var );
00483 theHisto_dus->Fill( var );
00484 theHisto_dusg->Fill( var );
00485 return;
00486 case 2:
00487 theHisto_u->Fill( var );
00488 theHisto_dus->Fill( var );
00489 theHisto_dusg->Fill( var );
00490 return;
00491 case 3:
00492 theHisto_s->Fill( var );
00493 theHisto_dus->Fill( var );
00494 theHisto_dusg->Fill( var );
00495 return;
00496 case 4:
00497 theHisto_c->Fill( var );
00498 return;
00499 case 5:
00500 theHisto_b->Fill( var );
00501 return;
00502 case 21:
00503 theHisto_g->Fill( var );
00504 theHisto_dusg->Fill( var );
00505 return;
00506 default:
00507 theHisto_ni->Fill( var );
00508 return;
00509 }
00510 }
00511
00512 template <class T>
00513 std::vector<TH1F*> FlavourHistograms<T>::getHistoVector() const
00514 {
00515 std::vector<TH1F*> histoVector;
00516 histoVector.push_back ( theHisto_all->getTH1F() );
00517 if (mcPlots_) {
00518 histoVector.push_back ( theHisto_d->getTH1F() );
00519 histoVector.push_back ( theHisto_u->getTH1F() );
00520 histoVector.push_back ( theHisto_s->getTH1F() );
00521 histoVector.push_back ( theHisto_c->getTH1F() );
00522 histoVector.push_back ( theHisto_b->getTH1F() );
00523 histoVector.push_back ( theHisto_g ->getTH1F() );
00524 histoVector.push_back ( theHisto_ni->getTH1F() );
00525 histoVector.push_back ( theHisto_dus->getTH1F() );
00526 histoVector.push_back ( theHisto_dusg->getTH1F());
00527 }
00528 return histoVector;
00529 }
00530 #endif