1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#ifndef GEOMETRY_CALOGEOMETRY_IDEALZPRISM_H
#define GEOMETRY_CALOGEOMETRY_IDEALZPRISM_H 1
#include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
#include <memory>
/** \class IdealZPrism
Prism class used for HF volumes. HF volumes are prisms with axes along the Z direction whose
face shapes are set by
Required parameters for an ideal Z prism:
- eta, phi of axis
- Z location of front and back faces
- eta width and phi width of frontface
Total: 6 parameters
Internally, the "point of reference" is the center (eta/phi) of the
front face of the prism. Therefore, the only internally stored
parameters are eta and phi HALF-widths and the tower z thickness.
\author J. Mans - Minnesota
*/
class IdealZPrism final : public CaloCellGeometry {
public:
enum DEPTH { None, EM, HADR };
typedef CaloCellGeometry::CCGFloat CCGFloat;
typedef CaloCellGeometry::Pt3D Pt3D;
typedef CaloCellGeometry::Pt3DVec Pt3DVec;
static constexpr uint32_t k_dEta = 0; //Eta-width
static constexpr uint32_t k_dPhi = 1; //Phi-width
static constexpr uint32_t k_dZ = 2; //Signed thickness
static constexpr uint32_t k_Eta = 3; //Eta of the reference point
static constexpr uint32_t k_Z = 4; //Z of the reference point
IdealZPrism();
IdealZPrism(const IdealZPrism& idzp);
IdealZPrism& operator=(const IdealZPrism& idzp);
IdealZPrism(const GlobalPoint& faceCenter, CornersMgr* mgr, const CCGFloat* parm, IdealZPrism::DEPTH depth);
~IdealZPrism() override;
CCGFloat dEta() const;
CCGFloat dPhi() const;
CCGFloat dz() const;
CCGFloat eta() const;
CCGFloat z() const;
static void localCorners(Pt3DVec& vec, const CCGFloat* pv, Pt3D& ref);
void vocalCorners(Pt3DVec& vec, const CCGFloat* pv, Pt3D& ref) const override;
// corrected geom for PF. memory is owned by this object and not transfered to caller.
const IdealZPrism* forPF() const { return m_geoForPF.get(); }
private:
void initCorners(CornersVec&) override;
static GlobalPoint etaPhiR(float eta, float phi, float rad);
static GlobalPoint etaPhiPerp(float eta, float phi, float perp);
static GlobalPoint etaPhiZ(float eta, float phi, float z);
private:
// corrected geom for PF
std::unique_ptr<IdealZPrism> m_geoForPF;
};
std::ostream& operator<<(std::ostream& s, const IdealZPrism& cell);
#endif
|