CMS 3D CMS Logo

HcalFlexiHardcodeGeometryLoader.cc
Go to the documentation of this file.
9 
10 #include <vector>
11 #include <algorithm>
12 
14 
15 //#define EDM_ML_DEBUG
16 
17 // ==============> Loader Itself <==========================
18 
20 
21  MAX_HCAL_PHI = 72;
22  DEGREE2RAD = M_PI / 180.;
23 }
24 
26  HcalGeometry* hcalGeometry = new HcalGeometry (fTopology);
27  if( 0 == hcalGeometry->cornersMgr() ) hcalGeometry->allocateCorners ( fTopology.ncells()+fTopology.getHFSize() );
28  if( 0 == hcalGeometry->parMgr() ) hcalGeometry->allocatePar (hcalGeometry->numberOfShapes(),
30  isBH_ = hcons.isBH();
31 #ifdef EDM_ML_DEBUG
32  std::cout << "FlexiGeometryLoader initialize with ncells "
33  << fTopology.ncells() << " and shapes "
34  << hcalGeometry->numberOfShapes() << ":"
36  << " with BH Flag " << isBH_ << std::endl;
37 #endif
38  if (fTopology.mode() == HcalTopologyMode::H2) { // TB geometry
39  fillHBHO (hcalGeometry, makeHBCells(hcons), true);
40  fillHBHO (hcalGeometry, makeHOCells(), false);
41  fillHE (hcalGeometry, makeHECells_H2());
42  } else { // regular geometry
43  fillHBHO (hcalGeometry, makeHBCells(hcons), true);
44  fillHBHO (hcalGeometry, makeHOCells(), false);
45  fillHF (hcalGeometry, makeHFCells(hcons));
46  fillHE (hcalGeometry, makeHECells(hcons));
47  }
48  //fast insertion of valid ids requires sort at end
49  hcalGeometry->sortValidIds();
50  return hcalGeometry;
51 }
52 
53 
54 // ----------> HB <-----------
55 std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> HcalFlexiHardcodeGeometryLoader::makeHBCells (const HcalDDDRecConstants& hcons) {
56 
57  std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> result;
58  std::vector<std::pair<double,double> > gconsHB = hcons.getConstHBHE(0);
59  std::vector<HcalDDDRecConstants::HcalEtaBin> etabins = hcons.getEtaBins(0);
60 
61 #ifdef EDM_ML_DEBUG
62  std::cout << "FlexiGeometryLoader called for " << etabins.size()
63  << " Eta Bins" << std::endl;
64  for (unsigned int k=0; k<gconsHB.size(); ++k) {
65  std::cout << "gconsHB[" << k << "] = " << gconsHB[k].first << " +- "
66  << gconsHB[k].second << std::endl;
67  }
68 #endif
69  for (unsigned int i=0; i<etabins.size(); ++i) {
70  int iring = (etabins[i].zside >= 0) ? etabins[i].ieta : -etabins[i].ieta;
71  int depth = etabins[i].depthStart;
72  double dphi = (etabins[i].phis.size() > 1) ?
73  (etabins[i].phis[1].second-etabins[i].phis[0].second) :
74  ((2.0*M_PI)/MAX_HCAL_PHI);
75  for (unsigned int k=0; k<etabins[i].layer.size(); ++k) {
76  int layf = etabins[i].layer[k].first-1;
77  int layl = etabins[i].layer[k].second-1;
78  double rmin = gconsHB[layf].first-gconsHB[layf].second;
79  double rmax = gconsHB[layl].first+gconsHB[layl].second;
80  for (unsigned int j=0; j<etabins[i].phis.size(); ++j) {
81 #ifdef EDM_ML_DEBUG
82  std::cout << "HBRing " << iring << " eta " << etabins[i].etaMin << ":"
83  << etabins[i].etaMax << " depth " << depth << " R " << rmin
84  << ":" << rmax << " Phi " << etabins[i].phis[j].first << ":"
85  << etabins[i].phis[j].second << ":" << dphi << " layer[" << k
86  << "]: " << etabins[i].layer[k].first-1 << ":"
87  << etabins[i].layer[k].second << std::endl;
88 #endif
89  result.push_back (HcalFlexiHardcodeGeometryLoader::HBHOCellParameters(iring, depth, etabins[i].phis[j].first, etabins[i].phis[j].second, dphi, rmin, rmax, etabins[i].etaMin, etabins[i].etaMax));
90  }
91  depth++;
92  }
93  }
94  return result;
95 }
96 
97 
98 // ----------> HO <-----------
99 std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> HcalFlexiHardcodeGeometryLoader::makeHOCells () {
100  const double HORMIN0 = 390.0;
101  const double HORMIN1 = 412.6;
102  const double HORMAX = 413.6;
103  const int nCells = 15;
104  const int nPhi = 72;
105  const double etamin[nCells] = {0.000,0.087,0.174, 0.261, 0.3395,0.435,0.522,
106  0.609,0.696,0.783, 0.873, 0.957, 1.044,1.131,
107  1.218};
108  const double etamax[nCells] = {0.087,0.174,0.261, 0.3075,0.435, 0.522,0.609,
109  0.696,0.783,0.8494,0.957, 1.044, 1.131,1.218,
110  1.305};
111  std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters> result;
112  result.reserve (nCells*nPhi);
113  double dphi = ((2.0*M_PI)/nPhi);
114  for (int i = 0; i < nCells; ++i) {
115  double rmin = ((i < 4) ? HORMIN0 : HORMIN1);
116  for (int iside = -1; iside <= 1; iside += 2) {
117  for (int j=0; j < nPhi; ++j) {
118  double phi = (j+0.5)*dphi;
119  // eta, depth, phi, phi0, deltaPhi, rMin, rMax, etaMin, etaMax
120  result.push_back (HcalFlexiHardcodeGeometryLoader::HBHOCellParameters(iside*(i+1), 4, j+1, phi, dphi, rmin, HORMAX, etamin[i], etamax[i]));
121  }
122  }
123  }
124  return result;
125 }
126 
127 
128 //
129 // Convert constants to appropriate cells
130 //
131 void HcalFlexiHardcodeGeometryLoader::fillHBHO (HcalGeometry* fGeometry, const std::vector<HcalFlexiHardcodeGeometryLoader::HBHOCellParameters>& fCells, bool fHB) {
132 
133  fGeometry->increaseReserve(fCells.size());
134  for (size_t iCell = 0; iCell < fCells.size(); ++iCell) {
135  const HcalFlexiHardcodeGeometryLoader::HBHOCellParameters& param = fCells[iCell];
136  HcalDetId hid (fHB ? HcalBarrel : HcalOuter, param.ieta, param.iphi, param.depth);
137  float phiCenter = param.phi; // middle of the cell
138  float etaCenter = 0.5*(param.etaMin + param.etaMax);
139  float x = param.rMin* cos (phiCenter);
140  float y = param.rMin* sin (phiCenter);
141  float z = (param.ieta < 0) ? -(param.rMin*sinh(etaCenter)) : (param.rMin*sinh(etaCenter));
142  // make cell geometry
143  GlobalPoint refPoint (x,y,z); // center of the cell's face
144  std::vector<CCGFloat> cellParams;
145  cellParams.reserve (5);
146  cellParams.push_back (0.5 * (param.etaMax - param.etaMin)); // deta_half
147  cellParams.push_back (0.5 * param.dphi); // dphi_half
148  cellParams.push_back (0.5 * (param.rMax - param.rMin) * cosh (etaCenter)); // dr_half
149  cellParams.push_back ( fabs( refPoint.eta() ) ) ;
150  cellParams.push_back ( fabs( refPoint.z() ) ) ;
151 #ifdef EDM_ML_DEBUG
152  std::cout << "HcalFlexiHardcodeGeometryLoader::fillHBHO-> " << hid
153  << " " << hid.rawId() << " " << std::hex << hid.rawId()
154  << std::dec << " " << hid << " " << refPoint << '/'
155  << cellParams [0] << '/' << cellParams [1] << '/'
156  << cellParams [2] << std::endl;
157 #endif
158  fGeometry->newCellFast(refPoint, refPoint, refPoint,
159  CaloCellGeometry::getParmPtr(cellParams,
160  fGeometry->parMgr(),
161  fGeometry->parVecVec()),
162  hid ) ;
163  }
164 }
165 
166 
167 // ----------> HE <-----------
168 std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters> HcalFlexiHardcodeGeometryLoader::makeHECells (const HcalDDDRecConstants& hcons) {
169 
170  std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters> result;
171  std::vector<std::pair<double,double> > gconsHE = hcons.getConstHBHE(1);
172 #ifdef EDM_ML_DEBUG
173  std::cout << "HcalFlexiHardcodeGeometryLoader:HE with " << gconsHE.size()
174  << " cells" << std::endl;
175 #endif
176  if (gconsHE.size() > 0) {
177  std::vector<HcalDDDRecConstants::HcalEtaBin> etabins = hcons.getEtaBins(1);
178 
179 #ifdef EDM_ML_DEBUG
180  std::cout << "FlexiGeometryLoader called for HE with " << etabins.size()
181  << " Eta Bins and " << gconsHE.size() << " depths"
182  << std::endl;
183  for (unsigned int i=0; i<gconsHE.size(); ++i)
184  std::cout << " Depth[" << i << "] = " << gconsHE[i].first << " +- "
185  << gconsHE[i].second;
186  std::cout << std::endl;
187 #endif
188  for (unsigned int i=0; i<etabins.size(); ++i) {
189  int iring = (etabins[i].zside >= 0) ? etabins[i].ieta : -etabins[i].ieta;
190  int depth = etabins[i].depthStart;
191  double dphi = (etabins[i].phis.size() > 1) ?
192  (etabins[i].phis[1].second-etabins[i].phis[0].second) :
193  ((2.0*M_PI)/MAX_HCAL_PHI);
194 #ifdef EDM_ML_DEBUG
195  std::cout << "FlexiGeometryLoader::Ring " << iring << " nphi " << nphi
196  << " dstart " << depth << " dphi " << dphi << " units "
197  << units << " fioff " << fioff << " layers "
198  << etabins[i].layer.size() << std::endl;
199 #endif
200  for (unsigned int k=0; k<etabins[i].layer.size(); ++k) {
201  int layf = etabins[i].layer[k].first-1;
202  int layl = etabins[i].layer[k].second-1;
203  double zmin = gconsHE[layf].first-gconsHE[layf].second;
204  double zmax = gconsHE[layl].first+gconsHE[layl].second;
205  if (zmin < 1.0) {
206  for (int k2=layf; k2<=layl; ++k2) {
207  if (gconsHE[k2].first > 10) {
208  zmin = gconsHE[k2].first-gconsHE[k2].second;
209  break;
210  }
211  }
212  }
213  if (zmin >= zmax) zmax = zmin+10.;
214  for (unsigned int j=0; j<etabins[i].phis.size(); ++j) {
215 #ifdef EDM_ML_DEBUG
216  std::cout << "HERing " << iring << " eta " << etabins[i].etaMin << ":"
217  << etabins[i].etaMax << " depth " << depth << " Z " << zmin
218  << ":" << zmax << " Phi :" << etabins[i].phis[j].first
219  << ":" << etabins[i].phis[j].second << ":" << dphi
220  << " layer[" << k << "]: " << etabins[i].layer[k].first-1
221  << ":" << etabins[i].layer[k].second-1 << std::endl;
222 #endif
223  result.push_back(HcalFlexiHardcodeGeometryLoader::HECellParameters(iring, depth, etabins[i].phis[j].first, etabins[i].phis[j].second, dphi, zmin, zmax, etabins[i].etaMin, etabins[i].etaMax));
224  }
225  depth++;
226  }
227  }
228  }
229  return result;
230 }
231 
232 
233 // ----------> HE @ H2 <-----------
234 std::vector <HcalFlexiHardcodeGeometryLoader::HECellParameters> HcalFlexiHardcodeGeometryLoader::makeHECells_H2 () {
235 
236  const double HEZMIN_H2 = 400.715;
237  const double HEZMID_H2 = 436.285;
238  const double HEZMAX_H2 = 541.885;
239  const int nEtas = 10;
240  const int nDepth[nEtas] = {1,2,2,2,2,2,2,2,3,3};
241  const int dStart[nEtas] = {3,1,1,1,1,1,1,1,1,1};
242  const int nPhis[nEtas] = {8,8,8,8,8,8,4,4,4,4};
243  const double etas[nEtas+1] = {1.305,1.373,1.444,1.521,1.603,1.693,1.790,
244  1.880,1.980,2.090,2.210};
245  const double zval[4*nEtas] = {409.885,462.685,0.,0.,
246  HEZMIN_H2,427.485,506.685,0.0,
247  HEZMIN_H2,HEZMID_H2,524.285,0.,
248  HEZMIN_H2,HEZMID_H2,HEZMAX_H2,0.,
249  HEZMIN_H2,HEZMID_H2,HEZMAX_H2,0.,
250  HEZMIN_H2,HEZMID_H2,HEZMAX_H2,0.,
251  HEZMIN_H2,HEZMID_H2,HEZMAX_H2,0.,
252  HEZMIN_H2,HEZMID_H2,HEZMAX_H2,0.,
253  HEZMIN_H2,418.685,HEZMID_H2,HEZMAX_H2,
254  HEZMIN_H2,418.685,HEZMID_H2,HEZMAX_H2};
255  std::vector<HcalFlexiHardcodeGeometryLoader::HECellParameters> result;
256 
257  for (int i = 0; i < nEtas; ++i) {
258  int ieta = 16+i;
259  for (int k=0; k<nDepth[i]; ++k) {
260  int depth = dStart[i]+k;
261  for (int j=0; j < nPhis[i]; ++j) {
262  int iphi = (nPhis[i] == 8) ? (j+1) : (2*j+1);
263  double dphi = (40.0*DEGREE2RAD)/nPhis[i];
264  double phi0 = (j+0.5)*dphi;
265  // ieta, depth, iphi, phi0, deltaPhi, zMin, zMax, etaMin, etaMax
266  result.push_back (HcalFlexiHardcodeGeometryLoader::HECellParameters(ieta, depth, iphi, phi0, dphi, zval[4*i+k+1], zval[4*i+k+2], etas[i], etas[i+1]));
267  }
268  }
269  }
270  return result;
271 }
272 
273 // ----------> HF <-----------
274 std::vector <HcalFlexiHardcodeGeometryLoader::HFCellParameters> HcalFlexiHardcodeGeometryLoader::makeHFCells (const HcalDDDRecConstants& hcons) {
275 
276  const float HFZMIN1 = 1115.;
277  const float HFZMIN2 = 1137.;
278  const float HFZMAX = 1280.1;
279  std::vector<HcalDDDRecConstants::HFCellParameters> cells = hcons.getHFCellParameters();
280  unsigned int nCells = cells.size();
281  std::vector <HcalFlexiHardcodeGeometryLoader::HFCellParameters> result;
282  result.reserve (nCells);
283  for (unsigned int i = 0; i < nCells; ++i) {
284  HcalFlexiHardcodeGeometryLoader::HFCellParameters cell1(cells[i].ieta,cells[i].depth,cells[i].firstPhi,cells[i].stepPhi,cells[i].nPhi,5*cells[i].stepPhi,HFZMIN1,HFZMAX,cells[i].rMin,cells[i].rMax);
285  result.push_back (cell1);
286  HcalFlexiHardcodeGeometryLoader::HFCellParameters cell2(cells[i].ieta,1+cells[i].depth,cells[i].firstPhi,cells[i].stepPhi,cells[i].nPhi,5*cells[i].stepPhi,HFZMIN2,HFZMAX,cells[i].rMin,cells[i].rMax);
287  result.push_back (cell2);
288  }
289  return result;
290 }
291 
292 void HcalFlexiHardcodeGeometryLoader::fillHE (HcalGeometry* fGeometry, const std::vector <HcalFlexiHardcodeGeometryLoader::HECellParameters>& fCells) {
293 
294  fGeometry->increaseReserve(fCells.size());
295  for (size_t iCell = 0; iCell < fCells.size(); ++iCell) {
296  const HcalFlexiHardcodeGeometryLoader::HECellParameters& param = fCells[iCell];
297  HcalDetId hid (HcalEndcap, param.ieta, param.iphi, param.depth);
298  float phiCenter = param.phi; // middle of the cell
299  float etaCenter = 0.5 * (param.etaMin + param.etaMax);
300  int iside = (param.ieta >= 0) ? 1 : -1;
301  float perp = param.zMin / sinh (etaCenter);
302  float x = perp * cos (phiCenter);
303  float y = perp * sin (phiCenter);
304  float z = (isBH_) ? (iside*0.5*(param.zMin+param.zMax)) : (iside*param.zMin);
305  // make cell geometry
306  GlobalPoint refPoint (x,y,z); // center of the cell's face
307  std::vector<CCGFloat> cellParams;
308  cellParams.reserve (5);
309  cellParams.push_back (0.5 * (param.etaMax - param.etaMin)); //deta_half
310  cellParams.push_back (0.5 * param.dphi); // dphi_half
311  cellParams.push_back (-0.5 * (param.zMax - param.zMin) / tanh (etaCenter)); // dz_half, "-" means edges in Z
312  cellParams.push_back ( fabs( refPoint.eta() ) ) ;
313  cellParams.push_back ( fabs( refPoint.z() ) ) ;
314 #ifdef EDM_ML_DEBUG
315  std::cout << "HcalFlexiHardcodeGeometryLoader::fillHE-> " << hid << " "
316  << hid.rawId() << " " << std::hex << hid.rawId() << std::dec
317  << " " << hid << refPoint << '/' << cellParams [0] << '/'
318  << cellParams [1] << '/' << cellParams [2] << std::endl;
319 #endif
320  fGeometry->newCellFast(refPoint, refPoint, refPoint,
321  CaloCellGeometry::getParmPtr(cellParams,
322  fGeometry->parMgr(),
323  fGeometry->parVecVec()),
324  hid ) ;
325  }
326 }
327 
328 void HcalFlexiHardcodeGeometryLoader::fillHF (HcalGeometry* fGeometry, const std::vector <HcalFlexiHardcodeGeometryLoader::HFCellParameters>& fCells) {
329 
330  fGeometry->increaseReserve(fCells.size());
331  for (size_t iCell = 0; iCell < fCells.size(); ++iCell) {
332  const HcalFlexiHardcodeGeometryLoader::HFCellParameters& param = fCells[iCell];
333  for (int kPhi = 0; kPhi < param.nPhi; ++kPhi) {
334  int iPhi = param.phiFirst + kPhi*param.phiStep;
335  HcalDetId hid (HcalForward, param.eta, iPhi, param.depth);
336  // middle of the cell
337  float phiCenter = ((iPhi-1)*360./MAX_HCAL_PHI + 0.5*param.dphi) * DEGREE2RAD;
338  GlobalPoint inner (param.rMin, 0, param.zMin);
339  GlobalPoint outer (param.rMax, 0, param.zMin);
340  float iEta = inner.eta();
341  float oEta = outer.eta();
342  float etaCenter = 0.5 * ( iEta + oEta );
343 
344  float perp = param.zMin / sinh (etaCenter);
345  float x = perp * cos (phiCenter);
346  float y = perp * sin (phiCenter);
347  float z = (param.eta > 0) ? param.zMin : -param.zMin;
348  // make cell geometry
349  GlobalPoint refPoint (x,y,z); // center of the cell's face
350  std::vector<CCGFloat> cellParams;
351  cellParams.reserve (5);
352  cellParams.push_back (0.5 * ( iEta - oEta )); // deta_half
353  cellParams.push_back (0.5 * param.dphi * DEGREE2RAD); // dphi_half
354  cellParams.push_back (0.5 * (param.zMax - param.zMin)); // dz_half
355  cellParams.push_back ( fabs( refPoint.eta()));
356  cellParams.push_back ( fabs( refPoint.z() ) ) ;
357 #ifdef EDM_ML_DEBUG
358  std::cout << "HcalFlexiHardcodeGeometryLoader::fillHF-> " << hid << " "
359  << hid.rawId() << " " << std::hex << hid.rawId() << std::dec
360  << " " << hid << " " << refPoint << '/' << cellParams [0]
361  << '/' << cellParams [1] << '/' << cellParams [2] << std::endl;
362 #endif
363  fGeometry->newCellFast(refPoint, refPoint, refPoint,
364  CaloCellGeometry::getParmPtr(cellParams,
365  fGeometry->parMgr(),
366  fGeometry->parVecVec()),
367  hid ) ;
368  }
369  }
370 }
CaloCellGeometry::CCGFloat CCGFloat
unsigned int getHFSize() const
Definition: HcalTopology.h:135
std::vector< HFCellParameters > makeHFCells(const HcalDDDRecConstants &hcons)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::vector< HECellParameters > makeHECells_H2()
HcalFlexiHardcodeGeometryLoader(const edm::ParameterSet &)
void allocatePar(ParVec::size_type n, unsigned int m)
std::vector< HBHOCellParameters > makeHBCells(const HcalDDDRecConstants &hcons)
HcalTopologyMode::Mode mode() const
Definition: HcalTopology.h:31
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
U second(std::pair< T, U > const &p)
std::vector< std::pair< double, double > > getConstHBHE(const int type) const
void newCellFast(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
std::vector< HBHOCellParameters > makeHOCells()
void sortValidIds()
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
std::vector< HFCellParameters > getHFCellParameters() const
void fillHE(HcalGeometry *fGeometry, const std::vector< HECellParameters > &fCells)
static const CCGFloat * getParmPtr(const std::vector< CCGFloat > &vd, ParMgr *mgr, ParVecVec &pvv)
std::vector< HECellParameters > makeHECells(const HcalDDDRecConstants &hcons)
#define M_PI
int k[5][pyjets_maxn]
CaloCellGeometry::CornersMgr * cornersMgr()
void increaseReserve(unsigned int extra)
T eta() const
Definition: PV3DBase.h:76
virtual unsigned int numberOfShapes() const
Definition: HcalGeometry.h:43
TString units(TString variable, Char_t axis)
T perp() const
Magnitude of transverse component.
void fillHBHO(HcalGeometry *fGeometry, const std::vector< HBHOCellParameters > &fCells, bool fHB)
CaloSubdetectorGeometry * load(const HcalTopology &fTopology, const HcalDDDRecConstants &hcons)
void allocateCorners(CaloCellGeometry::CornersVec::size_type n)
void fillHF(HcalGeometry *fGeometry, const std::vector< HFCellParameters > &fCells)
virtual unsigned int ncells() const
return a count of valid cells (for dense indexing use)
std::vector< HcalEtaBin > getEtaBins(const int itype) const