Back to home page

sPhenix code displayed by LXR

 
 

    


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   /*       y
0059            |                    7_______6
0060            |                   /|      /|
0061            |_______ z        8/_|_____/5|
0062           /                   | |     | |
0063          /                    |3|_____|_|2
0064         /                     | /     | /
0065      -x                      4|/______|/1
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 }