CMS 3D CMS Logo

CaloCellGeometry.cc
Go to the documentation of this file.
2 #include <CLHEP/Geometry/Plane3D.h>
3 
8 
9 typedef HepGeom::Vector3D<CCGFloat> FVec3D;
10 typedef HepGeom::Plane3D<CCGFloat> Plane3D;
11 
12 typedef HepGeom::Vector3D<double> DVec3D;
13 typedef HepGeom::Plane3D<double> DPlane3D;
14 typedef HepGeom::Point3D<double> DPt3D;
15 typedef std::vector<DPt3D> DPt3DVec;
16 
18 
20  : m_refPoint(0., 0., 0.), m_corners(), m_parms((CCGFloat*)nullptr), m_dEta(0), m_dPhi(0) {}
21 
23 
24 CaloCellGeometry::CaloCellGeometry(CornersVec::const_reference gp, CornersMgr* mgr, const CCGFloat* par)
25  : m_refPoint(gp), m_corners(mgr), m_parms(par), m_rep(gp.perp(), gp.eta(), gp.barePhi()), m_dEta(0), m_dPhi(0) {}
26 
28  : m_refPoint(0.25 * (cv[0].x() + cv[1].x() + cv[2].x() + cv[3].x()),
29  0.25 * (cv[0].y() + cv[1].y() + cv[2].y() + cv[3].y()),
30  0.25 * (cv[0].z() + cv[1].z() + cv[2].z() + cv[3].z())),
31  m_corners(cv),
32  m_parms(par),
33  m_rep(m_refPoint.perp(), m_refPoint.eta(), m_refPoint.barePhi()),
34  m_dEta(0),
35  m_dPhi(0) {}
36 
37 std::ostream& operator<<(std::ostream& s, const CaloCellGeometry& cell) {
38  s << ", Center: " << cell.getPosition() << std::endl;
39 
40  if (cell.emptyCorners()) {
41  s << "Corners vector is empty." << std::endl;
42  } else {
43  const CaloCellGeometry::CornersVec& corners(cell.getCorners());
44  for (unsigned int i(0); i != corners.size(); ++i) {
45  s << "Corner: " << corners[i] << std::endl;
46  }
47  }
48  return s;
49 }
50 
53  const Pt3D gFront(p.x(), p.y(), p.z());
54  const DPt3D dgFront(p.x(), p.y(), p.z());
55 
56  Pt3D lFront;
57  assert(nullptr != param());
58  Pt3DVec lc(8, Pt3D(0, 0, 0));
59  vocalCorners(lc, param(), lFront);
60 
61  DPt3D dlFront(lFront.x(), lFront.y(), lFront.z());
62 
63  const Pt3D lBack(0.25 * (lc[4] + lc[5] + lc[6] + lc[7]));
64  const DPt3D dlBack(lBack.x(), lBack.y(), lBack.z());
65 
66  const Pt3D dlOne(lc[0].x(), lc[0].y(), lc[0].z());
67 
68  const CornersVec& cor(getCorners());
69  DPt3DVec dkor(8, DPt3D(0, 0, 0));
70  for (unsigned int i(0); i != 8; ++i) {
71  dkor[i] = DPt3D(cor[i].x(), cor[i].y(), cor[i].z());
72  }
73 
74  DPt3D dgBack(0.25 * (dkor[4] + dkor[5] + dkor[6] + dkor[7]));
75 
76  const DVec3D dgAxis((dgBack - dgFront).unit());
77 
78  dgBack = (dgFront + (dlBack - dlFront).mag() * dgAxis);
79  const DPt3D dgOneT(dgFront + (dlOne - dlFront).mag() * (dkor[0] - dgFront).unit());
80 
81  const double dlangle((dlBack - dlFront).angle(dlOne - dlFront));
82  const double dgangle((dgBack - dgFront).angle(dgOneT - dgFront));
83  const double ddangle(dlangle - dgangle);
84 
85  const DPlane3D dgPl(dgFront, dgOneT, dgBack);
86  const DPt3D dp2(dgFront + dgPl.normal().unit());
87 
88  const DPt3D dgOne(dgFront + HepGeom::Rotate3D(-ddangle, dgFront, dp2) * DVec3D(dgOneT - dgFront));
89 
90  tr = Tr3D(dlFront, dlBack, dlOne, dgFront, dgBack, dgOne);
91 
92  if (nullptr != lptr)
93  (*lptr) = lc;
94 }
95 
96 const float* CaloCellGeometry::checkParmPtr(const std::vector<float>& vv, CaloCellGeometry::ParVecVec& pvv) {
97  const float* pP(nullptr);
98 
99  for (unsigned int ii(0); ii != pvv.size(); ++ii) {
100  const ParVec& v(pvv[ii]);
101  assert(v.size() == vv.size());
102 
103  bool same(true);
104  for (unsigned int j(0); j != vv.size(); ++j) {
105  same = same && (fabs(vv[j] - v[j]) < 1.e-6);
106  if (!same)
107  break;
108  }
109  if (same) {
110  pP = &(*v.begin());
111  break;
112  }
113  }
114  return pP;
115 }
116 
117 const float* CaloCellGeometry::getParmPtr(const std::vector<float>& vv,
120  const float* pP(checkParmPtr(vv, pvv));
121 
122  if (nullptr == pP) {
123  pvv.emplace_back(ParVec(mgr));
124  ParVec& back(pvv.back());
125  for (unsigned int i(0); i != vv.size(); ++i) {
126  back[i] = vv[i];
127  }
128  pP = &(*back.begin());
129  }
130  return pP;
131 }
132 
134  bool ans(false);
135  const Pt3D p(point.x(), point.y(), point.z());
136  const CornersVec& cog(getCorners());
137  Pt3D co[8];
138  for (unsigned int i(0); i != 8; ++i) {
139  co[i] = Pt3D(cog[i].x(), cog[i].y(), cog[i].z());
140  }
141 
142  const Plane3D AA(co[0], co[1], co[2]); // z<0
143  const Plane3D BB(co[6], co[5], co[4]); // z>0
144 
145  if (AA.distance(p) * BB.distance(p) >= 0) {
146  const Plane3D CC(co[0], co[4], co[5]); // x<0
147  const Plane3D DD(co[2], co[6], co[7]); // x>0
148  if (CC.distance(p) * DD.distance(p) >= 0) {
149  const Plane3D EE(co[3], co[7], co[4]); // y<0
150  const Plane3D FF(co[1], co[5], co[6]); // y>0
151  if (EE.distance(p) * FF.distance(p) >= 0) {
152  ans = true;
153  }
154  }
155  }
156  return ans;
157 }
std::ostream & operator<<(std::ostream &s, const CaloCellGeometry &cell)
EZArrayFL< CCGFloat > ParVec
std::vector< ParVec > ParVecVec
HepGeom::Point3D< double > DPt3D
HepGeom::Transform3D Tr3D
cv
Definition: cuy.py:363
std::vector< Pt3D > Pt3DVec
assert(be >=bs)
__host__ __device__ VT * co
Definition: prefixScan.h:47
virtual ~CaloCellGeometry()
HepGeom::Vector3D< double > DVec3D
CaloCellGeometry::CCGFloat CCGFloat
static const CCGFloat * getParmPtr(const std::vector< CCGFloat > &vd, ParMgr *mgr, ParVecVec &pvv)
static const CCGFloat k_ScaleFromDDDtoGeant
virtual void vocalCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref) const =0
T perp() const
Magnitude of transverse component.
Basic3DVector unit() const
ii
Definition: cuy.py:589
CaloCellGeometry::Pt3D Pt3D
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
HepGeom::Plane3D< double > DPlane3D
bool emptyCorners() const
CaloCellGeometry::Pt3DVec Pt3DVec
HepGeom::Point3D< CCGFloat > Pt3D
Definition: EZMgrFL.h:8
virtual const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
DD
single HTRIG enabling on first/second tracks
CaloCellGeometry::Tr3D Tr3D
T barePhi() const
bool inside(const GlobalPoint &point) const
Returns true if the specified point is inside this cell.
std::vector< DPt3D > DPt3DVec
float x
HepGeom::Plane3D< CCGFloat > Plane3D
CornersVec const & getCorners() const
Returns the corner points of this cell&#39;s volume.
virtual void getTransform(Tr3D &tr, Pt3DVec *lptr) const
--------— only needed by specific utility; overloaded when needed -—
HepGeom::Vector3D< CCGFloat > FVec3D
ROOT::Math::Plane3D Plane3D
const CCGFloat * param() const
*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
static const CCGFloat * checkParmPtr(const std::vector< CCGFloat > &vd, ParVecVec &pvv)
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11