10 typedef HepGeom::Vector3D<CCGFloat>
FVec3D;
11 typedef HepGeom::Plane3D<CCGFloat>
Plane3D;
13 typedef HepGeom::Vector3D<double>
DVec3D;
15 typedef HepGeom::Point3D<double>
DPt3D;
24 CaloCellGeometry::operator=(tr);
39 :
CaloCellGeometry(corn, par), m_axis(makeAxis()), m_corOne(corn[0].
x(), corn[0].
y(), corn[0].
z()) {
67 const Pt3D gFront(p.
x(), p.
y(), p.
z());
68 const DPt3D dgFront(p.
x(), p.
y(), p.
z());
74 std::vector<Pt3D> lc(8,
Pt3D(0, 0, 0));
83 Pt3D lBack(0.25 * (lc[4] + lc[5] + lc[6] + lc[7]));
85 const double disl((lFront - lc[0]).
mag());
86 const double disr((lFront - lc[3]).
mag());
89 const double dell(fabs(disg - disl));
90 const double delr(fabs(disg - disr));
92 if (11.2 < dz && delr < dell)
95 lBack = 0.25 * (lc[4] + lc[5] + lc[6] + lc[7]);
98 const DPt3D dlFront(lFront.x(), lFront.y(), lFront.z());
99 const DPt3D dlBack(lBack.x(), lBack.y(), lBack.z());
100 const DPt3D dlOne(lc[0].
x(), lc[0].
y(), lc[0].
z());
106 const DPt3D dgBack(dgFront + (dlBack - dlFront).
mag() * dgAxis);
107 DPt3D dgOne(dgFront + (dlOne - dlFront).
mag() * (dmOne - dgFront).
unit());
109 const double dlangle((dlBack - dlFront).
angle(dlOne - dlFront));
110 const double dgangle((dgBack - dgFront).
angle(dgOne - dgFront));
111 const double dangle(dlangle - dgangle);
113 if (1.
e-6 < fabs(dangle))
115 const DPlane3D dgPl(dgFront, dgOne, dgBack);
116 const DPt3D dp2(dgFront + dgPl.normal().unit());
120 dgOne = (dgFront + HepGeom::Rotate3D(-dangle, dgFront, dp2) *
DVec3D(dgOld - dgFront));
123 tr =
Tr3D(dlFront, dlBack, dlOne, dgFront, dgBack, dgOne);
136 for (
unsigned int i(0);
i != 8; ++
i) {
137 const Pt3D corn(tr * lc[
i]);
174 ref = 0.25 * (lc[0] + lc[1] + lc[2] + lc[3]);
200 const unsigned int off(h1 < h2 ? 0 : 4);
202 lc[0 + off] =
Pt3D(-dz * tthcp - h1 * ta1 - b1, -dz * tthsp - h1, -dz);
203 lc[1 + off] =
Pt3D(-dz * tthcp + h1 * ta1 - t1, -dz * tthsp + h1, -dz);
204 lc[2 + off] =
Pt3D(-dz * tthcp + h1 * ta1 + t1, -dz * tthsp + h1, -dz);
205 lc[3 + off] =
Pt3D(-dz * tthcp - h1 * ta1 + b1, -dz * tthsp - h1, -dz);
206 lc[4 - off] =
Pt3D(dz * tthcp - h2 * ta2 - b2, dz * tthsp - h2, dz);
207 lc[5 - off] =
Pt3D(dz * tthcp + h2 * ta2 - t2, dz * tthsp + h2, dz);
208 lc[6 - off] =
Pt3D(dz * tthcp + h2 * ta2 + t2, dz * tthsp + h2, dz);
209 lc[7 - off] =
Pt3D(dz * tthcp - h2 * ta2 + b2, dz * tthsp - h2, dz);
211 ref = 0.25 * (lc[0] + lc[1] + lc[2] + lc[3]);
231 ref = 0.25 * (lc[0] + lc[1] + lc[2] + lc[3]);
249 static const FVec3D x(1, 0, 0);
250 static const FVec3D y(0, 1, 0);
251 static const FVec3D z(0, 0, 1);
252 const bool refl(((tr * x).
cross(tr * y)).
dot(tr * z) < 0);
258 for (
unsigned int i(0);
i != 8; ++
i) {
262 if (refl || h1 > h2) {
295 copy(to.begin(), to.end(), ko.begin());
297 for (
unsigned int i(0);
i != 8; ++
i) {
306 s <<
"Center: " << ((
const CaloCellGeometry&)cell).getPosition() << std::endl;
309 s <<
"Axis: " << thetaaxis <<
" " << phiaxis << std::endl;
311 for (
unsigned int i = 0;
i != corners.size(); ++
i) {
312 s <<
"Corner: " << corners[
i] << std::endl;
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
CaloCellGeometry::Tr3D Tr3D
HepGeom::Point3D< double > DPt3D
static constexpr uint32_t k_Dx4
static constexpr uint32_t k_Alp2
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
virtual const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
Sin< T >::type sin(const T &t)
CaloCellGeometry::Pt3D Pt3D
Geom::Phi< T > phi() const
Global3DPoint GlobalPoint
HepGeom::Transform3D Tr3D
std::vector< Pt3D > Pt3DVec
CCGFloat getPhiAxis() const
std::ostream & operator<<(std::ostream &out, const ALILine &li)
void getTransform(Tr3D &tr, Pt3DVec *lptr) const override
--------— only needed by specific utility; overloaded when needed -—
__host__ __device__ VT * co
static constexpr uint32_t k_Dy2
Geom::Theta< T > theta() const
static constexpr uint32_t k_Phi
static void localCornersSwap(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
static constexpr uint32_t k_Alp1
const CCGFloat * param() const
CaloCellGeometry::Pt3DVec Pt3DVec
Cos< T >::type cos(const T &t)
Tan< T >::type tan(const T &t)
HepGeom::Vector3D< double > DVec3D
static constexpr uint32_t k_Dx3
CaloCellGeometry::CCGFloat CCGFloat
static constexpr uint32_t k_Dx2
CCGFloat getThetaAxis() const
TruncatedPyramid & operator=(const TruncatedPyramid &tr)
GlobalVector makeAxis(void)
CaloCellGeometry::Pt3D Pt3D
CaloCellGeometry::CCGFloat CCGFloat
void initCorners(CornersVec &) override
Vector3DBase unit() const
HepGeom::Plane3D< double > DPlane3D
void vocalCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref) const override
CaloCellGeometry::Pt3DVec Pt3DVec
HepGeom::Point3D< CCGFloat > Pt3D
CornersVec const & getCorners() const
Returns the corner points of this cell's volume.
static constexpr uint32_t k_Theta
A base class to handle the particular shape of Ecal Xtals. Taken from ORCA Calorimetry Code...
CaloCellGeometry::Tr3D Tr3D
static constexpr uint32_t k_Dy1
const GlobalVector & axis() const
T dot(const Basic3DVector &v) const
Scalar product, or "dot" product, with a vector of same type.
static void createCorners(const std::vector< CCGFloat > &pv, const Tr3D &tr, std::vector< GlobalPoint > &co)
bool uninitialized() const
static constexpr uint32_t k_Dz
static constexpr float b2
~TruncatedPyramid() override
const GlobalPoint backCtr(void) const
static void localCornersReflection(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
static constexpr uint32_t k_Dx1
HepGeom::Vector3D< CCGFloat > FVec3D
ROOT::Math::Plane3D Plane3D
static constexpr float b1
Global3DVector GlobalVector
Basic3DVector unit() const
Basic3DVector cross(const Basic3DVector &v) const
Vector product, or "cross" product, with a vector of same type.
T angle(T x1, T y1, T z1, T x2, T y2, T z2)