test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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) {
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  << " wafers, " << 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 }
79 
81 
82 std::pair<int,int> HGCalDDDConstants::assignCell(float x, float y, int lay,
83  int subSec, bool reco) const {
84  std::pair<int,float> index = getIndex(lay, reco);
85  std::pair<int,int> cellAssignment(-1,-1);
86  int i = index.first;
87  if (i < 0) return cellAssignment;
89  float alpha, h, bl, tl;
90  getParameterSquare(i,subSec,reco,h,bl,tl,alpha);
91  cellAssignment = assignCellSquare(x, y, h, bl, tl, alpha, index.second);
92  } else {
93  float xx = (reco) ? x : k_ScaleFromDDD*x;
94  float yy = (reco) ? y : k_ScaleFromDDD*y;
95  cellAssignment = assignCellHexagon(xx,yy);
96  }
97  return cellAssignment;
98 }
99 
100 std::pair<int,int> HGCalDDDConstants::assignCellSquare(float x, float y,
101  float h, float bl,
102  float tl, float alpha,
103  float cellSize) const {
104 
105  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
106  float b = 2*h*bl/(tl-bl);
107 
108  float x0(x);
109  int phiSector = (x0 > 0) ? 1 : 0;
110  if (alpha < 0) {x0 -= 0.5*(tl+bl); phiSector = 0;}
111  else if (alpha > 0) {x0 += 0.5*(tl+bl); phiSector = 1;}
112 
113  //determine the i-y
114  int ky = floor((y+h)/cellSize);
115  if (ky*cellSize> y+h) ky--;
116  if (ky<0) return std::pair<int,int>(-1,-1);
117  if ((ky+1)*cellSize < (y+h) ) ky++;
118  int max_ky_allowed=floor(2*h/cellSize);
119  if (ky>max_ky_allowed-1) return std::pair<int,int>(-1,-1);
120 
121  //determine the i-x
122  //notice we substitute y by the top of the candidate cell to reduce the dead zones
123  int kx = floor(fabs(x0)/cellSize);
124  if (kx*cellSize > fabs(x0) ) kx--;
125  if (kx<0) return std::pair<int,int>(-1,-1);
126  if ((kx+1)*cellSize < fabs(x0)) kx++;
127  int max_kx_allowed=floor( ((ky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize) );
128  if (kx>max_kx_allowed-1) return std::pair<int,int>(-1,-1);
129 
130  //count cells summing in rows until required height
131  //notice the bottom of the cell must be used
132  int icell(0);
133  for (int iky=0; iky<ky; ++iky) {
134  int cellsInRow( floor( ((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize) ) );
135  icell += cellsInRow;
136  }
137  icell += kx;
138 
139  //return result
140  return std::pair<int,int>(phiSector,icell);
141 }
142 
143 std::pair<int,int> HGCalDDDConstants::assignCellHexagon(float x,
144  float y) const {
145  double xx(x), yy(y);
146  //First the wafer
147  int wafer = cellHex(xx, yy, rmax_, hgpar_->waferPosX_, hgpar_->waferPosY_);
148  // Now the cell
149  xx -= hgpar_->waferPosX_[wafer];
150  yy -= hgpar_->waferPosY_[wafer];
151  int cell(0);
152  if (hgpar_->waferTypeT_[wafer] == 1)
154  else
156  return std::pair<int,int>(wafer,cell);
157 }
158 
160  int indx = (type == 1) ? 0 : 1;
161  double cell = (0.5*k_ScaleFromDDD*hgpar_->cellSize_[indx]);
162  return cell;
163 }
164 
165 unsigned int HGCalDDDConstants::layers(bool reco) const {
166  return tot_layers_[(int)reco];
167 }
168 
169 unsigned int HGCalDDDConstants::layersInit(bool reco) const {
170  return (reco ? hgpar_->depthIndex_.size() : hgpar_->layerIndex_.size());
171 }
172 
173 std::pair<int,int> HGCalDDDConstants::findCell(int cell, int lay, int subSec,
174  bool reco) const {
175 
176  std::pair<int,float> index = getIndex(lay, reco);
177  int i = index.first;
178  if (i < 0) return std::pair<int,int>(-1,-1);
180  return std::pair<int,int>(-1,-1);
181  } else {
182  float alpha, h, bl, tl;
183  getParameterSquare(i,subSec,reco,h,bl,tl,alpha);
184  return findCellSquare(cell, h, bl, tl, alpha, index.second);
185  }
186 }
187 
188 std::pair<int,int> HGCalDDDConstants::findCellSquare(int cell, float h,
189  float bl, float tl,
190  float alpha,
191  float cellSize) const {
192 
193  //check if cell number is meaningful
194  if(cell<0) return std::pair<int,int>(-1,-1);
195 
196  //parameterization of the boundary of the trapezoid
197  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
198  float b = 2*h*bl/(tl-bl);
199  int kx(cell), ky(0);
200  int kymax( floor((2*h)/cellSize) );
201  int testCell(0);
202  for (int iky=0; iky<kymax; ++iky) {
203 
204  //check if adding all the cells in this row is above the required cell
205  //notice the top of the cell is used to maximize space
206  int cellsInRow(floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize)));
207  if (testCell+cellsInRow > cell) break;
208  testCell += cellsInRow;
209  ky++;
210  kx -= cellsInRow;
211  }
212 
213  return std::pair<int,int>(kx,ky);
214 }
215 
217  bool hexType,
218  bool reco) const {
219 
221  if (hexType) {
222  unsigned int type = (indx < hgpar_->waferTypeL_.size()) ?
223  hgpar_->waferTypeL_[indx] : 3;
224  if (type > 0) --type;
225  mytr = hgpar_->getModule(type, true);
226  } else {
227  if (reco) mytr = hgpar_->getModule(indx,true);
228  else mytr = hgpar_->getModule(indx,false);
229  }
230  return mytr;
231 }
232 
233 std::vector<HGCalParameters::hgtrap> HGCalDDDConstants::getModules() const {
234 
235  std::vector<HGCalParameters::hgtrap> mytrs;
236  for (unsigned int k=0; k<hgpar_->moduleLayR_.size(); ++k)
237  mytrs.push_back(hgpar_->getModule(k,true));
238  return mytrs;
239 }
240 
241 std::vector<HGCalParameters::hgtrform> HGCalDDDConstants::getTrForms() const {
242 
243  std::vector<HGCalParameters::hgtrform> mytrs;
244  for (unsigned int k=0; k<hgpar_->trformIndex_.size(); ++k)
245  mytrs.push_back(hgpar_->getTrForm(k));
246  return mytrs;
247 }
248 
249 bool HGCalDDDConstants::isValid(int lay, int mod, int cell, bool reco) const {
250 
251  bool ok(false);
252  int cellmax(0), modmax(0);
254  cellmax = maxCells(lay,reco);
255  modmax = sectors();
256  ok = ((lay > 0 && lay <= (int)(layers(reco))) &&
257  (mod > 0 && mod <= modmax) &&
258  (cell >=0 && cell <= cellmax));
259  } else {
260  int32_t copyNumber = hgpar_->waferCopy_[mod];
261  ok = ((lay > 0 && lay <= (int)(layers(reco))));
262  if( ok ) {
263  const int32_t lay_idx = reco ? (lay-1)*3 + 1 : lay;
264  const auto& the_modules = hgpar_->copiesInLayers_[lay_idx];
265  auto moditr = the_modules.find(copyNumber);
266  ok = (moditr != the_modules.end());
267  if (ok) {
268  if (moditr->second >= 0) {
269  cellmax = (hgpar_->waferTypeT_[mod]==1) ?
270  (int)(hgpar_->cellFineX_.size()) : (int)(hgpar_->cellCoarseX_.size());
271  ok = (cell >=0 && cell <= cellmax);
272  } else {
273  ok = isValidCell(lay_idx, mod, cell);
274  }
275  }
276  }
277  }
278 
279 #ifdef EDM_ML_DEBUG
280  if (!ok) std::cout << "HGCalDDDConstants: Layer " << lay << ":"
281  << (lay > 0 && (lay <= (int)(layers(reco)))) << " Module "
282  << mod << ":" << (mod > 0 && mod <= modmax) << " Cell "
283  << cell << ":" << (cell >=0 && cell <= cellmax)
284  << ":" << maxCells(reco) << std::endl;
285 #endif
286  return ok;
287 }
288 
289 bool HGCalDDDConstants::isValidCell(int lay, int wafer, int cell) const {
290 
291  // Calculate the position of the cell
292  double x = hgpar_->waferPosX_[wafer];
293  double y = hgpar_->waferPosY_[wafer];
294  if (hgpar_->waferTypeT_[wafer] == 1) {
295  x += hgpar_->cellFineX_[cell];
296  y += hgpar_->cellFineY_[cell];
297  } else {
298  x += hgpar_->cellCoarseX_[cell];
299  y += hgpar_->cellCoarseY_[cell];
300  }
301  double rr = sqrt(x*x+y*y);
302  bool ok = ((rr >= hgpar_->rMinLayHex_[lay-1]) &
303  (rr <= hgpar_->rMaxLayHex_[lay-1]));
304 #ifdef EDM_ML_DEBUG
305  std::cout << "Input " << lay << ":" << wafer << ":" << cell << " Position "
306  << x << ":" << y << ":" << rr << " Compare Limits "
307  << hgpar_->rMinLayHex_[lay-1] << ":" << hgpar_->rMaxLayHex_[lay-1]
308  << " Flag " << ok << std::endl;
309 #endif
310  return ok;
311 }
312 
313 std::pair<float,float> HGCalDDDConstants::locateCell(int cell, int lay,
314  int type, bool reco) const {
315  // type refers to subsector # for square cell and wafer # for hexagon cell
316  float x(999999.), y(999999.);
317  std::pair<int,float> index = getIndex(lay, reco);
318  int i = index.first;
319  if (i < 0) return std::pair<float,float>(x,y);
321  std::pair<int,int> kxy = findCell(cell, lay, type, reco);
322  float alpha, h, bl, tl;
323  getParameterSquare(i,type,reco,h,bl,tl,alpha);
324  float cellSize = index.second;
325  x = (kxy.first+0.5)*cellSize;
326  if (alpha < 0) x -= 0.5*(tl+bl);
327  else if (alpha > 0) x -= 0.5*(tl+bl);
328  if (type != 1) x = -x;
329  y = ((kxy.second+0.5)*cellSize-h);
330  } else {
331  x = hgpar_->waferPosX_[type];
332  y = hgpar_->waferPosY_[type];
333  if (hgpar_->waferTypeT_[type] == 1) {
334  x += hgpar_->cellFineX_[cell];
335  y += hgpar_->cellFineY_[cell];
336  } else {
337  x += hgpar_->cellCoarseX_[cell];
338  y += hgpar_->cellCoarseY_[cell];
339  }
340  if (!reco) {
341  x /= k_ScaleFromDDD;
342  y /= k_ScaleFromDDD;
343  }
344  }
345  return std::pair<float,float>(x,y);
346 }
347 
348 std::pair<float,float> HGCalDDDConstants::locateCellHex(int cell, int wafer,
349  bool reco) const {
350  float x(0), y(0);
351  if (hgpar_->waferTypeT_[wafer] == 1) {
352  x = hgpar_->cellFineX_[cell];
353  y = hgpar_->cellFineY_[cell];
354  } else {
355  x = hgpar_->cellCoarseX_[cell];
356  y = hgpar_->cellCoarseY_[cell];
357  }
358  if (!reco) {
359  x /= k_ScaleFromDDD;
360  y /= k_ScaleFromDDD;
361  }
362  return std::pair<float,float>(x,y);
363 }
364 
366 
367  int cells(0);
368  for (unsigned int i = 0; i<layers(reco); ++i) {
369  int lay = reco ? hgpar_->depth_[i] : hgpar_->layer_[i];
370  if (cells < maxCells(lay, reco)) cells = maxCells(lay, reco);
371  }
372  return cells;
373 }
374 
375 int HGCalDDDConstants::maxCells(int lay, bool reco) const {
376 
377  std::pair<int,float> index = getIndex(lay, reco);
378  int i = index.first;
379  if (i < 0) return 0;
381  float h, bl, tl, alpha;
382  getParameterSquare(i,0,reco,h,bl,tl,alpha);
383  return maxCellsSquare(h, bl, tl, alpha, index.second);
384  } else {
385  unsigned int cells(0);
386  for (unsigned int k=0; k<hgpar_->waferTypeT_.size(); ++k) {
387  if (waferInLayer(k,index.first)) {
388  unsigned int cell = (hgpar_->waferTypeT_[k]==1) ?
389  (hgpar_->cellFineX_.size()) : (hgpar_->cellCoarseX_.size());
390  if (cell > cells) cells = cell;
391  }
392  }
393  return (int)(cells);
394  }
395 }
396 
397 int HGCalDDDConstants::maxCellsSquare(float h, float bl, float tl,
398  float alpha, float cellSize) const {
399 
400  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
401  float b = 2*h*bl/(tl-bl);
402 
403  int ncells(0);
404  //always use the top of the cell to maximize space
405  int kymax = floor((2*h)/cellSize);
406  for (int iky=0; iky<kymax; ++iky) {
407  int cellsInRow=floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize));
408  ncells += cellsInRow;
409  }
410 
411  return ncells;
412 }
413 
414 int HGCalDDDConstants::maxRows(int lay, bool reco) const {
415 
416  int kymax(0);
417  std::pair<int,float> index = getIndex(lay, reco);
418  int i = index.first;
419  if (i < 0) return kymax;
421  float h = (reco) ? hgpar_->moduleHR_[i] : hgpar_->moduleHS_[i];
422  kymax = floor((2*h)/index.second);
423  } else {
424  for (unsigned int k=0; k<hgpar_->waferCopy_.size(); ++k) {
425  if (waferInLayer(k,i)) {
426  int ky = ((hgpar_->waferCopy_[k])/100)%100;
427  if (ky > kymax) kymax = ky;
428  }
429  }
430  }
431  return kymax;
432 }
433 
434 int HGCalDDDConstants::modules(int lay, bool reco) const {
435  if( getIndex(lay,reco).first < 0 ) return 0;
436  return max_modules_layer_[(int)reco][lay];
437 }
438 
439 int HGCalDDDConstants::modulesInit(int lay, bool reco) const {
440  int nmod(0);
441  std::pair<int,float> index = getIndex(lay, reco);
442  if (index.first < 0) return nmod;
443  for (unsigned int k=0; k<hgpar_->waferPosX_.size(); ++k) {
444  if (waferInLayer(k,index.first)) ++nmod;
445  }
446  return nmod;
447 }
448 
449 std::pair<int,int> HGCalDDDConstants::newCell(int cell, int layer, int sector,
450  int subsector, int incrx,
451  int incry, bool half) const {
452 
453  int subSec = half ? subsector : 0;
454  std::pair<int,int> kxy = findCell(cell, layer, subSec, true);
455  int kx = kxy.first + incrx;
456  int ky = kxy.second + incry;
457  if (ky < 0 || ky > maxRows(layer, true)) {
458  cell = maxCells(true);
459  return std::pair<int,int>(cell,sector*subsector);
460  } else if (kx < 0) {
461  kx =-kx;
462  subsector =-subsector;
463  } else if (kx > maxCells(layer, true)) {
464  kx -= maxCells(layer, true);
465  sector += subsector;
466  subsector =-subsector;
467  if (sector < 1) sector = hgpar_->nSectors_;
468  else if (sector > hgpar_->nSectors_) sector = 1;
469  }
470  cell = newCell(kx, ky, layer, subSec);
471  return std::pair<int,int>(cell,sector*subsector);
472 }
473 
474 std::pair<int,int> HGCalDDDConstants::newCell(int cell, int lay, int subsector,
475  int incrz, bool half) const {
476 
477  int layer = lay + incrz;
478  if (layer <= 0 || layer > (int)(layers(true))) return std::pair<int,int>(cell,0);
479  int subSec = half ? subsector : 0;
480  std::pair<float,float> xy = locateCell(cell, lay, subSec, true);
481  std::pair<int,int> kcell = assignCell(xy.first, xy.second, layer, subSec,
482  true);
483  return std::pair<int,int>(kcell.second,layer);
484 }
485 
486 int HGCalDDDConstants::newCell(int kx, int ky, int lay, int subSec) const {
487 
488  std::pair<int,float> index = getIndex(lay, true);
489  int i = index.first;
490  if (i < 0) return maxCells(true);
491  float alpha = (subSec == 0) ? hgpar_->moduleAlphaS_[i] : subSec;
492  float cellSize = index.second;
493  float a = (alpha==0) ?
496  float b = 2*hgpar_->moduleHR_[i]*hgpar_->moduleBlR_[i]/
498  int icell(kx);
499  for (int iky=0; iky<ky; ++iky)
500  icell += floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize));
501  return icell;
502 }
503 
504 std::vector<int> HGCalDDDConstants::numberCells(int lay, bool reco) const {
505 
506  std::pair<int,float> index = getIndex(lay, reco);
507  int i = index.first;
508  std::vector<int> ncell;
509  if (i >= 0) {
511  float h, bl, tl, alpha;
512  getParameterSquare(i,0,reco,h,bl,tl,alpha);
513  return numberCellsSquare(h, bl, tl, alpha, index.second);
514  } else {
515  for (unsigned int k=0; k<hgpar_->waferTypeT_.size(); ++k) {
516  if (waferInLayer(k,i)) {
517  unsigned int cell = (hgpar_->waferTypeT_[k]==1) ?
518  (hgpar_->cellFineX_.size()) : (hgpar_->cellCoarseX_.size());
519  ncell.push_back((int)(cell));
520  }
521  }
522  }
523  }
524  return ncell;
525 }
526 
527 std::vector<int> HGCalDDDConstants::numberCellsSquare(float h, float bl,
528  float tl, float alpha,
529  float cellSize) const {
530 
531  float a = (alpha==0) ? (2*h/(tl-bl)) : (h/(tl-bl));
532  float b = 2*h*bl/(tl-bl);
533  int kymax = floor((2*h)/cellSize);
534  std::vector<int> ncell;
535  for (int iky=0; iky<kymax; ++iky)
536  ncell.push_back(floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize)));
537  return ncell;
538 }
539 
541 
542  int ncell(0);
543  if (wafer >= 0 && wafer < (int)(hgpar_->waferTypeT_.size())) {
544  if (hgpar_->waferTypeT_[wafer]==1)
545  ncell = (int)(hgpar_->cellFineX_.size());
546  else
547  ncell = (int)(hgpar_->cellCoarseX_.size());
548  }
549  return ncell;
550 }
551 
552 std::pair<int,int> HGCalDDDConstants::rowColumnWafer(int wafer) const {
553  int row(0), col(0);
554  if (wafer < (int)(hgpar_->waferCopy_.size())) {
555  int copy = hgpar_->waferCopy_[wafer];
556  col = copy%100;
557  if ((copy/10000)%10 != 0) col = -col;
558  row = (copy/100)%100;
559  if ((copy/100000)%10 != 0) row = -row;
560  }
561  return std::pair<int,int>(row,col);
562 }
563 
564 std::pair<int,int> HGCalDDDConstants::simToReco(int cell, int lay, int mod,
565  bool half) const {
566 
567  std::pair<int,float> index = getIndex(lay, false);
568  int i = index.first;
569  if (i < 0) {
570  return std::pair<int,int>(-1,-1);
571  }
572  int kx(-1), depth(-1);
574  float h = hgpar_->moduleHS_[i];
575  float bl = hgpar_->moduleBlS_[i];
576  float tl = hgpar_->moduleTlS_[i];
577  float cellSize = hgpar_->cellFactor_[i]*index.second;
578 
579  std::pair<int,int> kxy = findCellSquare(cell, h, bl, tl, hgpar_->moduleAlphaS_[i], index.second);
580  depth = hgpar_->layerGroup_[i];
581  if (depth<0) return std::pair<int,int>(-1,-1);
582  kx = kxy.first/hgpar_->cellFactor_[i];
583  int ky = kxy.second/hgpar_->cellFactor_[i];
584 
585  float a = (half) ? (h/(tl-bl)) : (2*h/(tl-bl));
586  float b = 2*h*bl/(tl-bl);
587  for (int iky=0; iky<ky; ++iky)
588  kx += floor(((iky+1)*cellSize+b+k_horizontalShift*cellSize)/(a*cellSize));
589 #ifdef EDM_ML_DEBUG
590  std::cout << "simToReco: input " << cell << ":" << lay << ":" << half
591  << " kxy " << kxy.first << ":" << kxy.second << " output "
592  << kx << ":" << depth << " cell factor="
593  << hgpar_->cellFactor_[i] << std::endl;
594 #endif
595  } else {
596  kx = cell;
597  int type = hgpar_->waferTypeL_[mod];
598  if (type == 1) {
599  depth = hgpar_->layerGroup_[i];
600  } else if (type == 2) {
601  depth = hgpar_->layerGroupM_[i];
602  } else {
603  depth = hgpar_->layerGroupO_[i];
604  }
605  }
606  return std::pair<int,int>(kx,depth);
607 }
608 
610  const int ncopies = hgpar_->waferCopy_.size();
611  int wafer = ncopies;
612  for (int k=0; k<ncopies; ++k) {
613  if (copy == hgpar_->waferCopy_[k]) {
614  wafer = k;
615  break;
616  }
617  }
618  return wafer;
619 }
620 
621 void HGCalDDDConstants::waferFromPosition(const double x, const double y,
622  int& wafer, int& icell,
623  int& celltyp) const {
624 
625  double xx(k_ScaleFromDDD*x), yy(k_ScaleFromDDD*y);
626  int size_ = (int)(hgpar_->waferCopy_.size());
627  wafer = size_;
628  for (int k=0; k<size_; ++k) {
629  double dx = std::abs(xx-hgpar_->waferPosX_[k]);
630  double dy = std::abs(yy-hgpar_->waferPosY_[k]);
631  if (dx <= rmax_ && dy <= hexside_) {
632  if ((dy <= 0.5*hexside_) || (dx <= (2.*rmax_-dy/tan30deg_))) {
633  wafer = k;
634  celltyp = hgpar_->waferTypeT_[k];
635  xx -= hgpar_->waferPosX_[k];
636  yy -= hgpar_->waferPosY_[k];
637  break;
638  }
639  }
640  }
641  if (wafer < size_) {
642  if (celltyp == 1)
643  icell = cellHex(xx, yy, 0.5*k_ScaleFromDDD*hgpar_->cellSize_[0],
645  else
646  icell = cellHex(xx, yy, 0.5*k_ScaleFromDDD*hgpar_->cellSize_[1],
648  }
649 #ifdef EDM_ML_DEBUG
650  std::cout << "Position " << x << ":" << y << " Wafer " << wafer << ":"
651  << size_ << " XX " << xx << ":" << yy << " Cell " << icell
652  << " Type " << celltyp << std::endl;
653 #endif
654 }
655 
656 bool HGCalDDDConstants::waferInLayer(int wafer, int lay, bool reco) const {
657 
658  std::pair<int,float> indx = getIndex(lay, reco);
659  if (indx.first < 0) return false;
660  return waferInLayer(wafer,indx.first);
661 }
662 
663 std::pair<double,double> HGCalDDDConstants::waferPosition(int wafer) const {
664 
665  std::pair<double,double> xy;
666  if (wafer >= 0 && wafer < (int)(hgpar_->waferPosX_.size())) {
667  xy = std::pair<double,double>(hgpar_->waferPosX_[wafer],hgpar_->waferPosY_[wafer]);
668  } else {
669  xy = std::pair<double,double>(0,0);
670  }
671  return xy;
672 }
673 
674 double HGCalDDDConstants::waferZ(int lay, bool reco) const {
675  std::pair<int,float> index = getIndex(lay, reco);
676  int i = index.first;
677  if (i < 0) return 0;
678  else return hgpar_->zLayerHex_[i];
679 }
680 
682 
683  int wafer(0);
684  for (unsigned int i = 0; i<layers(true); ++i) {
685  int lay = hgpar_->depth_[i];
686  wafer += modules(lay, true);
687  }
688  return wafer;
689 }
690 
691 bool HGCalDDDConstants::isHalfCell(int waferType, int cell) const {
692  if( waferType < 1 || cell < 0) return false;
693  return waferType == 2 ? hgpar_->cellCoarseHalf_[cell] : hgpar_->cellFineHalf_[cell];
694 }
695 
696 int HGCalDDDConstants::cellHex(double xx, double yy,
697  const double& cellR,
698  const std::vector<double>& posX,
699  const std::vector<double>& posY) const {
700  int num(0);
701  const double tol(0.00001);
702  double cellY = 2.0*cellR*tan30deg_;
703  for (unsigned int k=0; k<posX.size(); ++k) {
704  double dx = std::abs(xx - posX[k]);
705  double dy = std::abs(yy - posY[k]);
706  if (dx <= (cellR+tol) && dy <= (cellY+tol)) {
707  double xmax = (dy<=0.5*cellY) ? cellR : (cellR-(dy-0.5*cellY)/tan30deg_);
708  if (dx <= (xmax+tol)) {
709  num = k;
710  break;
711  }
712  }
713  }
714  return num;
715 }
716 
717 std::pair<int,float> HGCalDDDConstants::getIndex(int lay, bool reco) const {
718 
719  if (lay<1 || lay>(int)(hgpar_->layerIndex_.size())) return std::pair<int,float>(-1,0);
720  if (reco && lay>(int)(hgpar_->depthIndex_.size())) return std::pair<int,float>(-1,0);
721  int indx(0);
722  float cell(0);
724  indx = (reco ? hgpar_->depthIndex_[lay-1] : hgpar_->layerIndex_[lay-1]);
725  cell = (reco ? hgpar_->moduleCellR_[indx] : hgpar_->moduleCellS_[indx]);
726  } else {
727  indx = (reco ? hgpar_->depthLayerF_[lay-1] : hgpar_->layerIndex_[lay-1]);
728  cell = (reco ? hgpar_->moduleCellR_[0] : hgpar_->moduleCellS_[0]);
729  }
730  return std::pair<int,float>(indx,cell);
731 }
732 
733 void HGCalDDDConstants::getParameterSquare(int lay, int subSec, bool reco,
734  float& h, float& bl, float& tl,
735  float& alpha) const {
736  if (reco) {
737  h = hgpar_->moduleHR_[lay];
738  bl = hgpar_->moduleBlR_[lay];
739  tl = hgpar_->moduleTlR_[lay];
740  alpha= hgpar_->moduleAlphaR_[lay];
741  if ((subSec>0 && alpha<0) || (subSec<=0 && alpha>0)) alpha = -alpha;
742  } else {
743  h = hgpar_->moduleHS_[lay];
744  bl = hgpar_->moduleBlS_[lay];
745  tl = hgpar_->moduleTlS_[lay];
746  alpha= hgpar_->moduleAlphaS_[lay];
747  }
748 }
749 
750 bool HGCalDDDConstants::waferInLayer(int wafer, int lay) const {
751 
752  const double rr = 2*rmax_*tan30deg_;
753  const double waferX = hgpar_->waferPosX_[wafer];
754  const double waferY = hgpar_->waferPosY_[wafer];
755  double xc[6], yc[6];
756  xc[0] = waferX+rmax_; yc[0] = waferY-0.5*rr;
757  xc[1] = waferX+rmax_; yc[1] = waferY+0.5*rr;
758  xc[2] = waferX; yc[2] = waferY+rr;
759  xc[3] = waferX-rmax_; yc[3] = waferY+0.5*rr;
760  xc[4] = waferX+rmax_; yc[4] = waferY-0.5*rr;
761  xc[5] = waferX; yc[5] = waferY-rr;
762  bool cornerOne(false), cornerAll(true);
763  for (int k=0; k<6; ++k) {
764  double rpos = std::sqrt(xc[k]*xc[k]+yc[k]*yc[k]);
765  if ((rpos >= hgpar_->rMinLayHex_[lay]) &&
766  (rpos <= hgpar_->rMaxLayHex_[lay])) cornerOne = true;
767  else cornerAll = false;
768  }
769  bool in(false);
770  if (hgpar_->mode_ == static_cast<int> (HGCalGeometryMode::Hexagon))
771  in = cornerAll;
772  else if (hgpar_->mode_ == static_cast<int> (HGCalGeometryMode::HexagonFull))
773  in = cornerOne;
774  return in;
775 }
776 
778 
bool isHalfCell(int waferType, int cell) const
std::vector< double > waferPosY_
type
Definition: HCALResponse.h:21
std::vector< int > layer_
int i
Definition: DBlmapReader.cc:9
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_
void waferFromPosition(const double x, const double y, int &wafer, int &icell, int &celltyp) const
std::vector< int > moduleLayR_
double cellSizeHex(int type) const
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_
#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_
T x() const
Cartesian x coordinate.
int modules(int lay, bool reco) const
std::pair< int, int > simToReco(int cell, int layer, int mod, bool half) 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::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::pair< double, double > waferPosition(int wafer) const
std::vector< double > rMinLayHex_
std::vector< double > moduleTlS_
HGCalGeometryMode
std::pair< int, int > rowColumnWafer(const int wafer) const
std::vector< double > zLayerHex_
double waferZ(int layer, bool reco) const
#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
HGCalGeometryMode mode_
std::vector< double > cellFineX_
std::pair< int, int > newCell(int cell, int layer, int sector, int subsector, int incrx, int incry, bool half) const
simrecovecs max_modules_layer_
std::vector< double > moduleAlphaS_
std::vector< int > layerGroupO_
std::vector< double > moduleBlS_
if(dp >Float(M_PI)) dp-
double a
Definition: hdecay.h:121
std::vector< int > waferCopy_
std::vector< int > depthIndex_
std::pair< int, int > assignCell(float x, float y, int lay, int subSec, bool reco) const
double k_ScaleFromDDD
tuple cout
Definition: gather_cfg.py:145
size_(0)
Definition: OwnArray.h:181
std::vector< int > waferTypeT_
std::vector< double > cellCoarseY_
HGCalParameters::hgtrap getModule(unsigned int k, bool hexType, bool reco) const
int col
Definition: cuy.py:1008
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_
bool waferInLayer(int wafer, int lay, bool reco) const