CMS 3D CMS Logo

HcalDDDGeometry.cc
Go to the documentation of this file.
4 
5 #include <algorithm>
6 #include <mutex>
7 
8 //#define EDM_ML_DEBUG
9 
11 
13  : topo_(topo),
14  etaMax_(0),
15  m_hbCellVec(topo.getHBSize()),
16  m_heCellVec(topo.getHESize()),
17  m_hoCellVec(topo.getHOSize()),
18  m_hfCellVec(topo.getHFSize()),
19  m_filledDetIds(false) {}
20 
22 
24  std::lock_guard<std::mutex> guard(s_fillLock);
25  if (m_filledDetIds) {
26  //another thread already did the work
27  return;
28  }
29  const std::vector<DetId>& baseIds(CaloSubdetectorGeometry::getValidDetIds());
30  for (unsigned int i(0); i != baseIds.size(); ++i) {
31  const DetId id(baseIds[i]);
32  if (id.subdetId() == HcalBarrel) {
33  m_hbIds.emplace_back(id);
34  } else {
35  if (id.subdetId() == HcalEndcap) {
36  m_heIds.emplace_back(id);
37  } else {
38  if (id.subdetId() == HcalOuter) {
39  m_hoIds.emplace_back(id);
40  } else {
41  if (id.subdetId() == HcalForward) {
42  m_hfIds.emplace_back(id);
43  }
44  }
45  }
46  }
47  }
48  std::sort(m_hbIds.begin(), m_hbIds.end());
49  std::sort(m_heIds.begin(), m_heIds.end());
50  std::sort(m_hoIds.begin(), m_hoIds.end());
51  std::sort(m_hfIds.begin(), m_hfIds.end());
52 
53  m_emptyIds.resize(0);
54  m_filledDetIds = true;
55 }
56 
57 std::vector<DetId> const& HcalDDDGeometry::getValidDetIds(DetId::Detector det, int subdet) const {
58  if (0 != subdet && not m_filledDetIds)
59  fillDetIds();
60  return (0 == subdet
62  : (HcalBarrel == subdet
63  ? m_hbIds
64  : (HcalEndcap == subdet
65  ? m_heIds
66  : (HcalOuter == subdet ? m_hoIds : (HcalForward == subdet ? m_hfIds : m_emptyIds)))));
67 }
68 
70  constexpr double twopi = M_PI + M_PI;
71 
72  // Now find the closest eta_bin, eta value of a bin i is average
73  // of eta[i] and eta[i-1]
74  double abseta = fabs(r.eta());
75  double phi = r.phi();
76  if (phi < 0)
77  phi += twopi;
78  double radius = r.mag();
79  double z = fabs(r.z());
80 
81 #ifdef EDM_ML_DEBUG
82  constexpr double deg = M_PI / 180.;
83  edm::LogVerbatim("HCalGeom") << "HcalDDDGeometry::getClosestCell for eta " << r.eta() << " phi " << phi / deg << " z "
84  << r.z() << " radius " << radius;
85 #endif
86  HcalDetId bestId;
87  if (abseta <= etaMax_) {
88  for (const auto& hcalCell : hcalCells_) {
89  if (abseta >= hcalCell.etaMin() && abseta <= hcalCell.etaMax()) {
90  HcalSubdetector bc = hcalCell.detType();
91  int etaring = hcalCell.etaBin();
92  int phibin = 0;
93  if (hcalCell.unitPhi() == 4) {
94  // rings 40 and 41 are offset wrt the other phi numbering
95  // 1 1 1 2
96  // ------------------------------
97  // 72 36 36 1
98  phibin =
99  static_cast<int>((phi + hcalCell.phiOffset() + 0.5 * hcalCell.phiBinWidth()) / hcalCell.phiBinWidth());
100  if (phibin == 0)
101  phibin = hcalCell.nPhiBins();
102  phibin = phibin * 4 - 1;
103  } else {
104  phibin = static_cast<int>((phi + hcalCell.phiOffset()) / hcalCell.phiBinWidth()) + 1;
105  // convert to the convention of numbering 1,3,5, in 36 phi bins
106  phibin = (phibin - 1) * (hcalCell.unitPhi()) + 1;
107  }
108 
109  int dbin = 1;
110  int etabin = (r.z() > 0) ? etaring : -etaring;
111  if (bc == HcalForward) {
112  bestId = HcalDetId(bc, etabin, phibin, dbin);
113  break;
114  } else {
115  double rz = z;
116  if (hcalCell.depthType())
117  rz = radius;
118  if (rz < hcalCell.depthMax()) {
119  dbin = hcalCell.depthSegment();
120  bestId = HcalDetId(bc, etabin, phibin, dbin);
121  break;
122  }
123  }
124  }
125  }
126  }
127 
128 #ifdef EDM_ML_DEBUG
129  edm::LogVerbatim("HCalGeom") << "HcalDDDGeometry::getClosestCell " << bestId;
130 #endif
131  return bestId;
132 }
133 
134 int HcalDDDGeometry::insertCell(std::vector<HcalCellType> const& cells) {
135  hcalCells_.insert(hcalCells_.end(), cells.begin(), cells.end());
136  int num = static_cast<int>(hcalCells_.size());
137  for (const auto& cell : cells) {
138  if (cell.etaMax() > etaMax_)
139  etaMax_ = cell.etaMax();
140  }
141 #ifdef EDM_ML_DEBUG
142  edm::LogVerbatim("HCalGeom") << "HcalDDDGeometry::insertCell " << cells.size() << " cells inserted == Total " << num
143  << " EtaMax = " << etaMax_;
144 #endif
145  return num;
146 }
147 
149  const GlobalPoint& f1, const GlobalPoint& f2, const GlobalPoint& f3, const CCGFloat* parm, const DetId& detId) {
150  assert(detId.det() == DetId::Hcal);
151 
152  const unsigned int din(topo_.detId2denseId(detId));
153 
154  HcalDetId hId(detId);
155 
156  if (hId.subdet() == HcalBarrel) {
158  } else {
159  if (hId.subdet() == HcalEndcap) {
160  const unsigned int index(din - m_hbCellVec.size());
162  } else {
163  if (hId.subdet() == HcalOuter) {
164  const unsigned int index(din - m_hbCellVec.size() - m_heCellVec.size());
166  } else { // assuming HcalForward here!
167  const unsigned int index(din - m_hbCellVec.size() - m_heCellVec.size() - m_hoCellVec.size());
168  m_hfCellVec[index] =
169  IdealZPrism(f1, cornersMgr(), parm, hId.depth() == 1 ? IdealZPrism::EM : IdealZPrism::HADR);
170  }
171  }
172  }
173 }
174 
176  const GlobalPoint& f1, const GlobalPoint& f2, const GlobalPoint& f3, const CCGFloat* parm, const DetId& detId) {
177  newCellImpl(f1, f2, f3, parm, detId);
178  addValidID(detId);
179 }
180 
182  const GlobalPoint& f1, const GlobalPoint& f2, const GlobalPoint& f3, const CCGFloat* parm, const DetId& detId) {
183  newCellImpl(f1, f2, f3, parm, detId);
184  m_validIds.emplace_back(detId);
185 }
186 
188  // Modify the RawPtr class
189  const CaloCellGeometry* cell(nullptr);
190  if (m_hbCellVec.size() > din) {
191  cell = (&m_hbCellVec[din]);
192  } else if (m_hbCellVec.size() + m_heCellVec.size() > din) {
193  const unsigned int ind(din - m_hbCellVec.size());
194  cell = (&m_heCellVec[ind]);
195  } else if (m_hbCellVec.size() + m_heCellVec.size() + m_hoCellVec.size() > din) {
196  const unsigned int ind(din - m_hbCellVec.size() - m_heCellVec.size());
197  cell = (&m_hoCellVec[ind]);
198  } else if (m_hbCellVec.size() + m_heCellVec.size() + m_hoCellVec.size() + m_hfCellVec.size() > din) {
199  const unsigned int ind(din - m_hbCellVec.size() - m_heCellVec.size() - m_hoCellVec.size());
200  cell = (&m_hfCellVec[ind]);
201  }
202 
203  return ((nullptr == cell || nullptr == cell->param()) ? nullptr : cell);
204 }
205 
206 void HcalDDDGeometry::increaseReserve(unsigned int extra) { m_validIds.reserve(m_validIds.size() + extra); }
207 
Log< level::Info, true > LogVerbatim
std::vector< DetId > m_hfIds
std::vector< DetId > m_heIds
static std::mutex mutex
Definition: Proxy.cc:8
std::atomic< bool > m_filledDetIds
unsigned int detId2denseId(const DetId &id) const override
return a linear packed id
DetId getClosestCell(const GlobalPoint &r) const override
const CaloCellGeometry * getGeometryRawPtr(uint32_t index) const override
assert(be >=bs)
CaloCellGeometry::CCGFloat CCGFloat
void newCellFast(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
const HcalTopology & topo_
int insertCell(std::vector< HcalCellType > const &)
void increaseReserve(unsigned int extra)
std::vector< DetId > m_validIds
HcalSubdetector
Definition: HcalAssistant.h:31
virtual const std::vector< DetId > & getValidDetIds(DetId::Detector det=DetId::Detector(0), int subdet=0) const
Get a list of valid detector ids (for the given subdetector)
HcalDDDGeometry(const HcalTopology &theTopo)
static std::mutex s_fillLock
void newCellImpl(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
std::vector< HcalCellType > hcalCells_
std::vector< DetId > m_hbIds
HBCellVec m_hbCellVec
#define M_PI
~HcalDDDGeometry() override
The HcalDDDGeometry will delete all its cell geometries at destruction time.
Definition: DetId.h:17
std::vector< DetId > m_emptyIds
void addValidID(const DetId &id)
const std::vector< DetId > & getValidDetIds(DetId::Detector det=DetId::Detector(0), int subdet=0) const override
Get a list of valid detector ids (for the given subdetector)
HECellVec m_heCellVec
CaloCellGeometry::CornersMgr * cornersMgr()
Detector
Definition: DetId.h:24
HFCellVec m_hfCellVec
HOCellVec m_hoCellVec
std::vector< DetId > m_hoIds
void newCell(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId) override
const CCGFloat * param() const
void fillDetIds() const