CMS 3D CMS Logo

HGCalTriggerGeometryHexLayerBasedImp1.cc
Go to the documentation of this file.
2 
7 
8 #include <vector>
9 #include <iostream>
10 #include <fstream>
11 #include <regex>
12 
14 public:
16 
17  void initialize(const CaloGeometry*) final;
18  void initialize(const HGCalGeometry*, const HGCalGeometry*, const HGCalGeometry*) final;
19  void reset() final;
20 
21  unsigned getTriggerCellFromCell(const unsigned) const final;
22  unsigned getModuleFromCell(const unsigned) const final;
23  unsigned getModuleFromTriggerCell(const unsigned) const final;
24 
25  geom_set getCellsFromTriggerCell(const unsigned) const final;
26  geom_set getCellsFromModule(const unsigned) const final;
27  geom_set getTriggerCellsFromModule(const unsigned) const final;
28 
29  geom_ordered_set getOrderedCellsFromModule(const unsigned) const final;
30  geom_ordered_set getOrderedTriggerCellsFromModule(const unsigned) const final;
31 
32  geom_set getNeighborsFromTriggerCell(const unsigned) const final;
33 
34  unsigned getLinksInModule(const unsigned module_id) const final;
35  unsigned getModuleSize(const unsigned module_id) const final;
36 
37  GlobalPoint getTriggerCellPosition(const unsigned) const final;
38  GlobalPoint getModulePosition(const unsigned) const final;
39 
40  bool validTriggerCell(const unsigned) const final;
41  bool disconnectedModule(const unsigned) const final;
42  unsigned lastTriggerLayer() const final { return last_trigger_layer_; }
43  unsigned triggerLayer(const unsigned) const final;
44 
45 private:
51 
52  // module related maps
53  std::unordered_map<unsigned, unsigned> wafer_to_module_;
54  std::unordered_multimap<unsigned, unsigned> module_to_wafers_;
55 
56  // trigger cell related maps
57  std::unordered_map<unsigned, unsigned> cells_to_trigger_cells_;
58  std::unordered_multimap<unsigned, unsigned> trigger_cells_to_cells_;
59  std::unordered_map<unsigned, unsigned> cells_to_trigger_cells_bh_;
60  std::unordered_multimap<unsigned, unsigned> trigger_cells_to_cells_bh_;
61  std::unordered_map<unsigned, unsigned short> number_trigger_cells_in_wafers_;
62  std::unordered_map<unsigned, unsigned short> number_trigger_cells_in_wafers_bh_;
63  std::unordered_set<unsigned> invalid_triggercells_;
64 
65  // neighbor related maps
66  // trigger cell neighbors:
67  // - The key includes the module and trigger cell id
68  // - The value is a set of (module_id, trigger_cell_id)
69  std::unordered_map<int, std::set<std::pair<short, short>>> trigger_cell_neighbors_;
70  std::unordered_map<int, std::set<std::pair<short, short>>> trigger_cell_neighbors_bh_;
71 
72  // Disconnected modules and layers
73  std::unordered_set<unsigned> disconnected_modules_;
74  std::unordered_set<unsigned> disconnected_layers_;
75  std::vector<unsigned> trigger_layers_;
76  unsigned last_trigger_layer_ = 0;
77 
78  // layer offsets
79  unsigned fhOffset_ = 0;
80  unsigned bhOffset_ = 0;
81  unsigned totalLayers_ = 0;
82 
83  void fillMaps();
84  void fillNeighborMaps(const edm::FileInPath&, std::unordered_map<int, std::set<std::pair<short, short>>>&);
86  unsigned packTriggerCell(unsigned, unsigned) const;
87  bool validCellId(unsigned subdet, unsigned cell_id) const;
88  bool validTriggerCellFromCells(const unsigned) const;
89 
90  // returns transverse wafer type: -1=coarse, 1=fine, 0=undefined
91  int detIdWaferType(unsigned subdet, short wafer) const;
92  unsigned packWaferCellId(unsigned subdet, unsigned wafer, unsigned cell) const;
93  unsigned packIetaIphi(unsigned ieta, unsigned iphi) const;
94  void unpackWaferCellId(unsigned wafer_cell, unsigned& wafer, unsigned& cell) const;
95  void unpackIetaIphi(unsigned ieta_iphi, unsigned& ieta, unsigned& iphi) const;
96 
97  unsigned layerWithOffset(unsigned) const;
98 };
99 
101  : HGCalTriggerGeometryBase(conf),
102  l1tCellsMapping_(conf.getParameter<edm::FileInPath>("L1TCellsMapping")),
103  l1tCellsBHMapping_(conf.getParameter<edm::FileInPath>("L1TCellsBHMapping")),
104  l1tModulesMapping_(conf.getParameter<edm::FileInPath>("L1TModulesMapping")),
105  l1tCellNeighborsMapping_(conf.getParameter<edm::FileInPath>("L1TCellNeighborsMapping")),
106  l1tCellNeighborsBHMapping_(conf.getParameter<edm::FileInPath>("L1TCellNeighborsBHMapping")) {
107  std::vector<unsigned> tmp_vector = conf.getParameter<std::vector<unsigned>>("DisconnectedModules");
108  std::move(tmp_vector.begin(), tmp_vector.end(), std::inserter(disconnected_modules_, disconnected_modules_.end()));
109  tmp_vector = conf.getParameter<std::vector<unsigned>>("DisconnectedLayers");
110  std::move(tmp_vector.begin(), tmp_vector.end(), std::inserter(disconnected_layers_, disconnected_layers_.end()));
111 }
112 
114  cells_to_trigger_cells_.clear();
115  trigger_cells_to_cells_.clear();
118  wafer_to_module_.clear();
119  module_to_wafers_.clear();
122  trigger_cell_neighbors_.clear();
124 }
125 
127  setCaloGeometry(calo_geometry);
131  trigger_layers_.resize(totalLayers_ + 1);
132  trigger_layers_[0] = 0; // layer number 0 doesn't exist
133  unsigned trigger_layer = 1;
134  for (unsigned layer = 1; layer < trigger_layers_.size(); layer++) {
135  if (disconnected_layers_.find(layer) == disconnected_layers_.end()) {
136  // Increase trigger layer number if the layer is not disconnected
137  trigger_layers_[layer] = trigger_layer;
138  trigger_layer++;
139  } else {
140  trigger_layers_[layer] = 0;
141  }
142  }
143  last_trigger_layer_ = trigger_layer - 1;
144  fillMaps();
148 }
149 
151  const HGCalGeometry* hgc_hsi_geometry,
152  const HGCalGeometry* hgc_hsc_geometry) {
153  throw cms::Exception("BadGeometry")
154  << "HGCalTriggerGeometryHexLayerBasedImp1 geometry cannot be initialized with the V9 HGCAL geometry";
155 }
156 
158  unsigned subdet = 0;
159  int zside = 0;
160  unsigned layer = 0;
161  unsigned wafer_trigger_cell = 0;
162  unsigned trigger_cell = 0;
163  // BH
164  if (DetId(cell_id).det() == DetId::Hcal) {
165  HcalDetId cell_det_id(cell_id);
166  if (cell_det_id.subdetId() != HcalEndcap)
167  return 0;
168  unsigned ieta = cell_det_id.ietaAbs();
169  unsigned iphi = cell_det_id.iphi();
170  layer = cell_det_id.depth();
172  zside = cell_det_id.zside();
173  auto trigger_cell_itr = cells_to_trigger_cells_bh_.find(packIetaIphi(ieta, iphi));
174  if (trigger_cell_itr == cells_to_trigger_cells_bh_.end()) {
175  throw cms::Exception("BadGeometry")
176  << "HGCalTriggerGeometry: Hcal cell ieta=" << ieta << ", iphi=" << iphi
177  << " is not mapped to any trigger cell. The trigger cell mapping should be modified.\n";
178  }
179  trigger_cell = 0;
180  wafer_trigger_cell = 0;
181  unpackWaferCellId(trigger_cell_itr->second, wafer_trigger_cell, trigger_cell);
182  }
183  // EE or FH
184  else if (DetId(cell_id).det() == DetId::Forward) {
185  HGCalDetId cell_det_id(cell_id);
186  subdet = cell_det_id.subdetId();
187  layer = cell_det_id.layer();
188  zside = cell_det_id.zside();
189  unsigned wafer = cell_det_id.wafer();
190  unsigned cell = cell_det_id.cell();
191  auto trigger_cell_itr = cells_to_trigger_cells_.find(packWaferCellId(subdet, wafer, cell));
192  if (trigger_cell_itr == cells_to_trigger_cells_.end()) {
193  throw cms::Exception("BadGeometry")
194  << "HGCalTriggerGeometry: HGCal cell " << cell << " in wafer " << wafer
195  << " is not mapped to any trigger cell. The trigger cell mapping should be modified.\n";
196  }
197  trigger_cell = 0;
198  wafer_trigger_cell = 0;
199  unpackWaferCellId(trigger_cell_itr->second, wafer_trigger_cell, trigger_cell);
200  }
201  return HGCalDetId((ForwardSubdetector)subdet, zside, layer, 1, wafer_trigger_cell, trigger_cell).rawId();
202 }
203 
204 unsigned HGCalTriggerGeometryHexLayerBasedImp1::getModuleFromCell(const unsigned cell_id) const {
206 }
207 
208 unsigned HGCalTriggerGeometryHexLayerBasedImp1::getModuleFromTriggerCell(const unsigned trigger_cell_id) const {
209  HGCalDetId trigger_cell_det_id(trigger_cell_id);
210  unsigned module = 0;
211  // BH
212  if (trigger_cell_det_id.subdetId() == ForwardSubdetector::HGCHEB) {
213  // For BH, the module ID is currently encoded as the wafer in HGCalDetId
214  module = trigger_cell_det_id.wafer();
215  }
216  // EE or FH
217  else {
218  auto module_itr = wafer_to_module_.find(trigger_cell_det_id.wafer());
219  if (module_itr == wafer_to_module_.end()) {
220  throw cms::Exception("BadGeometry")
221  << trigger_cell_det_id << "HGCalTriggerGeometry: Wafer " << trigger_cell_det_id.wafer()
222  << " is not mapped to any trigger module. The module mapping should be modified. See "
223  "https://twiki.cern.ch/twiki/bin/viewauth/CMS/HGCALTriggerPrimitivesSimulation#Trigger_geometry for "
224  "details.\n";
225  }
226  module = module_itr->second;
227  }
228  return HGCalDetId((ForwardSubdetector)trigger_cell_det_id.subdetId(),
229  trigger_cell_det_id.zside(),
230  trigger_cell_det_id.layer(),
231  (trigger_cell_det_id.waferType() == 1 ? 1 : 0),
232  module,
234  .rawId();
235 }
236 
238  const unsigned trigger_cell_id) const {
239  HGCalDetId trigger_cell_det_id(trigger_cell_id);
240  geom_set cell_det_ids;
241  // BH
242  if (trigger_cell_det_id.subdetId() == ForwardSubdetector::HGCHEB) {
243  unsigned subdet = trigger_cell_det_id.subdetId();
244  unsigned trigger_wafer = trigger_cell_det_id.wafer();
245  unsigned trigger_cell = trigger_cell_det_id.cell();
246  const auto& cell_range =
247  trigger_cells_to_cells_bh_.equal_range(packWaferCellId(subdet, trigger_wafer, trigger_cell));
248  for (auto tc_c_itr = cell_range.first; tc_c_itr != cell_range.second; tc_c_itr++) {
249  unsigned ieta = 0;
250  unsigned iphi = 0;
251  unpackIetaIphi(tc_c_itr->second, ieta, iphi);
252  unsigned cell_det_id =
253  HcalDetId(HcalEndcap, trigger_cell_det_id.zside() * ieta, iphi, trigger_cell_det_id.layer()).rawId();
254  if (validCellId(subdet, cell_det_id))
255  cell_det_ids.emplace(cell_det_id);
256  }
257  }
258  // EE or FH
259  else {
260  unsigned subdet = trigger_cell_det_id.subdetId();
261  unsigned trigger_wafer = trigger_cell_det_id.wafer();
262  unsigned trigger_cell = trigger_cell_det_id.cell();
263  const auto& cell_range = trigger_cells_to_cells_.equal_range(packWaferCellId(subdet, trigger_wafer, trigger_cell));
264  for (auto tc_c_itr = cell_range.first; tc_c_itr != cell_range.second; tc_c_itr++) {
265  unsigned wafer = 0;
266  unsigned cell = 0;
267  unpackWaferCellId(tc_c_itr->second, wafer, cell);
268  unsigned wafer_type = (detIdWaferType(subdet, wafer) == 1 ? 1 : 0);
269  unsigned cell_det_id = HGCalDetId((ForwardSubdetector)trigger_cell_det_id.subdetId(),
270  trigger_cell_det_id.zside(),
271  trigger_cell_det_id.layer(),
272  wafer_type,
273  wafer,
274  cell)
275  .rawId();
276  if (validCellId(subdet, cell_det_id))
277  cell_det_ids.emplace(cell_det_id);
278  }
279  }
280  return cell_det_ids;
281 }
282 
284  const unsigned module_id) const {
285  geom_set cell_det_ids;
286  geom_set trigger_cells = getTriggerCellsFromModule(module_id);
287  for (auto trigger_cell_id : trigger_cells) {
288  geom_set cells = getCellsFromTriggerCell(trigger_cell_id);
289  cell_det_ids.insert(cells.begin(), cells.end());
290  }
291  return cell_det_ids;
292 }
293 
295  const unsigned module_id) const {
296  geom_ordered_set cell_det_ids;
297  geom_ordered_set trigger_cells = getOrderedTriggerCellsFromModule(module_id);
298  for (auto trigger_cell_id : trigger_cells) {
299  geom_set cells = getCellsFromTriggerCell(trigger_cell_id);
300  cell_det_ids.insert(cells.begin(), cells.end());
301  }
302  return cell_det_ids;
303 }
304 
306  const unsigned module_id) const {
307  HGCalDetId module_det_id(module_id);
308  geom_set trigger_cell_det_ids;
309  // BH
310  if (module_det_id.subdetId() == ForwardSubdetector::HGCHEB) {
311  unsigned module = module_det_id.wafer();
312  // loop on the trigger cells in each module
313  for (int trigger_cell = 0; trigger_cell < number_trigger_cells_in_wafers_bh_.at(module); trigger_cell++) {
314  HGCalDetId trigger_cell_id((ForwardSubdetector)module_det_id.subdetId(),
315  module_det_id.zside(),
316  module_det_id.layer(),
317  1,
318  module,
319  trigger_cell);
320  if (validTriggerCell(trigger_cell_id))
321  trigger_cell_det_ids.emplace(trigger_cell_id.rawId());
322  }
323  }
324  // EE or FH
325  else {
326  unsigned module = module_det_id.wafer();
327  auto wafer_itrs = module_to_wafers_.equal_range(module);
328  // loop on the wafers included in the module
329  for (auto wafer_itr = wafer_itrs.first; wafer_itr != wafer_itrs.second; wafer_itr++) {
330  unsigned wafer = wafer_itr->second;
331  // loop on the trigger cells in each wafer
332  for (int trigger_cell = 0; trigger_cell < number_trigger_cells_in_wafers_.at(wafer); trigger_cell++) {
333  HGCalDetId trigger_cell_id((ForwardSubdetector)module_det_id.subdetId(),
334  module_det_id.zside(),
335  module_det_id.layer(),
336  1,
337  wafer,
338  trigger_cell);
339  if (validTriggerCell(trigger_cell_id))
340  trigger_cell_det_ids.emplace(trigger_cell_id.rawId());
341  }
342  }
343  }
344  return trigger_cell_det_ids;
345 }
346 
348  const unsigned module_id) const {
349  HGCalDetId module_det_id(module_id);
350  geom_ordered_set trigger_cell_det_ids;
351  // BH
352  if (module_det_id.subdetId() == ForwardSubdetector::HGCHEB) {
353  unsigned module = module_det_id.wafer();
354  // loop on the trigger cells in each module
355  for (int trigger_cell = 0; trigger_cell < number_trigger_cells_in_wafers_bh_.at(module); trigger_cell++) {
356  HGCalDetId trigger_cell_id((ForwardSubdetector)module_det_id.subdetId(),
357  module_det_id.zside(),
358  module_det_id.layer(),
359  1,
360  module,
361  trigger_cell);
362  if (validTriggerCell(trigger_cell_id))
363  trigger_cell_det_ids.emplace(trigger_cell_id.rawId());
364  }
365  }
366  // EE or FH
367  else {
368  unsigned module = module_det_id.wafer();
369  auto wafer_itrs = module_to_wafers_.equal_range(module);
370  // loop on the wafers included in the module
371  for (auto wafer_itr = wafer_itrs.first; wafer_itr != wafer_itrs.second; wafer_itr++) {
372  unsigned wafer = wafer_itr->second;
373  // loop on the trigger cells in each wafer
374  for (int trigger_cell = 0; trigger_cell < number_trigger_cells_in_wafers_.at(wafer); trigger_cell++) {
375  HGCalDetId trigger_cell_id((ForwardSubdetector)module_det_id.subdetId(),
376  module_det_id.zside(),
377  module_det_id.layer(),
378  1,
379  wafer,
380  trigger_cell);
381  if (validTriggerCell(trigger_cell_id))
382  trigger_cell_det_ids.emplace(trigger_cell_id.rawId());
383  }
384  }
385  }
386  return trigger_cell_det_ids;
387 }
388 
390  const unsigned trigger_cell_id) const {
391  HGCalDetId trigger_cell_det_id(trigger_cell_id);
392  // Choose scintillator or silicon map
393  const auto& neighbors_map = (trigger_cell_det_id.subdetId() == ForwardSubdetector::HGCHEB ? trigger_cell_neighbors_bh_
395  unsigned module = trigger_cell_det_id.wafer();
396  unsigned trigger_cell = trigger_cell_det_id.cell();
397  // retrieve neighbors
398  unsigned trigger_cell_key = packTriggerCell(module, trigger_cell);
399  geom_set neighbor_detids;
400  auto neighbors_itr = neighbors_map.find(trigger_cell_key);
401  if (neighbors_itr == neighbors_map.end()) {
402  throw cms::Exception("BadGeometry") << "HGCalTriggerGeometry: Neighbors are not defined for trigger cell "
403  << trigger_cell << " in module " << module
404  << ". The trigger cell neighbor mapping should be modified. \n";
405  }
406  const auto& neighbors = neighbors_itr->second;
407  // create HGCalDetId of neighbors and check their validity
408  neighbor_detids.reserve(neighbors.size());
409  for (const auto& module_tc : neighbors) {
410  HGCalDetId neighbor_det_id((ForwardSubdetector)trigger_cell_det_id.subdetId(),
411  trigger_cell_det_id.zside(),
412  trigger_cell_det_id.layer(),
413  1,
414  module_tc.first,
415  module_tc.second);
416  if (validTriggerCell(neighbor_det_id.rawId())) {
417  neighbor_detids.emplace(neighbor_det_id.rawId());
418  }
419  }
420  return neighbor_detids;
421 }
422 
423 unsigned HGCalTriggerGeometryHexLayerBasedImp1::getLinksInModule(const unsigned module_id) const { return 1; }
424 
425 unsigned HGCalTriggerGeometryHexLayerBasedImp1::getModuleSize(const unsigned module_id) const { return 1; }
426 
428  unsigned subdet = HGCalDetId(trigger_cell_det_id).subdetId();
429  // Position: barycenter of the trigger cell.
430  Basic3DVector<float> triggerCellVector(0., 0., 0.);
431  const auto cell_ids = getCellsFromTriggerCell(trigger_cell_det_id);
432  // BH
433  if (subdet == ForwardSubdetector::HGCHEB) {
434  for (const auto& cell : cell_ids) {
435  HcalDetId cellDetId(cell);
436  triggerCellVector += bhGeometry()->getPosition(cellDetId).basicVector();
437  }
438  }
439  // EE or FH
440  else {
441  for (const auto& cell : cell_ids) {
442  HGCalDetId cellDetId(cell);
443  triggerCellVector += (cellDetId.subdetId() == ForwardSubdetector::HGCEE ? eeGeometry()->getPosition(cellDetId)
444  : fhGeometry()->getPosition(cellDetId))
445  .basicVector();
446  }
447  }
448  return GlobalPoint(triggerCellVector / cell_ids.size());
449 }
450 
452  unsigned subdet = HGCalDetId(module_det_id).subdetId();
453  // Position: barycenter of the module.
454  Basic3DVector<float> moduleVector(0., 0., 0.);
455  const auto cell_ids = getCellsFromModule(module_det_id);
456  // BH
457  if (subdet == ForwardSubdetector::HGCHEB) {
458  for (const auto& cell : cell_ids) {
459  HcalDetId cellDetId(cell);
460  moduleVector += bhGeometry()->getPosition(cellDetId).basicVector();
461  }
462  }
463  // EE or FH
464  else {
465  for (const auto& cell : cell_ids) {
466  HGCalDetId cellDetId(cell);
467  moduleVector += (cellDetId.subdetId() == ForwardSubdetector::HGCEE ? eeGeometry()->getPosition(cellDetId)
468  : fhGeometry()->getPosition(cellDetId))
469  .basicVector();
470  }
471  }
472  return GlobalPoint(moduleVector / cell_ids.size());
473 }
474 
476  //
477  // read module mapping file
478  std::ifstream l1tModulesMappingStream(l1tModulesMapping_.fullPath());
479  if (!l1tModulesMappingStream.is_open()) {
480  throw cms::Exception("MissingDataFile") << "Cannot open HGCalTriggerGeometry L1TModulesMapping file\n";
481  }
482  short trigger_wafer = 0;
483  short module = 0;
484  for (; l1tModulesMappingStream >> trigger_wafer >> module;) {
485  wafer_to_module_.emplace(trigger_wafer, module);
486  module_to_wafers_.emplace(module, trigger_wafer);
487  // Default number of trigger cell in wafer is 0
488  number_trigger_cells_in_wafers_.emplace(trigger_wafer, 0);
489  }
490  if (!l1tModulesMappingStream.eof())
491  edm::LogWarning("HGCalTriggerGeometry")
492  << "Error reading L1TModulesMapping '" << trigger_wafer << " " << module << "' \n";
493  l1tModulesMappingStream.close();
494  // read trigger cell mapping file
495  std::ifstream l1tCellsMappingStream(l1tCellsMapping_.fullPath());
496  if (!l1tCellsMappingStream.is_open()) {
497  throw cms::Exception("MissingDataFile") << "Cannot open HGCalTriggerGeometry L1TCellsMapping file\n";
498  }
499  short subdet = 0;
500  short wafer = 0;
501  short cell = 0;
502  trigger_wafer = 0;
503  short trigger_cell = 0;
504  for (; l1tCellsMappingStream >> subdet >> wafer >> cell >> trigger_wafer >> trigger_cell;) {
505  unsigned cell_key = packWaferCellId(subdet, wafer, cell);
506  unsigned trigger_cell_key = packWaferCellId(subdet, trigger_wafer, trigger_cell);
507  // fill cell <-> trigger cell mappings
508  cells_to_trigger_cells_.emplace(cell_key, trigger_cell_key);
509  trigger_cells_to_cells_.emplace(trigger_cell_key, cell_key);
510  // fill number of trigger cells in wafers
511  auto itr_insert = number_trigger_cells_in_wafers_.emplace(trigger_wafer, 0);
512  if (trigger_cell + 1 > itr_insert.first->second)
513  itr_insert.first->second = trigger_cell + 1;
514  }
515  if (!l1tCellsMappingStream.eof())
516  edm::LogWarning("HGCalTriggerGeometry") << "Error reading L1TCellsMapping '" << subdet << " " << wafer << " "
517  << cell << " " << trigger_wafer << " " << trigger_cell << "' \n";
518  l1tCellsMappingStream.close();
519  // read BH trigger cell mapping file
520  std::ifstream l1tCellsBHMappingStream(l1tCellsBHMapping_.fullPath());
521  if (!l1tCellsBHMappingStream.is_open()) {
522  throw cms::Exception("MissingDataFile") << "Cannot open HGCalTriggerGeometry L1TCellsBHMapping file\n";
523  }
524  short ieta = 0;
525  short iphi = 0;
526  trigger_wafer = 0;
527  trigger_cell = 0;
528  for (; l1tCellsBHMappingStream >> ieta >> iphi >> trigger_wafer >> trigger_cell;) {
529  unsigned cell_key = packIetaIphi(ieta, iphi);
530  unsigned trigger_cell_key = packWaferCellId(ForwardSubdetector::HGCHEB, trigger_wafer, trigger_cell);
531  // fill cell <-> trigger cell mappings
532  cells_to_trigger_cells_bh_.emplace(cell_key, trigger_cell_key);
533  trigger_cells_to_cells_bh_.emplace(trigger_cell_key, cell_key);
534  // fill number of trigger cells in wafers
535  auto itr_insert = number_trigger_cells_in_wafers_bh_.emplace(trigger_wafer, 0);
536  if (trigger_cell + 1 > itr_insert.first->second)
537  itr_insert.first->second = trigger_cell + 1;
538  }
539  if (!l1tCellsBHMappingStream.eof())
540  edm::LogWarning("HGCalTriggerGeometry") << "Error reading L1TCellsBHMapping '" << ieta << " " << iphi << " "
541  << trigger_wafer << " " << trigger_cell << "' \n";
542  l1tCellsBHMappingStream.close();
543 }
544 
546  const edm::FileInPath& file, std::unordered_map<int, std::set<std::pair<short, short>>>& neighbors_map) {
547  // Fill trigger neighbor map
548  std::ifstream l1tCellNeighborsMappingStream(file.fullPath());
549  if (!l1tCellNeighborsMappingStream.is_open()) {
550  throw cms::Exception("MissingDataFile") << "Cannot open HGCalTriggerGeometry L1TCellNeighborsMapping file\n";
551  }
552  for (std::array<char, 512> buffer; l1tCellNeighborsMappingStream.getline(&buffer[0], 512);) {
553  std::string line(&buffer[0]);
554  // Extract keys consisting of the module id
555  // and of the trigger cell id
556  // Match patterns (X,Y)
557  // where X is a number with less than 4 digis
558  // and Y is a number with less than 4 digits
559  std::regex key_regex("\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)");
560  std::vector<std::string> key_tokens{std::sregex_token_iterator(line.begin(), line.end(), key_regex), {}};
561  if (key_tokens.empty()) {
562  throw cms::Exception("BadGeometry") << "Syntax error in the L1TCellNeighborsMapping:\n"
563  << " Cannot find the trigger cell key in line:\n"
564  << " '" << &buffer[0] << "'\n";
565  }
566  std::regex digits_regex("\\d{1,3}");
567  std::vector<std::string> module_tc{
568  std::sregex_token_iterator(key_tokens[0].begin(), key_tokens[0].end(), digits_regex), {}};
569  // get module and cell id
570  int module = std::stoi(module_tc[0]);
571  int trigger_cell = std::stoi(module_tc[1]);
572  unsigned map_key = packTriggerCell(module, trigger_cell);
573  // Extract neighbors
574  // Match patterns (X,Y)
575  // where X is a number with less than 4 digits
576  // and Y is a number with less than 4 digits
577  std::regex neighbors_regex("\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)");
578  std::vector<std::string> neighbors_tokens{std::sregex_token_iterator(line.begin(), line.end(), neighbors_regex),
579  {}};
580  if (neighbors_tokens.size() < 2) {
581  throw cms::Exception("BadGeometry") << "Syntax error in the L1TCellNeighborsMapping:\n"
582  << " Cannot find any neighbor in line:\n"
583  << " '" << &buffer[0] << "'\n";
584  }
585  auto itr_insert = neighbors_map.emplace(map_key, std::set<std::pair<short, short>>());
586  // The first element is the key, so start at index 1
587  for (unsigned i = 1; i < neighbors_tokens.size(); i++) {
588  const auto& neighbor = neighbors_tokens[i];
589  std::vector<std::string> pair_neighbor{std::sregex_token_iterator(neighbor.begin(), neighbor.end(), digits_regex),
590  {}};
591  short neighbor_module(std::stoi(pair_neighbor[0]));
592  short neighbor_cell(std::stoi(pair_neighbor[1]));
593  itr_insert.first->second.emplace(neighbor_module, neighbor_cell);
594  }
595  }
596  if (!l1tCellNeighborsMappingStream.eof())
597  edm::LogWarning("HGCalTriggerGeometry") << "Error reading L1TCellNeighborsMapping'\n";
598  l1tCellNeighborsMappingStream.close();
599 }
600 
602  unsigned n_layers_ee = eeTopology().dddConstants().layers(true);
603  for (unsigned layer = 1; layer <= n_layers_ee; layer++) {
604  for (const auto& wafer_module : wafer_to_module_) {
605  unsigned wafer = wafer_module.first;
606  // loop on the trigger cells in each wafer
607  for (int trigger_cell = 0; trigger_cell < number_trigger_cells_in_wafers_.at(wafer); trigger_cell++) {
608  std::set<unsigned> trigger_cell_ids;
609  trigger_cell_ids.emplace(HGCalDetId(ForwardSubdetector::HGCEE, -1, layer, 1, wafer, trigger_cell));
610  trigger_cell_ids.emplace(HGCalDetId(ForwardSubdetector::HGCEE, 1, layer, 1, wafer, trigger_cell));
611  trigger_cell_ids.emplace(HGCalDetId(ForwardSubdetector::HGCHEF, -1, layer, 1, wafer, trigger_cell));
612  trigger_cell_ids.emplace(HGCalDetId(ForwardSubdetector::HGCHEF, 1, layer, 1, wafer, trigger_cell));
613  for (unsigned trigger_cell : trigger_cell_ids) {
614  if (!validTriggerCellFromCells(trigger_cell))
615  invalid_triggercells_.emplace(trigger_cell);
616  for (unsigned neighbor : getNeighborsFromTriggerCell(trigger_cell)) {
617  if (!validTriggerCellFromCells(neighbor))
618  invalid_triggercells_.emplace(neighbor);
619  }
620  }
621  }
622  }
623  }
624 }
625 
626 unsigned HGCalTriggerGeometryHexLayerBasedImp1::packWaferCellId(unsigned subdet, unsigned wafer, unsigned cell) const {
627  unsigned packed_value = 0;
628  const int kSubdetMask = 0x7;
629  packed_value |= ((cell & HGCalDetId::kHGCalCellMask) << HGCalDetId::kHGCalCellOffset);
630  packed_value |= ((wafer & HGCalDetId::kHGCalWaferMask) << HGCalDetId::kHGCalWaferOffset);
631  packed_value |= ((subdet & kSubdetMask) << (HGCalDetId::kHGCalWaferTypeOffset));
632  return packed_value;
633 }
634 
636  unsigned packed_value = 0;
637  packed_value |= (iphi & HcalDetId::kHcalPhiMask2);
638  packed_value |= ((ieta & HcalDetId::kHcalEtaMask2) << HcalDetId::kHcalEtaOffset2);
639  return packed_value;
640 }
641 
643  unsigned& wafer,
644  unsigned& cell) const {
645  cell = wafer_cell & HGCalDetId::kHGCalCellMask;
647 }
648 
649 void HGCalTriggerGeometryHexLayerBasedImp1::unpackIetaIphi(unsigned ieta_iphi, unsigned& ieta, unsigned& iphi) const {
650  iphi = ieta_iphi & HcalDetId::kHcalPhiMask2;
652 }
653 
654 bool HGCalTriggerGeometryHexLayerBasedImp1::validTriggerCell(const unsigned trigger_cell_id) const {
655  return invalid_triggercells_.find(trigger_cell_id) == invalid_triggercells_.end();
656 }
657 
658 bool HGCalTriggerGeometryHexLayerBasedImp1::disconnectedModule(const unsigned module_id) const {
659  bool disconnected = false;
660  if (disconnected_modules_.find(HGCalDetId(module_id).wafer()) != disconnected_modules_.end())
661  disconnected = true;
662  if (disconnected_layers_.find(layerWithOffset(module_id)) != disconnected_layers_.end())
663  disconnected = true;
664  return disconnected;
665 }
666 
667 unsigned HGCalTriggerGeometryHexLayerBasedImp1::triggerLayer(const unsigned id) const {
668  unsigned layer = layerWithOffset(id);
669  if (layer >= trigger_layers_.size())
670  return 0;
671  return trigger_layers_[layer];
672 }
673 
674 bool HGCalTriggerGeometryHexLayerBasedImp1::validTriggerCellFromCells(const unsigned trigger_cell_id) const {
675  // Check the validity of a trigger cell with the
676  // validity of the cells. One valid cell in the
677  // trigger cell is enough to make the trigger cell
678  // valid.
679  HGCalDetId trigger_cell_det_id(trigger_cell_id);
680  unsigned subdet = trigger_cell_det_id.subdetId();
681  const geom_set cells = getCellsFromTriggerCell(trigger_cell_id);
682  bool is_valid = false;
683  for (const auto cell_id : cells) {
684  is_valid |= validCellId(subdet, cell_id);
685  if (is_valid)
686  break;
687  }
688  return is_valid;
689 }
690 
691 bool HGCalTriggerGeometryHexLayerBasedImp1::validCellId(unsigned subdet, unsigned cell_id) const {
692  bool is_valid = false;
693  switch (subdet) {
695  is_valid = eeTopology().valid(cell_id);
696  break;
698  is_valid = fhTopology().valid(cell_id);
699  break;
701  is_valid = bhTopology().valid(cell_id);
702  break;
703  default:
704  is_valid = false;
705  break;
706  }
707  return is_valid;
708 }
709 
710 unsigned HGCalTriggerGeometryHexLayerBasedImp1::packTriggerCell(unsigned module, unsigned trigger_cell) const {
711  unsigned packed_value = 0;
712  packed_value |= ((trigger_cell & HGCalDetId::kHGCalCellMask) << HGCalDetId::kHGCalCellOffset);
713  packed_value |= ((module & HGCalDetId::kHGCalWaferMask) << HGCalDetId::kHGCalWaferOffset);
714  return packed_value;
715 }
716 
717 int HGCalTriggerGeometryHexLayerBasedImp1::detIdWaferType(unsigned subdet, short wafer) const {
718  int wafer_type = 0;
719  switch (subdet) {
720  // HGCalDDDConstants::waferTypeT() returns 2=coarse, 1=fine
721  // HGCalDetId::waferType() returns -1=coarse, 1=fine
722  // Convert to HGCalDetId waferType
724  wafer_type = (eeTopology().dddConstants().waferTypeT(wafer) == 2 ? -1 : 1);
725  break;
727  wafer_type = (fhTopology().dddConstants().waferTypeT(wafer) == 2 ? -1 : 1);
728  break;
729  default:
730  break;
731  };
732  return wafer_type;
733 }
734 
736  HGCalDetId detid(id);
737  unsigned layer = 0;
738  switch (detid.subdetId()) {
740  layer = detid.layer();
741  break;
743  layer = fhOffset_ + detid.layer();
744  break;
746  layer = bhOffset_ + detid.layer();
747  break;
748  };
749  return layer;
750 }
751 
754  "HGCalTriggerGeometryHexLayerBasedImp1");
T getParameter(std::string const &) const
HGCalTriggerGeometryHexLayerBasedImp1(const edm::ParameterSet &conf)
std::unordered_multimap< unsigned, unsigned > module_to_wafers_
const HcalDDDRecConstants * dddConstants() const
Definition: HcalTopology.h:164
bool valid(const DetId &id) const override
static uint32_t kHcalEtaMask2
Definition: HcalDetId.h:19
bool is_valid(const Digi &d)
Definition: GenericDigi.h:64
int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
std::unordered_multimap< unsigned, unsigned > trigger_cells_to_cells_
std::unordered_map< unsigned, unsigned short > number_trigger_cells_in_wafers_bh_
const HGCalGeometry * eeGeometry() const
const HGCalTopology & eeTopology() const
int detIdWaferType(unsigned subdet, short wafer) const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
static const int kHGCalWaferTypeOffset
Definition: HGCalDetId.h:14
GlobalPoint getPosition(const DetId &id) const
unsigned packIetaIphi(unsigned ieta, unsigned iphi) const
int zside(DetId const &)
std::unordered_map< unsigned, unsigned > cells_to_trigger_cells_
ForwardSubdetector
bool validCellId(unsigned subdet, unsigned cell_id) const
unsigned getModuleFromTriggerCell(const unsigned) const final
unsigned getLinksInModule(const unsigned module_id) const final
void fillNeighborMaps(const edm::FileInPath &, std::unordered_map< int, std::set< std::pair< short, short >>> &)
std::unordered_map< unsigned, unsigned short > number_trigger_cells_in_wafers_
void unpackWaferCellId(unsigned wafer_cell, unsigned &wafer, unsigned &cell) const
static const int kHGCalCellOffset
Definition: HGCalDetId.h:10
static const int kHGCalCellMask
Definition: HGCalDetId.h:11
int depth() const
get the tower depth
Definition: HcalDetId.h:164
unsigned getTriggerCellFromCell(const unsigned) const final
unsigned int layers(bool reco) const
int zside() const
get the z-side of the cell (1/-1)
Definition: HGCalDetId.h:49
const HGCalGeometry * fhGeometry() const
const HcalTopology & bhTopology() const
void unpackIetaIphi(unsigned ieta_iphi, unsigned &ieta, unsigned &iphi) const
unsigned packWaferCellId(unsigned subdet, unsigned wafer, unsigned cell) const
std::unordered_map< unsigned, unsigned > cells_to_trigger_cells_bh_
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
GlobalPoint getTriggerCellPosition(const unsigned) const final
#define end
Definition: vmac.h:39
int wafer() const
get the wafer #
Definition: HGCalDetId.h:40
GlobalPoint getPosition(const DetId &id) const
const HcalGeometry * bhGeometry() const
int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
Definition: DetId.h:17
std::unordered_map< unsigned, unsigned > wafer_to_module_
void setCaloGeometry(const CaloGeometry *geom)
int cell() const
get the absolute value of the cell #&#39;s in x and y
Definition: HGCalDetId.h:37
const HGCalDDDConstants & dddConstants() const
Definition: HGCalTopology.h:96
static uint32_t kHcalPhiMask2
Definition: HcalDetId.h:15
std::unordered_map< int, std::set< std::pair< short, short > > > trigger_cell_neighbors_bh_
int getMaxDepth(const int &type) const
static uint32_t kHcalEtaOffset2
Definition: HcalDetId.h:17
geom_set getNeighborsFromTriggerCell(const unsigned) const final
static const int kHGCalWaferOffset
Definition: HGCalDetId.h:12
std::unordered_multimap< unsigned, unsigned > trigger_cells_to_cells_bh_
std::set< unsigned > geom_ordered_set
geom_ordered_set getOrderedCellsFromModule(const unsigned) const final
GlobalPoint getModulePosition(const unsigned) const final
#define begin
Definition: vmac.h:32
HLT enums.
geom_set getCellsFromTriggerCell(const unsigned) const final
std::unordered_set< unsigned > geom_set
std::string fullPath() const
Definition: FileInPath.cc:163
int waferType() const
get the wafer type
Definition: HGCalDetId.h:43
#define DEFINE_EDM_PLUGIN(factory, type, name)
bool valid(const DetId &id) const override
Is this a valid cell id.
unsigned getModuleSize(const unsigned module_id) const final
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:53
int waferTypeT(int wafer) const
Definition: vlib.h:198
geom_ordered_set getOrderedTriggerCellsFromModule(const unsigned) const final
std::unordered_map< int, std::set< std::pair< short, short > > > trigger_cell_neighbors_
def move(src, dest)
Definition: eostools.py:511
const HGCalTopology & fhTopology() const
int layer() const
get the layer #
Definition: HGCalDetId.h:46
geom_set getTriggerCellsFromModule(const unsigned) const final
static const int kHGCalWaferMask
Definition: HGCalDetId.h:13