CMS 3D CMS Logo

PFClusterValidation.cc
Go to the documentation of this file.
31 
32 #include <algorithm>
33 #include <cmath>
34 #include <iostream>
35 #include <string>
36 #include <utility>
37 #include <vector>
38 
40 public:
42  ~PFClusterValidation() override;
43  void analyze(edm::Event const& e, edm::EventSetup const& c) override;
44  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
45 
46 private:
47  static constexpr double partR2 = 0.3 * 0.3; // dr cutoff (squared)
48  static double sumEnergy(edm::Handle<reco::PFClusterCollection> const& pfClusters, double eta, double phi);
49 
55 
59 
64 
68 
72 
76 
80 
84 
87 
98 
100 };
101 
103  hepMCTok_ = consumes<edm::HepMCProduct>(edm::InputTag("generatorSmeared"));
104 
106  consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterECAL"));
108  consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterHCAL"));
109  pfClusterHOTok_ = consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterHO"));
110  pfClusterHFTok_ = consumes<reco::PFClusterCollection>(conf.getUntrackedParameter<edm::InputTag>("pflowClusterHF"));
111 }
112 
114 
116  edm::Run const& irun,
117  edm::EventSetup const& isetup) {
118  constexpr auto size = 100;
119  char histo[size];
120 
121  constexpr double etaBinsOffset[] = {
122  -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,
123  -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,
124  -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,
125  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,
126  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,
127  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};
128  constexpr int etaBins = std::size(etaBinsOffset) - 1;
129 
130  ibooker.setCurrentFolder("ParticleFlow/PFClusterV");
131 
132  // These are the single pion scan histos
133 
134  strncpy(histo, "emean_vs_eta_E", size);
135  emean_vs_eta_E_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
136  strncpy(histo, "emean_vs_eta_H", size);
137  emean_vs_eta_H_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
138  strncpy(histo, "emean_vs_eta_EH", size);
139  emean_vs_eta_EH_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
140 
141  strncpy(histo, "emean_vs_eta_HF", size);
142  emean_vs_eta_HF_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
143  strncpy(histo, "emean_vs_eta_HO", size);
144  emean_vs_eta_HO_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
145 
146  strncpy(histo, "emean_vs_eta_EHF", size);
147  emean_vs_eta_EHF_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
148  strncpy(histo, "emean_vs_eta_EHFO", size);
149  emean_vs_eta_EHFO_ = ibooker.bookProfile(histo, histo, etaBins, etaBinsOffset, -100., 2000., " ");
150 
151  // 1D histos
152 
153  strncpy(histo, "Ratio_Esummed_ECAL_0", size);
154  ratio_Esummed_ECAL_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
155  strncpy(histo, "Ratio_Esummed_HCAL_0", size);
156  ratio_Esummed_HCAL_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
157  strncpy(histo, "Ratio_Esummed_HO_0", size);
158  ratio_Esummed_HO_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
159  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_0", size);
160  ratio_Esummed_ECAL_HCAL_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
161  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_0", size);
162  ratio_Esummed_ECAL_HCAL_HO_0_ = ibooker.book1D(histo, histo, 50, 0., 5.);
163 
164  strncpy(histo, "Ratio_Esummed_ECAL_1", size);
165  ratio_Esummed_ECAL_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
166  strncpy(histo, "Ratio_Esummed_HCAL_1", size);
167  ratio_Esummed_HCAL_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
168  strncpy(histo, "Ratio_Esummed_HO_1", size);
169  ratio_Esummed_HO_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
170  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_1", size);
171  ratio_Esummed_ECAL_HCAL_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
172  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_1", size);
173  ratio_Esummed_ECAL_HCAL_HO_1_ = ibooker.book1D(histo, histo, 50, 0., 5.);
174 
175  strncpy(histo, "Ratio_Esummed_ECAL_2", size);
176  ratio_Esummed_ECAL_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
177  strncpy(histo, "Ratio_Esummed_HCAL_2", size);
178  ratio_Esummed_HCAL_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
179  strncpy(histo, "Ratio_Esummed_HO_2", size);
180  ratio_Esummed_HO_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
181  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_2", size);
182  ratio_Esummed_ECAL_HCAL_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
183  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_2", size);
184  ratio_Esummed_ECAL_HCAL_HO_2_ = ibooker.book1D(histo, histo, 50, 0., 5.);
185 
186  strncpy(histo, "Ratio_Esummed_ECAL_3", size);
187  ratio_Esummed_ECAL_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
188  strncpy(histo, "Ratio_Esummed_HCAL_3", size);
189  ratio_Esummed_HCAL_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
190  strncpy(histo, "Ratio_Esummed_HO_3", size);
191  ratio_Esummed_HO_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
192  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_3", size);
193  ratio_Esummed_ECAL_HCAL_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
194  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_3", size);
195  ratio_Esummed_ECAL_HCAL_HO_3_ = ibooker.book1D(histo, histo, 50, 0., 5.);
196 
197  strncpy(histo, "Ratio_Esummed_ECAL_4", size);
198  ratio_Esummed_ECAL_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
199  strncpy(histo, "Ratio_Esummed_HCAL_4", size);
200  ratio_Esummed_HCAL_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
201  strncpy(histo, "Ratio_Esummed_HO_4", size);
202  ratio_Esummed_HO_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
203  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_4", size);
204  ratio_Esummed_ECAL_HCAL_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
205  strncpy(histo, "Ratio_Esummed_ECAL_HCAL_HO_4", size);
206  ratio_Esummed_ECAL_HCAL_HO_4_ = ibooker.book1D(histo, histo, 50, 0., 5.);
207 
208  strncpy(histo, "Ratio_Esummed_HF_5", size);
209  ratio_Esummed_HF_5_ = ibooker.book1D(histo, histo, 50, 0., 5.);
210  strncpy(histo, "Ratio_Esummed_HF_6", size);
211  ratio_Esummed_HF_6_ = ibooker.book1D(histo, histo, 50, 0., 5.);
212 
213  strncpy(histo, "Egen_MC", size);
214  egen_MC_ = ibooker.book1D(histo, histo, 50, 0, 50);
215 }
216 
218  double eta_MC = 0.;
219  double phi_MC = 0.;
220  double energy_MC = 0.;
221 
223  event.getByToken(hepMCTok_, hepMC);
224  if (not hepMC.isValid()) {
225  edm::LogWarning("PFClusterValidation") << "HepMCProduct not found";
226  return;
227  }
228 
229  // MC particle with highest pt is taken as a direction reference
230  double maxPt = -99999.;
231  const HepMC::GenEvent* myGenEvent = hepMC->GetEvent();
232  for (auto p = myGenEvent->particles_begin(); p != myGenEvent->particles_end(); ++p) {
233  double phip = (*p)->momentum().phi();
234  double etap = (*p)->momentum().eta();
235  double pt = (*p)->momentum().perp();
236  double energy = (*p)->momentum().e();
237  if (pt > maxPt) {
238  maxPt = pt;
239  energy_MC = energy;
240  phi_MC = phip;
241  eta_MC = etap;
242  }
243  }
244 
245  egen_MC_->Fill(energy_MC);
246 
248  event.getByToken(pfClusterECALTok_, pfClusterECAL);
249 
251  event.getByToken(pfClusterHCALTok_, pfClusterHCAL);
252 
254  event.getByToken(pfClusterHOTok_, pfClusterHO);
255 
257  event.getByToken(pfClusterHFTok_, pfClusterHF);
258 
259  // sum the energy in a dR cone for each subsystem
260  const double Econe = sumEnergy(pfClusterECAL, eta_MC, phi_MC);
261  const double Hcone = sumEnergy(pfClusterHCAL, eta_MC, phi_MC);
262  const double HOcone = sumEnergy(pfClusterHO, eta_MC, phi_MC);
263  const double HFcone = sumEnergy(pfClusterHF, eta_MC, phi_MC);
264 
265  if (energy_MC > 0.) {
266  if (std::abs(eta_MC) < 0.5) {
267  ratio_Esummed_ECAL_0_->Fill(Econe / energy_MC);
268  ratio_Esummed_HCAL_0_->Fill(Hcone / energy_MC);
269  ratio_Esummed_HO_0_->Fill(HOcone / energy_MC);
270  ratio_Esummed_ECAL_HCAL_0_->Fill((Econe + Hcone) / energy_MC);
271  ratio_Esummed_ECAL_HCAL_HO_0_->Fill((Econe + Hcone + HOcone) / energy_MC);
272  } else if (std::abs(eta_MC) < 1.3 && std::abs(eta_MC) > 0.5) {
273  ratio_Esummed_ECAL_1_->Fill(Econe / energy_MC);
274  ratio_Esummed_HCAL_1_->Fill(Hcone / energy_MC);
275  ratio_Esummed_HO_1_->Fill(HOcone / energy_MC);
276  ratio_Esummed_ECAL_HCAL_1_->Fill((Econe + Hcone) / energy_MC);
277  ratio_Esummed_ECAL_HCAL_HO_1_->Fill((Econe + Hcone + HOcone) / energy_MC);
278  } else if (std::abs(eta_MC) < 2.1 && std::abs(eta_MC) > 1.3) {
279  ratio_Esummed_ECAL_2_->Fill(Econe / energy_MC);
280  ratio_Esummed_HCAL_2_->Fill(Hcone / energy_MC);
281  ratio_Esummed_HO_2_->Fill(HOcone / energy_MC);
282  ratio_Esummed_ECAL_HCAL_2_->Fill((Econe + Hcone) / energy_MC);
283  ratio_Esummed_ECAL_HCAL_HO_2_->Fill((Econe + Hcone + HOcone) / energy_MC);
284  } else if (std::abs(eta_MC) < 2.5 && std::abs(eta_MC) > 2.1) {
285  ratio_Esummed_ECAL_3_->Fill(Econe / energy_MC);
286  ratio_Esummed_HCAL_3_->Fill(Hcone / energy_MC);
287  ratio_Esummed_HO_3_->Fill(HOcone / energy_MC);
288  ratio_Esummed_ECAL_HCAL_3_->Fill((Econe + Hcone) / energy_MC);
289  ratio_Esummed_ECAL_HCAL_HO_3_->Fill((Econe + Hcone + HOcone) / energy_MC);
290  } else if (2.5 < std::abs(eta_MC) && std::abs(eta_MC) < 3.0) {
291  ratio_Esummed_ECAL_4_->Fill(Econe / energy_MC);
292  ratio_Esummed_HCAL_4_->Fill(Hcone / energy_MC);
293  ratio_Esummed_HO_4_->Fill(HOcone / energy_MC);
294  ratio_Esummed_ECAL_HCAL_4_->Fill((Econe + Hcone) / energy_MC);
295  ratio_Esummed_ECAL_HCAL_HO_4_->Fill((Econe + Hcone + HOcone) / energy_MC);
296  } else if (3.0 < std::abs(eta_MC) && std::abs(eta_MC) < 4.0) {
297  ratio_Esummed_HF_5_->Fill(HFcone / energy_MC);
298  } else if (4.0 < std::abs(eta_MC) && std::abs(eta_MC) < 5.0) {
299  ratio_Esummed_HF_6_->Fill(HFcone / energy_MC);
300  }
301  }
302 
303  emean_vs_eta_E_->Fill(eta_MC, Econe);
304  emean_vs_eta_H_->Fill(eta_MC, Hcone);
305  emean_vs_eta_EH_->Fill(eta_MC, Econe + Hcone);
306  emean_vs_eta_HF_->Fill(eta_MC, HFcone);
307  emean_vs_eta_HO_->Fill(eta_MC, HOcone);
308  emean_vs_eta_EHF_->Fill(eta_MC, Econe + Hcone + HFcone);
309  emean_vs_eta_EHFO_->Fill(eta_MC, Econe + Hcone + HFcone + HOcone);
310 }
311 
313  double eta,
314  double phi) {
315  if (not pfClusters.isValid())
316  return 0.;
317 
318  double sum = 0.;
319  for (auto pf = pfClusters->begin(); pf != pfClusters->end(); ++pf) {
320  if (reco::deltaR2(eta, phi, pf->eta(), pf->phi()) < partR2) {
321  sum += pf->energy();
322  }
323  }
324 
325  return sum;
326 }
327 
size
Write out results.
MonitorElement * ratio_Esummed_HCAL_4_
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:36
MonitorElement * emean_vs_eta_E_
edm::EDGetTokenT< reco::PFClusterCollection > pfClusterHCALTok_
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_
T getUntrackedParameter(std::string const &, T const &) const
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:399
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_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
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_
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
maxPt
Definition: PV_cfg.py:223
MonitorElement * ratio_Esummed_HCAL_1_
MonitorElement * ratio_Esummed_ECAL_HCAL_3_
bool isValid() const
Definition: HandleBase.h:70
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
MonitorElement * ratio_Esummed_HO_1_
MonitorElement * emean_vs_eta_HF_
Definition: event.py:1
Definition: Run.h:45
MonitorElement * emean_vs_eta_HO_
edm::EDGetTokenT< reco::PFClusterCollection > pfClusterECALTok_
MonitorElement * ratio_Esummed_ECAL_2_