CMS 3D CMS Logo

HcalFlexiHardcodeGeometryLoader.cc
Go to the documentation of this file.
9 
10 #include <algorithm>
11 #include <sstream>
12 #include <vector>
13 
15 
16 //#define EDM_ML_DEBUG
17 // ==============> Loader Itself <==========================
18 
20  MAX_HCAL_PHI = 72;
21  DEGREE2RAD = M_PI / 180.;
22 }
23 
25  const HcalDDDRecConstants& hcons) {
26  HcalGeometry* hcalGeometry = new HcalGeometry(fTopology);
27  if (nullptr == hcalGeometry->cornersMgr())
28  hcalGeometry->allocateCorners(fTopology.ncells() + fTopology.getHFSize());
29  if (nullptr == hcalGeometry->parMgr())
31  isBH_ = hcons.isBH();
32 #ifdef EDM_ML_DEBUG
33  edm::LogVerbatim("HCalGeom") << "FlexiGeometryLoader initialize with ncells " << fTopology.ncells() << " and shapes "
35  << " with BH Flag " << isBH_;
36 #endif
37  if (fTopology.mode() == HcalTopologyMode::H2) { // TB geometry
38  fillHBHO(hcalGeometry, makeHBCells(hcons), true);
39  fillHBHO(hcalGeometry, makeHOCells(), false);
40  fillHE(hcalGeometry, makeHECells_H2());
41  } else { // regular geometry
42  fillHBHO(hcalGeometry, makeHBCells(hcons), true);
43  fillHBHO(hcalGeometry, makeHOCells(), false);
44  fillHF(hcalGeometry, makeHFCells(hcons));
45  fillHE(hcalGeometry, makeHECells(hcons));
46  }
47  //fast insertion of valid ids requires sort at end
48  hcalGeometry->sortValidIds();
49  return hcalGeometry;
50 }
51 
52 // ----------> HB <-----------
53 std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> HcalFlexiHardcodeGeometryLoader::makeHBCells(
54  const HcalDDDRecConstants& hcons) {
55  std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> result;
56  std::vector<std::pair<double, double> > gconsHB = hcons.getConstHBHE(0);
57  std::vector<HcalDDDRecConstants::HcalEtaBin> etabins = hcons.getEtaBins(0);
58 
59 #ifdef EDM_ML_DEBUG
60  edm::LogVerbatim("HCalGeom") << "FlexiGeometryLoader called for " << etabins.size() << " Eta Bins";
61  for (unsigned int k = 0; k < gconsHB.size(); ++k) {
62  edm::LogVerbatim("HCalGeom") << "gconsHB[" << k << "] = " << gconsHB[k].first << " +- " << gconsHB[k].second;
63  }
64 #endif
65  for (auto& etabin : etabins) {
66  int iring = (etabin.zside >= 0) ? etabin.ieta : -etabin.ieta;
67  int depth = etabin.depthStart;
68  double dphi =
69  (etabin.phis.size() > 1) ? (etabin.phis[1].second - etabin.phis[0].second) : ((2.0 * M_PI) / MAX_HCAL_PHI);
70  for (unsigned int k = 0; k < etabin.layer.size(); ++k) {
71  int layf = etabin.layer[k].first - 1;
72  int layl = etabin.layer[k].second - 1;
73  double rmin = gconsHB[layf].first - gconsHB[layf].second;
74  double rmax = gconsHB[layl].first + gconsHB[layl].second;
75  for (unsigned int j = 0; j < etabin.phis.size(); ++j) {
76 #ifdef EDM_ML_DEBUG
77  edm::LogVerbatim("HCalGeom") << "HBRing " << iring << " eta " << etabin.etaMin << ":" << etabin.etaMax
78  << " depth " << depth << " R " << rmin << ":" << rmax << " Phi "
79  << etabin.phis[j].first << ":" << etabin.phis[j].second << ":" << dphi << " layer["
80  << k << "]: " << etabin.layer[k].first - 1 << ":" << etabin.layer[k].second;
81 #endif
83  iring, depth, etabin.phis[j].first, etabin.phis[j].second, dphi, rmin, rmax, etabin.etaMin, etabin.etaMax));
84  }
85  depth++;
86  }
87  }
88  return result;
89 }
90 
91 // ----------> HO <-----------
92 std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> HcalFlexiHardcodeGeometryLoader::makeHOCells() {
93  const double HORMIN0 = 390.0;
94  const double HORMIN1 = 412.6;
95  const double HORMAX = 413.6;
96  const int nCells = 15;
97  const int nPhi = 72;
98  const double etamin[nCells] = {
99  0.000, 0.087, 0.174, 0.261, 0.3395, 0.435, 0.522, 0.609, 0.696, 0.783, 0.873, 0.957, 1.044, 1.131, 1.218};
100  const double etamax[nCells] = {
101  0.087, 0.174, 0.261, 0.3075, 0.435, 0.522, 0.609, 0.696, 0.783, 0.8494, 0.957, 1.044, 1.131, 1.218, 1.305};
102  std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> result;
103  result.reserve(nCells * nPhi);
104  double dphi = ((2.0 * M_PI) / nPhi);
105  for (int i = 0; i < nCells; ++i) {
106  double rmin = ((i < 4) ? HORMIN0 : HORMIN1);
107  for (int iside = -1; iside <= 1; iside += 2) {
108  for (int j = 0; j < nPhi; ++j) {
109  double phi = (j + 0.5) * dphi;
110  // eta, depth, phi, phi0, deltaPhi, rMin, rMax, etaMin, etaMax
112  iside * (i + 1), 4, j + 1, phi, dphi, rmin, HORMAX, etamin[i], etamax[i]));
113  }
114  }
115  }
116  return result;
117 }
118 
119 //
120 // Convert constants to appropriate cells
121 //
123  HcalGeometry* fGeometry, const std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters>& fCells, bool fHB) {
124  fGeometry->increaseReserve(fCells.size());
125  for (const auto& param : fCells) {
126  HcalDetId hid(fHB ? HcalBarrel : HcalOuter, param.ieta, param.iphi, param.depth);
127  float phiCenter = param.phi; // middle of the cell
128  float etaCenter = 0.5 * (param.etaMin + param.etaMax);
129  float x = param.rMin * cos(phiCenter);
130  float y = param.rMin * sin(phiCenter);
131  float z = (param.ieta < 0) ? -(param.rMin * sinh(etaCenter)) : (param.rMin * sinh(etaCenter));
132  // make cell geometry
133  GlobalPoint refPoint(x, y, z); // center of the cell's face
134  std::vector<CCGFloat> cellParams;
135  cellParams.reserve(5);
136  cellParams.emplace_back(0.5 * (param.etaMax - param.etaMin)); // deta_half
137  cellParams.emplace_back(0.5 * param.dphi); // dphi_half
138  cellParams.emplace_back(0.5 * (param.rMax - param.rMin) * cosh(etaCenter)); // dr_half
139  cellParams.emplace_back(fabs(refPoint.eta()));
140  cellParams.emplace_back(fabs(refPoint.z()));
141 #ifdef EDM_ML_DEBUG
142  edm::LogVerbatim("HCalGeom") << "HcalFlexiHardcodeGeometryLoader::fillHBHO-> " << hid << " " << hid.rawId() << " "
143  << std::hex << hid.rawId() << std::dec << " " << hid << " " << refPoint << '/'
144  << cellParams[0] << '/' << cellParams[1] << '/' << cellParams[2];
145 #endif
146  fGeometry->newCellFast(refPoint,
147  refPoint,
148  refPoint,
149  CaloCellGeometry::getParmPtr(cellParams, fGeometry->parMgr(), fGeometry->parVecVec()),
150  hid);
151  }
152 }
153 
154 // ----------> HE <-----------
155 std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters> HcalFlexiHardcodeGeometryLoader::makeHECells(
156  const HcalDDDRecConstants& hcons) {
157  std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters> result;
158  std::vector<std::pair<double, double> > gconsHE = hcons.getConstHBHE(1);
159 #ifdef EDM_ML_DEBUG
160  edm::LogVerbatim("HCalGeom") << "HcalFlexiHardcodeGeometryLoader:HE with " << gconsHE.size() << " cells";
161 #endif
162  if (!gconsHE.empty()) {
163  std::vector<HcalDDDRecConstants::HcalEtaBin> etabins = hcons.getEtaBins(1);
164 
165 #ifdef EDM_ML_DEBUG
166  edm::LogVerbatim("HCalGeom") << "FlexiGeometryLoader called for HE with " << etabins.size() << " Eta Bins and "
167  << gconsHE.size() << " depths";
168  std::ostringstream st1;
169  for (unsigned int i = 0; i < gconsHE.size(); ++i)
170  st1 << " Depth[" << i << "] = " << gconsHE[i].first << " +- " << gconsHE[i].second;
171  edm::LogVerbatim("HCalGeom") << st1.str();
172 #endif
173  for (auto& etabin : etabins) {
174  int iring = (etabin.zside >= 0) ? etabin.ieta : -etabin.ieta;
175  int depth = etabin.depthStart;
176  double dphi =
177  (etabin.phis.size() > 1) ? (etabin.phis[1].second - etabin.phis[0].second) : ((2.0 * M_PI) / MAX_HCAL_PHI);
178 #ifdef EDM_ML_DEBUG
179  edm::LogVerbatim("HCalGeom") << "FlexiGeometryLoader::Ring " << iring << " nphi " << etabin.phis.size()
180  << " dstart " << depth << " dphi " << dphi << " layers " << etabin.layer.size();
181  std::ostringstream st2;
182  for (unsigned int j = 0; j < etabin.phis.size(); ++j)
183  st2 << " [" << j << "] " << etabin.phis[j].first << ":" << etabin.phis[j].second;
184  edm::LogVerbatim("HCalGeom") << st2.str();
185 #endif
186  for (unsigned int k = 0; k < etabin.layer.size(); ++k) {
187  int layf = etabin.layer[k].first - 1;
188  int layl = etabin.layer[k].second - 1;
189  double zmin = gconsHE[layf].first - gconsHE[layf].second;
190  double zmax = gconsHE[layl].first + gconsHE[layl].second;
191  if (zmin < 1.0) {
192  for (int k2 = layf; k2 <= layl; ++k2) {
193  if (gconsHE[k2].first > 10) {
194  zmin = gconsHE[k2].first - gconsHE[k2].second;
195  break;
196  }
197  }
198  }
199  if (zmin >= zmax)
200  zmax = zmin + 10.;
201  for (unsigned int j = 0; j < etabin.phis.size(); ++j) {
202 #ifdef EDM_ML_DEBUG
203  edm::LogVerbatim("HCalGeom") << "HERing " << iring << " eta " << etabin.etaMin << ":" << etabin.etaMax
204  << " depth " << depth << " Z " << zmin << ":" << zmax
205  << " Phi :" << etabin.phis[j].first << ":" << etabin.phis[j].second << ":"
206  << dphi << " layer[" << k << "]: " << etabin.layer[k].first - 1 << ":"
207  << etabin.layer[k].second - 1;
208 #endif
210  iring, depth, etabin.phis[j].first, etabin.phis[j].second, dphi, zmin, zmax, etabin.etaMin, etabin.etaMax));
211  }
212  depth++;
213  }
214  }
215  }
216  return result;
217 }
218 
219 // ----------> HE @ H2 <-----------
220 std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters> HcalFlexiHardcodeGeometryLoader::makeHECells_H2() {
221  const double HEZMIN_H2 = 400.715;
222  const double HEZMID_H2 = 436.285;
223  const double HEZMAX_H2 = 541.885;
224  const int nEtas = 10;
225  const int nDepth[nEtas] = {1, 2, 2, 2, 2, 2, 2, 2, 3, 3};
226  const int dStart[nEtas] = {3, 1, 1, 1, 1, 1, 1, 1, 1, 1};
227  const int nPhis[nEtas] = {8, 8, 8, 8, 8, 8, 4, 4, 4, 4};
228  const double etas[nEtas + 1] = {1.305, 1.373, 1.444, 1.521, 1.603, 1.693, 1.790, 1.880, 1.980, 2.090, 2.210};
229  const double zval[4 * nEtas] = {
230  409.885, 462.685, 0., 0., HEZMIN_H2, 427.485, 506.685, 0.0, HEZMIN_H2, HEZMID_H2,
231  524.285, 0., HEZMIN_H2, HEZMID_H2, HEZMAX_H2, 0., HEZMIN_H2, HEZMID_H2, HEZMAX_H2, 0.,
232  HEZMIN_H2, HEZMID_H2, HEZMAX_H2, 0., HEZMIN_H2, HEZMID_H2, HEZMAX_H2, 0., HEZMIN_H2, HEZMID_H2,
233  HEZMAX_H2, 0., HEZMIN_H2, 418.685, HEZMID_H2, HEZMAX_H2, HEZMIN_H2, 418.685, HEZMID_H2, HEZMAX_H2};
234  std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters> result;
235 
236  for (int i = 0; i < nEtas; ++i) {
237  int ieta = 16 + i;
238  for (int k = 0; k < nDepth[i]; ++k) {
239  int depth = dStart[i] + k;
240  for (int j = 0; j < nPhis[i]; ++j) {
241  int iphi = (nPhis[i] == 8) ? (j + 1) : (2 * j + 1);
242  double dphi = (40.0 * DEGREE2RAD) / nPhis[i];
243  double phi0 = (j + 0.5) * dphi;
244  // ieta, depth, iphi, phi0, deltaPhi, zMin, zMax, etaMin, etaMax
246  ieta, depth, iphi, phi0, dphi, zval[4 * i + k + 1], zval[4 * i + k + 2], etas[i], etas[i + 1]));
247  }
248  }
249  }
250  return result;
251 }
252 
253 // ----------> HF <-----------
254 std::vector<HcalFlexiHardcodeGeometryLoader::HFCellParameters> HcalFlexiHardcodeGeometryLoader::makeHFCells(
255  const HcalDDDRecConstants& hcons) {
256  const float HFZMIN1 = 1115.;
257  const float HFZMIN2 = 1137.;
258  const float HFZMAX = 1280.1;
259  std::vector<HcalDDDRecConstants::HFCellParameters> cells = hcons.getHFCellParameters();
260  unsigned int nCells = cells.size();
261  std::vector<HcalFlexiHardcodeGeometryLoader::HFCellParameters> result;
262  result.reserve(nCells);
263  for (unsigned int i = 0; i < nCells; ++i) {
265  cells[i].depth,
266  cells[i].firstPhi,
267  cells[i].stepPhi,
268  cells[i].nPhi,
269  5 * cells[i].stepPhi,
270  HFZMIN1,
271  HFZMAX,
272  cells[i].rMin,
273  cells[i].rMax);
274  result.emplace_back(cell1);
276  1 + cells[i].depth,
277  cells[i].firstPhi,
278  cells[i].stepPhi,
279  cells[i].nPhi,
280  5 * cells[i].stepPhi,
281  HFZMIN2,
282  HFZMAX,
283  cells[i].rMin,
284  cells[i].rMax);
285  result.emplace_back(cell2);
286  }
287  return result;
288 }
289 
291  HcalGeometry* fGeometry, const std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters>& fCells) {
292  fGeometry->increaseReserve(fCells.size());
293  for (const auto& param : fCells) {
294  HcalDetId hid(HcalEndcap, param.ieta, param.iphi, param.depth);
295  float phiCenter = param.phi; // middle of the cell
296  float etaCenter = 0.5 * (param.etaMin + param.etaMax);
297  int iside = (param.ieta >= 0) ? 1 : -1;
298  float z = (isBH_) ? (iside * 0.5 * (param.zMin + param.zMax)) : (iside * param.zMin);
299  float perp = std::abs(z) / sinh(etaCenter);
300  float x = perp * cos(phiCenter);
301  float y = perp * sin(phiCenter);
302  // make cell geometry
303  GlobalPoint refPoint(x, y, z); // center of the cell's face
304  std::vector<CCGFloat> cellParams;
305  cellParams.reserve(5);
306  cellParams.emplace_back(0.5 * (param.etaMax - param.etaMin)); //deta_half
307  cellParams.emplace_back(0.5 * param.dphi); // dphi_half
308  cellParams.emplace_back(-0.5 * (param.zMax - param.zMin) / tanh(etaCenter)); // dz_half, "-" means edges in Z
309  cellParams.emplace_back(fabs(refPoint.eta()));
310  cellParams.emplace_back(fabs(refPoint.z()));
311 #ifdef EDM_ML_DEBUG
312  edm::LogVerbatim("HCalGeom") << "HcalFlexiHardcodeGeometryLoader::fillHE-> " << hid << " " << hid.rawId() << " "
313  << std::hex << hid.rawId() << std::dec << " " << hid << refPoint << '/'
314  << cellParams[0] << '/' << cellParams[1] << '/' << cellParams[2];
315 #endif
316  fGeometry->newCellFast(refPoint,
317  refPoint,
318  refPoint,
319  CaloCellGeometry::getParmPtr(cellParams, fGeometry->parMgr(), fGeometry->parVecVec()),
320  hid);
321  }
322 }
323 
325  HcalGeometry* fGeometry, const std::vector<HcalFlexiHardcodeGeometryLoader::HFCellParameters>& fCells) {
326  fGeometry->increaseReserve(fCells.size());
327  for (const auto& param : fCells) {
328  for (int kPhi = 0; kPhi < param.nPhi; ++kPhi) {
329  int iPhi = param.phiFirst + kPhi * param.phiStep;
330  HcalDetId hid(HcalForward, param.eta, iPhi, param.depth);
331  // middle of the cell
332  float phiCenter = ((iPhi - 1) * 360. / MAX_HCAL_PHI + 0.5 * param.dphi) * DEGREE2RAD;
333  GlobalPoint inner(param.rMin, 0, param.zMin);
334  GlobalPoint outer(param.rMax, 0, param.zMin);
335  float iEta = inner.eta();
336  float oEta = outer.eta();
337  float etaCenter = 0.5 * (iEta + oEta);
338 
339  float perp = param.zMin / sinh(etaCenter);
340  float x = perp * cos(phiCenter);
341  float y = perp * sin(phiCenter);
342  float z = (param.eta > 0) ? param.zMin : -param.zMin;
343  // make cell geometry
344  GlobalPoint refPoint(x, y, z); // center of the cell's face
345  std::vector<CCGFloat> cellParams;
346  cellParams.reserve(5);
347  cellParams.emplace_back(0.5 * (iEta - oEta)); // deta_half
348  cellParams.emplace_back(0.5 * param.dphi * DEGREE2RAD); // dphi_half
349  cellParams.emplace_back(0.5 * (param.zMax - param.zMin)); // dz_half
350  cellParams.emplace_back(fabs(refPoint.eta()));
351  cellParams.emplace_back(fabs(refPoint.z()));
352 #ifdef EDM_ML_DEBUG
353  edm::LogVerbatim("HCalGeom") << "HcalFlexiHardcodeGeometryLoader::fillHF-> " << hid << " " << hid.rawId() << " "
354  << std::hex << hid.rawId() << std::dec << " " << hid << " " << refPoint << '/'
355  << cellParams[0] << '/' << cellParams[1] << '/' << cellParams[2];
356 #endif
357  fGeometry->newCellFast(refPoint,
358  refPoint,
359  refPoint,
360  CaloCellGeometry::getParmPtr(cellParams, fGeometry->parMgr(), fGeometry->parVecVec()),
361  hid);
362  }
363  }
364 }
Log< level::Info, true > LogVerbatim
void tanh(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in])
T z() const
Definition: PV3DBase.h:61
std::vector< HFCellParameters > makeHFCells(const HcalDDDRecConstants &hcons)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
T eta() const
Definition: PV3DBase.h:73
std::vector< HECellParameters > makeHECells_H2()
std::vector< HcalEtaBin > getEtaBins(const int &itype) const
void allocatePar(ParVec::size_type n, unsigned int m)
std::vector< HBHOCellParameters > makeHBCells(const HcalDDDRecConstants &hcons)
std::vector< HFCellParameters > getHFCellParameters() const
U second(std::pair< T, U > const &p)
void newCellFast(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
std::vector< HBHOCellParameters > makeHOCells()
void sortValidIds()
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HcalTopologyMode::Mode mode() const
Definition: HcalTopology.h:30
CaloCellGeometry::CCGFloat CCGFloat
unsigned int getHFSize() const
Definition: HcalTopology.h:132
void fillHE(HcalGeometry *fGeometry, const std::vector< HECellParameters > &fCells)
static const CCGFloat * getParmPtr(const std::vector< CCGFloat > &vd, ParMgr *mgr, ParVecVec &pvv)
std::vector< HECellParameters > makeHECells(const HcalDDDRecConstants &hcons)
T perp() const
Magnitude of transverse component.
unsigned int ncells() const override
return a count of valid cells (for dense indexing use)
#define M_PI
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
unsigned int numberOfShapes() const override
Definition: HcalGeometry.h:42
CaloCellGeometry::CornersMgr * cornersMgr()
void increaseReserve(unsigned int extra)
void fillHBHO(HcalGeometry *fGeometry, const std::vector< HBHOCellParameters > &fCells, bool fHB)
ALPAKA_FN_ACC ALPAKA_FN_INLINE void uint32_t const uint32_t CACellT< TrackerTraits > uint32_t * nCells
CaloSubdetectorGeometry * load(const HcalTopology &fTopology, const HcalDDDRecConstants &hcons)
std::vector< std::pair< double, double > > getConstHBHE(const int &type) const
void allocateCorners(CaloCellGeometry::CornersVec::size_type n)
void fillHF(HcalGeometry *fGeometry, const std::vector< HFCellParameters > &fCells)