File indexing completed on 2025-12-16 09:19:46
0001 #include "RawTowerGeomv5.h"
0002
0003 #include <cmath>
0004 #include <cstdlib>
0005 #include <iostream>
0006 #include <vector>
0007
0008 RawTowerGeomv5::RawTowerGeomv5(RawTowerDefs::keytype id)
0009 : _towerid(id)
0010 {
0011 }
0012
0013 RawTowerGeomv5::RawTowerGeomv5(const RawTowerGeom& geom0)
0014 : _towerid(geom0.get_id())
0015 {
0016 _rot[0] = geom0.get_rotx();
0017 _rot[1] = geom0.get_roty();
0018 _rot[2] = geom0.get_rotz();
0019
0020 for (int i = 0; i < _nVtx; i++)
0021 {
0022 _vertices[(i * _nDim) + 0] = geom0.get_vertex_x(i);
0023 _vertices[(i * _nDim) + 1] = geom0.get_vertex_y(i);
0024 _vertices[(i * _nDim) + 2] = geom0.get_vertex_z(i);
0025 }
0026
0027 _center[0] = geom0.get_center_x();
0028 _center[1] = geom0.get_center_y();
0029 _center[2] = geom0.get_center_z();
0030
0031 _center_int[0] = geom0.get_center_int_x();
0032 _center_int[1] = geom0.get_center_int_y();
0033 _center_int[2] = geom0.get_center_int_z();
0034
0035 _center_ext[0] = geom0.get_center_ext_x();
0036 _center_ext[1] = geom0.get_center_ext_y();
0037 _center_ext[2] = geom0.get_center_ext_z();
0038
0039 _center_low_eta[0] = geom0.get_center_low_eta_x();
0040 _center_low_eta[1] = geom0.get_center_low_eta_y();
0041 _center_low_eta[2] = geom0.get_center_low_eta_z();
0042
0043 _center_high_eta[0] = geom0.get_center_high_eta_x();
0044 _center_high_eta[1] = geom0.get_center_high_eta_y();
0045 _center_high_eta[2] = geom0.get_center_high_eta_z();
0046
0047 _center_low_phi[0] = geom0.get_center_low_phi_x();
0048 _center_low_phi[1] = geom0.get_center_low_phi_y();
0049 _center_low_phi[2] = geom0.get_center_low_phi_z();
0050
0051 _center_high_phi[0] = geom0.get_center_high_phi_x();
0052 _center_high_phi[1] = geom0.get_center_high_phi_y();
0053 _center_high_phi[2] = geom0.get_center_high_phi_z();
0054 }
0055
0056 void RawTowerGeomv5::set_vertices(const std::vector<double>& vertices)
0057 {
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 if ((int) vertices.size() != _nVtx * 3)
0069 {
0070 std::cerr
0071 << "RawTowerGeomv5::set_vertices - input " << vertices.size() << " vertices given. Expected 8 x 3." << std::endl;
0072 exit(1);
0073 }
0074
0075 bool face_outside[_nVtx] = {false, false, false, false, true, true, true, true};
0076 bool face_inside[_nVtx] = {true, true, true, true, false, false, false, false};
0077 bool face_low_eta[_nVtx] = {false, false, true, true, false, false, true, true};
0078 bool face_high_eta[_nVtx] = {true, true, false, false, true, true, false, false};
0079 bool face_low_phi[_nVtx] = {false, true, true, false, false, true, true, false};
0080 bool face_high_phi[_nVtx] = {true, false, false, true, true, false, false, true};
0081
0082 _center.fill(0.0);
0083 _center_int.fill(0.0);
0084 _center_ext.fill(0.0);
0085 _center_low_eta.fill(0.0);
0086 _center_high_eta.fill(0.0);
0087 _center_low_phi.fill(0.0);
0088 _center_high_phi.fill(0.0);
0089
0090 for (int iDim = 0; iDim < _nDim; iDim++)
0091 {
0092 for (int iVtx = 0; iVtx < _nVtx; iVtx++)
0093 {
0094 _vertices[(iVtx * _nDim) + iDim] = vertices[(iVtx * _nDim) + iDim];
0095
0096 _center[iDim] += _vertices[(iVtx * _nDim) + iDim];
0097
0098 if (face_inside[iVtx])
0099 {
0100 _center_int[iDim] += _vertices[(iVtx * _nDim) + iDim];
0101 }
0102 if (face_outside[iVtx])
0103 {
0104 _center_ext[iDim] += _vertices[(iVtx * _nDim) + iDim];
0105 }
0106 if (face_low_eta[iVtx])
0107 {
0108 _center_low_eta[iDim] += _vertices[(iVtx * _nDim) + iDim];
0109 }
0110 if (face_high_eta[iVtx])
0111 {
0112 _center_high_eta[iDim] += _vertices[(iVtx * _nDim) + iDim];
0113 }
0114 if (face_low_phi[iVtx])
0115 {
0116 _center_low_phi[iDim] += _vertices[(iVtx * _nDim) + iDim];
0117 }
0118 if (face_high_phi[iVtx])
0119 {
0120 _center_high_phi[iDim] += _vertices[(iVtx * _nDim) + iDim];
0121 }
0122 }
0123
0124 _center[iDim] /= (double) _nVtx;
0125
0126 _center_int[iDim] /= (double) _nVtx / 2.;
0127
0128 _center_ext[iDim] /= (double) _nVtx / 2.;
0129
0130 _center_low_eta[iDim] /= (double) _nVtx / 2.;
0131
0132 _center_high_eta[iDim] /= (double) _nVtx / 2.;
0133
0134 _center_low_phi[iDim] /= (double) _nVtx / 2.;
0135
0136 _center_high_phi[iDim] /= (double) _nVtx / 2.;
0137 }
0138
0139 return;
0140 }
0141
0142 double RawTowerGeomv5::get_vertex_x(int i) const
0143 {
0144 if (i < 0 || i >= _nVtx)
0145 {
0146 std::cerr << "RawTowerGeomv5::get_vertex_x(): Vertex index " << i << " out of bounds. Should be between 0 and " << _nVtx << std::endl;
0147 exit(1);
0148 }
0149 return _vertices[i * _nDim + 0];
0150 }
0151
0152 double RawTowerGeomv5::get_vertex_y(int i) const
0153 {
0154 if (i < 0 || i >= _nVtx)
0155 {
0156 std::cerr << "RawTowerGeomv5::get_vertex_y(): Vertex index " << i << " out of bounds. Should be between 0 and " << _nVtx << std::endl;
0157 exit(1);
0158 }
0159 return _vertices[i * _nDim + 1];
0160 }
0161
0162 double RawTowerGeomv5::get_vertex_z(int i) const
0163 {
0164 if (i < 0 || i >= _nVtx)
0165 {
0166 std::cerr << "RawTowerGeomv5::get_vertex_z(): Vertex index " << i << " out of bounds. Should be between 0 and " << _nVtx << std::endl;
0167 exit(1);
0168 }
0169 return _vertices[i * _nDim + 2];
0170 }
0171
0172 double RawTowerGeomv5::get_center_radius() const
0173 {
0174 return std::sqrt(_center[0] * _center[0] +
0175 _center[1] * _center[1]);
0176 }
0177
0178 double RawTowerGeomv5::get_theta() const
0179 {
0180 double radius = std::sqrt(_center[0] * _center[0] + _center[1] * _center[1]);
0181 double theta = std::atan2(radius, _center[2]);
0182 return theta;
0183 }
0184
0185 double RawTowerGeomv5::get_eta() const
0186 {
0187 double theta = get_theta();
0188 double eta = -std::log(std::tan(theta / 2.));
0189
0190 return eta;
0191 }
0192
0193 double RawTowerGeomv5::get_phi() const
0194 {
0195 return std::atan2(_center[1], _center[0]);
0196 }
0197
0198 void RawTowerGeomv5::identify(std::ostream& os) const
0199 {
0200 os << "RawTowerGeomv5: x: " << get_center_x() << " y: " << get_center_y() << " z: " << get_center_z() << std::endl;
0201 }