CMS 3D CMS Logo

HGCalTriggerTowerGeometryHelper.cc
Go to the documentation of this file.
1 
7 
8 #include <cmath>
9 #include <iostream>
10 #include <fstream>
11 #include <algorithm>
12 
14  : doNose_(conf.getParameter<bool>("doNose")),
15  minEta_(conf.getParameter<double>("minEta")),
16  maxEta_(conf.getParameter<double>("maxEta")),
17  minPhi_(conf.getParameter<double>("minPhi")),
18  maxPhi_(conf.getParameter<double>("maxPhi")),
19  nBinsEta_(conf.getParameter<int>("nBinsEta")),
20  nBinsPhi_(conf.getParameter<int>("nBinsPhi")),
21  binsEta_(conf.getParameter<std::vector<double> >("binsEta")),
22  binsPhi_(conf.getParameter<std::vector<double> >("binsPhi")) {
23  if (!binsEta_.empty() && ((unsigned int)(binsEta_.size()) != nBinsEta_ + 1)) {
24  throw edm::Exception(edm::errors::Configuration, "Configuration")
25  << "HGCalTriggerTowerGeometryHelper nBinsEta for the tower map not consistent with binsEta size" << std::endl;
26  }
27 
28  if (!binsPhi_.empty() && ((unsigned int)(binsPhi_.size()) != nBinsPhi_ + 1)) {
29  throw edm::Exception(edm::errors::Configuration, "Configuration")
30  << "HGCalTriggerTowerGeometryHelper nBinsPhi for the tower map not consistent with binsPhi size" << std::endl;
31  }
32 
33  // if the bin vecctor is empty we assume the bins to be regularly spaced
34  if (binsEta_.empty()) {
35  for (unsigned int bin1 = 0; bin1 != nBinsEta_ + 1; bin1++) {
36  binsEta_.push_back(minEta_ + bin1 * ((maxEta_ - minEta_) / nBinsEta_));
37  }
38  }
39 
40  // if the bin vecctor is empty we assume the bins to be regularly spaced
41  if (binsPhi_.empty()) {
42  for (unsigned int bin2 = 0; bin2 != nBinsPhi_ + 1; bin2++) {
43  binsPhi_.push_back(minPhi_ + bin2 * ((maxPhi_ - minPhi_) / nBinsPhi_));
44  }
45  }
46 
47  for (int zside = -1; zside <= 1; zside += 2) {
48  for (unsigned int bin1 = 0; bin1 != nBinsEta_; bin1++) {
49  for (unsigned int bin2 = 0; bin2 != nBinsPhi_; bin2++) {
50  l1t::HGCalTowerID towerId(doNose_, zside, bin1, bin2);
51  tower_coords_.emplace_back(towerId.rawId(),
52  zside * ((binsEta_[bin1 + 1] + binsEta_[bin1]) / 2),
53  (binsPhi_[bin2 + 1] + binsPhi_[bin2]) / 2);
54  }
55  }
56  }
57 
58  if (conf.getParameter<bool>("readMappingFile")) {
59  // We read the TC to TT mapping from file,
60  // otherwise we derive the TC to TT mapping on the fly from eta-phi coord. of the TCs
61  std::ifstream l1tTriggerTowerMappingStream(conf.getParameter<edm::FileInPath>("L1TTriggerTowerMapping").fullPath());
62  if (!l1tTriggerTowerMappingStream.is_open()) {
63  throw cms::Exception("MissingDataFile") << "Cannot open HGCalTriggerGeometry L1TTriggerTowerMapping file\n";
64  }
65 
66  unsigned trigger_cell_id = 0;
67  unsigned short iEta = 0;
68  unsigned short iPhi = 0;
69 
70  for (; l1tTriggerTowerMappingStream >> trigger_cell_id >> iEta >> iPhi;) {
71  if (iEta >= nBinsEta_ || iPhi >= nBinsPhi_) {
72  throw edm::Exception(edm::errors::Configuration, "Configuration")
73  << "HGCalTriggerTowerGeometryHelper warning inconsistent mapping TC : " << trigger_cell_id
74  << " to TT iEta: " << iEta << " iPhi: " << iPhi << " when max #bins eta: " << nBinsEta_
75  << " phi: " << nBinsPhi_ << std::endl;
76  }
77  l1t::HGCalTowerID towerId(doNose_, triggerTools_.zside(DetId(trigger_cell_id)), iEta, iPhi);
78  cells_to_trigger_towers_[trigger_cell_id] = towerId.rawId();
79  }
80  l1tTriggerTowerMappingStream.close();
81  }
82 }
83 
84 const std::vector<l1t::HGCalTowerCoord>& HGCalTriggerTowerGeometryHelper::getTowerCoordinates() const {
85  return tower_coords_;
86 }
87 
88 unsigned short HGCalTriggerTowerGeometryHelper::getTriggerTowerFromEtaPhi(const float& eta, const float& phi) const {
89  auto bin_eta_l = std::lower_bound(binsEta_.begin(), binsEta_.end(), fabs(eta));
90  unsigned int bin_eta = 0;
91  // we add a protection for TCs in Hadron part which are outside the boundaries and possible rounding effects
92  if (bin_eta_l == binsEta_.end()) {
93  if (fabs(eta) < minEta_) {
94  bin_eta = 0;
95  } else if (fabs(eta) >= maxEta_) {
96  bin_eta = nBinsEta_;
97  } else {
98  edm::LogError("HGCalTriggerTowerGeometryHelper")
99  << " did not manage to map eta " << eta << " to any Trigger Tower\n";
100  }
101  } else {
102  bin_eta = bin_eta_l - binsEta_.begin() - 1;
103  }
104 
105  auto bin_phi_l = std::lower_bound(binsPhi_.begin(), binsPhi_.end(), phi);
106  unsigned int bin_phi = 0;
107  if (bin_phi_l == binsPhi_.end()) {
108  if (phi < minPhi_) {
109  bin_phi = nBinsPhi_;
110  } else if (phi >= maxPhi_) {
111  bin_phi = 0;
112  } else {
113  edm::LogError("HGCalTriggerTowerGeometryHelper")
114  << " did not manage to map phi " << phi << " to any Trigger Tower\n";
115  }
116  } else {
117  bin_phi = bin_phi_l - binsPhi_.begin() - 1;
118  }
119  int zside = eta < 0 ? -1 : 1;
120  return l1t::HGCalTowerID(doNose_, zside, bin_eta, bin_phi).rawId();
121 }
122 
124  unsigned int trigger_cell_id = thecell.detId();
125  // NOTE: if the TC is not found in the map than it is mapped via eta-phi coords.
126  // this can be considered dangerous (silent failure of the map) but it actually allows to save
127  // memory mapping explicitly only what is actually needed
128  auto tower_id_itr = cells_to_trigger_towers_.find(trigger_cell_id);
129  if (tower_id_itr != cells_to_trigger_towers_.end())
130  return tower_id_itr->second;
131 
132  return getTriggerTowerFromEtaPhi(thecell.position().eta(), thecell.position().phi());
133 }
134 
136  return getTriggerTowerFromEtaPhi(thesum.position().eta(), thesum.position().phi());
137 }
HGCalTriggerTowerGeometryHelper::maxEta_
double maxEta_
Definition: HGCalTriggerTowerGeometryHelper.h:49
electrons_cff.bool
bool
Definition: electrons_cff.py:366
MessageLogger.h
HGCalTriggerTowerGeometryHelper::nBinsPhi_
unsigned int nBinsPhi_
Definition: HGCalTriggerTowerGeometryHelper.h:53
ecaldqm::zside
int zside(DetId const &)
Definition: EcalDQMCommonUtils.cc:189
HGCalTriggerTowerGeometryHelper::doNose_
bool doNose_
Definition: HGCalTriggerTowerGeometryHelper.h:47
HGCalTriggerTowerGeometryHelper::cells_to_trigger_towers_
std::unordered_map< unsigned, short > cells_to_trigger_towers_
Definition: HGCalTriggerTowerGeometryHelper.h:45
HGCalTriggerTowerGeometryHelper::getTriggerTower
unsigned short getTriggerTower(const l1t::HGCalTriggerCell &) const
Definition: HGCalTriggerTowerGeometryHelper.cc:123
ecaldqm::towerId
unsigned towerId(DetId const &, EcalElectronicsMapping const *)
Definition: EcalDQMCommonUtils.cc:77
EDMException.h
DetId
Definition: DetId.h:17
edm::FileInPath
Definition: FileInPath.h:61
HGCalTriggerTowerGeometryHelper.h
HGCalTriggerTowerGeometryHelper::maxPhi_
double maxPhi_
Definition: HGCalTriggerTowerGeometryHelper.h:51
PVValHelper::eta
Definition: PVValidationHelpers.h:70
HGCalTriggerTowerGeometryHelper::triggerTools_
HGCalTriggerTools triggerTools_
Definition: HGCalTriggerTowerGeometryHelper.h:58
l1t::HGCalTriggerCell
Definition: HGCalTriggerCell.h:14
HGCalTriggerTools::zside
int zside(const DetId &) const
Definition: HGCalTriggerTools.cc:210
l1t::HGCalTowerID
Definition: HGCalTowerID.h:10
l1t::HGCalTriggerCell::detId
uint32_t detId() const
Definition: HGCalTriggerCell.h:25
pfDeepBoostedJetPreprocessParams_cfi.lower_bound
lower_bound
Definition: pfDeepBoostedJetPreprocessParams_cfi.py:15
edm::ParameterSet
Definition: ParameterSet.h:47
HGCalTriggerTowerGeometryHelper::HGCalTriggerTowerGeometryHelper
HGCalTriggerTowerGeometryHelper(const edm::ParameterSet &conf)
Definition: HGCalTriggerTowerGeometryHelper.cc:13
PVValHelper::phi
Definition: PVValidationHelpers.h:69
PV3DBase::eta
T eta() const
Definition: PV3DBase.h:73
createfilelist.int
int
Definition: createfilelist.py:10
trackerHitRTTI::vector
Definition: trackerHitRTTI.h:21
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
HGCalTriggerTowerGeometryHelper::minPhi_
double minPhi_
Definition: HGCalTriggerTowerGeometryHelper.h:50
DDAxes::phi
std
Definition: JetResolutionObject.h:76
l1t::HGCalTriggerCell::position
const GlobalPoint & position() const
Definition: HGCalTriggerCell.h:26
DetId.h
l1t::HGCalTriggerSums::position
const GlobalPoint & position() const
Definition: HGCalTriggerSums.h:26
Exception
Definition: hltDiff.cc:245
HGCalTriggerTowerGeometryHelper::getTowerCoordinates
const std::vector< l1t::HGCalTowerCoord > & getTowerCoordinates() const
Definition: HGCalTriggerTowerGeometryHelper.cc:84
HGCalTriggerTowerGeometryHelper::nBinsEta_
unsigned int nBinsEta_
Definition: HGCalTriggerTowerGeometryHelper.h:52
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
Exception.h
HGCalTriggerTowerGeometryHelper::getTriggerTowerFromEtaPhi
unsigned short getTriggerTowerFromEtaPhi(const float &eta, const float &phi) const
Definition: HGCalTriggerTowerGeometryHelper.cc:88
L1TowerCalibrationProducer_cfi.iEta
iEta
Definition: L1TowerCalibrationProducer_cfi.py:60
HGCalTriggerTowerGeometryHelper::binsPhi_
std::vector< double > binsPhi_
Definition: HGCalTriggerTowerGeometryHelper.h:56
HGCalTriggerTowerGeometryHelper::binsEta_
std::vector< double > binsEta_
Definition: HGCalTriggerTowerGeometryHelper.h:55
l1t::HGCalTowerID::rawId
unsigned short rawId() const
Definition: HGCalTowerID.h:29
l1t::HGCalTriggerSums
Definition: HGCalTriggerSums.h:14
edm::errors::Configuration
Definition: EDMException.h:36
HGCalTriggerTowerGeometryHelper::tower_coords_
std::vector< l1t::HGCalTowerCoord > tower_coords_
Definition: HGCalTriggerTowerGeometryHelper.h:44
PV3DBase::phi
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
edm::FileInPath::fullPath
std::string fullPath() const
Definition: FileInPath.cc:161
HGCalTriggerTowerGeometryHelper::minEta_
double minEta_
Definition: HGCalTriggerTowerGeometryHelper.h:48