CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SimHitsValidationHcal.cc
Go to the documentation of this file.
4 
5 //#define DebugLog
6 
8  g4Label_ = ps.getParameter<std::string>("ModuleLabel");
9  hcalHits_ = ps.getParameter<std::string>("HitCollection");
10  verbose_ = ps.getParameter<bool>("Verbose");
11  testNumber_ = ps.getParameter<bool>("TestNumber");
12 
13  tok_hits_ = consumes<edm::PCaloHitContainer>(edm::InputTag(g4Label_, hcalHits_));
14  tok_HRNDC_ = esConsumes<HcalDDDRecConstants, HcalRecNumberingRecord, edm::Transition::BeginRun>();
15 
16  edm::LogVerbatim("HitsValidationHcal") << "Module Label: " << g4Label_ << " Hits: " << hcalHits_
17  << " TestNumbering " << testNumber_;
18 }
19 
21 
23  const auto &pHRNDC = es.getData(tok_HRNDC_);
24  hcons = &pHRNDC;
29 
30  // Get Phi segmentation from geometry, use the max phi number so that all iphi
31  // values are included.
32 
33  int NphiMax = hcons->getNPhi(0);
34 
35  NphiMax = (hcons->getNPhi(1) > NphiMax ? hcons->getNPhi(1) : NphiMax);
36  NphiMax = (hcons->getNPhi(2) > NphiMax ? hcons->getNPhi(2) : NphiMax);
37  NphiMax = (hcons->getNPhi(3) > NphiMax ? hcons->getNPhi(3) : NphiMax);
38 
39  // Center the iphi bins on the integers
40  float iphi_min = 0.5;
41  float iphi_max = NphiMax + 0.5;
42  int iphi_bins = (int)(iphi_max - iphi_min);
43 
44  int iEtaHBMax = hcons->getEtaRange(0).second;
45  int iEtaHEMax = std::max(hcons->getEtaRange(1).second, 1);
46  int iEtaHFMax = hcons->getEtaRange(2).second;
47  int iEtaHOMax = hcons->getEtaRange(3).second;
48 
49  // Retain classic behavior, all plots have same ieta range.
50  // Comment out code to allow each subdetector to have its on range
51 
52  int iEtaMax = (iEtaHBMax > iEtaHEMax ? iEtaHBMax : iEtaHEMax);
53  iEtaMax = (iEtaMax > iEtaHFMax ? iEtaMax : iEtaHFMax);
54  iEtaMax = (iEtaMax > iEtaHOMax ? iEtaMax : iEtaHOMax);
55 
56  iEtaHBMax = iEtaMax;
57  iEtaHEMax = iEtaMax;
58  iEtaHFMax = iEtaMax;
59  iEtaHOMax = iEtaMax;
60 
61  // Give an empty bin around the subdet ieta range to make it clear that all
62  // ieta rings have been included float ieta_min_HB = -iEtaHBMax - 1.5; float
63  // ieta_max_HB = iEtaHBMax + 1.5; int ieta_bins_HB = (int) (ieta_max_HB -
64  // ieta_min_HB);
65 
66  // float ieta_min_HE = -iEtaHEMax - 1.5;
67  // float ieta_max_HE = iEtaHEMax + 1.5;
68  // int ieta_bins_HE = (int) (ieta_max_HE - ieta_min_HE);
69 
70  // float ieta_min_HF = -iEtaHFMax - 1.5;
71  // float ieta_max_HF = iEtaHFMax + 1.5;
72  // int ieta_bins_HF = (int) (ieta_max_HF - ieta_min_HF);
73 
74  // float ieta_min_HO = -iEtaHOMax - 1.5;
75  // float ieta_max_HO = iEtaHOMax + 1.5;
76  // int ieta_bins_HO = (int) (ieta_max_HO - ieta_min_HO);
77 
78 #ifdef DebugLog
79  edm::LogVerbatim("HitsValidationHcal") << " Maximum Depths HB:" << maxDepthHB_ << " HE:" << maxDepthHE_
80  << " HO:" << maxDepthHO_ << " HF:" << maxDepthHF_;
81 #endif
82  std::vector<std::pair<std::string, std::string>> divisions = getHistogramTypes();
83 
84  edm::LogVerbatim("HitsValidationHcal") << "Booking the Histograms";
85  ib.setCurrentFolder("HcalHitsV/SimHitsValidationHcal");
86 
87  // Histograms for Hits
88 
90  for (unsigned int i = 0; i < types.size(); ++i) {
92  name = "HcalHitEta" + divisions[i].first;
93  title = "Hit energy as a function of eta tower index in " + divisions[i].second;
94  meHcalHitEta_.push_back(ib.book1D(name, title, limit.bins, limit.low, limit.high));
95 
96  name = "HcalHitTimeAEta" + divisions[i].first;
97  title = "Hit time as a function of eta tower index in" + divisions[i].second;
98  meHcalHitTimeEta_.push_back(ib.book1D(name, title, limit.bins, limit.low, limit.high));
99 
100  name = "HcalHitE25" + divisions[i].first;
101  title = "Energy in time window 0 to 25 for a tower in " + divisions[i].second;
102  meHcalEnergyl25_.push_back(
103  ib.book2D(name, title, limit.bins, limit.low, limit.high, iphi_bins, iphi_min, iphi_max));
104 
105  name = "HcalHitE50" + divisions[i].first;
106  title = "Energy in time window 0 to 50 for a tower in " + divisions[i].second;
107  meHcalEnergyl50_.push_back(
108  ib.book2D(name, title, limit.bins, limit.low, limit.high, iphi_bins, iphi_min, iphi_max));
109 
110  name = "HcalHitE100" + divisions[i].first;
111  title = "Energy in time window 0 to 100 for a tower in " + divisions[i].second;
112  meHcalEnergyl100_.push_back(
113  ib.book2D(name, title, limit.bins, limit.low, limit.high, iphi_bins, iphi_min, iphi_max));
114 
115  name = "HcalHitE250" + divisions[i].first;
116  title = "Energy in time window 0 to 250 for a tower in " + divisions[i].second;
117  meHcalEnergyl250_.push_back(
118  ib.book2D(name, title, limit.bins, limit.low, limit.high, iphi_bins, iphi_min, iphi_max));
119  }
120 
121  name = "Energy_HB";
122  meEnergy_HB = ib.book1D(name, name, 100, 0, 1);
123  name = "Energy_HE";
124  meEnergy_HE = ib.book1D(name, name, 100, 0, 1);
125  name = "Energy_HO";
126  meEnergy_HO = ib.book1D(name, name, 100, 0, 1);
127  name = "Energy_HF";
128  meEnergy_HF = ib.book1D(name, name, 100, 0, 50);
129 
130  name = "Time_HB";
131  metime_HB = ib.book1D(name, name, 300, -150, 150);
132  name = "Time_HE";
133  metime_HE = ib.book1D(name, name, 300, -150, 150);
134  name = "Time_HO";
135  metime_HO = ib.book1D(name, name, 300, -150, 150);
136  name = "Time_HF";
137  metime_HF = ib.book1D(name, name, 300, -150, 150);
138 
139  name = "Time_Enweighted_HB";
140  metime_enweighted_HB = ib.book1D(name, name, 300, -150, 150);
141  name = "Time_Enweighted_HE";
142  metime_enweighted_HE = ib.book1D(name, name, 300, -150, 150);
143  name = "Time_Enweighted_HO";
144  metime_enweighted_HO = ib.book1D(name, name, 300, -150, 150);
145  name = "Time_Enweighted_HF";
146  metime_enweighted_HF = ib.book1D(name, name, 300, -150, 150);
147 }
148 
150 #ifdef DebugLog
151  edm::LogVerbatim("HitsValidationHcal") << "Run = " << e.id().run() << " Event = " << e.id().event();
152 #endif
153  std::vector<PCaloHit> caloHits;
155 
156  bool getHits = false;
157  e.getByToken(tok_hits_, hitsHcal);
158  if (hitsHcal.isValid())
159  getHits = true;
160 #ifdef DebugLog
161  edm::LogVerbatim("HitsValidationHcal") << "HitsValidationHcal.: Input flags Hits " << getHits;
162 #endif
163  if (getHits) {
164  caloHits.insert(caloHits.end(), hitsHcal->begin(), hitsHcal->end());
165 #ifdef DebugLog
166  edm::LogVerbatim("HitsValidationHcal") << "testNumber_:" << testNumber_;
167 #endif
168  if (testNumber_) {
169  for (unsigned int i = 0; i < caloHits.size(); ++i) {
170  unsigned int id_ = caloHits[i].id();
172  caloHits[i].setID(hid.rawId());
173 #ifdef DebugLog
174  edm::LogVerbatim("HitsValidationHcal") << "Hit[" << i << "] " << hid;
175 #endif
176  }
177  }
178 #ifdef DebugLog
179  edm::LogVerbatim("HitsValidationHcal") << "HitsValidationHcal: Hit buffer " << caloHits.size();
180 #endif
181  analyzeHits(caloHits);
182  }
183 }
184 
185 void SimHitsValidationHcal::analyzeHits(std::vector<PCaloHit> &hits) {
186  int nHit = hits.size();
187  double entotHB = 0, entotHE = 0, entotHF = 0, entotHO = 0;
188  double timetotHB = 0, timetotHE = 0, timetotHF = 0, timetotHO = 0;
189  int nHB = 0, nHE = 0, nHO = 0, nHF = 0;
190 
191  std::map<std::pair<HcalDetId, unsigned int>, energysum> map_try;
192  map_try.clear();
193  std::map<std::pair<HcalDetId, unsigned int>, energysum>::iterator itr;
194 
195  for (int i = 0; i < nHit; i++) {
196  double energy = hits[i].energy();
197  double time = hits[i].time();
198  HcalDetId id = HcalDetId(hits[i].id());
199  int itime = (int)(time);
200  int subdet = id.subdet();
201  int depth = id.depth();
202  int eta = id.ieta();
203  unsigned int dep = hits[i].depth();
204 
205  std::pair<int, int> types = histId(subdet, eta, depth, dep);
206  if (subdet == static_cast<int>(HcalBarrel)) {
207  entotHB += energy;
208  timetotHB += time;
209  nHB++;
210  } else if (subdet == static_cast<int>(HcalEndcap)) {
211  entotHE += energy;
212  timetotHE += time;
213  nHE++;
214  } else if (subdet == static_cast<int>(HcalOuter)) {
215  entotHO += energy;
216  timetotHO += time;
217  nHO++;
218  } else if (subdet == static_cast<int>(HcalForward)) {
219  entotHF += energy;
220  timetotHF += time;
221  nHF++;
222  }
223 
224  std::pair<HcalDetId, unsigned int> id0(id, dep);
225  energysum ensum;
226  if (map_try.count(id0) != 0)
227  ensum = map_try[id0];
228  if (itime < 250) {
229  ensum.e250 += energy;
230  if (itime < 100) {
231  ensum.e100 += energy;
232  if (itime < 50) {
233  ensum.e50 += energy;
234  if (itime < 25)
235  ensum.e25 += energy;
236  }
237  }
238  }
239  map_try[id0] = ensum;
240 
241 #ifdef DebugLog
242  edm::LogVerbatim("HitsValidationHcal")
243  << "Hit[" << i << "] ID " << std::dec << " " << id << std::dec << " Det " << id.det() << " Sub " << subdet
244  << " depth " << depth << " depthX " << dep << " Eta " << eta << " Phi " << id.iphi() << " E " << energy
245  << " time " << time << " type " << types.first << " " << types.second;
246 #endif
247 
248  double etax = eta - 0.5;
249  if (eta < 0)
250  etax += 1;
251  if (types.first >= 0) {
252  meHcalHitEta_[types.first]->Fill(etax, energy);
253  meHcalHitTimeEta_[types.first]->Fill(etax, time);
254  }
255  if (types.second >= 0) {
256  meHcalHitEta_[types.second]->Fill(etax, energy);
257  meHcalHitTimeEta_[types.second]->Fill(etax, time);
258  }
259  }
260 
261  meEnergy_HB->Fill(entotHB);
262  meEnergy_HE->Fill(entotHE);
263  meEnergy_HF->Fill(entotHF);
264  meEnergy_HO->Fill(entotHO);
265 
266  metime_HB->Fill(timetotHB);
267  metime_HE->Fill(timetotHE);
268  metime_HF->Fill(timetotHF);
269  metime_HO->Fill(timetotHO);
270 
271  metime_enweighted_HB->Fill(timetotHB, entotHB);
272  metime_enweighted_HE->Fill(timetotHE, entotHE);
273  metime_enweighted_HF->Fill(timetotHF, entotHF);
274  metime_enweighted_HO->Fill(timetotHO, entotHO);
275 
276  for (itr = map_try.begin(); itr != map_try.end(); ++itr) {
277  HcalDetId id = (*itr).first.first;
278  energysum ensum = (*itr).second;
279  std::pair<int, int> types = histId((int)(id.subdet()), id.ieta(), id.depth(), (*itr).first.second);
280  int eta = id.ieta();
281  int phi = id.iphi();
282  double etax = eta - 0.5;
283  double phix = phi - 0.5;
284  if (types.first >= 0) {
285  meHcalEnergyl25_[types.first]->Fill(etax, phix, ensum.e25);
286  meHcalEnergyl50_[types.first]->Fill(etax, phix, ensum.e50);
287  meHcalEnergyl100_[types.first]->Fill(etax, phix, ensum.e100);
288  meHcalEnergyl250_[types.first]->Fill(etax, phix, ensum.e250);
289  }
290  if (types.second >= 0) {
291  meHcalEnergyl25_[types.second]->Fill(etax, phix, ensum.e25);
292  meHcalEnergyl50_[types.second]->Fill(etax, phix, ensum.e50);
293  meHcalEnergyl100_[types.second]->Fill(etax, phix, ensum.e100);
294  meHcalEnergyl250_[types.second]->Fill(etax, phix, ensum.e250);
295  }
296 
297 #ifdef DebugLog
298  edm::LogVerbatim("HitsValidationHcal")
299  << " energy of tower =" << (*itr).first.first << " in time 25ns is == " << (*itr).second.e25
300  << " in time 25-50ns == " << (*itr).second.e50 << " in time 50-100ns == " << (*itr).second.e100
301  << " in time 100-250 ns == " << (*itr).second.e250;
302 #endif
303  }
304 }
305 
307  int bins;
308  std::pair<int, int> range;
309  double low, high;
310 
311  if (type.subdet == HcalBarrel) {
312  range = hcons->getEtaRange(0);
313  low = -range.second;
314  high = range.second;
315  bins = (high - low);
316  } else if (type.subdet == HcalEndcap) {
317  range = hcons->getEtaRange(1);
318  bins = range.second - range.first;
319  if (type.z == 1) {
320  low = range.first;
321  high = range.second;
322  } else {
323  low = -range.second;
324  high = -range.first;
325  }
326  } else if (type.subdet == HcalOuter) {
327  range = hcons->getEtaRange(3);
328  low = -range.second;
329  high = range.second;
330  bins = high - low;
331  } else if (type.subdet == HcalForward) {
332  range = hcons->getEtaRange(2);
333  bins = range.second - range.first;
334  if (type.z == 1) {
335  low = range.first;
336  high = range.second;
337  } else {
338  low = -range.second;
339  high = -range.first;
340  }
341  } else {
342  bins = 82;
343  low = -41;
344  high = 41;
345  }
346 #ifdef DebugLog
347  edm::LogVerbatim("HitsValidationHcal") << "Subdetector:" << type.subdet << " z:" << type.z
348  << " range.first:" << range.first << " and second:" << range.second;
349  edm::LogVerbatim("HitsValidationHcal") << "bins: " << bins << " low:" << low << " high:" << high;
350 #endif
351  return SimHitsValidationHcal::etaRange(bins, low, high);
352 }
353 
354 std::pair<int, int> SimHitsValidationHcal::histId(int subdet, int eta, int depth, unsigned int dep) {
355  int id1(-1), id2(-1);
356  for (unsigned int k = 0; k < types.size(); ++k) {
357  if (subdet == HcalForward) {
358  if (subdet == (int)(types[k].subdet) && depth == types[k].depth1 && eta * types[k].z > 0 &&
359  dep == (unsigned int)(types[k].depth2)) {
360  id1 = k;
361  break;
362  }
363  } else if (subdet == HcalEndcap) {
364  if (subdet == (int)(types[k].subdet) && depth == types[k].depth1 && eta * types[k].z > 0) {
365  id1 = k;
366  break;
367  }
368  } else {
369  if (subdet == (int)(types[k].subdet) && depth == types[k].depth1) {
370  id1 = k;
371  break;
372  }
373  }
374  }
375  if (subdet == HcalForward)
376  depth += 2 * dep;
377  for (unsigned int k = 0; k < types.size(); ++k) {
378  if (types[k].subdet == HcalEmpty && types[k].depth1 == depth) {
379  id2 = k;
380  break;
381  }
382  }
383  return std::pair<int, int>(id1, id2);
384 }
385 
386 std::vector<std::pair<std::string, std::string>> SimHitsValidationHcal::getHistogramTypes() {
388  maxDepth = std::max(maxDepth, maxDepthHF_);
389  maxDepth = std::max(maxDepth, maxDepthHO_);
390 
391  std::vector<std::pair<std::string, std::string>> divisions;
392  // divisions and types need to be in sync
393  types.clear();
394  std::pair<std::string, std::string> names;
395  char name1[40], name2[40];
397  // first overall Hcal
398  for (int depth = 0; depth < maxDepth; ++depth) {
399  snprintf(name1, 40, "HC%d", depth);
400  snprintf(name2, 40, "HCAL depth%d", depth + 1);
401  names = std::pair<std::string, std::string>(std::string(name1), std::string(name2));
402  type = SimHitsValidationHcal::idType(HcalEmpty, 0, depth + 1, depth + 1);
403  divisions.push_back(names);
404  types.push_back(type);
405  }
406  // HB
407  for (int depth = 0; depth < maxDepthHB_; ++depth) {
408  snprintf(name1, 40, "HB%d", depth);
409  snprintf(name2, 40, "HB depth%d", depth + 1);
410  names = std::pair<std::string, std::string>(std::string(name1), std::string(name2));
412  divisions.push_back(names);
413  types.push_back(type);
414  }
415  // HE
416  for (int depth = 0; depth < maxDepthHE_; ++depth) {
417  snprintf(name1, 40, "HE%d+z", depth);
418  snprintf(name2, 40, "HE +z depth%d", depth + 1);
419  names = std::pair<std::string, std::string>(std::string(name1), std::string(name2));
421  divisions.push_back(names);
422  types.push_back(type);
423  snprintf(name1, 40, "HE%d-z", depth);
424  snprintf(name2, 40, "HE -z depth%d", depth + 1);
425  names = std::pair<std::string, std::string>(std::string(name1), std::string(name2));
426  type = SimHitsValidationHcal::idType(HcalEndcap, -1, depth + 1, depth + 1);
427  divisions.push_back(names);
428  types.push_back(type);
429  }
430  // HO
431  {
432  int depth = maxDepthHO_;
433  snprintf(name1, 40, "HO%d", depth);
434  snprintf(name2, 40, "HO depth%d", depth);
435  names = std::pair<std::string, std::string>(std::string(name1), std::string(name2));
436  type = SimHitsValidationHcal::idType(HcalOuter, 0, depth, depth);
437  divisions.push_back(names);
438  types.push_back(type);
439  }
440  // HF (first absorber, then different types of abnormal hits)
441  std::string hfty1[4] = {"A", "W", "B", "J"};
442  std::string hfty2[4] = {"Absorber", "Window", "Bundle", "Jungle"};
443  int dept0[4] = {0, 1, 2, 3};
444  for (int k = 0; k < 4; ++k) {
445  for (int depth = 0; depth < maxDepthHF_; ++depth) {
446  snprintf(name1, 40, "HF%s%d+z", hfty1[k].c_str(), depth);
447  snprintf(name2, 40, "HF (%s) +z depth%d", hfty2[k].c_str(), depth + 1);
448  names = std::pair<std::string, std::string>(std::string(name1), std::string(name2));
449  type = SimHitsValidationHcal::idType(HcalForward, 1, depth + 1, dept0[k]);
450  divisions.push_back(names);
451  types.push_back(type);
452  snprintf(name1, 40, "HF%s%d-z", hfty1[k].c_str(), depth);
453  snprintf(name2, 40, "HF (%s) -z depth%d", hfty2[k].c_str(), depth + 1);
454  names = std::pair<std::string, std::string>(std::string(name1), std::string(name2));
455  type = SimHitsValidationHcal::idType(HcalForward, -1, depth + 1, dept0[k]);
456  divisions.push_back(names);
457  types.push_back(type);
458  }
459  }
460 
461  return divisions;
462 }
463 
466  desc.add<std::string>("ModuleLabel", "g4SimHits");
467  desc.add<std::string>("HitCollection", "HcalHits");
468  desc.add<bool>("Verbose", false);
469  desc.add<bool>("TestNumber", false);
470 
471  descriptions.addDefault(desc);
472 }
473 
RunNumber_t run() const
Definition: EventID.h:38
SimHitsValidationHcal(const edm::ParameterSet &ps)
Log< level::Info, true > LogVerbatim
MonitorElement * meEnergy_HF
EventNumber_t event() const
Definition: EventID.h:40
const HcalDDDRecConstants * hcons
int ib
Definition: cuy.py:661
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
MonitorElement * metime_enweighted_HO
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
void analyze(const edm::Event &e, const edm::EventSetup &c) override
const std::string names[nVars_]
const uint16_t range(const Frame &aFrame)
MonitorElement * metime_enweighted_HB
void Fill(long long x)
std::vector< MonitorElement * > meHcalEnergyl25_
bool getData(T &iHolder) const
Definition: EventSetup.h:128
MonitorElement * meEnergy_HB
void addDefault(ParameterSetDescription const &psetDescription)
std::vector< MonitorElement * > meHcalEnergyl100_
MonitorElement * metime_enweighted_HF
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:70
MonitorElement * metime_enweighted_HE
std::vector< MonitorElement * > meHcalEnergyl250_
std::vector< MonitorElement * > meHcalHitEta_
int getMaxDepth(const int &type) const
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:177
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
MonitorElement * meEnergy_HE
std::vector< MonitorElement * > meHcalEnergyl50_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::ESGetToken< HcalDDDRecConstants, HcalRecNumberingRecord > tok_HRNDC_
edm::EventID id() const
Definition: EventBase.h:59
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
std::vector< MonitorElement * > meHcalHitTimeEta_
std::pair< int, int > histId(int subdet, int eta, int depth, unsigned int dep)
DetId relabel(const uint32_t testId) const
std::pair< int, int > getEtaRange(const int &i) const
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
MonitorElement * meEnergy_HO
edm::EDGetTokenT< edm::PCaloHitContainer > tok_hits_
Definition: Run.h:45
int getNPhi(const int &type) const
std::vector< std::pair< std::string, std::string > > getHistogramTypes()
void analyzeHits(std::vector< PCaloHit > &)