CMS 3D CMS Logo

EcalPreshowerGeometry.cc
Go to the documentation of this file.
7 #include <iostream>
8 
12 typedef HepGeom::Plane3D<CCGFloat> Pl3D;
13 
14 //#define EDM_ML_DEBUG
15 
17  : m_xWidWaf(6.3),
18  m_xInterLadGap(0.05), // additional gap between wafers in adj ladders
19  m_xIntraLadGap(0.04), // gap between wafers in same ladder
20  m_yWidAct(6.1),
21  m_yCtrOff(0.05), // gap at center
22  m_cellVec(k_NumberOfCellsForCorners) {
23  m_zplane[0] = 0.;
24  m_zplane[1] = 0.;
25  m_zplane[2] = 0.;
26  m_zplane[3] = 0.;
27 #ifdef EDM_ML_DEBUG
28  edm::LogVerbatim("EcalGeom") << "EcalPreshowerGeometry::Creating an instance";
29 #endif
30 }
31 
33 
35  const CaloGenericDetId gid(id);
36 
37  assert(gid.isES());
38 
39  // plane 2 is split into 2 dees along x=0 for both signs of z
40 
41  // plane 1 at zsign=-1 is split into 2 dees between six=19 and six=20 for siy<=20,
42  // and six=21 and 22 for siy>=21
43 
44  // plane 1 at zsign=+1 is split into 2 dees between six=20 and six=21 for siy<=20,
45  // and six=19 and 20 for siy>=21
46 
47  // Desired numbering
48  // LEFT RIGHT (as one faces the Dee from the IP)
49  // ES- pl=2 0 1
50  // pl=1 2 3 the reversal of pl=2 and pl=1 is intentional here (CM Kuo)
51  // ES+ pl=1 4 5
52  // pl=2 6 7
53 
54  const ESDetId esid(id);
55  const int jx(esid.six() - 1);
56  const int jy(esid.siy() - 1);
57  const int jz(esid.zside() + 1);
58  const int pl(esid.plane() - 1);
59  const bool second(1 == pl);
60  const bool top(19 < jy);
61  const bool negz(0 == jz);
62  const int lrl(19 > jx ? 0 : 1);
63  const int lrr(21 > jx ? 0 : 1);
64 
65  return (second ? jx / 20 + 3 * jz : // 2nd plane split along middle
66  (negz && !top ? lrl + 2 : // 1st plane at neg z and bottom half split at six=19&20
67  (negz && top ? lrr + 2 : // 1st plane at neg z and top half split at six=21&22
68  (!negz && !top ? lrr + 4 : lrl + 4)))); // opposite at positive z
69 }
70 
72  return ESDetId(1, 10 + 20 * (iLoc % 2), 10, 2 > iLoc || 5 < iLoc ? 2 : 1, 2 * (iLoc / 4) - 1);
73 }
74 
76  return (unsigned int)DetId::Ecal - 1;
77 }
78 
80  unsigned int n1minus(0);
81  unsigned int n2minus(0);
82  unsigned int n1plus(0);
83  unsigned int n2plus(0);
84  CCGFloat z1minus(0);
85  CCGFloat z2minus(0);
86  CCGFloat z1plus(0);
87  CCGFloat z2plus(0);
88  const std::vector<DetId>& esDetIds(getValidDetIds());
89 #ifdef EDM_ML_DEBUG
90  edm::LogVerbatim("EcalGeom") << "EcalPreshowerGeometry:: Get " << esDetIds.size() << " valid DetIds";
91 #endif
92 
93  for (unsigned int i(0); i != esDetIds.size(); ++i) {
94  const ESDetId esid(esDetIds[i]);
95  auto cell = getGeometry(esid);
96  if (nullptr != cell) {
97  const CCGFloat zz(cell->getPosition().z());
98  if (1 == esid.plane()) {
99  if (0 > esid.zside()) {
100  z1minus += zz;
101  ++n1minus;
102  } else {
103  z1plus += zz;
104  ++n1plus;
105  }
106  }
107  if (2 == esid.plane()) {
108  if (0 > esid.zside()) {
109  z2minus += zz;
110  ++n2minus;
111  } else {
112  z2plus += zz;
113  ++n2plus;
114  }
115  }
116  }
117  }
118  assert(0 != n1minus && 0 != n2minus && 0 != n1plus && 0 != n2plus);
119  z1minus /= (1. * n1minus);
120  z2minus /= (1. * n2minus);
121  z1plus /= (1. * n1plus);
122  z2plus /= (1. * n2plus);
123  assert(0 != z1minus && 0 != z2minus && 0 != z1plus && 0 != z2plus);
124  setzPlanes(z1minus, z2minus, z1plus, z2plus);
125 }
126 
127 void EcalPreshowerGeometry::setzPlanes(CCGFloat z1minus, CCGFloat z2minus, CCGFloat z1plus, CCGFloat z2plus) {
128  assert(0 > z1minus && 0 > z2minus && 0 < z1plus && 0 < z2plus);
129 
130  m_zplane[0] = z1minus;
131  m_zplane[1] = z2minus;
132  m_zplane[2] = z1plus;
133  m_zplane[3] = z2plus;
134 }
135 
136 // Get closest cell, etc...
138 
140  const CCGFloat x(point.x());
141  const CCGFloat y(point.y());
142  const CCGFloat z(point.z());
143 
144  if (0 == z || 1 > plane || 2 < plane)
145  return DetId(0);
146 
147  const unsigned int iz((0 > z ? 0 : 2) + plane - 1);
148 
149  const CCGFloat ze(m_zplane[iz]);
150  const CCGFloat xe(x * ze / z);
151  const CCGFloat ye(y * ze / z);
152 
153  const CCGFloat x0(1 == plane ? xe : ye);
154  const CCGFloat y0(1 == plane ? ye : xe);
155 
156  static const CCGFloat xWid(m_xWidWaf + m_xIntraLadGap + m_xInterLadGap);
157 
158  const int row(1 + int(y0 + 20. * m_yWidAct - m_yCtrOff) / m_yWidAct);
159  const int col(1 + int((x0 + 20. * xWid) / xWid));
160 
161  CCGFloat closest(1e9);
162 
163  DetId detId(0);
164 
165  const int jz(0 > ze ? -1 : 1);
166 
167 #ifdef EDM_ML_DEBUG
168  edm::LogVerbatim("EcalGeom") << "** p=" << point << ", (" << xe << ", " << ye << ", " << ze << "), row=" << row
169  << ", col=" << col;
170 #endif
171  for (int ix(-1); ix != 2; ++ix) // search within +-1 in row and col
172  {
173  for (int iy(-1); iy != 2; ++iy) {
174  for (int jstrip(ESDetId::ISTRIP_MIN); jstrip <= ESDetId::ISTRIP_MAX; ++jstrip) {
175  const int jx(1 == plane ? col + ix : row + iy);
176  const int jy(1 == plane ? row + iy : col + ix);
177  if (ESDetId::validDetId(jstrip, jx, jy, plane, jz)) {
178  const ESDetId esId(jstrip, jx, jy, plane, jz);
179  auto cell = getGeometry(esId);
180  if (nullptr != cell) {
181  const GlobalPoint& p(cell->getPosition());
182  const CCGFloat dist2((p.x() - xe) * (p.x() - xe) + (p.y() - ye) * (p.y() - ye));
183  if (dist2 < closest && present(esId)) {
184  closest = dist2;
185  detId = esId;
186  }
187  }
188  }
189  }
190  }
191  }
192  return detId;
193 }
194 
195 void EcalPreshowerGeometry::localCorners(Pt3DVec& lc, const CCGFloat* pv, unsigned int /*i*/, Pt3D& ref) {
197 }
198 
200  const GlobalPoint& /*f2*/,
201  const GlobalPoint& /*f3*/,
202  const CCGFloat* parm,
203  const DetId& detId) {
204  const unsigned int cellIndex(ESDetId(detId).denseIndex());
205  m_cellVec[cellIndex] = PreshowerStrip(f1, cornersMgr(), parm);
206  addValidID(detId);
207 #ifdef EDM_ML_DEBUG
208  edm::LogVerbatim("EcalGeom") << "EcalPreshowerGeometry::Add a new DetId " << ESDetId(detId);
209 #endif
210 }
211 
213  return CaloCellGeometryPtr(m_cellVec.size() <= index || nullptr == m_cellVec[index].param() ? nullptr
214  : &m_cellVec[index]);
215 }
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
DetId getClosestCell(const GlobalPoint &r) const override
Log< level::Info, true > LogVerbatim
virtual CellMayOwnPtr getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
CaloCellGeometry::Pt3DVec Pt3DVec
CaloCellGeometry::Pt3D Pt3D
CaloCellGeometry::Pt3D Pt3D
int closest(std::vector< int > const &vec, int value)
void setzPlanes(CCGFloat z1minus, CCGFloat z2minus, CCGFloat z1plus, CCGFloat z2plus)
int zside() const
Definition: ESDetId.h:39
CaloCellGeometry::CCGFloat CCGFloat
std::vector< Pt3D > Pt3DVec
static const int ISTRIP_MAX
Definition: ESDetId.h:69
assert(be >=bs)
CaloCellGeometry::CCGFloat CCGFloat
A base class to handle the shape of preshower strips.
U second(std::pair< T, U > const &p)
int plane() const
Definition: ESDetId.h:41
static DetId detIdFromLocalAlignmentIndex(unsigned int iLoc)
bool isES() const
virtual const std::vector< DetId > & getValidDetIds(DetId::Detector det=DetId::Detector(0), int subdet=0) const
Get a list of valid detector ids (for the given subdetector)
bool present(const DetId &id) const override
is this detid present in the geometry?
static unsigned int alignmentTransformIndexLocal(const DetId &id)
HepGeom::Plane3D< CCGFloat > Pl3D
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ix(uint32_t id)
CaloCellGeometryPtr getGeometryRawPtr(uint32_t index) const override
Definition: DetId.h:17
void addValidID(const DetId &id)
CaloCellGeometry::CornersMgr * cornersMgr()
static bool validDetId(int istrip, int ixs, int iys, int iplane, int iz)
check if a valid index combination
Definition: ESDetId.cc:15
HepGeom::Point3D< CCGFloat > Pt3D
void newCell(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId) override
static void localCorners(Pt3DVec &lc, const CCGFloat *pv, unsigned int i, Pt3D &ref)
~EcalPreshowerGeometry() override
The EcalPreshowerGeometry will delete all its cell geometries at destruction time.
col
Definition: cuy.py:1009
virtual DetId getClosestCellInPlane(const GlobalPoint &r, int plane) const
CaloCellGeometry::Pt3DVec Pt3DVec
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iy(uint32_t id)
static unsigned int alignmentTransformIndexGlobal(const DetId &id)
static const int ISTRIP_MIN
Definition: ESDetId.h:68
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5