Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-04-04 08:08:17

0001 #ifndef __WRAPPER_ASYM_ARRAYS_H__
0002 #define __WRAPPER_ASYM_ARRAYS_H__
0003 
0004 #include "AsymmetryCalc/Constants.h"
0005 
0006 #include <iostream>
0007 #include <array>
0008 #include <string>
0009 #include <cstdlib>
0010 #include <cstdint>
0011 
0012 namespace AsymmetryCalc {
0013   class pt_asym_array {
0014   public:
0015     static constexpr int nDimensions = 6;
0016     
0017     static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nPtBins, ASYM_CONSTANTS::nDirections, ASYM_CONSTANTS::nPhiBins};
0018     
0019     static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "pt", "direction", "phi"};
0020 
0021     static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4] * dim_sizes[5];
0022     
0023     using storage_type = std::array<double, size_array>;
0024 
0025     double& operator()(size_t iBeam,
0026                          size_t iParticle,
0027                          size_t iRegion,
0028                          size_t iPt,
0029                          size_t iDir,
0030                          size_t iPhi)
0031     {
0032       check_bounds(iBeam, iParticle, iRegion, iPt, iDir, iPhi);
0033       return data_[index(iBeam, iParticle, iRegion, iPt, iDir, iPhi)];
0034     }
0035 
0036     const double& operator()(size_t iBeam,
0037                                  size_t iParticle,
0038                                  size_t iRegion,
0039                                  size_t iPt,
0040                                  size_t iDir,
0041                                  size_t iPhi) const
0042     {
0043       check_bounds(iBeam, iParticle, iRegion, iPt, iDir, iPhi);
0044       return data_[index(iBeam, iParticle, iRegion, iPt, iDir, iPhi)];
0045     }
0046 
0047   private:
0048 
0049     storage_type data_{};
0050 
0051     void check_bounds(size_t iBeam,
0052                       size_t iParticle,
0053                       size_t iRegion,
0054                       size_t iPt,
0055                       size_t iDir,
0056                       size_t iPhi) const
0057     {
0058       size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iPt, iDir, iPhi};
0059       for (int iDim = 0; iDim < nDimensions; iDim++)
0060       {
0061         if (indices[iDim] > dim_sizes[iDim])
0062         {
0063           std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0064           std::exit(1);
0065         }
0066       }
0067     }
0068     
0069     static constexpr size_t index(size_t iBeam,
0070                                   size_t iParticle,
0071                                   size_t iRegion,
0072                                   size_t iPt,
0073                                   size_t iDir,
0074                                   size_t iPhi)
0075     {
0076       return (((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0077                  * ASYM_CONSTANTS::nRegions + iRegion)
0078                 * ASYM_CONSTANTS::nPtBins + iPt)
0079                * ASYM_CONSTANTS::nDirections + iDir)
0080               * ASYM_CONSTANTS::nPhiBins +iPhi);
0081     }
0082   };
0083 
0084   class pt_nodir_asym_array {
0085   public:
0086     static constexpr int nDimensions = 5;
0087     
0088     static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nPtBins, ASYM_CONSTANTS::nPhiBins};
0089     
0090     static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "pt", "phi"};
0091 
0092     static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4];
0093     
0094     using storage_type = std::array<double, size_array>;
0095 
0096     double& operator()(size_t iBeam,
0097                          size_t iParticle,
0098                          size_t iRegion,
0099                          size_t iPt,
0100                          size_t iPhi)
0101     {
0102       check_bounds(iBeam, iParticle, iRegion, iPt, iPhi);
0103       return data_[index(iBeam, iParticle, iRegion, iPt, iPhi)];
0104     }
0105 
0106     const double& operator()(size_t iBeam,
0107                              size_t iParticle,
0108                              size_t iRegion,
0109                              size_t iPt,
0110                              size_t iPhi) const
0111     {
0112       check_bounds(iBeam, iParticle, iRegion, iPt, iPhi);
0113       return data_[index(iBeam, iParticle, iRegion, iPt, iPhi)];
0114     }
0115 
0116   private:
0117 
0118     storage_type data_{};
0119 
0120     void check_bounds(size_t iBeam,
0121                       size_t iParticle,
0122                       size_t iRegion,
0123                       size_t iPt,
0124                       size_t iPhi) const
0125     {
0126       size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iPt, iPhi};
0127       for (int iDim = 0; iDim < nDimensions; iDim++)
0128       {
0129         if (indices[iDim] > dim_sizes[iDim])
0130         {
0131           std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0132           std::exit(1);
0133         }
0134       }
0135     }
0136     
0137     static constexpr size_t index(size_t iBeam,
0138                                   size_t iParticle,
0139                                   size_t iRegion,
0140                                   size_t iPt,
0141                                   size_t iPhi)
0142     {
0143       return ((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0144                 * ASYM_CONSTANTS::nRegions + iRegion)
0145                * ASYM_CONSTANTS::nPtBins + iPt)
0146               * ASYM_CONSTANTS::nPhiBins +iPhi);
0147     }
0148   };
0149 
0150   class eta_asym_array {
0151   public:
0152     static constexpr int nDimensions = 5;
0153     
0154     static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nEtaBins, ASYM_CONSTANTS::nPhiBins};
0155     
0156     static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "eta", "phi"};
0157 
0158     static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4];
0159     
0160     using storage_type = std::array<double, size_array>;
0161 
0162     double& operator()(size_t iBeam,
0163                            size_t iParticle,
0164                            size_t iRegion,
0165                            size_t iEta,
0166                            size_t iPhi)
0167     {
0168       check_bounds(iBeam, iParticle, iRegion, iEta, iPhi);
0169       return data_[index(iBeam, iParticle, iRegion, iEta, iPhi)];
0170     }
0171 
0172     const double& operator()(size_t iBeam,
0173                                  size_t iParticle,
0174                                  size_t iRegion,
0175                                  size_t iEta,
0176                                  size_t iPhi) const
0177     {
0178       check_bounds(iBeam, iParticle, iRegion, iEta, iPhi);
0179       return data_[index(iBeam, iParticle, iRegion, iEta, iPhi)];
0180     }
0181 
0182   private:
0183 
0184     storage_type data_{};
0185 
0186     void check_bounds(size_t iBeam,
0187                       size_t iParticle,
0188                       size_t iRegion,
0189                       size_t iEta,
0190                       size_t iPhi) const
0191     {
0192       size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iEta, iPhi};
0193       for (int iDim = 0; iDim < nDimensions; iDim++)
0194       {
0195         if (indices[iDim] > dim_sizes[iDim])
0196         {
0197           std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0198           std::exit(1);
0199         }
0200       }
0201     }
0202     
0203     static constexpr size_t index(size_t iBeam,
0204                                   size_t iParticle,
0205                                   size_t iRegion,
0206                                   size_t iEta,
0207                                   size_t iPhi)
0208     {
0209       return ((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0210                 * ASYM_CONSTANTS::nRegions + iRegion)
0211                * ASYM_CONSTANTS::nEtaBins + iEta)
0212               * ASYM_CONSTANTS::nPhiBins +iPhi);
0213     }
0214   };
0215 
0216   class xf_asym_array {
0217   public:
0218     static constexpr int nDimensions = 5;
0219     
0220     static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nXfBins, ASYM_CONSTANTS::nPhiBins};
0221     
0222     static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "xf", "phi"};
0223 
0224     static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4];
0225     
0226     using storage_type = std::array<double, size_array>;
0227 
0228     double& operator()(size_t iBeam,
0229                            size_t iParticle,
0230                            size_t iRegion,
0231                            size_t iXf,
0232                            size_t iPhi)
0233     {
0234       check_bounds(iBeam, iParticle, iRegion, iXf, iPhi);
0235       return data_[index(iBeam, iParticle, iRegion, iXf, iPhi)];
0236     }
0237 
0238     const double& operator()(size_t iBeam,
0239                                  size_t iParticle,
0240                                  size_t iRegion,
0241                                  size_t iXf,
0242                                  size_t iPhi) const
0243     {
0244       check_bounds(iBeam, iParticle, iRegion, iXf, iPhi);
0245       return data_[index(iBeam, iParticle, iRegion, iXf, iPhi)];
0246     }
0247 
0248   private:
0249 
0250     storage_type data_{};
0251 
0252     void check_bounds(size_t iBeam,
0253                       size_t iParticle,
0254                       size_t iRegion,
0255                       size_t iXf,
0256                       size_t iPhi) const
0257     {
0258       size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iXf, iPhi};
0259       for (int iDim = 0; iDim < nDimensions; iDim++)
0260       {
0261         if (indices[iDim] > dim_sizes[iDim])
0262         {
0263           std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0264           std::exit(1);
0265         }
0266       }
0267     }
0268     
0269     static constexpr size_t index(size_t iBeam,
0270                                   size_t iParticle,
0271                                   size_t iRegion,
0272                                   size_t iXf,
0273                                   size_t iPhi)
0274     {
0275       return ((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0276                 * ASYM_CONSTANTS::nRegions + iRegion)
0277                * ASYM_CONSTANTS::nXfBins + iXf)
0278               * ASYM_CONSTANTS::nPhiBins +iPhi);
0279     }
0280   };
0281 };
0282 
0283 #endif