CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
PFClusterValidation.cc
Go to the documentation of this file.
34 
35 #include <algorithm>
36 #include <cmath>
37 #include <iostream>
38 #include <string>
39 #include <utility>
40 #include <vector>
41 
43 public:
45  ~PFClusterValidation() override;
46  void analyze(edm::Event const& e, edm::EventSetup const& c) override;
47  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
48 
49 private:
50  static constexpr double partR2 = 0.3 * 0.3; // dr cutoff (squared)
51  static double sumEnergy(edm::Handle<reco::PFClusterCollection> const& pfClusters, double eta, double phi);
52 
58 
62 
67 
71 
75 
79 
83 
87 
90 
101 
103 };
104 
106  hepMCTok_ = consumes<edm::HepMCProduct>(edm::InputTag("generatorSmeared"));
107 
109  consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterECAL"));
111  consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterHCAL"));
112  pfClusterHOTok_ = consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterHO"));
113  pfClusterHFTok_ = consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterHF"));
114 }
115 
117 
119  edm::Run const& irun,
120  edm::EventSetup const& isetup) {
121  constexpr auto size = 100;
122  char histo[size];
123 
124  constexpr double etaBinsOffset[] = {
125  -5.191, -4.889, -4.716, -4.538, -4.363, -4.191, -4.013, -3.839, -3.664, -3.489, -3.314, -3.139, -2.964, -2.853,
126  -2.65, -2.5, -2.322, -2.172, -2.043, -1.93, -1.83, -1.74, -1.653, -1.566, -1.479, -1.392, -1.305, -1.218,
127  -1.131, -1.044, -0.957, -0.879, -0.783, -0.696, -0.609, -0.522, -0.435, -0.348, -0.261, -0.174, -0.087, 0,
128  0.087, 0.174, 0.261, 0.348, 0.435, 0.522, 0.609, 0.696, 0.783, 0.879, 0.957, 1.044, 1.131, 1.218,
129  1.305, 1.392, 1.479, 1.566, 1.653, 1.74, 1.83, 1.93, 2.043, 2.172, 2.322, 2.5, 2.65, 2.853,
130  2.964, 3.139, 3.314, 3.489, 3.664, 3.839, 4.013, 4.191, 4.363, 4.538, 4.716, 4.889, 5.191};
131  constexpr int etaBins = std::size(etaBinsOffset) - 1;
132 
133  ibooker.setCurrentFolder("ParticleFlow/PFClusterV");
134 
135  // These are the single pion scan histos
136 
137  strncpy(histo, "emean_vs_eta_E", size);
138  emean_vs_eta_E_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
139  strncpy(histo, "emean_vs_eta_H", size);
140  emean_vs_eta_H_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
141  strncpy(histo, "emean_vs_eta_EH", size);
142  emean_vs_eta_EH_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
143 
144  strncpy(histo, "emean_vs_eta_HF", size);
145  emean_vs_eta_HF_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
146  strncpy(histo, "emean_vs_eta_HO", size);
147  emean_vs_eta_HO_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
148 
149  strncpy(histo, "emean_vs_eta_EHF", size);
150  emean_vs_eta_EHF_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
151  strncpy(histo, "emean_vs_eta_EHFO", size);
152  emean_vs_eta_EHFO_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
153 
154  // 1D histos
155 
156  strncpy(histo, "Ratio_Esummed_ECAL_0", size);
157  ratio_Esummed_ECAL_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
158  strncpy(histo, "Ratio_Esummed_HCAL_0", size);
159  ratio_Esummed_HCAL_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
160  strncpy(histo, "Ratio_Esummed_HO_0", size);
161  ratio_Esummed_HO_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
162  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_0", size);
163  ratio_Esummed_ECAL_HCAL_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
164  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_0", size);
165  ratio_Esummed_ECAL_HCAL_HO_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
166 
167  strncpy(histo, "Ratio_Esummed_ECAL_1", size);
168  ratio_Esummed_ECAL_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
169  strncpy(histo, "Ratio_Esummed_HCAL_1", size);
170  ratio_Esummed_HCAL_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
171  strncpy(histo, "Ratio_Esummed_HO_1", size);
172  ratio_Esummed_HO_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
173  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_1", size);
174  ratio_Esummed_ECAL_HCAL_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
175  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_1", size);
176  ratio_Esummed_ECAL_HCAL_HO_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
177 
178  strncpy(histo, "Ratio_Esummed_ECAL_2", size);
179  ratio_Esummed_ECAL_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
180  strncpy(histo, "Ratio_Esummed_HCAL_2", size);
181  ratio_Esummed_HCAL_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
182  strncpy(histo, "Ratio_Esummed_HO_2", size);
183  ratio_Esummed_HO_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
184  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_2", size);
185  ratio_Esummed_ECAL_HCAL_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
186  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_2", size);
187  ratio_Esummed_ECAL_HCAL_HO_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
188 
189  strncpy(histo, "Ratio_Esummed_ECAL_3", size);
190  ratio_Esummed_ECAL_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
191  strncpy(histo, "Ratio_Esummed_HCAL_3", size);
192  ratio_Esummed_HCAL_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
193  strncpy(histo, "Ratio_Esummed_HO_3", size);
194  ratio_Esummed_HO_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
195  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_3", size);
196  ratio_Esummed_ECAL_HCAL_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
197  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_3", size);
198  ratio_Esummed_ECAL_HCAL_HO_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
199 
200  strncpy(histo, "Ratio_Esummed_ECAL_4", size);
201  ratio_Esummed_ECAL_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
202  strncpy(histo, "Ratio_Esummed_HCAL_4", size);
203  ratio_Esummed_HCAL_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
204  strncpy(histo, "Ratio_Esummed_HO_4", size);
205  ratio_Esummed_HO_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
206  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_4", size);
207  ratio_Esummed_ECAL_HCAL_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
208  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_4", size);
209  ratio_Esummed_ECAL_HCAL_HO_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
210 
211  strncpy(histo, "Ratio_Esummed_HF_5", size);
212  ratio_Esummed_HF_5_ = ibooker.book1D(histo, histo, 50, 0., 5.);
213  strncpy(histo, "Ratio_Esummed_HF_6", size);
214  ratio_Esummed_HF_6_ = ibooker.book1D(histo, histo, 50, 0., 5.);
215 
216  strncpy(histo, "Egen_MC", size);
217  egen_MC_ = ibooker.book1D(histo, histo, 50, 0, 50);
218 }
219 
221  double eta_MC = 0.;
222  double phi_MC = 0.;
223  double energy_MC = 0.;
224 
226  event.getByToken(hepMCTok_, hepMC);
227  if (not hepMC.isValid()) {
228  edm::LogWarning("PFClusterValidation") << "HepMCProduct not found";
229  return;
230  }
231 
232  // MC particle with highest pt is taken as a direction reference
233  double maxPt = -99999.;
234  const HepMC::GenEvent* myGenEvent = hepMC->GetEvent();
235  for (auto p = myGenEvent->particles_begin(); p != myGenEvent->particles_end(); ++p) {
236  double phip = (*p)->momentum().phi();
237  double etap = (*p)->momentum().eta();
238  double pt = (*p)->momentum().perp();
239  double energy = (*p)->momentum().e();
240  if (pt > maxPt) {
241  maxPt = pt;
242  energy_MC = energy;
243  phi_MC = phip;
244  eta_MC = etap;
245  }
246  }
247 
248  egen_MC_->Fill(energy_MC);
249 
251  event.getByToken(pfClusterECALTok_, pfClusterECAL);
252 
254  event.getByToken(pfClusterHCALTok_, pfClusterHCAL);
255 
257  event.getByToken(pfClusterHOTok_, pfClusterHO);
258 
260  event.getByToken(pfClusterHFTok_, pfClusterHF);
261 
262  // sum the energy in a dR cone for each subsystem
263  const double Econe = sumEnergy(pfClusterECAL, eta_MC, phi_MC);
264  const double Hcone = sumEnergy(pfClusterHCAL, eta_MC, phi_MC);
265  const double HOcone = sumEnergy(pfClusterHO, eta_MC, phi_MC);
266  const double HFcone = sumEnergy(pfClusterHF, eta_MC, phi_MC);
267 
268  if (energy_MC > 0.) {
269  if (std::abs(eta_MC) < 0.5) {
270  ratio_Esummed_ECAL_0_->Fill(Econe / energy_MC);
271  ratio_Esummed_HCAL_0_->Fill(Hcone / energy_MC);
272  ratio_Esummed_HO_0_->Fill(HOcone / energy_MC);
273  ratio_Esummed_ECAL_HCAL_0_->Fill((Econe + Hcone) / energy_MC);
274  ratio_Esummed_ECAL_HCAL_HO_0_->Fill((Econe + Hcone + HOcone) / energy_MC);
275  } else if (std::abs(eta_MC) < 1.3 && std::abs(eta_MC) > 0.5) {
276  ratio_Esummed_ECAL_1_->Fill(Econe / energy_MC);
277  ratio_Esummed_HCAL_1_->Fill(Hcone / energy_MC);
278  ratio_Esummed_HO_1_->Fill(HOcone / energy_MC);
279  ratio_Esummed_ECAL_HCAL_1_->Fill((Econe + Hcone) / energy_MC);
280  ratio_Esummed_ECAL_HCAL_HO_1_->Fill((Econe + Hcone + HOcone) / energy_MC);
281  } else if (std::abs(eta_MC) < 2.1 && std::abs(eta_MC) > 1.3) {
282  ratio_Esummed_ECAL_2_->Fill(Econe / energy_MC);
283  ratio_Esummed_HCAL_2_->Fill(Hcone / energy_MC);
284  ratio_Esummed_HO_2_->Fill(HOcone / energy_MC);
285  ratio_Esummed_ECAL_HCAL_2_->Fill((Econe + Hcone) / energy_MC);
286  ratio_Esummed_ECAL_HCAL_HO_2_->Fill((Econe + Hcone + HOcone) / energy_MC);
287  } else if (std::abs(eta_MC) < 2.5 && std::abs(eta_MC) > 2.1) {
288  ratio_Esummed_ECAL_3_->Fill(Econe / energy_MC);
289  ratio_Esummed_HCAL_3_->Fill(Hcone / energy_MC);
290  ratio_Esummed_HO_3_->Fill(HOcone / energy_MC);
291  ratio_Esummed_ECAL_HCAL_3_->Fill((Econe + Hcone) / energy_MC);
292  ratio_Esummed_ECAL_HCAL_HO_3_->Fill((Econe + Hcone + HOcone) / energy_MC);
293  } else if (2.5 < std::abs(eta_MC) && std::abs(eta_MC) < 3.0) {
294  ratio_Esummed_ECAL_4_->Fill(Econe / energy_MC);
295  ratio_Esummed_HCAL_4_->Fill(Hcone / energy_MC);
296  ratio_Esummed_HO_4_->Fill(HOcone / energy_MC);
297  ratio_Esummed_ECAL_HCAL_4_->Fill((Econe + Hcone) / energy_MC);
298  ratio_Esummed_ECAL_HCAL_HO_4_->Fill((Econe + Hcone + HOcone) / energy_MC);
299  } else if (3.0 < std::abs(eta_MC) && std::abs(eta_MC) < 4.0) {
300  ratio_Esummed_HF_5_->Fill(HFcone / energy_MC);
301  } else if (4.0 < std::abs(eta_MC) && std::abs(eta_MC) < 5.0) {
302  ratio_Esummed_HF_6_->Fill(HFcone / energy_MC);
303  }
304  }
305 
306  emean_vs_eta_E_->Fill(eta_MC, Econe);
307  emean_vs_eta_H_->Fill(eta_MC, Hcone);
308  emean_vs_eta_EH_->Fill(eta_MC, Econe + Hcone);
309  emean_vs_eta_HF_->Fill(eta_MC, HFcone);
310  emean_vs_eta_HO_->Fill(eta_MC, HOcone);
311  emean_vs_eta_EHF_->Fill(eta_MC, Econe + Hcone + HFcone);
312  emean_vs_eta_EHFO_->Fill(eta_MC, Econe + Hcone + HFcone + HOcone);
313 }
314 
316  double eta,
317  double phi) {
318  if (not pfClusters.isValid())
319  return 0.;
320 
321  double sum = 0.;
322  for (auto pf = pfClusters->begin(); pf != pfClusters->end(); ++pf) {
323  if (reco::deltaR2(eta, phi, pf->eta(), pf->phi()) < partR2) {
324  sum += pf->energy();
325  }
326  }
327 
328  return sum;
329 }
330 
T getUntrackedParameter(std::string const &, T const &) const
const edm::EventSetup & c
MonitorElement * ratio_Esummed_HCAL_4_
list etaBinsOffset
Definition: defaults_cfi.py:23
MonitorElement * ratio_Esummed_ECAL_4_
void analyze(edm::Event const &e, edm::EventSetup const &c) override
PFClusterValidation(edm::ParameterSet const &conf)
MonitorElement * emean_vs_eta_EHFO_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
MonitorElement * emean_vs_eta_E_
edm::EDGetTokenT< reco::PFClusterCollection > pfClusterHCALTok_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< reco::PFClusterCollection > pfClusterHOTok_
MonitorElement * ratio_Esummed_HO_3_
MonitorElement * ratio_Esummed_HCAL_0_
MonitorElement * ratio_Esummed_ECAL_0_
MonitorElement * ratio_Esummed_HO_2_
MonitorElement * ratio_Esummed_ECAL_HCAL_2_
MonitorElement * ratio_Esummed_ECAL_HCAL_1_
void Fill(long long x)
MonitorElement * emean_vs_eta_EH_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
MonitorElement * ratio_Esummed_HF_5_
MonitorElement * ratio_Esummed_HCAL_3_
MonitorElement * ratio_Esummed_ECAL_1_
MonitorElement * ratio_Esummed_HF_6_
MonitorElement * emean_vs_eta_EHF_
MonitorElement * emean_vs_eta_H_
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int, double lowY, double highY, char const *option="s", FUNC onbooking=NOOP())
Definition: DQMStore.h:322
MonitorElement * ratio_Esummed_ECAL_HCAL_0_
MonitorElement * ratio_Esummed_HCAL_2_
MonitorElement * ratio_Esummed_ECAL_3_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MonitorElement * ratio_Esummed_HO_4_
edm::EDGetTokenT< reco::PFClusterCollection > pfClusterHFTok_
MonitorElement * ratio_Esummed_ECAL_HCAL_HO_0_
MonitorElement * egen_MC_
edm::EDGetTokenT< edm::HepMCProduct > hepMCTok_
MonitorElement * ratio_Esummed_ECAL_HCAL_HO_4_
bool isValid() const
Definition: HandleBase.h:70
static double sumEnergy(edm::Handle< reco::PFClusterCollection > const &pfClusters, double eta, double phi)
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
MonitorElement * ratio_Esummed_HCAL_1_
MonitorElement * ratio_Esummed_ECAL_HCAL_3_
MonitorElement * ratio_Esummed_ECAL_HCAL_4_
MonitorElement * ratio_Esummed_HO_0_
MonitorElement * ratio_Esummed_ECAL_HCAL_HO_3_
MonitorElement * ratio_Esummed_ECAL_HCAL_HO_2_
MonitorElement * ratio_Esummed_ECAL_HCAL_HO_1_
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
static constexpr double partR2
tuple size
Write out results.
MonitorElement * ratio_Esummed_HO_1_
MonitorElement * emean_vs_eta_HF_
Definition: Run.h:45
MonitorElement * emean_vs_eta_HO_
edm::EDGetTokenT< reco::PFClusterCollection > pfClusterECALTok_
MonitorElement * ratio_Esummed_ECAL_2_