00001 #include "RecoParticleFlow/Benchmark/interface/GenericBenchmark.h"
00002 #include "RecoParticleFlow/Benchmark/interface/BenchmarkTree.h"
00003 #include "DQMServices/Core/interface/MonitorElement.h"
00004
00005
00006 #include "DQMServices/Core/interface/DQMStore.h"
00007
00008 #include <TROOT.h>
00009 #include <TFile.h>
00010
00011
00012
00013
00014
00015 #define BOOK1D(name,title,nbinsx,lowx,highx) \
00016 h##name = DQM ? DQM->book1D(#name,title,nbinsx,lowx,highx)->getTH1F() \
00017 : new TH1F(#name,title,nbinsx,lowx,highx)
00018
00019
00020 #define BOOK2D(name,title,nbinsx,lowx,highx,nbinsy,lowy,highy) \
00021 h##name = DQM ? DQM->book2D(#name,title,nbinsx,lowx,highx,nbinsy,lowy,highy)->getTH2F() \
00022 : new TH2F(#name,title,nbinsx,lowx,highx,nbinsy,lowy,highy)
00023
00024
00025
00026
00027
00028 #define SETAXES(name,xtitle,ytitle) \
00029 h##name->GetXaxis()->SetTitle(xtitle); h##name->GetYaxis()->SetTitle(ytitle)
00030
00031 #define ET (PlotAgainstReco_)?"reconstructed E_{T} [GeV]":"generated E_{T} [GeV]"
00032 #define ETA (PlotAgainstReco_)?"reconstructed #eta":"generated #eta"
00033 #define PHI (PlotAgainstReco_)?"reconstructed #phi (rad)":"generated #phi (rad)"
00034
00035 using namespace std;
00036
00037 GenericBenchmark::GenericBenchmark() {}
00038
00039 GenericBenchmark::~GenericBenchmark() {}
00040
00041 void GenericBenchmark::setup(DQMStore *DQM, bool PlotAgainstReco_, float minDeltaEt, float maxDeltaEt,
00042 float minDeltaPhi, float maxDeltaPhi, bool doMetPlots) {
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 int nbinsEt = 1000;
00060 float minEt = 0;
00061 float maxEt = 1000;
00062
00063
00064
00065
00066 int nbinsEta = 200;
00067 float minEta = -5;
00068 float maxEta = 5;
00069
00070 int nbinsDeltaEta = 1000;
00071 float minDeltaEta = -0.5;
00072 float maxDeltaEta = 0.5;
00073
00074 int nbinsDeltaPhi = 1000;
00075
00076
00077
00078
00079
00080 BOOK1D(DeltaEt,"#DeltaE_{T}", nbinsEt, minDeltaEt, maxDeltaEt);
00081 BOOK1D(DeltaEx,"#DeltaE_{X}", nbinsEt, minDeltaEt, maxDeltaEt);
00082 BOOK1D(DeltaEy,"#DeltaE_{Y}", nbinsEt, minDeltaEt, maxDeltaEt);
00083 BOOK2D(DeltaEtvsEt,"#DeltaE_{T} vs E_{T}",
00084 nbinsEt, minEt, maxEt,
00085 nbinsEt,minDeltaEt, maxDeltaEt);
00086 BOOK2D(DeltaEtOverEtvsEt,"#DeltaE_{T}/E_{T} vsE_{T}",
00087 nbinsEt, minEt, maxEt,
00088 nbinsEt,-1,1);
00089 BOOK2D(DeltaEtvsEta,"#DeltaE_{T} vs #eta",
00090 nbinsEta, minEta, maxEta,
00091 nbinsEt,minDeltaEt, maxDeltaEt);
00092 BOOK2D(DeltaEtOverEtvsEta,"#DeltaE_{T}/E_{T} vs #eta",
00093 nbinsEta, minEta, maxEta,
00094 100,-1,1);
00095 BOOK2D(DeltaEtvsPhi,"#DeltaE_{T} vs #phi",
00096 200,-M_PI,M_PI,
00097 nbinsEt,minDeltaEt, maxDeltaEt);
00098 BOOK2D(DeltaEtOverEtvsPhi,"#DeltaE_{T}/E_{T} vs #Phi",
00099 200,-M_PI,M_PI,
00100 100,-1,1);
00101 BOOK2D(DeltaEtvsDeltaR,"#DeltaE_{T} vs #DeltaR",
00102 100,0,1,
00103 nbinsEt,minDeltaEt, maxDeltaEt);
00104 BOOK2D(DeltaEtOverEtvsDeltaR,"#DeltaE_{T}/E_{T} vs #DeltaR",
00105 100,0,1,
00106 100,-1,1);
00107
00108
00109 BOOK1D(DeltaEta,"#Delta#eta",nbinsDeltaEta,minDeltaEta,maxDeltaEta);
00110 BOOK2D(DeltaEtavsEt,"#Delta#eta vs E_{T}",
00111 nbinsEt, minEt, maxEt,
00112 nbinsDeltaEta,minDeltaEta,maxDeltaEta);
00113 BOOK2D(DeltaEtavsEta,"#Delta#eta vs #eta",
00114 nbinsEta, minEta, maxEta,
00115 nbinsDeltaEta,minDeltaEta,maxDeltaEta);
00116
00117
00118 BOOK1D(DeltaPhi,"#Delta#phi",nbinsDeltaPhi,minDeltaPhi,maxDeltaPhi);
00119 BOOK2D(DeltaPhivsEt,"#Delta#phi vs E_{T}",
00120 nbinsEt, minEt, maxEt,
00121 nbinsDeltaPhi,minDeltaPhi,maxDeltaPhi);
00122 BOOK2D(DeltaPhivsEta,"#Delta#phi vs #eta",
00123 nbinsEta, minEta, maxEta,
00124 nbinsDeltaPhi,minDeltaPhi,maxDeltaPhi);
00125
00126
00127 BOOK1D(DeltaR,"#DeltaR",100,0,1);
00128 BOOK2D(DeltaRvsEt,"#DeltaR vs E_{T}",
00129 nbinsEt, minEt, maxEt,
00130 100,0,1);
00131 BOOK2D(DeltaRvsEta,"#DeltaR vs #eta",
00132 nbinsEta, minEta, maxEta,
00133 100,0,1);
00134
00135 BOOK1D(NRec,"Number of reconstructed objects",20,0,20);
00136
00137
00138 BOOK1D(EtaSeen,"seen #eta",100,-5,5);
00139 BOOK1D(PhiSeen,"seen #phi",100,-3.5,3.5);
00140 BOOK1D(EtSeen,"seen E_{T}",nbinsEt, minEt, maxEt);
00141 BOOK2D(EtvsEtaSeen,"seen E_{T} vs eta",100,-5,5,200, 0, 200);
00142 BOOK2D(EtvsPhiSeen,"seen E_{T} vs seen #phi",100,-3.5,3.5,200, 0, 200);
00143
00144 BOOK1D(PhiRec,"Rec #phi",100,-3.5,3.5);
00145 BOOK1D(EtRec,"Rec E_{T}",nbinsEt, minEt, maxEt);
00146 BOOK1D(ExRec,"Rec E_{X}",nbinsEt, -maxEt, maxEt);
00147 BOOK1D(EyRec,"Rec E_{Y}",nbinsEt, -maxEt, maxEt);
00148
00149 BOOK2D(EtRecvsEt,"Rec E_{T} vs E_{T}",
00150 nbinsEt, minEt, maxEt,
00151 nbinsEt, minEt, maxEt);
00152 BOOK2D(EtRecOverTrueEtvsTrueEt,"Rec E_{T} / E_{T} vs E_{T}",
00153 nbinsEt, minEt, maxEt,
00154 1000, 0., 100.);
00155
00156 BOOK1D(EtaGen,"generated #eta",100,-5,5);
00157 BOOK1D(PhiGen,"generated #phi",100,-3.5,3.5);
00158 BOOK1D(EtGen,"generated E_{T}",nbinsEt, minEt, maxEt);
00159 BOOK2D(EtvsEtaGen,"generated E_{T} vs generated #eta",100,-5,5,200, 0, 200);
00160 BOOK2D(EtvsPhiGen,"generated E_{T} vs generated #phi",100,-3.5,3.5, 200, 0, 200);
00161
00162 BOOK1D(NGen,"Number of generated objects",20,0,20);
00163
00164 if (doMetPlots)
00165 {
00166 BOOK1D(SumEt,"SumEt", 1000, 0., 3000.);
00167 BOOK1D(TrueSumEt,"TrueSumEt", 1000, 0., 3000.);
00168 BOOK2D(DeltaSetvsSet,"#DeltaSEt vs trueSEt",
00169 3000, 0., 3000.,
00170 1000,-1000., 1000.);
00171 BOOK2D(DeltaMexvsSet,"#DeltaMEX vs trueSEt",
00172 3000, 0., 3000.,
00173 1000,-400., 400.);
00174 BOOK2D(DeltaSetOverSetvsSet,"#DeltaSetOverSet vs trueSet",
00175 3000, 0., 3000.,
00176 1000,-1., 1.);
00177 BOOK2D(RecSetvsTrueSet,"Set vs trueSet",
00178 3000, 0., 3000.,
00179 3000,0., 3000.);
00180 BOOK2D(RecSetOverTrueSetvsTrueSet,"Set/trueSet vs trueSet",
00181 3000, 0., 3000.,
00182 500,0., 2.);
00183 BOOK2D(TrueMexvsTrueSet,"trueMex vs trueSet",
00184 3000,0., 3000.,
00185 nbinsEt, -maxEt, maxEt);
00186 }
00187
00188
00189
00190
00191
00192
00193 SETAXES(DeltaEt,"#DeltaE_{T} [GeV]","");
00194 SETAXES(DeltaEx,"#DeltaE_{X} [GeV]","");
00195 SETAXES(DeltaEy,"#DeltaE_{Y} [GeV]","");
00196 SETAXES(DeltaEtvsEt,ET,"#DeltaE_{T} [GeV]");
00197 SETAXES(DeltaEtOverEtvsEt,ET,"#DeltaE_{T}/E_{T}");
00198 SETAXES(DeltaEtvsEta,ETA,"#DeltaE_{T} [GeV]");
00199 SETAXES(DeltaEtOverEtvsEta,ETA,"#DeltaE_{T}/E_{T}");
00200 SETAXES(DeltaEtvsPhi,PHI,"#DeltaE_{T} [GeV]");
00201 SETAXES(DeltaEtOverEtvsPhi,PHI,"#DeltaE_{T}/E_{T}");
00202 SETAXES(DeltaEtvsDeltaR,"#DeltaR","#DeltaE_{T} [GeV]");
00203 SETAXES(DeltaEtOverEtvsDeltaR,"#DeltaR","#DeltaE_{T}/E_{T}");
00204
00205
00206 SETAXES(DeltaEta,"#Delta#eta","Events");
00207 SETAXES(DeltaEtavsEt,ET,"#Delta#eta");
00208 SETAXES(DeltaEtavsEta,ETA,"#Delta#eta");
00209
00210
00211 SETAXES(DeltaPhi,"#Delta#phi [rad]","Events");
00212 SETAXES(DeltaPhivsEt,ET,"#Delta#phi [rad]");
00213 SETAXES(DeltaPhivsEta,ETA,"#Delta#phi [rad]");
00214
00215
00216 SETAXES(DeltaR,"#DeltaR","Events");
00217 SETAXES(DeltaRvsEt,ET,"#DeltaR");
00218 SETAXES(DeltaRvsEta,ETA,"#DeltaR");
00219
00220 SETAXES(NRec,"Number of Rec Objects","");
00221
00222 SETAXES(EtaSeen,"seen #eta","");
00223 SETAXES(PhiSeen,"seen #phi [rad]","");
00224 SETAXES(EtSeen,"seen E_{T} [GeV]","");
00225 SETAXES(EtvsEtaSeen,"seen #eta","seen E_{T}");
00226 SETAXES(EtvsPhiSeen,"seen #phi [rad]","seen E_{T}");
00227
00228 SETAXES(PhiRec,"#phi [rad]","");
00229 SETAXES(EtRec,"E_{T} [GeV]","");
00230 SETAXES(ExRec,"E_{X} [GeV]","");
00231 SETAXES(EyRec,"E_{Y} [GeV]","");
00232 SETAXES(EtRecvsEt,ET,"Rec E_{T} [GeV]");
00233 SETAXES(EtRecOverTrueEtvsTrueEt,ET,"Rec E_{T} / E_{T} [GeV]");
00234
00235 SETAXES(EtaGen,"generated #eta","");
00236 SETAXES(PhiGen,"generated #phi [rad]","");
00237 SETAXES(EtGen,"generated E_{T} [GeV]","");
00238 SETAXES(EtvsPhiGen,"generated #phi [rad]","generated E_{T} [GeV]");
00239 SETAXES(EtvsEtaGen,"generated #eta","generated E_{T} [GeV]");
00240
00241 SETAXES(NGen,"Number of Gen Objects","");
00242
00243 if (doMetPlots)
00244 {
00245 SETAXES(SumEt,"SumEt [GeV]","");
00246 SETAXES(TrueSumEt,"TrueSumEt [GeV]","");
00247 SETAXES(DeltaSetvsSet,"TrueSumEt","#DeltaSumEt [GeV]");
00248 SETAXES(DeltaMexvsSet,"TrueSumEt","#DeltaMEX [GeV]");
00249 SETAXES(DeltaSetOverSetvsSet,"TrueSumEt","#DeltaSumEt/trueSumEt");
00250 SETAXES(RecSetvsTrueSet,"TrueSumEt","SumEt");
00251 SETAXES(RecSetOverTrueSetvsTrueSet,"TrueSumEt","SumEt/trueSumEt");
00252 SETAXES(TrueMexvsTrueSet,"TrueSumEt","TrueMEX");
00253 }
00254
00255 TDirectory* oldpwd = gDirectory;
00256
00257
00258 TIter next( gROOT->GetListOfFiles() );
00259
00260 const bool debug=false;
00261
00262 while ( TFile *file = (TFile *)next() )
00263 {
00264 if (debug) cout<<"file "<<file->GetName()<<endl;
00265 }
00266 if (DQM)
00267 {
00268 cout<<"DQM subdir"<<endl;
00269 cout<< DQM->pwd().c_str()<<endl;
00270
00271 DQM->cd( DQM->pwd() );
00272 }
00273
00274 if (debug)
00275 {
00276 cout<<"current dir"<<endl;
00277 gDirectory->pwd();
00278 }
00279
00280 oldpwd->cd();
00281
00282
00283 doMetPlots_=doMetPlots;
00284
00285
00286 }
00287
00288 bool GenericBenchmark::accepted(const reco::Candidate* particle,
00289 double ptCut,
00290 double minEtaCut,
00291 double maxEtaCut ) const {
00292
00293
00294 if (particle->pt() < ptCut and ptCut != -1.)
00295 return false;
00296
00297 if (fabs(particle->eta())>maxEtaCut and maxEtaCut > 0)
00298 return false;
00299 if (fabs(particle->eta())<minEtaCut and minEtaCut > 0)
00300 return false;
00301
00302
00303 return true;
00304
00305 }
00306
00307
00308 void GenericBenchmark::fillHistos( const reco::Candidate* genParticle,
00309 const reco::Candidate* recParticle,
00310 double deltaR_cut,
00311 bool plotAgainstReco ) {
00312
00313
00314 double et = genParticle->et();
00315 double eta = genParticle->eta();
00316 double phi = genParticle->phi();
00317
00318
00319
00320
00321
00322
00323
00324 if (plotAgainstReco) {
00325 et = recParticle->et();
00326 eta = recParticle->eta();
00327 phi = recParticle->phi();
00328 }
00329
00330
00331
00332 double deltaEt = algo_->deltaEt(recParticle,genParticle);
00333 double deltaR = algo_->deltaR(recParticle,genParticle);
00334 double deltaEta = algo_->deltaEta(recParticle,genParticle);
00335 double deltaPhi = algo_->deltaPhi(recParticle,genParticle);
00336
00337
00338
00339
00340 if (deltaR>deltaR_cut && deltaR_cut != -1.)
00341 return;
00342
00343 hDeltaEt->Fill(deltaEt);
00344 hDeltaEx->Fill(recParticle->px()-genParticle->px());
00345 hDeltaEy->Fill(recParticle->py()-genParticle->py());
00346 hDeltaEtvsEt->Fill(et,deltaEt);
00347 hDeltaEtOverEtvsEt->Fill(et,deltaEt/et);
00348 hDeltaEtvsEta->Fill(eta,deltaEt);
00349 hDeltaEtOverEtvsEta->Fill(eta,deltaEt/et);
00350 hDeltaEtvsPhi->Fill(phi,deltaEt);
00351 hDeltaEtOverEtvsPhi->Fill(phi,deltaEt/et);
00352 hDeltaEtvsDeltaR->Fill(deltaR,deltaEt);
00353 hDeltaEtOverEtvsDeltaR->Fill(deltaR,deltaEt/et);
00354
00355 hDeltaEta->Fill(deltaEta);
00356 hDeltaEtavsEt->Fill(et,deltaEta);
00357 hDeltaEtavsEta->Fill(eta,deltaEta);
00358
00359 hDeltaPhi->Fill(deltaPhi);
00360 hDeltaPhivsEt->Fill(et,deltaPhi);
00361 hDeltaPhivsEta->Fill(eta,deltaPhi);
00362
00363 hDeltaR->Fill(deltaR);
00364 hDeltaRvsEt->Fill(et,deltaR);
00365 hDeltaRvsEta->Fill(eta,deltaR);
00366
00367 BenchmarkTreeEntry entry;
00368 entry.deltaEt = deltaEt;
00369 entry.deltaEta = deltaEta;
00370 entry.et = et;
00371 entry.eta = eta;
00372
00373 if (doMetPlots_)
00374 {
00375 const reco::MET* met1=static_cast<const reco::MET*>(genParticle);
00376 const reco::MET* met2=static_cast<const reco::MET*>(recParticle);
00377 if (met1!=NULL && met2!=NULL)
00378 {
00379
00380 hTrueSumEt->Fill((*met1).sumEt());
00381 hSumEt->Fill((*met2).sumEt());
00382 hDeltaSetvsSet->Fill((*met1).sumEt(),(*met2).sumEt()-(*met1).sumEt());
00383 hDeltaMexvsSet->Fill((*met1).sumEt(),recParticle->px()-genParticle->px());
00384 hDeltaMexvsSet->Fill((*met1).sumEt(),recParticle->py()-genParticle->py());
00385 if ((*met1).sumEt()>0.01) hDeltaSetOverSetvsSet->Fill((*met1).sumEt(),((*met2).sumEt()-(*met1).sumEt())/(*met1).sumEt());
00386 hRecSetvsTrueSet->Fill((*met1).sumEt(),(*met2).sumEt());
00387 hRecSetOverTrueSetvsTrueSet->Fill((*met1).sumEt(),(*met2).sumEt()/((*met1).sumEt()));
00388 hTrueMexvsTrueSet->Fill((*met1).sumEt(),(*met1).px());
00389 hTrueMexvsTrueSet->Fill((*met1).sumEt(),(*met1).py());
00390 }
00391 else
00392 {
00393 std::cout << "Warning : reco::MET* == NULL" << std::endl;
00394 }
00395 }
00396
00397
00398
00399 }
00400
00401 void GenericBenchmark::write(std::string Filename) {
00402
00403 if (Filename.size() != 0 && file_)
00404 file_->Write(Filename.c_str());
00405
00406 }
00407
00408 void GenericBenchmark::setfile(TFile *file)
00409 {
00410 file_=file;
00411 }