File indexing completed on 2024-04-06 12:14:17
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <cassert>
0015 #include <cmath>
0016 #include <algorithm>
0017
0018 #include "Geometry/CaloGeometry/interface/EcalTrapezoidParameters.h"
0019
0020 typedef EcalTrapezoidParameters::TPFloat TPFloat;
0021 typedef EcalTrapezoidParameters::VertexList VertexList;
0022 typedef CaloCellGeometry::Pt3D Pt3D;
0023
0024 EcalTrapezoidParameters::EcalTrapezoidParameters(TPFloat aHalfLengthXNegZLoY,
0025 TPFloat aHalfLengthXPosZLoY,
0026 TPFloat aHalfLengthXPosZHiY,
0027 TPFloat aHalfLengthYNegZ,
0028 TPFloat aHalfLengthYPosZ,
0029 TPFloat aHalfLengthZ,
0030 TPFloat aAngleAD,
0031 TPFloat aCoord15X,
0032 TPFloat aCoord15Y
0033 ) {
0034 m_dz = aHalfLengthZ;
0035 m_h1 = aHalfLengthYNegZ;
0036 m_bl1 = aHalfLengthXNegZLoY;
0037 m_h2 = aHalfLengthYPosZ;
0038 m_bl2 = aHalfLengthXPosZLoY;
0039 m_tl2 = aHalfLengthXPosZHiY;
0040
0041 m_a1 = aAngleAD;
0042 m_y15 = aCoord15Y;
0043 m_x15 = aCoord15X;
0044
0045 m_hAa = fabs(m_y15);
0046
0047 m_L = 2 * m_dz;
0048 m_h = 2 * m_h2;
0049 m_a = 2 * m_bl2;
0050 m_b = 2 * m_tl2;
0051 m_H = 2 * m_h1;
0052 m_A = 2 * m_bl1;
0053
0054
0055 const TPFloat sina1(sin(m_a1));
0056 const TPFloat cosa1(cos(m_a1));
0057 const TPFloat tana1(tan(m_a1 - M_PI_2));
0058
0059 const TPFloat tana4((m_tl2 - m_bl2 - m_h2 * tana1) / m_h2);
0060
0061 m_a4 = M_PI_2 + atan(tana4);
0062
0063 m_tl1 = m_bl1 + m_h1 * (tana1 + tana4);
0064
0065 m_d = m_h / sina1;
0066 m_D = m_H / sina1;
0067
0068 const TPFloat tanalp1((m_D * cosa1 + m_tl1 - m_bl1) / m_H);
0069 const TPFloat tanalp2((m_d * cosa1 + m_tl2 - m_bl2) / m_h);
0070 m_alp1 = atan(tanalp1);
0071 m_alp2 = atan(tanalp2);
0072
0073 const TPFloat sina4(sin(m_a4));
0074 m_c = m_h / sina4;
0075 m_C = m_H / sina4;
0076 m_B = 2 * m_tl1;
0077
0078 m_hDd = fabs(m_x15) * sina1 - m_hAa * cosa1;
0079
0080 const TPFloat xd5((m_hAa + m_hDd * cosa1) / sina1);
0081 const TPFloat xd6(m_D - m_d - xd5);
0082 const TPFloat z6(sqrt(m_hDd * m_hDd + xd6 * xd6));
0083 TPFloat gb6;
0084 if (0. == z6 || 1. < fabs(m_hDd / z6)) {
0085 gb6 = 0;
0086 } else {
0087 gb6 = M_PI - m_a1 - asin(m_hDd / z6);
0088 }
0089 m_hBb = z6 * sin(gb6);
0090
0091 const TPFloat xb6(z6 * cos(gb6));
0092 const TPFloat xb7(m_B - xb6 - m_b);
0093 const TPFloat z7(sqrt(m_hBb * m_hBb + xb7 * xb7));
0094 TPFloat gc7;
0095 if (0 == z7 || 1. < fabs(m_hBb / z7)) {
0096 gc7 = 0;
0097 } else {
0098 gc7 = M_PI - m_a4 - asin(m_hBb / z7);
0099 }
0100 m_hCc = z7 * sin(gc7);
0101
0102 const Pt3D fc(m_bl2 + m_h2 * tanalp2, m_h2, 0);
0103 const Pt3D v5(m_x15, m_y15, -m_L);
0104 const Pt3D bc(v5 + Pt3D(m_bl1 + m_h1 * tanalp1, m_h1, 0));
0105 const Pt3D dc(fc - bc);
0106
0107 m_th = dc.theta();
0108 m_ph = dc.phi();
0109 }
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143 TPFloat EcalTrapezoidParameters::dz() const { return m_dz; }
0144 TPFloat EcalTrapezoidParameters::theta() const { return m_th; }
0145 TPFloat EcalTrapezoidParameters::phi() const { return m_ph; }
0146 TPFloat EcalTrapezoidParameters::h1() const { return m_h1; }
0147 TPFloat EcalTrapezoidParameters::bl1() const { return m_bl1; }
0148 TPFloat EcalTrapezoidParameters::tl1() const { return m_tl1; }
0149 TPFloat EcalTrapezoidParameters::alp1() const { return m_alp1; }
0150 TPFloat EcalTrapezoidParameters::h2() const { return m_h2; }
0151 TPFloat EcalTrapezoidParameters::bl2() const { return m_bl2; }
0152 TPFloat EcalTrapezoidParameters::tl2() const { return m_tl2; }
0153 TPFloat EcalTrapezoidParameters::alp2() const { return m_alp2; }
0154
0155 TPFloat EcalTrapezoidParameters::x15() const { return m_x15; }
0156 TPFloat EcalTrapezoidParameters::y15() const { return m_y15; }
0157 TPFloat EcalTrapezoidParameters::hAa() const { return m_hAa; }
0158 TPFloat EcalTrapezoidParameters::hBb() const { return m_hBb; }
0159 TPFloat EcalTrapezoidParameters::hCc() const { return m_hCc; }
0160 TPFloat EcalTrapezoidParameters::hDd() const { return m_hDd; }
0161 TPFloat EcalTrapezoidParameters::a1() const { return m_a1; }
0162 TPFloat EcalTrapezoidParameters::a4() const { return m_a4; }
0163 TPFloat EcalTrapezoidParameters::L() const { return m_L; }
0164 TPFloat EcalTrapezoidParameters::a() const { return m_a; }
0165 TPFloat EcalTrapezoidParameters::b() const { return m_b; }
0166 TPFloat EcalTrapezoidParameters::c() const { return m_c; }
0167 TPFloat EcalTrapezoidParameters::d() const { return m_d; }
0168 TPFloat EcalTrapezoidParameters::h() const { return m_h; }
0169 TPFloat EcalTrapezoidParameters::A() const { return m_A; }
0170 TPFloat EcalTrapezoidParameters::B() const { return m_B; }
0171 TPFloat EcalTrapezoidParameters::C() const { return m_C; }
0172 TPFloat EcalTrapezoidParameters::D() const { return m_D; }
0173 TPFloat EcalTrapezoidParameters::H() const { return m_H; }
0174
0175 EcalTrapezoidParameters::VertexList EcalTrapezoidParameters::vertexList() const {
0176 VertexList vtx;
0177 vtx.reserve(8);
0178
0179 const TPFloat dztanth(dz() * tan(theta()));
0180
0181 const TPFloat ph(phi());
0182 const Pt3D fc(dztanth * cos(ph), dztanth * sin(ph), dz());
0183
0184 const TPFloat h_(h());
0185 const TPFloat H_(H());
0186 const TPFloat b_(b());
0187 const TPFloat B_(B());
0188 const TPFloat a_(a());
0189 const TPFloat A_(A());
0190
0191
0192
0193 const TPFloat tanalp1(tan(alp1()));
0194
0195 const TPFloat tanalp2(tan(alp2()));
0196
0197 const TPFloat tana1(tan(a1() - M_PI_2));
0198
0199 const Pt3D f1(-Pt3D(bl2() + h2() * tanalp2, h2(), 0));
0200
0201 const Pt3D f2(Pt3D(-h_ * tana1, h_, 0) + f1);
0202
0203 const Pt3D f3(f2 + Pt3D(b_, 0, 0));
0204
0205 const Pt3D f4(Pt3D(a_, 0, 0) + f1);
0206
0207 const Pt3D f5(-Pt3D(bl1() + h1() * tanalp1, h1(), 0));
0208
0209 const Pt3D f6(Pt3D(-H_ * tana1, H_, 0) + f5);
0210
0211 const Pt3D f7(f6 + Pt3D(B_, 0, 0));
0212
0213 const Pt3D f8(Pt3D(A_, 0, 0) + f5);
0214
0215 vtx.emplace_back(fc + f1);
0216 vtx.emplace_back(fc + f2);
0217 vtx.emplace_back(fc + f3);
0218 vtx.emplace_back(fc + f4);
0219 vtx.emplace_back(-fc + f5);
0220 vtx.emplace_back(-fc + f6);
0221 vtx.emplace_back(-fc + f7);
0222 vtx.emplace_back(-fc + f8);
0223
0224 return vtx;
0225 }
0226
0227
0228