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  bool waferin = ((waferU == 0) && (waferV == 0));
1461  if (waferin)
1462  waferU = waferV = 1 + hgpar_->waferUVMax_;
1463  cellU = cellV = celltype = 0;
1464  if ((hgpar_->xLayerHex_.empty()) || (hgpar_->yLayerHex_.empty()))
1465  return;
1466  int ll = layer - hgpar_->firstLayer_;
1467  int layertype = layerType(layer);
1468  bool rotx = ((!hgpar_->layerType_.empty()) && (layertype == HGCalTypes::WaferCenterR));
1469  double xx(0), yy(0);
1470  if (rotx) {
1471  std::pair<double, double> xy =
1473  xx = xy.first - hgpar_->xLayerHex_[ll];
1474  yy = xy.second - hgpar_->yLayerHex_[ll];
1475  } else {
1478  }
1479  if (debug)
1480  edm::LogVerbatim("HGCalGeom") << "waferFromPosition:: Layer " << layer << ":" << ll << " Rot " << rotx << " X " << x
1481  << ":" << xx << " Y " << y << ":" << yy << " side " << zside << " extend " << extend
1482  << " initial wafer index " << waferU << ":" << waferV;
1483  ;
1484  double rmax = extend ? rmaxT_ : rmax_;
1485  double hexside = extend ? hexsideT_ : hexside_;
1486  if (waferin) {
1487  double tolmin(100.0);
1488  for (unsigned int k = 0; k < hgpar_->waferPosX_.size(); ++k) {
1489  double dx0(0), dy0(0);
1492  if (cassetteMode()) {
1494  auto ktr = hgpar_->waferInfoMap_.find(indx);
1495  if (ktr != hgpar_->waferInfoMap_.end()) {
1496  auto cshift = hgcassette_.getShift(layer, -1, (ktr->second).cassette);
1497  if (debug)
1498  edm::LogVerbatim("HGCalGeom")
1499  << "Cassette " << (ktr->second).cassette << " Shift " << cshift.first << ":" << cshift.second;
1500  dx0 = -cshift.first;
1501  dy0 = cshift.second;
1502  }
1503  }
1504  double dx = std::abs(xx - dx0 - hgpar_->waferPosX_[k]);
1505  double dy = std::abs(yy - dy0 - hgpar_->waferPosY_[k]);
1506  constexpr double tolc = 0.01;
1507  if (debug) {
1508  edm::LogVerbatim("HGCalGeom") << "Wafer " << waferU << ":" << waferV << " position " << xx << ":" << yy
1509  << " Distance " << dx << ":" << dy << " diff0 " << (dx - rmax) << ":"
1510  << (dy - hexside) << " diff1 " << (dy - 0.5 * hexside) << ":"
1511  << (dx * tan30deg_ - (hexside - dy));
1512  if ((dx - rmax) <= tolc && (dy - hexside) <= tolc) {
1513  tolmin = std::min(tolmin, (dy - 0.5 * hexside));
1514  tolmin = std::min(tolmin, (dx * tan30deg_ - (hexside - dy)));
1515  }
1516  }
1517  if ((dx - rmax) <= tolc && (dy - hexside) <= tolc) {
1518  if (((dy - 0.5 * hexside) <= tolc) || ((dx * tan30deg_ - (hexside - dy)) <= tolc)) {
1519  if (waferHexagon8File()) {
1522  if (debug)
1523  edm::LogVerbatim("HGCalGeom")
1524  << "Position (" << x << ", " << y << ") Wafer type:partial:orient:cassette " << celltype << ":"
1528  } else {
1530  celltype = ((itr == hgpar_->typesInLayers_.end()) ? HGCSiliconDetId::HGCalCoarseThick
1531  : hgpar_->waferTypeL_[itr->second]);
1532  }
1533  if (debug)
1534  edm::LogVerbatim("HGCalGeom")
1535  << "WaferFromPosition:: Input " << layer << ":" << ll << ":" << hgpar_->firstLayer_ << ":" << rotx
1536  << ":" << x << ":" << y << ":" << hgpar_->xLayerHex_[ll] << ":" << hgpar_->yLayerHex_[ll] << ":" << xx
1537  << ":" << yy << " compared with " << hgpar_->waferPosX_[k] << ":" << hgpar_->waferPosY_[k]
1538  << " difference " << dx << ":" << dy << ":" << dx * tan30deg_ << ":" << (hexside_ - dy)
1539  << " comparator " << rmax_ << ":" << rmaxT_ << ":" << hexside_ << ":" << hexsideT_ << " wafer "
1540  << waferU << ":" << waferV << ":" << celltype;
1541  xx -= (dx0 + hgpar_->waferPosX_[k]);
1542  yy -= (dy0 + hgpar_->waferPosY_[k]);
1543  break;
1544  }
1545  }
1546  }
1547  if (debug)
1548  edm::LogVerbatim("HGCalGeom") << "Tolmin " << tolmin;
1549  } else {
1550  for (unsigned int k = 0; k < hgpar_->waferPosX_.size(); ++k) {
1551  double dx0(0), dy0(0);
1554  if (cassetteMode()) {
1556  auto ktr = hgpar_->waferInfoMap_.find(indx);
1557  if (ktr != hgpar_->waferInfoMap_.end()) {
1558  auto cshift = hgcassette_.getShift(layer, -1, (ktr->second).cassette);
1559  if (debug)
1560  edm::LogVerbatim("HGCalGeom")
1561  << "Cassette " << (ktr->second).cassette << " Shift " << cshift.first << ":" << cshift.second;
1562  dx0 = -cshift.first;
1563  dy0 = cshift.second;
1564  }
1565  }
1566  if (waferHexagon8File()) {
1569  if (debug)
1570  edm::LogVerbatim("HGCalGeom") << "Position (" << x << ", " << y << ") Wafer type:partial:orient:cassette "
1571  << celltype << ":" << HGCalWaferType::getPartial(index, hgpar_->waferInfoMap_)
1574  } else {
1576  celltype = ((itr == hgpar_->typesInLayers_.end()) ? HGCSiliconDetId::HGCalCoarseThick
1577  : hgpar_->waferTypeL_[itr->second]);
1578  }
1579  xx -= (dx0 + hgpar_->waferPosX_[k]);
1580  yy -= (dy0 + hgpar_->waferPosY_[k]);
1581  break;
1582  }
1583  }
1584  }
1585  if ((std::abs(waferU) <= hgpar_->waferUVMax_) && (celltype >= 0)) {
1587  if (cassetteMode()) {
1589  auto ktr = hgpar_->waferInfoMap_.find(indx);
1590  if (ktr != hgpar_->waferInfoMap_.end()) {
1591  place = HGCalCell::cellPlacementIndex(1, HGCalTypes::layerFrontBack(layertype), (ktr->second).orient);
1592  part = (ktr->second).part;
1593  if (debug)
1594  edm::LogVerbatim("HGCalGeom") << "waferFromPosition: frontback " << layertype << ":"
1595  << HGCalTypes::layerFrontBack(layertype) << " Orient " << (ktr->second).orient
1596  << " place " << place << " part " << part;
1597  }
1598  }
1599  cellHex(xx, yy, celltype, place, part, cellU, cellV, extend, debug);
1600  wt = (((celltype < 2) && (hgpar_->useSimWt_ > 0)) ? (hgpar_->cellThickness_[celltype] / hgpar_->waferThick_) : 1.0);
1601  } else {
1602  cellU = cellV = 2 * hgpar_->nCellsFine_;
1603  wt = 1.0;
1604  celltype = -1;
1605  }
1606  if ((celltype < 0) && debug) {
1607  double x1(xx);
1608  double y1(yy);
1609  edm::LogVerbatim("HGCalGeom") << "waferfFromPosition: Bad type for X " << x << ":" << x1 << ":" << xx << " Y " << y
1610  << ":" << y1 << ":" << yy << " Wafer " << waferU << ":" << waferV << " Cell " << cellU
1611  << ":" << cellV;
1612  for (unsigned int k = 0; k < hgpar_->waferPosX_.size(); ++k) {
1613  double dx = std::abs(x1 - hgpar_->waferPosX_[k]);
1614  double dy = std::abs(y1 - hgpar_->waferPosY_[k]);
1615  edm::LogVerbatim("HGCalGeom") << "Wafer [" << k << "] Position (" << hgpar_->waferPosX_[k] << ", "
1616  << hgpar_->waferPosY_[k] << ") difference " << dx << ":" << dy << ":"
1617  << dx * tan30deg_ << ":" << hexside - dy << " Paramerers " << rmax << ":"
1618  << hexside;
1619  }
1620  }
1621  edm::LogVerbatim("HGCalGeomX") << "Input x:y:layer " << x << ":" << y << ":" << layer << " Wafer " << waferU << ":"
1622  << waferV << " Cell " << cellU << ":" << cellV << ":" << celltype << " wt " << wt;
1623 }
1624 
1625 bool HGCalDDDConstants::waferInLayer(int wafer, int lay, bool reco) const {
1626  const auto& indx = getIndex(lay, reco);
1627  if (indx.first < 0)
1628  return false;
1629  return waferInLayerTest(wafer, indx.first, hgpar_->defineFull_);
1630 }
1631 
1632 bool HGCalDDDConstants::waferFullInLayer(int wafer, int lay, bool reco) const {
1633  const auto& indx = getIndex(lay, reco);
1634  if (indx.first < 0)
1635  return false;
1636  return waferInLayerTest(wafer, indx.first, false);
1637 }
1638 
1640  int indx = HGCalWaferIndex::waferIndex(lay, waferU, waferV);
1641  auto itr = hgpar_->waferInfoMap_.find(indx);
1642  return ((itr == hgpar_->waferInfoMap_.end()) ? HGCalParameters::waferInfo() : itr->second);
1643 }
1644 
1645 std::pair<double, double> HGCalDDDConstants::waferParameters(bool reco) const {
1646  if (reco)
1647  return std::make_pair(rmax_, hexside_);
1648  else
1650 }
1651 
1652 std::pair<double, double> HGCalDDDConstants::waferPosition(int wafer, bool reco) const {
1653  double xx(0), yy(0);
1654  if (wafer >= 0 && wafer < static_cast<int>(hgpar_->waferPosX_.size())) {
1655  xx = hgpar_->waferPosX_[wafer];
1656  yy = hgpar_->waferPosY_[wafer];
1657  }
1658  if (!reco) {
1661  }
1662  return std::make_pair(xx, yy);
1663 }
1664 
1665 std::pair<double, double> HGCalDDDConstants::waferPosition(
1666  int lay, int waferU, int waferV, bool reco, bool debug) const {
1667  int ll = lay - hgpar_->firstLayer_;
1668  bool rotx = ((!hgpar_->layerType_.empty()) && (hgpar_->layerType_[ll] == HGCalTypes::WaferCenterR));
1669 #ifdef EDM_ML_DEBUG
1670  if (debug)
1671  edm::LogVerbatim("HGCalGeom") << "Layer " << lay << ":" << ll << " Rotation " << rotx << " U:V " << waferU << ":"
1672  << waferV;
1673 #endif
1674  auto xy = waferPositionNoRot(lay, waferU, waferV, reco, debug);
1675  std::pair<double, double> xy0 = (rotx) ? getXY(lay, xy.first, xy.second, false) : xy;
1676 #ifdef EDM_ML_DEBUG
1677  if (debug)
1678  edm::LogVerbatim("HGCalGeom") << "Without and with rotation " << xy.first << ":" << xy.second << ":" << xy0.first
1679  << ":" << xy0.second;
1680 #endif
1681  return xy0;
1682 }
1683 
1684 int HGCalDDDConstants::waferFileIndex(unsigned int kk) const {
1685  if (kk < hgpar_->waferInfoMap_.size()) {
1686  auto itr = hgpar_->waferInfoMap_.begin();
1687  std::advance(itr, kk);
1688  return itr->first;
1689  } else
1690  return 0;
1691 }
1692 
1693 std::tuple<int, int, int, int> HGCalDDDConstants::waferFileInfo(unsigned int kk) const {
1694  if (kk < hgpar_->waferInfoMap_.size()) {
1695  auto itr = hgpar_->waferInfoMap_.begin();
1696  std::advance(itr, kk);
1697  return std::make_tuple(itr->second.type, itr->second.part, itr->second.orient, itr->second.cassette);
1698  } else
1699  return std::make_tuple(0, 0, 0, 0);
1700 }
1701 
1702 std::tuple<int, int, int, int> HGCalDDDConstants::waferFileInfoFromIndex(int kk) const {
1703  auto itr = hgpar_->waferInfoMap_.find(kk);
1704  if (itr != hgpar_->waferInfoMap_.end()) {
1705  return std::make_tuple(itr->second.type, itr->second.part, itr->second.orient, itr->second.cassette);
1706  } else
1707  return std::make_tuple(0, 0, 0, 0);
1708 }
1709 
1711  HepGeom::Point3D<float>& loc, const DetId& id, bool useWafer, bool reco, bool debug) const {
1712  HGCSiliconDetId detid(id);
1713  double x(0), y(0);
1714  if (useWafer) {
1715  auto xyw = waferPositionNoRot(detid.layer(), detid.waferU(), detid.waferV(), reco, debug);
1716  x = xyw.first;
1717  y = xyw.second;
1718  }
1719  auto xy = getXY(detid.layer(), (x + loc.x()), (y + loc.y()), false);
1720  double zz = (detid.zside() < 0) ? -(loc.z() + waferZ(detid.layer(), reco)) : (loc.z() + waferZ(detid.layer(), reco));
1721  double xx = (detid.zside() < 0) ? -xy.first : xy.first;
1722  return GlobalPoint(xx, xy.second, zz);
1723 }
1724 
1726  int wafer(0);
1727  if (!tileTrapezoid()) {
1728  for (unsigned int i = 0; i < layers(true); ++i) {
1729  int lay = hgpar_->depth_[i];
1730  wafer += modules(lay, true);
1731  }
1732  } else {
1733  wafer = static_cast<int>(hgpar_->moduleLayR_.size());
1734  }
1735  return wafer;
1736 }
1737 
1738 int HGCalDDDConstants::wafers(int layer, int type) const {
1739  int wafer(0);
1740  if (!tileTrapezoid()) {
1741  auto itr = waferLayer_.find(layer);
1742  if (itr != waferLayer_.end()) {
1743  unsigned ity = (type > 0 && type <= 2) ? type : 0;
1744  wafer = (itr->second)[ity];
1745  }
1746  } else {
1747  const auto& index = getIndex(layer, true);
1748  wafer = 1 + hgpar_->lastModule_[index.first] - hgpar_->firstModule_[index.first];
1749  }
1750  return wafer;
1751 }
1752 
1753 int HGCalDDDConstants::waferType(DetId const& id, bool fromFile) const {
1754  int type(1);
1755  if (waferHexagon8()) {
1756  if (fromFile && (waferFileSize() > 0)) {
1757  int layer(0), waferU(0), waferV(0);
1758  if (id.det() != DetId::Forward) {
1759  HGCSiliconDetId hid(id);
1760  layer = hid.layer();
1761  waferU = hid.waferU();
1762  waferV = hid.waferV();
1763  } else {
1764  HFNoseDetId hid(id);
1765  layer = hid.layer();
1766  waferU = hid.waferU();
1767  waferV = hid.waferV();
1768  }
1770  if (itr != hgpar_->waferInfoMap_.end())
1771  type = (itr->second).type;
1772  } else {
1773  type = ((id.det() != DetId::Forward) ? HGCSiliconDetId(id).type() : HFNoseDetId(id).type());
1774  }
1775  } else if (waferHexagon6()) {
1776  type = waferTypeL(HGCalDetId(id).wafer()) - 1;
1777  }
1778  return type;
1779 }
1780 
1781 int HGCalDDDConstants::waferType(int layer, int waferU, int waferV, bool fromFile) const {
1783  if (waferHexagon8()) {
1784  if (fromFile && (waferFileSize() > 0)) {
1786  if (itr != hgpar_->waferInfoMap_.end())
1787  type = (itr->second).type;
1788  } else {
1790  if (itr != hgpar_->typesInLayers_.end())
1791  type = hgpar_->waferTypeL_[itr->second];
1792  }
1793  } else if (waferHexagon6()) {
1794  if ((waferU >= 0) && (waferU < static_cast<int>(hgpar_->waferTypeL_.size())))
1795  type = (hgpar_->waferTypeL_[waferU] - 1);
1796  }
1797  return type;
1798 }
1799 
1800 std::tuple<int, int, int> HGCalDDDConstants::waferType(HGCSiliconDetId const& id, bool fromFile) const {
1801  const auto& index = HGCalWaferIndex::waferIndex(id.layer(), id.waferU(), id.waferV());
1802  int type(-1), part(-1), orient(-1);
1803  if (fromFile && (waferFileSize() > 0)) {
1804  auto itr = hgpar_->waferInfoMap_.find(index);
1805  if (itr != hgpar_->waferInfoMap_.end()) {
1806  type = (itr->second).type;
1807  part = (itr->second).part;
1808  orient = (itr->second).orient;
1809  }
1810  } else {
1811  auto ktr = hgpar_->typesInLayers_.find(index);
1812  if (ktr != hgpar_->typesInLayers_.end())
1813  type = hgpar_->waferTypeL_[ktr->second];
1814  auto itr = hgpar_->waferTypes_.find(index);
1815  if (itr != hgpar_->waferTypes_.end()) {
1816  if ((itr->second).second < HGCalTypes::k_OffsetRotation) {
1817  orient = (itr->second).second;
1818  if ((itr->second).first == HGCalGeomTools::k_allCorners) {
1820  } else if ((itr->second).first == HGCalGeomTools::k_fiveCorners) {
1822  } else if ((itr->second).first == HGCalGeomTools::k_fourCorners) {
1824  } else if ((itr->second).first == HGCalGeomTools::k_threeCorners) {
1826  }
1827  } else {
1828  part = (itr->second).first;
1829  orient = ((itr->second).second - HGCalTypes::k_OffsetRotation);
1830  }
1831  } else {
1833  orient = 0;
1834  }
1835  }
1836  return std::make_tuple(type, part, orient);
1837 }
1838 
1840  int layer, int waferU, int waferV, bool fromFile, bool debug) const {
1841  int type(HGCalTypes::WaferOut), rotn(0);
1843  bool withinList(true);
1844  if (fromFile && (waferFileSize() > 0)) {
1845  auto itr = hgpar_->waferInfoMap_.find(wl);
1846  withinList = (itr != hgpar_->waferInfoMap_.end());
1847  if (withinList) {
1848  type = (itr->second).part;
1849  rotn = (itr->second).orient;
1850  }
1851  } else {
1852  auto itr = hgpar_->waferTypes_.find(wl);
1853  if (waferHexagon8()) {
1854  withinList = (itr != hgpar_->waferTypes_.end());
1855  if (withinList) {
1856  if ((itr->second).second < HGCalTypes::k_OffsetRotation) {
1857  rotn = (itr->second).second;
1858  if ((itr->second).first == HGCalGeomTools::k_allCorners) {
1860  } else if ((itr->second).first == HGCalGeomTools::k_fiveCorners) {
1862  } else if ((itr->second).first == HGCalGeomTools::k_fourCorners) {
1864  } else if ((itr->second).first == HGCalGeomTools::k_threeCorners) {
1866  }
1867  } else {
1868  type = (itr->second).first;
1869  rotn = ((itr->second).second - HGCalTypes::k_OffsetRotation);
1870  }
1871  } else {
1873  rotn = HGCalTypes::WaferCorner0;
1874  }
1875  }
1876  }
1877 #ifdef EDM_ML_DEBUG
1878  if (debug)
1879  edm::LogVerbatim("HGCalGeom") << "waferTypeRotation: Layer " << layer << " Wafer " << waferU << ":" << waferV
1880  << " Index " << std::hex << wl << std::dec << ":" << withinList << " Type " << type
1881  << " Rotation " << rotn;
1882 #endif
1883  return std::make_pair(type, rotn);
1884 }
1885 
1887  bool type(false);
1888  if (waferHexagon8()) {
1890  type = (hgpar_->waferTypes_.find(wl) != hgpar_->waferTypes_.end());
1891  } else if (waferHexagon6()) {
1892  int wl = HGCalWaferIndex::waferIndex(layer, waferU, 0, true);
1893  type = (hgpar_->waferTypes_.find(wl) != hgpar_->waferTypes_.end());
1894  }
1895  return type;
1896 }
1897 
1898 double HGCalDDDConstants::waferZ(int lay, bool reco) const {
1899  const auto& index = getIndex(lay, reco);
1900  if (index.first < 0)
1901  return 0;
1902  else
1904 }
1905 
1907  double xx, double yy, const double& cellR, const std::vector<double>& posX, const std::vector<double>& posY) const {
1908  int num(0);
1909  const double tol(0.00001);
1910  double cellY = 2.0 * cellR * tan30deg_;
1911  for (unsigned int k = 0; k < posX.size(); ++k) {
1912  double dx = std::abs(xx - posX[k]);
1913  double dy = std::abs(yy - posY[k]);
1914  if (dx <= (cellR + tol) && dy <= (cellY + tol)) {
1915  double xmax = (dy <= 0.5 * cellY) ? cellR : (cellR - (dy - 0.5 * cellY) / tan30deg_);
1916  if (dx <= (xmax + tol)) {
1917  num = k;
1918  break;
1919  }
1920  }
1921  }
1922  return num;
1923 }
1924 
1926  double xloc, double yloc, int cellType, int place, int part, int& cellU, int& cellV, bool extend, bool debug) const {
1927  if (cassetteMode()) {
1928  auto uv = (part == HGCalTypes::WaferFull)
1929  ? hgcellUV_->cellUVFromXY3(xloc, yloc, place, cellType, true, debug)
1930  : hgcellUV_->cellUVFromXY1(xloc, yloc, place, cellType, part, true, debug);
1931  cellU = uv.first;
1932  cellV = uv.second;
1933  } else if (waferHexagon8File()) {
1934  auto uv = hgcellUV_->cellUVFromXY3(xloc, yloc, place, cellType, extend, debug);
1935  cellU = uv.first;
1936  cellV = uv.second;
1937  } else {
1938  int ncell = (cellType == 0) ? hgpar_->nCellsFine_ : hgpar_->nCellsCoarse_;
1939  double delY = 2 * rmax_ / (3 * ncell);
1940  double delX = 0.5 * delY * sqrt3_;
1941  double delYT = (extend) ? (2 * rmaxT_ / (3 * ncell)) : delY;
1942  double delXT = 0.5 * delYT * sqrt3_;
1943  double v0 = ((xloc / delY - 1.0) / 1.5);
1944  int cv0 = (v0 > 0) ? (ncell + static_cast<int>(v0 + 0.5)) : (ncell - static_cast<int>(-v0 + 0.5));
1945  double u0 = (0.5 * yloc / delX + 0.5 * cv0);
1946  int cu0 = (u0 > 0) ? (ncell / 2 + static_cast<int>(u0 + 0.5)) : (ncell / 2 - static_cast<int>(-u0 + 0.5));
1947  cu0 = std::max(0, std::min(cu0, 2 * ncell - 1));
1948  cv0 = std::max(0, std::min(cv0, 2 * ncell - 1));
1949  if (cv0 - cu0 >= ncell)
1950  cv0 = cu0 + ncell - 1;
1951  if (debug)
1952  edm::LogVerbatim("HGCalGeom") << "cellHex: input " << xloc << ":" << yloc << ":" << cellType << " parameter "
1953  << delX << ":" << delY << " u0 " << u0 << ":" << cu0 << " v0 " << v0 << ":" << cv0;
1954  bool found(false);
1955  static constexpr int shift[3] = {0, 1, -1};
1956  for (int i1 = 0; i1 < 3; ++i1) {
1957  cellU = cu0 + shift[i1];
1958  for (int i2 = 0; i2 < 3; ++i2) {
1959  cellV = cv0 + shift[i2];
1960  if (((cellV - cellU) < ncell) && ((cellU - cellV) <= ncell) && (cellU >= 0) && (cellV >= 0) &&
1961  (cellU < 2 * ncell) && (cellV < 2 * ncell)) {
1962  double xc = (1.5 * (cellV - ncell) + 1.0) * delY;
1963  double yc = (2 * cellU - cellV - ncell) * delX;
1964  if ((std::abs(yloc - yc) <= delXT) && (std::abs(xloc - xc) <= delYT) &&
1965  ((std::abs(xloc - xc) <= 0.5 * delYT) ||
1966  (std::abs(yloc - yc) <= sqrt3_ * (delYT - std::abs(xloc - xc))))) {
1967  if (debug)
1968  edm::LogVerbatim("HGCalGeom")
1969  << "cellHex: local " << xc << ":" << yc << " difference " << std::abs(xloc - xc) << ":"
1970  << std::abs(yloc - yc) << ":" << sqrt3_ * (delY - std::abs(yloc - yc)) << " comparator " << delX
1971  << ":" << delY << " (u,v) = (" << cellU << "," << cellV << ")";
1972  found = true;
1973  break;
1974  }
1975  }
1976  }
1977  if (found)
1978  break;
1979  }
1980  if (!found) {
1981  cellU = cu0;
1982  cellV = cv0;
1983  }
1984  }
1985 }
1986 
1987 std::pair<int, float> HGCalDDDConstants::getIndex(int lay, bool reco) const {
1988  int indx = layerIndex(lay, reco);
1989  if (indx < 0)
1990  return std::make_pair(-1, 0);
1991  float cell(0);
1992  if (waferHexagon6()) {
1993  cell = (reco ? hgpar_->moduleCellR_[0] : hgpar_->moduleCellS_[0]);
1994  } else {
1995  if (waferHexagon8()) {
1996  cell = (reco ? hgpar_->moduleCellR_[0] : hgpar_->moduleCellS_[0]);
1997  } else {
1998  cell = hgpar_->scintCellSize(lay);
1999  }
2000  }
2001  return std::make_pair(indx, cell);
2002 }
2003 
2005  int ll(-1);
2006  if (waferHexagon6() && reco) {
2007  ll = static_cast<int>(std::find(hgpar_->depthLayerF_.begin(), hgpar_->depthLayerF_.end(), index) -
2008  hgpar_->depthLayerF_.begin());
2009  if (ll == static_cast<int>(hgpar_->depthLayerF_.size()))
2010  ll = -1;
2011  } else {
2012  ll = static_cast<int>(std::find(hgpar_->layerIndex_.begin(), hgpar_->layerIndex_.end(), index) -
2013  hgpar_->layerIndex_.begin());
2014  if (ll == static_cast<int>(hgpar_->layerIndex_.size()))
2015  ll = -1;
2016  }
2017 #ifdef EDM_ML_DEBUG
2018  edm::LogVerbatim("HGCalGeom") << "LayerFromIndex for " << index << ":" << reco << ":" << waferHexagon6() << " is"
2019  << ll << ":" << (ll + hgpar_->firstLayer_);
2020 #endif
2021  return ((ll < 0) ? ll : (ll + hgpar_->firstLayer_));
2022 }
2023 
2024 bool HGCalDDDConstants::isValidCell(int lay, int wafer, int cell) const {
2025  // Calculate the position of the cell
2026  // Works for options HGCalHexagon/HGCalHexagonFull
2027  double x = hgpar_->waferPosX_[wafer];
2028  double y = hgpar_->waferPosY_[wafer];
2029  if (hgpar_->waferTypeT_[wafer] - 1 == HGCSiliconDetId::HGCalFine) {
2030  x += hgpar_->cellFineX_[cell];
2031  y += hgpar_->cellFineY_[cell];
2032  } else {
2033  x += hgpar_->cellCoarseX_[cell];
2034  y += hgpar_->cellCoarseY_[cell];
2035  }
2036  double rr = sqrt(x * x + y * y);
2037  bool result = ((rr >= hgpar_->rMinLayHex_[lay - 1]) && (rr <= hgpar_->rMaxLayHex_[lay - 1]) &&
2038  (wafer < static_cast<int>(hgpar_->waferPosX_.size())));
2039 #ifdef EDM_ML_DEBUG
2040  if (!result)
2041  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << wafer << ":" << cell << " Position " << x << ":" << y
2042  << ":" << rr << " Compare Limits " << hgpar_->rMinLayHex_[lay - 1] << ":"
2043  << hgpar_->rMaxLayHex_[lay - 1] << " Flag " << result;
2044 #endif
2045  return result;
2046 }
2047 
2048 bool HGCalDDDConstants::isValidCell8(int lay, int waferU, int waferV, int cellU, int cellV, int type) const {
2049  bool result(false);
2050  auto partn = waferTypeRotation(lay, waferU, waferV, false, false);
2051 #ifdef EDM_ML_DEBUG
2052  edm::LogVerbatim("HGCalGeom") << "waferHexagon8 " << waferHexagon8File() << ":" << mode_ << ":" << cassetteMode()
2053  << " part " << partn.first << ":" << partn.second;
2054 #endif
2055  if (cassetteMode()) {
2056  result = HGCalWaferMask::goodCell(cellU, cellV, partn.first);
2057 #ifdef EDM_ML_DEBUG
2058  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << waferU << ":" << waferV << ":" << cellU << ":" << cellV
2059  << " Result " << result << " from goodCell";
2060 #endif
2061  } else {
2062  float x(0), y(0);
2063  int kndx = cellV * 100 + cellU;
2064  if (type == 0) {
2065  auto ktr = hgpar_->cellFineIndex_.find(kndx);
2066  if (ktr != hgpar_->cellFineIndex_.end()) {
2067  x = hgpar_->cellFineX_[ktr->second];
2068  y = hgpar_->cellFineY_[ktr->second];
2069  }
2070 #ifdef EDM_ML_DEBUG
2071  edm::LogVerbatim("HGCalGeom") << "Fine " << cellU << ":" << cellV << ":" << kndx << ":" << x << ":" << y << ":"
2072  << (ktr != hgpar_->cellFineIndex_.end());
2073 #endif
2074  } else {
2075  auto ktr = hgpar_->cellCoarseIndex_.find(kndx);
2076  if (ktr != hgpar_->cellCoarseIndex_.end()) {
2077  x = hgpar_->cellCoarseX_[ktr->second];
2078  y = hgpar_->cellCoarseY_[ktr->second];
2079  }
2080 #ifdef EDM_ML_DEBUG
2081  edm::LogVerbatim("HGCalGeom") << "Coarse " << cellU << ":" << cellV << ":" << kndx << ":" << x << ":" << y << ":"
2082  << (ktr != hgpar_->cellCoarseIndex_.end());
2083 #endif
2084  }
2085  const auto& xy = waferPositionNoRot(lay, waferU, waferV, true, false);
2086  x += xy.first;
2087  y += xy.second;
2088 #ifdef EDM_ML_DEBUG
2089  edm::LogVerbatim("HGCalGeom") << "With wafer (" << waferU << "," << waferV << ") " << x << ":" << y;
2090 #endif
2091  double rr = sqrt(x * x + y * y);
2092  int ll = lay - hgpar_->firstLayer_;
2093  double tol = waferHexagon8File() ? 0.5 : 0.0;
2094  result = (((rr + tol) >= hgpar_->rMinLayHex_[ll]) && (rr <= hgpar_->rMaxLayHex_[ll]));
2095 #ifdef EDM_ML_DEBUG
2096  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << ll << ":" << waferU << ":" << waferV << ":" << cellU
2097  << ":" << cellV << " Position " << x << ":" << y << ":" << rr << " Compare Limits "
2098  << hgpar_->rMinLayHex_[ll] << ":" << hgpar_->rMaxLayHex_[ll] << " Flag " << result
2099  << " from Radius Limits";
2100 #endif
2101  if (result && waferHexagon8File()) {
2102  int N = (type == 0) ? hgpar_->nCellsFine_ : hgpar_->nCellsCoarse_;
2103  result = HGCalWaferMask::goodCell(cellU, cellV, N, partn.first, partn.second);
2104 #ifdef EDM_ML_DEBUG
2105  edm::LogVerbatim("HGCalGeom") << "Input " << lay << ":" << waferU << ":" << waferV << ":" << cellU << ":" << cellV
2106  << " N " << N << " part " << partn.first << ":" << partn.second << " Result "
2107  << result << " from goodCell";
2108 #endif
2109  }
2110  }
2111  return result;
2112 }
2113 
2114 int32_t HGCalDDDConstants::waferIndex(int wafer, int index) const {
2115  int layer = layerFromIndex(index, true);
2119 #ifdef EDM_ML_DEBUG
2120  edm::LogVerbatim("HGCalGeom") << "WaferIndex for " << wafer << ":" << index << " (" << layer << ":" << waferU << ":"
2121  << waferV << ") " << indx;
2122 #endif
2123  return indx;
2124 }
2125 
2126 bool HGCalDDDConstants::waferInLayerTest(int wafer, int lay, bool full) const {
2127  bool in = (waferHexagon6()) ? true : false;
2128  if (!in) {
2129  double xpos = hgpar_->waferPosX_[wafer] + hgpar_->xLayerHex_[lay];
2130  double ypos = hgpar_->waferPosY_[wafer] + hgpar_->yLayerHex_[lay];
2131  std::pair<int, int> corner = HGCalGeomTools::waferCorner(
2132  xpos, ypos, rmax_, hexside_, hgpar_->rMinLayHex_[lay], hgpar_->rMaxLayHex_[lay], in);
2133  in = (full ? (corner.first > 0) : (corner.first == static_cast<int>(HGCalParameters::k_CornerSize)));
2134  if (in && fullAndPart_) {
2135  int indx = waferIndex(wafer, lay);
2136  in = (hgpar_->waferInfoMap_.find(indx) != hgpar_->waferInfoMap_.end());
2137 #ifdef EDM_ML_DEBUG
2138  if (!in)
2139  edm::LogVerbatim("HGCalGeom") << "WaferInLayerTest: Layer " << lay << " wafer " << wafer << " index " << indx
2140  << "( " << HGCalWaferIndex::waferLayer(indx) << ", "
2141  << HGCalWaferIndex::waferU(indx) << ", " << HGCalWaferIndex::waferV(indx)
2142  << ") in " << in;
2143 #endif
2144  }
2145 #ifdef EDM_ML_DEBUG
2146  edm::LogVerbatim("HGCalGeom") << "WaferInLayerTest: Layer " << lay << " wafer " << wafer << " R-limits "
2147  << hgpar_->rMinLayHex_[lay] << ":" << hgpar_->rMaxLayHex_[lay] << " Corners "
2148  << corner.first << ":" << corner.second << " In " << in;
2149 #endif
2150  }
2151  return in;
2152 }
2153 
2154 std::pair<double, double> HGCalDDDConstants::waferPositionNoRot(
2155  int lay, int waferU, int waferV, bool reco, bool debug) const {
2156  int ll = lay - hgpar_->firstLayer_;
2157  double x = hgpar_->xLayerHex_[ll];
2158  double y = hgpar_->yLayerHex_[ll];
2159 #ifdef EDM_ML_DEBUG
2160  if (debug)
2161  edm::LogVerbatim("HGCalGeom") << "Layer " << lay << ":" << ll << " Shift " << hgpar_->xLayerHex_[ll] << ":"
2162  << hgpar_->yLayerHex_[ll] << " U:V " << waferU << ":" << waferV;
2163 #endif
2164  if (!reco) {
2167  }
2168  const auto& xy = waferPosition(waferU, waferV, reco);
2169  x += xy.first;
2170  y += xy.second;
2171 #ifdef EDM_ML_DEBUG
2172  if (debug)
2173  edm::LogVerbatim("HGCalGeom") << "With wafer " << x << ":" << y << ":" << xy.first << ":" << xy.second;
2174 #endif
2175  return std::make_pair(x, y);
2176 }
2177 
2178 std::pair<double, double> HGCalDDDConstants::waferPosition(int waferU, int waferV, bool reco) const {
2179  double xx(0), yy(0);
2180  int indx = HGCalWaferIndex::waferIndex(0, waferU, waferV);
2181  auto itr = hgpar_->wafersInLayers_.find(indx);
2182  if (itr != hgpar_->wafersInLayers_.end()) {
2183  xx = hgpar_->waferPosX_[itr->second];
2184  yy = hgpar_->waferPosY_[itr->second];
2185  }
2186  if (!reco) {
2189  }
2190  return std::make_pair(xx, yy);
2191 }
2192 
2194 
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:93
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
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_
constexpr int32_t waferV() const
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)
static const float tolmin
Definition: FlatHexagon.cc:21
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
constexpr int32_t zside() const
get the z-side of the cell (1/-1)
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:63
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
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_
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_
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
constexpr int32_t layer() const
get the layer #
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:76
int modifyUV(int uv, int type1, int type2) const
std::vector< double > cellCoarseY_
Log< level::Warning, false > LogWarning
static constexpr int32_t WaferFineThin
Definition: HGCalTypes.h:30
constexpr int32_t waferU() const
waferInfo_map waferInfoMap_
constexpr int32_t type() const
get the type
__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
if(threadIdxLocalY==0 &&threadIdxLocalX==0)
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
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 constexpr int32_t layerFrontBack(int32_t layerOrient)
Definition: HGCalTypes.h:137
static bool maskCell(int u, int v, int N, int ncor, int fcor, int corners)