CMS 3D CMS Logo

HcalDDDSimConstants.cc
Go to the documentation of this file.
2 
6 
7 //#define EDM_ML_DEBUG
8 using namespace geant_units::operators;
9 
11 #ifdef EDM_ML_DEBUG
12  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants::HcalDDDSimConstants (const HcalParameters* hp) constructor";
13 #endif
14 
15  initialize();
16 #ifdef EDM_ML_DEBUG
17  std::vector<HcalCellType> cellTypes = HcalCellTypes();
18  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: " << cellTypes.size() << " cells of type HCal (All)";
19 #endif
20 }
21 
23 #ifdef EDM_ML_DEBUG
24  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants::destructed!!!";
25 #endif
26 }
27 
29  const int& idet, const int& zside, const int& depth, const int& etaR, const int& iphi) const {
30  double etaMn = hpar->etaMin[0];
31  double etaMx = hpar->etaMax[0];
32  if (idet == static_cast<int>(HcalEndcap)) {
33  etaMn = hpar->etaMin[1];
34  etaMx = hpar->etaMax[1];
35  } else if (idet == static_cast<int>(HcalForward)) {
36  etaMn = hpar->etaMin[2];
37  etaMx = hpar->etaMax[2];
38  }
39  double eta = 0, deta = 0, phi = 0, dphi = 0, rz = 0, drz = 0;
40  bool ok = false, flagrz = true;
41  if ((idet == static_cast<int>(HcalBarrel) || idet == static_cast<int>(HcalEndcap) ||
42  idet == static_cast<int>(HcalOuter) || idet == static_cast<int>(HcalForward)) &&
43  etaR >= etaMn && etaR <= etaMx && depth > 0)
44  ok = true;
45  if (idet == static_cast<int>(HcalEndcap) && depth > static_cast<int>(hpar->zHE.size()))
46  ok = false;
47  else if (idet == static_cast<int>(HcalBarrel) && depth > maxLayerHB_ + 1)
48  ok = false;
49  else if (idet == static_cast<int>(HcalOuter) && depth != 4)
50  ok = false;
51  else if (idet == static_cast<int>(HcalForward) && depth > maxDepth[2])
52  ok = false;
53  if (ok) {
54  eta = getEta(idet, etaR, zside, depth);
55  deta = deltaEta(idet, etaR, depth);
56  double fibin, fioff;
57  if (idet == static_cast<int>(HcalBarrel) || idet == static_cast<int>(HcalOuter)) {
58  fioff = hpar->phioff[0];
59  fibin = hpar->phibin[etaR - 1];
60  } else if (idet == static_cast<int>(HcalEndcap)) {
61  fioff = hpar->phioff[1];
62  fibin = hpar->phibin[etaR - 1];
63  } else {
64  fioff = hpar->phioff[2];
65  fibin = hpar->phitable[etaR - hpar->etaMin[2]];
66  if (unitPhi(fibin) > 2)
67  fioff = hpar->phioff[4];
68  }
69  phi = -fioff + (iphi - 0.5) * fibin;
70  dphi = 0.5 * fibin;
71  if (idet == static_cast<int>(HcalForward)) {
72  int ir = nR + hpar->etaMin[2] - etaR - 1;
73  if (ir > 0 && ir < nR) {
74  rz = 0.5 * (hpar->rTable[ir] + hpar->rTable[ir - 1]);
75  drz = 0.5 * (hpar->rTable[ir] - hpar->rTable[ir - 1]);
76  } else {
77  ok = false;
78 #ifdef EDM_ML_DEBUG
79  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: wrong eta " << etaR << " (" << ir << "/" << nR
80  << ") Detector " << idet;
81 #endif
82  }
83  } else if (etaR <= nEta) {
84  int laymin(depth), laymax(depth);
85  if (idet == static_cast<int>(HcalOuter)) {
86  laymin =
87  (etaR > hpar->noff[2]) ? (static_cast<int>(hpar->zHE.size())) : (static_cast<int>(hpar->zHE.size())) - 1;
88  laymax = (static_cast<int>(hpar->zHE.size()));
89  }
90  double d1 = 0, d2 = 0;
91  if (idet == static_cast<int>(HcalEndcap)) {
92  flagrz = false;
93  d1 = hpar->zHE[laymin - 1] - hpar->dzHE[laymin - 1];
94  d2 = hpar->zHE[laymax - 1] + hpar->dzHE[laymax - 1];
95  } else {
96  d1 = hpar->rHB[laymin - 1] - hpar->drHB[laymin - 1];
97  d2 = hpar->rHB[laymax - 1] + hpar->drHB[laymax - 1];
98  }
99  rz = 0.5 * (d2 + d1);
100  drz = 0.5 * (d2 - d1);
101  } else {
102  ok = false;
103  edm::LogWarning("HCalGeom") << "HcalDDDSimConstants: wrong depth " << depth << " or etaR " << etaR
104  << " for detector " << idet;
105  }
106  } else {
107  ok = false;
108  edm::LogWarning("HCalGeom") << "HcalDDDSimConstants: wrong depth " << depth << " det " << idet;
109  }
110  HcalCellType::HcalCell tmp(ok, eta, deta, phi, dphi, rz, drz, flagrz);
111 
112 #ifdef EDM_ML_DEBUG
113  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: det/side/depth/etaR/"
114  << "phi " << idet << "/" << zside << "/" << depth << "/" << etaR << "/" << iphi
115  << " Cell Flag " << tmp.ok << " " << tmp.eta << " " << tmp.deta << " phi " << tmp.phi
116  << " " << tmp.dphi << " r(z) " << tmp.rz << " " << tmp.drz << " " << tmp.flagrz;
117 #endif
118  return tmp;
119 }
120 
122  const int& det, const int& eta, const int& phi, const int& zside, const int& lay) const {
123  int depth = (ldmap_.isValid(det, phi, zside)) ? ldmap_.getDepth(det, eta, phi, zside, lay) : -1;
124  return depth;
125 }
126 
127 unsigned int HcalDDDSimConstants::findLayer(const int& layer,
128  const std::vector<HcalParameters::LayerItem>& layerGroup) const {
129  unsigned int id = layerGroup.size();
130  for (unsigned int i = 0; i < layerGroup.size(); i++) {
131  if (layer == static_cast<int>(layerGroup[i].layer)) {
132  id = i;
133  break;
134  }
135  }
136  return id;
137 }
138 
139 std::vector<std::pair<double, double> > HcalDDDSimConstants::getConstHBHE(const int& type) const {
140  std::vector<std::pair<double, double> > gcons;
141  if (type == 0) {
142  for (unsigned int i = 0; i < hpar->rHB.size(); ++i) {
143  gcons.emplace_back(std::pair<double, double>(hpar->rHB[i], hpar->drHB[i]));
144  }
145  } else {
146  for (unsigned int i = 0; i < hpar->zHE.size(); ++i) {
147  gcons.emplace_back(std::pair<double, double>(hpar->zHE[i], hpar->dzHE[i]));
148  }
149  }
150  return gcons;
151 }
152 
153 int HcalDDDSimConstants::getDepthEta16(const int& det, const int& phi, const int& zside) const {
154  int depth = ldmap_.getDepth16(det, phi, zside);
155  if (depth < 0)
156  depth = (det == 2) ? depthEta16[1] : depthEta16[0];
157 #ifdef EDM_ML_DEBUG
158  edm::LogVerbatim("HCalGeom") << "getDepthEta16: " << det << ":" << depth;
159 #endif
160  return depth;
161 }
162 
163 int HcalDDDSimConstants::getDepthEta16M(const int& det) const {
164  int depth = (det == 2) ? depthEta16[1] : depthEta16[0];
165  std::vector<int> phis;
166  int detsp = ldmap_.validDet(phis);
167  if (detsp == det) {
168  int zside = (phis[0] > 0) ? 1 : -1;
169  int iphi = (phis[0] > 0) ? phis[0] : -phis[0];
170  int depthsp = ldmap_.getDepth16(det, iphi, zside);
171  if (det == 1 && depthsp > depth)
172  depth = depthsp;
173  if (det == 2 && depthsp < depth)
174  depth = depthsp;
175  }
176  return depth;
177 }
178 
179 int HcalDDDSimConstants::getDepthEta29(const int& phi, const int& zside, const int& i) const {
180  int depth = (i == 0) ? ldmap_.getMaxDepthLastHE(2, phi, zside) : -1;
181  if (depth < 0)
182  depth = (i == 1) ? depthEta29[1] : depthEta29[0];
183  return depth;
184 }
185 
186 int HcalDDDSimConstants::getDepthEta29M(const int& i, const bool& planOne) const {
187  int depth = (i == 1) ? depthEta29[1] : depthEta29[0];
188  if (i == 0 && planOne) {
189  std::vector<int> phis;
190  int detsp = ldmap_.validDet(phis);
191  if (detsp == 2) {
192  int zside = (phis[0] > 0) ? 1 : -1;
193  int iphi = (phis[0] > 0) ? phis[0] : -phis[0];
194  int depthsp = ldmap_.getMaxDepthLastHE(2, iphi, zside);
195  if (depthsp > depth)
196  depth = depthsp;
197  }
198  }
199  return depth;
200 }
201 
202 std::pair<int, double> HcalDDDSimConstants::getDetEta(const double& eta, const int& depth) const {
203  int hsubdet(0), ieta(0);
204  double etaR(0);
205  double heta = fabs(eta);
206  for (int i = 0; i < nEta; i++)
207  if (heta > hpar->etaTable[i])
208  ieta = i + 1;
209  if (heta <= hpar->etaRange[1]) {
210  if (((ieta == hpar->etaMin[1] && depth == depthEta16[1]) || (ieta > hpar->etaMax[0])) &&
211  (ieta <= hpar->etaMax[1])) {
212  hsubdet = static_cast<int>(HcalEndcap);
213  } else {
214  hsubdet = static_cast<int>(HcalBarrel);
215  }
216  etaR = eta;
217  } else {
218  hsubdet = static_cast<int>(HcalForward);
219  double theta = 2. * atan(exp(-heta));
220  double hR = zVcal * tan(theta);
221  etaR = (eta >= 0. ? hR : -hR);
222  }
223  return std::pair<int, double>(hsubdet, etaR);
224 }
225 
226 int HcalDDDSimConstants::getEta(const int& det, const int& lay, const double& hetaR) const {
227  int ieta(0);
228  if (det == static_cast<int>(HcalForward)) { // Forward HCal
229  ieta = hpar->etaMax[2];
230  for (int i = nR - 1; i > 0; i--)
231  if (hetaR < hpar->rTable[i])
232  ieta = hpar->etaMin[2] + nR - i - 1;
233  } else { // Barrel or Endcap
234  ieta = 1;
235  for (int i = 0; i < nEta - 1; i++)
236  if (hetaR > hpar->etaTable[i])
237  ieta = i + 1;
238  if (det == static_cast<int>(HcalBarrel)) {
239  if (ieta > hpar->etaMax[0])
240  ieta = hpar->etaMax[0];
241  if (lay == maxLayer_) {
242  if (hetaR > etaHO[1] && ieta == hpar->noff[2])
243  ieta++;
244  }
245  } else if (det == static_cast<int>(HcalEndcap)) {
246  if (ieta <= hpar->etaMin[1])
247  ieta = hpar->etaMin[1];
248  }
249  }
250  return ieta;
251 }
252 
254  const int& det, int etaR, const int& phi, const int& zside, int depth, const int& lay) const {
255 #ifdef EDM_ML_DEBUG
256  edm::LogVerbatim("HCalGeom") << "HcalDDDEsimConstants:getEtaDepth: I/P " << det << ":" << etaR << ":" << phi << ":"
257  << zside << ":" << depth << ":" << lay;
258 #endif
259  //Modify the depth index
260  if ((det == static_cast<int>(HcalEndcap)) && (etaR == 17) && (lay == 1))
261  etaR = 18;
262  if (det == static_cast<int>(HcalForward)) { // Forward HCal
263  } else if (det == static_cast<int>(HcalOuter)) {
264  depth = 4;
265  } else {
266  if (lay >= 0) {
267  depth = layerGroup(det, etaR, phi, zside, lay - 1);
268  if (((det == 2) && (etaR == 18)) || ((det == 1) && (etaR == 15)))
269  if (etaR == hpar->noff[0] && lay > 1) {
270  int kphi = phi + static_cast<int>((hpar->phioff[3] + 0.1) / hpar->phibin[etaR - 1]);
271  kphi = (kphi - 1) % 4 + 1;
272  if (kphi == 2 || kphi == 3)
273  depth = layerGroup(det, etaR, phi, zside, lay - 2);
274  }
275  } else if (det == static_cast<int>(HcalBarrel)) {
276  if (depth > getMaxDepth(det, etaR, phi, zside, false))
277  depth = getMaxDepth(det, etaR, phi, zside, false);
278  }
279  if (etaR >= hpar->noff[1] && depth > getDepthEta29(phi, zside, 0)) {
280  etaR -= getDepthEta29(phi, zside, 1);
281  } else if (etaR == hpar->etaMin[1]) {
282  if (det == static_cast<int>(HcalBarrel)) {
283  if (depth > getDepthEta16(det, phi, zside))
284  depth = getDepthEta16(det, phi, zside);
285  } else {
286  if (depth < getDepthEta16(det, phi, zside))
287  depth = getDepthEta16(det, phi, zside);
288  }
289  }
290  }
291 #ifdef EDM_ML_DEBUG
292  edm::LogVerbatim("HCalGeom") << "HcalDDDEsimConstants:getEtaDepth: O/P " << etaR << ":" << depth;
293 #endif
294  return std::pair<int, int>(etaR, depth);
295 }
296 
297 double HcalDDDSimConstants::getEtaHO(const double& etaR, const double& x, const double& y, const double& z) const {
298  if (hpar->zHO.size() > 4) {
299  double eta = fabs(etaR);
300  double r = std::sqrt(x * x + y * y);
301  if (r > rminHO) {
302  double zz = fabs(z);
303  if (zz > hpar->zHO[3]) {
304  if (eta <= hpar->etaTable[10])
305  eta = hpar->etaTable[10] + 0.001;
306  } else if (zz > hpar->zHO[1]) {
307  if (eta <= hpar->etaTable[4])
308  eta = hpar->etaTable[4] + 0.001;
309  }
310  }
311  eta = (z >= 0. ? eta : -eta);
312 #ifdef EDM_ML_DEBUG
313  std::string chk = (eta != etaR) ? " **** Check *****" : " ";
314  edm::LogVerbatim("HCalGeom") << "R " << r << " Z " << z << " eta " << etaR << ":" << eta << chk;
315 #endif
316  return eta;
317  } else {
318  return etaR;
319  }
320 }
321 
322 int HcalDDDSimConstants::getFrontLayer(const int& det, const int& eta) const {
323  int lay = 0;
324  if (det == 1) {
325  if (std::abs(eta) == 16)
326  lay = layFHB[1];
327  else
328  lay = layFHB[0];
329  } else {
330  if (std::abs(eta) == 16)
331  lay = layFHE[1];
332  else if (std::abs(eta) == 18)
333  lay = layFHE[2];
334  else
335  lay = layFHE[0];
336  }
337  return lay;
338 }
339 
340 int HcalDDDSimConstants::getLastLayer(const int& det, const int& eta) const {
341  int lay = 0;
342  if (det == 1) {
343  if (std::abs(eta) == 15)
344  lay = layBHB[1];
345  else if (std::abs(eta) == 16)
346  lay = layBHB[2];
347  else
348  lay = layBHB[0];
349  } else {
350  if (std::abs(eta) == 16)
351  lay = layBHE[1];
352  else if (std::abs(eta) == 17)
353  lay = layBHE[2];
354  else if (std::abs(eta) == 18)
355  lay = layBHE[3];
356  else
357  lay = layBHE[0];
358  }
359  return lay;
360 }
361 
362 double HcalDDDSimConstants::getLayer0Wt(const int& det, const int& phi, const int& zside) const {
363  double wt = ldmap_.getLayer0Wt(det, phi, zside);
364  if (wt < 0)
365  wt = (det == 2) ? hpar->Layer0Wt[1] : hpar->Layer0Wt[0];
366  return wt;
367 }
368 
370  const int& det, const int& eta, const int& phi, const int& zside, const int& depth) const {
371  int layer = ldmap_.getLayerFront(det, eta, phi, zside, depth);
372  if (layer < 0) {
373  if (det == 1 || det == 2) {
374  layer = 1;
375  for (int l = 0; l < getLayerMax(eta, depth); ++l) {
376  if (static_cast<int>(layerGroup(eta - 1, l)) == depth) {
377  layer = l + 1;
378  break;
379  }
380  }
381  } else {
382  layer = (eta > hpar->noff[2]) ? maxLayerHB_ + 1 : maxLayer_;
383  }
384  }
385  return layer;
386 }
387 
389  const int& det, const int& eta, const int& phi, const int& zside, const int& depth) const {
390  int layer = ldmap_.getLayerBack(det, eta, phi, zside, depth);
391  if (layer < 0) {
392  if (det == 1 || det == 2) {
393  layer = depths[depth - 1][eta - 1];
394  } else {
395  layer = maxLayer_;
396  }
397  }
398  return layer;
399 }
400 
401 int HcalDDDSimConstants::getLayerMax(const int& eta, const int& depth) const {
402  int layermx = ((eta < hpar->etaMin[1]) && depth - 1 < maxDepth[0]) ? maxLayerHB_ + 1
403  : static_cast<int>(layerGroupSize(eta - 1));
404  return layermx;
405 }
406 
408  const int& det, const int& eta, const int& phi, const int& zside, const bool& partialDetOnly) const {
409  int dmax(-1);
410  if (partialDetOnly) {
411  if (ldmap_.isValid(det, phi, zside)) {
412  dmax = ldmap_.getDepths(eta).second;
413  }
414  } else if (det == 1 || det == 2) {
415  if (ldmap_.isValid(det, phi, zside))
416  dmax = ldmap_.getDepths(eta).second;
417  else if (det == 2)
418  dmax = (maxDepth[1] > 0) ? layerGroup(eta - 1, maxLayer_) : 0;
419  else if (eta == hpar->etaMax[0])
420  dmax = getDepthEta16(det, phi, zside);
421  else
422  dmax = layerGroup(eta - 1, maxLayerHB_);
423  } else if (det == 3) { // HF
424  dmax = maxHFDepth(zside * eta, phi);
425  } else if (det == 4) { // HO
426  dmax = maxDepth[3];
427  } else {
428  dmax = -1;
429  }
430  return dmax;
431 }
432 
434  const int& det, const int& eta, const int& phi, const int& zside, const bool& partialDetOnly) const {
435  int lmin(-1);
436  if (partialDetOnly) {
437  if (ldmap_.isValid(det, phi, zside)) {
438  lmin = ldmap_.getDepths(eta).first;
439  }
440  } else if (det == 3) { // HF
441  lmin = 1;
442  } else if (det == 4) { // HO
443  lmin = maxDepth[3];
444  } else {
445  if (ldmap_.isValid(det, phi, zside)) {
446  lmin = ldmap_.getDepths(eta).first;
447  } else if (layerGroupSize(eta - 1) > 0) {
448  lmin = static_cast<int>(layerGroup(eta - 1, 0));
449  unsigned int type = (det == 1) ? 0 : 1;
450  if (type == 1 && eta == hpar->etaMin[1])
451  lmin = getDepthEta16(det, phi, zside);
452  } else {
453  lmin = 1;
454  }
455  }
456  return lmin;
457 }
458 
459 std::pair<int, int> HcalDDDSimConstants::getModHalfHBHE(const int& type) const {
460  if (type == 0) {
461  return std::pair<int, int>(nmodHB, nzHB);
462  } else {
463  return std::pair<int, int>(nmodHE, nzHE);
464  }
465 }
466 
467 std::pair<double, double> HcalDDDSimConstants::getPhiCons(const int& det, const int& ieta) const {
468  double fioff(0), fibin(0);
469  if (det == static_cast<int>(HcalForward)) { // Forward HCal
470  fioff = hpar->phioff[2];
471  fibin = hpar->phitable[ieta - hpar->etaMin[2]];
472  if (unitPhi(fibin) > 2) { // HF double-phi
473  fioff = hpar->phioff[4];
474  }
475  } else { // Barrel or Endcap
476  if (det == static_cast<int>(HcalEndcap)) {
477  fioff = hpar->phioff[1];
478  } else {
479  fioff = hpar->phioff[0];
480  }
481  fibin = hpar->phibin[ieta - 1];
482  }
483  return std::pair<double, double>(fioff, fibin);
484 }
485 
486 std::vector<std::pair<int, double> > HcalDDDSimConstants::getPhis(const int& subdet, const int& ieta) const {
487  std::vector<std::pair<int, double> > phis;
488  int ietaAbs = (ieta > 0) ? ieta : -ieta;
489  std::pair<double, double> ficons = getPhiCons(subdet, ietaAbs);
490  int nphi = int((2._pi + 0.1 * ficons.second) / ficons.second);
491  int units = unitPhi(subdet, ietaAbs);
492  for (int ifi = 0; ifi < nphi; ++ifi) {
493  double phi = -ficons.first + (ifi + 0.5) * ficons.second;
494  int iphi = phiNumber(ifi + 1, units);
495  phis.emplace_back(std::pair<int, double>(iphi, phi));
496  }
497 #ifdef EDM_ML_DEBUG
498  edm::LogVerbatim("HCalGeom") << "getPhis: subdet|ieta|iphi " << subdet << "|" << ieta << " with " << phis.size()
499  << " phi bins";
500  for (unsigned int k = 0; k < phis.size(); ++k)
501  edm::LogVerbatim("HCalGeom") << "[" << k << "] iphi " << phis[k].first << " phi "
502  << convertRadToDeg(phis[k].second);
503 #endif
504  return phis;
505 }
506 
507 std::vector<HcalCellType> HcalDDDSimConstants::HcalCellTypes() const {
508  std::vector<HcalCellType> cellTypes = HcalCellTypes(HcalBarrel);
509 #ifdef EDM_ML_DEBUG
510  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: " << cellTypes.size() << " cells of type HCal Barrel";
511  for (unsigned int i = 0; i < cellTypes.size(); i++)
512  edm::LogVerbatim("HCalGeom") << "Cell " << i << " " << cellTypes[i];
513 #endif
514 
515  std::vector<HcalCellType> hoCells = HcalCellTypes(HcalOuter);
516 #ifdef EDM_ML_DEBUG
517  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: " << hoCells.size() << " cells of type HCal Outer";
518  for (unsigned int i = 0; i < hoCells.size(); i++)
519  edm::LogVerbatim("HCalGeom") << "Cell " << i << " " << hoCells[i];
520 #endif
521  cellTypes.insert(cellTypes.end(), hoCells.begin(), hoCells.end());
522 
523  std::vector<HcalCellType> heCells = HcalCellTypes(HcalEndcap);
524 #ifdef EDM_ML_DEBUG
525  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: " << heCells.size() << " cells of type HCal Endcap";
526  for (unsigned int i = 0; i < heCells.size(); i++)
527  edm::LogVerbatim("HCalGeom") << "Cell " << i << " " << heCells[i];
528 #endif
529  cellTypes.insert(cellTypes.end(), heCells.begin(), heCells.end());
530 
531  std::vector<HcalCellType> hfCells = HcalCellTypes(HcalForward);
532 #ifdef EDM_ML_DEBUG
533  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: " << hfCells.size() << " cells of type HCal Forward";
534  for (unsigned int i = 0; i < hfCells.size(); i++)
535  edm::LogVerbatim("HCalGeom") << "Cell " << i << " " << hfCells[i];
536 #endif
537  cellTypes.insert(cellTypes.end(), hfCells.begin(), hfCells.end());
538 
539  return cellTypes;
540 }
541 
542 std::vector<HcalCellType> HcalDDDSimConstants::HcalCellTypes(const HcalSubdetector& subdet,
543  int ieta,
544  int depthl) const {
545  std::vector<HcalCellType> cellTypes;
546  if (subdet == HcalForward) {
547  if (dzVcal < 0)
548  return cellTypes;
549  }
550 
551  int dmin, dmax, indx, nz;
552  double hsize = 0;
553  switch (subdet) {
554  case HcalEndcap:
555  dmin = 1;
556  dmax = (maxDepth[1] > 0) ? maxLayer_ + 1 : 0;
557  indx = 1;
558  nz = nzHE;
559  break;
560  case HcalForward:
561  dmin = 1;
562  dmax = (!idHF2QIE.empty()) ? 2 : maxDepth[2];
563  indx = 2;
564  nz = 2;
565  break;
566  case HcalOuter:
567  dmin = 4;
568  dmax = 4;
569  indx = 0;
570  nz = nzHB;
571  break;
572  default:
573  dmin = 1;
574  dmax = maxLayerHB_ + 1;
575  indx = 0;
576  nz = nzHB;
577  break;
578  }
579  if (depthl > 0)
580  dmin = dmax = depthl;
581  int ietamin = (ieta > 0) ? ieta : hpar->etaMin[indx];
582  int ietamax = (ieta > 0) ? ieta : hpar->etaMax[indx];
583  int phi = (indx == 2) ? 3 : 1;
584 
585  // Get the Cells
586  int subdet0 = static_cast<int>(subdet);
587  for (int depth = dmin; depth <= dmax; depth++) {
588  int shift = getShift(subdet, depth);
589  double gain = getGain(subdet, depth);
590  if (subdet == HcalForward) {
591  if (depth % 2 == 1)
592  hsize = dzVcal;
593  else
594  hsize = dzVcal - 0.5 * dlShort;
595  }
596  for (int eta = ietamin; eta <= ietamax; eta++) {
597  for (int iz = 0; iz < nz; ++iz) {
598  int zside = -2 * iz + 1;
599  HcalCellType::HcalCell temp1 = cell(subdet0, zside, depth, eta, phi);
600  if (temp1.ok) {
601  std::vector<std::pair<int, double> > phis = getPhis(subdet0, eta);
602  HcalCellType temp2(subdet, eta, zside, depth, temp1, shift, gain, hsize);
603  double dphi, fioff;
604  std::vector<int> phiMiss2;
605  if ((subdet == HcalBarrel) || (subdet == HcalOuter)) {
606  fioff = hpar->phioff[0];
607  dphi = hpar->phibin[eta - 1];
608  if (subdet == HcalOuter) {
609  if (eta == hpar->noff[4]) {
610  int kk = (iz == 0) ? 7 : (7 + hpar->noff[5]);
611  for (int miss = 0; miss < hpar->noff[5 + iz]; miss++) {
612  phiMiss2.emplace_back(hpar->noff[kk]);
613  kk++;
614  }
615  }
616  }
617  } else if (subdet == HcalEndcap) {
618  fioff = hpar->phioff[1];
619  dphi = hpar->phibin[eta - 1];
620  } else {
621  fioff = hpar->phioff[2];
622  dphi = hpar->phitable[eta - hpar->etaMin[2]];
623  if (unitPhi(dphi) > 2)
624  fioff = hpar->phioff[4];
625  }
626  int unit = unitPhi(dphi);
627  temp2.setPhi(phis, phiMiss2, fioff, dphi, unit);
628  cellTypes.emplace_back(temp2);
629  // For HF look at extra cells
630  if ((subdet == HcalForward) && (!idHF2QIE.empty())) {
631  HcalCellType temp3(subdet, eta, zside + 2, depth, temp1, shift, gain, hsize);
632  std::vector<int> phiMiss3;
633  for (auto& phi : phis) {
634  bool ok(false);
635  for (auto l : idHF2QIE) {
636  if ((eta * zside == l.ieta()) && (phi.first == l.iphi())) {
637  ok = true;
638  break;
639  }
640  }
641  if (!ok)
642  phiMiss3.emplace_back(phi.first);
643  }
644  dphi = hpar->phitable[eta - hpar->etaMin[2]];
645  unit = unitPhi(dphi);
646  fioff = (unit > 2) ? hpar->phioff[4] : hpar->phioff[2];
647  temp3.setPhi(phis, phiMiss2, fioff, dphi, unit);
648  cellTypes.emplace_back(temp3);
649  }
650  }
651  }
652  }
653  }
654  return cellTypes;
655 }
656 
657 int HcalDDDSimConstants::maxHFDepth(const int& eta, const int& iphi) const {
658  int mxdepth = maxDepth[2];
659  if (!idHF2QIE.empty()) {
660  bool ok(false);
661  for (auto k : idHF2QIE) {
662  if ((eta == k.ieta()) && (iphi == k.iphi())) {
663  ok = true;
664  break;
665  }
666  }
667  if (!ok)
668  mxdepth = 2;
669  }
670  return mxdepth;
671 }
672 
673 unsigned int HcalDDDSimConstants::numberOfCells(const HcalSubdetector& subdet) const {
674  unsigned int num = 0;
675  std::vector<HcalCellType> cellTypes = HcalCellTypes(subdet);
676  for (auto& cellType : cellTypes) {
677  num += static_cast<unsigned int>(cellType.nPhiBins());
678  }
679 #ifdef EDM_ML_DEBUG
680  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants:numberOfCells " << cellTypes.size() << " " << num
681  << " for subdetector " << subdet;
682 #endif
683  return num;
684 }
685 
686 int HcalDDDSimConstants::phiNumber(const int& phi, const int& units) const {
687  int iphi_skip = phi;
688  if (units == 2)
689  iphi_skip = (phi - 1) * 2 + 1;
690  else if (units == 4)
691  iphi_skip = (phi - 1) * 4 - 1;
692  if (iphi_skip < 0)
693  iphi_skip += 72;
694  return iphi_skip;
695 }
696 
698  std::vector<int> phis;
699  int detsp = ldmap_.validDet(phis);
700  int kphi = (detsp > 0) ? phis[0] : 1;
701  int zside = (kphi > 0) ? 1 : -1;
702  int iphi = (kphi > 0) ? kphi : -kphi;
703  edm::LogVerbatim("HCalGeom") << "Tile Information for HB from " << hpar->etaMin[0] << " to " << hpar->etaMax[0];
704  for (int eta = hpar->etaMin[0]; eta <= hpar->etaMax[0]; eta++) {
705  int dmax = getMaxDepth(1, eta, iphi, -zside, false);
706  for (int depth = 1; depth <= dmax; depth++)
708  if (detsp == 1) {
709  int dmax = getMaxDepth(1, eta, iphi, zside, false);
710  for (int depth = 1; depth <= dmax; depth++)
712  }
713  }
714 
715  edm::LogVerbatim("HCalGeom") << "\nTile Information for HE from " << hpar->etaMin[1] << " to " << hpar->etaMax[1];
716  for (int eta = hpar->etaMin[1]; eta <= hpar->etaMax[1]; eta++) {
717  int dmin = (eta == hpar->etaMin[1]) ? getDepthEta16(2, iphi, -zside) : 1;
718  int dmax = getMaxDepth(2, eta, iphi, -zside, false);
719  for (int depth = dmin; depth <= dmax; depth++)
721  if (detsp == 2) {
722  int dmax = getMaxDepth(2, eta, iphi, zside, false);
723  for (int depth = 1; depth <= dmax; depth++)
725  }
726  }
727 }
728 
729 int HcalDDDSimConstants::unitPhi(const int& det, const int& etaR) const {
730  double dphi =
731  (det == static_cast<int>(HcalForward)) ? hpar->phitable[etaR - hpar->etaMin[2]] : hpar->phibin[etaR - 1];
732  return unitPhi(dphi);
733 }
734 
735 int HcalDDDSimConstants::unitPhi(const double& dphi) const {
736  const double fiveDegInRad = 2 * M_PI / 72;
737  int units = int(dphi / fiveDegInRad + 0.5);
738  if (units < 1)
739  units = 1;
740  return units;
741 }
742 
744  nEta = hpar->etaTable.size();
745  nR = hpar->rTable.size();
746  nPhiF = nR - 1;
747  isBH_ = false;
748 
749 #ifdef EDM_ML_DEBUG
750  for (int i = 0; i < nEta - 1; ++i) {
751  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants:Read LayerGroup" << i << ":";
752  for (unsigned int k = 0; k < layerGroupSize(i); k++)
753  edm::LogVerbatim("HCalGeom") << " [" << k << "] = " << layerGroup(i, k);
754  }
755 #endif
756 
757  // Geometry parameters for HF
758  dlShort = hpar->gparHF[0];
759  zVcal = hpar->gparHF[4];
760  dzVcal = hpar->dzVcal;
761 #ifdef EDM_ML_DEBUG
762  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants: dlShort " << dlShort << " zVcal " << zVcal << " and dzVcal "
763  << dzVcal;
764 #endif
765 
766  //Transform some of the parameters
768  maxDepth[0] = maxDepth[1] = 0;
769  for (int i = 0; i < nEta - 1; ++i) {
770  unsigned int imx = layerGroupSize(i);
771  int laymax = (imx > 0) ? layerGroup(i, imx - 1) : 0;
772  if (i < hpar->etaMax[0]) {
773  int laymax0 = (imx > 16) ? layerGroup(i, 16) : laymax;
774  if (i + 1 == hpar->etaMax[0] && laymax0 > 2)
775  laymax0 = 2;
776  if (maxDepth[0] < laymax0)
777  maxDepth[0] = laymax0;
778  }
779  if (i >= hpar->etaMin[1] - 1 && i < hpar->etaMax[1]) {
780  if (maxDepth[1] < laymax)
781  maxDepth[1] = laymax;
782  }
783  }
784 #ifdef EDM_ML_DEBUG
785  for (int i = 0; i < 4; ++i)
786  edm::LogVerbatim("HCalGeom") << "Detector Type [" << i << "] iEta " << hpar->etaMin[i] << ":" << hpar->etaMax[i]
787  << " MaxDepth " << maxDepth[i];
788 #endif
789 
790  int maxdepth = (maxDepth[1] > maxDepth[0]) ? maxDepth[1] : maxDepth[0];
791  for (int i = 0; i < maxdepth; ++i) {
792  for (int k = 0; k < nEta - 1; ++k) {
793  int layermx = getLayerMax(k + 1, i + 1);
794  int ll = layermx;
795  for (int l = layermx - 1; l >= 0; --l) {
796  if (static_cast<int>(layerGroup(k, l)) == i + 1) {
797  ll = l + 1;
798  break;
799  }
800  }
801  depths[i].emplace_back(ll);
802  }
803 
804 #ifdef EDM_ML_DEBUG
805  edm::LogVerbatim("HCalGeom") << "Depth " << i + 1 << " with " << depths[i].size() << " etas:";
806  for (int k = 0; k < nEta - 1; ++k)
807  edm::LogVerbatim("HCalGeom") << " [" << k << "] " << depths[i][k];
808 #endif
809  }
810 
811  nzHB = hpar->modHB[1];
812  nmodHB = hpar->modHB[0];
813  nzHE = hpar->modHE[1];
814  nmodHE = hpar->modHE[0];
815 #ifdef EDM_ML_DEBUG
816  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants:: " << nzHB << ":" << nmodHB << " barrel and " << nzHE << ":"
817  << nmodHE << " endcap half-sectors";
818 #endif
819 
820  if (hpar->rHB.size() > maxLayerHB_ + 1 && hpar->zHO.size() > 4) {
821  rminHO = hpar->rHO[0];
822  for (int k = 0; k < 4; ++k)
823  etaHO[k] = hpar->rHO[k + 1];
824  } else {
825  rminHO = -1.0;
826  etaHO[0] = hpar->etaTable[4];
827  etaHO[1] = hpar->etaTable[4];
828  etaHO[2] = hpar->etaTable[10];
829  etaHO[3] = hpar->etaTable[10];
830  }
831 #ifdef EDM_ML_DEBUG
832  edm::LogVerbatim("HCalGeom") << "HO Eta boundaries " << etaHO[0] << " " << etaHO[1] << " " << etaHO[2] << " "
833  << etaHO[3];
834  edm::LogVerbatim("HCalGeom") << "HO Parameters " << rminHO << " " << hpar->zHO.size();
835  for (int i = 0; i < 4; ++i)
836  edm::LogVerbatim("HCalGeom") << " eta[" << i << "] = " << etaHO[i];
837  for (unsigned int i = 0; i < hpar->zHO.size(); ++i)
838  edm::LogVerbatim("HCalGeom") << " zHO[" << i << "] = " << hpar->zHO[i];
839 #endif
840 
841  int noffsize = 7 + hpar->noff[5] + hpar->noff[6];
842  int noffl(noffsize + 5);
843  if (static_cast<int>(hpar->noff.size()) > (noffsize + 3)) {
844  depthEta16[0] = hpar->noff[noffsize];
845  depthEta16[1] = hpar->noff[noffsize + 1];
846  depthEta29[0] = hpar->noff[noffsize + 2];
847  depthEta29[1] = hpar->noff[noffsize + 3];
848  if (static_cast<int>(hpar->noff.size()) > (noffsize + 4)) {
849  noffl += (2 * hpar->noff[noffsize + 4]);
850  if (static_cast<int>(hpar->noff.size()) > noffl)
851  isBH_ = (hpar->noff[noffl] > 0);
852  }
853  } else {
854  depthEta16[0] = 2;
855  depthEta16[1] = 3;
856  depthEta29[0] = 2;
857  depthEta29[1] = 1;
858  }
859 #ifdef EDM_ML_DEBUG
860  edm::LogVerbatim("HCalGeom") << "isBH_ " << hpar->noff.size() << ":" << noffsize << ":" << noffl << ":" << isBH_;
861  edm::LogVerbatim("HCalGeom") << "Depth index at ieta = 16 for HB (max) " << depthEta16[0] << " HE (min) "
862  << depthEta16[1] << "; max depth for itea = 29 : (" << depthEta29[0] << ":"
863  << depthEta29[1] << ")";
864 #endif
865 
866  if (static_cast<int>(hpar->noff.size()) > (noffsize + 4)) {
867  int npair = hpar->noff[noffsize + 4];
868  int kk = noffsize + 4;
869  for (int k = 0; k < npair; ++k) {
870  idHF2QIE.emplace_back(HcalDetId(HcalForward, hpar->noff[kk + 1], hpar->noff[kk + 2], 1));
871  kk += 2;
872  }
873  }
874 #ifdef EDM_ML_DEBUG
875  edm::LogVerbatim("HCalGeom") << idHF2QIE.size() << " detector channels having 2 QIE cards:";
876  for (unsigned int k = 0; k < idHF2QIE.size(); ++k)
877  edm::LogVerbatim("HCalGeom") << " [" << k << "] " << idHF2QIE[k];
878 #endif
879 
880  layFHB[0] = 0;
881  layFHB[1] = 1;
882  layBHB[0] = 16;
883  layBHB[1] = 15;
884  layBHB[2] = 8;
885  if (maxDepth[1] == 0) {
886  layFHE[0] = layFHE[1] = layFHE[2] = 0;
887  layBHE[0] = layBHE[1] = layBHE[2] = layBHE[3] = 0;
888  } else {
889  layFHE[0] = 1;
890  layFHE[1] = 4;
891  layFHE[2] = 0;
892  layBHE[0] = 18;
893  layBHE[1] = 9;
894  layBHE[2] = 14;
895  layBHE[3] = 16;
896  }
897  depthMaxSp_ = std::pair<int, int>(0, 0);
898  int noffk(noffsize + 5);
899  if (static_cast<int>(hpar->noff.size()) > (noffsize + 5)) {
900  noffk += (2 * hpar->noff[noffsize + 4]);
901  if (static_cast<int>(hpar->noff.size()) >= noffk + 7) {
902  int dtype = hpar->noff[noffk + 1];
903  int nphi = hpar->noff[noffk + 2];
904  int ndeps = hpar->noff[noffk + 3];
905  int ndp16 = hpar->noff[noffk + 4];
906  int ndp29 = hpar->noff[noffk + 5];
907  double wt = 0.1 * (hpar->noff[noffk + 6]);
908  if (static_cast<int>(hpar->noff.size()) >= (noffk + 7 + nphi + 3 * ndeps)) {
909  if (dtype == 1 || dtype == 2) {
910  std::vector<int> ifi, iet, ily, idp;
911  for (int i = 0; i < nphi; ++i)
912  ifi.emplace_back(hpar->noff[noffk + 7 + i]);
913  for (int i = 0; i < ndeps; ++i) {
914  iet.emplace_back(hpar->noff[noffk + 7 + nphi + 3 * i]);
915  ily.emplace_back(hpar->noff[noffk + 7 + nphi + 3 * i + 1]);
916  idp.emplace_back(hpar->noff[noffk + 7 + nphi + 3 * i + 2]);
917  }
918 #ifdef EDM_ML_DEBUG
919  edm::LogVerbatim("HCalGeom") << "Initialize HcalLayerDepthMap for "
920  << "Detector " << dtype << " etaMax " << hpar->etaMax[dtype] << " with " << nphi
921  << " sectors";
922  for (int i = 0; i < nphi; ++i)
923  edm::LogVerbatim("HCalGeom") << " [" << i << "] " << ifi[i];
924  edm::LogVerbatim("HCalGeom") << "And " << ndeps << " depth sections";
925  for (int i = 0; i < ndeps; ++i)
926  edm::LogVerbatim("HCalGeom") << " [" << i << "] " << iet[i] << " " << ily[i] << " " << idp[i];
927  edm::LogVerbatim("HCalGeom") << "Maximum depth for last HE Eta tower " << depthEta29[0] << ":" << ndp16 << ":"
928  << ndp29 << " L0 Wt " << hpar->Layer0Wt[dtype - 1] << ":" << wt;
929 #endif
930  ldmap_.initialize(dtype, hpar->etaMax[dtype - 1], ndp16, ndp29, wt, ifi, iet, ily, idp);
931  int zside = (ifi[0] > 0) ? 1 : -1;
932  int iphi = (ifi[0] > 0) ? ifi[0] : -ifi[0];
933  depthMaxSp_ = std::pair<int, int>(dtype, ldmap_.getDepthMax(dtype, iphi, zside));
934  }
935  }
936  int noffm = (noffk + 7 + nphi + 3 * ndeps);
937  if (static_cast<int>(hpar->noff.size()) > noffm) {
938  int ndnext = hpar->noff[noffm];
939  if (ndnext > 4 && static_cast<int>(hpar->noff.size()) >= noffm + ndnext) {
940  for (int i = 0; i < 2; ++i)
941  layFHB[i] = hpar->noff[noffm + i + 1];
942  for (int i = 0; i < 3; ++i)
943  layFHE[i] = hpar->noff[noffm + i + 3];
944  }
945  if (ndnext > 11 && static_cast<int>(hpar->noff.size()) >= noffm + ndnext) {
946  for (int i = 0; i < 3; ++i)
947  layBHB[i] = hpar->noff[noffm + i + 6];
948  for (int i = 0; i < 4; ++i)
949  layBHE[i] = hpar->noff[noffm + i + 9];
950  }
951  }
952  }
953  }
954 #ifdef EDM_ML_DEBUG
955  edm::LogVerbatim("HCalGeom") << "Front Layer Definition for HB: " << layFHB[0] << ":" << layFHB[1]
956  << " and for HE: " << layFHE[0] << ":" << layFHE[1] << ":" << layFHE[2];
957  edm::LogVerbatim("HCalGeom") << "Last Layer Definition for HB: " << layBHB[0] << ":" << layBHB[1] << ":" << layBHB[2]
958  << " and for HE: " << layBHE[0] << ":" << layBHE[1] << ":" << layBHE[2] << ":"
959  << layBHE[3];
960 #endif
961  if (depthMaxSp_.first == 0) {
962  depthMaxSp_ = depthMaxDf_ = std::pair<int, int>(2, maxDepth[1]);
963  } else if (depthMaxSp_.first == 1) {
964  depthMaxDf_ = std::pair<int, int>(1, maxDepth[0]);
965  if (depthMaxSp_.second > maxDepth[0])
966  maxDepth[0] = depthMaxSp_.second;
967  } else {
968  depthMaxDf_ = std::pair<int, int>(2, maxDepth[1]);
969  if (depthMaxSp_.second > maxDepth[1])
970  maxDepth[1] = depthMaxSp_.second;
971  }
972 #ifdef EDM_ML_DEBUG
973  edm::LogVerbatim("HCalGeom") << "Detector type and maximum depth for all RBX " << depthMaxDf_.first << ":"
974  << depthMaxDf_.second << " and for special RBX " << depthMaxSp_.first << ":"
975  << depthMaxSp_.second;
976 #endif
977 }
978 
979 double HcalDDDSimConstants::deltaEta(const int& det, const int& etaR, const int& depth) const {
980  double tmp = 0;
981  if (det == static_cast<int>(HcalForward)) {
982  int ir = nR + hpar->etaMin[2] - etaR - 1;
983  if (ir > 0 && ir < nR) {
984  double z = zVcal;
985  if (depth % 2 != 1)
986  z += dlShort;
987  tmp = 0.5 * (getEta(hpar->rTable[ir - 1], z) - getEta(hpar->rTable[ir], z));
988  }
989  } else {
990  if (etaR > 0 && etaR < nEta) {
991  if (etaR == hpar->noff[1] - 1 && depth > depthEta29[0]) {
992  tmp = 0.5 * (hpar->etaTable[etaR + 1] - hpar->etaTable[etaR - 1]);
993  } else if (det == static_cast<int>(HcalOuter)) {
994  if (etaR == hpar->noff[2]) {
995  tmp = 0.5 * (etaHO[0] - hpar->etaTable[etaR - 1]);
996  } else if (etaR == hpar->noff[2] + 1) {
997  tmp = 0.5 * (hpar->etaTable[etaR] - etaHO[1]);
998  } else if (etaR == hpar->noff[3]) {
999  tmp = 0.5 * (etaHO[2] - hpar->etaTable[etaR - 1]);
1000  } else if (etaR == hpar->noff[3] + 1) {
1001  tmp = 0.5 * (hpar->etaTable[etaR] - etaHO[3]);
1002  } else {
1003  tmp = 0.5 * (hpar->etaTable[etaR] - hpar->etaTable[etaR - 1]);
1004  }
1005  } else {
1006  tmp = 0.5 * (hpar->etaTable[etaR] - hpar->etaTable[etaR - 1]);
1007  }
1008  }
1009  }
1010 #ifdef EDM_ML_DEBUG
1011  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants::deltaEta " << etaR << " " << depth << " ==> " << tmp;
1012 #endif
1013  return tmp;
1014 }
1015 
1016 double HcalDDDSimConstants::getEta(const int& det, const int& etaR, const int& zside, int depth) const {
1017  double tmp = 0;
1018  if (det == static_cast<int>(HcalForward)) {
1019  int ir = nR + hpar->etaMin[2] - etaR - 1;
1020  if (ir > 0 && ir < nR) {
1021  double z = zVcal;
1022  if (depth % 2 != 1)
1023  z += dlShort;
1024  tmp = 0.5 * (getEta(hpar->rTable[ir - 1], z) + getEta(hpar->rTable[ir], z));
1025  }
1026  } else {
1027  if (etaR > 0 && etaR < nEta) {
1028  if (etaR == hpar->noff[1] - 1 && depth > depthEta29[0]) {
1029  tmp = 0.5 * (hpar->etaTable[etaR + 1] + hpar->etaTable[etaR - 1]);
1030  } else if (det == static_cast<int>(HcalOuter)) {
1031  if (etaR == hpar->noff[2]) {
1032  tmp = 0.5 * (etaHO[0] + hpar->etaTable[etaR - 1]);
1033  } else if (etaR == hpar->noff[2] + 1) {
1034  tmp = 0.5 * (hpar->etaTable[etaR] + etaHO[1]);
1035  } else if (etaR == hpar->noff[3]) {
1036  tmp = 0.5 * (etaHO[2] + hpar->etaTable[etaR - 1]);
1037  } else if (etaR == hpar->noff[3] + 1) {
1038  tmp = 0.5 * (hpar->etaTable[etaR] + etaHO[3]);
1039  } else {
1040  tmp = 0.5 * (hpar->etaTable[etaR] + hpar->etaTable[etaR - 1]);
1041  }
1042  } else {
1043  tmp = 0.5 * (hpar->etaTable[etaR] + hpar->etaTable[etaR - 1]);
1044  }
1045  }
1046  }
1047  if (zside == 0)
1048  tmp = -tmp;
1049 #ifdef EDM_ML_DEBUG
1050  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants::getEta " << etaR << " " << zside << " " << depth << " ==> "
1051  << tmp;
1052 #endif
1053  return tmp;
1054 }
1055 
1056 double HcalDDDSimConstants::getEta(const double& r, const double& z) const {
1057  double tmp = 0;
1058  if (z != 0)
1059  tmp = -log(tan(0.5 * atan(r / z)));
1060 #ifdef EDM_ML_DEBUG
1061  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants::getEta " << r << " " << z << " ==> " << tmp;
1062 #endif
1063  return tmp;
1064 }
1065 
1066 int HcalDDDSimConstants::getShift(const HcalSubdetector& subdet, const int& depth) const {
1067  int shift;
1068  switch (subdet) {
1069  case HcalEndcap:
1070  shift = hpar->HEShift[0];
1071  break;
1072  case HcalForward:
1073  shift = hpar->HFShift[(depth - 1) % 2];
1074  break;
1075  case HcalOuter:
1076  shift = hpar->HBShift[3];
1077  break;
1078  default:
1079  shift = hpar->HBShift[0];
1080  break;
1081  }
1082  return shift;
1083 }
1084 
1085 double HcalDDDSimConstants::getGain(const HcalSubdetector& subdet, const int& depth) const {
1086  double gain;
1087  switch (subdet) {
1088  case HcalEndcap:
1089  gain = hpar->HEGains[0];
1090  break;
1091  case HcalForward:
1092  gain = hpar->HFGains[(depth - 1) % 2];
1093  break;
1094  case HcalOuter:
1095  gain = hpar->HBGains[3];
1096  break;
1097  default:
1098  gain = hpar->HBGains[0];
1099  break;
1100  }
1101  return gain;
1102 }
1103 
1104 void HcalDDDSimConstants::printTileHB(const int& eta, const int& phi, const int& zside, const int& depth) const {
1105  edm::LogVerbatim("HCalGeom") << "HcalDDDSimConstants::printTileHB for eta " << eta << " and depth " << depth;
1106 
1107  double etaL = hpar->etaTable.at(eta - 1);
1108  double thetaL = 2. * atan(exp(-etaL));
1109  double etaH = hpar->etaTable.at(eta);
1110  double thetaH = 2. * atan(exp(-etaH));
1111  int layL = getLayerFront(1, eta, phi, zside, depth);
1112  int layH = getLayerBack(1, eta, phi, zside, depth);
1113  edm::LogVerbatim("HCalGeom") << "\ntileHB:: eta|depth " << zside * eta << "|" << depth << " theta "
1114  << convertRadToDeg(thetaH) << ":" << convertRadToDeg(thetaL) << " Layer " << layL - 1
1115  << ":" << layH - 1;
1116  for (int lay = layL - 1; lay < layH; ++lay) {
1117  std::vector<double> area(2, 0);
1118  int kk(0);
1119  double mean(0);
1120  for (unsigned int k = 0; k < hpar->layHB.size(); ++k) {
1121  if (lay == hpar->layHB[k]) {
1122  double zmin = hpar->rhoxHB[k] * std::cos(thetaL) / std::sin(thetaL);
1123  double zmax = hpar->rhoxHB[k] * std::cos(thetaH) / std::sin(thetaH);
1124  double dz = (std::min(zmax, hpar->dxHB[k]) - zmin);
1125  if (dz > 0) {
1126  area[kk] = dz * hpar->dyHB[k];
1127  mean += area[kk];
1128  kk++;
1129  }
1130  }
1131  }
1132  if (area[0] > 0) {
1133  mean /= (kk * 100);
1134  edm::LogVerbatim("HCalGeom") << std::setw(2) << lay << " Area " << std::setw(8) << area[0] << " " << std::setw(8)
1135  << area[1] << " Mean " << mean;
1136  }
1137  }
1138 }
1139 
1140 void HcalDDDSimConstants::printTileHE(const int& eta, const int& phi, const int& zside, const int& depth) const {
1141  double etaL = hpar->etaTable[eta - 1];
1142  double thetaL = 2. * atan(exp(-etaL));
1143  double etaH = hpar->etaTable[eta];
1144  double thetaH = 2. * atan(exp(-etaH));
1145  int layL = getLayerFront(2, eta, phi, zside, depth);
1146  int layH = getLayerBack(2, eta, phi, zside, depth);
1147  double phib = hpar->phibin[eta - 1];
1148  int nphi = 2;
1149  if (phib > 6._deg)
1150  nphi = 1;
1151  edm::LogVerbatim("HCalGeom") << "\ntileHE:: Eta/depth " << zside * eta << "|" << depth << " theta "
1152  << convertRadToDeg(thetaH) << ":" << convertRadToDeg(thetaL) << " Layer " << layL - 1
1153  << ":" << layH - 1 << " phi " << nphi;
1154  for (int lay = layL - 1; lay < layH; ++lay) {
1155  std::vector<double> area(4, 0);
1156  int kk(0);
1157  double mean(0);
1158  for (unsigned int k = 0; k < hpar->layHE.size(); ++k) {
1159  if (lay == hpar->layHE[k]) {
1160  double rmin = hpar->zxHE[k] * std::tan(thetaH);
1161  double rmax = hpar->zxHE[k] * std::tan(thetaL);
1162  if ((lay != 0 || eta == 18) &&
1163  (lay != 1 || (eta == 18 && hpar->rhoxHE[k] - hpar->dyHE[k] > 1000) ||
1164  (eta != 18 && hpar->rhoxHE[k] - hpar->dyHE[k] < 1000)) &&
1165  rmin + 30 < hpar->rhoxHE[k] + hpar->dyHE[k] && rmax > hpar->rhoxHE[k] - hpar->dyHE[k]) {
1166  rmin = std::max(rmin, hpar->rhoxHE[k] - hpar->dyHE[k]);
1167  rmax = std::min(rmax, hpar->rhoxHE[k] + hpar->dyHE[k]);
1168  double dx1 = rmin * std::tan(phib);
1169  double dx2 = rmax * std::tan(phib);
1170  double ar1 = 0, ar2 = 0;
1171  if (nphi == 1) {
1172  ar1 = 0.5 * (rmax - rmin) * (dx1 + dx2 - 4. * hpar->dx1HE[k]);
1173  mean += ar1;
1174  } else {
1175  ar1 = 0.5 * (rmax - rmin) * (dx1 + dx2 - 2. * hpar->dx1HE[k]);
1176  ar2 = 0.5 * (rmax - rmin) * ((rmax + rmin) * tan(10._deg) - 4 * hpar->dx1HE[k]) - ar1;
1177  mean += (ar1 + ar2);
1178  }
1179  area[kk] = ar1;
1180  area[kk + 2] = ar2;
1181  kk++;
1182  }
1183  }
1184  }
1185  if (area[0] > 0 && area[1] > 0) {
1186  int lay0 = lay - 1;
1187  if (eta == 18)
1188  lay0++;
1189  if (nphi == 1) {
1190  mean /= (kk * 100);
1191  edm::LogVerbatim("HCalGeom") << std::setw(2) << lay0 << " Area " << std::setw(8) << area[0] << " "
1192  << std::setw(8) << area[1] << " Mean " << mean;
1193  } else {
1194  mean /= (kk * 200);
1195  edm::LogVerbatim("HCalGeom") << std::setw(2) << lay0 << " Area " << std::setw(8) << area[0] << " "
1196  << std::setw(8) << area[1] << ":" << std::setw(8) << area[2] << " " << std::setw(8)
1197  << area[3] << " Mean " << mean;
1198  }
1199  }
1200  }
1201 }
1202 
1203 unsigned int HcalDDDSimConstants::layerGroupSize(int eta) const {
1204  unsigned int k = 0;
1205  for (auto const& it : hpar->layerGroupEtaSim) {
1206  if (it.layer == static_cast<unsigned int>(eta + 1)) {
1207  return it.layerGroup.size();
1208  }
1209  if (it.layer > static_cast<unsigned int>(eta + 1))
1210  break;
1211  k = it.layerGroup.size();
1212  }
1213  return k;
1214 }
1215 
1216 unsigned int HcalDDDSimConstants::layerGroup(int eta, int i) const {
1217  unsigned int k = 0;
1218  for (auto const& it : hpar->layerGroupEtaSim) {
1219  if (it.layer == static_cast<unsigned int>(eta + 1)) {
1220  return it.layerGroup.at(i);
1221  }
1222  if (it.layer > static_cast<unsigned int>(eta + 1))
1223  break;
1224  k = it.layerGroup.at(i);
1225  }
1226  return k;
1227 }
1228 
1229 unsigned int HcalDDDSimConstants::layerGroup(int det, int eta, int phi, int zside, int lay) const {
1230  int depth0 = findDepth(det, eta, phi, zside, lay);
1231  unsigned int depth = (depth0 > 0) ? static_cast<unsigned int>(depth0) : layerGroup(eta - 1, lay);
1232  return depth;
1233 }
double getLayer0Wt(const int subdet, const int iphi, const int zside) const
HcalCellType::HcalCell cell(const int &det, const int &zside, const int &depth, const int &etaR, const int &iphi) const
Log< level::Info, true > LogVerbatim
const int nphi
int getEta(const int &det, const int &lay, const double &hetaR) const
std::vector< double > zHO
std::vector< double > etaTable
int getFrontLayer(const int &det, const int &eta) const
int getDepth(const int subdet, const int ieta, const int iphi, const int zside, const int layer) const
double getEtaHO(const double &etaR, const double &x, const double &y, const double &z) const
unsigned int findLayer(const int &layer, const std::vector< HcalParameters::LayerItem > &layerGroup) const
std::vector< int > layHE
void initialize(const int subdet, const int ietaMax, const int dep16C, const int dep29C, const double wtl0C, std::vector< int > const &iphi, std::vector< int > const &ieta, std::vector< int > const &layer, std::vector< int > const &depth)
std::vector< int > maxDepth
std::vector< double > rHB
bool isValid(const int det, const int phi, const int zside) const
for(int i=first, nt=offsets[nh];i< nt;i+=gridDim.x *blockDim.x)
int getDepthEta29M(const int &i, const bool &planOne) const
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
std::vector< double > rhoxHB
int maxHFDepth(const int &ieta, const int &iphi) const
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
static const int maxLayer_
std::vector< double > HBGains
int getLayerFront(const int subdet, const int ieta, const int iphi, const int zside, const int depth) const
std::pair< int, int > depthMaxDf_
int getDepthEta29(const int &phi, const int &zside, const int &i) const
std::vector< int > HEShift
double deltaEta(const int &det, const int &eta, const int &depth) const
double getLayer0Wt(const int &det, const int &phi, const int &zside) const
int zside(DetId const &)
std::pair< double, double > getPhiCons(const int &det, const int &ieta) const
HcalDDDSimConstants(const HcalParameters *hp)
double getGain(const HcalSubdetector &subdet, const int &depth) const
float float float z
std::pair< int, double > getDetEta(const double &eta, const int &depth) const
int getDepthEta16M(const int &det) const
unsigned int numberOfCells(const HcalSubdetector &) const
std::vector< int > etaMax
std::vector< int > depths[nDepthMax]
std::vector< int > modHB
int phiNumber(const int &phi, const int &unit) const
std::vector< double > rhoxHE
U second(std::pair< T, U > const &p)
std::vector< double > zxHE
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ietaAbs(uint32_t id)
std::vector< double > zHE
std::vector< LayerItem > layerGroupEtaSim
unsigned int layerGroupSize(int eta) const
std::vector< double > dyHE
void setPhi(const std::vector< std::pair< int, double >> &phis, const std::vector< int > &iphiMiss, double foff, double dphi, int unit)
std::pair< int, int > getEtaDepth(const int &det, int etaR, const int &phi, const int &zside, int depth, const int &lay) const
int getMaxDepthLastHE(const int subdet, const int iphi, const int zside) const
std::vector< double > dx1HE
std::vector< double > rHO
std::pair< int, int > getDepths(const int eta) const
T sqrt(T t)
Definition: SSEVec.h:23
std::vector< double > dzHE
std::vector< std::pair< double, double > > getConstHBHE(const int &type) const
std::pair< int, int > depthMaxSp_
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
HcalSubdetector
Definition: HcalAssistant.h:31
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< HcalCellType > HcalCellTypes() const
std::vector< int > modHE
std::vector< std::pair< int, double > > getPhis(const int &subdet, const int &ieta) const
std::vector< HcalDetId > idHF2QIE
std::vector< int > HFShift
int findDepth(const int &det, const int &eta, const int &phi, const int &zside, const int &lay) const
Basic3DVector unit() const
int unitPhi(const int &det, const int &etaR) const
int getLayerBack(const int subdet, const int ieta, const int iphi, const int zside, const int depth) const
int getLayerBack(const int &det, const int &eta, const int &phi, const int &zside, const int &depth) const
#define M_PI
std::vector< double > HEGains
int getLayerFront(const int &det, const int &eta, const int &phi, const int &zside, const int &depth) const
std::vector< double > dyHB
std::vector< double > phioff
std::vector< double > gparHF
void printTileHE(const int &eta, const int &phi, const int &zside, const int &depth) const
int getMinDepth(const int &det, const int &eta, const int &phi, const int &zside, const bool &partialOnly) const
std::vector< double > Layer0Wt
std::vector< double > dxHB
void printTileHB(const int &eta, const int &phi, const int &zside, const int &depth) const
std::vector< double > rTable
std::vector< double > phitable
std::pair< int, int > getModHalfHBHE(const int &type) const
TString units(TString variable, Char_t axis)
int getDepthMax(const int subdet, const int iphi, const int zside) const
std::vector< double > phibin
std::vector< double > drHB
std::vector< double > HFGains
static unsigned int const shift
float x
std::vector< int > noff
unsigned int layerGroup(int eta, int i) const
std::vector< int > HBShift
int getDepth16(const int subdet, const int iphi, const int zside) const
Log< level::Warning, false > LogWarning
const HcalParameters * hpar
std::vector< int > maxDepth
static constexpr float d1
tmp
align.sh
Definition: createJobs.py:716
std::vector< int > layHB
int getMaxDepth(const int &type) const
int getLastLayer(const int &det, const int &eta) const
int getLayerMax(const int &eta, const int &depth) const
Geom::Theta< T > theta() const
static const int maxLayerHB_
int validDet(std::vector< int > &phis) const
int getDepthEta16(const int &det, const int &phi, const int &zside) const
std::vector< int > etaMin
int getShift(const HcalSubdetector &subdet, const int &depth) const
HcalLayerDepthMap ldmap_