CMS 3D CMS Logo

HGCalGeometryLoader.cc
Go to the documentation of this file.
9 
10 //#define EDM_ML_DEBUG
11 
13 typedef std::vector<float> ParmVec;
14 
17 
19 
20  // allocate geometry
21  HGCalGeometry* geom = new HGCalGeometry (topology);
22  unsigned int numberOfCells = topology.totalGeomModules(); // both sides
23  unsigned int numberExpected= topology.allGeomModules();
24 #ifdef EDM_ML_DEBUG
25  std::cout << "Number of Cells " << numberOfCells << ":" << numberExpected
26  << " for sub-detector " << topology.subDetector()
27  << " Shape parameters " << HGCalGeometry::k_NumberOfShapes << ":"
29 #endif
30  geom->allocateCorners( numberOfCells ) ;
33  ForwardSubdetector subdet = topology.subDetector();
34  bool detType = topology.detectorType();
35 
36  // loop over modules
38  unsigned int counter(0);
39 #ifdef EDM_ML_DEBUG
40  std::cout << "HGCalGeometryLoader with # of transformation matrices "
41  << topology.dddConstants().getTrFormN() << " and "
42  << topology.dddConstants().volumes() << ":"
43  << topology.dddConstants().sectors() << " volumes" << std::endl;
44 #endif
45  for (unsigned itr=0; itr<topology.dddConstants().getTrFormN(); ++itr) {
46  HGCalParameters::hgtrform mytr = topology.dddConstants().getTrForm(itr);
47  int zside = mytr.zp;
48  int layer = mytr.lay;
49 #ifdef EDM_ML_DEBUG
50  unsigned int kount(0);
51  std::cout << "HGCalGeometryLoader:: Z:Layer " << zside << ":" << layer
52  << std::endl;
53 #endif
54  if (topology.geomMode() == HGCalGeometryMode::Square) {
55  int sector = mytr.sec;
56  int subSec = (detType ? mytr.subsec : 0);
57  const HepGeom::Transform3D ht3d (mytr.hr, mytr.h3v);
58  DetId detId= ((subdet == HGCEE) ?
59  (DetId)(HGCEEDetId(subdet,zside,layer,sector,subSec,0)) :
60  (DetId)(HGCHEDetId(subdet,zside,layer,sector,subSec,0)));
61 #ifdef EDM_ML_DEBUG
62  std::cout << "HGCalGeometryLoader:: Sector:Subsector " << sector << ":"
63  << subSec << " transf " << ht3d.getTranslation() << " and "
64  << ht3d.getRotation();
65 #endif
66  for (unsigned int k=0; k<topology.dddConstants().volumes(); ++k) {
67  HGCalParameters::hgtrap vol = topology.dddConstants().getModule(k,false,true);
68  if (vol.lay == layer) {
69  double alpha = ((detType && subSec == 0) ? -fabs(vol.alpha) :
70  fabs(vol.alpha));
71  params[0] = vol.dz;
72  params[1] = params[2] = 0;
73  params[3] = params[7] = vol.h;
74  params[4] = params[8] = vol.bl;
75  params[5] = params[9] = vol.tl;
76  params[6] = params[10]= alpha;
77  params[11]= vol.cellSize;
78  buildGeom(params, ht3d, detId, geom);
79  counter++;
80 #ifdef EDM_ML_DEBUG
81  ++kount;
82 #endif
83  break;
84  }
85  }
86  } else {
87  for (int wafer=0; wafer<topology.dddConstants().sectors(); ++wafer) {
88  if (topology.dddConstants().waferInLayer(wafer,layer,true)) {
89  int type = topology.dddConstants().waferTypeT(wafer);
90  if (type != 1) type = 0;
91  DetId detId = (DetId)(HGCalDetId(subdet,zside,layer,type,wafer,0));
92  std::pair<double,double> w = topology.dddConstants().waferPosition(wafer);
93  double xx = (zside > 0) ? w.first : -w.first;
94  CLHEP::Hep3Vector h3v(xx,w.second,mytr.h3v.z());
95  const HepGeom::Transform3D ht3d (mytr.hr, h3v);
96 #ifdef EDM_ML_DEBUG
97  std::cout << "HGCalGeometryLoader:: Wafer:Type " << wafer << ":"
98  << type << " DetId " << HGCalDetId(detId) << std::hex
99  << " " << detId.rawId() << std::dec << " transf "
100  << ht3d.getTranslation() << " and " << ht3d.getRotation();
101 #endif
102  HGCalParameters::hgtrap vol = topology.dddConstants().getModule(wafer,true,true);
103  params[0] = vol.dz;
104  params[1] = params[2] = 0;
105  params[3] = params[7] = vol.h;
106  params[4] = params[8] = vol.bl;
107  params[5] = params[9] = vol.tl;
108  params[6] = params[10]= 0;
109  params[11]= topology.dddConstants().cellSizeHex(type);
110 
111  buildGeom(params, ht3d, detId, geom);
112  counter++;
113 #ifdef EDM_ML_DEBUG
114  ++kount;
115 #endif
116  }
117  }
118  }
119 #ifdef EDM_ML_DEBUG
120  std::cout << kount << " modules found in Layer " << layer << " Z "
121  << zside << std::endl;
122 #endif
123  }
124 
125  geom->sortDetIds();
126 
127  if (counter != numberExpected) {
128  std::cerr << "Inconsistent # of cells: expected " << numberExpected << ":"
129  << numberOfCells << " , inited " << counter << std::endl;
130  assert( counter == numberOfCells ) ;
131  }
132 
133  return geom;
134 }
135 
137  const HepGeom::Transform3D& ht3d,
138  const DetId& detId, HGCalGeometry* geom) {
139 
140 #ifdef EDM_ML_DEBUG
141  std::cout << "Volume Parameters";
142  for (unsigned int i=0; i<12; ++i) std::cout << " : " << params[i];
143  std::cout << std::endl;
144 #endif
145  std::vector<GlobalPoint> corners (8);
146 
147  FlatTrd::createCorners( params, ht3d, corners ) ;
148 
149  const CCGFloat* parmPtr (CaloCellGeometry::getParmPtr(params,
150  geom->parMgr(),
151  geom->parVecVec() ) ) ;
152 
153  GlobalPoint front ( 0.25*( corners[0].x() +
154  corners[1].x() +
155  corners[2].x() +
156  corners[3].x() ),
157  0.25*( corners[0].y() +
158  corners[1].y() +
159  corners[2].y() +
160  corners[3].y() ),
161  0.25*( corners[0].z() +
162  corners[1].z() +
163  corners[2].z() +
164  corners[3].z() ) ) ;
165 
166  GlobalPoint back ( 0.25*( corners[4].x() +
167  corners[5].x() +
168  corners[6].x() +
169  corners[7].x() ),
170  0.25*( corners[4].y() +
171  corners[5].y() +
172  corners[6].y() +
173  corners[7].y() ),
174  0.25*( corners[4].z() +
175  corners[5].z() +
176  corners[6].z() +
177  corners[7].z() ) ) ;
178 
179  if (front.mag2() > back.mag2()) { // front should always point to the center, so swap front and back
180  std::swap (front, back);
181  std::swap_ranges (corners.begin(), corners.begin()+4, corners.begin()+4);
182  }
183 
184  geom->newCell(front, back, corners[0], parmPtr, detId) ;
185 }
HGCalGeometryMode::GeometryMode geomMode() const
Geometry mode.
Definition: HGCalTopology.h:88
type
Definition: HCALResponse.h:21
float alpha
Definition: AMPTWrapper.h:95
T mag2() const
Definition: PV3DBase.h:66
unsigned int allGeomModules() const
const double w
Definition: UKUtility.cc:23
CaloTopology const * topology(0)
double cellSizeHex(int type) const
HGCalParameters::hgtrform getTrForm(unsigned int k) const
HGCalGeometry * build(const HGCalTopology &)
void newCell(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId) override
bool detectorType() const
ForwardSubdetector
void allocatePar(ParVec::size_type n, unsigned int m)
CaloCellGeometry::CCGFloat CCGFloat
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
unsigned int totalGeomModules() const
unsigned int getTrFormN() const
std::pair< double, double > waferPosition(int wafer, bool reco=true) const
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
static const CCGFloat * getParmPtr(const std::vector< CCGFloat > &vd, ParMgr *mgr, ParVecVec &pvv)
int sectors() const
void buildGeom(const ParmVec &, const HepGeom::Transform3D &, const DetId &, HGCalGeometry *)
int k[5][pyjets_maxn]
Definition: DetId.h:18
const HGCalDDDConstants & dddConstants() const
ForwardSubdetector subDetector() const
static void createCorners(const std::vector< CCGFloat > &pv, const Tr3D &tr, std::vector< GlobalPoint > &co)
Definition: FlatTrd.cc:139
static std::atomic< unsigned int > counter
void allocateCorners(CaloCellGeometry::CornersVec::size_type n)
std::vector< float > ParmVec
std::vector< float > ParmVec
CaloCellGeometry::CCGFloat CCGFloat
HGCalParameters::hgtrap getModule(unsigned int k, bool hexType, bool reco) const
CLHEP::HepRotation hr
int waferTypeT(int wafer) const
bool waferInLayer(int wafer, int lay, bool reco) const
unsigned int volumes() const