CMS 3D CMS Logo

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