CMS 3D CMS Logo

PFJetBenchmark.cc
Go to the documentation of this file.
3 
5 
6 // preprocessor macro for booking 1d histos with DQMStore -or- bare Root
7 #define BOOK1D(name, title, nbinsx, lowx, highx) \
8  h##name = \
9  dbe_ ? dbe_->book1D(#name, title, nbinsx, lowx, highx)->getTH1F() : new TH1F(#name, title, nbinsx, lowx, highx)
10 
11 // preprocessor macro for booking 2d histos with DQMStore -or- bare Root
12 #define BOOK2D(name, title, nbinsx, lowx, highx, nbinsy, lowy, highy) \
13  h##name = dbe_ ? dbe_->book2D(#name, title, nbinsx, lowx, highx, nbinsy, lowy, highy)->getTH2F() \
14  : new TH2F(#name, title, nbinsx, lowx, highx, nbinsy, lowy, highy)
15 
16 //macros for building barrel and endcap histos with one call
17 #define DBOOK1D(name, title, nbinsx, lowx, highx) \
18  BOOK1D(B##name, "Barrel " #title, nbinsx, lowx, highx); \
19  BOOK1D(E##name, "Endcap " #title, nbinsx, lowx, highx); \
20  BOOK1D(F##name, "Forward " #title, nbinsx, lowx, highx);
21 #define DBOOK2D(name, title, nbinsx, lowx, highx, nbinsy, lowy, highy) \
22  BOOK2D(B##name, "Barrel " #title, nbinsx, lowx, highx, nbinsy, lowy, highy); \
23  BOOK2D(E##name, "Endcap " #title, nbinsx, lowx, highx, nbinsy, lowy, highy); \
24  BOOK2D(F##name, "Forward " #title, nbinsx, lowx, highx, nbinsy, lowy, highy);
25 
26 // all versions OK
27 // preprocesor macro for setting axis titles
28 #define SETAXES(name, xtitle, ytitle) \
29  h##name->GetXaxis()->SetTitle(xtitle); \
30  h##name->GetYaxis()->SetTitle(ytitle)
31 
32 //macro for setting the titles for barrel and endcap together
33 #define DSETAXES(name, xtitle, ytitle) \
34  SETAXES(B##name, xtitle, ytitle); \
35  SETAXES(E##name, xtitle, ytitle); \
36  SETAXES(F##name, xtitle, ytitle);
37 /*#define SET2AXES(name,xtitle,ytitle) \
38  hE##name->GetXaxis()->SetTitle(xtitle); hE##name->GetYaxis()->SetTitle(ytitle); hB##name->GetXaxis()->SetTitle(xtitle); hB##name->GetYaxis()->SetTitle(ytitle)
39 */
40 
41 #define PT (plotAgainstReco_) ? "reconstructed P_{T}" : "generated P_{T}"
42 #define P (plotAgainstReco_) ? "generated P" : "generated P"
43 
44 using namespace reco;
45 using namespace std;
46 
47 PFJetBenchmark::PFJetBenchmark() : file_(nullptr), entry_(0) {}
48 
50  if (file_)
51  file_->Close();
52 }
53 
55  // Store the DAQ Histograms
56  if (!outputFile_.empty()) {
57  if (dbe_)
59  // use bare Root if no DQM (FWLite applications)
60  else if (file_) {
61  file_->Write(outputFile_.c_str());
62  cout << "Benchmark output written to file " << outputFile_.c_str() << endl;
63  file_->Close();
64  }
65  } else
66  cout << "No output file specified (" << outputFile_ << "). Results will not be saved!" << endl;
67 }
68 
69 void PFJetBenchmark::setup(string Filename,
70  bool debug,
71  bool plotAgainstReco,
72  bool onlyTwoJets,
73  double deltaRMax,
74  string benchmarkLabel_,
75  double recPt,
76  double maxEta,
77  DQMStore* dbe_store) {
78  debug_ = debug;
79  plotAgainstReco_ = plotAgainstReco;
82  outputFile_ = Filename;
83  recPt_cut = recPt;
85  file_ = nullptr;
86  dbe_ = dbe_store;
87  // print parameters
88  cout << "PFJetBenchmark Setup parameters ==============================================" << endl;
89  cout << "Filename to write histograms " << Filename << endl;
90  cout << "PFJetBenchmark debug " << debug_ << endl;
91  cout << "plotAgainstReco " << plotAgainstReco_ << endl;
92  cout << "onlyTwoJets " << onlyTwoJets_ << endl;
93  cout << "deltaRMax " << deltaRMax << endl;
94  cout << "benchmarkLabel " << benchmarkLabel_ << endl;
95  cout << "recPt_cut " << recPt_cut << endl;
96  cout << "maxEta_cut " << maxEta_cut << endl;
97 
98  // Book histogram
99 
100  // Establish DQM Store
101  string path = "PFTask/Benchmarks/" + benchmarkLabel_ + "/";
102  if (plotAgainstReco)
103  path += "Reco";
104  else
105  path += "Gen";
106  if (dbe_) {
108  } else {
109  file_ = new TFile(outputFile_.c_str(), "recreate");
110  // TTree * tr = new TTree("PFTast");
111  // tr->Branch("Benchmarks/ParticleFlow")
112  cout << "Info: DQM is not available to provide data storage service. Using TFile to save histograms. " << endl;
113  }
114  // Jets inclusive distributions (Pt > 20 or specified recPt GeV)
115  char cutString[35];
116  sprintf(cutString, "Jet multiplicity P_{T}>%4.1f GeV", recPt_cut);
117  BOOK1D(Njets, cutString, 50, 0, 50);
118 
119  BOOK1D(jetsPt, "Jets P_{T} Distribution", 100, 0, 500);
120 
121  sprintf(cutString, "Jets #eta Distribution |#eta|<%4.1f", maxEta_cut);
122  BOOK1D(jetsEta, cutString, 100, -5, 5);
123 
124  BOOK2D(RPtvsEta, "#DeltaP_{T}/P_{T} vs #eta", 200, -5., 5., 200, -1, 1);
125  BOOK2D(RNeutvsEta, "R_{Neutral} vs #eta", 200, -5., 5., 200, -1, 1);
126  BOOK2D(RNEUTvsEta, "R_{HCAL+ECAL} vs #eta", 200, -5., 5., 200, -1, 1);
127  BOOK2D(RNONLvsEta, "R_{HCAL+ECAL - Hcal Only} vs #eta", 200, -5., 5., 200, -1, 1);
128  BOOK2D(RHCALvsEta, "R_{HCAL} vs #eta", 200, -5., 5., 200, -1, 1);
129  BOOK2D(RHONLvsEta, "R_{HCAL only} vs #eta", 200, -5., 5., 200, -1, 1);
130  BOOK2D(RCHEvsEta, "R_{Charged} vs #eta", 200, -5., 5., 200, -1, 1);
131  BOOK2D(NCHvsEta, "N_{Charged} vs #eta", 200, -5., 5., 200, 0., 200.);
132  BOOK2D(NCH0vsEta, "N_{Charged} vs #eta, iter 0", 200, -5., 5., 200, 0., 200.);
133  BOOK2D(NCH1vsEta, "N_{Charged} vs #eta, iter 1", 200, -5., 5., 200, 0., 200.);
134  BOOK2D(NCH2vsEta, "N_{Charged} vs #eta, iter 2", 200, -5., 5., 200, 0., 200.);
135  BOOK2D(NCH3vsEta, "N_{Charged} vs #eta, iter 3", 200, -5., 5., 200, 0., 200.);
136  BOOK2D(NCH4vsEta, "N_{Charged} vs #eta, iter 4", 200, -5., 5., 200, 0., 200.);
137  BOOK2D(NCH5vsEta, "N_{Charged} vs #eta, iter 5", 200, -5., 5., 200, 0., 200.);
138  BOOK2D(NCH6vsEta, "N_{Charged} vs #eta, iter 6", 200, -5., 5., 200, 0., 200.);
139  // delta Pt or E quantities for Barrel
140  DBOOK1D(RPt, #DeltaP_{T} / P_{T}, 80, -1, 1);
141  DBOOK1D(RCHE, #DeltaE / E(charged had), 80, -2, 2);
142  DBOOK1D(RNHE, #DeltaE / E(neutral had), 80, -2, 2);
143  DBOOK1D(RNEE, #DeltaE / E(neutral em), 80, -2, 2);
144  DBOOK1D(Rneut, #DeltaE / E(neutral), 80, -2, 2);
145  DBOOK1D(NCH, #N_{charged}, 200, 0., 200.);
146  DBOOK2D(RPtvsPt, #DeltaP_{T} / P_{T} vs P_{T}, 250, 0, 500, 200, -1, 1); //used to be 50 bin for each in x-direction
147  DBOOK2D(RCHEvsPt, #DeltaE / E(charged had) vs P_{T}, 250, 0, 500, 120, -1, 2);
148  DBOOK2D(RNHEvsPt, #DeltaE / E(neutral had) vs P_{T}, 250, 0, 500, 120, -1, 2);
149  DBOOK2D(RNEEvsPt, #DeltaE / E(neutral em) vs P_{T}, 250, 0, 500, 120, -1, 2);
150  DBOOK2D(RneutvsPt, #DeltaE / E(neutral) vs P_{T}, 250, 0, 500, 120, -1, 2);
151  DBOOK2D(NCHvsPt, N_{charged} vs P_{T}, 250, 0, 500, 200, 0., 200.);
152  DBOOK2D(NCH0vsPt, N_{charged} vs P_{T} iter 0, 250, 0, 500, 200, 0., 200.);
153  DBOOK2D(NCH1vsPt, N_{charged} vs P_{T} iter 1, 250, 0, 500, 200, 0., 200.);
154  DBOOK2D(NCH2vsPt, N_{charged} vs P_{T} iter 2, 250, 0, 500, 200, 0., 200.);
155  DBOOK2D(NCH3vsPt, N_{charged} vs P_{T} iter 3, 250, 0, 500, 200, 0., 200.);
156  DBOOK2D(NCH4vsPt, N_{charged} vs P_{T} iter 4, 250, 0, 500, 200, 0., 200.);
157  DBOOK2D(NCH5vsPt, N_{charged} vs P_{T} iter 5, 250, 0, 500, 200, 0., 200.);
158  DBOOK2D(NCH6vsPt, N_{charged} vs P_{T} iter 6, 250, 0, 500, 200, 0., 200.);
159 
160  DBOOK2D(RNEUTvsP, #DeltaE / E(ECAL + HCAL) vs P, 250, 0, 1000, 150, -1.5, 1.5);
161  DBOOK2D(RNONLvsP, #DeltaE / E(ECAL + HCAL - only) vs P, 250, 0, 1000, 150, -1.5, 1.5);
162  DBOOK2D(RHCALvsP, #DeltaE / E(HCAL) vs P, 250, 0, 1000, 150, -1.5, 1.5);
163  DBOOK2D(RHONLvsP, #DeltaE / E(HCAL only) vs P, 250, 0, 1000, 150, -1.5, 1.5);
164  DBOOK1D(RPt20_40, #DeltaP_{T} / P_{T}, 80, -1, 1);
165  DBOOK1D(RPt40_60, #DeltaP_{T} / P_{T}, 80, -1, 1);
166  DBOOK1D(RPt60_80, #DeltaP_{T} / P_{T}, 80, -1, 1);
167  DBOOK1D(RPt80_100, #DeltaP_{T} / P_{T}, 80, -1, 1);
168  DBOOK1D(RPt100_150, #DeltaP_{T} / P_{T}, 80, -1, 1);
169  DBOOK1D(RPt150_200, #DeltaP_{T} / P_{T}, 80, -1, 1);
170  DBOOK1D(RPt200_250, #DeltaP_{T} / P_{T}, 80, -1, 1);
171  DBOOK1D(RPt250_300, #DeltaP_{T} / P_{T}, 80, -1, 1);
172  DBOOK1D(RPt300_400, #DeltaP_{T} / P_{T}, 160, -1, 1);
173  DBOOK1D(RPt400_500, #DeltaP_{T} / P_{T}, 160, -1, 1);
174  DBOOK1D(RPt500_750, #DeltaP_{T} / P_{T}, 160, -1, 1);
175  DBOOK1D(RPt750_1250, #DeltaP_{T} / P_{T}, 160, -1, 1);
176  DBOOK1D(RPt1250_2000, #DeltaP_{T} / P_{T}, 160, -1, 1);
177  DBOOK1D(RPt2000_5000, #DeltaP_{T} / P_{T}, 160, -1, 1);
178 
179  DBOOK2D(DEtavsPt, #Delta #eta vs P_{T}, 1000, 0, 2000, 500, -0.5, 0.5);
180  DBOOK2D(DPhivsPt, #Delta #phi vs P_{T}, 1000, 0, 2000, 500, -0.5, 0.5);
181  BOOK2D(DEtavsEta, "#Delta#eta vs P_{T}", 1000, -5., +5., 500, -0.5, 0.5);
182  BOOK2D(DPhivsEta, "#Delta#phi vs P_{T}", 1000, -5., +5., 500, -0.5, 0.5);
183 
184  // Set Axis Titles
185 
186  // Jets inclusive distributions (Pt > 20 GeV)
187  SETAXES(Njets, "", "Multiplicity");
188  SETAXES(jetsPt, PT, "Number of Events");
189  SETAXES(jetsEta, "#eta", "Number of Events");
190  SETAXES(RNeutvsEta, "#eta", "#DeltaE/E (Neutral)");
191  SETAXES(RNEUTvsEta, "#eta", "#DeltaE/E (ECAL+HCAL)");
192  SETAXES(RNONLvsEta, "#eta", "#DeltaE/E (ECAL+HCAL-only)");
193  SETAXES(RHCALvsEta, "#eta", "#DeltaE/E (HCAL)");
194  SETAXES(RHONLvsEta, "#eta", "#DeltaE/E (HCAL Only)");
195  SETAXES(RCHEvsEta, "#eta", "#DeltaE/E (Charged)");
196  SETAXES(RPtvsEta, "#eta", "#DeltaP_{T}/P_{T}");
197  SETAXES(DEtavsEta, "#eta", "#Delta#eta");
198  SETAXES(DPhivsEta, "#eta", "#Delta#phi");
199  // delta Pt or E quantities for Barrel and Endcap
200  DSETAXES(RPt, "#DeltaP_{T}/P_{T}", "Events");
201  DSETAXES(RPt20_40, "#DeltaP_{T}/P_{T}", "Events");
202  DSETAXES(RPt40_60, "#DeltaP_{T}/P_{T}", "Events");
203  DSETAXES(RPt60_80, "#DeltaP_{T}/P_{T}", "Events");
204  DSETAXES(RPt80_100, "#DeltaP_{T}/P_{T}", "Events");
205  DSETAXES(RPt100_150, "#DeltaP_{T}/P_{T}", "Events");
206  DSETAXES(RPt150_200, "#DeltaP_{T}/P_{T}", "Events");
207  DSETAXES(RPt200_250, "#DeltaP_{T}/P_{T}", "Events");
208  DSETAXES(RPt250_300, "#DeltaP_{T}/P_{T}", "Events");
209  DSETAXES(RPt300_400, "#DeltaP_{T}/P_{T}", "Events");
210  DSETAXES(RPt400_500, "#DeltaP_{T}/P_{T}", "Events");
211  DSETAXES(RPt500_750, "#DeltaP_{T}/P_{T}", "Events");
212  DSETAXES(RPt750_1250, "#DeltaP_{T}/P_{T}", "Events");
213  DSETAXES(RPt1250_2000, "#DeltaP_{T}/P_{T}", "Events");
214  DSETAXES(RPt2000_5000, "#DeltaP_{T}/P_{T}", "Events");
215  DSETAXES(RCHE, "#DeltaE/E(charged had)", "Events");
216  DSETAXES(RNHE, "#DeltaE/E(neutral had)", "Events");
217  DSETAXES(RNEE, "#DeltaE/E(neutral em)", "Events");
218  DSETAXES(Rneut, "#DeltaE/E(neutral)", "Events");
219  DSETAXES(RPtvsPt, PT, "#DeltaP_{T}/P_{T}");
220  DSETAXES(RCHEvsPt, PT, "#DeltaE/E(charged had)");
221  DSETAXES(RNHEvsPt, PT, "#DeltaE/E(neutral had)");
222  DSETAXES(RNEEvsPt, PT, "#DeltaE/E(neutral em)");
223  DSETAXES(RneutvsPt, PT, "#DeltaE/E(neutral)");
224  DSETAXES(RHCALvsP, P, "#DeltaE/E(HCAL)");
225  DSETAXES(RHONLvsP, P, "#DeltaE/E(HCAL-only)");
226  DSETAXES(RNEUTvsP, P, "#DeltaE/E(ECAL+HCAL)");
227  DSETAXES(RNONLvsP, P, "#DeltaE/E(ECAL+HCAL-only)");
228  DSETAXES(DEtavsPt, PT, "#Delta#eta");
229  DSETAXES(DPhivsPt, PT, "#Delta#phi");
230 }
231 
233  // loop over reco pf jets
234  resPtMax_ = 0.;
238  int NPFJets = 0;
239 
240  for (unsigned i = 0; i < pfJets.size(); i++) {
241  // Count the number of jets with a larger energy
242  unsigned highJets = 0;
243  for (unsigned j = 0; j < pfJets.size(); j++) {
244  if (j != i && pfJets[j].pt() > pfJets[i].pt())
245  highJets++;
246  }
247  if (onlyTwoJets_ && highJets > 1)
248  continue;
249 
250  const reco::PFJet& pfj = pfJets[i];
251  double rec_pt = pfj.pt();
252  double rec_eta = pfj.eta();
253  double rec_phi = pfj.phi();
254 
255  // skip PFjets with pt < recPt_cut GeV
256  if (rec_pt < recPt_cut and recPt_cut != -1.)
257  continue;
258  // skip PFjets with eta > maxEta_cut
259  if (fabs(rec_eta) > maxEta_cut and maxEta_cut != -1.)
260  continue;
261 
262  NPFJets++;
263 
264  // fill inclusive PFjet distribution pt > 20 GeV
265  hNjets->Fill(NPFJets);
266  hjetsPt->Fill(rec_pt);
267  hjetsEta->Fill(rec_eta);
268 
269  // separate Barrel PFJets from Endcap PFJets
270  bool Barrel = false;
271  bool Endcap = false;
272  bool Forward = false;
273  if (std::abs(rec_eta) < 1.4)
274  Barrel = true;
275  if (std::abs(rec_eta) > 1.6 && std::abs(rec_eta) < 2.4)
276  Endcap = true;
277  if (std::abs(rec_eta) > 2.5 && std::abs(rec_eta) < 2.9)
278  Forward = true;
279  if (std::abs(rec_eta) > 3.1 && std::abs(rec_eta) < 4.7)
280  Forward = true;
281 
282  // do only barrel for now
283  // if(!Barrel) continue;
284 
285  // look for the closets gen Jet : truth
286  const GenJet* truth = algo_->matchByDeltaR(&pfj, &genJets);
287  if (!truth)
288  continue;
289  double deltaR = algo_->deltaR(&pfj, truth);
290  // check deltaR is small enough
291  if (deltaR < deltaRMax_ || (abs(rec_eta) > 2.5 && deltaR < 0.2) ||
292  deltaRMax_ == -1.0) { //start case deltaR < deltaRMax
293 
294  // generate histograms comparing the reco and truth candidate (truth = closest in delta-R)
295  // get the quantities to place on the denominator and/or divide by
296  double pt_denom;
297  double true_E = truth->p();
298  double true_pt = truth->pt();
299  double true_eta = truth->eta();
300  double true_phi = truth->phi();
301 
302  if (plotAgainstReco_) {
303  pt_denom = rec_pt;
304  } else {
305  pt_denom = true_pt;
306  }
307  // get true specific quantities
308  double true_ChargedHadEnergy;
309  double true_NeutralHadEnergy;
310  double true_NeutralEmEnergy;
311  gettrue(truth, true_ChargedHadEnergy, true_NeutralHadEnergy, true_NeutralEmEnergy);
312  double true_NeutralEnergy = true_NeutralHadEnergy + true_NeutralEmEnergy;
313  double rec_ChargedHadEnergy = pfj.chargedHadronEnergy();
314  double rec_NeutralHadEnergy = pfj.neutralHadronEnergy();
315  double rec_NeutralEmEnergy = pfj.neutralEmEnergy();
316  double rec_NeutralEnergy = rec_NeutralHadEnergy + rec_NeutralEmEnergy;
317  double rec_ChargedMultiplicity = pfj.chargedMultiplicity();
318  std::vector<PFCandidatePtr> constituents = pfj.getPFConstituents();
319  std::vector<unsigned int> chMult(9, static_cast<unsigned int>(0));
320  for (unsigned ic = 0; ic < constituents.size(); ++ic) {
321  if (constituents[ic]->particleId() > 3)
322  continue;
323  reco::TrackRef trackRef = constituents[ic]->trackRef();
324  if (trackRef.isNull()) {
325  //std::cout << "Warning in entry " << entry_
326  // << " : a track with Id " << constituents[ic]->particleId()
327  // << " has no track ref.." << std::endl;
328  continue;
329  }
330  unsigned int iter = trackRef->algo() > 6 ? 6 : trackRef->algo();
331  ++(chMult[iter]);
332  }
333 
334  bool plot1 = false;
335  bool plot2 = false;
336  bool plot3 = false;
337  bool plot4 = false;
338  bool plot5 = false;
339  bool plot6 = false;
340  bool plot7 = false;
341  double cut1 = 0.0001;
342  double cut2 = 0.0001;
343  double cut3 = 0.0001;
344  double cut4 = 0.0001;
345  double cut5 = 0.0001;
346  double cut6 = 0.0001;
347  double cut7 = 0.0001;
348  double resPt = 0.;
349  double resChargedHadEnergy = 0.;
350  double resNeutralHadEnergy = 0.;
351  double resNeutralEmEnergy = 0.;
352  double resNeutralEnergy = 0.;
353 
354  double resHCALEnergy = 0.;
355  double resNEUTEnergy = 0.;
356  if (rec_NeutralHadEnergy > cut6 && rec_ChargedHadEnergy < cut1) {
357  double true_NEUTEnergy = true_NeutralHadEnergy + true_NeutralEmEnergy;
358  double true_HCALEnergy = true_NEUTEnergy - rec_NeutralEmEnergy;
359  double rec_NEUTEnergy = rec_NeutralHadEnergy + rec_NeutralEmEnergy;
360  double rec_HCALEnergy = rec_NeutralHadEnergy;
361  resHCALEnergy = (rec_HCALEnergy - true_HCALEnergy) / rec_HCALEnergy;
362  resNEUTEnergy = (rec_NEUTEnergy - true_NEUTEnergy) / rec_NEUTEnergy;
363  if (rec_NeutralEmEnergy > cut7) {
364  plot6 = true;
365  } else {
366  plot7 = true;
367  }
368  }
369 
370  // get relative delta quantities (protect against division by zero!)
371  if (true_pt > 0.0001) {
372  resPt = (rec_pt - true_pt) / true_pt;
373  plot1 = true;
374  }
375  if (true_ChargedHadEnergy > cut1) {
376  resChargedHadEnergy = (rec_ChargedHadEnergy - true_ChargedHadEnergy) / true_ChargedHadEnergy;
377  plot2 = true;
378  }
379  if (true_NeutralHadEnergy > cut2) {
380  resNeutralHadEnergy = (rec_NeutralHadEnergy - true_NeutralHadEnergy) / true_NeutralHadEnergy;
381  plot3 = true;
382  } else if (rec_NeutralHadEnergy > cut3) {
383  resNeutralHadEnergy = (rec_NeutralHadEnergy - true_NeutralHadEnergy) / rec_NeutralHadEnergy;
384  plot3 = true;
385  }
386  if (true_NeutralEmEnergy > cut4) {
387  resNeutralEmEnergy = (rec_NeutralEmEnergy - true_NeutralEmEnergy) / true_NeutralEmEnergy;
388  plot4 = true;
389  }
390  if (true_NeutralEnergy > cut5) {
391  resNeutralEnergy = (rec_NeutralEnergy - true_NeutralEnergy) / true_NeutralEnergy;
392  plot5 = true;
393  }
394 
395  //double deltaEta = algo_->deltaEta(&pfj, truth);
396  //double deltaPhi = algo_->deltaPhi(&pfj, truth);
397 
398  // Print outliers for further debugging
399  if ((resPt > 0.2 && true_pt > 100.) || (resPt < -0.5 && true_pt > 100.)) {
400  //if ( ( true_pt > 50. &&
401  // ( ( truth->eta()>3.0 && rec_eta-truth->eta() < -0.1 ) ||
402  // ( truth->eta()<-3.0 && rec_eta-truth->eta() > 0.1 ) ))) {
403  std::cout << "Entry " << entry_ << " resPt = " << resPt << " resCharged " << resChargedHadEnergy
404  << " resNeutralHad " << resNeutralHadEnergy << " resNeutralEm " << resNeutralEmEnergy
405  << " pT (T/R) " << true_pt << "/" << rec_pt << " Eta (T/R) " << truth->eta() << "/" << rec_eta
406  << " Phi (T/R) " << truth->phi() << "/" << rec_phi << std::endl;
407 
408  // check overlapping PF jets
409  const reco::PFJet* pfoj = nullptr;
410  double dRo = 1E9;
411  for (unsigned j = 0; j < pfJets.size(); j++) {
412  const reco::PFJet& pfo = pfJets[j];
413  if (j != i && algo_->deltaR(&pfj, &pfo) < dRo && pfo.pt() > 0.25 * pfj.pt()) {
414  dRo = algo_->deltaR(&pfj, &pfo);
415  pfoj = &pfo;
416  }
417  }
418 
419  // Check overlapping Gen Jet
420  math::XYZTLorentzVector overlappinGenJet(0., 0., 0., 0.);
421  const reco::GenJet* genoj = nullptr;
422  double dRgo = 1E9;
423  for (unsigned j = 0; j < genJets.size(); j++) {
424  const reco::GenJet* gjo = &(genJets[j]);
425  if (gjo != truth && algo_->deltaR(truth, gjo) < dRgo && gjo->pt() > 0.25 * truth->pt()) {
426  dRgo = algo_->deltaR(truth, gjo);
427  genoj = gjo;
428  }
429  }
430 
431  if (dRo < 0.8 && dRgo < 0.8 && algo_->deltaR(genoj, pfoj) < 2. * deltaRMax_)
432  std::cout << "Excess probably due to overlapping jets (DR = " << algo_->deltaR(genoj, pfoj) << "),"
433  << " at DeltaR(T/R) = " << dRgo << "/" << dRo << " with pT(T/R) " << genoj->pt() << "/"
434  << pfoj->pt() << " and Eta (T/R) " << genoj->eta() << "/" << pfoj->eta() << " and Phi (T/R) "
435  << genoj->phi() << "/" << pfoj->phi() << std::endl;
436  }
437 
438  if (std::abs(resPt) > std::abs(resPtMax_))
439  resPtMax_ = resPt;
440  if (std::abs(resChargedHadEnergy) > std::abs(resChargedHadEnergyMax_))
441  resChargedHadEnergyMax_ = resChargedHadEnergy;
442  if (std::abs(resNeutralHadEnergy) > std::abs(resNeutralHadEnergyMax_))
443  resNeutralHadEnergyMax_ = resNeutralHadEnergy;
444  if (std::abs(resNeutralEmEnergy) > std::abs(resNeutralEmEnergyMax_))
445  resNeutralEmEnergyMax_ = resNeutralEmEnergy;
446  if (debug_) {
447  cout << i << " =========PFJet Pt " << rec_pt << " eta " << rec_eta << " phi " << rec_phi
448  << " Charged Had Energy " << rec_ChargedHadEnergy << " Neutral Had Energy " << rec_NeutralHadEnergy
449  << " Neutral elm Energy " << rec_NeutralEmEnergy << endl;
450  cout << " matching Gen Jet Pt " << true_pt << " eta " << truth->eta() << " phi " << truth->phi()
451  << " Charged Had Energy " << true_ChargedHadEnergy << " Neutral Had Energy " << true_NeutralHadEnergy
452  << " Neutral elm Energy " << true_NeutralEmEnergy << endl;
453  printPFJet(&pfj);
454  // cout<<pfj.print()<<endl;
455  printGenJet(truth);
456  //cout <<truth->print()<<endl;
457 
458  cout << "==============deltaR " << deltaR << " resPt " << resPt << " resChargedHadEnergy "
459  << resChargedHadEnergy << " resNeutralHadEnergy " << resNeutralHadEnergy << " resNeutralEmEnergy "
460  << resNeutralEmEnergy << endl;
461  }
462 
463  if (plot1) {
464  if (rec_eta > 0.)
465  hDEtavsEta->Fill(true_eta, rec_eta - true_eta);
466  else
467  hDEtavsEta->Fill(true_eta, -rec_eta + true_eta);
468  hDPhivsEta->Fill(true_eta, rec_phi - true_phi);
469 
470  hRPtvsEta->Fill(true_eta, resPt);
471  hNCHvsEta->Fill(true_eta, rec_ChargedMultiplicity);
472  hNCH0vsEta->Fill(true_eta, chMult[0]);
473  hNCH1vsEta->Fill(true_eta, chMult[1]);
474  hNCH2vsEta->Fill(true_eta, chMult[2]);
475  hNCH3vsEta->Fill(true_eta, chMult[3]);
476  hNCH4vsEta->Fill(true_eta, chMult[4]);
477  hNCH5vsEta->Fill(true_eta, chMult[5]);
478  hNCH6vsEta->Fill(true_eta, chMult[6]);
479  hNCH7vsEta->Fill(true_eta, chMult[7]);
480  }
481  if (plot2)
482  hRCHEvsEta->Fill(true_eta, resChargedHadEnergy);
483  if (plot5)
484  hRNeutvsEta->Fill(true_eta, resNeutralEnergy);
485  if (plot6) {
486  hRHCALvsEta->Fill(true_eta, resHCALEnergy);
487  hRNEUTvsEta->Fill(true_eta, resNEUTEnergy);
488  }
489  if (plot7) {
490  hRHONLvsEta->Fill(true_eta, resHCALEnergy);
491  hRNONLvsEta->Fill(true_eta, resNEUTEnergy);
492  }
493 
494  // fill histograms for relative delta quantitites of matched jets
495  // delta Pt or E quantities for Barrel
496  if (Barrel) {
497  if (plot1) {
498  hBRPt->Fill(resPt);
499  if (pt_denom > 20. && pt_denom < 40.)
500  hBRPt20_40->Fill(resPt);
501  if (pt_denom > 40. && pt_denom < 60.)
502  hBRPt40_60->Fill(resPt);
503  if (pt_denom > 60. && pt_denom < 80.)
504  hBRPt60_80->Fill(resPt);
505  if (pt_denom > 80. && pt_denom < 100.)
506  hBRPt80_100->Fill(resPt);
507  if (pt_denom > 100. && pt_denom < 150.)
508  hBRPt100_150->Fill(resPt);
509  if (pt_denom > 150. && pt_denom < 200.)
510  hBRPt150_200->Fill(resPt);
511  if (pt_denom > 200. && pt_denom < 250.)
512  hBRPt200_250->Fill(resPt);
513  if (pt_denom > 250. && pt_denom < 300.)
514  hBRPt250_300->Fill(resPt);
515  if (pt_denom > 300. && pt_denom < 400.)
516  hBRPt300_400->Fill(resPt);
517  if (pt_denom > 400. && pt_denom < 500.)
518  hBRPt400_500->Fill(resPt);
519  if (pt_denom > 500. && pt_denom < 750.)
520  hBRPt500_750->Fill(resPt);
521  if (pt_denom > 750. && pt_denom < 1250.)
522  hBRPt750_1250->Fill(resPt);
523  if (pt_denom > 1250. && pt_denom < 2000.)
524  hBRPt1250_2000->Fill(resPt);
525  if (pt_denom > 2000. && pt_denom < 5000.)
526  hBRPt2000_5000->Fill(resPt);
527  hBNCH->Fill(rec_ChargedMultiplicity);
528  hBNCH0vsPt->Fill(pt_denom, chMult[0]);
529  hBNCH1vsPt->Fill(pt_denom, chMult[1]);
530  hBNCH2vsPt->Fill(pt_denom, chMult[2]);
531  hBNCH3vsPt->Fill(pt_denom, chMult[3]);
532  hBNCH4vsPt->Fill(pt_denom, chMult[4]);
533  hBNCH5vsPt->Fill(pt_denom, chMult[5]);
534  hBNCH6vsPt->Fill(pt_denom, chMult[6]);
535  hBNCH7vsPt->Fill(pt_denom, chMult[7]);
536  hBNCHvsPt->Fill(pt_denom, rec_ChargedMultiplicity);
537  if (rec_eta > 0.)
538  hBDEtavsPt->Fill(pt_denom, rec_eta - true_eta);
539  else
540  hBDEtavsPt->Fill(pt_denom, -rec_eta + true_eta);
541  hBDPhivsPt->Fill(pt_denom, rec_phi - true_phi);
542  }
543  if (plot2)
544  hBRCHE->Fill(resChargedHadEnergy);
545  if (plot3)
546  hBRNHE->Fill(resNeutralHadEnergy);
547  if (plot4)
548  hBRNEE->Fill(resNeutralEmEnergy);
549  if (plot5)
550  hBRneut->Fill(resNeutralEnergy);
551  if (plot1)
552  hBRPtvsPt->Fill(pt_denom, resPt);
553  if (plot2)
554  hBRCHEvsPt->Fill(pt_denom, resChargedHadEnergy);
555  if (plot3)
556  hBRNHEvsPt->Fill(pt_denom, resNeutralHadEnergy);
557  if (plot4)
558  hBRNEEvsPt->Fill(pt_denom, resNeutralEmEnergy);
559  if (plot5)
560  hBRneutvsPt->Fill(pt_denom, resNeutralEnergy);
561  if (plot6) {
562  hBRHCALvsP->Fill(true_E, resHCALEnergy);
563  hBRNEUTvsP->Fill(true_E, resNEUTEnergy);
564  }
565  if (plot7) {
566  hBRHONLvsP->Fill(true_E, resHCALEnergy);
567  hBRNONLvsP->Fill(true_E, resNEUTEnergy);
568  }
569  }
570  // delta Pt or E quantities for Endcap
571  if (Endcap) {
572  if (plot1) {
573  hERPt->Fill(resPt);
574  if (pt_denom > 20. && pt_denom < 40.)
575  hERPt20_40->Fill(resPt);
576  if (pt_denom > 40. && pt_denom < 60.)
577  hERPt40_60->Fill(resPt);
578  if (pt_denom > 60. && pt_denom < 80.)
579  hERPt60_80->Fill(resPt);
580  if (pt_denom > 80. && pt_denom < 100.)
581  hERPt80_100->Fill(resPt);
582  if (pt_denom > 100. && pt_denom < 150.)
583  hERPt100_150->Fill(resPt);
584  if (pt_denom > 150. && pt_denom < 200.)
585  hERPt150_200->Fill(resPt);
586  if (pt_denom > 200. && pt_denom < 250.)
587  hERPt200_250->Fill(resPt);
588  if (pt_denom > 250. && pt_denom < 300.)
589  hERPt250_300->Fill(resPt);
590  if (pt_denom > 300. && pt_denom < 400.)
591  hERPt300_400->Fill(resPt);
592  if (pt_denom > 400. && pt_denom < 500.)
593  hERPt400_500->Fill(resPt);
594  if (pt_denom > 500. && pt_denom < 750.)
595  hERPt500_750->Fill(resPt);
596  if (pt_denom > 750. && pt_denom < 1250.)
597  hERPt750_1250->Fill(resPt);
598  if (pt_denom > 1250. && pt_denom < 2000.)
599  hERPt1250_2000->Fill(resPt);
600  if (pt_denom > 2000. && pt_denom < 5000.)
601  hERPt2000_5000->Fill(resPt);
602  hENCH->Fill(rec_ChargedMultiplicity);
603  hENCHvsPt->Fill(pt_denom, rec_ChargedMultiplicity);
604  hENCH0vsPt->Fill(pt_denom, chMult[0]);
605  hENCH1vsPt->Fill(pt_denom, chMult[1]);
606  hENCH2vsPt->Fill(pt_denom, chMult[2]);
607  hENCH3vsPt->Fill(pt_denom, chMult[3]);
608  hENCH4vsPt->Fill(pt_denom, chMult[4]);
609  hENCH5vsPt->Fill(pt_denom, chMult[5]);
610  hENCH6vsPt->Fill(pt_denom, chMult[6]);
611  hENCH7vsPt->Fill(pt_denom, chMult[7]);
612  if (rec_eta > 0.)
613  hEDEtavsPt->Fill(pt_denom, rec_eta - true_eta);
614  else
615  hEDEtavsPt->Fill(pt_denom, -rec_eta + true_eta);
616  hEDPhivsPt->Fill(pt_denom, rec_phi - true_phi);
617  }
618  if (plot2)
619  hERCHE->Fill(resChargedHadEnergy);
620  if (plot3)
621  hERNHE->Fill(resNeutralHadEnergy);
622  if (plot4)
623  hERNEE->Fill(resNeutralEmEnergy);
624  if (plot5)
625  hERneut->Fill(resNeutralEnergy);
626  if (plot1)
627  hERPtvsPt->Fill(pt_denom, resPt);
628  if (plot2)
629  hERCHEvsPt->Fill(pt_denom, resChargedHadEnergy);
630  if (plot3)
631  hERNHEvsPt->Fill(pt_denom, resNeutralHadEnergy);
632  if (plot4)
633  hERNEEvsPt->Fill(pt_denom, resNeutralEmEnergy);
634  if (plot5)
635  hERneutvsPt->Fill(pt_denom, resNeutralEnergy);
636  if (plot6) {
637  hERHCALvsP->Fill(true_E, resHCALEnergy);
638  hERNEUTvsP->Fill(true_E, resNEUTEnergy);
639  }
640  if (plot7) {
641  hERHONLvsP->Fill(true_E, resHCALEnergy);
642  hERNONLvsP->Fill(true_E, resNEUTEnergy);
643  }
644  }
645  // delta Pt or E quantities for Forward
646  if (Forward) {
647  if (plot1) {
648  hFRPt->Fill(resPt);
649  if (pt_denom > 20. && pt_denom < 40.)
650  hFRPt20_40->Fill(resPt);
651  if (pt_denom > 40. && pt_denom < 60.)
652  hFRPt40_60->Fill(resPt);
653  if (pt_denom > 60. && pt_denom < 80.)
654  hFRPt60_80->Fill(resPt);
655  if (pt_denom > 80. && pt_denom < 100.)
656  hFRPt80_100->Fill(resPt);
657  if (pt_denom > 100. && pt_denom < 150.)
658  hFRPt100_150->Fill(resPt);
659  if (pt_denom > 150. && pt_denom < 200.)
660  hFRPt150_200->Fill(resPt);
661  if (pt_denom > 200. && pt_denom < 250.)
662  hFRPt200_250->Fill(resPt);
663  if (pt_denom > 250. && pt_denom < 300.)
664  hFRPt250_300->Fill(resPt);
665  if (pt_denom > 300. && pt_denom < 400.)
666  hFRPt300_400->Fill(resPt);
667  if (pt_denom > 400. && pt_denom < 500.)
668  hFRPt400_500->Fill(resPt);
669  if (pt_denom > 500. && pt_denom < 750.)
670  hFRPt500_750->Fill(resPt);
671  if (pt_denom > 750. && pt_denom < 1250.)
672  hFRPt750_1250->Fill(resPt);
673  if (pt_denom > 1250. && pt_denom < 2000.)
674  hFRPt1250_2000->Fill(resPt);
675  if (pt_denom > 2000. && pt_denom < 5000.)
676  hFRPt2000_5000->Fill(resPt);
677  if (rec_eta > 0.)
678  hFDEtavsPt->Fill(pt_denom, rec_eta - true_eta);
679  else
680  hFDEtavsPt->Fill(pt_denom, -rec_eta + true_eta);
681  hFDPhivsPt->Fill(pt_denom, rec_phi - true_phi);
682  }
683  if (plot2)
684  hFRCHE->Fill(resChargedHadEnergy);
685  if (plot3)
686  hFRNHE->Fill(resNeutralHadEnergy);
687  if (plot4)
688  hFRNEE->Fill(resNeutralEmEnergy);
689  if (plot5)
690  hFRneut->Fill(resNeutralEnergy);
691  if (plot1)
692  hFRPtvsPt->Fill(pt_denom, resPt);
693  if (plot2)
694  hFRCHEvsPt->Fill(pt_denom, resChargedHadEnergy);
695  if (plot3)
696  hFRNHEvsPt->Fill(pt_denom, resNeutralHadEnergy);
697  if (plot4)
698  hFRNEEvsPt->Fill(pt_denom, resNeutralEmEnergy);
699  if (plot5)
700  hFRneutvsPt->Fill(pt_denom, resNeutralEnergy);
701  if (plot6) {
702  hFRHCALvsP->Fill(true_E, resHCALEnergy);
703  hFRNEUTvsP->Fill(true_E, resNEUTEnergy);
704  }
705  if (plot7) {
706  hFRHONLvsP->Fill(true_E, resHCALEnergy);
707  hFRNONLvsP->Fill(true_E, resNEUTEnergy);
708  }
709  }
710  } // end case deltaR < deltaRMax
711 
712  } // i loop on pf Jets
713 
714  // Increment counter
715  entry_++;
716 }
717 
719  double& true_ChargedHadEnergy,
720  double& true_NeutralHadEnergy,
721  double& true_NeutralEmEnergy) {
722  std::vector<const GenParticle*> mcparts = truth->getGenConstituents();
723  true_NeutralEmEnergy = 0.;
724  true_ChargedHadEnergy = 0.;
725  true_NeutralHadEnergy = 0.;
726  // for each MC particle in turn
727  for (unsigned i = 0; i < mcparts.size(); i++) {
728  const GenParticle* mcpart = mcparts[i];
729  int PDG = std::abs(mcpart->pdgId());
730  double e = mcpart->energy();
731  switch (PDG) { // start PDG switch
732  case 22: // photon
733  true_NeutralEmEnergy += e;
734  break;
735  case 211: // pi
736  case 321: // K
737  case 2212: // p
738  case 11: //electrons (until recognised)
739  true_ChargedHadEnergy += e;
740  break;
741  case 310: // K_S0
742  case 130: // K_L0
743  case 3122: // Lambda0
744  case 2112: // n0
745  true_NeutralHadEnergy += e;
746  default:
747  break;
748  } // end PDG switch
749  } // end loop on constituents.
750 }
751 
753  cout << setiosflags(ios::right);
754  cout << setiosflags(ios::fixed);
755  cout << setprecision(3);
756 
757  cout << "PFJet p/px/py/pz/pt: " << pfj->p() << "/" << pfj->px() << "/" << pfj->py() << "/" << pfj->pz() << "/"
758  << pfj->pt() << endl
759  << " eta/phi: " << pfj->eta() << "/" << pfj->phi() << endl
760  << " PFJet specific:" << std::endl
761  << " charged/neutral hadrons energy: " << pfj->chargedHadronEnergy() << '/' << pfj->neutralHadronEnergy()
762  << endl
763  << " charged/neutral em energy: " << pfj->chargedEmEnergy() << '/' << pfj->neutralEmEnergy() << endl
764  << " charged muon energy: " << pfj->chargedMuEnergy() << '/' << endl
765  << " charged/neutral multiplicity: " << pfj->chargedMultiplicity() << '/' << pfj->neutralMultiplicity()
766  << endl;
767 
768  // And print the constituents
769  std::cout << pfj->print() << std::endl;
770 
771  cout << resetiosflags(ios::right | ios::fixed);
772 }
773 
775  std::vector<const GenParticle*> mcparts = truth->getGenConstituents();
776  cout << "GenJet p/px/py/pz/pt: " << truth->p() << '/' << truth->px() << '/' << truth->py() << '/' << truth->pz()
777  << '/' << truth->pt() << endl
778  << " eta/phi: " << truth->eta() << '/' << truth->phi() << endl
779  << " # of constituents: " << mcparts.size() << endl;
780  cout << " constituents:" << endl;
781  for (unsigned i = 0; i < mcparts.size(); i++) {
782  const GenParticle* mcpart = mcparts[i];
783  cout << " #" << i << " PDG code:" << mcpart->pdgId() << ", p/pt/eta/phi: " << mcpart->p() << '/'
784  << mcpart->pt() << '/' << mcpart->eta() << '/' << mcpart->phi() << endl;
785  }
786 }
#define BOOK1D(name, title, nbinsx, lowx, highx)
double pz() const final
z coordinate of momentum vector
float neutralHadronEnergy() const
neutralHadronEnergy
Definition: PFJet.h:99
double pt() const final
transverse momentum
#define PT
int chargedMultiplicity() const
chargedMultiplicity
Definition: PFJet.h:152
float chargedEmEnergy() const
chargedEmEnergy
Definition: PFJet.h:139
std::string print() const override
Print object in details.
Definition: PFJet.cc:67
float neutralEmEnergy() const
neutralEmEnergy
Definition: PFJet.h:147
void setCurrentFolder(std::string const &fullpath) override
Definition: DQMStore.h:656
std::vector< GenJet > GenJetCollection
collection of GenJet objects
#define SETAXES(name, xtitle, ytitle)
int neutralMultiplicity() const
neutralMultiplicity
Definition: PFJet.h:154
Jets made from PFObjects.
Definition: PFJet.h:20
unsigned int entry_
DQMStore * dbe_
virtual ~PFJetBenchmark()
int pdgId() const final
PDG identifier.
void gettrue(const reco::GenJet *truth, double &true_ChargedHadEnergy, double &true_NeutralHadEnergy, double &true_NeutralEmEnergy)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
virtual std::vector< reco::PFCandidatePtr > getPFConstituents() const
get all constituents
Definition: PFJet.cc:41
double px() const final
x coordinate of momentum vector
double p() const final
magnitude of momentum vector
#define BOOK2D(name, title, nbinsx, lowx, highx, nbinsy, lowy, highy)
TH1F * hBRPt750_1250
static double deltaR(const T *, const U *)
#define DBOOK2D(name, title, nbinsx, lowx, highx, nbinsy, lowy, highy)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Jets made from MC generator particles.
Definition: GenJet.h:23
std::string outputFile_
double py() const final
y coordinate of momentum vector
PFBenchmarkAlgo * algo_
bool isNull() const
Checks for null.
Definition: Ref.h:235
void process(const reco::PFJetCollection &, const reco::GenJetCollection &)
Definition: HCAL.py:1
double resChargedHadEnergyMax_
static const Collection::value_type * matchByDeltaR(const T *, const Collection *)
#define debug
Definition: HDRShower.cc:19
std::pair< OmniClusterRef, TrackingParticleRef > P
float chargedMuEnergy() const
chargedMuEnergy
Definition: PFJet.h:143
DQM_DEPRECATED void save(std::string const &filename, std::string const &path="")
Definition: DQMStore.cc:824
std::vector< PFJet > PFJetCollection
collection of PFJet objects
double resNeutralHadEnergyMax_
fixed size matrix
void printPFJet(const reco::PFJet *)
virtual std::vector< const GenParticle * > getGenConstituents() const
get all constituents
Definition: GenJet.cc:51
float chargedHadronEnergy() const
chargedHadronEnergy
Definition: PFJet.h:95
double resNeutralEmEnergyMax_
#define DSETAXES(name, xtitle, ytitle)
void setup(std::string Filename, bool debug, bool plotAgainstReco=false, bool onlyTwoJets=true, double deltaRMax=0.1, std::string benchmarkLabel_="ParticleFlow", double recPt=-1, double maxEta=-1, DQMStore *dbe_store=nullptr)
long double T
double phi() const final
momentum azimuthal angle
void printGenJet(const reco::GenJet *)
#define DBOOK1D(name, title, nbinsx, lowx, highx)
double energy() const final
energy
double eta() const final
momentum pseudorapidity