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