CMS 3D CMS Logo

HGCalDDDConstants.cc
Go to the documentation of this file.
2 
15 
16 #include <algorithm>
17 #include <bitset>
18 #include <iterator>
19 #include <functional>
20 #include <numeric>
21 
22 //#define EDM_ML_DEBUG
23 using namespace geant_units::operators;
24 
26  : hgpar_(hp), sqrt3_(std::sqrt(3.0)), mode_(hgpar_->mode_), fullAndPart_(waferHexagon8File()) {
27 #ifdef EDM_ML_DEBUG
28  edm::LogVerbatim("HGCalGeom") << "Mode " << mode_ << " FullAndPart " << fullAndPart_;
29 #endif
30  if (waferHexagon6() || waferHexagon8()) {
33  hexside_ = 2.0 * rmax_ * tan30deg_;
34  hexsideT_ = 2.0 * rmaxT_ * tan30deg_;
35  hgcell_ = std::make_unique<HGCalCell>(2.0 * rmaxT_, hgpar_->nCellsFine_, hgpar_->nCellsCoarse_);
36  hgcellUV_ = std::make_unique<HGCalCellUV>(
38 #ifdef EDM_ML_DEBUG
39  edm::LogVerbatim("HGCalGeom") << "rmax_ " << rmax_ << ":" << rmaxT_ << ":" << hexside_ << ":" << hexsideT_
40  << " CellSize " << 0.5 * HGCalParameters::k_ScaleFromDDD * hgpar_->cellSize_[0] << ":"
42 #endif
43  }
44  if (cassetteMode()) {
46 #ifdef EDM_ML_DEBUG
47  edm::LogVerbatim("HGCalGeom") << "Setup HGCalCassette for " << hgpar_->cassettes_ << " cassettes";
48 #endif
49  }
50  // init maps and constants
51  modHalf_ = 0;
53  for (int simreco = 0; simreco < 2; ++simreco) {
54  tot_layers_[simreco] = layersInit((bool)simreco);
55  max_modules_layer_[simreco].resize(tot_layers_[simreco] + 1);
56  for (unsigned int layer = 1; layer <= tot_layers_[simreco]; ++layer) {
57  max_modules_layer_[simreco][layer] = modulesInit(layer, (bool)simreco);
58  if (simreco == 1) {
59  modHalf_ += max_modules_layer_[simreco][layer];
61 #ifdef EDM_ML_DEBUG
62  edm::LogVerbatim("HGCalGeom") << "Layer " << layer << " with " << max_modules_layer_[simreco][layer] << ":"
63  << modHalf_ << " modules in RECO";
64  } else {
65  edm::LogVerbatim("HGCalGeom") << "Layer " << layer << " with " << max_modules_layer_[simreco][layer]
66  << " modules in SIM";
67 #endif
68  }
69  }
70 #ifdef EDM_ML_DEBUG
71  edm::LogVerbatim("HGCalGeom") << "SimReco " << simreco << " with " << tot_layers_[simreco] << " Layers";
72 #endif
73  }
74  tot_wafers_ = wafers();
75 
76 #ifdef EDM_ML_DEBUG
77  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants initialized for " << name << " with " << layers(false) << ":"
78  << layers(true) << " layers, " << wafers() << ":" << 2 * modHalf_
79  << " wafers with maximum " << maxWafersPerLayer_ << " per layer and "
80  << "maximum of " << maxCells(false) << ":" << maxCells(true) << " cells";
81 #endif
82  if (waferHexagon6() || waferHexagon8()) {
83  int wminT(9999999), wmaxT(-9999999), kount1(0), kount2(0);
84  for (unsigned int i = 0; i < getTrFormN(); ++i) {
85  int lay0 = getTrForm(i).lay;
86  int wmin(9999999), wmax(-9999999), kount(0);
87  for (int wafer = 0; wafer < sectors(); ++wafer) {
88  bool waferIn = waferInLayer(wafer, lay0, true);
89  if (waferHexagon8()) {
90  int kndx = HGCalWaferIndex::waferIndex(lay0,
93  waferIn_[kndx] = waferIn;
94  }
95  if (waferIn) {
96  int waferU = ((waferHexagon6()) ? wafer : HGCalWaferIndex::waferU(hgpar_->waferCopy_[wafer]));
97  if (waferU < wmin)
98  wmin = waferU;
99  if (waferU > wmax)
100  wmax = waferU;
101  ++kount;
102  }
103  }
104  if (wminT > wmin)
105  wminT = wmin;
106  if (wmaxT < wmax)
107  wmaxT = wmax;
108  if (kount1 < kount)
109  kount1 = kount;
110  kount2 += kount;
111 #ifdef EDM_ML_DEBUG
112  int lay1 = getIndex(lay0, true).first;
113  edm::LogVerbatim("HGCalGeom") << "Index " << i << " Layer " << lay0 << ":" << lay1 << " Wafer " << wmin << ":"
114  << wmax << ":" << kount;
115 #endif
116  HGCWaferParam a1{{wmin, wmax, kount}};
117  waferLayer_[lay0] = a1;
118  }
119  waferMax_ = std::array<int, 4>{{wminT, wmaxT, kount1, kount2}};
120 #ifdef EDM_ML_DEBUG
121  edm::LogVerbatim("HGCalGeom") << "Overall wafer statistics: " << wminT << ":" << wmaxT << ":" << kount1 << ":"
122  << kount2;
123 #endif
124  }
125 }
126 
127 std::pair<int, int> HGCalDDDConstants::assignCell(float x, float y, int lay, int subSec, bool reco) const {
128  const auto& index = getIndex(lay, reco);
129  if (index.first < 0)
130  return std::make_pair(-1, -1);
131  if (waferHexagon6()) {
132  float xx = (reco) ? x : HGCalParameters::k_ScaleFromDDD * x;
133  float yy = (reco) ? y : HGCalParameters::k_ScaleFromDDD * y;
134 
135  // First the wafer
136  int wafer = cellHex(xx, yy, rmax_, hgpar_->waferPosX_, hgpar_->waferPosY_);
137  if (wafer < 0 || wafer >= static_cast<int>(hgpar_->waferTypeT_.size())) {
138  edm::LogWarning("HGCalGeom") << "Wafer no. out of bound for " << wafer << ":" << (hgpar_->waferTypeT_).size()
139  << ":" << (hgpar_->waferPosX_).size() << ":" << (hgpar_->waferPosY_).size()
140  << " ***** ERROR *****";
141  return std::make_pair(-1, -1);
142  } else {
143  // Now the cell
144  xx -= hgpar_->waferPosX_[wafer];
145  yy -= hgpar_->waferPosY_[wafer];
146  if (hgpar_->waferTypeT_[wafer] == 1)
147  return std::make_pair(wafer,
148  cellHex(xx,
149  yy,
152  hgpar_->cellFineY_));
153  else
154  return std::make_pair(wafer,
155  cellHex(xx,
156  yy,
159  hgpar_->cellCoarseY_));
160  }
161  } else {
162  return std::make_pair(-1, -1);
163  }
164 }
165 
167  float x, float y, int zside, int lay, bool reco, bool extend, bool debug) const {
168  int waferU(0), waferV(0), waferType(-1), cellU(0), cellV(0);
169  if (waferHexagon8()) {
170  double xx = (reco) ? HGCalParameters::k_ScaleToDDD * x : x;
171  double yy = (reco) ? HGCalParameters::k_ScaleToDDD * y : y;
172  double wt(1.0);
173 #ifdef EDM_ML_DEBUG
174  edm::LogVerbatim("HGCalGeom") << "assignCellHex x " << x << ":" << xx << " y " << y << ":" << yy << " Lay " << lay;
175 #endif
176  waferFromPosition(xx, yy, zside, lay, waferU, waferV, cellU, cellV, waferType, wt, extend, debug);
177  }
178  return std::array<int, 5>{{waferU, waferV, waferType, cellU, cellV}};
179 }
180 
181 std::array<int, 3> HGCalDDDConstants::assignCellTrap(float x, float y, float z, int layer, bool reco) const {
182  int irad(-1), iphi(-1), type(-1);
183  const auto& indx = getIndex(layer, reco);
184  if (indx.first < 0)
185  return std::array<int, 3>{{irad, iphi, type}};
186  int zside = (z > 0) ? 1 : -1;
187  double xx = (reco) ? (zside * x) : (zside * HGCalParameters::k_ScaleFromDDD * x);
188  double yy = (reco) ? y : HGCalParameters::k_ScaleFromDDD * y;
189  int ll = layer - hgpar_->firstLayer_;
190  xx -= hgpar_->xLayerHex_[ll];
191  yy -= hgpar_->yLayerHex_[ll];
192  double phi = (((yy == 0.0) && (xx == 0.0)) ? 0. : std::atan2(yy, xx));
193  if (phi < 0)
194  phi += (2.0 * M_PI);
195  if (indx.second != 0)
196  iphi = (1 + static_cast<int>(phi / indx.second)) % hgpar_->scintCells(layer);
197  if (iphi == 0)
199  if (cassetteMode()) {
201  auto cshift = hgcassette_.getShift(layer, -1, cassette);
202 #ifdef EDM_ML_DEBUG
203  std::ostringstream st1;
204  st1 << "Cassette " << cassette << " Shift " << cshift.first << ":" << cshift.second << " Original " << xx << ":"
205  << yy;
206 #endif
207  xx += (zside * cshift.first);
208  yy -= cshift.second;
209 #ifdef EDM_ML_DEBUG
210  st1 << " Shifted " << xx << ":" << yy;
211  edm::LogVerbatim("HGCalGeomT") << st1.str();
212 #endif
213  }
215  double r = std::sqrt(xx * xx + yy * yy);
216  auto ir = std::lower_bound(hgpar_->radiusLayer_[type].begin(), hgpar_->radiusLayer_[type].end(), r);
217  irad = static_cast<int>(ir - hgpar_->radiusLayer_[type].begin());
218  irad = std::clamp(irad, hgpar_->iradMinBH_[indx.first], hgpar_->iradMaxBH_[indx.first]);
219 #ifdef EDM_ML_DEBUG
220  edm::LogVerbatim("HGCalGeomT") << "assignCellTrap Input " << x << ":" << y << ":" << z << ":" << layer << ":" << reco
221  << " x|y|r " << xx << ":" << yy << ":" << r << " phi " << phi << ":"
222  << convertRadToDeg(phi) << " o/p " << irad << ":" << iphi << ":" << type;
223 #endif
224  if (!tileExist(zside, layer, irad, iphi)) {
225  if (tileRingEdge(r, layer, irad)) {
226  if (std::abs(r - hgpar_->radiusLayer_[type][irad - 1]) < tol_) {
227  --irad;
228  if (irad <= hgpar_->iradMinBH_[indx.first])
229  irad = hgpar_->iradMinBH_[indx.first];
230  } else {
231  ++irad;
232  if (irad > hgpar_->iradMaxBH_[indx.first])
233  irad = hgpar_->iradMaxBH_[indx.first];
234  }
235 #ifdef EDM_ML_DEBUG
236  edm::LogVerbatim("HGCalGeomT") << "assignCellTrap: ring # modified to " << irad << ":"
237  << hgpar_->iradMinBH_[indx.first] << ":" << hgpar_->iradMaxBH_[indx.first];
238  ;
239 #endif
240  } else if (tilePhiEdge(phi, layer, iphi)) {
241  if (std::abs(phi - hgpar_->scintCellSize(layer) * (iphi - 1)) < tol_) {
242  --iphi;
243  if (iphi <= 0)
244  iphi = 1;
245  } else {
246  ++iphi;
247  if (iphi > hgpar_->scintCells(layer))
248  iphi = 1;
249  }
250 #ifdef EDM_ML_DEBUG
251  edm::LogVerbatim("HGCalGeomT") << "assignCellTrap: iphi # modified to " << iphi << ":"
252  << hgpar_->scintCells(layer);
253 #endif
254  }
255  }
256  return std::array<int, 3>{{irad, iphi, type}};
257 }
258 
260  bool shift(false);
261  if (cassetteMode()) {
263  auto ktr = hgpar_->waferInfoMap_.find(indx);
264  if (ktr != hgpar_->waferInfoMap_.end()) {
265  auto cshift = hgcassette_.getShift(layer, zside, (ktr->second).cassette);
266  if ((cshift.first != 0) || (cshift.second != 0))
267  shift = true;
268  }
269  }
270  return shift;
271 }
272 
274  bool shift(false);
275  if (cassetteMode()) {
276  auto cshift = hgcassette_.getShift(layer, zside, cassetteTile(iphi));
277  if ((cshift.first != 0) || (cshift.second != 0))
278  shift = true;
279  }
280  return shift;
281 }
282 
283 std::pair<double, double> HGCalDDDConstants::cellEtaPhiTrap(int type, int irad) const {
284  double dr(0), df(0);
285  if (tileTrapezoid()) {
286  double r = 0.5 * ((hgpar_->radiusLayer_[type][irad - 1] + hgpar_->radiusLayer_[type][irad]));
287  dr = (hgpar_->radiusLayer_[type][irad] - hgpar_->radiusLayer_[type][irad - 1]);
288  df = r * hgpar_->cellSize_[type];
289  }
290  return std::make_pair(dr, df);
291 }
292 
293 bool HGCalDDDConstants::cellInLayer(int waferU, int waferV, int cellU, int cellV, int lay, int zside, bool reco) const {
294  const auto& indx = getIndex(lay, true);
295  if (indx.first >= 0) {
296  if (cassetteMode()) {
297  int indx = HGCalWaferIndex::waferIndex(lay, waferU, waferV);
298  auto ktr = hgpar_->waferInfoMap_.find(indx);
299  int part = (ktr != hgpar_->waferInfoMap_.end()) ? (ktr->second).part : HGCalTypes::WaferFull;
300  return HGCalWaferMask::goodCell(cellU, cellV, part);
302  int indx = HGCalWaferIndex::waferIndex(lay, waferU, waferV);
303  auto ktr = hgpar_->waferInfoMap_.find(indx);
305  if (ktr != hgpar_->waferInfoMap_.end()) {
306  thck = (ktr->second).type;
307  part = (ktr->second).part;
308  rotn = (ktr->second).orient;
309  }
311  return HGCalWaferMask::goodCell(cellU, cellV, ncell, part, rotn);
312  } else if (waferHexagon8() || waferHexagon6()) {
313  const auto& xy =
314  ((waferHexagon8()) ? locateCell(zside, lay, waferU, waferV, cellU, cellV, reco, true, false, false)
315  : locateCell(cellU, lay, waferU, reco));
316  double rpos = sqrt(xy.first * xy.first + xy.second * xy.second);
317  return ((rpos >= hgpar_->rMinLayHex_[indx.first]) && (rpos <= hgpar_->rMaxLayHex_[indx.first]));
318  } else {
319  return true;
320  }
321  } else {
322  return false;
323  }
324 }
325 
327  double thick(-1);
328  int type = waferType(layer, waferU, waferV, false);
329  if (type >= 0) {
330  if (waferHexagon8()) {
331  thick = 10000.0 * hgpar_->cellThickness_[type]; // cm to micron
332  } else if (waferHexagon6()) {
333  thick = 100.0 * (type + 1); // type = 1,2,3 for 100,200,300 micron
334  }
335  }
336  return thick;
337 }
338 
340  int indx = ((waferHexagon8()) ? ((type >= 1) ? 1 : 0) : ((type == 1) ? 1 : 0));
341  double cell = (tileTrapezoid() ? 0.5 * hgpar_->cellSize_[indx]
343  return cell;
344 }
345 
346 int32_t HGCalDDDConstants::cellType(int type, int cellU, int cellV, int iz, int fwdBack, int orient) const {
347  int placement = (orient < 0) ? HGCalCell::cellPlacementOld : HGCalCell::cellPlacementIndex(iz, fwdBack, orient);
348  int ncell = (type == 0) ? hgpar_->nCellsFine_ : hgpar_->nCellsCoarse_;
349  auto cellType = HGCalCell::cellType(cellU, cellV, ncell, placement);
350  return cellType.first;
351 }
352 
353 double HGCalDDDConstants::distFromEdgeHex(double x, double y, double z) const {
354  // Assming the point is within a hexagonal plane of the wafer, calculate
355  // the shortest distance from the edge
356  if (z < 0)
357  x = -x;
358  double dist(0);
359  // Input x, y in Geant4 unit and transformed to CMSSW standard
362  if (waferHexagon8()) {
363  int ll = layerIndex(getLayer(z, false), false);
364  xx -= hgpar_->xLayerHex_[ll];
365  yy -= hgpar_->yLayerHex_[ll];
366  }
367  int sizew = static_cast<int>(hgpar_->waferPosX_.size());
368  int wafer = sizew;
369  // Transform to the local coordinate frame of the wafer first
370  for (int k = 0; k < sizew; ++k) {
371  double dx = std::abs(xx - hgpar_->waferPosX_[k]);
372  double dy = std::abs(yy - hgpar_->waferPosY_[k]);
373  if ((dx <= rmax_) && (dy <= hexside_) && ((dy <= 0.5 * hexside_) || (dx * tan30deg_ <= (hexside_ - dy)))) {
374  wafer = k;
375  xx -= hgpar_->waferPosX_[k];
376  yy -= hgpar_->waferPosY_[k];
377  break;
378  }
379  }
380  // Look at only one quarter (both x,y are positive)
381  if (wafer < sizew) {
382  if (std::abs(yy) < 0.5 * hexside_) {
383  dist = rmax_ - std::abs(xx);
384  } else {
385  dist = 0.5 * ((rmax_ - std::abs(xx)) - sqrt3_ * (std::abs(yy) - 0.5 * hexside_));
386  }
387  } else {
388  dist = 0;
389  }
391 #ifdef EDM_ML_DEBUG
392  edm::LogVerbatim("HGCalGeom") << "DistFromEdgeHex: Local " << xx << ":" << yy << " wafer " << wafer << " flag "
393  << (wafer < sizew) << " Distance " << rmax_ << ":" << (rmax_ - std::abs(xx)) << ":"
394  << (std::abs(yy) - 0.5 * hexside_) << ":" << 0.5 * hexside_ << ":" << dist;
395 #endif
396  return dist;
397 }
398 
399 double HGCalDDDConstants::distFromEdgeTrap(double x, double y, double z) const {
400  // Assming the point is within the eta-phi plane of the scintillator tile,
401  // calculate the shortest distance from the edge
402  int lay = getLayer(z, false);
403  double xx = (z < 0) ? -x : x;
404  int indx = layerIndex(lay, false);
405  double r = HGCalParameters::k_ScaleFromDDD * std::sqrt(x * x + y * y);
406  double phi = (r == 0. ? 0. : std::atan2(y, xx));
407  if (phi < 0)
408  phi += (2.0 * M_PI);
409  int type = hgpar_->scintType(lay);
410  double cell = hgpar_->scintCellSize(lay);
411  // Compare with the center of the tile find distances along R and also phi
412  // Take the smaller value
413  auto ir = std::lower_bound(hgpar_->radiusLayer_[type].begin(), hgpar_->radiusLayer_[type].end(), r);
414  int irad = static_cast<int>(ir - hgpar_->radiusLayer_[type].begin());
415  irad = std::clamp(irad, hgpar_->iradMinBH_[indx], hgpar_->iradMaxBH_[indx]);
416  int iphi = 1 + static_cast<int>(phi / cell);
417  double dphi = std::max(0.0, (0.5 * cell - std::abs(phi - (iphi - 0.5) * cell)));
418  double dist = std::min((r - hgpar_->radiusLayer_[type][irad - 1]), (hgpar_->radiusLayer_[type][irad] - r));
419 #ifdef EDM_ML_DEBUG
420  edm::LogVerbatim("HGCalGeom") << "DistFromEdgeTrap: Global " << x << ":" << y << ":" << z << " Layer " << lay
421  << " Index " << indx << ":" << type << " xx " << xx << " R " << r << ":" << irad << ":"
422  << hgpar_->radiusLayer_[type][irad - 1] << ":" << hgpar_->radiusLayer_[type][irad]
423  << " Phi " << phi << ":" << iphi << ":" << (iphi - 0.5) * cell << " cell " << cell
424  << " Dphi " << dphi << " Dist " << dist << ":" << r * dphi;
425 #endif
426  return HGCalParameters::k_ScaleToDDD * std::min(r * dphi, dist);
427 }
428 
429 int HGCalDDDConstants::getLayer(double z, bool reco) const {
430  // Get the layer # from the gloabl z coordinate
431  unsigned int k = 0;
433  const auto& zLayerHex = hgpar_->zLayerHex_;
434  auto itr = std::find_if(zLayerHex.begin() + 1, zLayerHex.end(), [&k, &zz, &zLayerHex](double zLayer) {
435  ++k;
436  return zz < 0.5 * (zLayerHex[k - 1] + zLayerHex[k]);
437  });
438  int lay = (itr == zLayerHex.end()) ? static_cast<int>(zLayerHex.size()) : k;
439  if (waferHexagon6() && reco) {
440  int indx = layerIndex(lay, false);
441  if (indx >= 0)
442  lay = hgpar_->layerGroupO_[indx];
443  } else {
444  lay += (hgpar_->firstLayer_ - 1);
445  }
446  return lay;
447 }
448 
449 HGCalParameters::hgtrap HGCalDDDConstants::getModule(unsigned int indx, bool hexType, bool reco) const {
451  if (hexType) {
452  if (indx >= hgpar_->waferTypeL_.size())
453  edm::LogWarning("HGCalGeom") << "Wafer no. out bound for index " << indx << ":" << (hgpar_->waferTypeL_).size()
454  << ":" << (hgpar_->waferPosX_).size() << ":" << (hgpar_->waferPosY_).size()
455  << " ***** ERROR *****";
456  unsigned int type =
457  ((indx < hgpar_->waferTypeL_.size()) ? hgpar_->waferTypeL_[indx] - 1 : HGCSiliconDetId::HGCalCoarseThick);
458  mytr = hgpar_->getModule(type, reco);
459  } else {
460  mytr = hgpar_->getModule(indx, reco);
461  }
462  return mytr;
463 }
464 
465 std::vector<HGCalParameters::hgtrap> HGCalDDDConstants::getModules() const {
466  std::vector<HGCalParameters::hgtrap> mytrs;
467  for (unsigned int k = 0; k < hgpar_->moduleLayR_.size(); ++k)
468  mytrs.emplace_back(hgpar_->getModule(k, true));
469  return mytrs;
470 }
471 
472 int HGCalDDDConstants::getPhiBins(int lay) const { return (tileTrapezoid() ? hgpar_->scintCells(lay) : 0); }
473 
474 std::pair<double, double> HGCalDDDConstants::getRangeR(int lay, bool reco) const {
475  int indx = layerIndex(lay, false);
476  if ((indx >= 0) && (indx < static_cast<int>(hgpar_->rMinLayHex_.size())))
477  return std::make_pair(hgpar_->rMinLayHex_[indx], hgpar_->rMaxLayHex_[indx]);
478  else
479  return std::make_pair(0, -1.);
480 }
481 
482 std::pair<int, int> HGCalDDDConstants::getREtaRange(int lay) const {
483  int irmin(0), irmax(0);
484  if (tileTrapezoid()) {
485  int indx = layerIndex(lay, false);
486  if ((indx >= 0) && (indx < static_cast<int>(hgpar_->iradMinBH_.size()))) {
487  irmin = hgpar_->iradMinBH_[indx];
488  irmax = hgpar_->iradMaxBH_[indx];
489  }
490  }
491  return std::make_pair(irmin, irmax);
492 }
493 
494 std::vector<HGCalParameters::hgtrform> HGCalDDDConstants::getTrForms() const {
495  std::vector<HGCalParameters::hgtrform> mytrs;
496  for (unsigned int k = 0; k < hgpar_->trformIndex_.size(); ++k)
497  mytrs.emplace_back(hgpar_->getTrForm(k));
498  return mytrs;
499 }
500 
502  // Get the module type for scinitllator
503  if (tileTrapezoid()) {
504  return hgpar_->scintType(layer);
505  } else {
506  return -1;
507  }
508 }
509 
511  // Get the module type for a silicon wafer
512  if (waferHexagon8()) {
514  return ((itr == hgpar_->typesInLayers_.end() ? 2 : hgpar_->waferTypeL_[itr->second]));
515  } else {
516  return -1;
517  }
518 }
519 
520 std::pair<double, double> HGCalDDDConstants::getXY(int layer, double x, double y, bool forwd) const {
521  int ll = layer - hgpar_->firstLayer_;
522  double x0(x), y0(y);
523  if ((!hgpar_->layerType_.empty()) && (ll < static_cast<int>(hgpar_->layerRotV_.size()))) {
524  if (forwd) {
525  x0 = x * hgpar_->layerRotV_[ll].first + y * hgpar_->layerRotV_[ll].second;
526  y0 = y * hgpar_->layerRotV_[ll].first - x * hgpar_->layerRotV_[ll].second;
527  } else {
528  x0 = x * hgpar_->layerRotV_[ll].first - y * hgpar_->layerRotV_[ll].second;
529  y0 = y * hgpar_->layerRotV_[ll].first + x * hgpar_->layerRotV_[ll].second;
530  }
531  }
532 #ifdef EDM_ML_DEBUG
533  double x1(x0), y1(y0);
534  if (ll < static_cast<int>(hgpar_->layerRotV_.size())) {
535  if (forwd) {
536  x1 = x0 * hgpar_->layerRotV_[ll].first - y0 * hgpar_->layerRotV_[ll].second;
537  y1 = y0 * hgpar_->layerRotV_[ll].first + x0 * hgpar_->layerRotV_[ll].second;
538  } else {
539  x1 = x0 * hgpar_->layerRotV_[ll].first + y0 * hgpar_->layerRotV_[ll].second;
540  y1 = y0 * hgpar_->layerRotV_[ll].first - x0 * hgpar_->layerRotV_[ll].second;
541  }
542  }
543  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants: Layer " << layer << ":" << ll << " mode " << forwd << " x " << x
544  << ":" << x0 << ":" << x1 << " y " << y << ":" << y0 << ":" << y1;
545 #endif
546  return std::make_pair(x0, y0);
547 }
548 
551 }
552 
553 bool HGCalDDDConstants::isHalfCell(int waferType, int cell) const {
554  if (waferType < 1 || cell < 0)
555  return false;
556  return waferType == 2 ? hgpar_->cellCoarseHalf_[cell] : hgpar_->cellFineHalf_[cell];
557 }
558 
559 bool HGCalDDDConstants::isValidHex(int lay, int mod, int cell, bool reco) const {
560  // Check validity for a layer|wafer|cell of pre-TDR version
561  bool result(false), resultMod(false);
562  int cellmax(0);
563  if (waferHexagon6()) {
564  int32_t copyNumber = hgpar_->waferCopy_[mod];
565  result = ((lay > 0 && lay <= static_cast<int>(layers(reco))));
566  if (result) {
567  const int32_t lay_idx = reco ? (lay - 1) * 3 + 1 : lay;
568  const auto& the_modules = hgpar_->copiesInLayers_[lay_idx];
569  auto moditr = the_modules.find(copyNumber);
570  result = resultMod = (moditr != the_modules.end());
571 #ifdef EDM_ML_DEBUG
572  if (!result)
573  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants: Layer " << lay << ":" << lay_idx << " Copy " << copyNumber
574  << ":" << mod << " Flag " << result;
575 #endif
576  if (result) {
577  if (moditr->second >= 0) {
578  if (mod >= static_cast<int>(hgpar_->waferTypeT_.size()))
579  edm::LogWarning("HGCalGeom") << "Module no. out of bound for " << mod << " to be compared with "
580  << (hgpar_->waferTypeT_).size() << " ***** ERROR *****";
581  cellmax = ((hgpar_->waferTypeT_[mod] - 1 == HGCSiliconDetId::HGCalFine)
582  ? static_cast<int>(hgpar_->cellFineX_.size())
583  : static_cast<int>(hgpar_->cellCoarseX_.size()));
584  result = (cell >= 0 && cell <= cellmax);
585  } else {
586  result = isValidCell(lay_idx, mod, cell);
587  }
588  }
589  }
590  }
591 
592 #ifdef EDM_ML_DEBUG
593  if (!result)
594  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants: Layer " << lay << ":"
595  << (lay > 0 && (lay <= static_cast<int>(layers(reco)))) << " Module " << mod << ":"
596  << resultMod << " Cell " << cell << ":" << cellmax << ":"
597  << (cell >= 0 && cell <= cellmax) << ":" << maxCells(reco);
598 #endif
599  return result;
600 }
601 
602 bool HGCalDDDConstants::isValidHex8(int layer, int modU, int modV, bool fullAndPart) const {
603  // Check validity for a layer|wafer|cell of post-TDR version
604  int indx = HGCalWaferIndex::waferIndex(layer, modU, modV);
605  auto itr = hgpar_->typesInLayers_.find(indx);
606 #ifdef EDM_ML_DEBUG
607  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants::isValidHex8:WaferType " << layer << ":" << modU << ":" << modV
608  << ":" << indx << " Test " << (itr != hgpar_->typesInLayers_.end());
609 #endif
610  if (itr == hgpar_->typesInLayers_.end()) {
611 #ifdef EDM_ML_DEBUG
612  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: Cannot find " << layer << ":" << modU << ":" << modV
613  << " in wadferIndex";
614 #endif
615  return false;
616  }
617 
618  if (fullAndPart_) {
619  auto ktr = hgpar_->waferInfoMap_.find(indx);
620 #ifdef EDM_ML_DEBUG
621  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants::isValidHex8:WaferInfoMap " << layer << ":" << modU << ":"
622  << modV << ":" << indx << " Test " << (ktr != hgpar_->waferInfoMap_.end());
623 #endif
624  if (ktr == hgpar_->waferInfoMap_.end()) {
625 #ifdef EDM_ML_DEBUG
626  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: Cannot find " << layer << ":" << modU << ":" << modV
627  << " in wadferInfoMap";
628 #endif
629  return false;
630  }
631  } else {
632  auto jtr = waferIn_.find(indx);
633 #ifdef EDM_ML_DEBUG
634  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants::isValidHex8:WaferIn " << jtr->first << ":" << jtr->second;
635 #endif
636  if (!(jtr->second)) {
637 #ifdef EDM_ML_DEBUG
638  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: Cannot find " << layer << ":" << modU << ":" << modV
639  << " in wadferIn";
640 #endif
641  return false;
642  }
643  }
644 
645  if (fullAndPart || fullAndPart_) {
646  auto ktr = hgpar_->waferTypes_.find(indx);
647  if (ktr != hgpar_->waferTypes_.end()) {
648  if (hgpar_->waferMaskMode_ > 0) {
649  if (ktr->second.first == HGCalTypes::WaferOut) {
650 #ifdef EDM_ML_DEBUG
651  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: Cannot find " << layer << ":" << modU << ":" << modV
652  << " due to WaferOut";
653 #endif
654  return false;
655  }
656  } else {
657  if (ktr->second.first < HGCalTypes::WaferCornerMin) {
658 #ifdef EDM_ML_DEBUG
659  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: Cannot find " << layer << ":" << modU << ":" << modV
660  << " due to WaferCornerMin";
661 #endif
662  return false;
663  }
664  }
665  }
666  }
667  return true;
668 }
669 
670 bool HGCalDDDConstants::isValidHex8(int layer, int modU, int modV, int cellU, int cellV, bool fullAndPart) const {
671  // First check validity for a layer|wafer| of post TDR version
672 #ifdef EDM_ML_DEBUG
673  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: layer|wafer " << layer << ":" << modU << ":" << modV << ":"
674  << fullAndPart << " Valid " << isValidHex8(layer, modU, modV, fullAndPart);
675 #endif
676  if (!isValidHex8(layer, modU, modV, fullAndPart))
677  return false;
678  int indx = HGCalWaferIndex::waferIndex(layer, modU, modV);
679  auto itr = hgpar_->typesInLayers_.find(indx);
680  int type = hgpar_->waferTypeL_[itr->second];
681  int N = ((hgpar_->waferTypeL_[itr->second] == 0) ? hgpar_->nCellsFine_ : hgpar_->nCellsCoarse_);
682 #ifdef EDM_ML_DEBUG
683  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants::isValidHex8:Cell " << cellU << ":" << cellV << ":" << N
684  << " Tests " << (cellU >= 0) << ":" << (cellU < 2 * N) << ":" << (cellV >= 0) << ":"
685  << (cellV < 2 * N) << ":" << ((cellV - cellU) < N) << ":" << ((cellU - cellV) <= N);
686 #endif
687  if ((cellU < 0) || (cellU >= 2 * N) || (cellV < 0) || (cellV >= 2 * N)) {
688 #ifdef EDM_ML_DEBUG
689  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: Cannot statisfy Cell 1 condition " << cellU << ":" << cellV
690  << ":" << N;
691 #endif
692  return false;
693  }
694  if (((cellV - cellU) >= N) || ((cellU - cellV) > N)) {
695 #ifdef EDM_ML_DEBUG
696  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:: Cannot statisfy Cell 2 condition " << cellU << ":" << cellV
697  << ":" << N;
698 #endif
699  return false;
700  }
701  return isValidCell8(layer, modU, modV, cellU, cellV, type);
702 }
703 
704 bool HGCalDDDConstants::isValidTrap(int zside, int layer, int irad, int iphi) const {
705  // Check validity for a layer|eta|phi of scintillator
706  const auto& indx = getIndex(layer, true);
707  if (indx.first < 0)
708  return false;
709  bool ok = ((irad >= hgpar_->iradMinBH_[indx.first]) && (irad <= (hgpar_->iradMaxBH_[indx.first] + 1)) && (iphi > 0) &&
710  (iphi <= hgpar_->scintCells(layer)));
711  bool valid = ((ok && trapezoidFile()) ? tileExist(zside, layer, irad, iphi) : ok);
712 #ifdef EDM_ML_DEBUG
713  bool tileEx = trapezoidFile() ? tileExist(zside, layer, irad, iphi) : true;
714  edm::LogVerbatim("HGCalGeomT") << "HGCalDDDConstants::isValidityTrap: Input " << zside << ":" << layer << ":" << irad
715  << ":" << iphi << " Range on Ring " << hgpar_->iradMinBH_[indx.first] << ":"
716  << (hgpar_->iradMaxBH_[indx.first] + 1)
717  << " Range on phi 0:" << hgpar_->scintCells(layer) << " tileExist " << tileEx
718  << " Valid " << ok << ":" << valid;
719 #endif
720  return valid;
721 }
722 
724  return (hgpar_->firstLayer_ + tot_layers_[static_cast<int>(reco)] - 1);
725 }
726 
727 unsigned int HGCalDDDConstants::layers(bool reco) const { return tot_layers_[static_cast<int>(reco)]; }
728 
729 int HGCalDDDConstants::layerIndex(int lay, bool reco) const {
730  int ll = lay - hgpar_->firstLayer_;
731  if (ll < 0 || ll >= static_cast<int>(hgpar_->layerIndex_.size()))
732  return -1;
733  if (waferHexagon6()) {
734  if (reco && ll >= static_cast<int>(hgpar_->depthIndex_.size()))
735  return -1;
736  return (reco ? hgpar_->depthLayerF_[ll] : hgpar_->layerIndex_[ll]);
737  } else {
738  return (hgpar_->layerIndex_[ll]);
739  }
740 }
741 
742 unsigned int HGCalDDDConstants::layersInit(bool reco) const {
743  return (reco ? hgpar_->depthIndex_.size() : hgpar_->layerIndex_.size());
744 }
745 
746 std::pair<float, float> HGCalDDDConstants::localToGlobal8(
747  int zside, int lay, int waferU, int waferV, double localX, double localY, bool reco, bool debug) const {
748  double x(localX), y(localY);
749  bool rotx =
751  if (debug)
752  edm::LogVerbatim("HGCalGeom") << "LocalToGlobal8 " << lay << ":" << (lay - hgpar_->firstLayer_) << ":" << rotx
753  << " Local (" << x << ":" << y << ") Reco " << reco;
754  if (!reco) {
757  }
758  const auto& xy = waferPositionNoRot(lay, waferU, waferV, reco, debug);
759  x += xy.first;
760  y += xy.second;
761  int indx = HGCalWaferIndex::waferIndex(lay, waferU, waferV);
762  auto ktr = hgpar_->waferInfoMap_.find(indx);
763  if (cassetteMode() && (ktr != hgpar_->waferInfoMap_.end())) {
764  auto cshift = hgcassette_.getShift(lay, -1, (ktr->second).cassette);
765  std::ostringstream st1;
766  if (debug)
767  st1 << "Cassette " << (ktr->second).cassette << " Shift " << cshift.first << ":" << cshift.second << " Original "
768  << x << ":" << y;
769  if (!reco) {
770  x -= ((HGCalParameters::k_ScaleToDDD)*zside * cshift.first);
771  y += ((HGCalParameters::k_ScaleToDDD)*cshift.second);
772  } else {
773  x -= (zside * cshift.first);
774  y += cshift.second;
775  }
776  if (debug) {
777  st1 << " Final " << x << ":" << y;
778  edm::LogVerbatim("HGCalGeom") << st1.str();
779  }
780  }
781  if (debug)
782  edm::LogVerbatim("HGCalGeom") << "With wafer " << x << ":" << y << " by adding " << xy.first << ":" << xy.second;
783  return (rotx ? getXY(lay, x, y, false) : std::make_pair(x, y));
784 }
785 
786 std::pair<float, float> HGCalDDDConstants::locateCell(int cell, int lay, int type, bool reco) const {
787  // type refers to wafer # for hexagon cell
788  float x(999999.), y(999999.);
789  const auto& index = getIndex(lay, reco);
790  int i = index.first;
791  if (i < 0)
792  return std::make_pair(x, y);
793  if (waferHexagon6()) {
794  x = hgpar_->waferPosX_[type];
795  y = hgpar_->waferPosY_[type];
796 #ifdef EDM_ML_DEBUG
797  float x0(x), y0(y);
798 #endif
800  x += hgpar_->cellFineX_[cell];
801  y += hgpar_->cellFineY_[cell];
802  } else {
803  x += hgpar_->cellCoarseX_[cell];
804  y += hgpar_->cellCoarseY_[cell];
805  }
806 #ifdef EDM_ML_DEBUG
807  edm::LogVerbatim("HGCalGeom") << "LocateCell (Wafer) " << x0 << ":" << y0 << " Final " << x << ":" << y;
808 #endif
809  if (!reco) {
812  }
813  }
814  return std::make_pair(x, y);
815 }
816 
817 std::pair<float, float> HGCalDDDConstants::locateCell(
818  int zside, int lay, int waferU, int waferV, int cellU, int cellV, bool reco, bool all, bool norot, bool debug)
819  const {
820  double x(0), y(0);
821  int indx = HGCalWaferIndex::waferIndex(lay, waferU, waferV);
822  auto itr = hgpar_->typesInLayers_.find(indx);
823  int type = ((itr == hgpar_->typesInLayers_.end()) ? 2 : hgpar_->waferTypeL_[itr->second]);
824  int layertype = layerType(lay);
825  bool rotx = (norot) ? false : (layertype == HGCalTypes::WaferCenterR);
826  if (debug) {
827  edm::LogVerbatim("HGCalGeom") << "LocateCell " << lay << ":" << (lay - hgpar_->firstLayer_) << ":" << layertype
828  << ":" << rotx << ":" << waferU << ":" << waferV << ":" << indx << ":"
829  << (itr == hgpar_->typesInLayers_.end()) << ":" << type << " Flags " << reco << ":"
830  << all;
831  }
832  auto ktr = hgpar_->waferInfoMap_.end();
833  int place(HGCalCell::cellPlacementOld);
834  if (waferHexagon8File()) {
835  if (cassetteMode()) {
836  ktr = hgpar_->waferInfoMap_.find(indx);
837  if (ktr != hgpar_->waferInfoMap_.end())
838  place = HGCalCell::cellPlacementIndex(1, HGCalTypes::layerFrontBack(layertype), (ktr->second).orient);
839  }
840  auto xy = hgcell_->cellUV2XY2(cellU, cellV, place, type);
841  x = xy.first;
842  y = xy.second;
843  if (debug)
844  edm::LogVerbatim("HGCalGeom") << "Type " << type << " Place " << place << " Cell " << cellU << ":" << cellV
845  << " Position " << x << ":" << y;
846  } else {
847  int kndx = cellV * 100 + cellU;
848  if (type == 0) {
849  auto jtr = hgpar_->cellFineIndex_.find(kndx);
850  if (jtr != hgpar_->cellFineIndex_.end()) {
851  x = hgpar_->cellFineX_[jtr->second];
852  y = hgpar_->cellFineY_[jtr->second];
853  }
854  if (debug)
855  edm::LogVerbatim("HGCalGeom") << "Fine " << cellU << ":" << cellV << ":" << kndx << ":" << x << ":" << y << ":"
856  << (jtr != hgpar_->cellFineIndex_.end());
857  } else {
858  auto jtr = hgpar_->cellCoarseIndex_.find(kndx);
859  if (jtr != hgpar_->cellCoarseIndex_.end()) {
860  x = hgpar_->cellCoarseX_[jtr->second];
861  y = hgpar_->cellCoarseY_[jtr->second];
862  }
863  if (debug)
864  edm::LogVerbatim("HGCalGeom") << "Coarse " << cellU << ":" << cellV << ":" << kndx << ":" << x << ":" << y
865  << ":" << (jtr != hgpar_->cellCoarseIndex_.end());
866  }
867  }
868  if (!reco) {
871  }
872  if (all) {
873  const auto& xy = waferPositionNoRot(lay, waferU, waferV, reco, debug);
874  x += xy.first;
875  y += xy.second;
876  if (cassetteMode() && (ktr != hgpar_->waferInfoMap_.end())) {
877  auto cshift = hgcassette_.getShift(lay, -1, (ktr->second).cassette);
878  std::ostringstream st1;
879  if (debug)
880  st1 << "Cassette " << (ktr->second).cassette << " Shift " << cshift.first << ":" << cshift.second
881  << " Original " << x << ":" << y;
882  if (!reco) {
883  x -= ((HGCalParameters::k_ScaleToDDD)*cshift.first);
884  y += ((HGCalParameters::k_ScaleToDDD)*cshift.second);
885  } else {
886  x -= cshift.first;
887  y += cshift.second;
888  }
889  if (debug) {
890  st1 << " Final " << x << ":" << y;
891  edm::LogVerbatim("HGCalGeom") << st1.str();
892  }
893  }
894  if (debug)
895  edm::LogVerbatim("HGCalGeom") << "With wafer " << x << ":" << y << " by adding " << xy.first << ":" << xy.second;
896  }
897  return (rotx ? getXY(lay, x, y, false) : std::make_pair(x, y));
898 }
899 
900 std::pair<float, float> HGCalDDDConstants::locateCell(const HGCSiliconDetId& id, bool debug) const {
901  return locateCell(id.zside(), id.layer(), id.waferU(), id.waferV(), id.cellU(), id.cellV(), true, true, false, debug);
902 }
903 
904 std::pair<float, float> HGCalDDDConstants::locateCell(const HGCScintillatorDetId& id, bool debug) const {
905  return locateCellTrap(id.zside(), id.layer(), id.iradius(), id.iphi(), true, debug);
906 }
907 
908 std::pair<float, float> HGCalDDDConstants::locateCellHex(int cell, int wafer, bool reco) const {
909  float x(0), y(0);
910  if (hgpar_->waferTypeT_[wafer] - 1 == HGCSiliconDetId::HGCalFine) {
911  x = hgpar_->cellFineX_[cell];
912  y = hgpar_->cellFineY_[cell];
913  } else {
914  x = hgpar_->cellCoarseX_[cell];
915  y = hgpar_->cellCoarseY_[cell];
916  }
917  if (!reco) {
920  }
921  return std::make_pair(x, y);
922 }
923 
924 std::pair<float, float> HGCalDDDConstants::locateCellTrap(
925  int zside, int lay, int irad, int iphi, bool reco, bool debug) const {
926  float x(0), y(0);
927  const auto& indx = getIndex(lay, reco);
928  if (indx.first >= 0) {
929  int ir = std::abs(irad);
930  int type = hgpar_->scintType(lay);
931  double phi = (iphi - 0.5) * indx.second;
932  double z = hgpar_->zLayerHex_[indx.first];
933  double r = 0.5 * (hgpar_->radiusLayer_[type][ir - 1] + hgpar_->radiusLayer_[type][ir]);
934  std::pair<double, double> range = rangeR(z, true);
935  if (debug)
936  edm::LogVerbatim("HGCalGeom") << "locateCellTrap:: Input " << lay << ":" << irad << ":" << iphi << ":" << reco
937  << " IR " << ir << ":" << hgpar_->iradMinBH_[indx.first] << ":"
938  << hgpar_->iradMaxBH_[indx.first] << " Type " << type << " Z " << indx.first << ":"
939  << z << " phi " << phi << ":" << convertRadToDeg(phi) << " R " << r << ":"
940  << range.first << ":" << range.second;
941  if (!trapezoidFile())
942  r = std::max(range.first, std::min(r, range.second));
943  x = r * std::cos(phi);
944  y = r * std::sin(phi);
945  int ll = lay - hgpar_->firstLayer_;
946  x += hgpar_->xLayerHex_[ll];
947  y += hgpar_->yLayerHex_[ll];
948  if (irad < 0)
949  x = -x;
950  if (cassetteMode()) {
952  auto cshift = hgcassette_.getShift(lay, -1, cassette);
953  std::ostringstream st1;
954  if (debug)
955  st1 << "Cassette " << cassette << " Shift " << cshift.first << ":" << cshift.second << " Original " << x << ":"
956  << y;
957  x -= cshift.first;
958  y += cshift.second;
959  if (debug) {
960  st1 << " Final " << x << ":" << y;
961  edm::LogVerbatim("HGCalGeom") << st1.str();
962  }
963  }
964  }
965  if (!reco) {
968  }
969  return std::make_pair(x, y);
970 }
971 
972 bool HGCalDDDConstants::maskCell(const DetId& detId, int corners) const {
973  bool mask(false);
974  if (corners > 2 && corners <= static_cast<int>(HGCalParameters::k_CornerSize)) {
975  if (waferHexagon8()) {
976  int N(0), layer(0), waferU(0), waferV(0), u(0), v(0);
977  if (detId.det() == DetId::Forward) {
979  N = getUVMax(id.type());
980  layer = id.layer();
981  waferU = id.waferU();
982  waferV = id.waferV();
983  u = id.cellU();
984  v = id.cellV();
985  } else {
987  N = getUVMax(id.type());
988  layer = id.layer();
989  waferU = id.waferU();
990  waferV = id.waferV();
991  u = id.cellU();
992  v = id.cellV();
993  }
995  auto itr = hgpar_->waferTypes_.find(wl);
996  auto ktr = hgpar_->waferInfoMap_.find(wl);
997 #ifdef EDM_ML_DEBUG
998  edm::LogVerbatim("HGCalGeom") << "MaskCell: Layer " << layer << " Wafer " << waferU << ":" << waferV << " Index "
999  << wl << ":" << (itr != hgpar_->waferTypes_.end()) << ":"
1000  << (ktr != hgpar_->waferInfoMap_.end());
1001 #endif
1002  if (cassetteMode()) {
1003  int part = (ktr != hgpar_->waferInfoMap_.end()) ? (ktr->second).part : HGCalTypes::WaferFull;
1004  mask = !(HGCalWaferMask::goodCell(u, v, part));
1005  } else if (itr != hgpar_->waferTypes_.end()) {
1006  if ((itr->second).second <= HGCalTypes::k_OffsetRotation)
1007  mask = HGCalWaferMask::maskCell(u, v, N, (itr->second).first, (itr->second).second, corners);
1008  else
1010  u, v, N, (itr->second).first, ((itr->second).second - HGCalTypes::k_OffsetRotation)));
1011  }
1012  }
1013  }
1014  return mask;
1015 }
1016 
1018  int cells(0);
1019  for (unsigned int i = 0; i < layers(reco); ++i) {
1020  int lay = reco ? hgpar_->depth_[i] : hgpar_->layer_[i];
1021  if (cells < maxCells(lay, reco))
1022  cells = maxCells(lay, reco);
1023  }
1024  return cells;
1025 }
1026 
1027 int HGCalDDDConstants::maxCells(int lay, bool reco) const {
1028  const auto& index = getIndex(lay, reco);
1029  if (index.first < 0)
1030  return 0;
1031  if (waferHexagon6()) {
1032  unsigned int cells(0);
1033  for (unsigned int k = 0; k < hgpar_->waferTypeT_.size(); ++k) {
1034  if (waferInLayerTest(k, index.first, hgpar_->defineFull_)) {
1035  unsigned int cell = (hgpar_->waferTypeT_[k] - 1 == HGCSiliconDetId::HGCalFine) ? (hgpar_->cellFineX_.size())
1036  : (hgpar_->cellCoarseX_.size());
1037  if (cell > cells)
1038  cells = cell;
1039  }
1040  }
1041  return static_cast<int>(cells);
1042  } else if (waferHexagon8()) {
1043  int cells(0);
1044  for (unsigned int k = 0; k < hgpar_->waferCopy_.size(); ++k) {
1045  if (waferInLayerTest(k, index.first, hgpar_->defineFull_)) {
1049  : hgpar_->waferTypeL_[itr->second]);
1051  cells = std::max(cells, 3 * N * N);
1052  }
1053  }
1054  return cells;
1055  } else if (tileTrapezoid()) {
1056  return hgpar_->scintCells(index.first + hgpar_->firstLayer_);
1057  } else {
1058  return 0;
1059  }
1060 }
1061 
1062 int HGCalDDDConstants::maxRows(int lay, bool reco) const {
1063  int kymax(0);
1064  const auto& index = getIndex(lay, reco);
1065  int i = index.first;
1066  if (i < 0)
1067  return kymax;
1068  if (waferHexagon6()) {
1069  for (unsigned int k = 0; k < hgpar_->waferCopy_.size(); ++k) {
1071  int ky = ((hgpar_->waferCopy_[k]) / 100) % 100;
1072  if (ky > kymax)
1073  kymax = ky;
1074  }
1075  }
1076  } else if (waferHexagon8()) {
1077  kymax = 1 + 2 * hgpar_->waferUVMaxLayer_[index.first];
1078  }
1079  return kymax;
1080 }
1081 
1082 int HGCalDDDConstants::modifyUV(int uv, int type1, int type2) const {
1083  // Modify u/v for transition of type1 to type2
1084  return (((type1 == type2) || (type1 * type2 != 0)) ? uv : ((type1 == 0) ? (2 * uv + 1) / 3 : (3 * uv) / 2));
1085 }
1086 
1087 int HGCalDDDConstants::modules(int lay, bool reco) const {
1088  if (getIndex(lay, reco).first < 0)
1089  return 0;
1090  else
1091  return max_modules_layer_[static_cast<int>(reco)][lay];
1092 }
1093 
1094 int HGCalDDDConstants::modulesInit(int lay, bool reco) const {
1095  int nmod(0);
1096  const auto& index = getIndex(lay, reco);
1097  if (index.first < 0)
1098  return nmod;
1099  if (!tileTrapezoid()) {
1100  for (unsigned int k = 0; k < hgpar_->waferPosX_.size(); ++k) {
1101  if (waferInLayerTest(k, index.first, hgpar_->defineFull_))
1102  ++nmod;
1103  }
1104  } else {
1105  nmod = 1 + hgpar_->lastModule_[index.first] - hgpar_->firstModule_[index.first];
1106  }
1107  return nmod;
1108 }
1109 
1112 }
1113 
1117  ? tileCount(0, -1)
1118  : 0;
1119  if (cells == 0) {
1120  unsigned int nlayer = (reco) ? hgpar_->depth_.size() : hgpar_->layer_.size();
1121  for (unsigned k = 0; k < nlayer; ++k) {
1122  std::vector<int> ncells = numberCells(((reco) ? hgpar_->depth_[k] : hgpar_->layer_[k]), reco);
1123  cells = std::accumulate(ncells.begin(), ncells.end(), cells);
1124  }
1125  }
1126  return cells;
1127 }
1128 
1129 std::vector<int> HGCalDDDConstants::numberCells(int lay, bool reco) const {
1130  const auto& index = getIndex(lay, reco);
1131  int i = index.first;
1132  std::vector<int> ncell;
1133  if (i >= 0) {
1134  if (waferHexagon6()) {
1135  for (unsigned int k = 0; k < hgpar_->waferTypeT_.size(); ++k) {
1137  unsigned int cell = (hgpar_->waferTypeT_[k] - 1 == HGCSiliconDetId::HGCalFine)
1138  ? (hgpar_->cellFineX_.size())
1139  : (hgpar_->cellCoarseX_.size());
1140  ncell.emplace_back(static_cast<int>(cell));
1141  }
1142  }
1143  } else if (tileTrapezoid()) {
1144  int nphi = hgpar_->scintCells(lay);
1145  for (int k = hgpar_->firstModule_[i]; k <= hgpar_->lastModule_[i]; ++k)
1146  ncell.emplace_back(nphi);
1147  } else {
1148  for (unsigned int k = 0; k < hgpar_->waferCopy_.size(); ++k) {
1149  if (waferInLayerTest(k, index.first, hgpar_->defineFull_)) {
1150  int cell = numberCellsHexagon(lay,
1153  true);
1154  ncell.emplace_back(cell);
1155  }
1156  }
1157  }
1158  }
1159  return ncell;
1160 }
1161 
1163  if (wafer >= 0 && wafer < static_cast<int>(hgpar_->waferTypeT_.size())) {
1164  if (hgpar_->waferTypeT_[wafer] - 1 == HGCSiliconDetId::HGCalFine)
1165  return static_cast<int>(hgpar_->cellFineX_.size());
1166  else
1167  return static_cast<int>(hgpar_->cellCoarseX_.size());
1168  } else {
1169  return 0;
1170  }
1171 }
1172 
1173 int HGCalDDDConstants::numberCellsHexagon(int lay, int waferU, int waferV, bool flag) const {
1175  int type =
1176  ((itr == hgpar_->typesInLayers_.end()) ? HGCSiliconDetId::HGCalCoarseThick : hgpar_->waferTypeL_[itr->second]);
1177  int N = (type == 0) ? hgpar_->nCellsFine_ : hgpar_->nCellsCoarse_;
1178  if (flag)
1179  return (3 * N * N);
1180  else
1181  return N;
1182 }
1183 
1184 std::pair<double, double> HGCalDDDConstants::rangeR(double z, bool reco) const {
1185  double rmin(0), rmax(0), zz(0);
1186  if (hgpar_->detectorType_ > 0) {
1188  if (hgpar_->detectorType_ <= 2) {
1190  } else {
1191  rmin = HGCalGeomTools::radius(
1193  }
1194  if ((hgpar_->detectorType_ == 2) && (zz >= hgpar_->zLayerHex_[hgpar_->firstMixedLayer_ - 1])) {
1195  rmax = HGCalGeomTools::radius(
1197  } else {
1199  }
1200  }
1201  if (!reco) {
1204  }
1205 #ifdef EDM_ML_DEBUG
1206  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:rangeR: " << z << ":" << zz << " R " << rmin << ":" << rmax;
1207 #endif
1208  return std::make_pair(rmin, rmax);
1209 }
1210 
1211 std::pair<double, double> HGCalDDDConstants::rangeRLayer(int lay, bool reco) const {
1212  double rmin(0), rmax(0);
1213  const auto& index = getIndex(lay, reco);
1214  if (index.first >= 0 && index.first < static_cast<int>(hgpar_->rMinLayHex_.size())) {
1215  rmin = hgpar_->rMinLayHex_[index.first];
1216  rmax = hgpar_->rMaxLayHex_[index.first];
1217  }
1218  if (!reco) {
1221  }
1222 #ifdef EDM_ML_DEBUG
1223  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:rangeR: " << lay << ":" << index.first << " R " << rmin << ":"
1224  << rmax;
1225 #endif
1226  return std::make_pair(rmin, rmax);
1227 }
1228 
1229 std::pair<double, double> HGCalDDDConstants::rangeZ(bool reco) const {
1230  double zmin = (hgpar_->zLayerHex_[0] - hgpar_->waferThick_);
1231  double zmax = (hgpar_->zLayerHex_[hgpar_->zLayerHex_.size() - 1] + hgpar_->waferThick_);
1232 #ifdef EDM_ML_DEBUG
1233  edm::LogVerbatim("HGCalGeom") << "HGCalDDDConstants:rangeZ: " << zmin << ":" << zmax << ":" << hgpar_->waferThick_;
1234 #endif
1235  if (!reco) {
1238  }
1239  return std::make_pair(zmin, zmax);
1240 }
1241 
1242 std::pair<int, int> HGCalDDDConstants::rowColumnWafer(int wafer) const {
1243  int row(0), col(0);
1244  if (wafer < static_cast<int>(hgpar_->waferCopy_.size())) {
1245  int copy = hgpar_->waferCopy_[wafer];
1248  ;
1249  }
1250  return std::make_pair(row, col);
1251 }
1252 
1255 }
1256 
1257 std::pair<int, int> HGCalDDDConstants::simToReco(int cell, int lay, int mod, bool half) const {
1258  if (!waferHexagon6()) {
1259  return std::make_pair(cell, lay);
1260  } else {
1261  const auto& index = getIndex(lay, false);
1262  int i = index.first;
1263  if (i < 0) {
1264  edm::LogWarning("HGCalGeom") << "Wrong Layer # " << lay << " not in the list ***** ERROR *****";
1265  return std::make_pair(-1, -1);
1266  }
1267  if (mod >= static_cast<int>(hgpar_->waferTypeL_.size())) {
1268  edm::LogWarning("HGCalGeom") << "Invalid Wafer # " << mod << "should be < " << (hgpar_->waferTypeL_).size()
1269  << " ***** ERROR *****";
1270  return std::make_pair(-1, -1);
1271  }
1272  int depth(-1);
1273  int kx = cell;
1274  int type = hgpar_->waferTypeL_[mod];
1275  if (type == 1) {
1276  depth = hgpar_->layerGroup_[i];
1277  } else if (type == 2) {
1278  depth = hgpar_->layerGroupM_[i];
1279  } else {
1280  depth = hgpar_->layerGroupO_[i];
1281  }
1282  return std::make_pair(kx, depth);
1283  }
1284 }
1285 
1287  int laymin(layer), laymax(layer), ringmin(ring), ringmax(ring), kount(0);
1288  if (layer == 0) {
1289  laymin = hgpar_->firstLayer_;
1290  laymax = lastLayer(true);
1291  }
1292 #ifdef EDM_ML_DEBUG
1293  edm::LogVerbatim("HGCalGeom") << "tileCount: layer " << layer << " ring " << ring << " layerMin/Max " << laymin << ":"
1294  << laymax;
1295 #endif
1296  for (int lay = laymin; lay <= laymax; ++lay) {
1297  if (ring < 0) {
1298  int ll = lay - hgpar_->firstLayer_;
1299  ringmin = hgpar_->tileRingRange_[ll].first;
1300  ringmax = hgpar_->tileRingRange_[ll].second;
1301  }
1302 #ifdef EDM_ML_DEBUG
1303  edm::LogVerbatim("HGCalGeom") << "tileCount: lay " << lay << ":" << (lay - hgpar_->firstLayer_) << " rings "
1304  << ringmin << ":" << ringmax;
1305 #endif
1306  for (int rin = ringmin; rin <= ringmax; ++rin) {
1307  int indx = HGCalTileIndex::tileIndex(lay, rin + 1, 0);
1308  auto itr = hgpar_->tileInfoMap_.find(indx);
1309 #ifdef EDM_ML_DEBUG
1310  edm::LogVerbatim("HGCalGeom") << "tileCount: rin " << rin << " indx " << indx << " itr "
1311  << (itr != hgpar_->tileInfoMap_.end());
1312 #endif
1313  if (itr != hgpar_->tileInfoMap_.end()) {
1314  for (int k = 0; k < 4; ++k) {
1315  std::bitset<24> b(itr->second.hex[k]);
1316  kount += b.count();
1317  }
1318  }
1319 #ifdef EDM_ML_DEBUG
1320  edm::LogVerbatim("HGCalGeom") << "tileCount: lay|rin " << lay << ":" << rin << " kount " << kount;
1321 #endif
1322  }
1323  }
1324  return (3 * kount);
1325 }
1326 
1327 bool HGCalDDDConstants::tileExist(int zside, int layer, int ring, int phi) const {
1328  int indx = HGCalTileIndex::tileIndex(layer, ring, 0);
1329  auto itr = hgpar_->tileInfoMap_.find(indx);
1330  bool ok = (itr == hgpar_->tileInfoMap_.end()) ? false : HGCalTileIndex::tileExist(itr->second.hex, zside, phi);
1331  return ok;
1332 }
1333 
1335  int indx = HGCalTileIndex::tileIndex(layer, ring, 0);
1336  auto itr = hgpar_->tileInfoMap_.find(indx);
1337  return ((itr == hgpar_->tileInfoMap_.end()) ? HGCalParameters::tileInfo() : itr->second);
1338 }
1339 
1340 bool HGCalDDDConstants::tilePhiEdge(double phi, int layer, int iphi) const {
1341  double dif1 = std::abs(phi - hgpar_->scintCellSize(layer) * (iphi - 1));
1342  double dif2 = std::abs(phi - hgpar_->scintCellSize(layer) * iphi);
1343 #ifdef EDM_ML_DEBUG
1344  edm::LogVerbatim("HGCalGeomT") << "HGCalDDDConstants::tilePhiEdge:: input: " << phi << ":" << layer << ":" << iphi
1345  << " Differences " << dif1 << ":" << dif2;
1346 #endif
1347  return ((dif1 < tol_) || (dif2 < tol_));
1348 }
1349 
1350 bool HGCalDDDConstants::tileRingEdge(double r, int layer, int ring) const {
1351  int type = hgpar_->scintType(layer);
1352  double dif1 = std::abs(r - hgpar_->radiusLayer_[type][ring - 1]);
1353  double dif2 = std::abs(r - hgpar_->radiusLayer_[type][ring]);
1354 #ifdef EDM_ML_DEBUG
1355  edm::LogVerbatim("HGCalGeomT") << "HGCalDDDConstants::tileRingEdge:: input: " << r << ":" << layer << ":" << ring
1356  << " Differences " << dif1 << ":" << dif2;
1357 #endif
1358  return ((dif1 < tol_) || (dif2 < tol_));
1359 }
1360 std::pair<int, int> HGCalDDDConstants::tileRings(int layer) const {
1361  if (trapezoidFile()) {
1362  int ll = layer - hgpar_->firstLayer_;
1363  if (ll >= 0 && ll < static_cast<int>(hgpar_->tileRingRange_.size()))
1364  return hgpar_->tileRingRange_[ll];
1365  }
1366  return std::make_pair(0, 0);
1367 }
1368 
1369 std::pair<int, int> HGCalDDDConstants::tileType(int layer, int ring, int phi) const {
1370  int indx = HGCalTileIndex::tileIndex(layer, ring, phi);
1371  int type(-1), sipm(-1);
1372  auto itr = hgpar_->tileInfoMap_.find(indx);
1373  if (itr != hgpar_->tileInfoMap_.end()) {
1374  type = 1 + (itr->second).type;
1375  sipm = ((itr->second).sipm == HGCalTypes::SiPMLarge) ? 0 : 1;
1376  }
1377  return std::make_pair(type, sipm);
1378 }
1379 
1381  const int ncopies = hgpar_->waferCopy_.size();
1382  int wafer(ncopies);
1383  bool result(false);
1384  for (int k = 0; k < ncopies; ++k) {
1385  if (copy == hgpar_->waferCopy_[k]) {
1386  wafer = k;
1387  result = true;
1388  break;
1389  }
1390  }
1391  if (!result) {
1392  wafer = -1;
1393 #ifdef EDM_ML_DEBUG
1394  edm::LogVerbatim("HGCalGeom") << "Cannot find " << copy << " in a list of " << ncopies << " members";
1395  for (int k = 0; k < ncopies; ++k)
1396  edm::LogVerbatim("HGCalGeom") << "[" << k << "] " << hgpar_->waferCopy_[k];
1397 #endif
1398  }
1399 #ifdef EDM_ML_DEBUG
1400  edm::LogVerbatim("HGCalGeom") << "WaferFromCopy " << copy << ":" << wafer << ":" << result;
1401 #endif
1402  return wafer;
1403 }
1404 
1405 void HGCalDDDConstants::waferFromPosition(const double x, const double y, int& wafer, int& icell, int& celltyp) const {
1406  // Input x, y in Geant4 unit and transformed to CMSSW standard
1409  int size_ = static_cast<int>(hgpar_->waferCopy_.size());
1410  wafer = size_;
1411  for (int k = 0; k < size_; ++k) {
1412  double dx = std::abs(xx - hgpar_->waferPosX_[k]);
1413  double dy = std::abs(yy - hgpar_->waferPosY_[k]);
1414  if (dx <= rmax_ && dy <= hexside_) {
1415  if ((dy <= 0.5 * hexside_) || (dx * tan30deg_ <= (hexside_ - dy))) {
1416  wafer = k;
1417  celltyp = hgpar_->waferTypeT_[k];
1418  xx -= hgpar_->waferPosX_[k];
1419  yy -= hgpar_->waferPosY_[k];
1420  break;
1421  }
1422  }
1423  }
1424  if (wafer < size_) {
1425  if (celltyp - 1 == HGCSiliconDetId::HGCalFine)
1426  icell = cellHex(
1428  else
1429  icell = cellHex(xx,
1430  yy,
1433  hgpar_->cellCoarseY_);
1434  } else {
1435  wafer = -1;
1436 #ifdef EDM_ML_DEBUG
1437  edm::LogWarning("HGCalGeom") << "Cannot get wafer type corresponding to " << x << ":" << y << " " << xx << ":"
1438  << yy;
1439 #endif
1440  }
1441 #ifdef EDM_ML_DEBUG
1442  edm::LogVerbatim("HGCalGeom") << "Position " << x << ":" << y << " Wafer " << wafer << ":" << size_ << " XX " << xx
1443  << ":" << yy << " Cell " << icell << " Type " << celltyp;
1444 #endif
1445 }
1446 
1448  const double y,
1449  const int zside,
1450  const int layer,
1451  int& waferU,
1452  int& waferV,
1453  int& cellU,
1454  int& cellV,
1455  int& celltype,
1456  double& wt,
1457  bool extend,
1458  bool debug) const {
1459  // Expect x, y as in SIM step
1460  waferU = waferV = 1 + hgpar_->waferUVMax_;
1461  cellU = cellV = celltype = 0;
1462  if ((hgpar_->xLayerHex_.empty()) || (hgpar_->yLayerHex_.empty()))
1463  return;
1464  int ll = layer - hgpar_->firstLayer_;
1465  int layertype = layerType(layer);
1466  bool rotx = ((!hgpar_->layerType_.empty()) && (layertype == HGCalTypes::WaferCenterR));
1467  double xx(0), yy(0);
1468  if (rotx) {
1469  std::pair<double, double> xy =
1471  xx = xy.first - hgpar_->xLayerHex_[ll];
1472  yy = xy.second - hgpar_->yLayerHex_[ll];
1473  } else {
1476  }
1477  if (debug)
1478  edm::LogVerbatim("HGCalGeom") << "waferFromPosition:: Layer " << layer << ":" << ll << " Rot " << rotx << " X " << x
1479  << ":" << xx << " Y " << y << ":" << yy;
1480  double rmax = extend ? rmaxT_ : rmax_;
1481  double hexside = extend ? hexsideT_ : hexside_;
1482  for (unsigned int k = 0; k < hgpar_->waferPosX_.size(); ++k) {
1483  double dx0(0), dy0(0);
1486  if (cassetteMode()) {
1488  auto ktr = hgpar_->waferInfoMap_.find(indx);
1489  if (ktr != hgpar_->waferInfoMap_.end()) {
1490  auto cshift = hgcassette_.getShift(layer, -1, (ktr->second).cassette);
1491  if (debug)
1492  edm::LogVerbatim("HGCalGeom") << "Cassette " << (ktr->second).cassette << " Shift " << cshift.first << ":"
1493  << cshift.second;
1494  dx0 = -cshift.first;
1495  dy0 = cshift.second;
1496  }
1497  }
1498  double dx = std::abs(xx - dx0 - hgpar_->waferPosX_[k]);
1499  double dy = std::abs(yy - dy0 - hgpar_->waferPosY_[k]);
1500  if (dx <= rmax && dy <= hexside) {
1501  if ((dy <= 0.5 * hexside) || (dx * tan30deg_ <= (hexside - dy))) {
1502  if (waferHexagon8File()) {
1505  if (debug)
1506  edm::LogVerbatim("HGCalGeom") << "Position (" << x << ", " << y << ") Wafer type:partial:orient:cassette "
1507  << celltype << ":" << HGCalWaferType::getPartial(index, hgpar_->waferInfoMap_)
1510  } else {
1512  celltype = ((itr == hgpar_->typesInLayers_.end()) ? HGCSiliconDetId::HGCalCoarseThick
1513  : hgpar_->waferTypeL_[itr->second]);
1514  }
1515  if (debug)
1516  edm::LogVerbatim("HGCalGeom") << "WaferFromPosition:: Input " << layer << ":" << ll << ":"
1517  << hgpar_->firstLayer_ << ":" << rotx << ":" << x << ":" << y << ":"
1518  << hgpar_->xLayerHex_[ll] << ":" << hgpar_->yLayerHex_[ll] << ":" << xx << ":"
1519  << yy << " compared with " << hgpar_->waferPosX_[k] << ":"
1520  << hgpar_->waferPosY_[k] << " difference " << dx << ":" << dy << ":"
1521  << dx * tan30deg_ << ":" << (hexside_ - dy) << " comparator " << rmax_ << ":"
1522  << rmaxT_ << ":" << hexside_ << ":" << hexsideT_ << " wafer " << waferU << ":"
1523  << waferV << ":" << celltype;
1524  xx -= (dx0 + hgpar_->waferPosX_[k]);
1525  yy -= (dy0 + hgpar_->waferPosY_[k]);
1526  break;
1527  }
1528  }
1529  }
1530  if ((std::abs(waferU) <= hgpar_->waferUVMax_) && (celltype >= 0)) {
1532  if (cassetteMode()) {
1534  auto ktr = hgpar_->waferInfoMap_.find(indx);
1535  if (ktr != hgpar_->waferInfoMap_.end()) {
1536  place = HGCalCell::cellPlacementIndex(1, HGCalTypes::layerFrontBack(layertype), (ktr->second).orient);
1537  part = (ktr->second).part;
1538  if (debug)
1539  edm::LogVerbatim("HGCalGeom") << "waferFromPosition: frontback " << layertype << ":"
1540  << HGCalTypes::layerFrontBack(layertype) << " Orient " << (ktr->second).orient
1541  << " place " << place << " part " << part;
1542  }
1543  }
1544  cellHex(xx, yy, celltype, place, part, cellU, cellV, extend, debug);
1545  wt = (((celltype < 2) && (hgpar_->useSimWt_ > 0)) ? (hgpar_->cellThickness_[celltype] / hgpar_->waferThick_) : 1.0);
1546  } else {
1547  cellU = cellV = 2 * hgpar_->nCellsFine_;
1548  wt = 1.0;
1549  celltype = -1;
1550  }
1551  if ((celltype < 0) && debug) {
1552  double x1(xx);
1553  double y1(yy);
1554  edm::LogVerbatim("HGCalGeom") << "waferfFromPosition: Bad type for X " << x << ":" << x1 << ":" << xx << " Y " << y
1555  << ":" << y1 << ":" << yy << " Wafer " << waferU << ":" << waferV << " Cell " << cellU
1556  << ":" << cellV;
1557  for (unsigned int k = 0; k < hgpar_->waferPosX_.size(); ++k) {
1558  double dx = std::abs(x1 - hgpar_->waferPosX_[k]);
1559  double dy = std::abs(y1 - hgpar_->waferPosY_[k]);
1560  edm::LogVerbatim("HGCalGeom") << "Wafer [" << k << "] Position (" << hgpar_->waferPosX_[k] << ", "
1561  << hgpar_->waferPosY_[k] << ") difference " << dx << ":" << dy << ":"
1562  << dx * tan30deg_ << ":" << hexside - dy << " Paramerers " << rmax << ":"
1563  << hexside;
1564  }
1565  }
1566  edm::LogVerbatim("HGCalGeomX") << "Input x:y:layer " << x << ":" << y << ":" << layer << " Wafer " << waferU << ":"
1567  << waferV << " Cell " << cellU << ":" << cellV << ":" << celltype << " wt " << wt;
1568 }
1569 
1570 bool HGCalDDDConstants::waferInLayer(int wafer, int lay, bool reco) const {
1571  const auto& indx = getIndex(lay, reco);
1572  if (indx.first < 0)
1573  return false;
1574  return waferInLayerTest(wafer, indx.first, hgpar_->defineFull_);
1575 }
1576 
1577 bool HGCalDDDConstants::waferFullInLayer(int wafer, int lay, bool reco) const {
1578  const auto& indx = getIndex(lay, reco);
1579  if (indx.first < 0)
1580  return false;
1581  return waferInLayerTest(wafer, indx.first, false);
1582 }
1583 
1585  int indx = HGCalWaferIndex::waferIndex(lay, waferU, waferV);
1586  auto itr = hgpar_->waferInfoMap_.find(indx);
1587  return ((itr == hgpar_->waferInfoMap_.end()) ? HGCalParameters::waferInfo() : itr->second);
1588 }
1589 
1590 std::pair<double, double> HGCalDDDConstants::waferParameters(bool reco) const {
1591  if (reco)
1592  return std::make_pair(rmax_, hexside_);
1593  else
1595 }
1596 
1597 std::pair<double, double> HGCalDDDConstants::waferPosition(int wafer, bool reco) const {
1598  double xx(0), yy(0);
1599  if (wafer >= 0 && wafer < static_cast<int>(hgpar_->waferPosX_.size())) {
1600  xx = hgpar_->waferPosX_[wafer];
1601  yy = hgpar_->waferPosY_[wafer];
1602  }
1603  if (!reco) {
1606  }
1607  return std::make_pair(xx, yy);
1608 }
1609 
1610 std::pair<double, double> HGCalDDDConstants::waferPosition(
1611  int lay, int waferU, int waferV, bool reco, bool debug) const {
1612  int ll = lay - hgpar_->firstLayer_;
1613  bool rotx = ((!hgpar_->layerType_.empty()) && (hgpar_->layerType_[ll] == HGCalTypes::WaferCenterR));
1614 #ifdef EDM_ML_DEBUG
1615  if (debug)
1616  edm::LogVerbatim("HGCalGeom") << "Layer " << lay << ":" << ll << " Rotation " << rotx << " U:V " << waferU << ":"
1617  << waferV;
1618 #endif
1619  auto xy = waferPositionNoRot(lay, waferU, waferV, reco, debug);
1620  std::pair<double, double> xy0 = (rotx) ? getXY(lay, xy.first, xy.second, false) : xy;
1621 #ifdef EDM_ML_DEBUG
1622  if (debug)
1623  edm::LogVerbatim("HGCalGeom") << "Without and with rotation " << xy.first << ":" << xy.second << ":" << xy0.first
1624  << ":" << xy0.second;
1625 #endif
1626  return xy0;
1627 }
1628 
1629 int HGCalDDDConstants::waferFileIndex(unsigned int kk) const {
1630  if (kk < hgpar_->waferInfoMap_.size()) {
1631  auto itr = hgpar_->waferInfoMap_.begin();
1632  std::advance(itr, kk);
1633  return itr->first;
1634  } else
1635  return 0;
1636 }
1637 
1638 std::tuple<int, int, int, int> HGCalDDDConstants::waferFileInfo(unsigned int kk) const {
1639  if (kk < hgpar_->waferInfoMap_.size()) {
1640  auto itr = hgpar_->waferInfoMap_.begin();
1641  std::advance(itr, kk);
1642  return std::make_tuple(itr->second.type, itr->second.part, itr->second.orient, itr->second.cassette);
1643  } else
1644  return std::make_tuple(0, 0, 0, 0);
1645 }
1646 
1647 std::tuple<int, int, int, int> HGCalDDDConstants::waferFileInfoFromIndex(int kk) const {
1648  auto itr = hgpar_->waferInfoMap_.find(kk);
1649  if (itr != hgpar_->waferInfoMap_.end()) {
1650  return std::make_tuple(itr->second.type, itr->second.part, itr->second.orient, itr->second.cassette);
1651  } else
1652  return std::make_tuple(0, 0, 0, 0);
1653 }
1654 
1656  HepGeom::Point3D<float>& loc, const DetId& id, bool useWafer, bool reco, bool debug) const {
1657  HGCSiliconDetId detid(id);
1658  double x(0), y(0);
1659  if (useWafer) {
1660  auto xyw = waferPositionNoRot(detid.layer(), detid.waferU(), detid.waferV(), reco, debug);
1661  x = xyw.first;
1662  y = xyw.second;
1663  }
1664  auto xy = getXY(detid.layer(), (x + loc.x()), (y + loc.y()), false);
1665  double zz = (detid.zside() < 0) ? -(loc.z() + waferZ(detid.layer(), reco)) : (loc.z() + waferZ(detid.layer(), reco));
1666  double xx = (detid.zside() < 0) ? -xy.first : xy.first;
1667  return GlobalPoint(xx, xy.second, zz);
1668 }
1669 
1671  int wafer(0);
1672  if (!tileTrapezoid()) {
1673  for (unsigned int i = 0; i < layers(true); ++i) {
1674  int lay = hgpar_->depth_[i];
1675  wafer += modules(lay, true);
1676  }
1677  } else {
1678  wafer = static_cast<int>(hgpar_->moduleLayR_.size());
1679  }
1680  return wafer;
1681 }
1682 
1683 int HGCalDDDConstants::wafers(int layer, int type) const {
1684  int wafer(0);
1685  if (!tileTrapezoid()) {
1686  auto itr = waferLayer_.find(layer);
1687  if (itr != waferLayer_.end()) {
1688  unsigned ity = (type > 0 && type <= 2) ? type : 0;
1689  wafer = (itr->second)[ity];
1690  }
1691  } else {
1692  const auto& index = getIndex(layer, true);
1693  wafer = 1 + hgpar_->lastModule_[index.first] - hgpar_->firstModule_[index.first];
1694  }
1695  return wafer;
1696 }
1697 
1698 int HGCalDDDConstants::waferType(DetId const& id, bool fromFile) const {
1699  int type(1);
1700  if (waferHexagon8()) {
1701  if (fromFile && (waferFileSize() > 0)) {
1702  int layer(0), waferU(0), waferV(0);
1703  if (id.det() != DetId::Forward) {
1704  HGCSiliconDetId hid(id);
1705  layer = hid.layer();
1706  waferU = hid.waferU();
1707  waferV = hid.waferV();
1708  } else {
1709  HFNoseDetId hid(id);
1710  layer = hid.layer();
1711  waferU = hid.waferU();
1712  waferV = hid.waferV();
1713  }
1715  if (itr != hgpar_->waferInfoMap_.end())
1716  type = (itr->second).type;
1717  } else {
1718  type = ((id.det() != DetId::Forward) ? HGCSiliconDetId(id).type() : HFNoseDetId(id).type());
1719  }
1720  } else if (waferHexagon6()) {
1721  type = waferTypeL(HGCalDetId(id).wafer()) - 1;
1722  }
1723  return type;
1724 }
1725 
1726 int HGCalDDDConstants::waferType(int layer, int waferU, int waferV, bool fromFile) const {
1728  if (waferHexagon8()) {
1729  if (fromFile && (waferFileSize() > 0)) {
1731  if (itr != hgpar_->waferInfoMap_.end())
1732  type = (itr->second).type;
1733  } else {
1735  if (itr != hgpar_->typesInLayers_.end())
1736  type = hgpar_->waferTypeL_[itr->second];
1737  }
1738  } else if (waferHexagon6()) {
1739  if ((waferU >= 0) && (waferU < static_cast<int>(hgpar_->waferTypeL_.size())))
1740  type = (hgpar_->waferTypeL_[waferU] - 1);
1741  }
1742  return type;
1743 }
1744 
1745 std::tuple<int, int, int> HGCalDDDConstants::waferType(HGCSiliconDetId const& id, bool fromFile) const {
1746  const auto& index = HGCalWaferIndex::waferIndex(id.layer(), id.waferU(), id.waferV());
1747  int type(-1), part(-1), orient(-1);
1748  if (fromFile && (waferFileSize() > 0)) {
1749  auto itr = hgpar_->waferInfoMap_.find(index);
1750  if (itr != hgpar_->waferInfoMap_.end()) {
1751  type = (itr->second).type;
1752  part = (itr->second).part;
1753  orient = (itr->second).orient;
1754  }
1755  } else {
1756  auto ktr = hgpar_->typesInLayers_.find(index);
1757  if (ktr != hgpar_->typesInLayers_.end())
1758  type = hgpar_->waferTypeL_[ktr->second];
1759  auto itr = hgpar_->waferTypes_.find(index);
1760  if (itr != hgpar_->waferTypes_.end()) {
1761  if ((itr->second).second < HGCalTypes::k_OffsetRotation) {
1762  orient = (itr->second).second;
1763  if ((itr->second).first == HGCalGeomTools::k_allCorners) {
1765  } else if ((itr->second).first == HGCalGeomTools::k_fiveCorners) {
1767  } else if ((itr->second).first == HGCalGeomTools::k_fourCorners) {
1769  } else if ((itr->second).first == HGCalGeomTools::k_threeCorners) {
1771  }
1772  } else {
1773  part = (itr->second).first;
1774  orient = ((itr->second).second - HGCalTypes::k_OffsetRotation);
1775  }
1776  } else {
1778  orient = 0;
1779  }
1780  }
1781  return std::make_tuple(type, part, orient);
1782 }
1783 
1785  int layer, int waferU, int waferV, bool fromFile, bool debug) const {
1786  int type(HGCalTypes::WaferOut), rotn(0);
1788  bool withinList(true);
1789  if (fromFile && (waferFileSize() > 0)) {
1790  auto itr = hgpar_->waferInfoMap_.find(wl);
1791  withinList = (itr != hgpar_->waferInfoMap_.end());
1792  if (withinList) {
1793  type = (itr->second).part;
1794  rotn = (itr->second).orient;
1795  }
1796  } else {
1797  auto itr = hgpar_->waferTypes_.find(wl);
1798  if (waferHexagon8()) {
1799  withinList = (itr != hgpar_->waferTypes_.end());
1800  if (withinList) {
1801  if ((itr->second).second < HGCalTypes::k_OffsetRotation) {
1802  rotn = (itr->second).second;
1803  if ((itr->second).first == HGCalGeomTools::k_allCorners) {
1805  } else if ((itr->second).first == HGCalGeomTools::k_fiveCorners) {
1807  } else if ((itr->second).first == HGCalGeomTools::k_fourCorners) {
1809  } else if ((itr->second).first == HGCalGeomTools::k_threeCorners) {
1811  }
1812  } else {
1813  type = (itr->second).first;
1814  rotn = ((itr->second).second - HGCalTypes::k_OffsetRotation);
1815  }
1816  } else {
1818  rotn = HGCalTypes::WaferCorner0;
1819  }
1820  }
1821  }
1822 #ifdef EDM_ML_DEBUG
1823  if (debug)
1824  edm::LogVerbatim("HGCalGeom") << "waferTypeRotation: Layer " << layer << " Wafer " << waferU << ":" << waferV
1825  << " Index " << std::hex << wl << std::dec << ":" << withinList << " Type " << type
1826  << " Rotation " << rotn;
1827 #endif
1828  return std::make_pair(type, rotn);
1829 }
1830 
1832  bool type(false);
1833  if (waferHexagon8()) {
1835  type = (hgpar_->waferTypes_.find(wl) != hgpar_->waferTypes_.end());
1836  } else if (waferHexagon6()) {
1837  int wl = HGCalWaferIndex::waferIndex(layer, waferU, 0, true);
1838  type = (hgpar_->waferTypes_.find(wl) != hgpar_->waferTypes_.end());
1839  }
1840  return type;
1841 }
1842 
1843 double HGCalDDDConstants::waferZ(int lay, bool reco) const {
1844  const auto& index = getIndex(lay, reco);
1845  if (index.first < 0)
1846  return 0;
1847  else
1849 }
1850 
1852  double xx, double yy, const double& cellR, const std::vector<double>& posX, const std::vector<double>& posY) const {
1853  int num(0);
1854  const double tol(0.00001);
1855  double cellY = 2.0 * cellR * tan30deg_;
1856  for (unsigned int k = 0; k < posX.size(); ++k) {
1857  double dx = std::abs(xx - posX[k]);
1858  double dy = std::abs(yy - posY[k]);
1859  if (dx <= (cellR + tol) && dy <= (cellY + tol)) {
1860  double xmax = (dy <= 0.5 * cellY) ? cellR : (cellR - (dy - 0.5 * cellY) / tan30deg_);
1861  if (dx <= (xmax + tol)) {
1862  num = k;
1863  break;
1864  }
1865  }
1866  }
1867  return num;
1868 }
1869 
1871  double xloc, double yloc, int cellType, int place, int part, int& cellU, int& cellV, bool extend, bool debug) const {
1872  if (cassetteMode()) {
1873  auto uv = (part == HGCalTypes::WaferFull)
1874  ? hgcellUV_->cellUVFromXY3(xloc, yloc, place, cellType, true, debug)
1875  : hgcellUV_->cellUVFromXY1(xloc, yloc, place, cellType, part, true, debug);
1876  cellU = uv.first;
1877  cellV = uv.second;
1878  } else if (waferHexagon8File()) {
1879  auto uv = hgcellUV_->cellUVFromXY3(xloc, yloc, place, cellType, extend, debug);
1880  cellU = uv.first;
1881  cellV = uv.second;
1882  } else {
1883  int ncell = (cellType == 0) ? hgpar_->nCellsFine_ : hgpar_->nCellsCoarse_;
1884  double delY = 2 * rmax_ / (3 * ncell);
1885  double delX = 0.5 * delY * sqrt3_;
1886  double delYT = (extend) ? (2 * rmaxT_ / (3 * ncell)) : delY;
1887  double delXT = 0.5 * delYT * sqrt3_;
1888  double v0 = ((xloc / delY - 1.0) / 1.5);
1889  int cv0 = (v0 > 0) ? (ncell + static_cast<int>(v0 + 0.5)) : (ncell - static_cast<int>(-v0 + 0.5));
1890  double u0 = (0.5 * yloc / delX + 0.5 * cv0);
1891  int cu0 = (u0 > 0) ? (ncell / 2 + static_cast<int>(u0 + 0.5)) : (ncell / 2 - static_cast<int>(-u0 + 0.5));
1892  cu0 = std::max(0, std::min(cu0, 2 * ncell - 1));
1893  cv0 = std::max(0, std::min(cv0, 2 * ncell - 1));
1894  if (cv0 - cu0 >= ncell)
1895  cv0 = cu0 + ncell - 1;
1896  if (debug)
1897  edm::LogVerbatim("HGCalGeom") << "cellHex: input " << xloc << ":" << yloc << ":" << cellType << " parameter "
1898  << delX << ":" << delY << " u0 " << u0 << ":" << cu0 << " v0 " << v0 << ":" << cv0;
1899  bool found(false);
1900  static constexpr int shift[3] = {0, 1, -1};
1901  for (int i1 = 0; i1 < 3; ++i1) {
1902  cellU = cu0 + shift[i1];
1903  for (int i2 = 0; i2 < 3; ++i2) {
1904  cellV = cv0 + shift[i2];
1905  if (((cellV - cellU) < ncell) && ((cellU - cellV) <= ncell) && (cellU >= 0) && (cellV >= 0) &&
1906  (cellU < 2 * ncell) && (cellV < 2 * ncell)) {
1907  double xc = (1.5 * (cellV - ncell) + 1.0) * delY;
1908  double yc = (2 * cellU - cellV - ncell) * delX;
1909  if ((std::abs(yloc - yc) <= delXT) && (std::abs(xloc - xc) <= delYT) &&
1910  ((std::abs(xloc - xc) <= 0.5 * delYT) ||
1911  (std::abs(yloc - yc) <= sqrt3_ * (delYT - std::abs(xloc - xc))))) {
1912  if (debug)
1913  edm::LogVerbatim("HGCalGeom")
1914  << "cellHex: local " << xc << ":" << yc << " difference " << std::abs(xloc - xc) << ":"
1915  << std::abs(yloc - yc) << ":" << sqrt3_ * (delY - std::abs(yloc - yc)) << " comparator " << delX
1916  << ":" << delY << " (u,v) = (" << cellU << "," << cellV << ")";
1917  found = true;
1918  break;
1919  }
1920  }
1921  }
1922  if (found)
1923  break;
1924  }
1925  if (!found) {
1926  cellU = cu0;
1927  cellV = cv0;
1928  }
1929  }
1930 }
1931 
1932 std::pair<int, float> HGCalDDDConstants::getIndex(int lay, bool reco) const {
1933  int indx = layerIndex(lay, reco);
1934  if (indx < 0)
1935  return std::make_pair(-1, 0);
1936  float cell(0);
1937  if (waferHexagon6()) {
1938  cell = (reco ? hgpar_->moduleCellR_[0] : hgpar_->moduleCellS_[0]);
1939  } else {
1940  if (waferHexagon8()) {
1941  cell = (reco ? hgpar_->moduleCellR_[0] : hgpar_->moduleCellS_[0]);
1942  } else {
1943  cell = hgpar_->scintCellSize(lay);
1944  }
1945  }
1946  return std::make_pair(indx, cell);
1947 }
1948 
1950  int ll(-1);
1951  if (waferHexagon6() && reco) {
1952  ll = static_cast<int>(std::find(hgpar_->depthLayerF_.begin(), hgpar_->depthLayerF_.end(), index) -
1953  hgpar_->depthLayerF_.begin());
1954  if (ll == static_cast<int>(hgpar_->depthLayerF_.size()))
1955  ll = -1;
1956  } else {
1957  ll = static_cast<int>(std::find(hgpar_->layerIndex_.begin(), hgpar_->layerIndex_.end(), index) -
1958  hgpar_->layerIndex_.begin());
1959  if (ll == static_cast<int>(hgpar_->layerIndex_.size()))
1960  ll = -1;
1961  }
1962 #ifdef EDM_ML_DEBUG
1963  edm::LogVerbatim("HGCalGeom") << "LayerFromIndex for " << index << ":" << reco << ":" << waferHexagon6() << " is"
1964  << ll << ":" << (ll + hgpar_->firstLayer_);
1965 #endif
1966  return ((ll < 0) ? ll : (ll + hgpar_->firstLayer_));
1967 }
1968 
1969 bool HGCalDDDConstants::isValidCell(int lay, int wafer, int cell) const {
1970  // Calculate the position of the cell
1971  // Works for options HGCalHexagon/HGCalHexagonFull
1972  double x = hgpar_->waferPosX_[wafer];
1973  double y = hgpar_->waferPosY_[wafer];
1974  if (hgpar_->waferTypeT_[wafer] - 1 == HGCSiliconDetId::HGCalFine) {
1975  x += hgpar_->cellFineX_[cell];
1976  y += hgpar_->cellFineY_[cell];
1977  } else {
1978  x += hgpar_->cellCoarseX_[cell];
1979  y += hgpar_->cellCoarseY_[cell];
1980  }
1981  double rr = sqrt(x * x + y * y);
1982  bool result = ((rr >= hgpar_->rMinLayHex_[lay - 1]) && (rr <= hgpar_->rMaxLayHex_[lay - 1]) &&
1983  (wafer < static_cast<int>(hgpar_->waferPosX_.size())));
1984 #ifdef EDM_ML_DEBUG
1985  if (!result)
1986  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << wafer << ":" << cell << " Position " << x << ":" << y
1987  << ":" << rr << " Compare Limits " << hgpar_->rMinLayHex_[lay - 1] << ":"
1988  << hgpar_->rMaxLayHex_[lay - 1] << " Flag " << result;
1989 #endif
1990  return result;
1991 }
1992 
1993 bool HGCalDDDConstants::isValidCell8(int lay, int waferU, int waferV, int cellU, int cellV, int type) const {
1994  bool result(false);
1995  auto partn = waferTypeRotation(lay, waferU, waferV, false, false);
1996 #ifdef EDM_ML_DEBUG
1997  edm::LogVerbatim("HGCalGeom") << "waferHexagon8 " << waferHexagon8File() << ":" << mode_ << ":" << cassetteMode()
1998  << " part " << partn.first << ":" << partn.second;
1999 #endif
2000  if (cassetteMode()) {
2001  result = HGCalWaferMask::goodCell(cellU, cellV, partn.first);
2002 #ifdef EDM_ML_DEBUG
2003  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << waferU << ":" << waferV << ":" << cellU << ":" << cellV
2004  << " Result " << result << " from goodCell";
2005 #endif
2006  } else {
2007  float x(0), y(0);
2008  int kndx = cellV * 100 + cellU;
2009  if (type == 0) {
2010  auto ktr = hgpar_->cellFineIndex_.find(kndx);
2011  if (ktr != hgpar_->cellFineIndex_.end()) {
2012  x = hgpar_->cellFineX_[ktr->second];
2013  y = hgpar_->cellFineY_[ktr->second];
2014  }
2015 #ifdef EDM_ML_DEBUG
2016  edm::LogVerbatim("HGCalGeom") << "Fine " << cellU << ":" << cellV << ":" << kndx << ":" << x << ":" << y << ":"
2017  << (ktr != hgpar_->cellFineIndex_.end());
2018 #endif
2019  } else {
2020  auto ktr = hgpar_->cellCoarseIndex_.find(kndx);
2021  if (ktr != hgpar_->cellCoarseIndex_.end()) {
2022  x = hgpar_->cellCoarseX_[ktr->second];
2023  y = hgpar_->cellCoarseY_[ktr->second];
2024  }
2025 #ifdef EDM_ML_DEBUG
2026  edm::LogVerbatim("HGCalGeom") << "Coarse " << cellU << ":" << cellV << ":" << kndx << ":" << x << ":" << y << ":"
2027  << (ktr != hgpar_->cellCoarseIndex_.end());
2028 #endif
2029  }
2030  const auto& xy = waferPositionNoRot(lay, waferU, waferV, true, false);
2031  x += xy.first;
2032  y += xy.second;
2033 #ifdef EDM_ML_DEBUG
2034  edm::LogVerbatim("HGCalGeom") << "With wafer (" << waferU << "," << waferV << ") " << x << ":" << y;
2035 #endif
2036  double rr = sqrt(x * x + y * y);
2037  int ll = lay - hgpar_->firstLayer_;
2038  double tol = waferHexagon8File() ? 0.5 : 0.0;
2039  result = (((rr + tol) >= hgpar_->rMinLayHex_[ll]) && (rr <= hgpar_->rMaxLayHex_[ll]));
2040 #ifdef EDM_ML_DEBUG
2041  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << ll << ":" << waferU << ":" << waferV << ":" << cellU
2042  << ":" << cellV << " Position " << x << ":" << y << ":" << rr << " Compare Limits "
2043  << hgpar_->rMinLayHex_[ll] << ":" << hgpar_->rMaxLayHex_[ll] << " Flag " << result
2044  << " from Radius Limits";
2045 #endif
2046  if (result && waferHexagon8File()) {
2047  int N = (type == 0) ? hgpar_->nCellsFine_ : hgpar_->nCellsCoarse_;
2048  result = HGCalWaferMask::goodCell(cellU, cellV, N, partn.first, partn.second);
2049 #ifdef EDM_ML_DEBUG
2050  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << waferU << ":" << waferV << ":" << cellU << ":" << cellV
2051  << " N " << N << " part " << partn.first << ":" << partn.second << " Result "
2052  << result << " from goodCell";
2053 #endif
2054  }
2055  }
2056  return result;
2057 }
2058 
2059 int32_t HGCalDDDConstants::waferIndex(int wafer, int index) const {
2060  int layer = layerFromIndex(index, true);
2064 #ifdef EDM_ML_DEBUG
2065  edm::LogVerbatim("HGCalGeom") << "WaferIndex for " << wafer << ":" << index << " (" << layer << ":" << waferU << ":"
2066  << waferV << ") " << indx;
2067 #endif
2068  return indx;
2069 }
2070 
2071 bool HGCalDDDConstants::waferInLayerTest(int wafer, int lay, bool full) const {
2072  bool in = (waferHexagon6()) ? true : false;
2073  if (!in) {
2074  double xpos = hgpar_->waferPosX_[wafer] + hgpar_->xLayerHex_[lay];
2075  double ypos = hgpar_->waferPosY_[wafer] + hgpar_->yLayerHex_[lay];
2076  std::pair<int, int> corner = HGCalGeomTools::waferCorner(
2077  xpos, ypos, rmax_, hexside_, hgpar_->rMinLayHex_[lay], hgpar_->rMaxLayHex_[lay], in);
2078  in = (full ? (corner.first > 0) : (corner.first == static_cast<int>(HGCalParameters::k_CornerSize)));
2079  if (in && fullAndPart_) {
2080  int indx = waferIndex(wafer, lay);
2081  in = (hgpar_->waferInfoMap_.find(indx) != hgpar_->waferInfoMap_.end());
2082 #ifdef EDM_ML_DEBUG
2083  if (!in)
2084  edm::LogVerbatim("HGCalGeom") << "WaferInLayerTest: Layer " << lay << " wafer " << wafer << " index " << indx
2085  << "( " << HGCalWaferIndex::waferLayer(indx) << ", "
2086  << HGCalWaferIndex::waferU(indx) << ", " << HGCalWaferIndex::waferV(indx)
2087  << ") in " << in;
2088 #endif
2089  }
2090 #ifdef EDM_ML_DEBUG
2091  edm::LogVerbatim("HGCalGeom") << "WaferInLayerTest: Layer " << lay << " wafer " << wafer << " R-limits "
2092  << hgpar_->rMinLayHex_[lay] << ":" << hgpar_->rMaxLayHex_[lay] << " Corners "
2093  << corner.first << ":" << corner.second << " In " << in;
2094 #endif
2095  }
2096  return in;
2097 }
2098 
2099 std::pair<double, double> HGCalDDDConstants::waferPositionNoRot(
2100  int lay, int waferU, int waferV, bool reco, bool debug) const {
2101  int ll = lay - hgpar_->firstLayer_;
2102  double x = hgpar_->xLayerHex_[ll];
2103  double y = hgpar_->yLayerHex_[ll];
2104 #ifdef EDM_ML_DEBUG
2105  if (debug)
2106  edm::LogVerbatim("HGCalGeom") << "Layer " << lay << ":" << ll << " Shift " << hgpar_->xLayerHex_[ll] << ":"
2107  << hgpar_->yLayerHex_[ll] << " U:V " << waferU << ":" << waferV;
2108 #endif
2109  if (!reco) {
2112  }
2113  const auto& xy = waferPosition(waferU, waferV, reco);
2114  x += xy.first;
2115  y += xy.second;
2116 #ifdef EDM_ML_DEBUG
2117  if (debug)
2118  edm::LogVerbatim("HGCalGeom") << "With wafer " << x << ":" << y << ":" << xy.first << ":" << xy.second;
2119 #endif
2120  return std::make_pair(x, y);
2121 }
2122 
2123 std::pair<double, double> HGCalDDDConstants::waferPosition(int waferU, int waferV, bool reco) const {
2124  double xx(0), yy(0);
2125  int indx = HGCalWaferIndex::waferIndex(0, waferU, waferV);
2126  auto itr = hgpar_->wafersInLayers_.find(indx);
2127  if (itr != hgpar_->wafersInLayers_.end()) {
2128  xx = hgpar_->waferPosX_[itr->second];
2129  yy = hgpar_->waferPosY_[itr->second];
2130  }
2131  if (!reco) {
2134  }
2135  return std::make_pair(xx, yy);
2136 }
2137 
2139 
std::vector< int > iradMaxBH_
bool maskCell(const DetId &id, int corners) const
size
Write out results.
std::pair< double, double > rangeRLayer(int lay, bool reco) const
double waferZ(int layer, bool reco) const
std::vector< double > waferPosY_
Log< level::Info, true > LogVerbatim
std::vector< int > layer_
static constexpr int scintillatorCassette
const int nphi
static int32_t cellPlacementIndex(int32_t iz, int32_t frontBack, int32_t orient)
Definition: HGCalCell.cc:237
static constexpr double tol_
void waferFromPosition(const double x, const double y, int &wafer, int &icell, int &celltyp) const
std::pair< double, double > rangeZ(bool reco) const
std::vector< int > depthLayerF_
std::vector< int > depth_
std::vector< double > zFrontMin_
std::vector< double > moduleCellR_
std::pair< int, int > tileRings(int layer) const
unsigned int layersInit(bool reco) const
hgtrap getModule(unsigned int k, bool reco) const
static constexpr int32_t cellPlacementOld
Definition: HGCalCell.h:25
bool isValidCell(int layindex, int wafer, int cell) const
static int getType(int index, const HGCalParameters::waferInfo_map &wafers)
wafer_map cellFineIndex_
layer_map copiesInLayers_
static void radius(double zf, double zb, std::vector< double > const &zFront1, std::vector< double > const &rFront1, std::vector< double > const &slope1, std::vector< double > const &zFront2, std::vector< double > const &rFront2, std::vector< double > const &slope2, int flag, std::vector< double > &zz, std::vector< double > &rin, std::vector< double > &rout)
static constexpr int k_OffsetRotation
Definition: HGCalTypes.h:91
std::vector< std::pair< double, double > > layerRotV_
int getPhiBins(int lay) const
HGCalCassette hgcassette_
int layer() const
get the layer #
Definition: HFNoseDetId.h:57
bool cassetteShiftScintillator(int zside, int layer, int iphi) const
std::pair< double, double > cellEtaPhiTrap(int type, int irad) const
std::vector< bool > cellCoarseHalf_
int scintType(const int layer) const
std::vector< bool > cellFineHalf_
def all(container)
workaround iterator generators for ROOT classes
Definition: cmstools.py:25
static std::pair< int32_t, int32_t > cellType(int32_t u, int32_t v, int32_t ncell, int32_t placementIndex)
Definition: HGCalCell.cc:249
std::pair< double, double > waferParameters(bool reco) const
bool waferInLayerTest(int wafer, int lay, bool full) const
static int32_t getUnpackedU(int id)
Definition: HGCalTypes.cc:16
std::vector< int > moduleLayR_
static constexpr int k_fourCorners
bool waferFullInLayer(int wafer, int lay, bool reco) const
double distFromEdgeTrap(double x, double y, double z) const
std::unique_ptr< HGCalCellUV > hgcellUV_
Simrecovecs max_modules_layer_
HGCalParameters::hgtrap getModule(unsigned int k, bool hexType, bool reco) const
int32_t waferU(const int32_t index)
HGCalParameters::waferInfo waferInfo(int lay, int waferU, int waferV) const
int32_t waferLayer(const int32_t index)
bool trapezoidFile() const
int waferU() const
Definition: HFNoseDetId.h:76
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
bool isValidHex(int lay, int mod, int cell, bool reco) const
bool tileRingEdge(double rho, int layer, int ring) const
static bool goodCell(int u, int v, int N, int type, int rotn)
static constexpr int32_t WaferOut
Definition: HGCalTypes.h:56
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
static constexpr int32_t WaferThree
Definition: HGCalTypes.h:42
std::pair< double, double > getShift(int layer, int zside, int cassette) const
std::vector< double > cellFineY_
std::pair< int, int > getREtaRange(int lay) const
int lastLayer(bool reco) const
static int getPartial(int index, const HGCalParameters::waferInfo_map &wafers)
static int32_t getUnpackedV(int id)
Definition: HGCalTypes.cc:22
std::pair< double, double > getXY(int layer, double x, double y, bool forwd) const
bool waferHexagon8() const
std::pair< int, int > waferTypeRotation(int layer, int waferU, int waferV, bool fromFile, bool debug) const
int modulesInit(int lay, bool reco) const
std::unordered_map< int32_t, bool > waferIn_
int zside(DetId const &)
int layerFromIndex(int index, bool reco) const
std::vector< uint32_t > trformIndex_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
int32_t cellType(int type, int waferU, int waferV, int iz, int fwdBack, int orient) const
std::vector< int > layerGroupM_
bool waferHexagon6() const
bool isValidHex8(int lay, int waferU, int waferV, bool fullAndPart) const
float float float z
constexpr uint32_t mask
Definition: gpuClustering.h:26
hgtrform getTrForm(unsigned int k) const
static constexpr uint32_t k_CornerSize
std::pair< double, double > getRangeR(int, bool reco) const
static int getOrient(int index, const HGCalParameters::waferInfo_map &wafers)
wafer_map wafersInLayers_
bool waferInLayer(int wafer, int lay, bool reco) const
U second(std::pair< T, U > const &p)
double scintCellSize(const int layer) const
HGCalParameters::tileInfo tileInfo(int zside, int layer, int ring) const
std::vector< double > cellCoarseX_
static constexpr int scintillatorFile
std::map< int, HGCWaferParam > waferLayer_
int32_t tileIndex(int32_t layer, int32_t ring, int32_t phi)
std::vector< std::pair< int, int > > tileRingRange_
int layer() const
get the layer #
static constexpr int32_t WaferFull
Definition: HGCalTypes.h:35
static std::pair< int32_t, int32_t > waferCorner(double xpos, double ypos, double r, double R, double rMin, double rMax, bool oldBug=false)
std::vector< int > firstModule_
unsigned int waferFileSize() const
std::unique_ptr< HGCalCell > hgcell_
int getTypeHex(int layer, int waferU, int waferV) const
static constexpr int32_t WaferHalf
Definition: HGCalTypes.h:39
dif1
Definition: cuy.py:893
bool isHalfCell(int waferType, int cell) const
int maxCells(bool reco) const
std::vector< double > cellSize_
std::tuple< int, int, int, int > waferFileInfoFromIndex(int kk) const
std::vector< int > waferUVMaxLayer_
std::tuple< int, int, int, int > waferFileInfo(unsigned int kk) const
std::array< int, 5 > assignCellHex(float x, float y, int zside, int lay, bool reco, bool extend, bool debug) const
int waferFileIndex(unsigned int kk) const
std::vector< int > layerIndex_
std::vector< double > yLayerHex_
T sqrt(T t)
Definition: SSEVec.h:19
HGCalDDDConstants(const HGCalParameters *hp, const std::string &name)
int layerIndex(int lay, bool reco) const
std::vector< double > rMaxFront_
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Definition: GenABIO.cc:168
bool cellInLayer(int waferU, int waferV, int cellU, int cellV, int lay, int zside, bool reco) const
static constexpr int32_t WaferOrient0
Definition: HGCalTypes.h:61
int getUVMax(int type) const
bool isValidCell8(int lay, int waferU, int waferV, int cellU, int cellV, int type) const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::pair< int, int > simToReco(int cell, int layer, int mod, bool half) const
std::pair< int, float > getIndex(int lay, bool reco) const
static int getCassette(int index, const HGCalParameters::waferInfo_map &wafers)
bool isValidTrap(int zside, int lay, int ieta, int iphi) const
int waferU() const
bool waferVirtual(int layer, int waferU, int waferV) const
int tileCount(int layer, int ring) const
std::pair< int, int > assignCell(float x, float y, int lay, int subSec, bool reco) const
std::vector< double > slopeTop_
std::vector< HGCalParameters::hgtrap > getModules() const
double mouseBite(bool reco) const
unsigned int layers(bool reco) const
static constexpr int32_t WaferCorner0
Definition: HGCalTypes.h:13
bool tileTrapezoid() const
std::pair< int, int > tileType(int layer, int ring, int phi) const
bool tilePhiEdge(double phi, int layer, int iphi) const
std::pair< float, float > locateCellTrap(int zside, int lay, int ieta, int iphi, bool reco, bool debug) const
std::vector< double > rMinLayHex_
int32_t waferIndex(int32_t layer, int32_t waferU, int32_t waferV, bool old=false)
int getTypeTrap(int layer) const
int32_t tileCassette(int32_t, int32_t, int32_t, int32_t)
int type() const
get the type
Definition: HFNoseDetId.h:51
dif2
Definition: cuy.py:895
double cellSizeHex(int type) const
std::vector< double > zLayerHex_
std::vector< int > layerType_
#define M_PI
waferT_map waferTypes_
std::pair< double, double > rangeR(double z, bool reco) const
std::pair< double, double > waferPosition(int wafer, bool reco) const
std::vector< double > rMaxLayHex_
std::vector< double > slopeMin_
static constexpr int32_t WaferCenterR
Definition: HGCalTypes.h:27
Definition: DetId.h:17
std::vector< int > lastModule_
std::array< int, 4 > waferMax_
static constexpr double k_ScaleToDDD
int numberCellsHexagon(int wafer) const
std::vector< double > radiusMixBoundary_
std::array< int, 3 > assignCellTrap(float x, float y, float z, int lay, bool reco) const
#define debug
Definition: HDRShower.cc:19
bool tileExist(int zside, int layer, int ring, int phi) const
#define N
Definition: blowfish.cc:9
std::vector< double > cellThickness_
int waferV() const
static constexpr int k_fiveCorners
GlobalPoint waferLocal2Global(HepGeom::Point3D< float > &loc, const DetId &id, bool useWafer, bool reco, bool debug) const
std::vector< int > layerGroup_
int numberCells(bool reco) const
part
Definition: HCALResponse.h:20
std::vector< double > moduleCellS_
int zside() const
get the z-side of the cell (1/-1)
std::pair< float, float > locateCellHex(int cell, int wafer, bool reco) const
double cellThickness(int layer, int waferU, int waferV) const
int waferType(DetId const &id, bool fromFile) const
double b
Definition: hdecay.h:120
wafer_map cellCoarseIndex_
std::pair< int, int > rowColumnWafer(const int wafer) const
int waferV() const
Definition: HFNoseDetId.h:79
unsigned int getTrFormN() const
HGCalParameters::hgtrform getTrForm(unsigned int k) const
std::vector< double > rMinFront_
std::pair< float, float > locateCell(int cell, int lay, int type, bool reco) const
std::vector< int > iradMinBH_
bool waferHexagon8File() const
std::vector< double > cellFineX_
int maxRows(int lay, bool reco) const
wafer_map typesInLayers_
const HGCalGeometryMode::GeometryMode mode_
int32_t waferIndex(int wafer, int index) const
static constexpr double k_ScaleFromDDD
std::vector< HGCalParameters::hgtrform > getTrForms() const
std::vector< int > layerGroupO_
fixed size matrix
int getLayer(double z, bool reco) const
#define TYPELOOKUP_DATA_REG(_dataclass_)
Definition: typelookup.h:102
static constexpr int k_threeCorners
bool cassetteShiftSilicon(int zside, int layer, int waferU, int waferV) const
std::array< int, 3 > HGCWaferParam
bool cassetteMode() const
int32_t waferV(const int32_t index)
int waferTypeL(int wafer) const
std::vector< int > waferCopy_
col
Definition: cuy.py:1009
std::vector< double > cassetteShift_
bool tileExist(const int32_t *hex, int32_t zside, int32_t phi)
static unsigned int const shift
float x
std::vector< int > depthIndex_
static constexpr double tan30deg_
double guardRingOffset(bool reco) const
int cassetteTile(int iphi) const
std::vector< double > zFrontTop_
double sensorSizeOffset(bool reco) const
std::vector< double > radiusLayer_[2]
std::array< uint32_t, 2 > tot_layers_
static constexpr int32_t WaferFive
Definition: HGCalTypes.h:36
std::vector< int > waferTypeT_
int modules(int lay, bool reco) const
static constexpr int32_t WaferCornerMin
Definition: HGCalTypes.h:74
int modifyUV(int uv, int type1, int type2) const
std::vector< double > cellCoarseY_
int type() const
get the type
Log< level::Warning, false > LogWarning
static constexpr int32_t WaferFineThin
Definition: HGCalTypes.h:30
waferInfo_map waferInfoMap_
__host__ __device__ V wmin
std::pair< float, float > localToGlobal8(int zside, int lay, int waferU, int waferV, double localX, double localY, bool reco, bool debug) const
const HGCalParameters * hgpar_
std::vector< double > waferPosX_
T mod(const T &a, const T &b)
Definition: ecalDccMap.h:4
int scintCells(const int layer) const
tileInfo_map tileInfoMap_
static constexpr int k_allCorners
int cellHex(double xx, double yy, const double &cellR, const std::vector< double > &posX, const std::vector< double > &posY) const
std::vector< int > waferTypeL_
std::vector< double > xLayerHex_
std::pair< double, double > waferPositionNoRot(int lay, int waferU, int waferV, bool reco, bool debug) const
static int32_t layerFrontBack(int32_t layerOrient)
Definition: HGCalTypes.h:125
void setParameter(int cassette, const std::vector< double > &shifts)
Definition: HGCalCassette.cc:8
double distFromEdgeHex(double x, double y, double z) const
int layerType(int lay) const
int waferFromCopy(int copy) const
__host__ __device__ V V wmax
static bool maskCell(int u, int v, int N, int ncor, int fcor, int corners)