CMS 3D CMS Logo

HGCalDDDConstants.cc
Go to the documentation of this file.
2 
6 
7 #include "CLHEP/Units/GlobalPhysicalConstants.h"
8 #include "CLHEP/Units/GlobalSystemOfUnits.h"
9 
10 //#define EDM_ML_DEBUG
11 
14 
16  const std::string name) : hgpar_(hp) {
17  mode_ = hgpar_->mode_;
19  rmax_ = 0;
20  modHalf_ = sectors()*layers(true);
21  for (int simreco = 0; simreco < 2; ++simreco ) {
22  tot_layers_[simreco] = layersInit((bool)simreco);
23  }
24 
25  edm::LogInfo("HGCalGeom") << "HGCalDDDConstants initialized for " << name
26  << " with " << layers(false) << ":"
27  << layers(true) << " layers, " << sectors()
28  << " sectors " << 2*modHalf_ << " modules and "
29  << "maximum of " << maxCells(false) << ":"
30  << maxCells(true) << " cells";
31 #ifdef EDM_ML_DEBUG
32  std::cout << "HGCalDDDConstants initialized for " << name << " with "
33  << layers(false) << ":" << layers(true) << " layers, "
34  << sectors() << " sectors and maximum of " << maxCells(false)
35  << ":" << maxCells(true) << " cells" << std::endl;
36 #endif
37  } else {
38  rmax_ = k_ScaleFromDDD * (hgpar_->waferR_) * std::cos(30.0*CLHEP::deg);
39  hexside_ = 2.0 * rmax_ * tan30deg_;
40 #ifdef EDM_ML_DEBUG
41  std::cout << "rmax_ " << rmax_ << ":" << hexside_ << " CellSize "
42  << 0.5*k_ScaleFromDDD*hgpar_->cellSize_[0] << ":"
43  << 0.5*k_ScaleFromDDD*hgpar_->cellSize_[1] << std::endl;
44 #endif
45  // init maps and constants
46  modHalf_ = 0;
47  for (int simreco = 0; simreco < 2; ++simreco) {
48  tot_layers_[simreco] = layersInit((bool)simreco);
49  max_modules_layer_[simreco].resize(tot_layers_[simreco]+1);
50  for (unsigned int layer=1; layer <= tot_layers_[simreco]; ++layer) {
51  max_modules_layer_[simreco][layer] = modulesInit(layer,(bool)simreco);
52  if (simreco == 1) {
53  modHalf_ += max_modules_layer_[simreco][layer];
54 #ifdef EDM_ML_DEBUG
55  std::cout << "Layer " << layer << " with " << max_modules_layer_[simreco][layer] << ":" << modHalf_ << " modules\n";
56 #endif
57  }
58  }
59  }
60  tot_wafers_ = wafers();
61 
62  edm::LogInfo("HGCalGeom") << "HGCalDDDConstants initialized for " << name
63  << " with " << layers(false) << ":"
64  << layers(true) << " layers, " << wafers()
65  << ":" << 2*modHalf_ << " wafers and "
66  << "maximum of " << maxCells(false) << ":"
67  << maxCells(true) << " cells";
68 
69 #ifdef EDM_ML_DEBUG
70  std::cout << "HGCalDDDConstants initialized for " << name << " with "
71  << layers(false) << ":" << layers(true) << " layers, "
72  << wafers() << " wafers and " << "maximum of " << maxCells(false)
73  << ":" << maxCells(true) << " cells" << std::endl;
74 #endif
75 
76  }
77 
78  for (unsigned int i=0; i<getTrFormN(); ++i) {
79  int lay0 = getTrForm(i).lay;
80  int wmin(9999999), wmax(0), kount(0);
81  for (int wafer=0; wafer<sectors(); ++wafer) {
82  if (waferInLayer(wafer,lay0,true)) {
83  if (wafer < wmin) wmin = wafer;
84  if (wafer > wmax) wmax = wafer;
85  ++kount;
86  }
87  }
88 #ifdef EDM_ML_DEBUG
89  int lay1 = getIndex(lay0,true).first;
90  std::cout << "Index " << i << " Layer " << lay0 << ":" << lay1
91  << " Wafer " << wmin << ":" << wmax << ":" << kount << std::endl;
92 #endif
93  HGCWaferParam a1{ {wmin,wmax,kount} };
94  waferLayer_[lay0] = a1;
95  }
96 }
97 
99 
100 std::pair<int,int> HGCalDDDConstants::assignCell(float x, float y, int lay,
101  int subSec, bool reco) const {
102  std::pair<int,float> index = getIndex(lay, reco);
103  std::pair<int,int> cellAssignment(-1,-1);
104  int i = index.first;
105  if (i < 0) return cellAssignment;
107  float alpha, h, bl, tl;
108  getParameterSquare(i,subSec,reco,h,bl,tl,alpha);
109  cellAssignment = assignCellSquare(x, y, h, bl, tl, alpha, index.second);
110  } else {
111  float xx = (reco) ? x : k_ScaleFromDDD*x;
112  float yy = (reco) ? y : k_ScaleFromDDD*y;
113  cellAssignment = assignCellHexagon(xx,yy);
114  }
115  return cellAssignment;
116 }
117 
118 std::pair<int,int> HGCalDDDConstants::assignCellSquare(float x, float y,
119  float h, float bl,
120  float tl, float alpha,
121  float cellSize) const {
122 
123  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
124  float b = 2*h*bl/(tl-bl);
125 
126  float x0(x);
127  int phiSector = (x0 > 0) ? 1 : 0;
128  if (alpha < 0) {x0 -= 0.5*(tl+bl); phiSector = 0;}
129  else if (alpha > 0) {x0 += 0.5*(tl+bl); phiSector = 1;}
130 
131  //determine the i-y
132  int ky = floor((y+h)/cellSize);
133  if (ky*cellSize> y+h) ky--;
134  if (ky<0) return std::pair<int,int>(-1,-1);
135  if ((ky+1)*cellSize < (y+h) ) ky++;
136  int max_ky_allowed=floor(2*h/cellSize);
137  if (ky>max_ky_allowed-1) return std::pair<int,int>(-1,-1);
138 
139  //determine the i-x
140  //notice we substitute y by the top of the candidate cell to reduce the dead zones
141  int kx = floor(fabs(x0)/cellSize);
142  if (kx*cellSize > fabs(x0) ) kx--;
143  if (kx<0) return std::pair<int,int>(-1,-1);
144  if ((kx+1)*cellSize < fabs(x0)) kx++;
145  int max_kx_allowed=floor( ((ky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize) );
146  if (kx>max_kx_allowed-1) return std::pair<int,int>(-1,-1);
147 
148  //count cells summing in rows until required height
149  //notice the bottom of the cell must be used
150  int icell(0);
151  for (int iky=0; iky<ky; ++iky) {
152  int cellsInRow( floor( ((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize) ) );
153  icell += cellsInRow;
154  }
155  icell += kx;
156 
157  //return result
158  return std::pair<int,int>(phiSector,icell);
159 }
160 
161 std::pair<int,int> HGCalDDDConstants::assignCellHexagon(float x,
162  float y) const {
163  double xx(x), yy(y);
164  //First the wafer
165  int wafer = cellHex(xx, yy, rmax_, hgpar_->waferPosX_, hgpar_->waferPosY_);
166  // Now the cell
167  xx -= hgpar_->waferPosX_[wafer];
168  yy -= hgpar_->waferPosY_[wafer];
169  int cell(0);
170  if (hgpar_->waferTypeT_[wafer] == 1)
172  else
174  return std::pair<int,int>(wafer,cell);
175 }
176 
178  int indx = (type == 1) ? 0 : 1;
179  double cell = (0.5*k_ScaleFromDDD*hgpar_->cellSize_[indx]);
180  return cell;
181 }
182 
183 std::pair<int,int> HGCalDDDConstants::findCell(int cell, int lay, int subSec,
184  bool reco) const {
185 
186  std::pair<int,float> index = getIndex(lay, reco);
187  int i = index.first;
188  if (i < 0) return std::pair<int,int>(-1,-1);
190  return std::pair<int,int>(-1,-1);
191  } else {
192  float alpha, h, bl, tl;
193  getParameterSquare(i,subSec,reco,h,bl,tl,alpha);
194  return findCellSquare(cell, h, bl, tl, alpha, index.second);
195  }
196 }
197 
198 std::pair<int,int> HGCalDDDConstants::findCellSquare(int cell, float h,
199  float bl, float tl,
200  float alpha,
201  float cellSize) const {
202 
203  //check if cell number is meaningful
204  if(cell<0) return std::pair<int,int>(-1,-1);
205 
206  //parameterization of the boundary of the trapezoid
207  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
208  float b = 2*h*bl/(tl-bl);
209  int kx(cell), ky(0);
210  int kymax( floor((2*h)/cellSize) );
211  int testCell(0);
212  for (int iky=0; iky<kymax; ++iky) {
213 
214  //check if adding all the cells in this row is above the required cell
215  //notice the top of the cell is used to maximize space
216  int cellsInRow(floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize)));
217  if (testCell+cellsInRow > cell) break;
218  testCell += cellsInRow;
219  ky++;
220  kx -= cellsInRow;
221  }
222 
223  return std::pair<int,int>(kx,ky);
224 }
225 
227  bool hexType,
228  bool reco) const {
229 
231  if (hexType) {
232  unsigned int type = (indx < hgpar_->waferTypeL_.size()) ?
233  hgpar_->waferTypeL_[indx] : 3;
234  if (type > 0) --type;
235  mytr = hgpar_->getModule(type, true);
236  } else {
237  if (reco) mytr = hgpar_->getModule(indx,true);
238  else mytr = hgpar_->getModule(indx,false);
239  }
240  return mytr;
241 }
242 
243 std::vector<HGCalParameters::hgtrap> HGCalDDDConstants::getModules() const {
244 
245  std::vector<HGCalParameters::hgtrap> mytrs;
246  for (unsigned int k=0; k<hgpar_->moduleLayR_.size(); ++k)
247  mytrs.push_back(hgpar_->getModule(k,true));
248  return mytrs;
249 }
250 
251 std::vector<HGCalParameters::hgtrform> HGCalDDDConstants::getTrForms() const {
252 
253  std::vector<HGCalParameters::hgtrform> mytrs;
254  for (unsigned int k=0; k<hgpar_->trformIndex_.size(); ++k)
255  mytrs.push_back(hgpar_->getTrForm(k));
256  return mytrs;
257 }
258 
259 bool HGCalDDDConstants::isValid(int lay, int mod, int cell, bool reco) const {
260 
261  bool ok(false);
262  int cellmax(0), modmax(0);
264  cellmax = maxCells(lay,reco);
265  modmax = sectors();
266  ok = ((lay > 0 && lay <= (int)(layers(reco))) &&
267  (mod > 0 && mod <= modmax) &&
268  (cell >=0 && cell <= cellmax));
269  } else {
270  int32_t copyNumber = hgpar_->waferCopy_[mod];
271  ok = ((lay > 0 && lay <= (int)(layers(reco))));
272  if (ok) {
273  const int32_t lay_idx = reco ? (lay-1)*3 + 1 : lay;
274  const auto& the_modules = hgpar_->copiesInLayers_[lay_idx];
275  auto moditr = the_modules.find(copyNumber);
276  ok = (moditr != the_modules.end());
277 #ifdef EDM_ML_DEBUG
278  if (!ok) std::cout << "HGCalDDDConstants: Layer " << lay << ":"
279  << lay_idx << " Copy " << copyNumber << ":" << mod
280  << " Flag " << ok << std::endl;
281 #endif
282  if (ok) {
283  if (moditr->second >= 0) {
284  cellmax = (hgpar_->waferTypeT_[mod]==1) ?
285  (int)(hgpar_->cellFineX_.size()) : (int)(hgpar_->cellCoarseX_.size());
286  ok = (cell >=0 && cell <= cellmax);
287  } else {
288  ok = isValidCell(lay_idx, mod, cell);
289  }
290  }
291  }
292  }
293 
294 #ifdef EDM_ML_DEBUG
295  if (!ok) std::cout << "HGCalDDDConstants: Layer " << lay << ":"
296  << (lay > 0 && (lay <= (int)(layers(reco)))) << " Module "
297  << mod << ":" << modmax << ":"
298  << (mod > 0 && mod <= modmax) << " Cell " << cell << ":"
299  << cellmax << ":" << (cell >=0 && cell <= cellmax)
300  << ":" << maxCells(reco) << std::endl;
301 #endif
302  return ok;
303 }
304 
305 bool HGCalDDDConstants::isValidCell(int lay, int wafer, int cell) const {
306 
307  // Calculate the position of the cell
308  double x = hgpar_->waferPosX_[wafer];
309  double y = hgpar_->waferPosY_[wafer];
310  if (hgpar_->waferTypeT_[wafer] == 1) {
311  x += hgpar_->cellFineX_[cell];
312  y += hgpar_->cellFineY_[cell];
313  } else {
314  x += hgpar_->cellCoarseX_[cell];
315  y += hgpar_->cellCoarseY_[cell];
316  }
317  double rr = sqrt(x*x+y*y);
318  bool ok = ((rr >= hgpar_->rMinLayHex_[lay-1]) &
319  (rr <= hgpar_->rMaxLayHex_[lay-1]));
320 #ifdef EDM_ML_DEBUG
321  if (!ok)
322  std::cout << "Input " << lay << ":" << wafer << ":" << cell << " Position "
323  << x << ":" << y << ":" << rr << " Compare Limits "
324  << hgpar_->rMinLayHex_[lay-1] << ":" <<hgpar_->rMaxLayHex_[lay-1]
325  << " Flag " << ok << std::endl;
326 #endif
327  return ok;
328 }
329 
330 unsigned int HGCalDDDConstants::layers(bool reco) const {
331  return tot_layers_[(int)reco];
332 }
333 
334 unsigned int HGCalDDDConstants::layersInit(bool reco) const {
335  return (reco ? hgpar_->depthIndex_.size() : hgpar_->layerIndex_.size());
336 }
337 
338 std::pair<float,float> HGCalDDDConstants::locateCell(int cell, int lay,
339  int type, bool reco) const {
340  // type refers to subsector # for square cell and wafer # for hexagon cell
341  float x(999999.), y(999999.);
342  std::pair<int,float> index = getIndex(lay, reco);
343  int i = index.first;
344  if (i < 0) return std::pair<float,float>(x,y);
346  std::pair<int,int> kxy = findCell(cell, lay, type, reco);
347  float alpha, h, bl, tl;
348  getParameterSquare(i,type,reco,h,bl,tl,alpha);
349  float cellSize = index.second;
350  x = (kxy.first+0.5)*cellSize;
351  if (alpha < 0) x -= 0.5*(tl+bl);
352  else if (alpha > 0) x -= 0.5*(tl+bl);
353  if (type != 1) x = -x;
354  y = ((kxy.second+0.5)*cellSize-h);
355  } else {
356  x = hgpar_->waferPosX_[type];
357  y = hgpar_->waferPosY_[type];
358  if (hgpar_->waferTypeT_[type] == 1) {
359  x += hgpar_->cellFineX_[cell];
360  y += hgpar_->cellFineY_[cell];
361  } else {
362  x += hgpar_->cellCoarseX_[cell];
363  y += hgpar_->cellCoarseY_[cell];
364  }
365  if (!reco) {
366  x /= k_ScaleFromDDD;
367  y /= k_ScaleFromDDD;
368  }
369  }
370  return std::pair<float,float>(x,y);
371 }
372 
373 std::pair<float,float> HGCalDDDConstants::locateCellHex(int cell, int wafer,
374  bool reco) const {
375  float x(0), y(0);
376  if (hgpar_->waferTypeT_[wafer] == 1) {
377  x = hgpar_->cellFineX_[cell];
378  y = hgpar_->cellFineY_[cell];
379  } else {
380  x = hgpar_->cellCoarseX_[cell];
381  y = hgpar_->cellCoarseY_[cell];
382  }
383  if (!reco) {
384  x /= k_ScaleFromDDD;
385  y /= k_ScaleFromDDD;
386  }
387  return std::pair<float,float>(x,y);
388 }
389 
391 
392  int cells(0);
393  for (unsigned int i = 0; i<layers(reco); ++i) {
394  int lay = reco ? hgpar_->depth_[i] : hgpar_->layer_[i];
395  if (cells < maxCells(lay, reco)) cells = maxCells(lay, reco);
396  }
397  return cells;
398 }
399 
400 int HGCalDDDConstants::maxCells(int lay, bool reco) const {
401 
402  std::pair<int,float> index = getIndex(lay, reco);
403  int i = index.first;
404  if (i < 0) return 0;
406  float h, bl, tl, alpha;
407  getParameterSquare(i,0,reco,h,bl,tl,alpha);
408  return maxCellsSquare(h, bl, tl, alpha, index.second);
409  } else {
410  unsigned int cells(0);
411  for (unsigned int k=0; k<hgpar_->waferTypeT_.size(); ++k) {
412  if (waferInLayer(k,index.first)) {
413  unsigned int cell = (hgpar_->waferTypeT_[k]==1) ?
414  (hgpar_->cellFineX_.size()) : (hgpar_->cellCoarseX_.size());
415  if (cell > cells) cells = cell;
416  }
417  }
418  return (int)(cells);
419  }
420 }
421 
422 int HGCalDDDConstants::maxCellsSquare(float h, float bl, float tl,
423  float alpha, float cellSize) const {
424 
425  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
426  float b = 2*h*bl/(tl-bl);
427 
428  int ncells(0);
429  //always use the top of the cell to maximize space
430  int kymax = floor((2*h)/cellSize);
431  for (int iky=0; iky<kymax; ++iky) {
432  int cellsInRow=floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize));
433  ncells += cellsInRow;
434  }
435 
436  return ncells;
437 }
438 
439 int HGCalDDDConstants::maxRows(int lay, bool reco) const {
440 
441  int kymax(0);
442  std::pair<int,float> index = getIndex(lay, reco);
443  int i = index.first;
444  if (i < 0) return kymax;
446  float h = (reco) ? hgpar_->moduleHR_[i] : hgpar_->moduleHS_[i];
447  kymax = floor((2*h)/index.second);
448  } else {
449  for (unsigned int k=0; k<hgpar_->waferCopy_.size(); ++k) {
450  if (waferInLayer(k,i)) {
451  int ky = ((hgpar_->waferCopy_[k])/100)%100;
452  if (ky > kymax) kymax = ky;
453  }
454  }
455  }
456  return kymax;
457 }
458 
459 int HGCalDDDConstants::modules(int lay, bool reco) const {
460  if( getIndex(lay,reco).first < 0 ) return 0;
461  return max_modules_layer_[(int)reco][lay];
462 }
463 
464 int HGCalDDDConstants::modulesInit(int lay, bool reco) const {
465  int nmod(0);
466  std::pair<int,float> index = getIndex(lay, reco);
467  if (index.first < 0) return nmod;
468  for (unsigned int k=0; k<hgpar_->waferPosX_.size(); ++k) {
469  if (waferInLayer(k,index.first)) ++nmod;
470  }
471  return nmod;
472 }
473 
474 std::pair<int,int> HGCalDDDConstants::newCell(int cell, int layer, int sector,
475  int subsector, int incrx,
476  int incry, bool half) const {
477 
478  int subSec = half ? subsector : 0;
479  std::pair<int,int> kxy = findCell(cell, layer, subSec, true);
480  int kx = kxy.first + incrx;
481  int ky = kxy.second + incry;
482  if (ky < 0 || ky > maxRows(layer, true)) {
483  cell = maxCells(true);
484  return std::pair<int,int>(cell,sector*subsector);
485  } else if (kx < 0) {
486  kx =-kx;
487  subsector =-subsector;
488  } else if (kx > maxCells(layer, true)) {
489  kx -= maxCells(layer, true);
490  sector += subsector;
491  subsector =-subsector;
492  if (sector < 1) sector = hgpar_->nSectors_;
493  else if (sector > hgpar_->nSectors_) sector = 1;
494  }
495  cell = newCell(kx, ky, layer, subSec);
496  return std::pair<int,int>(cell,sector*subsector);
497 }
498 
499 std::pair<int,int> HGCalDDDConstants::newCell(int cell, int lay, int subsector,
500  int incrz, bool half) const {
501 
502  int layer = lay + incrz;
503  if (layer <= 0 || layer > (int)(layers(true))) return std::pair<int,int>(cell,0);
504  int subSec = half ? subsector : 0;
505  std::pair<float,float> xy = locateCell(cell, lay, subSec, true);
506  std::pair<int,int> kcell = assignCell(xy.first, xy.second, layer, subSec,
507  true);
508  return std::pair<int,int>(kcell.second,layer);
509 }
510 
511 int HGCalDDDConstants::newCell(int kx, int ky, int lay, int subSec) const {
512 
513  std::pair<int,float> index = getIndex(lay, true);
514  int i = index.first;
515  if (i < 0) return maxCells(true);
516  float alpha = (subSec == 0) ? hgpar_->moduleAlphaS_[i] : subSec;
517  float cellSize = index.second;
518  float a = (alpha==0) ?
521  float b = 2*hgpar_->moduleHR_[i]*hgpar_->moduleBlR_[i]/
523  int icell(kx);
524  for (int iky=0; iky<ky; ++iky)
525  icell += floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize));
526  return icell;
527 }
528 
529 std::vector<int> HGCalDDDConstants::numberCells(int lay, bool reco) const {
530 
531  std::pair<int,float> index = getIndex(lay, reco);
532  int i = index.first;
533  std::vector<int> ncell;
534  if (i >= 0) {
536  float h, bl, tl, alpha;
537  getParameterSquare(i,0,reco,h,bl,tl,alpha);
538  return numberCellsSquare(h, bl, tl, alpha, index.second);
539  } else {
540  for (unsigned int k=0; k<hgpar_->waferTypeT_.size(); ++k) {
541  if (waferInLayer(k,i)) {
542  unsigned int cell = (hgpar_->waferTypeT_[k]==1) ?
543  (hgpar_->cellFineX_.size()) : (hgpar_->cellCoarseX_.size());
544  ncell.push_back((int)(cell));
545  }
546  }
547  }
548  }
549  return ncell;
550 }
551 
552 std::vector<int> HGCalDDDConstants::numberCellsSquare(float h, float bl,
553  float tl, float alpha,
554  float cellSize) const {
555 
556  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
557  float b = 2*h*bl/(tl-bl);
558  int kymax = floor((2*h)/cellSize);
559  std::vector<int> ncell;
560  for (int iky=0; iky<kymax; ++iky)
561  ncell.push_back(floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize)));
562  return ncell;
563 }
564 
566 
567  int ncell(0);
568  if (wafer >= 0 && wafer < (int)(hgpar_->waferTypeT_.size())) {
569  if (hgpar_->waferTypeT_[wafer]==1)
570  ncell = (int)(hgpar_->cellFineX_.size());
571  else
572  ncell = (int)(hgpar_->cellCoarseX_.size());
573  }
574  return ncell;
575 }
576 
577 std::pair<int,int> HGCalDDDConstants::rowColumnWafer(int wafer) const {
578  int row(0), col(0);
579  if (wafer < (int)(hgpar_->waferCopy_.size())) {
580  int copy = hgpar_->waferCopy_[wafer];
581  col = copy%100;
582  if ((copy/10000)%10 != 0) col = -col;
583  row = (copy/100)%100;
584  if ((copy/100000)%10 != 0) row = -row;
585  }
586  return std::pair<int,int>(row,col);
587 }
588 
589 std::pair<int,int> HGCalDDDConstants::simToReco(int cell, int lay, int mod,
590  bool half) const {
591 
592  std::pair<int,float> index = getIndex(lay, false);
593  int i = index.first;
594  if (i < 0) {
595  return std::pair<int,int>(-1,-1);
596  }
597  int kx(-1), depth(-1);
599  float h = hgpar_->moduleHS_[i];
600  float bl = hgpar_->moduleBlS_[i];
601  float tl = hgpar_->moduleTlS_[i];
602  float cellSize = hgpar_->cellFactor_[i]*index.second;
603 
604  std::pair<int,int> kxy = findCellSquare(cell, h, bl, tl, hgpar_->moduleAlphaS_[i], index.second);
605  depth = hgpar_->layerGroup_[i];
606  if (depth<0) return std::pair<int,int>(-1,-1);
607  kx = kxy.first/hgpar_->cellFactor_[i];
608  int ky = kxy.second/hgpar_->cellFactor_[i];
609 
610  float a = (half) ? (h/(tl-bl)) : (2*h/(tl-bl));
611  float b = 2*h*bl/(tl-bl);
612  for (int iky=0; iky<ky; ++iky)
613  kx += floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize));
614 #ifdef EDM_ML_DEBUG
615  std::cout << "simToReco: input " << cell << ":" << lay << ":" << half
616  << " kxy " << kxy.first << ":" << kxy.second << " output "
617  << kx << ":" << depth << " cell factor="
618  << hgpar_->cellFactor_[i] << std::endl;
619 #endif
620  } else {
621  kx = cell;
622  int type = hgpar_->waferTypeL_[mod];
623  if (type == 1) {
624  depth = hgpar_->layerGroup_[i];
625  } else if (type == 2) {
626  depth = hgpar_->layerGroupM_[i];
627  } else {
628  depth = hgpar_->layerGroupO_[i];
629  }
630  }
631  return std::pair<int,int>(kx,depth);
632 }
633 
635  const int ncopies = hgpar_->waferCopy_.size();
636  int wafer(ncopies);
637 #ifdef EDM_ML_DEBUG
638  bool ok(false);
639 #endif
640  for (int k=0; k<ncopies; ++k) {
641  if (copy == hgpar_->waferCopy_[k]) {
642  wafer = k;
643 #ifdef EDM_ML_DEBUG
644  ok = true;
645 #endif
646  break;
647  }
648  }
649 #ifdef EDM_ML_DEBUG
650  if (!ok) {
651  std::cout << "Cannot find " << copy << " in a list of " << ncopies << "\n";
652  for (int k=0; k<ncopies; ++k) std::cout << " " << hgpar_->waferCopy_[k];
653  std::cout << std::endl;
654  }
655 #endif
656  return wafer;
657 }
658 
659 void HGCalDDDConstants::waferFromPosition(const double x, const double y,
660  int& wafer, int& icell,
661  int& celltyp) const {
662 
663  double xx(k_ScaleFromDDD*x), yy(k_ScaleFromDDD*y);
664  int size_ = (int)(hgpar_->waferCopy_.size());
665  wafer = size_;
666  for (int k=0; k<size_; ++k) {
667  double dx = std::abs(xx-hgpar_->waferPosX_[k]);
668  double dy = std::abs(yy-hgpar_->waferPosY_[k]);
669  if (dx <= rmax_ && dy <= hexside_) {
670  if ((dy <= 0.5*hexside_) || (dx <= (2.*rmax_-dy/tan30deg_))) {
671  wafer = k;
672  celltyp = hgpar_->waferTypeT_[k];
673  xx -= hgpar_->waferPosX_[k];
674  yy -= hgpar_->waferPosY_[k];
675  break;
676  }
677  }
678  }
679  if (wafer < size_) {
680  if (celltyp == 1)
681  icell = cellHex(xx, yy, 0.5*k_ScaleFromDDD*hgpar_->cellSize_[0],
683  else
684  icell = cellHex(xx, yy, 0.5*k_ScaleFromDDD*hgpar_->cellSize_[1],
686  }
687 #ifdef EDM_ML_DEBUG
688  std::cout << "Position " << x << ":" << y << " Wafer " << wafer << ":"
689  << size_ << " XX " << xx << ":" << yy << " Cell " << icell
690  << " Type " << celltyp << std::endl;
691 #endif
692 }
693 
694 bool HGCalDDDConstants::waferInLayer(int wafer, int lay, bool reco) const {
695 
696  std::pair<int,float> indx = getIndex(lay, reco);
697  if (indx.first < 0) return false;
698  return waferInLayer(wafer,indx.first);
699 }
700 
701 std::pair<double,double> HGCalDDDConstants::waferPosition(int wafer,
702  bool reco) const {
703 
704  double xx(0), yy(0);
705  if (wafer >= 0 && wafer < (int)(hgpar_->waferPosX_.size())) {
706  xx = hgpar_->waferPosX_[wafer];
707  yy = hgpar_->waferPosY_[wafer];
708  }
709  if (!reco) {
710  xx /= k_ScaleFromDDD;
711  yy /= k_ScaleFromDDD;
712  }
713  std::pair<double,double> xy(xx,yy);
714  return xy;
715 }
716 
717 double HGCalDDDConstants::waferZ(int lay, bool reco) const {
718  std::pair<int,float> index = getIndex(lay, reco);
719  int i = index.first;
720  if (i < 0) return 0;
721  else return hgpar_->zLayerHex_[i];
722 }
723 
725 
726  int wafer(0);
727  for (unsigned int i = 0; i<layers(true); ++i) {
728  int lay = hgpar_->depth_[i];
729  wafer += modules(lay, true);
730  }
731  return wafer;
732 }
733 
734 int HGCalDDDConstants::wafers(int layer, int type) const {
735 
736  int wafer(0);
737  auto itr = waferLayer_.find(layer);
738  if (itr != waferLayer_.end()) {
739  unsigned ity = (type > 0 && type <= 2) ? type : 0;
740  wafer = (itr->second)[ity];
741  }
742  return wafer;
743 }
744 
745 bool HGCalDDDConstants::isHalfCell(int waferType, int cell) const {
746  if( waferType < 1 || cell < 0) return false;
747  return waferType == 2 ? hgpar_->cellCoarseHalf_[cell] : hgpar_->cellFineHalf_[cell];
748 }
749 
750 int HGCalDDDConstants::cellHex(double xx, double yy,
751  const double& cellR,
752  const std::vector<double>& posX,
753  const std::vector<double>& posY) const {
754  int num(0);
755  const double tol(0.00001);
756  double cellY = 2.0*cellR*tan30deg_;
757  for (unsigned int k=0; k<posX.size(); ++k) {
758  double dx = std::abs(xx - posX[k]);
759  double dy = std::abs(yy - posY[k]);
760  if (dx <= (cellR+tol) && dy <= (cellY+tol)) {
761  double xmax = (dy<=0.5*cellY) ? cellR : (cellR-(dy-0.5*cellY)/tan30deg_);
762  if (dx <= (xmax+tol)) {
763  num = k;
764  break;
765  }
766  }
767  }
768  return num;
769 }
770 
771 std::pair<int,float> HGCalDDDConstants::getIndex(int lay, bool reco) const {
772 
773  if (lay<1 || lay>(int)(hgpar_->layerIndex_.size())) return std::pair<int,float>(-1,0);
774  if (reco && lay>(int)(hgpar_->depthIndex_.size())) return std::pair<int,float>(-1,0);
775  int indx(0);
776  float cell(0);
778  indx = (reco ? hgpar_->depthIndex_[lay-1] : hgpar_->layerIndex_[lay-1]);
779  cell = (reco ? hgpar_->moduleCellR_[indx] : hgpar_->moduleCellS_[indx]);
780  } else {
781  indx = (reco ? hgpar_->depthLayerF_[lay-1] : hgpar_->layerIndex_[lay-1]);
782  cell = (reco ? hgpar_->moduleCellR_[0] : hgpar_->moduleCellS_[0]);
783  }
784  return std::pair<int,float>(indx,cell);
785 }
786 
787 void HGCalDDDConstants::getParameterSquare(int lay, int subSec, bool reco,
788  float& h, float& bl, float& tl,
789  float& alpha) const {
790  if (reco) {
791  h = hgpar_->moduleHR_[lay];
792  bl = hgpar_->moduleBlR_[lay];
793  tl = hgpar_->moduleTlR_[lay];
794  alpha= hgpar_->moduleAlphaR_[lay];
795  if ((subSec>0 && alpha<0) || (subSec<=0 && alpha>0)) alpha = -alpha;
796  } else {
797  h = hgpar_->moduleHS_[lay];
798  bl = hgpar_->moduleBlS_[lay];
799  tl = hgpar_->moduleTlS_[lay];
800  alpha= hgpar_->moduleAlphaS_[lay];
801  }
802 }
803 
804 bool HGCalDDDConstants::waferInLayer(int wafer, int lay) const {
805 
806  const double rr = 2*rmax_*tan30deg_;
807  const double waferX = hgpar_->waferPosX_[wafer];
808  const double waferY = hgpar_->waferPosY_[wafer];
809  double xc[6], yc[6];
810  xc[0] = waferX+rmax_; yc[0] = waferY-0.5*rr;
811  xc[1] = waferX+rmax_; yc[1] = waferY+0.5*rr;
812  xc[2] = waferX; yc[2] = waferY+rr;
813  xc[3] = waferX-rmax_; yc[3] = waferY+0.5*rr;
814  xc[4] = waferX+rmax_; yc[4] = waferY-0.5*rr;
815  xc[5] = waferX; yc[5] = waferY-rr;
816  bool cornerOne(false), cornerAll(true);
817  for (int k=0; k<6; ++k) {
818  double rpos = std::sqrt(xc[k]*xc[k]+yc[k]*yc[k]);
819  if ((rpos >= hgpar_->rMinLayHex_[lay]) &&
820  (rpos <= hgpar_->rMaxLayHex_[lay])) cornerOne = true;
821  else cornerAll = false;
822  }
823  bool in(false);
825  in = cornerAll;
827  in = cornerOne;
828  return in;
829 }
830 
832 
bool isHalfCell(int waferType, int cell) const
std::vector< double > waferPosY_
type
Definition: HCALResponse.h:21
std::vector< int > layer_
double k_horizontalShift
std::vector< int > depthLayerF_
float alpha
Definition: AMPTWrapper.h:95
std::vector< int > depth_
std::vector< double > moduleCellR_
std::vector< double > moduleHR_
bool isValid(int lay, int mod, int cell, bool reco) const
layer_map copiesInLayers_
std::vector< int > numberCellsSquare(float h, float bl, float tl, float alpha, float cellSize) const
std::vector< HGCalParameters::hgtrap > getModules() const
std::vector< bool > cellCoarseHalf_
int maxCellsSquare(float h, float bl, float tl, float alpha, float cellSize) const
std::vector< bool > cellFineHalf_
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
std::array< uint32_t, 2 > tot_layers_
std::map< int, HGCWaferParam > waferLayer_
void waferFromPosition(const double x, const double y, int &wafer, int &icell, int &celltyp) const
std::vector< int > moduleLayR_
double cellSizeHex(int type) const
HGCalParameters::hgtrform getTrForm(unsigned int k) const
Simrecovecs max_modules_layer_
unsigned int layersInit(bool reco) const
std::vector< double > moduleHS_
HGCalDDDConstants(const HGCalParameters *hp, const std::string name)
int maxRows(int lay, bool reco) const
std::vector< int > numberCells(int lay, bool reco) const
std::vector< double > cellFineY_
std::pair< int, int > findCellSquare(int cell, float h, float bl, float tl, float alpha, float cellSize) const
static const int modmax
Definition: herwig.h:133
std::pair< int, int > assignCellSquare(float x, float y, float h, float bl, float tl, float alpha, float cellSize) const
int modulesInit(int lay, bool reco) const
std::pair< float, float > locateCell(int cell, int lay, int type, bool reco) const
std::vector< uint32_t > trformIndex_
std::vector< int > layerGroupM_
HGCalGeometryMode::GeometryMode mode_
HGCalGeometryMode::GeometryMode mode_
#define constexpr
std::vector< int > cellFactor_
int cellHex(double xx, double yy, const double &cellR, const std::vector< double > &posX, const std::vector< double > &posY) const
std::pair< float, float > locateCellHex(int cell, int wafer, bool reco) const
std::vector< double > cellCoarseX_
int modules(int lay, bool reco) const
std::pair< int, int > simToReco(int cell, int layer, int mod, bool half) const
unsigned int getTrFormN() const
unsigned int layers(bool reco) const
int numberCellsHexagon(int wafer) const
std::vector< double > cellSize_
std::vector< HGCalParameters::hgtrform > getTrForms() const
std::pair< int, int > assignCellHexagon(float x, float y) const
std::pair< double, double > waferPosition(int wafer, bool reco=true) const
std::vector< int > layerIndex_
std::vector< double > moduleAlphaR_
susybsm::HSCParticleRefProd hp
Definition: classes.h:27
hgtrform getTrForm(unsigned int k) const
T sqrt(T t)
Definition: SSEVec.h:18
std::pair< int, int > findCell(int cell, int lay, int subSec, bool reco) const
std::pair< int, float > getIndex(int lay, bool reco) const
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
hgtrap getModule(unsigned int k, bool reco) const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< double > moduleBlR_
bool isValidCell(int layindex, int wafer, int cell) const
int sectors() const
std::vector< double > rMinLayHex_
std::vector< double > moduleTlS_
std::pair< int, int > rowColumnWafer(const int wafer) const
std::vector< double > zLayerHex_
double waferZ(int layer, bool reco) const
int k[5][pyjets_maxn]
#define TYPELOOKUP_DATA_REG(_dataclass_)
Definition: typelookup.h:96
std::vector< double > rMaxLayHex_
int waferFromCopy(int copy) const
void getParameterSquare(int lay, int subSec, bool reco, float &h, float &bl, float &tl, float &alpha) const
std::vector< int > layerGroup_
std::vector< double > moduleCellS_
double b
Definition: hdecay.h:120
std::vector< double > cellFineX_
std::pair< int, int > newCell(int cell, int layer, int sector, int subsector, int incrx, int incry, bool half) const
std::vector< double > moduleAlphaS_
std::vector< int > layerGroupO_
fixed size matrix
std::vector< double > moduleBlS_
if(dp >Float(M_PI)) dp-
double a
Definition: hdecay.h:121
std::vector< int > waferCopy_
col
Definition: cuy.py:1008
std::vector< int > depthIndex_
std::pair< int, int > assignCell(float x, float y, int lay, int subSec, bool reco) const
double k_ScaleFromDDD
std::vector< int > waferTypeT_
std::vector< double > cellCoarseY_
HGCalParameters::hgtrap getModule(unsigned int k, bool hexType, bool reco) const
const HGCalParameters * hgpar_
int maxCells(bool reco) const
std::vector< double > waferPosX_
T mod(const T &a, const T &b)
Definition: ecalDccMap.h:4
std::vector< double > moduleTlR_
std::vector< int > waferTypeL_
static double tan30deg_
std::array< int, 3 > HGCWaferParam
bool waferInLayer(int wafer, int lay, bool reco) const