CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HcalDDDGeometry.cc
Go to the documentation of this file.
4 
5 #include <algorithm>
6 #include <mutex>
7 
9 
11  : topo_(topo),
12  etaMax_(0),
13  m_hbCellVec(topo.getHBSize()),
14  m_heCellVec(topo.getHESize()),
15  m_hoCellVec(topo.getHOSize()),
16  m_hfCellVec(topo.getHFSize()),
17  m_filledDetIds(false) {}
18 
20 
22  std::lock_guard<std::mutex> guard(s_fillLock);
23  if (m_filledDetIds) {
24  //another thread already did the work
25  return;
26  }
27  const std::vector<DetId>& baseIds(CaloSubdetectorGeometry::getValidDetIds());
28  for (unsigned int i(0); i != baseIds.size(); ++i) {
29  const DetId id(baseIds[i]);
30  if (id.subdetId() == HcalBarrel) {
31  m_hbIds.emplace_back(id);
32  } else {
33  if (id.subdetId() == HcalEndcap) {
34  m_heIds.emplace_back(id);
35  } else {
36  if (id.subdetId() == HcalOuter) {
37  m_hoIds.emplace_back(id);
38  } else {
39  if (id.subdetId() == HcalForward) {
40  m_hfIds.emplace_back(id);
41  }
42  }
43  }
44  }
45  }
46  std::sort(m_hbIds.begin(), m_hbIds.end());
47  std::sort(m_heIds.begin(), m_heIds.end());
48  std::sort(m_hoIds.begin(), m_hoIds.end());
49  std::sort(m_hfIds.begin(), m_hfIds.end());
50 
51  m_emptyIds.resize(0);
52  m_filledDetIds = true;
53 }
54 
55 std::vector<DetId> const& HcalDDDGeometry::getValidDetIds(DetId::Detector det, int subdet) const {
56  if (0 != subdet && not m_filledDetIds)
57  fillDetIds();
58  return (0 == subdet
60  : (HcalBarrel == subdet
61  ? m_hbIds
62  : (HcalEndcap == subdet
63  ? m_heIds
64  : (HcalOuter == subdet ? m_hoIds : (HcalForward == subdet ? m_hfIds : m_emptyIds)))));
65 }
66 
68  constexpr double twopi = M_PI + M_PI;
69  constexpr double deg = M_PI / 180.;
70 
71  // Now find the closest eta_bin, eta value of a bin i is average
72  // of eta[i] and eta[i-1]
73  double abseta = fabs(r.eta());
74  double phi = r.phi();
75  if (phi < 0)
76  phi += twopi;
77  double radius = r.mag();
78  double z = fabs(r.z());
79 
80  LogDebug("HCalGeom") << "HcalDDDGeometry::getClosestCell for eta " << r.eta() << " phi " << phi / deg << " z "
81  << r.z() << " radius " << radius;
82  HcalDetId bestId;
83  if (abseta <= etaMax_) {
84  for (const auto& hcalCell : hcalCells_) {
85  if (abseta >= hcalCell.etaMin() && abseta <= hcalCell.etaMax()) {
86  HcalSubdetector bc = hcalCell.detType();
87  int etaring = hcalCell.etaBin();
88  int phibin = 0;
89  if (hcalCell.unitPhi() == 4) {
90  // rings 40 and 41 are offset wrt the other phi numbering
91  // 1 1 1 2
92  // ------------------------------
93  // 72 36 36 1
94  phibin =
95  static_cast<int>((phi + hcalCell.phiOffset() + 0.5 * hcalCell.phiBinWidth()) / hcalCell.phiBinWidth());
96  if (phibin == 0)
97  phibin = hcalCell.nPhiBins();
98  phibin = phibin * 4 - 1;
99  } else {
100  phibin = static_cast<int>((phi + hcalCell.phiOffset()) / hcalCell.phiBinWidth()) + 1;
101  // convert to the convention of numbering 1,3,5, in 36 phi bins
102  phibin = (phibin - 1) * (hcalCell.unitPhi()) + 1;
103  }
104 
105  int dbin = 1;
106  int etabin = (r.z() > 0) ? etaring : -etaring;
107  if (bc == HcalForward) {
108  bestId = HcalDetId(bc, etabin, phibin, dbin);
109  break;
110  } else {
111  double rz = z;
112  if (hcalCell.depthType())
113  rz = radius;
114  if (rz < hcalCell.depthMax()) {
115  dbin = hcalCell.depthSegment();
116  bestId = HcalDetId(bc, etabin, phibin, dbin);
117  break;
118  }
119  }
120  }
121  }
122  }
123 
124  LogDebug("HCalGeom") << "HcalDDDGeometry::getClosestCell " << bestId;
125 
126  return bestId;
127 }
128 
129 int HcalDDDGeometry::insertCell(std::vector<HcalCellType> const& cells) {
130  hcalCells_.insert(hcalCells_.end(), cells.begin(), cells.end());
131  int num = static_cast<int>(hcalCells_.size());
132  for (const auto& cell : cells) {
133  if (cell.etaMax() > etaMax_)
134  etaMax_ = cell.etaMax();
135  }
136 
137  LogDebug("HCalGeom") << "HcalDDDGeometry::insertCell " << cells.size() << " cells inserted == Total " << num
138  << " EtaMax = " << etaMax_;
139  return num;
140 }
141 
143  const GlobalPoint& f1, const GlobalPoint& f2, const GlobalPoint& f3, const CCGFloat* parm, const DetId& detId) {
144  assert(detId.det() == DetId::Hcal);
145 
146  const unsigned int din(topo_.detId2denseId(detId));
147 
148  HcalDetId hId(detId);
149 
150  if (hId.subdet() == HcalBarrel) {
152  } else {
153  if (hId.subdet() == HcalEndcap) {
154  const unsigned int index(din - m_hbCellVec.size());
156  } else {
157  if (hId.subdet() == HcalOuter) {
158  const unsigned int index(din - m_hbCellVec.size() - m_heCellVec.size());
160  } else { // assuming HcalForward here!
161  const unsigned int index(din - m_hbCellVec.size() - m_heCellVec.size() - m_hoCellVec.size());
162  m_hfCellVec[index] =
163  IdealZPrism(f1, cornersMgr(), parm, hId.depth() == 1 ? IdealZPrism::EM : IdealZPrism::HADR);
164  }
165  }
166  }
167 }
168 
170  const GlobalPoint& f1, const GlobalPoint& f2, const GlobalPoint& f3, const CCGFloat* parm, const DetId& detId) {
171  newCellImpl(f1, f2, f3, parm, detId);
172  addValidID(detId);
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  m_validIds.emplace_back(detId);
179 }
180 
182  // Modify the RawPtr class
183  const CaloCellGeometry* cell(nullptr);
184  if (m_hbCellVec.size() > din) {
185  cell = (&m_hbCellVec[din]);
186  } else if (m_hbCellVec.size() + m_heCellVec.size() > din) {
187  const unsigned int ind(din - m_hbCellVec.size());
188  cell = (&m_heCellVec[ind]);
189  } else if (m_hbCellVec.size() + m_heCellVec.size() + m_hoCellVec.size() > din) {
190  const unsigned int ind(din - m_hbCellVec.size() - m_heCellVec.size());
191  cell = (&m_hoCellVec[ind]);
192  } else if (m_hbCellVec.size() + m_heCellVec.size() + m_hoCellVec.size() + m_hfCellVec.size() > din) {
193  const unsigned int ind(din - m_hbCellVec.size() - m_heCellVec.size() - m_hoCellVec.size());
194  cell = (&m_hfCellVec[ind]);
195  }
196 
197  return ((nullptr == cell || nullptr == cell->param()) ? nullptr : cell);
198 }
199 
200 void HcalDDDGeometry::increaseReserve(unsigned int extra) { m_validIds.reserve(m_validIds.size() + extra); }
201 
202 void HcalDDDGeometry::sortValidIds() { std::sort(m_validIds.begin(), m_validIds.end()); }
uint16_t *__restrict__ id
std::vector< DetId > m_hfIds
std::vector< DetId > m_heIds
static std::mutex mutex
Definition: Proxy.cc:8
std::atomic< bool > m_filledDetIds
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
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
etaMax_(conf.getParameter< double >("etaMax"))
assert(be >=bs)
CaloCellGeometry::CCGFloat CCGFloat
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)
void newCellFast(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
const HcalTopology & topo_
const CCGFloat * param() const
T mag() const
Definition: PV3DBase.h:64
int insertCell(std::vector< HcalCellType > const &)
void increaseReserve(unsigned int extra)
std::vector< DetId > m_validIds
T z() const
Definition: PV3DBase.h:61
HcalSubdetector
Definition: HcalAssistant.h:31
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.
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ cells
Definition: DetId.h:17
void fillDetIds() const
std::vector< DetId > m_emptyIds
void addValidID(const DetId &id)
HECellVec m_heCellVec
CaloCellGeometry::CornersMgr * cornersMgr()
Detector
Definition: DetId.h:24
HFCellVec m_hfCellVec
T eta() const
Definition: PV3DBase.h:73
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)
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
#define LogDebug(id)
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46